Tigernawin commited on
Commit
eca7f1c
ยท
verified ยท
1 Parent(s): ea692e6

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -0
app.py ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import random
2
+ import pandas as pd
3
+ import streamlit as st
4
+ import pydeck as pdk
5
+ from datetime import datetime, timedelta
6
+
7
+ # ---- Constants ----
8
+ TOTAL_POLES = 200 # 50 poles per site
9
+ SITES = {
10
+ "Hyderabad": [17.385044, 78.486671],
11
+ "Gadwal": [16.2351, 77.8052],
12
+ "Kurnool": [15.8281, 78.0373],
13
+ "Bangalore": [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
+ if tilt_angle > 30 or vibration > 3:
37
+ alert_level = 'Yellow'
38
+ if tilt_angle > 40 or vibration > 4.5:
39
+ alert_level = 'Red'
40
+
41
+ health_score = max(0, 100 - (tilt_angle + vibration * 10))
42
+ timestamp = datetime.now() - timedelta(hours=random.randint(0, 6))
43
+
44
+ return {
45
+ 'Pole ID': f'{site_name[:3].upper()}-{pole_id:03}',
46
+ 'Site': site_name,
47
+ 'Latitude': lat,
48
+ 'Longitude': lon,
49
+ 'Solar (kWh)': solar_kwh,
50
+ 'Wind (kWh)': wind_kwh,
51
+ 'Power Required (kWh)': power_required,
52
+ 'Total Power (kWh)': total_power,
53
+ 'Power Status': power_status,
54
+ 'Tilt Angle (ยฐ)': tilt_angle,
55
+ 'Vibration (g)': vibration,
56
+ 'Camera Status': camera_status,
57
+ 'Health Score': round(health_score, 2),
58
+ 'Alert Level': alert_level,
59
+ 'Last Checked': timestamp.strftime('%Y-%m-%d %H:%M:%S')
60
+ }
61
+
62
+ # ---- Streamlit UI ----
63
+ st.set_page_config(page_title="Smart Pole Monitoring", layout="wide")
64
+ st.title("๐ŸŒ Smart Renewable Pole Monitoring - Multi-Site")
65
+
66
+ selected_site = st.text_input("Enter site to view (Hyderabad, Gadwal, Kurnool, Bangalore):", "Hyderabad")
67
+
68
+ if selected_site in SITES:
69
+ with st.spinner(f"Simulating poles at {selected_site}..."):
70
+ poles_data = [simulate_pole(i + 1 + j * 50, site) for j, site in enumerate(SITES) for i in range(50)]
71
+ df = pd.DataFrame(poles_data)
72
+ site_df = df[df['Site'] == selected_site]
73
+
74
+ # Summary Metrics
75
+ col1, col2, col3 = st.columns(3)
76
+ col1.metric("Total Poles", site_df.shape[0])
77
+ col2.metric("Red Alerts", site_df[site_df['Alert Level'] == 'Red'].shape[0])
78
+ col3.metric("Power Insufficiencies", site_df[site_df['Power Status'] == 'Insufficient'].shape[0])
79
+
80
+ # Table View
81
+ st.subheader(f"๐Ÿ“‹ Pole Data Table for {selected_site}")
82
+ with st.expander("Filter Options"):
83
+ alert_filter = st.multiselect("Alert Level", options=site_df['Alert Level'].unique(), default=site_df['Alert Level'].unique())
84
+ camera_filter = st.multiselect("Camera Status", options=site_df['Camera Status'].unique(), default=site_df['Camera Status'].unique())
85
+
86
+ filtered_df = site_df[(site_df['Alert Level'].isin(alert_filter)) & (site_df['Camera Status'].isin(camera_filter))]
87
+ st.dataframe(filtered_df, use_container_width=True)
88
+
89
+ # Charts
90
+ st.subheader("๐Ÿ“Š Energy Generation Comparison")
91
+ st.bar_chart(site_df[['Solar (kWh)', 'Wind (kWh)']].mean())
92
+
93
+ st.subheader("๐Ÿ“ˆ Tilt vs. Vibration")
94
+ st.scatter_chart(site_df[['Tilt Angle (ยฐ)', 'Vibration (g)']])
95
+
96
+ # Map with Red Alerts
97
+ st.subheader("๐Ÿ“ Red Alert Pole Locations")
98
+ red_df = site_df[site_df['Alert Level'] == 'Red']
99
+ if not red_df.empty:
100
+ st.pydeck_chart(pdk.Deck(
101
+ initial_view_state=pdk.ViewState(
102
+ latitude=SITES[selected_site][0],
103
+ longitude=SITES[selected_site][1],
104
+ zoom=12,
105
+ pitch=50
106
+ ),
107
+ layers=[
108
+ pdk.Layer(
109
+ 'ScatterplotLayer',
110
+ data=red_df,
111
+ get_position='[Longitude, Latitude]',
112
+ get_color='[255, 0, 0, 160]',
113
+ get_radius=100,
114
+ )
115
+ ]
116
+ ))
117
+ else:
118
+ st.info("No red alerts at this time.")
119
+
120
+ else:
121
+ st.warning("Invalid site. Please enter one of: Hyderabad, Gadwal, Kurnool, Bangalore")