File size: 5,232 Bytes
7270a20 2c3aca4 67f40a1 2c3aca4 21d7e79 2c3aca4 31f9935 6b279ed 2c3aca4 21d7e79 fa181e5 c810abd fa181e5 6b279ed fa181e5 6b279ed fa181e5 6b279ed fa181e5 6b279ed fa181e5 6b279ed fa181e5 c810abd 6b279ed c810abd 6b279ed c810abd fd24507 6b279ed c810abd 6b279ed fa181e5 6b279ed c810abd 6b279ed c810abd 6b279ed c810abd 6b279ed fd24507 6b279ed c810abd 6b279ed c810abd 6b279ed c810abd 2c3aca4 c810abd 6b279ed c810abd fc3614e aef39fc fc3614e |
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
import streamlit as st
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import datetime
# Load dataset function
def load_data():
# Ensure this path is correct for your environment
df = pd.read_excel("grid_load_data.xlsx")
return df
# Calculate grid load based on time and dataset
def calculate_grid_load(df, current_time):
current_hour = current_time.hour
hourly_load = df[df["Time"].dt.hour == current_hour]["Grid Load (kW)"].mean()
return hourly_load
# Create a gauge chart for grid load status
def create_gauge(load_value):
# Define ranges for low, normal, high
ranges = [0, 2000, 3000, 4000]
colors = ['lightgreen', 'green', 'red']
labels = ['Low', 'Normal', 'High']
# Determine color and range based on load value
if load_value < 2000:
color = colors[0]
range_label = labels[0]
elif load_value < 3000:
color = colors[1]
range_label = labels[1]
else:
color = colors[2]
range_label = labels[2]
# Create the gauge chart using plotly
fig = go.Figure(go.Indicator(
mode="gauge+number+delta",
value=load_value,
domain={'x': [0, 1], 'y': [0, 1]},
gauge={
'axis': {'range': [0, 5000]},
'bar': {'color': color},
'steps': [
{'range': [0, 2000], 'color': 'lightgreen'},
{'range': [2000, 3000], 'color': 'green'},
{'range': [3000, 5000], 'color': 'red'}
],
},
title={'text': f"Grid Load Status: {range_label}"},
delta={'reference': 2000}
))
return fig
# Function to calculate the required EVs for grid stabilization
def calculate_ev_requirements(grid_load, ev_capacity=80, ev_efficiency=0.85):
# Assuming each EV contributes its battery capacity (80kWh) and efficiency (85%).
# Formula: EVs required = Grid load / (EV capacity * efficiency)
evs_needed = grid_load / (ev_capacity * ev_efficiency)
return np.ceil(evs_needed) # Round to the nearest whole number
# Function to calculate power and energy consumption from EV during underload condition
def calculate_ev_power_consumption(ev_capacity=80, charge_rate=0.85):
# Power consumed per EV during underload (assuming 85% depth of charge)
power_consumed = ev_capacity * charge_rate
return power_consumed
# Display the grid load prediction and related EV info
def display_grid_load_prediction_and_ev_info():
st.header("Grid Load Prediction and EV Charging Info")
# Allow user to manually set grid load using slider (0 to 5000 kW)
grid_load = st.slider(
"Select Grid Load (kW):",
min_value=0,
max_value=5000,
value=2000, # Default value
step=100,
help="Drag the slider to set the desired grid load."
)
# Display the gauge chart based on selected load value
st.plotly_chart(create_gauge(grid_load), use_container_width=True)
# LED Indicators for overload/normal status
if grid_load > 3500:
st.markdown('<p style="color: red; font-size: 24px;">🔹 Left LED: Overload! Grid is in danger.</p>', unsafe_allow_html=True)
else:
st.markdown('<p style="color: green; font-size: 24px;">🔹 Right LED: Normal. Grid is stable.</p>', unsafe_allow_html=True)
# EV Charging Status
if grid_load < 3000:
st.markdown('<p style="color: green;">Green: Charging allowed. EVs can charge.</p>', unsafe_allow_html=True)
# Calculate and display the number of EVs that can be connected based on grid load
evs_connected = calculate_ev_requirements(grid_load)
st.write(f"Approximately {evs_connected} EVs can be connected to the grid for charging.")
else:
st.markdown('<p style="color: red;">Red: Grid overload! Disconnecting EV from grid.</p>', unsafe_allow_html=True)
# If the load exceeds 3500 kW, calculate how much energy is needed to stabilize the grid
if grid_load > 3500:
energy_required = grid_load - 3500
evs_needed = calculate_ev_requirements(energy_required)
st.write(f"To stabilize the grid, {energy_required} kWh of energy is required.")
st.write(f"Approximately {evs_needed} EVs are needed to supply this energy to the grid.")
# Add a button to connect EVs to stabilize the grid
if st.button("Connect EVs to Stabilize Grid"):
grid_load -= energy_required # Decrease grid load by the energy provided by EVs
st.write(f"Grid load reduced to {grid_load} kW. EVs are stabilizing the grid.")
# Allow the user to disconnect EVs if the grid load is too high
if grid_load > 3000:
st.button("Disconnect EV from Grid", key="disconnect_charge", help="Grid load is too high. Disconnect EV.")
else:
st.button("Allow EV to Charge", key="allow_charge", help="Grid load is normal. EVs can charge.")
# Display Main Application
def main():
st.sidebar.title("EV Charging Optimization")
# Display the Grid Load Prediction and EV Info all on the same page
display_grid_load_prediction_and_ev_info()
if __name__ == "__main__":
main()
|