It's working yet again

This commit is contained in:
YuruC3 2025-07-02 14:53:15 +02:00
parent b45180d50d
commit 7ce3f5efc2
5 changed files with 43 additions and 42 deletions

View File

@ -1,9 +1,9 @@
FROM alpine:latest FROM alpine:latest
# https://docs.docker.com/reference/dockerfile/#environment-replacement # https://docs.docker.com/reference/dockerfile/#environment-replacement
ENV MD1200BAUD=38400 # ENV MD1200BAUD=38400
ENV SERIALADAPTER=/dev/ttyUSB0 # ENV SERIALADAPTER=/dev/ttyUSB0
ENV EPPYSLEEPY=300 # ENV EPPYSLEEPY=300
# VOLUME [""] # VOLUME [""]

View File

@ -3,14 +3,14 @@
services: services:
mdfanchanger: mdfanchanger:
container_name: MD_Fan_Changer container_name: MD_Fan_Changer
# build: ./ image: yuruc3/md1200_fan_controll:v1.2.1
# image: dm1200fanchanger:V1
image: yuruc3/md1200_fan_controll:v1
environment: environment:
- baud_rate=${baud_rate:-38400} # - MD1200BAUD=
- serial_adapter=${serial_adapter:-"/dev/ttyUSB0"} - SERIALADAPTER=/dev/ttyUSB0
- wait_time=${wait_time:-1} - TEMP_FACTOR=17
env_file: "md1200.env" # - EPPYSLEEPY=
# - LOW_FAN_TRSHD=
# - HIGH_FAN_TRSHD=
devices: devices:
- /dev/ttyUSB0:/dev/ttyUSB0 - /dev/ttyUSB0:/dev/ttyUSB0
restart: unless-stopped restart: unless-stopped

View File

@ -1,23 +1,25 @@
import serial, time, os import serial, time, os
# CONST # setting consts that can be customized
if os.environ["MD1200BAUD"]:
MD1200BAUD = int(os.environ["MD1200BAUD"])
else:
MD1200BAUD = 38400
if os.environ["SERIALADAPTER"]: # baud rate. Prob not needed as 38400 is standard
SERIALADAPTER = os.environ["SERIALADAPTER"] MD1200BAUD = int(os.getenv("MD1200BAUD", 38400))
else: # used if you want to run it on multiple JBODs
SERIALADAPTER = "/dev/ttyUSB0" SERIALADAPTER = os.getenv("SERIALADAPTER", "/dev/ttyUSB0")
# Factor that defines how aggressive the temperature curve is
TEMP_FACTOR = int(os.getenv("TEMP_FACTOR", 19))
# 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))
LOW_FAN_TRSHD = int(os.getenv("LOW_FAN_TRSHD", 21))
HIGH_FAN_TRSHD = int(os.getenv("HIGH_FAN_TRSHD", 40))
GETTMPCMND = os.getenv("GETTMPCMND", "_temp_rd")
SETFANCMND = os.getenv("SETFANCMND", "set_speed")
DEFOUTPRCNTG = int(os.getenv("DEFOUTPRCNTG", 24))
GETTEMP = "_temp_rd"
SETFANPRCNT = "set_speed"
if os.environ["EPPYSLEEPY"]:
EPPYSLEEPY = int(os.environ["EPPYSLEEPY"])
else:
EPPYSLEEPY = 1 # 1 second
# init # init
MDserial = serial.Serial( MDserial = serial.Serial(
@ -69,30 +71,23 @@ def getTemp(inpMDreturning):
def setSpeed(inSpeeDict: dict): def setSpeed(inSpeeDict: dict):
bpavrg = 0 bpavrg = 0
# Some safe fan speedvalue
defoutprntg = 27
# default # default
outfanprcntg = 0 outfanprcntg = 0
# Decide on fan speeds
LOW_FAN_TRSHD = 21
HIGH_FAN_TRSHD = 40
TEMP_FACTOR = 19
# get backplanbe average # get backplanbe average
if inSpeeDict["bp1"] and inSpeeDict["bp2"]: if inSpeeDict["bp1"] and inSpeeDict["bp2"]:
bpavrg = (inSpeeDict["bp1"] + inSpeeDict["bp2"]) /2 bpavrg = (inSpeeDict["bp1"] + inSpeeDict["bp2"]) /2
outfanprcntg = int((bpavrg / (HIGH_FAN_TRSHD - LOW_FAN_TRSHD)) * TEMP_FACTOR) outfanprcntg = int((bpavrg / (HIGH_FAN_TRSHD - LOW_FAN_TRSHD)) * TEMP_FACTOR)
os.system(f"echo setting {outfanprcntg}%")
# Set fan speed # Set fan speed
if outfanprcntg >= 20: if outfanprcntg >= 20:
MDserial.write(("set_speed " + str(outfanprcntg) + " \n\r").encode()) MDserial.write((f"{SETFANCMND} {str(outfanprcntg)} \n\r").encode())
print(f"setting {outfanprcntg}%") print(f"setting {outfanprcntg}%")
return 0 return 0
else: else:
# Set default value # Set default value
MDserial.write(("set_speed " + str(defoutprntg) + " \n\r").encode()) MDserial.write((f"{SETFANCMND} {str(DEFOUTPRCNTG)} \n\r").encode())
return 1 return 1
# If something goes super wrong # If something goes super wrong
@ -112,8 +107,10 @@ def setSpeed(inSpeeDict: dict):
while True: while True:
# https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial # https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial
MDserial.write("_temp_rd\n\r".encode())
time.sleep(1) # 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() MDreturning = MDserial.read_until(" >").decode()
MDtempDict = getTemp(MDreturning) MDtempDict = getTemp(MDreturning)
@ -121,12 +118,13 @@ while True:
# good # good
if setSpeedrcode == 0: if setSpeedrcode == 0:
continue
# print("Were mint") # print("Were mint")
time.sleep(EPPYSLEEPY) # time.sleep(EPPYSLEEPY)
# not good # not good
elif setSpeedrcode == 1: elif setSpeedrcode == 1:
print("Ambigous temperature readings.\nFalling back to safe values.") print("Ambigous temperature readings.\nFalling back to safe values.")
time.sleep(EPPYSLEEPY) # time.sleep(EPPYSLEEPY)
# very not good # very not good
elif setSpeedrcode == -1: elif setSpeedrcode == -1:
print("o nyo") print("o nyo")

View File

@ -1,3 +0,0 @@
baud_rate=
serial_adapter=
wait_time=

View File

@ -0,0 +1,6 @@
baud_rate=
serial_adapter=
wait_time=
temp_factor=
lower_treshold=
upper_treshold=