battery swap method wip
This commit is contained in:
parent
7c5d3f5b1d
commit
089078a9ea
@ -95,12 +95,50 @@ def update_cycle_SoC(bess_data, bess_soc_for_cycle, timestamp):
|
||||
return bess_soc_for_cycle
|
||||
|
||||
|
||||
def arrange_swap(bess_data, c):
|
||||
for unit in bess_data["units"]:
|
||||
if unit["SoC"] < c["bess"]["buffer"]:
|
||||
# find for unassigned BESS unit with SOC at 100%
|
||||
for candidate in bess_data["units"]:
|
||||
if candidate["SoC"] == 1 and candidate["site"] == "Unassigned":
|
||||
# assign the candidate to the site
|
||||
candidate["site"] = unit["site"]
|
||||
break
|
||||
def arrange_swap(c, bess_data, bess_soc_for_cycle):
|
||||
# identify BESS units that need swapping
|
||||
units_needing_swap = [
|
||||
unit for unit in bess_data["units"] if unit["SoC"] < bess_data["buffer"]["min"]
|
||||
]
|
||||
|
||||
if not units_needing_swap:
|
||||
return bess_data, bess_soc_for_cycle
|
||||
|
||||
# identify BESS units that are unassigned and fully charged
|
||||
unassigned_fully_charged = [
|
||||
unit
|
||||
for unit in bess_data["units"]
|
||||
if unit["SoC"] == 1 and unit["site"] == "Unassigned"
|
||||
]
|
||||
|
||||
if not unassigned_fully_charged:
|
||||
return bess_data, bess_soc_for_cycle
|
||||
|
||||
# assign unassigned fully charged units to units needing swap
|
||||
for unit in units_needing_swap:
|
||||
# take the first unassigned fully charged unit
|
||||
new_unit = unassigned_fully_charged.pop(0)
|
||||
# assign it to the site of the unit needing swap
|
||||
new_unit["site"] = unit["site"]
|
||||
# reset SoC to 1 (fully charged)
|
||||
new_unit["SoC"] = 1
|
||||
# set current load to existing load
|
||||
new_unit["current_load_kW"] = unit["current_load_kW"]
|
||||
|
||||
# reset old unit
|
||||
unit["site"] = "Unassigned" # mark the old unit as unassigned
|
||||
unit["current_load_kW"] = 0 # reset current load
|
||||
|
||||
# update the BESS data
|
||||
# search for the index of the unit needing swap and replace it with the new unit
|
||||
index = next(
|
||||
i for i, d in enumerate(bess_data["units"]) if d["name"] == unit["name"]
|
||||
)
|
||||
bess_data["units"][index] = new_unit
|
||||
# search for index of new unit, and replace with old unit
|
||||
new_index = next(
|
||||
i for i, d in enumerate(bess_data["units"]) if d["name"] == new_unit["name"]
|
||||
)
|
||||
bess_data["units"][new_index] = unit
|
||||
|
||||
return bess_data, bess_soc_for_cycle
|
||||
|
||||
@ -104,7 +104,7 @@ if st.session_state.running:
|
||||
)
|
||||
# display BESS data, SoC, Load Consumption
|
||||
show_table()
|
||||
time.sleep(3)
|
||||
time.sleep(1)
|
||||
st.rerun()
|
||||
else:
|
||||
show_table()
|
||||
|
||||
8
main.py
8
main.py
@ -3,6 +3,7 @@ import yaml
|
||||
from Utilities.Time import get_start_time
|
||||
from Utilities.LoadProfile import get_load_profiles
|
||||
from Utilities.BESS import (
|
||||
arrange_swap,
|
||||
initialise_SoC,
|
||||
initial_site_assignment,
|
||||
discharge_bess,
|
||||
@ -46,7 +47,7 @@ sim_lock = threading.Lock()
|
||||
|
||||
# initialise BESS
|
||||
def _init_state():
|
||||
global bess_data, bess_soc_since_start, bess_soc_for_cycle, cumulative_load_profiles, load_profiles_since_start
|
||||
global bess_data, bess_soc_since_start, bess_soc_for_cycle, cumulative_load_profiles, load_profiles_since_start, init_df
|
||||
|
||||
bd = initialise_SoC(bess_data.copy())
|
||||
bd = initial_site_assignment(c, bd)
|
||||
@ -109,6 +110,11 @@ def simulation_loop():
|
||||
)
|
||||
swap_times = predict_swap_time(bess_soc_for_cycle)
|
||||
|
||||
# trigger swap if needed
|
||||
bess_data, bess_soc_for_cycle = arrange_swap(
|
||||
c, bess_data, bess_soc_for_cycle
|
||||
)
|
||||
|
||||
# integrate newly fetched profiles
|
||||
if is_running_in_async and future.done():
|
||||
load_profiles = future.result()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user