Tigernawin commited on
Commit
df2996a
·
verified ·
1 Parent(s): 7ec1b38

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +64 -76
app.py CHANGED
@@ -1,128 +1,116 @@
1
  import streamlit as st
2
  import pandas as pd
3
- import os
4
- import pydeck as pdk
5
  from simple_salesforce import Salesforce, SalesforceAuthenticationFailed
6
  from modules.simulator import simulate_data
7
  from modules.filters import apply_filters
8
  from modules.visuals import display_dashboard, display_charts
9
 
 
10
  st.set_page_config(page_title="Vedavathi Smart Pole Monitoring", layout="wide")
11
  st.title("📡 Vedavathi Smart Pole Monitoring - PoC Simulator")
12
 
13
- # Sidebar Controls
14
  st.sidebar.header("🛠️ Simulation Controls")
15
  data_source = st.sidebar.radio("Data Source", ["Simulated", "Salesforce"])
16
-
17
  simulate_faults = st.sidebar.checkbox("Simulate Random Faults", value=True)
18
- num_poles = st.sidebar.slider("Number of Poles", min_value=5, max_value=50, value=10) if data_source == "Simulated" else None
19
 
 
20
  def connect_to_salesforce():
21
  try:
22
- sf = Salesforce(
23
  username="greenenergy@vedavathi.com",
24
  password="Vedavathi@04",
25
  security_token="jqe4His8AcuFJucZz5NBHfGU",
26
- domain="login" # "login" for production & developer edition; use "test" for sandbox
27
  )
28
- return sf
29
- except SalesforceAuthenticationFailed as e:
30
- print("Salesforce authentication failed:", e)
31
  return None
32
  except Exception as e:
33
- print("Unexpected error connecting to Salesforce:", e)
34
  return None
35
 
 
36
  def fetch_salesforce_data(sf):
37
- # Fetch Pole data
38
- pole_query = """
39
- SELECT Id, Name, Alert_Level__c, Camera_Status__c, Health_Score__c, Location_Latitude__c, Location_Longitude__c, Power_Required__c, Power_Sufficient__c, RFID_Tag__c, Site__c, Solar_Generation__c, Wind_Generation__c
40
- FROM Pole__c
41
- LIMIT 48
42
- """
43
- poles = sf.query(pole_query)["records"]
44
-
45
- # Fetch SensorData
46
- sensor_query = """
47
- SELECT Pole__c, Vibration__c, Tilt__c
48
- FROM SensorData__c
49
- WHERE Pole__c != NULL
50
- """
51
- sensors = sf.query(sensor_query)["records"]
52
-
53
- # Convert to DataFrames
54
- poles_df = pd.DataFrame([{
55
- "Pole ID": p.get("Name"),
56
- "Pole Salesforce ID": p.get("Id"),
57
- "Alert Level": p.get("Alert_Level__c"),
58
- "Camera Status": p.get("Camera_Status__c"),
59
- "Health Score": p.get("Health_Score__c"),
60
- "Latitude": p.get("Location_Latitude__c"),
61
- "Longitude": p.get("Location_Longitude__c"),
62
- "Power Required (kWh)": p.get("Power_Required__c"),
63
- "Power Sufficient": p.get("Power_Sufficient__c"),
64
- "RFID Tag": p.get("RFID_Tag__c"),
65
- "Site": p.get("Site__c"),
66
- "Solar Gen (kWh)": p.get("Solar_Generation__c"),
67
- "Wind Gen (kWh)": p.get("Wind_Generation__c")
68
- } for p in poles])
69
-
70
- sensors_df = pd.DataFrame([{
71
- "Pole Salesforce ID": s.get("Pole__c"),
72
- "Vibration (g)": s.get("Vibration__c"),
73
- "Tilt (°)": s.get("Tilt__c")
74
- } for s in sensors])
75
-
76
- # Merge Sensor Data into Pole Data
77
- df = pd.merge(poles_df, sensors_df, on="Pole Salesforce ID", how="left")
78
-
79
- # Drop internal Salesforce ID after merge
80
- df.drop(columns=["Pole Salesforce ID"], inplace=True)
81
-
82
- return df
83
-
84
- # Connect to Salesforce or Simulate Data
85
- sf = connect_to_salesforce()
86
- if data_source == "Salesforce" and sf:
87
  try:
88
- df = fetch_salesforce_data(sf)
89
- st.success("Fetched data from Salesforce successfully.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  except Exception as e:
91
- st.error(f"Failed to fetch data from Salesforce: {e}")
 
 
 
 
 
 
 
 
92
  st.stop()
93
  elif data_source == "Simulated":
94
  df = simulate_data(num_poles, simulate_faults)
95
  else:
96
- st.error("Failed to connect to Salesforce.")
97
  st.stop()
98
 
99
- # Sidebar Filters
100
  st.sidebar.header("📂 Filter Data")
101
- alert_filter = st.sidebar.multiselect("Alert Level", ["Green", "Yellow", "Red"], default=["Green", "Yellow", "Red"])
102
  cam_filter = st.sidebar.selectbox("Camera Status", ["All", "Online", "Offline"], index=0)
103
-
104
- # 🌐 Site Filter Dropdown
105
  site_options = ["All", "Hyderabad", "Gadwal", "Kurnool", "Ballari"]
106
  selected_site = st.sidebar.selectbox("Select Site", site_options)
107
 
108
- # Apply Filters
109
  filtered_df = apply_filters(df, alert_filter, cam_filter)
110
 
111
- # Apply site filter if not "All"
112
  if selected_site != "All":
113
  filtered_df = filtered_df[filtered_df["Site"] == selected_site]
114
 
115
- # 🔥 Sort site column in desired order
116
  site_order = ["Hyderabad", "Gadwal", "Kurnool", "Ballari"]
117
  filtered_df["Site"] = pd.Categorical(filtered_df["Site"], categories=site_order, ordered=True)
118
  filtered_df = filtered_df.sort_values("Site")
119
 
120
- # Dashboard + Charts
121
  display_dashboard(filtered_df)
122
 
123
- # Display Monitoring Table
124
  st.subheader("📋 Pole Monitoring Table")
125
  st.dataframe(filtered_df, use_container_width=True)
126
 
127
- # Show Charts
128
- display_charts(filtered_df)
 
1
  import streamlit as st
2
  import pandas as pd
 
 
3
  from simple_salesforce import Salesforce, SalesforceAuthenticationFailed
4
  from modules.simulator import simulate_data
5
  from modules.filters import apply_filters
6
  from modules.visuals import display_dashboard, display_charts
7
 
8
+ # --- Streamlit Page Setup ---
9
  st.set_page_config(page_title="Vedavathi Smart Pole Monitoring", layout="wide")
10
  st.title("📡 Vedavathi Smart Pole Monitoring - PoC Simulator")
11
 
12
+ # --- Sidebar Controls ---
13
  st.sidebar.header("🛠️ Simulation Controls")
14
  data_source = st.sidebar.radio("Data Source", ["Simulated", "Salesforce"])
 
15
  simulate_faults = st.sidebar.checkbox("Simulate Random Faults", value=True)
16
+ num_poles = st.sidebar.slider("Number of Poles", 5, 50, 10) if data_source == "Simulated" else None
17
 
18
+ # --- Salesforce Connection ---
19
  def connect_to_salesforce():
20
  try:
21
+ return Salesforce(
22
  username="greenenergy@vedavathi.com",
23
  password="Vedavathi@04",
24
  security_token="jqe4His8AcuFJucZz5NBHfGU",
25
+ domain="login"
26
  )
27
+ except SalesforceAuthenticationFailed:
28
+ st.error("Salesforce authentication failed. Please check credentials.")
 
29
  return None
30
  except Exception as e:
31
+ st.error(f"Unexpected error connecting to Salesforce: {e}")
32
  return None
33
 
34
+ # --- Fetch Salesforce Data ---
35
  def fetch_salesforce_data(sf):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  try:
37
+ poles = sf.query("""
38
+ SELECT Id, Name, Alert_Level__c, Camera_Status__c, Health_Score__c,
39
+ Location_Latitude__c, Location_Longitude__c, Power_Required__c,
40
+ Power_Sufficient__c, RFID_Tag__c, Site__c, Solar_Generation__c,
41
+ Wind_Generation__c
42
+ FROM Pole__c
43
+ LIMIT 48
44
+ """)["records"]
45
+
46
+ sensors = sf.query("""
47
+ SELECT Pole__c, Vibration__c, Tilt__c
48
+ FROM SensorData__c
49
+ WHERE Pole__c != NULL
50
+ """)["records"]
51
+
52
+ poles_df = pd.DataFrame([{
53
+ "Pole ID": p.get("Name"),
54
+ "Pole Salesforce ID": p.get("Id"),
55
+ "Alert Level": p.get("Alert_Level__c"),
56
+ "Camera Status": p.get("Camera_Status__c"),
57
+ "Health Score": p.get("Health_Score__c"),
58
+ "Latitude": p.get("Location_Latitude__c"),
59
+ "Longitude": p.get("Location_Longitude__c"),
60
+ "Power Required (kWh)": p.get("Power_Required__c"),
61
+ "Power Sufficient": p.get("Power_Sufficient__c"),
62
+ "RFID Tag": p.get("RFID_Tag__c"),
63
+ "Site": p.get("Site__c"),
64
+ "Solar Gen (kWh)": p.get("Solar_Generation__c"),
65
+ "Wind Gen (kWh)": p.get("Wind_Generation__c")
66
+ } for p in poles])
67
+
68
+ sensors_df = pd.DataFrame([{
69
+ "Pole Salesforce ID": s.get("Pole__c"),
70
+ "Vibration (g)": s.get("Vibration__c"),
71
+ "Tilt (°)": s.get("Tilt__c")
72
+ } for s in sensors])
73
+
74
+ df = pd.merge(poles_df, sensors_df, on="Pole Salesforce ID", how="left")
75
+ return df.drop(columns=["Pole Salesforce ID"])
76
+
77
  except Exception as e:
78
+ st.error(f"Error fetching Salesforce data: {e}")
79
+ return pd.DataFrame()
80
+
81
+ # --- Load Data ---
82
+ sf = connect_to_salesforce() if data_source == "Salesforce" else None
83
+
84
+ if data_source == "Salesforce" and sf:
85
+ df = fetch_salesforce_data(sf)
86
+ if df.empty:
87
  st.stop()
88
  elif data_source == "Simulated":
89
  df = simulate_data(num_poles, simulate_faults)
90
  else:
 
91
  st.stop()
92
 
93
+ # --- Sidebar Filters ---
94
  st.sidebar.header("📂 Filter Data")
95
+ alert_filter = st.sidebar.multiselect("Alert Level", ["Green", "Yellow", "Red"], ["Green", "Yellow", "Red"])
96
  cam_filter = st.sidebar.selectbox("Camera Status", ["All", "Online", "Offline"], index=0)
 
 
97
  site_options = ["All", "Hyderabad", "Gadwal", "Kurnool", "Ballari"]
98
  selected_site = st.sidebar.selectbox("Select Site", site_options)
99
 
100
+ # --- Apply Filters ---
101
  filtered_df = apply_filters(df, alert_filter, cam_filter)
102
 
 
103
  if selected_site != "All":
104
  filtered_df = filtered_df[filtered_df["Site"] == selected_site]
105
 
 
106
  site_order = ["Hyderabad", "Gadwal", "Kurnool", "Ballari"]
107
  filtered_df["Site"] = pd.Categorical(filtered_df["Site"], categories=site_order, ordered=True)
108
  filtered_df = filtered_df.sort_values("Site")
109
 
110
+ # --- Display Dashboard and Charts ---
111
  display_dashboard(filtered_df)
112
 
 
113
  st.subheader("📋 Pole Monitoring Table")
114
  st.dataframe(filtered_df, use_container_width=True)
115
 
116
+ display_charts(filtered_df)