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))