handled multiple race conditions

This commit is contained in:
2026-04-18 22:12:07 +05:30
parent d236804b69
commit bf72a0c213

49
main.py
View File

@@ -46,24 +46,46 @@ def main():
with serial.Serial(device_name, 115200, timeout=1) as ser:
shutdown_triggered = False
inverter_online = True
last_online = time.monotonic()
receiving_data = True
last_logged = -1
try:
while running:
line = ser.readline().decode(errors="ignore").strip()
if line == "":
logger.warning("No serial data")
continue
elif line == "0":
logger.debug("Inverter Online")
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
elif not inverter_online:
if time.time() - last_online > shutdown_timer:
shutdown_triggered = True
break
else:
last_online = time.monotonic()
elif line == "1":
if inverter_online:
inverter_online = False
last_online = time.time()
logger.info(f"Running on UPS reserve, offline for {time.time()-last_online}s")
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:
@@ -81,6 +103,9 @@ def main():
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()