diff --git a/main.py b/main.py index d4cebf5..012ffdc 100644 --- a/main.py +++ b/main.py @@ -46,41 +46,66 @@ def main(): with serial.Serial(device_name, 115200, timeout=1) as ser: shutdown_triggered = False inverter_online = True - while running: - line = ser.readline().decode(errors="ignore").strip() - if line == "": - logger.warning("No serial data") - continue - elif line == "0": - logger.debug("Inverter Online") - inverter_online = True - elif not inverter_online: - if time.time() - last_online > shutdown_timer: - shutdown_triggered = True - break - else: - if inverter_online: - inverter_online = False - last_online = time.time() - logger.info(f"Running on UPS reserve, offline for {time.time()-last_online}s") + last_online = time.monotonic() + receiving_data = True + last_logged = -1 + try: + while running: + line = ser.readline().decode(errors="ignore").strip() - if shutdown_triggered: - logger.info(f"Inverter offline for {shutdown_timer} seconds") - try: - requests.post( - "https://ntfy.fieryeagle.org/Internet-Alerts", - data="Inverter offline, shutting down".encode("utf-8"), - headers={ - "Title": "Hydrogen running on reserve power", - "Authorization": f"Bearer {ntfy_token}" - }, - timeout=5 - ) - except Exception as e: - logger.error(f"Failed to send notification: {e}") - os.system("shutdown now") - else: - logger.info("Exited cleanly (service stop)") + if line != "" and not receiving_data: + receiving_data = True + logger.info("Serial data restored") + + if line == "0": + if not inverter_online: + logger.info("Inverter restored") + inverter_online = True + last_online = time.monotonic() + + elif line == "1": + if inverter_online: + inverter_online = False + logger.info("Running on UPS reserve") + + elif line == "": + if receiving_data: + receiving_data = False + logger.warning("No serial data") + + else: + logger.warning(f"Unexpected serial data: {line}") + + if not inverter_online: + sec = int(time.monotonic() - last_online) + + if sec % 10 == 0 and sec != last_logged: + logger.info(f"Offline for {sec}s") + last_logged = sec + + if sec >= shutdown_timer: + shutdown_triggered = True + break + if shutdown_triggered: + logger.info(f"Inverter offline for {shutdown_timer} seconds") + try: + requests.post( + "https://ntfy.fieryeagle.org/Internet-Alerts", + data="Inverter offline, shutting down".encode("utf-8"), + headers={ + "Title": "Hydrogen running on reserve power", + "Authorization": f"Bearer {ntfy_token}" + }, + timeout=5 + ) + except Exception as e: + logger.error(f"Failed to send notification: {e}") + os.system("shutdown now") + else: + logger.info("Exited cleanly (service stop)") + except serial.SerialException as e: + logger.error(f"Serial device error: {e}") + raise if __name__ == "__main__": main() \ No newline at end of file