From 319da36b78fb1240c7368b514827163f6f68b266 Mon Sep 17 00:00:00 2001 From: Mihit Date: Fri, 17 Apr 2026 02:34:53 +0530 Subject: [PATCH] cleaner handling of SIGINT --- main.py | 52 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 00386c1..ec63ec5 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ import requests import os from dotenv import load_dotenv import logging +import signal load_dotenv() @@ -21,34 +22,59 @@ ch.setLevel(loglevel) formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s') formatter.default_msec_format = None ch.setFormatter(formatter) -logger.addHandler(ch) +if not logger.handlers: + logger.addHandler(ch) ########################################## ntfy_token = os.environ['NTFY_Token'] device_name = os.environ['device_name'] shutdown_timer = int(os.environ['shutdown_timer']) -try: +running = True + +def handle_shutdown(signum, frame): + global running + logger.info("Received shutdown signal, exiting...") + running = False + +signal.signal(signal.SIGTERM, handle_shutdown) +signal.signal(signal.SIGINT, handle_shutdown) + + +def main(): with serial.Serial(device_name, 115200, timeout=1) as ser: inverter_offline_counter = 0 - while True: - if ser.readline().decode().strip() == "0": + shutdown_triggered = False + while running: + line = ser.readline().decode(errors="ignore").strip() + + if line == "0": logger.debug("Inverter Online") inverter_offline_counter = 0 elif inverter_offline_counter >= shutdown_timer: + shutdown_triggered = True break else: inverter_offline_counter += 1 logger.info(f"Running on UPS reserve, offline for {inverter_offline_counter}s") - logger.info(f"Inverter offline for {shutdown_timer} seconds") - requests.post("https://ntfy.fieryeagle.org/Internet-Alerts", - data="Inverter offline, shutting down".encode(encoding='utf-8'), + + 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}" - } - ) - os.system("shutdown now") -except KeyboardInterrupt: - logger.info("Exiting gracefully") - exit() \ No newline at end of file + }, + 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 __name__ == "__main__": + main() \ No newline at end of file