Prasanna1622 commited on
Commit
e3c056e
·
verified ·
1 Parent(s): 6c1724d

Update app.py

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