Tigernawin's picture
Update app.py
5972e95 verified
import streamlit as st
import pandas as pd
import os
from simple_salesforce import Salesforce, SalesforceAuthenticationFailed
from modules.simulator import simulate_data
from modules.filters import apply_filters
from modules.visuals import display_dashboard, display_charts
st.set_page_config(page_title="Vedavathi Smart Pole Monitoring", layout="wide")
st.title("πŸ“‘ Vedavathi Smart Pole Monitoring - PoC Simulator")
# Sidebar Controls
st.sidebar.header("πŸ› οΈ Simulation Controls")
data_source = st.sidebar.radio("Data Source", ["Simulated", "Salesforce"])
simulate_faults = st.sidebar.checkbox("Simulate Random Faults", value=True)
num_poles = st.sidebar.slider("Number of Poles", min_value=5, max_value=50, value=10) if data_source == "Simulated" else None
def connect_to_salesforce():
try:
sf = Salesforce(
username="greenenergy@vedavathi.com",
password="Vedavathi@04",
security_token="jqe4His8AcuFJucZz5NBHfGU",
domain="login" # "login" for production & developer edition; use "test" for sandbox
)
return sf
except SalesforceAuthenticationFailed as e:
print("Salesforce authentication failed:", e)
return None
except Exception as e:
print("Unexpected error connecting to Salesforce:", e)
return None
def fetch_salesforce_data(sf):
# Fetch Pole data
pole_query = """
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
FROM Pole__c
LIMIT 48
"""
poles = sf.query(pole_query)["records"]
# Fetch SensorData
sensor_query = """
SELECT Pole__c, Vibration__c, Tilt__c
FROM SensorData__c
WHERE Pole__c != NULL
"""
sensors = sf.query(sensor_query)["records"]
# Convert to DataFrames
poles_df = pd.DataFrame([{
"Pole ID": p.get("Name"),
"Pole Salesforce ID": p.get("Id"),
"Alert Level": p.get("Alert_Level__c"),
"Camera Status": p.get("Camera_Status__c"),
"Health Score": p.get("Health_Score__c"),
"Latitude": p.get("Location_Latitude__c"),
"Longitude": p.get("Location_Longitude__c"),
"Power Required (kWh)": p.get("Power_Required__c"),
"Power Sufficient": p.get("Power_Sufficient__c"),
"RFID Tag": p.get("RFID_Tag__c"),
"Site": p.get("Site__c"),
"Solar Gen (kWh)": p.get("Solar_Generation__c"),
"Wind Gen (kWh)": p.get("Wind_Generation__c")
} for p in poles])
sensors_df = pd.DataFrame([{
"Pole Salesforce ID": s.get("Pole__c"),
"Vibration (g)": s.get("Vibration__c"),
"Tilt (Β°)": s.get("Tilt__c")
} for s in sensors])
# Merge Sensor Data into Pole Data
df = pd.merge(poles_df, sensors_df, on="Pole Salesforce ID", how="left")
# Drop internal Salesforce ID after merge
df.drop(columns=["Pole Salesforce ID"], inplace=True)
return df
sf = connect_to_salesforce()
if data_source == "Salesforce" and sf:
try:
df = fetch_salesforce_data(sf)
st.success("Fetched data from Salesforce successfully.")
except Exception as e:
st.error(f"Failed to fetch data from Salesforce: {e}")
st.stop()
elif data_source == "Simulated":
df = simulate_data(num_poles, simulate_faults)
else:
st.error("Failed to connect to Salesforce.")
st.stop()
# Filters
st.sidebar.header("πŸ“‚ Filter Data")
alert_filter = st.sidebar.multiselect("Alert Level", ["Green", "Yellow", "Red"], default=["Green", "Yellow", "Red"])
cam_filter = st.sidebar.selectbox("Camera Status", ["All", "Online", "Offline"], index=0)
filtered_df = apply_filters(df, alert_filter, cam_filter)
# Dashboard + Charts
display_dashboard(df)
st.subheader("πŸ“‹ Pole Monitoring Table")
st.dataframe(filtered_df, use_container_width=True)
display_charts(df)