diff --git a/data/etc/revpipyload/revpipyload.conf b/data/etc/revpipyload/revpipyload.conf index 01a397c..bb333f5 100644 --- a/data/etc/revpipyload/revpipyload.conf +++ b/data/etc/revpipyload/revpipyload.conf @@ -25,7 +25,7 @@ bindip = * [MQTT] mqtt = 0 -basetopic = revpi/data +basetopic = revpi01 sendinterval = 30 send_on_event = 0 write_outputs = 0 diff --git a/doc/revpipyload.html b/doc/revpipyload.html index b3e1c28..7f120ae 100644 --- a/doc/revpipyload.html +++ b/doc/revpipyload.html @@ -80,6 +80,9 @@ Methods RevPiPyLoad Instantiiert RevPiPyLoad-Klasse. +_check_mustrestart_mqtt +Prueft ob sich kritische Werte veraendert haben. + _check_mustrestart_plcprogram Prueft ob sich kritische Werte veraendert haben. @@ -206,7 +209,18 @@ RevPiPyLoad (Constructor) RevPiPyLoad()

Instantiiert RevPiPyLoad-Klasse. -

+

+

+RevPiPyLoad._check_mustrestart_mqtt

+_check_mustrestart_mqtt() +

+Prueft ob sich kritische Werte veraendert haben. +

+
Returns:
+
+True, wenn Subsystemneustart noetig ist +
+

RevPiPyLoad._check_mustrestart_plcprogram

_check_mustrestart_plcprogram() diff --git a/eric-revpipyload.api b/eric-revpipyload.api index c025233..fc623f6 100644 --- a/eric-revpipyload.api +++ b/eric-revpipyload.api @@ -81,6 +81,7 @@ proginit.pargs?7 proginit.picontrolreset?7 proginit.rapcatalog?7 proginit.startdir?7 +revpipyload.RevPiPyLoad._check_mustrestart_mqtt?5() revpipyload.RevPiPyLoad._check_mustrestart_plcprogram?5() revpipyload.RevPiPyLoad._check_mustrestart_plcslave?5() revpipyload.RevPiPyLoad._loadconfig?5() diff --git a/revpipyload.e4p b/revpipyload.e4p index 477f006..9a928d6 100644 --- a/revpipyload.e4p +++ b/revpipyload.e4p @@ -1,7 +1,7 @@ - + en_US @@ -16,13 +16,13 @@ revpipyload/helper.py revpipyload/logsystem.py + revpipyload/mqttserver.py revpipyload/picontrolserver.py revpipyload/plcsystem.py revpipyload/procimgserver.py revpipyload/proginit.py revpipyload/revpipyload.py revpipyload/shared/__init__.py - revpipyload/mqttserver.py revpipyload/xrpcserver.py setup.py @@ -163,6 +163,7 @@ demo + paho @@ -215,6 +216,7 @@ deb dist demo + paho diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index 0d077af..0a288ef 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -28,7 +28,7 @@ begrenzt werden! __author__ = "Sven Sager" __copyright__ = "Copyright (C) 2018 Sven Sager" __license__ = "GPLv3" -__version__ = "0.6.8" +__version__ = "0.7.0" import gzip import logsystem import picontrolserver @@ -69,7 +69,6 @@ class RevPiPyLoad(): self.evt_loadconfig = Event() self.globalconfig = ConfigParser() self.logr = logsystem.LogReader() - self.tfile = {} self.xsrv = None self.xml_ps = None @@ -78,7 +77,7 @@ class RevPiPyLoad(): self.xmlrpcacl = IpAclManager(minlevel=0, maxlevel=4) # Threads/Prozesse - self.th_mqtt = None + self.th_plcmqtt = None self.th_plcslave = None self.plc = None @@ -93,6 +92,39 @@ class RevPiPyLoad(): proginit.logger.debug("leave RevPiPyLoad.__init__()") + def _check_mustrestart_mqtt(self): + """Prueft ob sich kritische Werte veraendert haben. + @return True, wenn Subsystemneustart noetig ist""" + if self.th_plcmqtt is None: + return True + elif "MQTT" not in self.globalconfig: + return True + else: + return ( + self.mqtt != + self.globalconfig["MQTT"].getboolean("mqtt", False) or + self.mqttbasetopic != + self.globalconfig["MQTT"].get("basetopic", "") or + self.mqttsendinterval != + self.globalconfig["MQTT"].getint("sendinterval", 30) or + self.mqtthost != + self.globalconfig["MQTT"].get("host", "") or + self.mqttport != + self.globalconfig["MQTT"].getint("port", 1883) or + self.mqtttls_set != + self.globalconfig["MQTT"].getboolean("tls_set", False) or + self.mqttusername != + self.globalconfig["MQTT"].get("username", "") or + self.mqttpassword != + self.globalconfig["MQTT"].get("password", "") or + self.mqttclient_id != + self.globalconfig["MQTT"].get("client_id", "") or + self.mqttsend_events != + self.globalconfig["MQTT"].getboolean("send_on_event", False) or + self.mqttwrite_outputs != + self.globalconfig["MQTT"].getboolean("write_outputs", False) + ) + def _check_mustrestart_plcslave(self): """Prueft ob sich kritische Werte veraendert haben. @return True, wenn Subsystemneustart noetig ist""" @@ -145,7 +177,6 @@ class RevPiPyLoad(): proginit.logger.debug("enter RevPiPyLoad._loadconfig()") # Subsysteme herunterfahren - self.stop_plcmqtt() self.stop_xmlrpcserver() # Konfigurationsdatei laden @@ -155,6 +186,7 @@ class RevPiPyLoad(): self.globalconfig.read(proginit.globalconffile) # Merker für Subsystem-Neustart nach laden, vor setzen + restart_plcmqtt = self._check_mustrestart_mqtt() restart_plcslave = self._check_mustrestart_plcslave() restart_plcprogram = self._check_mustrestart_plcprogram() @@ -192,7 +224,7 @@ class RevPiPyLoad(): self.mqttbasetopic = \ self.globalconfig["MQTT"].get("basetopic", "") self.mqttsendinterval = \ - self.globalconfig["MQTT"].getint("sendinterval", 15) + self.globalconfig["MQTT"].getint("sendinterval", 30) self.mqtthost = \ self.globalconfig["MQTT"].get("host", "") self.mqttport = \ @@ -267,10 +299,13 @@ class RevPiPyLoad(): os.chdir(self.plcworkdir) # MQTT konfigurieren - self.th_mqtt = self._plcmqtt() - if self.th_mqtt is not None and not self._exit: - proginit.logger.info("start mqtt publisher") - self.th_mqtt.start() + if restart_plcmqtt: + self.stop_plcmqtt() + self.th_plcmqtt = self._plcmqtt() + + if not self._exit and self.th_plcmqtt is not None: + proginit.logger.info("restart mqtt publisher after reload") + self.th_plcmqtt.start() # PLC Programm konfigurieren if restart_plcprogram: @@ -574,8 +609,8 @@ class RevPiPyLoad(): self.xsrv.start() # MQTT Uebertragung starten - if self.th_mqtt is not None: - self.th_mqtt.start() + if self.th_plcmqtt is not None: + self.th_plcmqtt.start() # Slaveausfuehrung übergeben if self.th_plcslave is not None: @@ -593,7 +628,15 @@ class RevPiPyLoad(): proginit.logger.info("got reqeust to reload config") self._loadconfig() - # TODO: MQTT prüfen und neu starten + # MQTT Publisher Thread prüfen + if self.mqtt and self.th_plcmqtt is not None \ + and not self.th_plcmqtt.is_alive(): + proginit.logger.warning( + "restart mqtt publisher after thread was not running" + ) + self.th_plcmqtt = self._plcmqtt() + if self.th_plcmqtt is not None: + self.th_plcmqtt.start() # PLC Server Thread prüfen if self.plcslave and self.th_plcslave is not None \ @@ -610,6 +653,11 @@ class RevPiPyLoad(): proginit.logger.warning("piCtory configuration was changed") self.pictorymtime = os.path.getmtime(proginit.pargs.configrsc) + # MQTT Publisher neu laden + if self.mqtt and self.th_plcmqtt is not None: + self.th_plcmqtt.reload_revpimodio() + + # XML Prozessabbildserver neu laden if self.xml_ps is not None: self.xml_psstop() self.xml_ps.loadrevpimodio() @@ -639,10 +687,10 @@ class RevPiPyLoad(): """Beendet MQTT Sender.""" proginit.logger.debug("enter RevPiPyLoad.stop_plcmqtt()") - if self.th_mqtt is not None and self.th_mqtt.is_alive(): + if self.th_plcmqtt is not None and self.th_plcmqtt.is_alive(): proginit.logger.info("stopping mqtt thread") - self.th_mqtt.stop() - self.th_mqtt.join() + self.th_plcmqtt.stop() + self.th_plcmqtt.join() proginit.logger.debug("mqtt thread successfully closed") proginit.logger.debug("leave RevPiPyLoad.stop_plcmqtt()") @@ -703,16 +751,16 @@ class RevPiPyLoad(): # 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 - dc["send_events"] = self.mqttsend_events - dc["write_outputs"] = self.mqttwrite_outputs + dc["mqttbasetopic"] = self.mqttbasetopic + dc["mqttsendinterval"] = self.mqttsendinterval + dc["mqtthost"] = self.mqtthost + dc["mqttport"] = self.mqttport + dc["mqtttls_set"] = self.mqtttls_set + dc["mqttusername"] = self.mqttusername + dc["mqttpassword"] = self.mqttpassword + dc["mqttclient_id"] = self.mqttclient_id + dc["mqttsend_events"] = self.mqttsend_events + dc["mqttwrite_outputs"] = self.mqttwrite_outputs # PLCSLAVE Sektion dc["plcslave"] = self.plcslave @@ -758,8 +806,8 @@ class RevPiPyLoad(): """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() + return False if self.th_plcmqtt is None \ + else self.th_plcmqtt.is_alive() def xml_mqttstart(self): """Startet die MQTT Uebertragung. @@ -770,22 +818,22 @@ class RevPiPyLoad(): -2: Laeuft bereits """ - if self.th_mqtt is not None and self.th_mqtt.is_alive(): + if self.th_plcmqtt is not None and self.th_plcmqtt.is_alive(): return -2 else: - self.th_mqtt = self._plcmqtt() - if self.th_mqtt is None: + self.th_plcmqtt = self._plcmqtt() + if self.th_plcmqtt is None: return -1 else: - self.th_mqtt.start() + self.th_plcmqtt.start() return 0 def xml_mqttstop(self): """Stoppt die MQTT Uebertragung. @return True, wenn stop erfolgreich""" - if self.th_mqtt is not None: + if self.th_plcmqtt is not None: self.stop_plcmqtt() - self.th_mqtt = None + self.th_plcmqtt = None return True else: return False @@ -945,7 +993,7 @@ class RevPiPyLoad(): "mqtttls_set": "[01]", "mqttusername": ".*", "mqttpassword": ".*", - "mqttclient_id": ".+", + "mqttclient_id": ".*", "mqttsend_events": "[01]", "mqttwrite_outputs": "[01]", }, diff --git a/setup.py b/setup.py index 91e6ec8..f7ad38a 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,8 @@ setup( ]), ("share/revpipyload", glob("revpipyload/*.*")), ("share/revpipyload/shared", glob("revpipyload/shared/*.*")), + ("share/revpipyload/paho", ["revpipyload/paho/__init__.py"]), + ("share/revpipyload/paho/mqtt", glob("revpipyload/paho/mqtt/*.*")), ("/var/lib/revpipyload", [ "data/var/lib/revpipyload/.placeholder", ])