From f954cecfc05a78e81d75632dea517d6a2742880c Mon Sep 17 00:00:00 2001 From: Ollo Date: Sat, 7 Dec 2024 16:23:36 +0100 Subject: [PATCH] LED and RPM can be controlled via Mqtt --- mqttclient/fanATserial2mqtt.py | 41 +++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/mqttclient/fanATserial2mqtt.py b/mqttclient/fanATserial2mqtt.py index c5b352f..3b4079a 100644 --- a/mqttclient/fanATserial2mqtt.py +++ b/mqttclient/fanATserial2mqtt.py @@ -17,22 +17,33 @@ mqtt_topic=os.environ['MQTT_TOPIC'] # SERIAL Port serial_device=os.environ['SERIAL_DEVICE'] -# Start mqtt -client_id = f'python-fan-ctrl' -client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2) # Start Serial communication ser = serial.Serial(serial_device, 115200, timeout=1) # open serial port # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): - print(msg.topic+" "+str(msg.payload)) + payload = msg.payload.decode("utf-8") + if ((mqtt_topic + "cmd/rpm") == msg.topic): + if (ser.is_open): + command = "ollpef{:02x}".format(int(payload)) + ser.write(command.encode('utf-8')) + else: + client.publish(mqtt_topic + "cmd/exception", "Serial Connection closed") # clear exception + elif ((mqtt_topic + "cmd/led") == msg.topic): + command = "ollpel" + payload + ser.write(command.encode('utf-8')) + else: + print(msg.topic+" "+str(msg.payload)) # Handle MQTT Commands -def on_connect(mqttc, obj, flags, reason_code, properties): +def on_connect(client, obj, flags, reason_code, properties): client.subscribe(mqtt_topic + "cmd/led") client.subscribe(mqtt_topic + "cmd/rpm") print("Connected: " + str(reason_code)) +# Start mqtt +client_id = f'python-fan-ctrl' +client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2) client.on_message = on_message client.on_connect = on_connect @@ -91,13 +102,22 @@ try: if ((temperatur) and (percent) and (rpm)): parseError=False - currentTemperatur = float(temperatur.strip()) + try: + currentTemperatur = float(temperatur) + except (ValueError): + print("Temperatur Error: could not convert string to float:" + temperatur) + currentTemperatur = lastTemperatur if (abs(currentTemperatur - lastTemperatur) > TEMPERATUR_MIN_DIFFERENCE): client.publish(mqtt_topic + "temperatur", str(currentTemperatur)) lastTemperatur = currentTemperatur if (percent.endswith('/100')): - currentTarget = int(percent[:-4]) + try: + currentTarget = int(percent[:-4]) + except (ValueError): + print("Percent Error: could not convert string to int:" + (percent[:-4])) + currentTarget = lastTarget + if (abs(lastTarget - currentTarget) > TARGET_MIN_DIFFERENCE): client.publish(mqtt_topic + "target", str(currentTarget)) lastTarget = currentTarget @@ -108,7 +128,12 @@ try: # remove new line for last element rpm = rpm.replace('\r','').replace('\n','') if (rpm.endswith('RPM')): - currentRPM = int(rpm[:-3]) + try: + currentRPM = int(rpm[:-3]) + except (ValueError): + print("RPM Error: could not convert string to int:" + (rpm[:-3])) + currentRPM = lastRPM + if (abs(currentRPM-lastRPM) > RPM_MIN_DIFFERENCE): client.publish(mqtt_topic + "rpm", str(currentRPM)) lastRPM = currentRPM