diff --git a/mqttclient/fanATserial2mqtt.py b/mqttclient/fanATserial2mqtt.py index 82f600e..c5b352f 100644 --- a/mqttclient/fanATserial2mqtt.py +++ b/mqttclient/fanATserial2mqtt.py @@ -7,23 +7,27 @@ import serial MAXIMUM_COMMUNICATION_FAILURE=100 +TEMPERATUR_MIN_DIFFERENCE = 2 +TARGET_MIN_DIFFERENCE = 1 +RPM_MIN_DIFFERENCE = 50 + # MQTT Settings mqtt_server=os.environ['MQTT_SERVER'] 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)) - -# Start mqtt -client_id = f'python-fan-ctrl' -client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2) - - +# Handle MQTT Commands def on_connect(mqttc, obj, flags, reason_code, properties): client.subscribe(mqtt_topic + "cmd/led") client.subscribe(mqtt_topic + "cmd/rpm") @@ -42,15 +46,18 @@ if (not (mqtt_topic)): client.connect(mqtt_server, 1883) client.loop_start() -# Start Serial communication -ser = serial.Serial(serial_device, 115200, timeout=1) # open serial port client.publish(mqtt_topic + "device", ser.name) # check which port was really used SerialCommunicationFailureCounter=0 +# store last published value +lastTemperatur = -1 +lastRPM = -1 +lastTarget = -1 + # Endless Loop -while True: - try: +try: + while True: try: if (not (ser.is_open)): ser.open() @@ -84,10 +91,16 @@ while True: if ((temperatur) and (percent) and (rpm)): parseError=False - temperatur = temperatur.strip() - client.publish(mqtt_topic + "temperatur", str(temperatur)) + currentTemperatur = float(temperatur.strip()) + if (abs(currentTemperatur - lastTemperatur) > TEMPERATUR_MIN_DIFFERENCE): + client.publish(mqtt_topic + "temperatur", str(currentTemperatur)) + lastTemperatur = currentTemperatur + if (percent.endswith('/100')): - client.publish(mqtt_topic + "target", str(percent[:-4])) + currentTarget = int(percent[:-4]) + if (abs(lastTarget - currentTarget) > TARGET_MIN_DIFFERENCE): + client.publish(mqtt_topic + "target", str(currentTarget)) + lastTarget = currentTarget else: client.publish(mqtt_topic + "debug", "target%% invalid:" + str(percent)) parseError=True @@ -95,7 +108,10 @@ while True: # remove new line for last element rpm = rpm.replace('\r','').replace('\n','') if (rpm.endswith('RPM')): - client.publish(mqtt_topic + "rpm", str(rpm[:-3])) + currentRPM = int(rpm[:-3]) + if (abs(currentRPM-lastRPM) > RPM_MIN_DIFFERENCE): + client.publish(mqtt_topic + "rpm", str(currentRPM)) + lastRPM = currentRPM else: client.publish(mqtt_topic + "debug", "RPM invalid:" + str(rpm)) parseError=True @@ -108,9 +124,10 @@ while True: else: time.sleep(0.2) - except (KeyboardInterrupt, SystemExit): - client.publish(mqtt_topic + "debug", "User aborted service") - time.sleep(0.5) - print("User aborted service") +except (KeyboardInterrupt, SystemExit): + print("User aborted service ...") + client.publish(mqtt_topic + "debug", "User aborted service") + time.sleep(0.5) + print("service Dead") client.loop_stop()