Tigernawin's picture
Update app.py
7fe3f67 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):
query = """
SELECT 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
"""
try:
records = sf.query(query)["records"]
df = pd.DataFrame([{
"Pole ID": rec.get("Name"),
"Alert Level": rec.get("Alert_Level__c"),
"Camera Status": rec.get("Camera_Status__c"),
"Health Score": rec.get("Health_Score__c"),
"Latitude": rec.get("Location_Latitude__c"),
"Longitude": rec.get("Location_Longitude__c"),
"Power Required (kWh)": rec.get("Power_Required__c"),
"Power Sufficient": rec.get("Power_Sufficient__c"),
"RFID Tag": rec.get("RFID_Tag__c"),
"Site": rec.get("Site__c"),
"Solar Gen (kWh)": rec.get("Solar_Generation__c"),
"Wind Gen (kWh)": rec.get("Wind_Generation__c"),
"Vibration (g)": rec.get("Vibration__c"),
"Tilt (ยฐ)": rec.get("Tilt__c"),
} for rec in records])
return df
except Exception as e:
raise RuntimeError(f"Salesforce query failed: {e}")
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)