mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 23:23:52 +01:00
Nur konfigurierte Bytes aus Procimg übertragen
This commit is contained in:
@@ -26,7 +26,7 @@ bindip = *
|
|||||||
[MQTT]
|
[MQTT]
|
||||||
mqtt = 0
|
mqtt = 0
|
||||||
basetopic = revpi/data
|
basetopic = revpi/data
|
||||||
sendinterval = 15
|
sendinterval = 10
|
||||||
host =
|
host =
|
||||||
port = 1883
|
port = 1883
|
||||||
tls_set = 0
|
tls_set = 0
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#MqttServer.__init__">MqttServer</a></td>
|
<td><a style="color:#0000FF" href="#MqttServer.__init__">MqttServer</a></td>
|
||||||
<td>Init MqttServer class.</td>
|
<td>Init MqttServer class.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#MqttServer._get_procimglength">_get_procimglength</a></td>
|
||||||
|
<td>Ermittelt aus piCtory Konfiguraiton die laenge.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#MqttServer._on_connect">_on_connect</a></td>
|
<td><a style="color:#0000FF" href="#MqttServer._on_connect">_on_connect</a></td>
|
||||||
<td>Verbindung zu MQTT Broker.</td>
|
<td>Verbindung zu MQTT Broker.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -109,6 +112,17 @@ Optional Password fuer MQTT-Server
|
|||||||
<dd>
|
<dd>
|
||||||
MQTT ClientID, wenn leer automatisch random erzeugung
|
MQTT ClientID, wenn leer automatisch random erzeugung
|
||||||
</dd>
|
</dd>
|
||||||
|
</dl><a NAME="MqttServer._get_procimglength" ID="MqttServer._get_procimglength"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
MqttServer._get_procimglength</h3>
|
||||||
|
<b>_get_procimglength</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Ermittelt aus piCtory Konfiguraiton die laenge.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
Laenge des Prozessabbilds <class 'int'>
|
||||||
|
</dd>
|
||||||
</dl><a NAME="MqttServer._on_connect" ID="MqttServer._on_connect"></a>
|
</dl><a NAME="MqttServer._on_connect" ID="MqttServer._on_connect"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
MqttServer._on_connect</h3>
|
MqttServer._on_connect</h3>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ logsystem.PipeLogwriter.newlogfile?4()
|
|||||||
logsystem.PipeLogwriter.run?4()
|
logsystem.PipeLogwriter.run?4()
|
||||||
logsystem.PipeLogwriter.stop?4()
|
logsystem.PipeLogwriter.stop?4()
|
||||||
logsystem.PipeLogwriter?1(logfilename)
|
logsystem.PipeLogwriter?1(logfilename)
|
||||||
|
mqttserver.MqttServer._get_procimglength?5()
|
||||||
mqttserver.MqttServer._on_connect?5(client, userdata, flags, rc)
|
mqttserver.MqttServer._on_connect?5(client, userdata, flags, rc)
|
||||||
mqttserver.MqttServer._on_message?5(client, userdata, msg)
|
mqttserver.MqttServer._on_message?5(client, userdata, msg)
|
||||||
mqttserver.MqttServer.newlogfile?4()
|
mqttserver.MqttServer.newlogfile?4()
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#
|
#
|
||||||
"""Stellt die MQTT Uebertragung fuer IoT-Zwecke bereit."""
|
"""Stellt die MQTT Uebertragung fuer IoT-Zwecke bereit."""
|
||||||
import proginit
|
import proginit
|
||||||
|
from json import load as jload
|
||||||
from ssl import CERT_NONE
|
from ssl import CERT_NONE
|
||||||
from paho.mqtt.client import Client
|
from paho.mqtt.client import Client
|
||||||
from threading import Thread, Event
|
from threading import Thread, Event
|
||||||
@@ -39,9 +40,10 @@ class MqttServer(Thread):
|
|||||||
# Klassenvariablen
|
# Klassenvariablen
|
||||||
self.__exit = False
|
self.__exit = False
|
||||||
self._evt_data = Event()
|
self._evt_data = Event()
|
||||||
self._sendinterval = sendinterval
|
|
||||||
self._host = host
|
self._host = host
|
||||||
|
self._procimglength = self._get_procimglength()
|
||||||
self._port = port
|
self._port = port
|
||||||
|
self._sendinterval = sendinterval
|
||||||
|
|
||||||
# Topics konfigurieren
|
# Topics konfigurieren
|
||||||
self._mqtt_picontrol = "{}/picontrol".format(basetopic)
|
self._mqtt_picontrol = "{}/picontrol".format(basetopic)
|
||||||
@@ -60,9 +62,45 @@ class MqttServer(Thread):
|
|||||||
self._mq.on_message = self._on_message
|
self._mq.on_message = self._on_message
|
||||||
# TODO: self._mq.on_disconnect = self._on_disconnect
|
# TODO: self._mq.on_disconnect = self._on_disconnect
|
||||||
|
|
||||||
|
def _get_procimglength(self):
|
||||||
|
"""Ermittelt aus piCtory Konfiguraiton die laenge.
|
||||||
|
@return Laenge des Prozessabbilds <class 'int'>"""
|
||||||
|
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):
|
def _on_connect(self, client, userdata, flags, rc):
|
||||||
"""Verbindung zu MQTT Broker."""
|
"""Verbindung zu MQTT Broker."""
|
||||||
print("Connect rc:", rc)
|
|
||||||
if rc > 0:
|
if rc > 0:
|
||||||
self.__mqttend = True
|
self.__mqttend = True
|
||||||
raise RuntimeError("can not connect to mqtt server")
|
raise RuntimeError("can not connect to mqtt server")
|
||||||
@@ -73,6 +111,7 @@ class MqttServer(Thread):
|
|||||||
def _on_message(self, client, userdata, msg):
|
def _on_message(self, client, userdata, msg):
|
||||||
"""Sendet piCtory Konfiguration."""
|
"""Sendet piCtory Konfiguration."""
|
||||||
|
|
||||||
|
# piCtory Konfiguration senden
|
||||||
with open(proginit.pargs.configrsc, "rb") as fh:
|
with open(proginit.pargs.configrsc, "rb") as fh:
|
||||||
client.publish(self._mqtt_pictory, fh.read())
|
client.publish(self._mqtt_pictory, fh.read())
|
||||||
|
|
||||||
@@ -105,8 +144,11 @@ class MqttServer(Thread):
|
|||||||
while not self.__exit:
|
while not self.__exit:
|
||||||
self._evt_data.clear()
|
self._evt_data.clear()
|
||||||
|
|
||||||
# FIXME: Ganzes Prozessabbild übertragen
|
# Prozessabbild mit Daten übertragen
|
||||||
self._mq.publish(self._mqtt_picontrol, fh_proc.read(4096))
|
self._mq.publish(
|
||||||
|
self._mqtt_picontrol,
|
||||||
|
fh_proc.read(self._procimglength)
|
||||||
|
)
|
||||||
fh_proc.seek(0)
|
fh_proc.seek(0)
|
||||||
|
|
||||||
self._evt_data.wait(self._sendinterval)
|
self._evt_data.wait(self._sendinterval)
|
||||||
|
|||||||
@@ -226,7 +226,12 @@ class RevPiPlc(Thread):
|
|||||||
# Prozess beenden
|
# Prozess beenden
|
||||||
count = 0
|
count = 0
|
||||||
proginit.logger.info("term plc program {}".format(self._program))
|
proginit.logger.info("term plc program {}".format(self._program))
|
||||||
|
try:
|
||||||
self._procplc.terminate()
|
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:
|
while self._procplc.poll() is None and count < 10:
|
||||||
count += 1
|
count += 1
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ begrenzt werden!
|
|||||||
"""
|
"""
|
||||||
import gzip
|
import gzip
|
||||||
import logsystem
|
import logsystem
|
||||||
import mqttserver
|
|
||||||
import picontrolserver
|
import picontrolserver
|
||||||
import plcsystem
|
import plcsystem
|
||||||
import proginit
|
import proginit
|
||||||
@@ -402,7 +401,8 @@ class RevPiPyLoad():
|
|||||||
th_plc = None
|
th_plc = None
|
||||||
if self.mqtt:
|
if self.mqtt:
|
||||||
try:
|
try:
|
||||||
th_plc = mqttserver.MqttServer(
|
from mqttserver import MqttServer
|
||||||
|
th_plc = MqttServer(
|
||||||
self.mqttbasetopic,
|
self.mqttbasetopic,
|
||||||
self.mqttsendinterval,
|
self.mqttsendinterval,
|
||||||
self.mqtthost,
|
self.mqtthost,
|
||||||
@@ -413,6 +413,7 @@ class RevPiPyLoad():
|
|||||||
self.mqttclient_id
|
self.mqttclient_id
|
||||||
)
|
)
|
||||||
except:
|
except:
|
||||||
|
# TODO: Fehlermeldung ausgeben bezüglich paho.mqtt
|
||||||
pass
|
pass
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad._plcmqtt()")
|
proginit.logger.debug("leave RevPiPyLoad._plcmqtt()")
|
||||||
@@ -553,8 +554,8 @@ class RevPiPyLoad():
|
|||||||
proginit.logger.info("start xmlrpc-server")
|
proginit.logger.info("start xmlrpc-server")
|
||||||
self.xsrv.start()
|
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()
|
self.th_mqtt.start()
|
||||||
|
|
||||||
if self.plcslave:
|
if self.plcslave:
|
||||||
@@ -599,9 +600,9 @@ class RevPiPyLoad():
|
|||||||
proginit.logger.info("stopping revpipyload")
|
proginit.logger.info("stopping revpipyload")
|
||||||
|
|
||||||
# Alle Sub-Systeme beenden
|
# Alle Sub-Systeme beenden
|
||||||
|
self.stop_plcprogram()
|
||||||
self.stop_plcmqtt()
|
self.stop_plcmqtt()
|
||||||
self.stop_plcslave()
|
self.stop_plcslave()
|
||||||
self.stop_plcprogram()
|
|
||||||
self.stop_xmlrpcserver()
|
self.stop_xmlrpcserver()
|
||||||
|
|
||||||
# Logreader schließen
|
# Logreader schließen
|
||||||
|
|||||||
Reference in New Issue
Block a user