cleaner handling of SIGINT

This commit is contained in:
2026-04-17 02:34:53 +05:30
parent ac931feb47
commit 319da36b78

44
main.py
View File

@@ -3,6 +3,7 @@ import requests
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
import logging import logging
import signal
load_dotenv() load_dotenv()
@@ -21,6 +22,7 @@ ch.setLevel(loglevel)
formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s') formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s')
formatter.default_msec_format = None formatter.default_msec_format = None
ch.setFormatter(formatter) ch.setFormatter(formatter)
if not logger.handlers:
logger.addHandler(ch) logger.addHandler(ch)
########################################## ##########################################
@@ -28,27 +30,51 @@ ntfy_token = os.environ['NTFY_Token']
device_name = os.environ['device_name'] device_name = os.environ['device_name']
shutdown_timer = int(os.environ['shutdown_timer']) 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: with serial.Serial(device_name, 115200, timeout=1) as ser:
inverter_offline_counter = 0 inverter_offline_counter = 0
while True: shutdown_triggered = False
if ser.readline().decode().strip() == "0": while running:
line = ser.readline().decode(errors="ignore").strip()
if line == "0":
logger.debug("Inverter Online") logger.debug("Inverter Online")
inverter_offline_counter = 0 inverter_offline_counter = 0
elif inverter_offline_counter >= shutdown_timer: elif inverter_offline_counter >= shutdown_timer:
shutdown_triggered = True
break break
else: else:
inverter_offline_counter += 1 inverter_offline_counter += 1
logger.info(f"Running on UPS reserve, offline for {inverter_offline_counter}s") logger.info(f"Running on UPS reserve, offline for {inverter_offline_counter}s")
if shutdown_triggered:
logger.info(f"Inverter offline for {shutdown_timer} seconds") logger.info(f"Inverter offline for {shutdown_timer} seconds")
requests.post("https://ntfy.fieryeagle.org/Internet-Alerts", try:
data="Inverter offline, shutting down".encode(encoding='utf-8'), requests.post(
"https://ntfy.fieryeagle.org/Internet-Alerts",
data="Inverter offline, shutting down".encode("utf-8"),
headers={ headers={
"Title": "Hydrogen running on reserve power", "Title": "Hydrogen running on reserve power",
"Authorization": f"Bearer {ntfy_token}" "Authorization": f"Bearer {ntfy_token}"
} },
timeout=5
) )
except Exception as e:
logger.error(f"Failed to send notification: {e}")
os.system("shutdown now") os.system("shutdown now")
except KeyboardInterrupt: else:
logger.info("Exiting gracefully") logger.info("Exited cleanly (service stop)")
exit()
if __name__ == "__main__":
main()