handled multiple race conditions
This commit is contained in:
49
main.py
49
main.py
@@ -46,24 +46,46 @@ def main():
|
|||||||
with serial.Serial(device_name, 115200, timeout=1) as ser:
|
with serial.Serial(device_name, 115200, timeout=1) as ser:
|
||||||
shutdown_triggered = False
|
shutdown_triggered = False
|
||||||
inverter_online = True
|
inverter_online = True
|
||||||
|
last_online = time.monotonic()
|
||||||
|
receiving_data = True
|
||||||
|
last_logged = -1
|
||||||
|
try:
|
||||||
while running:
|
while running:
|
||||||
line = ser.readline().decode(errors="ignore").strip()
|
line = ser.readline().decode(errors="ignore").strip()
|
||||||
if line == "":
|
|
||||||
logger.warning("No serial data")
|
if line != "" and not receiving_data:
|
||||||
continue
|
receiving_data = True
|
||||||
elif line == "0":
|
logger.info("Serial data restored")
|
||||||
logger.debug("Inverter Online")
|
|
||||||
|
if line == "0":
|
||||||
|
if not inverter_online:
|
||||||
|
logger.info("Inverter restored")
|
||||||
inverter_online = True
|
inverter_online = True
|
||||||
elif not inverter_online:
|
last_online = time.monotonic()
|
||||||
if time.time() - last_online > shutdown_timer:
|
|
||||||
shutdown_triggered = True
|
elif line == "1":
|
||||||
break
|
|
||||||
else:
|
|
||||||
if inverter_online:
|
if inverter_online:
|
||||||
inverter_online = False
|
inverter_online = False
|
||||||
last_online = time.time()
|
logger.info("Running on UPS reserve")
|
||||||
logger.info(f"Running on UPS reserve, offline for {time.time()-last_online}s")
|
|
||||||
|
|
||||||
|
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:
|
if shutdown_triggered:
|
||||||
logger.info(f"Inverter offline for {shutdown_timer} seconds")
|
logger.info(f"Inverter offline for {shutdown_timer} seconds")
|
||||||
try:
|
try:
|
||||||
@@ -81,6 +103,9 @@ def main():
|
|||||||
os.system("shutdown now")
|
os.system("shutdown now")
|
||||||
else:
|
else:
|
||||||
logger.info("Exited cleanly (service stop)")
|
logger.info("Exited cleanly (service stop)")
|
||||||
|
except serial.SerialException as e:
|
||||||
|
logger.error(f"Serial device error: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
Reference in New Issue
Block a user