From c6fe2e93e5631199489e2745f6d48a22de64100b Mon Sep 17 00:00:00 2001 From: NaruX Date: Mon, 3 Sep 2018 12:16:43 +0200 Subject: [PATCH] =?UTF-8?q?Alle=20IOs=20mit=20Export-Flag=20in=20piCtory?= =?UTF-8?q?=20werden=20per=20MQTT=20gesendet=20Parameter=20f=C3=BCr=20Even?= =?UTF-8?q?t-Senden=20und=20Output-Schreiben=20in=20Konfig=20eingef=C3=BCg?= =?UTF-8?q?t=20Processabbild=20wird=20nicht=20komplett=20per=20MQTT=20gese?= =?UTF-8?q?ndet=20piCtory=20Konfig=20kann=20angefordert=20werden=20Ausg?= =?UTF-8?q?=C3=A4nge=20k=C3=B6nnen=20gesetzt=20werden=20(wenn=20Export-Fla?= =?UTF-8?q?g)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/etc/revpipyload/revpipyload.conf | 4 +- doc/index.html | 2 +- doc/mqttserver.html | 57 ++++-- doc/procimgserver.html | 2 +- doc/revpipyload.html | 4 +- eric-revpipyload.api | 44 +++- revpipyload/mqttserver.py | 278 +++++++++++++++++--------- revpipyload/procimgserver.py | 20 +- revpipyload/revpipyload.py | 32 ++- setup.py | 2 +- stdeb.cfg | 2 +- 11 files changed, 313 insertions(+), 134 deletions(-) diff --git a/data/etc/revpipyload/revpipyload.conf b/data/etc/revpipyload/revpipyload.conf index a518d5e..01a397c 100644 --- a/data/etc/revpipyload/revpipyload.conf +++ b/data/etc/revpipyload/revpipyload.conf @@ -26,7 +26,9 @@ bindip = * [MQTT] mqtt = 0 basetopic = revpi/data -sendinterval = 10 +sendinterval = 30 +send_on_event = 0 +write_outputs = 0 host = port = 1883 tls_set = 0 diff --git a/doc/index.html b/doc/index.html index 2986894..2e74c52 100644 --- a/doc/index.html +++ b/doc/index.html @@ -13,7 +13,7 @@ Packages - +
sharedShared modules.
diff --git a/doc/mqttserver.html b/doc/mqttserver.html index aa97c35..239fe85 100644 --- a/doc/mqttserver.html +++ b/doc/mqttserver.html @@ -12,7 +12,7 @@ Stellt die MQTT Uebertragung fuer IoT-Zwecke bereit.

Global Attributes

- +
None
__author__
__copyright__
__license__

Classes

@@ -53,8 +53,11 @@ Methods MqttServer Init MqttServer class. -_get_procimglength -Ermittelt aus piCtory Konfiguration die laenge. +_evt_io +Sendet Daten aus Events. + +_loadrevpimodio +Instantiiert das RevPiModIO Modul. _on_connect Verbindung zu MQTT Broker. @@ -66,11 +69,14 @@ Methods Sendet piCtory Konfiguration. _send_pictory_conf -Sendet piCtory Konfiguration. +Sendet piCtory Konfiguration per MQTT. newlogfile Konfiguriert die FileHandler auf neue Logdatei. +reload_revpimodio +Fuehrt im naechsten Zyklus zum Reload. + run Startet die Uebertragung per MQTT. @@ -86,7 +92,7 @@ Static Methods

MqttServer (Constructor)

-MqttServer(basetopic, sendinterval, host, port=1883, tls_set=False, username="", password=None, client_id="") +MqttServer(basetopic, sendinterval, host, port=1883, tls_set=False, username="", password=None, client_id="", send_events=False, write_outputs=False)

Init MqttServer class.

@@ -102,9 +108,6 @@ Adresse des MQTT-Servers
port
Portnummer des MQTT-Servers -
keepalive
-
-MQTT Ping bei leerlauf
tls_set
TLS fuer Verbindung zum MQTT-Server verwenden @@ -117,17 +120,37 @@ Optional Password fuer MQTT-Server
client_id
MQTT ClientID, wenn leer automatisch random erzeugung +
send_events
+
+Sendet Werte bei IO Wertaenderung +
write_outputs
+
+Per MQTT auch Outputs schreiben
-
+

-MqttServer._get_procimglength

-_get_procimglength() +MqttServer._evt_io +_evt_io(name, value)

-Ermittelt aus piCtory Konfiguration die laenge. +Sendet Daten aus Events. +

+
name
+
+IO-Name +
value
+
+IO-Value +
+
+

+MqttServer._loadrevpimodio

+_loadrevpimodio() +

+Instantiiert das RevPiModIO Modul.

Returns:
-Laenge des Prozessabbilds +None or Exception

@@ -152,13 +175,19 @@ Sendet piCtory Konfiguration. MqttServer._send_pictory_conf

_send_pictory_conf()

-Sendet piCtory Konfiguration. +Sendet piCtory Konfiguration per MQTT.

MqttServer.newlogfile

newlogfile()

Konfiguriert die FileHandler auf neue Logdatei. +

+

+MqttServer.reload_revpimodio

+reload_revpimodio() +

+Fuehrt im naechsten Zyklus zum Reload.

MqttServer.run

diff --git a/doc/procimgserver.html b/doc/procimgserver.html index 5498973..39b5fcf 100644 --- a/doc/procimgserver.html +++ b/doc/procimgserver.html @@ -137,7 +137,7 @@ Instantiiert das RevPiModIO Modul.

Returns:
-True, wenn erfolgreich, sonst False +None or Exception

diff --git a/doc/revpipyload.html b/doc/revpipyload.html index 149107e..b3e1c28 100644 --- a/doc/revpipyload.html +++ b/doc/revpipyload.html @@ -9,6 +9,8 @@ revpipyload

Revolution Pi Python PLC Loader.

+Webpage: https://revpimodio.org/revpipyplc/ +

Stellt das RevPiPyLoad Programm bereit. Dieses Programm lauft als Daemon auf dem Revolution Pi. Es stellt Funktionen bereit, die es ermoeglichen ein Python Programm zu starten und fuehrt dessen Ausgaben in eine Logdatei. Die Logdaten @@ -32,7 +34,7 @@ begrenzt werden!

Global Attributes

- +
pyloadversion
__author__
__copyright__
__license__
__version__

Classes

diff --git a/eric-revpipyload.api b/eric-revpipyload.api index 7e7e323..c025233 100644 --- a/eric-revpipyload.api +++ b/eric-revpipyload.api @@ -1,3 +1,6 @@ +helper.__author__?9 +helper.__copyright__?9 +helper.__license__?9 helper._setuprt?5(pid, evt_exit) helper._zeroprocimg?5() helper.refullmatch?4(regex, string) @@ -12,15 +15,23 @@ logsystem.PipeLogwriter.newlogfile?4() logsystem.PipeLogwriter.run?4() logsystem.PipeLogwriter.stop?4() logsystem.PipeLogwriter?1(logfilename) -mqttserver.MqttServer._get_procimglength?5() +logsystem.__author__?9 +logsystem.__copyright__?9 +logsystem.__license__?9 +mqttserver.MqttServer._evt_io?5(name, value) +mqttserver.MqttServer._loadrevpimodio?5() mqttserver.MqttServer._on_connect?5(client, userdata, flags, rc) mqttserver.MqttServer._on_disconnect?5(client, userdata, rc) mqttserver.MqttServer._on_message?5(client, userdata, msg) mqttserver.MqttServer._send_pictory_conf?5() mqttserver.MqttServer.newlogfile?4() +mqttserver.MqttServer.reload_revpimodio?4() mqttserver.MqttServer.run?4() mqttserver.MqttServer.stop?4() -mqttserver.MqttServer?1(basetopic, sendinterval, host, port=1883, tls_set=False, username="", password=None, client_id="") +mqttserver.MqttServer?1(basetopic, sendinterval, host, port=1883, tls_set=False, username="", password=None, client_id="", send_events=False, write_outputs=False) +mqttserver.__author__?9 +mqttserver.__copyright__?9 +mqttserver.__license__?9 picontrolserver.RevPiSlave.check_connectedacl?4() picontrolserver.RevPiSlave.newlogfile?4() picontrolserver.RevPiSlave.run?4() @@ -29,6 +40,9 @@ picontrolserver.RevPiSlave?1(ipacl, port=55234) picontrolserver.RevPiSlaveDev.run?4() picontrolserver.RevPiSlaveDev.stop?4() picontrolserver.RevPiSlaveDev?1(devcon, acl) +picontrolserver.__author__?9 +picontrolserver.__copyright__?9 +picontrolserver.__license__?9 plcsystem.RevPiPlc.__get_autoreloaddelay?6() plcsystem.RevPiPlc.__set_autoreloaddelay?6(value) plcsystem.RevPiPlc._configureplw?5() @@ -39,14 +53,23 @@ plcsystem.RevPiPlc.newlogfile?4() plcsystem.RevPiPlc.run?4() plcsystem.RevPiPlc.stop?4() plcsystem.RevPiPlc?1(program, arguments, pversion) +plcsystem.__author__?9 +plcsystem.__copyright__?9 +plcsystem.__license__?9 procimgserver.ProcimgServer.devices?4() -procimgserver.ProcimgServer.ios?4(type) +procimgserver.ProcimgServer.ios?4(iotype) procimgserver.ProcimgServer.loadrevpimodio?4() procimgserver.ProcimgServer.setvalue?4(device, io, value) procimgserver.ProcimgServer.start?4() procimgserver.ProcimgServer.stop?4() procimgserver.ProcimgServer.values?4() procimgserver.ProcimgServer?1(xmlserver) +procimgserver.__author__?9 +procimgserver.__copyright__?9 +procimgserver.__license__?9 +proginit.__author__?9 +proginit.__copyright__?9 +proginit.__license__?9 proginit.cleanup?4() proginit.configure?4() proginit.forked?7 @@ -98,7 +121,13 @@ revpipyload.RevPiPyLoad.xml_reload?4() revpipyload.RevPiPyLoad.xml_setconfig?4(dc, loadnow=False) revpipyload.RevPiPyLoad.xml_setpictoryrsc?4(filebytes, reset=False) revpipyload.RevPiPyLoad?1() -revpipyload.pyloadversion?7 +revpipyload.__author__?9 +revpipyload.__copyright__?9 +revpipyload.__license__?9 +revpipyload.__version__?9 +revpipyload.shared.__author__?9 +revpipyload.shared.__copyright__?9 +revpipyload.shared.__license__?9 revpipyload.shared.ipaclmanager.IpAclManager.__get_acl?6() revpipyload.shared.ipaclmanager.IpAclManager.__get_filename?6() revpipyload.shared.ipaclmanager.IpAclManager.__get_regex_acl?6() @@ -112,6 +141,10 @@ revpipyload.shared.ipaclmanager.IpAclManager.loadaclfile?4(filename) revpipyload.shared.ipaclmanager.IpAclManager.regex_acl?7 revpipyload.shared.ipaclmanager.IpAclManager.writeaclfile?4(filename=None, aclname=None) revpipyload.shared.ipaclmanager.IpAclManager?1(minlevel, maxlevel, acl=None) +revpipyload.shared.ipaclmanager.__author__?9 +revpipyload.shared.ipaclmanager.__copyright__?9 +revpipyload.shared.ipaclmanager.__license__?9 +revpipyload.shared.ipaclmanager.__version__?9 revpipyload.shared.ipaclmanager.refullmatch?4(regex, string) xrpcserver.SaveXMLRPCRequestHandler.parse_request?4() xrpcserver.SaveXMLRPCServer._dispatch?5(method, params) @@ -120,3 +153,6 @@ xrpcserver.SaveXMLRPCServer.register_function?4(acl_level, function, name=None) xrpcserver.SaveXMLRPCServer.start?4() xrpcserver.SaveXMLRPCServer.stop?4() xrpcserver.SaveXMLRPCServer?1(addr, logRequests=True, allow_none=False, ipacl=None) +xrpcserver.__author__?9 +xrpcserver.__copyright__?9 +xrpcserver.__license__?9 diff --git a/revpipyload/mqttserver.py b/revpipyload/mqttserver.py index c198e4f..8188941 100644 --- a/revpipyload/mqttserver.py +++ b/revpipyload/mqttserver.py @@ -1,15 +1,13 @@ # -*- coding: utf-8 -*- -# -# RevPiPyLoad -# -# Webpage: https://revpimodio.org/revpipyplc/ -# (c) Sven Sager, License: LGPLv3 -# """Stellt die MQTT Uebertragung fuer IoT-Zwecke bereit.""" +__author__ = "Sven Sager" +__copyright__ = "Copyright (C) 2018 Sven Sager" +__license__ = "GPLv3" import proginit -from json import load as jload -from ssl import CERT_NONE +import revpimodio2 +from os.path import join from paho.mqtt.client import Client +from ssl import CERT_NONE from threading import Thread, Event @@ -19,36 +17,71 @@ class MqttServer(Thread): def __init__( self, basetopic, sendinterval, host, port=1883, - tls_set=False, username="", password=None, client_id=""): + 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 port Portnummer des MQTT-Servers - @param keepalive MQTT Ping bei leerlauf @param tls_set TLS fuer Verbindung zum MQTT-Server verwenden @param username Optional Benutzername fuer MQTT-Server @param password Optional Password fuer MQTT-Server @param client_id MQTT ClientID, wenn leer automatisch random erzeugung + @param send_events Sendet Werte bei IO Wertaenderung + @param write_outputs Per MQTT auch Outputs schreiben """ - # TODO: Parameterprüfung + if not isinstance(basetopic, str): + raise ValueError("parameter topic must be ") + if not (isinstance(sendinterval, int) and sendinterval > 0): + raise ValueError( + "parameter sendinterval must be and gt 0" + ) + 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" + ) + if not isinstance(tls_set, bool): + raise ValueError("parameter tls_set must be ") + if not isinstance(username, str): + raise ValueError("parameter username must be ") + if not (password is None or isinstance(password, str)): + raise ValueError("parameter password must be ") + if not isinstance(client_id, str): + raise ValueError("parameter client_id must be ") + if not isinstance(send_events, bool): + raise ValueError("parameter send_events must be ") + if not isinstance(write_outputs, bool): + raise ValueError("parameter write_outputs must be ") super().__init__() # Klassenvariablen self.__exit = False self._evt_data = Event() + self._exported_ios = [] self._host = host - self._procimglength = self._get_procimglength() self._port = port + self._reloadmodio = False + self._rpi = None + self._rpi_write = None + self._send_events = send_events self._sendinterval = sendinterval + self._write_outputs = write_outputs + + # RevPiModIO laden oder mit Exception aussteigen + self._loadrevpimodio() # Topics konfigurieren - self._mqtt_picontrol = "{}/picontrol".format(basetopic) - self._mqtt_pictory = "{}/pictory".format(basetopic) - self._mqtt_sendpictory = "{}/needpictory".format(basetopic) + self._mqtt_evt_io = join(basetopic, "event/{0}") + self._mqtt_io = join(basetopic, "io/{0}") + self._mqtt_ioset = join(basetopic, "set/#") + self._mqtt_pictory = join(basetopic, "pictory") + self._mqtt_sendpictory = join(basetopic, "needpictory") self._mq = Client(client_id) if username != "": @@ -61,123 +94,181 @@ class MqttServer(Thread): self._mq.on_connect = self._on_connect self._mq.on_message = self._on_message - def _get_procimglength(self): - """Ermittelt aus piCtory Konfiguration die laenge. - @return Laenge des Prozessabbilds """ + def _evt_io(self, name, value): + """Sendet Daten aus Events. + @param name IO-Name + @param value IO-Value""" + if isinstance(value, bytes): + value = int.from_bytes(value, "little") + self._mq.publish(self._mqtt_evt_io.format(name), int(value)) + + def _loadrevpimodio(self): + """Instantiiert das RevPiModIO Modul. + @return None or Exception""" + self._reloadmodio = False + self._exported_ios = [] + + # RevPiModIO-Modul Instantiieren + if self._rpi is not None: + self._rpi.cleanup() + if self._rpi_write is not None: + self._rpi_write.cleanup() + + proginit.logger.debug("create revpimodio2 object for MQTT") try: - with open(proginit.pargs.configrsc, "r") as fh: - rsc = jload(fh) - except: - return 4096 - - length = 0 - - # piCtory Config prüfen - if "Devices" not in rsc: - return 0 - - # Letzes piCtory Device laden - last_dev = rsc["Devices"].pop() - length += last_dev["offset"] - - # bei mem beginnen, weil nur der höchste IO benötigt wird - for type_iom in ["mem", "out", "inp"]: - lst_iom = sorted( - last_dev[type_iom], - key=lambda x: int(x), - reverse=True + # Lesend und Eventüberwachung + self._rpi = revpimodio2.RevPiModIO( + autorefresh=self._send_events, + monitoring=True, + configrsc=proginit.pargs.configrsc, + procimg=proginit.pargs.procimg ) - if len(lst_iom) > 0: - # Daten des letzen IOM auswerten - last_iom = last_dev[type_iom][str(lst_iom[0])] - bitlength = int(last_iom[2]) - length += int(last_iom[3]) - length += 1 if bitlength == 1 else int(bitlength / 8) - break + # Schreibenen Zugriff + if self._write_outputs: + self._rpi_write = revpimodio2.RevPiModIO( + configrsc=proginit.pargs.configrsc, + procimg=proginit.pargs.procimg + ) - return length + except Exception as e: + self._rpi = None + self._rpi_write = None + proginit.logger.error( + "piCtory configuration not loadable for MQTT" + ) + raise e + + # Exportierte IOs laden + for dev in self._rpi.device: + for io in dev.get_allios(export=True): + io.reg_event(self._evt_io) + self._exported_ios.append(io) + + # Eventüberwachung starten + if self._send_events: + self._rpi.mainloop(blocking=False) + + proginit.logger.debug("created revpimodio2 object") def _on_connect(self, client, userdata, flags, rc): """Verbindung zu MQTT Broker.""" if rc > 0: - proginit.warning("can not connect to mqtt broker - will retry") + proginit.logger.warning( + "can not connect to mqtt broker - error {0} - will retry" + "".format(rc) + ) else: - # piCtory übertragen um alle RevPiMqttIO zu benachrichtigen - self._send_pictory_conf() - # Subscribe piCtory Anforderung client.subscribe(self._mqtt_sendpictory) + if self._write_outputs: + client.subscribe(self._mqtt_ioset) def _on_disconnect(self, client, userdata, rc): """Wertet Verbindungsabbruch aus.""" if rc != 0: - proginit.warning( + proginit.logger.warning( "unexpected disconnection from mqtt broker - " "will try to reconnect" ) def _on_message(self, client, userdata, msg): """Sendet piCtory Konfiguration.""" + if msg.topic == self._mqtt_pictory: + # piCtory Konfiguration senden + self._send_pictory_conf() - # piCtory Konfiguration senden - self._send_pictory_conf() + else: + lst_topic = msg.topic.split("/") + ioname = lst_topic[-1] - # Prozessabbild senden - self._evt_data.set() + try: + io = self._rpi_write.io[ioname] + except Exception: + proginit.logger.error( + "can not find io '{0}' for MQTT".format(ioname) + ) + return + + # Check Output exists and is an Output + if io.type != revpimodio2.OUT: + proginit.logger.error( + "can not write to inputs with MQTT" + ) + elif not io.export: + proginit.logger.error( + "io '{0}' is not marked as export in piCtory for MQTT use" + "".format(ioname) + ) + else: + + # Convert MQTT Payload to valid Output-Value + value = msg.payload.decode("utf8") + + if value.isdecimal(): + value = int(value) + elif value == "false": + value = 0 + elif value == "true": + value = 1 + else: + proginit.logger.error( + "can not convert value '{0}' for output '{1}'" + "".format(value, ioname) + ) + return + + # Write Value to RevPi + io._parentdevice.syncoutputs() + io.value = value + io._parentdevice.writeprocimg() def _send_pictory_conf(self): - """Sendet piCtory Konfiguration.""" - with open(proginit.pargs.configrsc, "rb") as fh: + """Sendet piCtory Konfiguration per MQTT.""" + try: + fh = open(proginit.pargs.configrsc, "rb") 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) + ) def newlogfile(self): """Konfiguriert die FileHandler auf neue Logdatei.""" pass + def reload_revpimodio(self): + """Fuehrt im naechsten Zyklus zum Reload.""" + self._reloadmodio = True + def run(self): """Startet die Uebertragung per MQTT.""" - proginit.logger.debug("enter MqttServer.start()") - - # Prozessabbild öffnen - try: - fh_proc = open(proginit.pargs.procimg, "r+b", 0) - except: - fh_proc = None - self.__exit = True - proginit.logger.error( - "can not open process image {}".format(proginit.pargs.procimg) - ) + proginit.logger.debug("enter MqttServer.run()") # MQTT verbinden self._mq.connect_async(self._host, self._port, keepalive=60) self._mq.loop_start() # mainloop - buff = b'' - err_count = 0 while not self.__exit: self._evt_data.clear() - # Prozessabbild lesen - try: - fh_proc.seek(0) - buff = fh_proc.read(self._procimglength) - if err_count > 0: - proginit.warning( - "resume mqtt publishing after {} errors on " - "processimage".format(err_count) - ) - err_count = 0 - except IOError: - if err_count == 0: - proginit.logger.error( - "could not read process image for mqtt publishing" - ) - err_count += 1 - else: - # Prozessabbild übertragen - self._mq.publish(self._mqtt_picontrol, buff) + # RevPiModIO neu laden + if self._reloadmodio: + self._loadrevpimodio() + + # Werte laden, wenn nicht autorefresh + if not self._send_events: + self._rpi.readprocimg() + + # 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)) self._evt_data.wait(self._sendinterval) @@ -185,11 +276,10 @@ class MqttServer(Thread): self._mq.loop_stop() self._mq.disconnect() - # FileHandler schließen - if fh_proc is not None: - fh_proc.close() + # RevPiModIO aufräumen + self._rpi.cleanup() - proginit.logger.debug("leave MqttServer.start()") + proginit.logger.debug("leave MqttServer.run()") def stop(self): """Stoppt die Uebertragung per MQTT.""" diff --git a/revpipyload/procimgserver.py b/revpipyload/procimgserver.py index 8085347..2029a80 100644 --- a/revpipyload/procimgserver.py +++ b/revpipyload/procimgserver.py @@ -45,7 +45,10 @@ class ProcimgServer(): "ps_setvalue": self.setvalue, } - self.loadrevpimodio() + # RevPiModIO laden oder mit Exception aussteigen + ex = self.loadrevpimodio() + if ex is not None: + raise ex proginit.logger.debug("leave ProcimgServer.__init__()") @@ -84,25 +87,28 @@ class ProcimgServer(): def loadrevpimodio(self): """Instantiiert das RevPiModIO Modul. - @return True, wenn erfolgreich, sonst False""" + @return None or Exception""" # RevPiModIO-Modul Instantiieren if self.rpi is not None: self.rpi.cleanup() - proginit.logger.debug("create revpimodio2 object") + proginit.logger.debug("create revpimodio2 object for ProcimgServer") try: self.rpi = revpimodio2.RevPiModIO( configrsc=proginit.pargs.configrsc, procimg=proginit.pargs.procimg ) - except Exception: + except Exception as e: self.rpi = None - proginit.logger.error("piCtory configuration not loadable") - return False + proginit.logger.error( + "piCtory configuration not loadable for ProcimgServer" + ) + return e + # NOTE: Warum das? self.rpi.syncoutputs(device=0) + proginit.logger.debug("created revpimodio2 object") - return True def setvalue(self, device, io, value): """Setzt einen Wert auf dem RevPi. diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index 2be8733..0d077af 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -188,23 +188,27 @@ class RevPiPyLoad(): self.mqtt = 0 if "MQTT" in self.globalconfig: self.mqtt = \ - int(self.globalconfig["MQTT"].get("mqtt", 0)) + self.globalconfig["MQTT"].getboolean("mqtt", False) self.mqttbasetopic = \ self.globalconfig["MQTT"].get("basetopic", "") self.mqttsendinterval = \ - int(self.globalconfig["MQTT"].get("sendinterval", 15)) + self.globalconfig["MQTT"].getint("sendinterval", 15) self.mqtthost = \ self.globalconfig["MQTT"].get("host", "") self.mqttport = \ - int(self.globalconfig["MQTT"].get("port", 1883)) + self.globalconfig["MQTT"].getint("port", 1883) self.mqtttls_set = \ - int(self.globalconfig["MQTT"].get("tls_set", 0)) + self.globalconfig["MQTT"].getboolean("tls_set", False) self.mqttusername = \ self.globalconfig["MQTT"].get("username", "") self.mqttpassword = \ self.globalconfig["MQTT"].get("password", "") self.mqttclient_id = \ self.globalconfig["MQTT"].get("client_id", "") + self.mqttsend_events = \ + self.globalconfig["MQTT"].getboolean("send_on_event", False) + self.mqttwrite_outputs = \ + self.globalconfig["MQTT"].getboolean("write_outputs", False) # Konfiguration verarbeiten [PLCSLAVE] self.plcslave = False @@ -348,7 +352,7 @@ class RevPiPyLoad(): self.xml_ps = None proginit.logger.warning( "can not load revpimodio2 module. maybe its not installed " - "or an old version (required at least 2.1.6). if you " + "or an old version (required at least 2.2.3). if you " "like to use the process monitor feature, update/install " "revpimodio2: 'apt-get install python3-revpimodio2'" ) @@ -419,11 +423,17 @@ class RevPiPyLoad(): self.mqtttls_set, self.mqttusername, self.mqttpassword, - self.mqttclient_id + self.mqttclient_id, + self.mqttsend_events, + self.mqttwrite_outputs, + ) + except Exception: + proginit.logger.warning( + "can not load revpimodio2 module. maybe its not installed " + "or an old version (required at least 2.2.3). if you " + "like to use the mqtt feature, update/install " + "revpimodio2: 'apt-get install python3-revpimodio2'" ) - except: - # TODO: Fehlermeldung ausgeben bezüglich paho.mqtt - pass proginit.logger.debug("leave RevPiPyLoad._plcmqtt()") return th_plc @@ -701,6 +711,8 @@ class RevPiPyLoad(): dc["username"] = self.mqttusername dc["password"] = self.mqttpassword dc["client_id"] = self.mqttclient_id + dc["send_events"] = self.mqttsend_events + dc["write_outputs"] = self.mqttwrite_outputs # PLCSLAVE Sektion dc["plcslave"] = self.plcslave @@ -934,6 +946,8 @@ class RevPiPyLoad(): "mqttusername": ".*", "mqttpassword": ".*", "mqttclient_id": ".+", + "mqttsend_events": "[01]", + "mqttwrite_outputs": "[01]", }, "PLCSLAVE": { "plcslave": "[01]", diff --git a/setup.py b/setup.py index ac304b5..91e6ec8 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ setup( scripts=["data/revpipyload"], - install_requires=["revpimodio2 >= 2.1.6"], + install_requires=["revpimodio2 >= 2.2.3"], python_requires=">=3.2", data_files=[ diff --git a/stdeb.cfg b/stdeb.cfg index c640e0b..582c987 100644 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -1,5 +1,5 @@ [DEFAULT] Debian-Version: 1 -Depends3: python3-revpimodio2 (>= 2.1.6) +Depends3: python3-revpimodio2 (>= 2.2.3) Package: revpipyload Suite: stable