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": """
Pole Name: {Name}
Site: {Site__c}
Alert Level: {Alert_Level__c}
RFID Tag: {RFID_Tag__c}
Tilt: {Tilt__c}
Vibration: {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))