From bd0df81c33dce02b7a8572f65488d4ec79db370a Mon Sep 17 00:00:00 2001 From: NaruX Date: Wed, 11 Apr 2018 12:28:38 +0200 Subject: [PATCH] =?UTF-8?q?MQTT=20sendet=20beim=20Start=20piCtory=20und=20?= =?UTF-8?q?Daten=20um=20laufende=20RevPiMqttIO=20zu=20informieren=20MQTT?= =?UTF-8?q?=20in=20XML-RPC=20eingebaut=20MQTT=20in=20XML=20Settings=20?= =?UTF-8?q?=C3=BCbernommen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/revpipyload.html | 45 +++++++++++++++++++++++ eric-revpipyload.api | 3 ++ revpipyload.e4p | 4 +-- revpipyload/mqttserver.py | 6 ++-- revpipyload/revpipyload.py | 74 +++++++++++++++++++++++++++++++++++--- setup.py | 2 +- 6 files changed, 125 insertions(+), 9 deletions(-) diff --git a/doc/revpipyload.html b/doc/revpipyload.html index 86682ad..149107e 100644 --- a/doc/revpipyload.html +++ b/doc/revpipyload.html @@ -138,6 +138,15 @@ Methods xml_getprocimg Gibt die Rohdaten aus piControl0 zurueck. +xml_mqttrunning +Prueft ob MQTT Uebertragung noch lauft. + +xml_mqttstart +Startet die MQTT Uebertragung. + +xml_mqttstop +Stoppt die MQTT Uebertragung. + xml_plcdownload Uebertraegt ein Archiv vom plcworkdir. @@ -373,6 +382,42 @@ Gibt die Rohdaten aus piControl0 zurueck.
xmlrpc.client.Binary()
+ +

+RevPiPyLoad.xml_mqttrunning

+xml_mqttrunning() +

+Prueft ob MQTT Uebertragung noch lauft. +

+
Returns:
+
+True, wenn MQTT Uebertragung noch lauft +
+
+

+RevPiPyLoad.xml_mqttstart

+xml_mqttstart() +

+Startet die MQTT Uebertragung. +

+
Returns:
+
+Statuscode: + 0: erfolgreich gestartet + -1: Nicht aktiv in Konfiguration + -2: Laeuft bereits +
+
+

+RevPiPyLoad.xml_mqttstop

+xml_mqttstop() +

+Stoppt die MQTT Uebertragung. +

+
Returns:
+
+True, wenn stop erfolgreich +

RevPiPyLoad.xml_plcdownload

diff --git a/eric-revpipyload.api b/eric-revpipyload.api index e9171e3..77d540a 100644 --- a/eric-revpipyload.api +++ b/eric-revpipyload.api @@ -77,6 +77,9 @@ revpipyload.RevPiPyLoad.xml_getconfig?4() revpipyload.RevPiPyLoad.xml_getfilelist?4() revpipyload.RevPiPyLoad.xml_getpictoryrsc?4() revpipyload.RevPiPyLoad.xml_getprocimg?4() +revpipyload.RevPiPyLoad.xml_mqttrunning?4() +revpipyload.RevPiPyLoad.xml_mqttstart?4() +revpipyload.RevPiPyLoad.xml_mqttstop?4() revpipyload.RevPiPyLoad.xml_plcdownload?4(mode="tar", pictory=False) revpipyload.RevPiPyLoad.xml_plcexitcode?4() revpipyload.RevPiPyLoad.xml_plcrunning?4() diff --git a/revpipyload.e4p b/revpipyload.e4p index d10b018..5f2c15c 100644 --- a/revpipyload.e4p +++ b/revpipyload.e4p @@ -1,7 +1,7 @@ - + en_US @@ -9,7 +9,7 @@ Python3 Console Dieser Loader wird über das Init-System geladen und führt das angegebene Pythonprogramm aus. Es ist für den RevolutionPi gedacht um automatisch das SPS-Programm zu starten. - 0.6.5 + 0.7.0 Sven Sager akira@narux.de diff --git a/revpipyload/mqttserver.py b/revpipyload/mqttserver.py index 07417a1..3d5dbcd 100644 --- a/revpipyload/mqttserver.py +++ b/revpipyload/mqttserver.py @@ -60,7 +60,6 @@ class MqttServer(Thread): # Handler konfigurieren self._mq.on_connect = self._on_connect self._mq.on_message = self._on_message - # TODO: self._mq.on_disconnect = self._on_disconnect def _get_procimglength(self): """Ermittelt aus piCtory Konfiguraiton die laenge. @@ -69,7 +68,7 @@ class MqttServer(Thread): with open(proginit.pargs.configrsc, "r") as fh: rsc = jload(fh) except: - return 0 + return 4096 length = 0 @@ -105,6 +104,9 @@ class MqttServer(Thread): self.__mqttend = True raise RuntimeError("can not connect to mqtt server") + # piCtory übertragen um alle RevPiMqttIO zu benachrichtigen + self._on_message(client, userdata, None) + # Subscribe piCtory Anforderung client.subscribe(self._mqtt_sendpictory) diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index d6f7dc2..a9806f8 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -50,7 +50,7 @@ from time import asctime from xmlrpc.client import Binary from xrpcserver import SaveXMLRPCServer -pyloadversion = "0.6.5" +pyloadversion = "0.7.0" class RevPiPyLoad(): @@ -81,6 +81,7 @@ class RevPiPyLoad(): self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=4) # Threads/Prozesse + self.th_mqtt = None self.th_plcslave = None self.plc = None @@ -147,6 +148,7 @@ class RevPiPyLoad(): proginit.logger.debug("enter RevPiPyLoad._loadconfig()") # Subsysteme herunterfahren + self.stop_plcmqtt() self.stop_xmlrpcserver() # Konfigurationsdatei laden @@ -330,6 +332,8 @@ class RevPiPyLoad(): 0, self.xml_plcstop, "plcstop") self.xsrv.register_function( 0, self.xml_reload, "reload") + self.xsrv.register_function( + 0, self.xml_mqttrunning, "mqttrunning") self.xsrv.register_function( 0, self.xml_plcslaverunning, "plcslaverunning") @@ -370,6 +374,10 @@ class RevPiPyLoad(): lambda: os.system(proginit.picontrolreset), "resetpicontrol" ) + self.xsrv.register_function( + 3, self.xml_mqttstart, "mqttstart") + self.xsrv.register_function( + 3, self.xml_mqttstop, "mqttstop") self.xsrv.register_function( 3, self.xml_plcslavestart, "plcslavestart") self.xsrv.register_function( @@ -555,11 +563,11 @@ class RevPiPyLoad(): self.xsrv.start() # MQTT Uebertragung starten - if self.mqtt and self.th_mqtt is not None: + if self.th_mqtt is not None: self.th_mqtt.start() - if self.plcslave: - # Slaveausfuehrung übergeben + # Slaveausfuehrung übergeben + if self.th_plcslave is not None: self.th_plcslave.start() # PLC Programm automatisch starten @@ -682,6 +690,17 @@ class RevPiPyLoad(): dc["zeroonerror"] = self.zeroonerror dc["zeroonexit"] = self.zeroonexit + # MQTT Sektion + dc["mqtt"] = self.mqtt + dc["basetopic"] = self.mqttbasetopic + dc["sendinterval"] = self.mqttsendinterval + dc["host"] = self.mqtthost + dc["port"] = self.mqttport + dc["tls_set"] = self.mqtttls_set + dc["username"] = self.mqttusername + dc["password"] = self.mqttpassword + dc["client_id"] = self.mqttclient_id + # PLCSLAVE Sektion dc["plcslave"] = self.plcslave dc["plcslaveacl"] = self.plcslaveacl.acl @@ -722,6 +741,42 @@ class RevPiPyLoad(): buff = fh.read() return Binary(buff) + def xml_mqttrunning(self): + """Prueft ob MQTT Uebertragung noch lauft. + @return True, wenn MQTT Uebertragung noch lauft""" + proginit.logger.debug("xmlrpc call mqttrunning") + return False if self.th_mqtt is None \ + else self.th_mqtt.is_alive() + + def xml_mqttstart(self): + """Startet die MQTT Uebertragung. + + @return Statuscode: + 0: erfolgreich gestartet + -1: Nicht aktiv in Konfiguration + -2: Laeuft bereits + + """ + if self.th_mqtt is not None and self.th_mqtt.is_alive(): + return -2 + else: + self.th_mqtt = self._plcmqtt() + if self.th_mqtt is None: + return -1 + else: + self.th_mqtt.start() + return 0 + + def xml_mqttstop(self): + """Stoppt die MQTT Uebertragung. + @return True, wenn stop erfolgreich""" + if self.th_mqtt is not None: + self.stop_plcmqtt() + self.th_mqtt = None + return True + else: + return False + def xml_plcdownload(self, mode="tar", pictory=False): """Uebertraegt ein Archiv vom plcworkdir. @@ -868,6 +923,17 @@ class RevPiPyLoad(): "zeroonerror": "[01]", "zeroonexit": "[01]", }, + "MQTT": { + "mqtt": "[01]", + "mqttbasetopic": ".*", + "mqttsendinterval": "[0-9]+", + "mqtthost": ".+", + "mqttport": "[0-9]+", + "mqtttls_set": "[01]", + "mqttusername": ".*", + "mqttpassword": ".*", + "mqttclient_id": ".+", + }, "PLCSLAVE": { "plcslave": "[01]", "plcslaveacl": self.plcslaveacl.regex_acl, diff --git a/setup.py b/setup.py index 8307359..251798b 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( license="LGPLv3", name="revpipyload", - version="0.6.5", + version="0.7.0", scripts=["data/revpipyload"],