ac: mostly charged thing

This commit is contained in:
Evgeny Zinoviev 2021-11-03 23:08:47 +03:00
parent d7ea914459
commit c141e5605a
2 changed files with 16 additions and 1 deletions

View File

@ -62,6 +62,7 @@ _strings = {
'chrg_evt_current_changed': ' AC charging current set to %d A.', 'chrg_evt_current_changed': ' AC charging current set to %d A.',
'chrg_evt_not_charging': ' AC connected but not charging.', 'chrg_evt_not_charging': ' AC connected but not charging.',
'chrg_evt_na_solar': '⛔AC connected, but battery won\'t be charged due to active solar power line.', 'chrg_evt_na_solar': '⛔AC connected, but battery won\'t be charged due to active solar power line.',
'chrg_evt_mostly_charged': '✅ The battery is mostly charged now. The generator can be turned off.',
'battery_level_changed': 'Battery level: <b>%s</b> (<b>%0.1f V</b> under <b>%d W</b> load)', 'battery_level_changed': 'Battery level: <b>%s</b> (<b>%0.1f V</b> under <b>%d W</b> load)',
'error_message': '<b>Error:</b> %s.' 'error_message': '<b>Error:</b> %s.'
} }
@ -392,6 +393,8 @@ def monitor_charging_event_handler(event: ChargingEvent, **kwargs) -> None:
args.append(kwargs['current']) args.append(kwargs['current'])
elif event == ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR: elif event == ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR:
key = 'na_solar' key = 'na_solar'
elif event == ChargingEvent.AC_MOSTLY_CHARGED:
key = 'mostly_charged'
else: else:
logger.error('unknown charging event:', event) logger.error('unknown charging event:', event)
return return

View File

@ -22,6 +22,7 @@ class ChargingEvent(Enum):
AC_CHARGING_STARTED = auto() AC_CHARGING_STARTED = auto()
AC_DISCONNECTED = auto() AC_DISCONNECTED = auto()
AC_CURRENT_CHANGED = auto() AC_CURRENT_CHANGED = auto()
AC_MOSTLY_CHARGED = auto()
AC_CHARGING_FINISHED = auto() AC_CHARGING_FINISHED = auto()
@ -65,6 +66,7 @@ class InverterMonitor(Thread):
interrupted: bool interrupted: bool
battery_state: BatteryState battery_state: BatteryState
charging_state: ChargingState charging_state: ChargingState
mostly_charged: bool
def __init__(self, ac_current_range: Union[List, Tuple] = ()): def __init__(self, ac_current_range: Union[List, Tuple] = ()):
super().__init__() super().__init__()
@ -86,6 +88,7 @@ class InverterMonitor(Thread):
self.active_current = None self.active_current = None
self.battery_state = BatteryState.NORMAL self.battery_state = BatteryState.NORMAL
self.charging_state = ChargingState.NOT_CHARGING self.charging_state = ChargingState.NOT_CHARGING
self.mostly_charged = False
# other stuff # other stuff
self.interrupted = False self.interrupted = False
@ -163,6 +166,10 @@ class InverterMonitor(Thread):
self.charging_event_handler(ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR) self.charging_event_handler(ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR)
_logger.info('solar power connected during charging, entering AC_BUT_SOLAR state') _logger.info('solar power connected during charging, entering AC_BUT_SOLAR state')
if self.mostly_charged and v > 53 and pd != BatteryPowerDirection.CHARGING:
self.ac_charging_stop(ChargingState.AC_DONE)
return
state = ChargingState.AC_OK if pd == BatteryPowerDirection.CHARGING else ChargingState.AC_WAITING state = ChargingState.AC_OK if pd == BatteryPowerDirection.CHARGING else ChargingState.AC_WAITING
if state != self.charging_state: if state != self.charging_state:
self.charging_state = state self.charging_state = state
@ -175,7 +182,7 @@ class InverterMonitor(Thread):
if self.active_current >= 30: if self.active_current >= 30:
upper_bound = 56.9 upper_bound = 56.9
elif self.active_current == 20: elif self.active_current == 20:
upper_bound = 56.6 upper_bound = 56.7
else: else:
upper_bound = 54 upper_bound = 54
@ -220,6 +227,7 @@ class InverterMonitor(Thread):
if self.currents: if self.currents:
self.currents = [] self.currents = []
self.mostly_charged = False
self.active_current = None self.active_current = None
def ac_charging_next_current(self): def ac_charging_next_current(self):
@ -232,6 +240,10 @@ class InverterMonitor(Thread):
self.ac_charging_stop(ChargingState.AC_DONE) self.ac_charging_stop(ChargingState.AC_DONE)
return return
if current <= 10 and not self.mostly_charged:
self.mostly_charged = True
self.charging_event_handler(ChargingEvent.AC_MOSTLY_CHARGED)
try: try:
response = inverter.exec('set-max-ac-charging-current', (0, current)) response = inverter.exec('set-max-ac-charging-current', (0, current))
if response['result'] != 'ok': if response['result'] != 'ok':