diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/inverter-bot | 51 | ||||
-rw-r--r-- | src/monitor.py | 113 |
2 files changed, 77 insertions, 87 deletions
diff --git a/src/inverter-bot b/src/inverter-bot index 4fa18e0..66f4fb2 100755 --- a/src/inverter-bot +++ b/src/inverter-bot @@ -378,25 +378,21 @@ def on_button(update: Update, context: CallbackContext) -> None: # def monitor_charging_event_handler(event: ChargingEvent, **kwargs) -> None: - key = None args = [] - - match event: - case ChargingEvent.AC_CHARGING_STARTED: - key = 'started' - case ChargingEvent.AC_CHARGING_FINISHED: - key = 'finished' - case ChargingEvent.AC_DISCONNECTED: - key = 'disconnected' - case ChargingEvent.AC_NOT_CHARGING: - key = 'not_charging' - case ChargingEvent.AC_CURRENT_CHANGED: - key = 'current_changed' - args.append(kwargs['current']) - case ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR: - key = 'na_solar' - - if key is None: + if event == ChargingEvent.AC_CHARGING_STARTED: + key = 'started' + elif event == ChargingEvent.AC_CHARGING_FINISHED: + key = 'finished' + elif event == ChargingEvent.AC_DISCONNECTED: + key = 'disconnected' + elif event == ChargingEvent.AC_NOT_CHARGING: + key = 'not_charging' + elif event == ChargingEvent.AC_CURRENT_CHANGED: + key = 'current_changed' + args.append(kwargs['current']) + elif event == ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR: + key = 'na_solar' + else: logger.error('unknown charging event:', event) return @@ -404,16 +400,15 @@ def monitor_charging_event_handler(event: ChargingEvent, **kwargs) -> None: def monitor_battery_event_handler(state: BatteryState, v: float, load_watts: int) -> None: - match state: - case BatteryState.NORMAL: - label = '✅ Normal' - case BatteryState.LOW: - label = '⚠️ Low' - case BatteryState.CRITICAL: - label = '‼️ Critical' - case _: - logger.error('unknown battery state:', state) - return + if state == BatteryState.NORMAL: + label = '✅ Normal' + elif state == BatteryState.LOW: + label = '⚠️ Low' + elif state == BatteryState.CRITICAL: + label = '‼️ Critical' + else: + logger.error('unknown battery state:', state) + return notify_all(_('battery_level_changed', label, v, load_watts)) diff --git a/src/monitor.py b/src/monitor.py index ddbbdd7..1efe88a 100644 --- a/src/monitor.py +++ b/src/monitor.py @@ -40,15 +40,14 @@ class BatteryState(Enum): def _pd_from_string(pd: str) -> BatteryPowerDirection: - match pd: - case 'Discharge': - return BatteryPowerDirection.DISCHARGING - case 'Charge': - return BatteryPowerDirection.CHARGING - case 'Do nothing': - return BatteryPowerDirection.DO_NOTHING - case _: - raise ValueError(f'invalid power direction: {pd}') + if pd == 'Discharge': + return BatteryPowerDirection.DISCHARGING + elif pd == 'Charge': + return BatteryPowerDirection.CHARGING + elif pd == 'Do nothing': + return BatteryPowerDirection.DO_NOTHING + else: + raise ValueError(f'invalid power direction: {pd}') class InverterMonitor(Thread): @@ -140,47 +139,46 @@ class InverterMonitor(Thread): sleep(2) def ac_charging_program(self, ac: bool, solar: bool, v: float, pd: BatteryPowerDirection): - match self.charging_state: - case ChargingState.NOT_CHARGING: - if ac and solar: - self.charging_state = ChargingState.AC_BUT_SOLAR - self.charging_event_handler(ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR) - _logger.info('entering AC_BUT_SOLAR state') - elif ac: - self.ac_charging_start(pd) - - case ChargingState.AC_BUT_SOLAR: - if not ac: - self.ac_charging_stop(ChargingState.NOT_CHARGING) - elif not solar: - self.ac_charging_start(pd) - - case ChargingState.AC_OK | ChargingState.AC_WAITING: - if not ac: - self.ac_charging_stop(ChargingState.NOT_CHARGING) - return - - if solar: - self.charging_state = ChargingState.AC_BUT_SOLAR - self.charging_event_handler(ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR) - _logger.info('solar power connected during charging, entering AC_BUT_SOLAR state') - - state = ChargingState.AC_OK if pd == BatteryPowerDirection.CHARGING else ChargingState.AC_WAITING - if state != self.charging_state: - self.charging_state = state - - evt = ChargingEvent.AC_CHARGING_STARTED if state == ChargingState.AC_OK else ChargingEvent.AC_NOT_CHARGING - self.charging_event_handler(evt) - - # if currently charging, monitor battery voltage dynamics here - if self.active_current is not None: - upper_bound = 56.6 if self.active_current > 10 else 54 - if v >= upper_bound: - self.ac_charging_next_current() - - case ChargingState.AC_DONE: - if not ac: - self.ac_charging_stop(ChargingState.NOT_CHARGING) + if self.charging_state == ChargingState.NOT_CHARGING: + if ac and solar: + self.charging_state = ChargingState.AC_BUT_SOLAR + self.charging_event_handler(ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR) + _logger.info('entering AC_BUT_SOLAR state') + elif ac: + self.ac_charging_start(pd) + + elif self.charging_state == ChargingState.AC_BUT_SOLAR: + if not ac: + self.ac_charging_stop(ChargingState.NOT_CHARGING) + elif not solar: + self.ac_charging_start(pd) + + elif self.charging_state in (ChargingState.AC_OK, ChargingState.AC_WAITING): + if not ac: + self.ac_charging_stop(ChargingState.NOT_CHARGING) + return + + if solar: + self.charging_state = ChargingState.AC_BUT_SOLAR + self.charging_event_handler(ChargingEvent.AC_CHARGING_UNAVAILABLE_BECAUSE_SOLAR) + _logger.info('solar power connected during charging, entering AC_BUT_SOLAR state') + + state = ChargingState.AC_OK if pd == BatteryPowerDirection.CHARGING else ChargingState.AC_WAITING + if state != self.charging_state: + self.charging_state = state + + evt = ChargingEvent.AC_CHARGING_STARTED if state == ChargingState.AC_OK else ChargingEvent.AC_NOT_CHARGING + self.charging_event_handler(evt) + + # if currently charging, monitor battery voltage dynamics here + if self.active_current is not None: + upper_bound = 56.6 if self.active_current > 10 else 54 + if v >= upper_bound: + self.ac_charging_next_current() + + elif self.charging_state == ChargingState.AC_DONE: + if not ac: + self.ac_charging_stop(ChargingState.NOT_CHARGING) def ac_charging_start(self, pd: BatteryPowerDirection): if pd == BatteryPowerDirection.CHARGING: @@ -204,15 +202,12 @@ class InverterMonitor(Thread): def ac_charging_stop(self, reason: ChargingState): self.charging_state = reason - match reason: - case ChargingState.AC_DONE: - event = ChargingEvent.AC_CHARGING_FINISHED - - case ChargingState.NOT_CHARGING: - event = ChargingEvent.AC_DISCONNECTED - - case _: - raise ValueError(f'ac_charging_stop: unexpected reason {reason}') + if reason == ChargingState.AC_DONE: + event = ChargingEvent.AC_CHARGING_FINISHED + elif reason == ChargingState.NOT_CHARGING: + event = ChargingEvent.AC_DISCONNECTED + else: + raise ValueError(f'ac_charging_stop: unexpected reason {reason}') _logger.info(f'charging is finished, entering {reason} state') self.charging_event_handler(event) |