@@ -223,7 +223,19 @@ def run_prediction(self, now, charge_limit, load_minutes, pv_forecast_minute, sa
223223 # Apply battery loss to charging from PV
224224 if diff < 0 :
225225 diff *= self .battery_loss
226-
226+
227+ # Max charge rate, export over the cap
228+ if diff < - self .charge_rate :
229+ soc -= self .charge_rate
230+ if record :
231+ energy = - (diff + self .charge_rate )
232+ export_kwh += energy
233+ if minute_absolute in self .rate_export :
234+ metric -= self .rate_export [minute_absolute ] * energy
235+ else :
236+ metric -= self .metric_export * energy
237+
238+ # Max discharge rate, draw from grid over the cap
227239 if diff > self .discharge_rate :
228240 soc -= self .discharge_rate
229241 if record :
@@ -244,7 +256,8 @@ def run_prediction(self, now, charge_limit, load_minutes, pv_forecast_minute, sa
244256 metric += self .metric_house * energy
245257 else :
246258 soc -= diff
247-
259+
260+ # Flat battery, draw from grid over the cap
248261 if soc < self .reserve :
249262 if record :
250263 energy = self .reserve - soc
@@ -256,6 +269,7 @@ def run_prediction(self, now, charge_limit, load_minutes, pv_forecast_minute, sa
256269 metric += self .metric_house * energy
257270 soc = self .reserve
258271
272+ # Full battery, export over the cap
259273 if soc > self .soc_max :
260274 if record :
261275 energy = soc - self .soc_max
0 commit comments