File size: 3,961 Bytes
6c1724d e3c056e 77bf633 b32c4c7 e3c056e d6bd89c 77bf633 db779a2 77bf633 7170843 e3c056e 7170843 e3c056e 77bf633 b32c4c7 b589dd8 e3c056e b32c4c7 db779a2 e3c056e dbc0b0b e3c056e dbc0b0b e3c056e 21bfd3b e3c056e dbc0b0b e3c056e dbc0b0b 21bfd3b dbc0b0b e3c056e dbc0b0b e3c056e b0cedd6 e3c056e dbc0b0b 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 117 118 119 120 121 122 |
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='[Location_Longitude__c, Location_Latitude__c]', # Ensure the column names are correct
get_color="color",
get_radius=80, # You can adjust the radius if needed
pickable=True,
auto_highlight=True
)
# Handle potential missing coordinates for map center
latitude = site_df["Location_Latitude__c"].mean() if not site_df["Location_Latitude__c"].isnull().all() else 0
longitude = site_df["Location_Longitude__c"].mean() if not site_df["Location_Longitude__c"].isnull().all() else 0
# View state for the map
view_state = pdk.ViewState(
latitude=latitude,
longitude=longitude,
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))
|