From 2b296b78f9008b2ec03cb12c017bc7a66fce6d1b Mon Sep 17 00:00:00 2001 From: NaruX Date: Mon, 9 Apr 2018 18:32:26 +0200 Subject: [PATCH] =?UTF-8?q?Nur=20konfigurierte=20Bytes=20aus=20Procimg=20?= =?UTF-8?q?=C3=BCbertragen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/etc/revpipyload/revpipyload.conf | 2 +- doc/mqttserver.html | 14 ++++++++ eric-revpipyload.api | 1 + revpipyload/mqttserver.py | 50 ++++++++++++++++++++++++--- revpipyload/plcsystem.py | 7 +++- revpipyload/revpipyload.py | 11 +++--- 6 files changed, 74 insertions(+), 11 deletions(-) diff --git a/data/etc/revpipyload/revpipyload.conf b/data/etc/revpipyload/revpipyload.conf index c1fa1eb..a518d5e 100644 --- a/data/etc/revpipyload/revpipyload.conf +++ b/data/etc/revpipyload/revpipyload.conf @@ -26,7 +26,7 @@ bindip = * [MQTT] mqtt = 0 basetopic = revpi/data -sendinterval = 15 +sendinterval = 10 host = port = 1883 tls_set = 0 diff --git a/doc/mqttserver.html b/doc/mqttserver.html index 841d5e1..b40c3af 100644 --- a/doc/mqttserver.html +++ b/doc/mqttserver.html @@ -53,6 +53,9 @@ Methods MqttServer Init MqttServer class. +_get_procimglength +Ermittelt aus piCtory Konfiguraiton die laenge. + _on_connect Verbindung zu MQTT Broker. @@ -109,6 +112,17 @@ Optional Password fuer MQTT-Server
MQTT ClientID, wenn leer automatisch random erzeugung
+ +

+MqttServer._get_procimglength

+_get_procimglength() +

+Ermittelt aus piCtory Konfiguraiton die laenge. +

+
Returns:
+
+Laenge des Prozessabbilds +

MqttServer._on_connect

diff --git a/eric-revpipyload.api b/eric-revpipyload.api index 0a28dec..e9171e3 100644 --- a/eric-revpipyload.api +++ b/eric-revpipyload.api @@ -12,6 +12,7 @@ logsystem.PipeLogwriter.newlogfile?4() logsystem.PipeLogwriter.run?4() logsystem.PipeLogwriter.stop?4() logsystem.PipeLogwriter?1(logfilename) +mqttserver.MqttServer._get_procimglength?5() mqttserver.MqttServer._on_connect?5(client, userdata, flags, rc) mqttserver.MqttServer._on_message?5(client, userdata, msg) mqttserver.MqttServer.newlogfile?4() diff --git a/revpipyload/mqttserver.py b/revpipyload/mqttserver.py index ae1c768..07417a1 100644 --- a/revpipyload/mqttserver.py +++ b/revpipyload/mqttserver.py @@ -7,6 +7,7 @@ # """Stellt die MQTT Uebertragung fuer IoT-Zwecke bereit.""" import proginit +from json import load as jload from ssl import CERT_NONE from paho.mqtt.client import Client from threading import Thread, Event @@ -39,9 +40,10 @@ class MqttServer(Thread): # Klassenvariablen self.__exit = False self._evt_data = Event() - self._sendinterval = sendinterval self._host = host + self._procimglength = self._get_procimglength() self._port = port + self._sendinterval = sendinterval # Topics konfigurieren self._mqtt_picontrol = "{}/picontrol".format(basetopic) @@ -60,9 +62,45 @@ class MqttServer(Thread): 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. + @return Laenge des Prozessabbilds """ + try: + with open(proginit.pargs.configrsc, "r") as fh: + rsc = jload(fh) + except: + return 0 + + 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 + ) + + 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 + + return length + def _on_connect(self, client, userdata, flags, rc): """Verbindung zu MQTT Broker.""" - print("Connect rc:", rc) if rc > 0: self.__mqttend = True raise RuntimeError("can not connect to mqtt server") @@ -73,6 +111,7 @@ class MqttServer(Thread): def _on_message(self, client, userdata, msg): """Sendet piCtory Konfiguration.""" + # piCtory Konfiguration senden with open(proginit.pargs.configrsc, "rb") as fh: client.publish(self._mqtt_pictory, fh.read()) @@ -105,8 +144,11 @@ class MqttServer(Thread): while not self.__exit: self._evt_data.clear() - # FIXME: Ganzes Prozessabbild übertragen - self._mq.publish(self._mqtt_picontrol, fh_proc.read(4096)) + # Prozessabbild mit Daten übertragen + self._mq.publish( + self._mqtt_picontrol, + fh_proc.read(self._procimglength) + ) fh_proc.seek(0) self._evt_data.wait(self._sendinterval) diff --git a/revpipyload/plcsystem.py b/revpipyload/plcsystem.py index 8bb778f..cd6de76 100644 --- a/revpipyload/plcsystem.py +++ b/revpipyload/plcsystem.py @@ -226,7 +226,12 @@ class RevPiPlc(Thread): # Prozess beenden count = 0 proginit.logger.info("term plc program {}".format(self._program)) - self._procplc.terminate() + try: + self._procplc.terminate() + except ProcessLookupError: + proginit.logger.error("plc program was terminated unexpectedly") + proginit.logger.debug("leave RevPiPlc.stop()") + return while self._procplc.poll() is None and count < 10: count += 1 diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index a2b4628..d6f7dc2 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -32,7 +32,6 @@ begrenzt werden! """ import gzip import logsystem -import mqttserver import picontrolserver import plcsystem import proginit @@ -402,7 +401,8 @@ class RevPiPyLoad(): th_plc = None if self.mqtt: try: - th_plc = mqttserver.MqttServer( + from mqttserver import MqttServer + th_plc = MqttServer( self.mqttbasetopic, self.mqttsendinterval, self.mqtthost, @@ -413,6 +413,7 @@ class RevPiPyLoad(): self.mqttclient_id ) except: + # TODO: Fehlermeldung ausgeben bezüglich paho.mqtt pass proginit.logger.debug("leave RevPiPyLoad._plcmqtt()") @@ -553,8 +554,8 @@ class RevPiPyLoad(): proginit.logger.info("start xmlrpc-server") self.xsrv.start() - if self.mqtt: - # MQTT Uebertragung starten + # MQTT Uebertragung starten + if self.mqtt and self.th_mqtt is not None: self.th_mqtt.start() if self.plcslave: @@ -599,9 +600,9 @@ class RevPiPyLoad(): proginit.logger.info("stopping revpipyload") # Alle Sub-Systeme beenden + self.stop_plcprogram() self.stop_plcmqtt() self.stop_plcslave() - self.stop_plcprogram() self.stop_xmlrpcserver() # Logreader schließen