Compare commits
2 Commits
7bfbde6d2d
...
bf72a0c213
| Author | SHA1 | Date | |
|---|---|---|---|
| bf72a0c213 | |||
| d236804b69 |
93
main.py
93
main.py
@@ -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()
|
||||
Reference in New Issue
Block a user