Compare commits

...

2 Commits

Author SHA1 Message Date
bf72a0c213 handled multiple race conditions 2026-04-18 22:12:07 +05:30
d236804b69 handled offline time with timer instead of loop counts 2026-04-18 21:47:00 +05:30

93
main.py
View File

@@ -4,6 +4,7 @@ import os
from dotenv import load_dotenv
import logging
import signal
import time
load_dotenv()
@@ -43,40 +44,68 @@ signal.signal(signal.SIGINT, handle_shutdown)
def main():
with serial.Serial(device_name, 115200, timeout=1) as ser:
inverter_offline_counter = 0
shutdown_triggered = False
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_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")
inverter_online = True
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()