The MQTT system sends byte IOs as real byte to the broker

Most IOs are `bool()` or `int()`. In some cases users replaced some IO values
as raw bytes. The MQTT system now also sends these as raw bytes.
This commit is contained in:
2021-09-09 09:16:48 +02:00
parent 3fe69b54cc
commit d8191959c5

View File

@@ -37,17 +37,11 @@ class MqttServer(Thread):
if not isinstance(basetopic, str):
raise ValueError("parameter topic must be <class 'str'>")
if not (isinstance(sendinterval, int) and sendinterval >= 0):
raise ValueError(
"parameter sendinterval must be <class 'int'> and >= 0"
)
raise ValueError("parameter sendinterval must be <class 'int'> and >= 0")
if not (isinstance(broker_address, str) and broker_address != ""):
raise ValueError(
"parameter broker_address must be <class 'str'> and not empty"
)
raise ValueError("parameter broker_address must be <class 'str'> and not empty")
if not (isinstance(port, int) and 0 < port < 65535):
raise ValueError(
"parameter sendinterval must be <class 'int'> and 1 - 65535"
)
raise ValueError("parameter sendinterval must be <class 'int'> and 1 - 65535")
if not isinstance(tls_set, bool):
raise ValueError("parameter tls_set must be <class 'bool'>")
if not isinstance(username, str):
@@ -157,17 +151,11 @@ class MqttServer(Thread):
shared_procimg=True,
)
self._rpi.debug = -1
proginit.logger.warning(
"replace_ios_file not loadable for MQTT - using "
"defaults now | {0}".format(e)
)
proginit.logger.warning("replace_ios_file not loadable for MQTT - using defaults now | {0}".format(e))
except Exception as e:
self._rpi = None
proginit.logger.error(
"piCtory configuration not loadable for MQTT | "
"{0}".format(e)
)
proginit.logger.error("piCtory configuration not loadable for MQTT | {0}".format(e))
raise e
# Exportierte IOs laden
@@ -233,10 +221,7 @@ class MqttServer(Thread):
proginit.logger.debug("enter MqttServer._on_disconnect()")
if rc != 0:
proginit.logger.warning(
"unexpected disconnection from mqtt broker - "
"will try to reconnect"
)
proginit.logger.warning("unexpected disconnection from mqtt broker - will try to reconnect")
proginit.logger.debug("leave MqttServer._on_disconnect()")
@@ -253,9 +238,7 @@ class MqttServer(Thread):
else:
lst_topic = msg.topic.split("/")
if len(lst_topic) < 2:
proginit.logger.info(
"wrong topic format - need ./get/ioname or ./set/ioname"
)
proginit.logger.info("wrong topic format - need ./get/ioname or ./set/ioname")
return
# Aktion und IO auswerten
@@ -276,17 +259,12 @@ class MqttServer(Thread):
io = self._rpi.io[ioname]
io_needbytes = type(io.value) == bytes
except Exception:
proginit.logger.error(
"can not find io '{0}' for MQTT".format(ioname)
)
proginit.logger.error("can not find io '{0}' for MQTT".format(ioname))
return
# Aktion verarbeiten
if not io.export:
proginit.logger.error(
"io '{0}' is not marked as export in piCtory for MQTT use"
"".format(ioname)
)
proginit.logger.error("io '{0}' is not marked as export in piCtory for MQTT use".format(ioname))
elif ioget:
# Werte laden, wenn nicht autorefresh
@@ -297,9 +275,7 @@ class MqttServer(Thread):
self._evt_io(io.name, io.value, requested=True)
elif ioset and io.type != revpimodio2.OUT:
proginit.logger.error(
"can not write to inputs with MQTT"
)
proginit.logger.error("can not write to inputs with MQTT")
elif ioset:
# Convert MQTT Payload to valid Output-Value
@@ -313,10 +289,7 @@ class MqttServer(Thread):
try:
value = value.to_bytes(io.length, io.byteorder)
except OverflowError:
proginit.logger.error(
"can not convert value '{0}' to fitting bytes"
"".format(value)
)
proginit.logger.error("can not convert value '{0}' to fitting bytes".format(value))
return
elif value == "false" and not io_needbytes:
@@ -324,20 +297,14 @@ class MqttServer(Thread):
elif value == "true" and not io_needbytes:
value = 1
else:
proginit.logger.error(
"can not convert value '{0}' for output '{1}'"
"".format(value, ioname)
)
proginit.logger.error("can not convert value '{0}' for output '{1}'".format(value, ioname))
return
# Write Value to RevPi
try:
io.value = value
except Exception:
proginit.logger.error(
"could not write '{0}' to Output '{1}'"
"".format(value, ioname)
)
proginit.logger.error("could not write '{0}' to Output '{1}'".format(value, ioname))
elif ioreset:
# Counter zurücksetzen
@@ -348,9 +315,7 @@ class MqttServer(Thread):
else:
# Aktion nicht erkennbar
proginit.logger.warning(
"can not see get/set in topic '{0}'".format(msg.topic)
)
proginit.logger.warning("can not see get/set in topic '{0}'".format(msg.topic))
def _send_pictory_conf(self):
"""Sendet piCtory Konfiguration per MQTT."""
@@ -359,10 +324,7 @@ class MqttServer(Thread):
self._mq.publish(self._mqtt_pictory, fh.read())
fh.close()
except Exception:
proginit.logger.error(
"can not read and publish piCtory config '{0}'"
"".format(proginit.pargs.configrsc)
)
proginit.logger.error("can not read and publish piCtory config '{0}'".format(proginit.pargs.configrsc))
def newlogfile(self):
"""Konfiguriert die FileHandler auf neue Logdatei."""
@@ -382,16 +344,12 @@ class MqttServer(Thread):
proginit.logger.debug("enter MqttServer.run()")
# MQTT verbinden
proginit.logger.info(
"connecting to mqtt broker {0}".format(self._broker_address)
)
proginit.logger.info("connecting to mqtt broker {0}".format(self._broker_address))
try:
self._mq.connect(self._broker_address, self._port, keepalive=60)
except Exception:
self._on_connect(self._mq, None, None, 3)
self._mq.connect_async(
self._broker_address, self._port, keepalive=60
)
self._mq.connect_async(self._broker_address, self._port, keepalive=60)
self._mq.loop_start()
# Eventüberwachung starten
@@ -411,9 +369,7 @@ class MqttServer(Thread):
# Eventüberwachung erneut starten
if self._send_events:
proginit.logger.debug(
"start non blocking mainloop of revpimodio"
)
proginit.logger.debug("start non blocking mainloop of revpimodio")
self._rpi.mainloop(blocking=False)
if send_cycledata:
@@ -424,19 +380,14 @@ class MqttServer(Thread):
# Exportierte IOs übertragen
for io in self._exported_ios:
value = io.value
if isinstance(value, bytes):
value = int.from_bytes(value, "little")
self._mq.publish(self._mqtt_io.format(io.name), int(value))
if isinstance(value, bool):
value = int(value) # Convert False/True to 0/1. Publish function would send the string.
self._mq.publish(self._mqtt_io.format(io.name), value)
self._evt_data.wait(
10 if not send_cycledata else self._sendinterval
)
self._evt_data.wait(10 if not send_cycledata else self._sendinterval)
# MQTT trennen
proginit.logger.info(
"disconnecting from mqtt broker {0}".format(self._broker_address)
)
# NOTE: dies gab dead-locks: self._mq.loop_stop()
proginit.logger.info("disconnecting from mqtt broker {0}".format(self._broker_address))
self._mq.disconnect()
# RevPiModIO aufräumen