diff --git a/apps/predbat/config/apps.yaml b/apps/predbat/config/apps.yaml index eb4f8bdcf..f02a6f969 100644 --- a/apps/predbat/config/apps.yaml +++ b/apps/predbat/config/apps.yaml @@ -138,7 +138,8 @@ pred_bat: # - 200 # Workaround to limit the maximum reserve setting, some inverters won't allow 100% to be set - # inverter_reserve_max : 99 + # Comment out if your inverter allows 100% + inverter_reserve_max : 98 # Some batteries tail off their charge rate at high soc% # enter the charging curve here as a % of the max charge rate for each soc percentage. diff --git a/apps/predbat/predbat.py b/apps/predbat/predbat.py index 4208edfb8..6f93e38d3 100644 --- a/apps/predbat/predbat.py +++ b/apps/predbat/predbat.py @@ -16,7 +16,7 @@ import appdaemon.plugins.hass.hassapi as hass import adbase as ad -THIS_VERSION = "v7.13.21" +THIS_VERSION = "v7.13.22" TIME_FORMAT = "%Y-%m-%dT%H:%M:%S%z" TIME_FORMAT_SECONDS = "%Y-%m-%dT%H:%M:%S.%f%z" TIME_FORMAT_OCTOPUS = "%Y-%m-%d %H:%M:%S%z" @@ -7945,8 +7945,9 @@ def calculate_plan(self, recompute=True): # Plan is now valid self.plan_valid = True - self.plan_last_updated = self.now_utc - self.plan_last_updated_minutes = self.minutes_now + if recompute: + self.plan_last_updated = self.now_utc + self.plan_last_updated_minutes = self.minutes_now if self.calculate_best: # Final simulation of best, do 10% and normal scenario @@ -8041,6 +8042,11 @@ def execute_plan(self): ) minutes_start = inverter.charge_start_time_minutes + # Avoid having too long a period to configure as registers only support 24-hours + if (minutes_start < self.minutes_now) and ((minutes_end - minutes_start) >= 24 * 60): + minutes_start = int(self.minutes_now / 30) * 30 + self.log("Move on charge window start time to avoid wrap - new start {}".format(self.time_abs_str(minutes_start))) + # Check if end is within 24 hours of now and end is in the future if (minutes_end - self.minutes_now) < 24 * 60 and minutes_end > self.minutes_now: charge_start_time = self.midnight_utc + timedelta(minutes=minutes_start) @@ -8127,6 +8133,11 @@ def execute_plan(self): ) minutes_start = inverter.discharge_start_time_minutes + # Avoid having too long a period to configure as registers only support 24-hours + if (minutes_start < self.minutes_now) and ((minutes_end - minutes_start) >= 24 * 60): + minutes_start = int(self.minutes_now / 30) * 30 + self.log("Move on discharge window start time to avoid wrap - new start {}".format(self.time_abs_str(minutes_start))) + discharge_start_time = self.midnight_utc + timedelta(minutes=minutes_start) discharge_end_time = self.midnight_utc + timedelta(minutes=(minutes_end + 1)) # Add in 1 minute margin to allow Predbat to restore ECO mode discharge_soc = (self.discharge_limits_best[0] * self.soc_max) / 100.0