| class Battery: | |
| def __init__(self, e_max_mwh, p_ch_max, p_dis_max, eta_ch, eta_dis): | |
| self.e_max = e_max_mwh | |
| self.p_ch_max = p_ch_max | |
| self.p_dis_max = p_dis_max | |
| self.eta_ch = eta_ch | |
| self.eta_dis = eta_dis | |
| self.soc = 0.5 * self.e_max # Start at 50% (10 MWh) | |
| def reset(self): | |
| self.soc = 0.5 * self.e_max | |
| return self.soc | |
| def step(self, action_fraction, dt_hours): | |
| """ | |
| action_fraction: -1 (Full Charge) to 1 (Full Discharge) | |
| """ | |
| if action_fraction < 0: # Charging | |
| p_mw = max(action_fraction * self.p_ch_max, -self.p_ch_max) | |
| # SoC increases by (Power * Time * Efficiency) | |
| self.soc += abs(p_mw) * dt_hours * self.eta_ch | |
| else: # Discharging | |
| p_mw = min(action_fraction * self.p_dis_max, self.p_dis_max) | |
| # SoC decreases by (Power * Time / Efficiency) | |
| self.soc -= (p_mw * dt_hours) / self.eta_dis | |
| self.soc = max(0.0, min(self.e_max, self.soc)) | |
| return self.soc |