From 83e3131ccbfac16f00521bcacd684c2718d7b177 Mon Sep 17 00:00:00 2001 From: Ollo Date: Sun, 22 Dec 2024 20:31:59 +0100 Subject: [PATCH] Integrated Logging to /var/log/app.log --- mqttclient/fanATserial2mqtt.py | 65 +++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/mqttclient/fanATserial2mqtt.py b/mqttclient/fanATserial2mqtt.py index 08fa93f..44da183 100644 --- a/mqttclient/fanATserial2mqtt.py +++ b/mqttclient/fanATserial2mqtt.py @@ -4,6 +4,7 @@ import sys from paho.mqtt import client as mqtt_client import os import serial +import logging MAXIMUM_COMMUNICATION_FAILURE=1000 @@ -11,35 +12,57 @@ TEMPERATUR_MIN_DIFFERENCE = 2 TARGET_MIN_DIFFERENCE = 1 RPM_MIN_DIFFERENCE = 50 +COMMAND_PREFIX = "ollpe" + # MQTT Settings mqtt_server=os.environ['MQTT_SERVER'] mqtt_topic=os.environ['MQTT_TOPIC'] # SERIAL Port serial_device=os.environ['SERIAL_DEVICE'] +# Logging +try: + if (os.environ['PY_LOGGING']): + customLevel = os.environ['PY_LOGGING'].upper() +except (KeyError): + customLevel = 'WARNING' + +logging.basicConfig( + level=customLevel, + filename="/var/log/app.log", + filemode="w", + format="%(asctime)s - %(levelname)s - %(message)s" +) + +logging.debug("Start Serial connect") # Start Serial communication ser = serial.Serial(serial_device, 115200, timeout=1) # open serial port +if (ser is None): + logging.error("Cannot open device" + str(serial_device)) + sys.exit() + # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): payload = msg.payload.decode("utf-8") if ((mqtt_topic + "cmd/rpm") == msg.topic): if (ser.is_open): - command = "ollpef{:02x}".format(int(payload)) + command = COMMAND_PREFIX+"f{: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 + command = COMMAND_PREFIX+"l" + payload ser.write(command.encode('utf-8')) else: - print(msg.topic+" "+str(msg.payload)) + logging.warning(msg.topic+" "+str(msg.payload)) # Handle MQTT Commands 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)) + client.publish(mqtt_topic + "online", payload="true", qos=1, retain=True) + logging.debug("Connected: " + str(reason_code)) # Start mqtt client_id = f'python-fan-ctrl' @@ -48,12 +71,13 @@ client.on_message = on_message client.on_connect = on_connect if (not (mqtt_server)): - print("MQTT_SERVER is not set") + logging.error("MQTT_SERVER is not set") if (not (mqtt_topic)): - print("MQTT_TOPIC is not set") + logging.error("MQTT_TOPIC is not set") # Start MQTT Client +client.will_set(mqtt_topic + "online", payload="false", qos=1, retain=True) client.connect(mqtt_server, 1883) client.loop_start() @@ -70,12 +94,13 @@ lastTarget = -1 # Endless Loop try: - while True: + while ((mqtt_topic is not None) and (mqtt_server is not None)): try: if (not (ser.is_open)): ser.open() continue except (serial.SerialException): + logging.error("Could not open serial connection") client.publish(mqtt_topic + "exception", "serial reopen") # check which port was really used time.sleep(3.0) @@ -88,26 +113,32 @@ try: if (SerialCommunicationFailureCounter > MAXIMUM_COMMUNICATION_FAILURE): raise serial.SerialException("device reports readiness / device disconnected " + str(MAXIMUM_COMMUNICATION_FAILURE) + " times") - if (line): + if (line) : client.publish(mqtt_topic + "exception", "") # clear exception + # activate debug code, by default + temperatur = None + percent = None + rpm = None + # convert byte array to string l = line.decode("utf-8") + if (COMMAND_PREFIX in l): + logging.debug("Skip '" + str(l) + "', found " + str(COMMAND_PREFIX)) + continue + try: # Parse the controller information # e.g. : 22.00;0%;0RPM temperatur, percent, rpm = l.split(";") except (ValueError): - # activate debug code - temperatur = None - percent = None - rpm = None + logging.debug("Unparsable '" + str(l) + "'") if ((temperatur) and (percent) and (rpm)): parseError=False try: currentTemperatur = float(temperatur) except (ValueError): - print("Temperatur Error: could not convert string to float:" + temperatur) + logging.error("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)) @@ -117,7 +148,7 @@ try: try: currentTarget = int(percent[:-4]) except (ValueError): - print("Percent Error: could not convert string to int:" + (percent[:-4])) + logging.error("Percent Error: could not convert string to int:" + (percent[:-4])) currentTarget = lastTarget if (abs(lastTarget - currentTarget) > TARGET_MIN_DIFFERENCE): @@ -133,7 +164,7 @@ try: try: currentRPM = int(rpm[:-3]) except (ValueError): - print("RPM Error: could not convert string to int:" + (rpm[:-3])) + logging.error("RPM Error: could not convert string to int:" + (rpm[:-3])) currentRPM = lastRPM if (abs(currentRPM-lastRPM) > RPM_MIN_DIFFERENCE): @@ -152,9 +183,9 @@ try: time.sleep(0.5) except (KeyboardInterrupt, SystemExit): - print("User aborted service ...") + logging.error("User aborted service ...") client.publish(mqtt_topic + "debug", "User aborted service") time.sleep(0.5) - print("service Dead") + logging.debug("service Dead") client.loop_stop()