File size: 3,645 Bytes
6c1724d e3c056e 77bf633 b32c4c7 e3c056e d6bd89c 77bf633 db779a2 77bf633 7170843 e3c056e 7170843 e3c056e 77bf633 b32c4c7 b589dd8 e3c056e b32c4c7 db779a2 e3c056e b0cedd6 e3c056e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
import streamlit as st
import pandas as pd
import plotly.express as px
import pydeck as pdk
from salesforce_integration import fetch_poles
from modules.visuals import display_dashboard, display_charts
# Title
st.title("VIEP Smart Poles Dashboard")
# Fetch the raw data from Salesforce
df = fetch_poles()
# --- Sidebar Filters ---
st.sidebar.header("Filter Data")
selected_alert_levels = st.sidebar.multiselect(
"Alert Level", ["Red", "Yellow", "Green"], default=["Red", "Yellow", "Green"]
)
selected_camera_status = st.sidebar.selectbox("Camera Status", ["All", "Online", "Offline"])
site_options = ["All"] + df["Site__c"].dropna().unique().tolist()
selected_site = st.sidebar.selectbox("Site", site_options, index=0)
# --- Filtering Logic ---
filtered_df = df[df["Alert_Level__c"].isin(selected_alert_levels)]
if selected_camera_status != "All":
filtered_df = filtered_df[filtered_df["Camera_Status__c"] == selected_camera_status]
if selected_site != "All":
filtered_df = filtered_df[filtered_df["Site__c"] == selected_site]
# --- Display System Summary ---
display_dashboard(filtered_df)
# --- Pole Table ---
st.subheader("Pole Table")
st.dataframe(filtered_df, use_container_width=True)
# --- Energy Generation Chart ---
st.subheader("⚙ Energy Generation (Solar vs Wind)")
st.plotly_chart(px.bar(
filtered_df, x="Name", y=["Solar_Generation__c", "Wind_Generation__c"], barmode="group"
))
# --- Alert Level Breakdown Chart ---
display_charts(filtered_df)
# Define function to generate heatmap based on site
def generate_heatmap_for_site(site_name, df):
site_df = df[df['Site__c'] == site_name]
# Ensure that Alert_Level__c is treated as a string (for color mapping)
site_df['Alert_Level__c'] = site_df['Alert_Level__c'].astype(str)
# Define color mapping for alert levels
color_map = {
"Green": [0, 255, 0],
"Yellow": [255, 255, 0],
"Red": [255, 0, 0]
}
# Create a color column based on Alert_Level__c
site_df["color"] = site_df["Alert_Level__c"].map(color_map)
# Create a Pydeck map for the site
layer = pdk.Layer(
"ScatterplotLayer",
data=site_df,
get_position='[Longitude__c, Latitude__c]',
get_color="color",
get_radius=80, # You can adjust the radius if needed
pickable=True,
auto_highlight=True
)
view_state = pdk.ViewState(
latitude=site_df["Location_Latitude__c"].mean(),
longitude=site_df["Location_Longitude__c"].mean(),
zoom=10,
pitch=40
)
tooltip = {
"html": """
<b>Pole Name:</b> {Name}<br>
<b>Site:</b> {Site__c}<br>
<b>Alert Level:</b> {Alert_Level__c}<br>
<b>RFID Tag:</b> {RFID_Tag__c}<br>
<b>Tilt:</b> {Tilt__c}<br>
<b>Vibration:</b> {Vibration__c}
""",
"style": {
"backgroundColor": "steelblue",
"color": "white"
}
}
# Return the heatmap
return pdk.Deck(
map_style="mapbox://styles/mapbox/dark-v10",
initial_view_state=view_state,
layers=[layer],
tooltip=tooltip
)
# Divide into four columns (Hyderabad, Kurnool, Ballari, Gadwal)
col1, col2 = st.columns(2)
with col1:
st.subheader("Hyderabad")
st.pydeck_chart(generate_heatmap_for_site("Hyderabad", df))
st.subheader("Kurnool")
st.pydeck_chart(generate_heatmap_for_site("Kurnool", df))
with col2:
st.subheader("Ballari")
st.pydeck_chart(generate_heatmap_for_site("Ballari", df))
st.subheader("Gadwal")
st.pydeck_chart(generate_heatmap_for_site("Gadwal", df))
|