diff --git a/data/etc/revpipyload/revpipyload.conf b/data/etc/revpipyload/revpipyload.conf index bb333f5..72dae75 100644 --- a/data/etc/revpipyload/revpipyload.conf +++ b/data/etc/revpipyload/revpipyload.conf @@ -29,7 +29,7 @@ basetopic = revpi01 sendinterval = 30 send_on_event = 0 write_outputs = 0 -host = +broker_address = localhost port = 1883 tls_set = 0 username = diff --git a/revpipyload.e4p b/revpipyload.e4p index 9a928d6..d706118 100644 --- a/revpipyload.e4p +++ b/revpipyload.e4p @@ -1,7 +1,7 @@ - + en_US @@ -23,6 +23,7 @@ revpipyload/proginit.py revpipyload/revpipyload.py revpipyload/shared/__init__.py + revpipyload/shared/ipaclmanager.py revpipyload/xrpcserver.py setup.py diff --git a/revpipyload/mqttserver.py b/revpipyload/mqttserver.py index 8188941..f880453 100644 --- a/revpipyload/mqttserver.py +++ b/revpipyload/mqttserver.py @@ -6,7 +6,7 @@ __license__ = "GPLv3" import proginit import revpimodio2 from os.path import join -from paho.mqtt.client import Client +from paho.mqtt.client import Client, connack_string from ssl import CERT_NONE from threading import Thread, Event @@ -16,14 +16,14 @@ class MqttServer(Thread): """Server fuer die Uebertragung des Prozessabbilds per MQTT.""" def __init__( - self, basetopic, sendinterval, host, port=1883, + self, basetopic, sendinterval, broker_address, port=1883, tls_set=False, username="", password=None, client_id="", send_events=False, write_outputs=False): """Init MqttServer class. @param basetopic Basis-Topic fuer Datenaustausch @param sendinterval Prozessabbild alle n Sekunden senden - @param host Adresse des MQTT-Servers + @param broker_address Adresse des MQTT-Servers @param port Portnummer des MQTT-Servers @param tls_set TLS fuer Verbindung zum MQTT-Server verwenden @param username Optional Benutzername fuer MQTT-Server @@ -37,10 +37,12 @@ class MqttServer(Thread): raise ValueError("parameter topic must be ") if not (isinstance(sendinterval, int) and sendinterval > 0): raise ValueError( - "parameter sendinterval must be and gt 0" + "parameter sendinterval must be and > 0" + ) + if not (isinstance(broker_address, str) and broker_address != ""): + raise ValueError( + "parameter broker_address must be and not empty" ) - if not isinstance(host, str): - raise ValueError("parameter host must be ") if not (isinstance(port, int) and 0 < port < 65535): raise ValueError( "parameter sendinterval must be and 1 - 65535" @@ -64,7 +66,7 @@ class MqttServer(Thread): self.__exit = False self._evt_data = Event() self._exported_ios = [] - self._host = host + self._broker_address = broker_address self._port = port self._reloadmodio = False self._rpi = None @@ -155,8 +157,8 @@ class MqttServer(Thread): """Verbindung zu MQTT Broker.""" if rc > 0: proginit.logger.warning( - "can not connect to mqtt broker - error {0} - will retry" - "".format(rc) + "can not connect to mqtt broker '{0}' - error '{1}' - " + "will retry".format(self._broker_address, connack_string(rc)) ) else: # Subscribe piCtory Anforderung @@ -184,6 +186,7 @@ class MqttServer(Thread): try: io = self._rpi_write.io[ioname] + io_needbytes = type(io.value) == bytes except Exception: proginit.logger.error( "can not find io '{0}' for MQTT".format(ioname) @@ -207,9 +210,21 @@ class MqttServer(Thread): if value.isdecimal(): value = int(value) - elif value == "false": + + # Muss eine Byteumwandlung vorgenommen werden? + if io_needbytes: + try: + value = value.to_bytes(io.length, io.byteorder) + except OverflowError: + proginit.logger.error( + "can not convert value '{0}' to fitting bytes" + "".format(value) + ) + return + + elif value == "false" and not io_needbytes: value = 0 - elif value == "true": + elif value == "true" and not io_needbytes: value = 1 else: proginit.logger.error( @@ -220,8 +235,15 @@ class MqttServer(Thread): # Write Value to RevPi io._parentdevice.syncoutputs() - io.value = value - io._parentdevice.writeprocimg() + try: + io.value = value + except Exception: + proginit.logger.error( + "could not write '{0}' to Output '{1}'" + "".format(value, ioname) + ) + else: + io._parentdevice.writeprocimg() def _send_pictory_conf(self): """Sendet piCtory Konfiguration per MQTT.""" @@ -248,7 +270,13 @@ class MqttServer(Thread): proginit.logger.debug("enter MqttServer.run()") # MQTT verbinden - self._mq.connect_async(self._host, self._port, keepalive=60) + 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.loop_start() # mainloop diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index 0a288ef..a3912e1 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -107,8 +107,8 @@ class RevPiPyLoad(): self.globalconfig["MQTT"].get("basetopic", "") or self.mqttsendinterval != self.globalconfig["MQTT"].getint("sendinterval", 30) or - self.mqtthost != - self.globalconfig["MQTT"].get("host", "") or + self.mqttbroker_address != + self.globalconfig["MQTT"].get("broker_address", "localhost") or self.mqttport != self.globalconfig["MQTT"].getint("port", 1883) or self.mqtttls_set != @@ -225,8 +225,8 @@ class RevPiPyLoad(): self.globalconfig["MQTT"].get("basetopic", "") self.mqttsendinterval = \ self.globalconfig["MQTT"].getint("sendinterval", 30) - self.mqtthost = \ - self.globalconfig["MQTT"].get("host", "") + self.mqttbroker_address = \ + self.globalconfig["MQTT"].get("broker_address", "localhost") self.mqttport = \ self.globalconfig["MQTT"].getint("port", 1883) self.mqtttls_set = \ @@ -450,18 +450,6 @@ class RevPiPyLoad(): if self.mqtt: try: from mqttserver import MqttServer - th_plc = MqttServer( - self.mqttbasetopic, - self.mqttsendinterval, - self.mqtthost, - self.mqttport, - self.mqtttls_set, - self.mqttusername, - self.mqttpassword, - self.mqttclient_id, - self.mqttsend_events, - self.mqttwrite_outputs, - ) except Exception: proginit.logger.warning( "can not load revpimodio2 module. maybe its not installed " @@ -469,6 +457,22 @@ class RevPiPyLoad(): "like to use the mqtt feature, update/install " "revpimodio2: 'apt-get install python3-revpimodio2'" ) + else: + try: + th_plc = MqttServer( + self.mqttbasetopic, + self.mqttsendinterval, + self.mqttbroker_address, + self.mqttport, + self.mqtttls_set, + self.mqttusername, + self.mqttpassword, + self.mqttclient_id, + self.mqttsend_events, + self.mqttwrite_outputs, + ) + except Exception as e: + proginit.logger.error(e) proginit.logger.debug("leave RevPiPyLoad._plcmqtt()") return th_plc @@ -753,7 +757,7 @@ class RevPiPyLoad(): dc["mqtt"] = self.mqtt dc["mqttbasetopic"] = self.mqttbasetopic dc["mqttsendinterval"] = self.mqttsendinterval - dc["mqtthost"] = self.mqtthost + dc["mqttbroker_address"] = self.mqttbroker_address dc["mqttport"] = self.mqttport dc["mqtttls_set"] = self.mqtttls_set dc["mqttusername"] = self.mqttusername @@ -988,7 +992,7 @@ class RevPiPyLoad(): "mqtt": "[01]", "mqttbasetopic": ".*", "mqttsendinterval": "[0-9]+", - "mqtthost": ".+", + "mqttbroker_address": ".+", "mqttport": "[0-9]+", "mqtttls_set": "[01]", "mqttusername": ".*",