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