112 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # dashboard.py
 | |
| import streamlit as st
 | |
| import matplotlib.pyplot as pl
 | |
| import pandas as pd
 | |
| import main
 | |
| from main import (
 | |
|     start_sim,
 | |
|     stop_sim,
 | |
|     reset_sim,
 | |
| )
 | |
| import time
 | |
| 
 | |
| 
 | |
| st.set_page_config(layout="wide")
 | |
| 
 | |
| # Header
 | |
| st.logo("https://rooftop.my/logo.svg", size="large")
 | |
| st.title("MEOS Control Dashboard")
 | |
| st.subheader("Mobile Energy Operations Simulation (MEOS)")
 | |
| st.text("Run MEOS Simulation and Monitor MBESS Status")
 | |
| 
 | |
| # some instructions
 | |
| 
 | |
| # --- SESSION STATE SETUP ---
 | |
| if "running" not in st.session_state:
 | |
|     st.session_state.running = False
 | |
| if "plot_area" not in st.session_state:
 | |
|     st.session_state.plot_area = st.empty()
 | |
| 
 | |
| # --- CONTROL BUTTONS ---
 | |
| col1, col2, col3 = st.columns(3)
 | |
| with col1:
 | |
|     if st.button("Start", use_container_width=True):
 | |
|         start_sim()
 | |
|         st.session_state.running = True
 | |
| with col2:
 | |
|     if st.button("Stop", use_container_width=True):
 | |
|         stop_sim()
 | |
|         st.session_state.running = False
 | |
| with col3:
 | |
|     if st.button("Reset", use_container_width=True):
 | |
|         reset_sim()
 | |
|         st.session_state.running = False
 | |
| 
 | |
| placeholder = st.empty()
 | |
| 
 | |
| 
 | |
| def show_table():
 | |
|     df = main.status_df
 | |
|     if df is None or df.empty:
 | |
|         placeholder.text("Waiting for first simulation step…")
 | |
|     else:
 | |
|         placeholder.dataframe(
 | |
|             df,
 | |
|             column_config={
 | |
|                 "Site Name": st.column_config.TextColumn("Site Name"),
 | |
|                 "MBESS Unit": st.column_config.TextColumn(
 | |
|                     "MBESS Unit", help="Name of the MBESS unit at the site"
 | |
|                 ),
 | |
|                 "Current Load (kW)": st.column_config.NumberColumn(
 | |
|                     "Current Load (kW)", help="Current BESS discharge load in kW"
 | |
|                 ),
 | |
|                 "SoC (%)": st.column_config.ProgressColumn(
 | |
|                     "State of Charge",
 | |
|                     help="State of Charge of the BESS unit",
 | |
|                     format="%.1f%%",
 | |
|                     min_value=0,
 | |
|                     max_value=100,
 | |
|                 ),
 | |
|                 "Predicted Swap Time": st.column_config.TextColumn(
 | |
|                     "Predicted Swap Time", help="Predicted time for BESS swap"
 | |
|                 ),
 | |
|                 "Cycle Discharge Profile": st.column_config.LineChartColumn(
 | |
|                     "Cycle Discharge Profile",
 | |
|                     help="Cycle discharge profile of the BESS unit",
 | |
|                 ),
 | |
|                 "Load Profile Since Start": st.column_config.LineChartColumn(
 | |
|                     "Load Profile Since Start",
 | |
|                     help="Load profile since the start of the simulation",
 | |
|                 ),
 | |
|             },
 | |
|             use_container_width=True,
 | |
|         )
 | |
| 
 | |
| 
 | |
| if st.session_state.running:
 | |
|     # display simulation start time
 | |
|     st.metric(
 | |
|         "Simulation Start Time",
 | |
|         value=pd.to_datetime(main.c["sim_start_time"], unit="s").strftime(
 | |
|             "%Y-%m-%d %H:%M:%S"
 | |
|         ),
 | |
|     )
 | |
|     st.metric(
 | |
|         "Current Time",
 | |
|         value=pd.to_datetime(
 | |
|             main.c["sim_start_time"] + main.sim_i * main.dt, unit="s"
 | |
|         ).strftime("%Y-%m-%d %H:%M:%S"),
 | |
|     )
 | |
| 
 | |
|     st.metric(
 | |
|         "Time Elapsed in DD:HH:MM:SS",
 | |
|         value=str(pd.to_timedelta(main.sim_i * main.dt, unit="s")),
 | |
|     )
 | |
|     # display BESS data, SoC, Load Consumption
 | |
|     show_table()
 | |
|     time.sleep(1)
 | |
|     st.rerun()
 | |
| else:
 | |
|     show_table()
 | |
|     st.info("Simulation not running")
 |