cleaner handling of SIGINT
This commit is contained in:
46
main.py
46
main.py
@@ -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,34 +22,59 @@ 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)
|
||||||
logger.addHandler(ch)
|
if not logger.handlers:
|
||||||
|
logger.addHandler(ch)
|
||||||
##########################################
|
##########################################
|
||||||
|
|
||||||
ntfy_token = os.environ['NTFY_Token']
|
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()
|
||||||
Reference in New Issue
Block a user