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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -94
app.py CHANGED
@@ -1,24 +1,16 @@
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,89 +19,65 @@ if selected_camera_status != "All":
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))
 
 
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
  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.")