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;">&#128313; Left LED: Overload! Grid is in danger.</p>', unsafe_allow_html=True)
    else:
        st.markdown('<p style="color: green; font-size: 24px;">&#128313; 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()