Sanjayraju30 commited on
Commit
9156c8e
Β·
verified Β·
1 Parent(s): 5095fe6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +132 -36
app.py CHANGED
@@ -4,41 +4,137 @@ import streamlit as st
4
  import pydeck as pdk
5
  from datetime import datetime, timedelta
6
 
7
- # Map with Alert Level Color Coding
8
- st.subheader("πŸ“ Pole Alert Levels (Green, Yellow, Red)")
9
-
10
- # Define color mapping
11
- def alert_level_to_color(alert_level):
12
- if alert_level == 'Red':
13
- return [255, 0, 0, 160] # Red
14
- elif alert_level == 'Yellow':
15
- return [255, 255, 0, 160] # Yellow
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  else:
17
- return [0, 255, 0, 160] # Green
18
-
19
- # Only if site_df is available
20
- if not site_df.empty:
21
- site_df = site_df.copy() # To avoid SettingWithCopyWarning
22
- site_df['Color'] = site_df['Alert Level'].apply(alert_level_to_color)
23
-
24
- st.pydeck_chart(pdk.Deck(
25
- initial_view_state=pdk.ViewState(
26
- latitude=SITES[selected_site][0],
27
- longitude=SITES[selected_site][1],
28
- zoom=12,
29
- pitch=50
30
- ),
31
- layers=[
32
- pdk.Layer(
33
- 'ScatterplotLayer',
34
- data=site_df,
35
- get_position='[Longitude, Latitude]',
36
- get_color='Color',
37
- get_radius=100,
38
- )
39
- ]
40
- ))
41
-
42
- st.markdown("<h3 style='text-align: center;'>Poles Color-coded by Alert Level</h3>", unsafe_allow_html=True)
43
  else:
44
- st.info("No poles data available for this site.")
 
 
4
  import pydeck as pdk
5
  from datetime import datetime, timedelta
6
 
7
+ # ---- Constants ----
8
+ POLES_PER_SITE = 12
9
+ SITES = {
10
+ "Hyderabad": [17.385044, 78.486671],
11
+ "Gadwal": [16.2351, 77.8052],
12
+ "Kurnool": [15.8281, 78.0373],
13
+ "Ballari": [12.9716, 77.5946]
14
+ }
15
+
16
+ # ---- Helper Functions ----
17
+ def generate_location(base_lat, base_lon):
18
+ return [
19
+ base_lat + random.uniform(-0.02, 0.02),
20
+ base_lon + random.uniform(-0.02, 0.02)
21
+ ]
22
+
23
+ def simulate_pole(pole_id, site_name):
24
+ lat, lon = generate_location(*SITES[site_name])
25
+ solar_kwh = round(random.uniform(3.0, 7.5), 2)
26
+ wind_kwh = round(random.uniform(0.5, 2.0), 2)
27
+ power_required = round(random.uniform(4.0, 8.0), 2)
28
+ total_power = solar_kwh + wind_kwh
29
+ power_status = 'Sufficient' if total_power >= power_required else 'Insufficient'
30
+
31
+ tilt_angle = round(random.uniform(0, 45), 2)
32
+ vibration = round(random.uniform(0, 5), 2)
33
+ camera_status = random.choice(['Online', 'Offline'])
34
+
35
+ alert_level = 'Green'
36
+ anomaly_details = []
37
+ if tilt_angle > 30 or vibration > 3:
38
+ alert_level = 'Yellow'
39
+ anomaly_details.append("Tilt or Vibration threshold exceeded.")
40
+ if tilt_angle > 40 or vibration > 4.5:
41
+ alert_level = 'Red'
42
+ anomaly_details.append("Critical tilt or vibration detected.")
43
+
44
+ health_score = max(0, 100 - (tilt_angle + vibration * 10))
45
+ timestamp = datetime.now() - timedelta(hours=random.randint(0, 6))
46
+
47
+ return {
48
+ 'Pole ID': f'{site_name[:3].upper()}-{pole_id:03}',
49
+ 'Site': site_name,
50
+ 'Latitude': lat,
51
+ 'Longitude': lon,
52
+ 'Solar (kWh)': solar_kwh,
53
+ 'Wind (kWh)': wind_kwh,
54
+ 'Power Required (kWh)': power_required,
55
+ 'Total Power (kWh)': total_power,
56
+ 'Power Status': power_status,
57
+ 'Tilt Angle (Β°)': tilt_angle,
58
+ 'Vibration (g)': vibration,
59
+ 'Camera Status': camera_status,
60
+ 'Health Score': round(health_score, 2),
61
+ 'Alert Level': alert_level,
62
+ 'Anomalies': "; ".join(anomaly_details),
63
+ 'Last Checked': timestamp.strftime('%Y-%m-%d %H:%M:%S')
64
+ }
65
+
66
+ # ---- Streamlit UI ----
67
+ st.set_page_config(page_title="Smart Pole Monitoring", layout="wide")
68
+ st.title("🌍 Smart Renewable Pole Monitoring - Multi-Site")
69
+
70
+ selected_site = st.text_input("Enter site to view (Hyderabad, Gadwal, Kurnool, Ballari):", "Hyderabad")
71
+
72
+ if selected_site in SITES:
73
+ with st.spinner(f"Simulating poles at {selected_site}..."):
74
+ poles_data = [simulate_pole(i + 1, site) for site in SITES for i in range(POLES_PER_SITE)]
75
+ df = pd.DataFrame(poles_data)
76
+ site_df = df[df['Site'] == selected_site]
77
+
78
+ # Summary Metrics
79
+ col1, col2, col3 = st.columns(3)
80
+ col1.metric("Total Poles", site_df.shape[0])
81
+ col2.metric("Red Alerts", site_df[site_df['Alert Level'] == 'Red'].shape[0])
82
+ col3.metric("Power Insufficiencies", site_df[site_df['Power Status'] == 'Insufficient'].shape[0])
83
+
84
+ # Table View
85
+ st.subheader(f"πŸ“‹ Pole Data Table for {selected_site}")
86
+ with st.expander("Filter Options"):
87
+ alert_filter = st.multiselect("Alert Level", options=site_df['Alert Level'].unique(), default=site_df['Alert Level'].unique())
88
+ camera_filter = st.multiselect("Camera Status", options=site_df['Camera Status'].unique(), default=site_df['Camera Status'].unique())
89
+
90
+ filtered_df = site_df[(site_df['Alert Level'].isin(alert_filter)) & (site_df['Camera Status'].isin(camera_filter))]
91
+ st.dataframe(filtered_df, use_container_width=True)
92
+
93
+ # Charts
94
+ st.subheader("πŸ“Š Energy Generation Comparison")
95
+ st.bar_chart(site_df[['Solar (kWh)', 'Wind (kWh)']].mean())
96
+
97
+ st.subheader("πŸ“ˆ Tilt vs. Vibration")
98
+ st.scatter_chart(site_df[['Tilt Angle (Β°)', 'Vibration (g)']])
99
+
100
+ # ---- Updated Map Section with Alert Level Color Coding ----
101
+ st.subheader("πŸ“ Pole Alert Levels (Green, Yellow, Red)")
102
+
103
+ # Define color mapping
104
+ def alert_level_to_color(alert_level):
105
+ if alert_level == 'Red':
106
+ return [255, 0, 0, 160] # Red
107
+ elif alert_level == 'Yellow':
108
+ return [255, 255, 0, 160] # Yellow
109
+ else:
110
+ return [0, 255, 0, 160] # Green
111
+
112
+ if not site_df.empty:
113
+ site_df = site_df.copy()
114
+ site_df['Color'] = site_df['Alert Level'].apply(alert_level_to_color)
115
+
116
+ st.pydeck_chart(pdk.Deck(
117
+ initial_view_state=pdk.ViewState(
118
+ latitude=SITES[selected_site][0],
119
+ longitude=SITES[selected_site][1],
120
+ zoom=12,
121
+ pitch=50
122
+ ),
123
+ layers=[
124
+ pdk.Layer(
125
+ 'ScatterplotLayer',
126
+ data=site_df,
127
+ get_position='[Longitude, Latitude]',
128
+ get_color='Color',
129
+ get_radius=100,
130
+ )
131
+ ]
132
+ ))
133
+
134
+ st.markdown("<h3 style='text-align: center;'>Poles Color-coded by Alert Level</h3>", unsafe_allow_html=True)
135
  else:
136
+ st.info("No poles data available for this site.")
137
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  else:
139
+ st.warning("Invalid site. Please enter one of: Hyderabad, Gadwal, Kurnool, Ballari")
140
+