Skip to content

Commit 25e9b93

Browse files
Fixes for discharge/charge curve calc (#2814)
* Fixes for discharge/charge curve calc * [pre-commit.ci lite] apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent c3f80eb commit 25e9b93

1 file changed

Lines changed: 20 additions & 12 deletions

File tree

‎apps/predbat/inverter.py‎

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -533,18 +533,20 @@ def find_charge_curve(self, discharge):
533533
else:
534534
max_power = int(self.battery_rate_max_charge * MINUTE_WATT)
535535

536+
max_power_scaled = max_power * 0.95
537+
536538
if soc_kwh_sensor and charge_rate_sensor and battery_power_sensor and predbat_status_sensor:
537539
battery_power_sensor = battery_power_sensor.replace("number.", "sensor.") # Workaround as old template had number.
538540
self.log("Find {} curve with sensors {} and {} and {} and {}".format(curve_type, soc_kwh_sensor, charge_rate_sensor, predbat_status_sensor, battery_power_sensor))
539541
if soc_kwh_percent:
540-
soc_kwh_data = self.base.get_history_wrapper(entity_id=soc_kwh_sensor, days=self.base.max_days_previous)
542+
soc_kwh_data = self.base.get_history_wrapper(entity_id=soc_kwh_sensor, days=self.base.max_days_previous, required=False)
541543
else:
542-
soc_kwh_data = self.base.get_history_wrapper(entity_id=soc_kwh_sensor, days=self.base.max_days_previous)
543-
charge_rate_data = self.base.get_history_wrapper(entity_id=charge_rate_sensor, days=self.base.max_days_previous)
544-
battery_power_data = self.base.get_history_wrapper(entity_id=battery_power_sensor, days=self.base.max_days_previous)
545-
predbat_status_data = self.base.get_history_wrapper(entity_id=predbat_status_sensor, days=self.base.max_days_previous)
544+
soc_kwh_data = self.base.get_history_wrapper(entity_id=soc_kwh_sensor, days=self.base.max_days_previous, required=False)
545+
charge_rate_data = self.base.get_history_wrapper(entity_id=charge_rate_sensor, days=self.base.max_days_previous, required=False)
546+
battery_power_data = self.base.get_history_wrapper(entity_id=battery_power_sensor, days=self.base.max_days_previous, required=False)
547+
predbat_status_data = self.base.get_history_wrapper(entity_id=predbat_status_sensor, days=self.base.max_days_previous, required=False)
546548

547-
if soc_kwh_data and charge_rate_data and charge_rate_data and battery_power_data:
549+
if soc_kwh_data and charge_rate_data and battery_power_data and predbat_status_data:
548550
if soc_kwh_percent:
549551
# If its in percent convert to kWh
550552
soc_kwh = self.base.minute_data(
@@ -590,6 +592,11 @@ def find_charge_curve(self, discharge):
590592
required_unit="W",
591593
)
592594
predbat_status = self.base.minute_data_state(predbat_status_data[0], self.base.max_days_previous, self.base.now_utc, "state", "last_updated")
595+
for minute in predbat_status:
596+
status = predbat_status[minute]
597+
if "," in status:
598+
# If there are multiple statuses take the first one
599+
predbat_status[minute] = status.split(",")[0].strip()
593600
battery_power = self.base.minute_data(
594601
battery_power_data[0],
595602
self.base.max_days_previous,
@@ -630,8 +637,8 @@ def find_charge_curve(self, discharge):
630637
and predbat_status.get(minute - 1, "") == "Charging"
631638
and predbat_status.get(minute, "") == "Charging"
632639
and predbat_status.get(minute + 1, "") == "Charging"
633-
and charge_rate.get(minute - 1, 0) == max_power
634-
and charge_rate.get(minute, 0) == max_power
640+
and charge_rate.get(minute - 1, 0) >= max_power_scaled
641+
and charge_rate.get(minute, 0) >= max_power_scaled
635642
and battery_power.get(minute, 0) < 0
636643
) or (
637644
discharge
@@ -640,18 +647,18 @@ def find_charge_curve(self, discharge):
640647
and predbat_status.get(minute - 1, "") in ["Exporting", "Discharging"]
641648
and predbat_status.get(minute, "") in ["Exporting", "Discharging"]
642649
and predbat_status.get(minute + 1, "") in ["Exporting", "Discharging"]
643-
and charge_rate.get(minute - 1, 0) == max_power
644-
and charge_rate.get(minute, 0) == max_power
650+
and charge_rate.get(minute - 1, 0) >= max_power_scaled
651+
and charge_rate.get(minute, 0) >= max_power_scaled
645652
and battery_power.get(minute, 0) > 0
646653
):
647654
total_power = 0
648655
total_count = 0
649656
# Find a period where charging was at full rate and the SOC just drops below the data point
650657
for target_minute in range(minute, min_len):
651658
this_soc = soc_percent.get(target_minute, 0)
652-
if not discharge and (predbat_status.get(target_minute, "") != "Charging" or charge_rate.get(minute, 0) != max_power or battery_power.get(minute, 0) >= 0):
659+
if not discharge and (predbat_status.get(target_minute, "") != "Charging" or charge_rate.get(minute, 0) < max_power_scaled or battery_power.get(minute, 0) >= 0):
653660
break
654-
if discharge and (not ((predbat_status.get(target_minute, "") in ["Exporting", "Discharging"])) or charge_rate.get(minute, 0) != max_power or battery_power.get(minute, 0) <= 0):
661+
if discharge and (not ((predbat_status.get(target_minute, "") in ["Exporting", "Discharging"])) or charge_rate.get(minute, 0) < max_power_scaled or battery_power.get(minute, 0) <= 0):
655662
break
656663

657664
if (discharge and (this_soc > data_point)) or (not discharge and (this_soc < data_point)):
@@ -777,6 +784,7 @@ def find_charge_curve(self, discharge):
777784
self.log("Note: Cannot find battery {} curve (no final curve), one of the required settings for predbat.status, soc_kw, battery_power and {}_rate do not have history, check apps.yaml".format(curve_type, curve_type))
778785
else:
779786
self.log("Note: Cannot find battery {} curve (missing history), one of the required settings for predbat.status, soc_kw, battery_power and {}_rate do not have history, check apps.yaml".format(curve_type, curve_type))
787+
self.log("Note: Sensor with history data lengths: soc_kwh {}, charge_rate {}, battery_power {}, predbat_status {}".format(len(soc_kwh), len(charge_rate), len(battery_power), len(predbat_status)))
780788
else:
781789
self.log("Note: Cannot find battery {} curve (settings missing), one of the required settings for soc_kw, battery_power and {}_rate are missing from apps.yaml".format(curve_type, curve_type))
782790
return {}

0 commit comments

Comments
 (0)