From 627cc9bc24168f39eba8825dde43cb5709d40c84 Mon Sep 17 00:00:00 2001 From: YuruC3 Date: Wed, 2 Jul 2025 21:25:51 +0200 Subject: [PATCH] Fixed main docker image so that it actually works --- PC_CONTROL_CODE/docker/docker-compose.yml | 3 +- PC_CONTROL_CODE/docker/mainDocker.py | 124 ++++++++++++------ .../docker/{md1200.env.old => md1200.env} | 0 3 files changed, 89 insertions(+), 38 deletions(-) rename PC_CONTROL_CODE/docker/{md1200.env.old => md1200.env} (100%) diff --git a/PC_CONTROL_CODE/docker/docker-compose.yml b/PC_CONTROL_CODE/docker/docker-compose.yml index b162c97..2a6bcd6 100644 --- a/PC_CONTROL_CODE/docker/docker-compose.yml +++ b/PC_CONTROL_CODE/docker/docker-compose.yml @@ -8,7 +8,8 @@ services: # - MD1200BAUD= - SERIALADAPTER=/dev/ttyUSB0 - TEMP_FACTOR=17 - # - EPPYSLEEPY= + - EPPYSLEEPY=0.25 + - MDSERIALTIMEOUT=0.75 # - LOW_FAN_TRSHD= # - HIGH_FAN_TRSHD= devices: diff --git a/PC_CONTROL_CODE/docker/mainDocker.py b/PC_CONTROL_CODE/docker/mainDocker.py index 6eb40eb..73a0fde 100644 --- a/PC_CONTROL_CODE/docker/mainDocker.py +++ b/PC_CONTROL_CODE/docker/mainDocker.py @@ -7,9 +7,9 @@ MD1200BAUD = int(os.getenv("MD1200BAUD", 38400)) # used if you want to run it on multiple JBODs SERIALADAPTER = os.getenv("SERIALADAPTER", "/dev/ttyUSB0") # Factor that defines how aggressive the temperature curve is -TEMP_FACTOR = int(os.getenv("TEMP_FACTOR", 19)) +TEMP_FACTOR = int(os.getenv("TEMP_FACTOR", 16)) # time between sending command to get temp and storing it. It's there to allow JBOD to answer -EPPYSLEEPY = float(os.getenv("EPPYSLEEPY", 0.25)) +EPPYSLEEPY = float(os.getenv("EPPYSLEEPY", 1)) LOW_FAN_TRSHD = int(os.getenv("LOW_FAN_TRSHD", 21)) HIGH_FAN_TRSHD = int(os.getenv("HIGH_FAN_TRSHD", 40)) @@ -19,7 +19,11 @@ SETFANCMND = os.getenv("SETFANCMND", "set_speed") DEFOUTPRCNTG = int(os.getenv("DEFOUTPRCNTG", 24)) +MDSERIALTIMEOUT = float(os.getenv("MDSERIALTIMEOUT", 1)) +TEMPREADINTERVAL = int(os.getenv("TEMPREADINTERVAL", 15)) + +GETTEMPTIMESLEEP = int(os.getenv("GETTEMPTIMESLEEP", 1)) # init MDserial = serial.Serial( @@ -28,18 +32,25 @@ MDserial = serial.Serial( parity=serial.PARITY_NONE,\ stopbits=serial.STOPBITS_ONE,\ bytesize=serial.EIGHTBITS,\ - timeout=1) + timeout=MDSERIALTIMEOUT) + +lastTempReading = time.time() +MDtempDict = {} +def getTemp(): + + MDserial.write(f"{GETTMPCMND}\n\r".encode()) + time.sleep(GETTEMPTIMESLEEP) + MDreturning = MDserial.read_until(" >").decode(errors="ignore") -def getTemp(inpMDreturning): MDict = {} # Sanitise output - MDsanit = inpMDreturning.splitlines() + MDsanit = MDreturning.splitlines() #if there is smth do smth - if inpMDreturning: + if MDreturning: for line in MDsanit: @@ -61,10 +72,27 @@ def getTemp(inpMDreturning): MDict["exp0"] = int(line[12:14]) case "EXP1": MDict["exp1"] = int(line[12:14]) - case "AVG": - MDict["avg"] = int(line[12:14]) + # case "AVG": + # MDict["avg"] = int(line[12:14]) + # MDict["avg"] = int(line.strip().split("=")[1].strip().replace("c", "")) + # try: + # # Extract number from e.g. ' AVG = 40c' + # temp = int(line.strip().split("=")[1].strip().replace("c", "")) + # MDict["avg"] = temp + # except Exception as e: + # # print(f"[WARN] Failed to parse AVG line: {line} ({e})", flush=True) + # pass case _: - continue + # try to catch the AVG line like: " AVG = 40c" + stripped = line.strip() + if stripped.startswith("AVG"): + try: + temp = int(stripped.split("=")[1].strip().replace("c", "")) + MDict["avg"] = temp + except Exception as e: + print(f"Could not parse AVG line: {line} ({e})", flush=True) + continue + # continue return MDict @@ -75,15 +103,15 @@ def setSpeed(inSpeeDict: dict): outfanprcntg = 0 # get backplanbe average - if inSpeeDict["bp1"] and inSpeeDict["bp2"]: + if "bp1" in inSpeeDict and "bp2" in inSpeeDict: bpavrg = (inSpeeDict["bp1"] + inSpeeDict["bp2"]) /2 outfanprcntg = int((bpavrg / (HIGH_FAN_TRSHD - LOW_FAN_TRSHD)) * TEMP_FACTOR) - os.system(f"echo setting {outfanprcntg}%") + # os.system(f"echo setting {outfanprcntg}%") # Set fan speed if outfanprcntg >= 20: MDserial.write((f"{SETFANCMND} {str(outfanprcntg)} \n\r").encode()) - print(f"setting {outfanprcntg}%") + print(f"setting {outfanprcntg}%", flush=True) return 0 else: # Set default value @@ -105,35 +133,57 @@ def setSpeed(inSpeeDict: dict): # # MDserial.open() # print("Port allready opened.\nTry closing it first") -while True: - # https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial +# Init +MDtempDict = getTemp() +lastTempReading = time.time() +try: - # get temperature data, wait for MD1200 to answer and store - MDserial.write(f"{GETTMPCMND}\n\r".encode()) - time.sleep(EPPYSLEEPY) - MDreturning = MDserial.read_until(" >").decode() + while True: + # https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial - MDtempDict = getTemp(MDreturning) - setSpeedrcode = setSpeed(MDtempDict) + # get temperature data, wait for MD1200 to answer and store - # good - if setSpeedrcode == 0: - continue - # print("Were mint") - # time.sleep(EPPYSLEEPY) - # not good - elif setSpeedrcode == 1: - print("Ambigous temperature readings.\nFalling back to safe values.") - # time.sleep(EPPYSLEEPY) - # very not good - elif setSpeedrcode == -1: - print("o nyo") - exit() - # very very very not good - else: - print("idk") - exit() + currentTime = time.time() + if currentTime - lastTempReading >= TEMPREADINTERVAL: + MDtempDict = getTemp() + lastTempReading = currentTime + + if MDtempDict: + setSpeedrcode = setSpeed(MDtempDict) + + # good + if setSpeedrcode == 0: + pass + # print("Were mint", flush=True) + # time.sleep(EPPYSLEEPY) + # not good + elif setSpeedrcode == 1: + print("Ambigous temperature readings.\nFalling back to safe values.", flush=True) + # time.sleep(EPPYSLEEPY) + # very not good + elif setSpeedrcode == -1: + print("o nyo", flush=True) + exit() + # very very very not good + else: + print("idk", flush=True) + exit() + else: + print(f"temperature not yet pulled.\nFalling back do default fan speed", flush=True) + # os.system(f"echo temperature not yet pulled.\nFalling back do default fan speed") + MDserial.write((f"{SETFANCMND} {str(DEFOUTPRCNTG)} \n\r").encode()) + + time.sleep(EPPYSLEEPY) + +except KeyboardInterrupt: + print("\n[INFO] KeyboardInterrupt detected. Exiting gracefully...") + MDserial.close() + exit() + +finally: + print("closing port") + MDserial.close() print("closing port") MDserial.close() diff --git a/PC_CONTROL_CODE/docker/md1200.env.old b/PC_CONTROL_CODE/docker/md1200.env similarity index 100% rename from PC_CONTROL_CODE/docker/md1200.env.old rename to PC_CONTROL_CODE/docker/md1200.env