File size: 2,900 Bytes
2f58057
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import random
import pandas as pd
import streamlit as st

# ---- Constants ----
TOTAL_POLES = 1000  # Simulating a subset (e.g., 1000) for demo purposes

# ---- Helper Functions ----
def simulate_pole(pole_id):
    solar_kwh = round(random.uniform(3.0, 7.5), 2)
    wind_kwh = round(random.uniform(0.5, 2.0), 2)
    power_required = round(random.uniform(4.0, 8.0), 2)
    total_power = solar_kwh + wind_kwh
    power_status = 'Sufficient' if total_power >= power_required else 'Insufficient'

    tilt_angle = round(random.uniform(0, 45), 2)  # degrees
    vibration = round(random.uniform(0, 5), 2)     # g-force
    camera_status = random.choice(['Online', 'Offline'])

    # Alert classification logic
    alert_level = 'Green'
    if tilt_angle > 30 or vibration > 3:
        alert_level = 'Yellow'
    if tilt_angle > 40 or vibration > 4.5:
        alert_level = 'Red'

    health_score = max(0, 100 - (tilt_angle + vibration * 10))

    return {
        'Pole ID': f'P{pole_id:05}',
        'RFID': f'RFID{pole_id:05}',
        'Solar (kWh)': solar_kwh,
        'Wind (kWh)': wind_kwh,
        'Power Required (kWh)': power_required,
        'Total Power (kWh)': total_power,
        'Power Status': power_status,
        'Tilt Angle (Β°)': tilt_angle,
        'Vibration (g)': vibration,
        'Camera Status': camera_status,
        'Health Score': round(health_score, 2),
        'Alert Level': alert_level
    }

# ---- App Logic ----
st.set_page_config(page_title="Smart Pole Monitoring", layout="wide")
st.title("πŸš€ AI-Enabled Smart Pole Monitoring System")

# Sidebar controls
num_poles = st.sidebar.slider("Number of Poles to Simulate", 100, 2000, 1000, step=100)

# Simulate Data
with st.spinner("Simulating poles..."):
    poles_data = [simulate_pole(i) for i in range(1, num_poles + 1)]
    df = pd.DataFrame(poles_data)

# ---- Dashboard ----
col1, col2, col3 = st.columns(3)
col1.metric("Total Poles", num_poles)
col2.metric("Red Alerts", df[df['Alert Level'] == 'Red'].shape[0])
col3.metric("Power Insufficiencies", df[df['Power Status'] == 'Insufficient'].shape[0])

# ---- Data Table ----
st.subheader("πŸ“‹ Pole-wise Table View")
with st.expander("Filter Options"):
    alert_filter = st.multiselect("Alert Level", options=df['Alert Level'].unique(), default=df['Alert Level'].unique())
    camera_filter = st.multiselect("Camera Status", options=df['Camera Status'].unique(), default=df['Camera Status'].unique())

filtered_df = df[(df['Alert Level'].isin(alert_filter)) & (df['Camera Status'].isin(camera_filter))]
st.dataframe(filtered_df, use_container_width=True)

# ---- Charts ----
st.subheader("πŸ“Š Energy Generation Comparison")
st.bar_chart(df[['Solar (kWh)', 'Wind (kWh)']].mean())

st.subheader("πŸ“ˆ Tilt vs. Vibration")
st.scatter_chart(df[['Tilt Angle (Β°)', 'Vibration (g)']])

st.success("Simulation Complete. Ready for AI + Salesforce integration πŸš€")