mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
Auch Outputs für bytes per MQTT ermöglichen
Fehlermeldungen für MQTT verbessert MQTT Parameter host auf broker_address mit localhost als default geändert
This commit is contained in:
@@ -29,7 +29,7 @@ basetopic = revpi01
|
|||||||
sendinterval = 30
|
sendinterval = 30
|
||||||
send_on_event = 0
|
send_on_event = 0
|
||||||
write_outputs = 0
|
write_outputs = 0
|
||||||
host =
|
broker_address = localhost
|
||||||
port = 1883
|
port = 1883
|
||||||
tls_set = 0
|
tls_set = 0
|
||||||
username =
|
username =
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
|
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
|
||||||
<!-- eric project file for project revpipyload -->
|
<!-- eric project file for project revpipyload -->
|
||||||
<!-- Saved: 2018-09-03, 13:58:07 -->
|
<!-- Saved: 2018-09-06, 12:14:06 -->
|
||||||
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
|
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
|
||||||
<Project version="5.1">
|
<Project version="5.1">
|
||||||
<Language>en_US</Language>
|
<Language>en_US</Language>
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
<Source>revpipyload/proginit.py</Source>
|
<Source>revpipyload/proginit.py</Source>
|
||||||
<Source>revpipyload/revpipyload.py</Source>
|
<Source>revpipyload/revpipyload.py</Source>
|
||||||
<Source>revpipyload/shared/__init__.py</Source>
|
<Source>revpipyload/shared/__init__.py</Source>
|
||||||
|
<Source>revpipyload/shared/ipaclmanager.py</Source>
|
||||||
<Source>revpipyload/xrpcserver.py</Source>
|
<Source>revpipyload/xrpcserver.py</Source>
|
||||||
<Source>setup.py</Source>
|
<Source>setup.py</Source>
|
||||||
</Sources>
|
</Sources>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ __license__ = "GPLv3"
|
|||||||
import proginit
|
import proginit
|
||||||
import revpimodio2
|
import revpimodio2
|
||||||
from os.path import join
|
from os.path import join
|
||||||
from paho.mqtt.client import Client
|
from paho.mqtt.client import Client, connack_string
|
||||||
from ssl import CERT_NONE
|
from ssl import CERT_NONE
|
||||||
from threading import Thread, Event
|
from threading import Thread, Event
|
||||||
|
|
||||||
@@ -16,14 +16,14 @@ class MqttServer(Thread):
|
|||||||
"""Server fuer die Uebertragung des Prozessabbilds per MQTT."""
|
"""Server fuer die Uebertragung des Prozessabbilds per MQTT."""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, basetopic, sendinterval, host, port=1883,
|
self, basetopic, sendinterval, broker_address, port=1883,
|
||||||
tls_set=False, username="", password=None, client_id="",
|
tls_set=False, username="", password=None, client_id="",
|
||||||
send_events=False, write_outputs=False):
|
send_events=False, write_outputs=False):
|
||||||
"""Init MqttServer class.
|
"""Init MqttServer class.
|
||||||
|
|
||||||
@param basetopic Basis-Topic fuer Datenaustausch
|
@param basetopic Basis-Topic fuer Datenaustausch
|
||||||
@param sendinterval Prozessabbild alle n Sekunden senden
|
@param sendinterval Prozessabbild alle n Sekunden senden
|
||||||
@param host Adresse <class 'str'> des MQTT-Servers
|
@param broker_address Adresse <class 'str'> des MQTT-Servers
|
||||||
@param port Portnummer <class 'int'> des MQTT-Servers
|
@param port Portnummer <class 'int'> des MQTT-Servers
|
||||||
@param tls_set TLS fuer Verbindung zum MQTT-Server verwenden
|
@param tls_set TLS fuer Verbindung zum MQTT-Server verwenden
|
||||||
@param username Optional Benutzername fuer MQTT-Server
|
@param username Optional Benutzername fuer MQTT-Server
|
||||||
@@ -37,10 +37,12 @@ class MqttServer(Thread):
|
|||||||
raise ValueError("parameter topic must be <class 'str'>")
|
raise ValueError("parameter topic must be <class 'str'>")
|
||||||
if not (isinstance(sendinterval, int) and sendinterval > 0):
|
if not (isinstance(sendinterval, int) and sendinterval > 0):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"parameter sendinterval must be <class 'int'> and gt 0"
|
"parameter sendinterval must be <class 'int'> and > 0"
|
||||||
|
)
|
||||||
|
if not (isinstance(broker_address, str) and broker_address != ""):
|
||||||
|
raise ValueError(
|
||||||
|
"parameter broker_address must be <class 'str'> and not empty"
|
||||||
)
|
)
|
||||||
if not isinstance(host, str):
|
|
||||||
raise ValueError("parameter host must be <class 'str'>")
|
|
||||||
if not (isinstance(port, int) and 0 < port < 65535):
|
if not (isinstance(port, int) and 0 < port < 65535):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"parameter sendinterval must be <class 'int'> and 1 - 65535"
|
"parameter sendinterval must be <class 'int'> and 1 - 65535"
|
||||||
@@ -64,7 +66,7 @@ class MqttServer(Thread):
|
|||||||
self.__exit = False
|
self.__exit = False
|
||||||
self._evt_data = Event()
|
self._evt_data = Event()
|
||||||
self._exported_ios = []
|
self._exported_ios = []
|
||||||
self._host = host
|
self._broker_address = broker_address
|
||||||
self._port = port
|
self._port = port
|
||||||
self._reloadmodio = False
|
self._reloadmodio = False
|
||||||
self._rpi = None
|
self._rpi = None
|
||||||
@@ -155,8 +157,8 @@ class MqttServer(Thread):
|
|||||||
"""Verbindung zu MQTT Broker."""
|
"""Verbindung zu MQTT Broker."""
|
||||||
if rc > 0:
|
if rc > 0:
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
"can not connect to mqtt broker - error {0} - will retry"
|
"can not connect to mqtt broker '{0}' - error '{1}' - "
|
||||||
"".format(rc)
|
"will retry".format(self._broker_address, connack_string(rc))
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# Subscribe piCtory Anforderung
|
# Subscribe piCtory Anforderung
|
||||||
@@ -184,6 +186,7 @@ class MqttServer(Thread):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
io = self._rpi_write.io[ioname]
|
io = self._rpi_write.io[ioname]
|
||||||
|
io_needbytes = type(io.value) == bytes
|
||||||
except Exception:
|
except Exception:
|
||||||
proginit.logger.error(
|
proginit.logger.error(
|
||||||
"can not find io '{0}' for MQTT".format(ioname)
|
"can not find io '{0}' for MQTT".format(ioname)
|
||||||
@@ -207,9 +210,21 @@ class MqttServer(Thread):
|
|||||||
|
|
||||||
if value.isdecimal():
|
if value.isdecimal():
|
||||||
value = int(value)
|
value = int(value)
|
||||||
elif value == "false":
|
|
||||||
|
# Muss eine Byteumwandlung vorgenommen werden?
|
||||||
|
if io_needbytes:
|
||||||
|
try:
|
||||||
|
value = value.to_bytes(io.length, io.byteorder)
|
||||||
|
except OverflowError:
|
||||||
|
proginit.logger.error(
|
||||||
|
"can not convert value '{0}' to fitting bytes"
|
||||||
|
"".format(value)
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
elif value == "false" and not io_needbytes:
|
||||||
value = 0
|
value = 0
|
||||||
elif value == "true":
|
elif value == "true" and not io_needbytes:
|
||||||
value = 1
|
value = 1
|
||||||
else:
|
else:
|
||||||
proginit.logger.error(
|
proginit.logger.error(
|
||||||
@@ -220,8 +235,15 @@ class MqttServer(Thread):
|
|||||||
|
|
||||||
# Write Value to RevPi
|
# Write Value to RevPi
|
||||||
io._parentdevice.syncoutputs()
|
io._parentdevice.syncoutputs()
|
||||||
io.value = value
|
try:
|
||||||
io._parentdevice.writeprocimg()
|
io.value = value
|
||||||
|
except Exception:
|
||||||
|
proginit.logger.error(
|
||||||
|
"could not write '{0}' to Output '{1}'"
|
||||||
|
"".format(value, ioname)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
io._parentdevice.writeprocimg()
|
||||||
|
|
||||||
def _send_pictory_conf(self):
|
def _send_pictory_conf(self):
|
||||||
"""Sendet piCtory Konfiguration per MQTT."""
|
"""Sendet piCtory Konfiguration per MQTT."""
|
||||||
@@ -248,7 +270,13 @@ class MqttServer(Thread):
|
|||||||
proginit.logger.debug("enter MqttServer.run()")
|
proginit.logger.debug("enter MqttServer.run()")
|
||||||
|
|
||||||
# MQTT verbinden
|
# MQTT verbinden
|
||||||
self._mq.connect_async(self._host, self._port, keepalive=60)
|
try:
|
||||||
|
self._mq.connect(self._broker_address, self._port, keepalive=60)
|
||||||
|
except Exception:
|
||||||
|
self._on_connect(self._mq, None, None, 3)
|
||||||
|
self._mq.connect_async(
|
||||||
|
self._broker_address, self._port, keepalive=60
|
||||||
|
)
|
||||||
self._mq.loop_start()
|
self._mq.loop_start()
|
||||||
|
|
||||||
# mainloop
|
# mainloop
|
||||||
|
|||||||
@@ -107,8 +107,8 @@ class RevPiPyLoad():
|
|||||||
self.globalconfig["MQTT"].get("basetopic", "") or
|
self.globalconfig["MQTT"].get("basetopic", "") or
|
||||||
self.mqttsendinterval !=
|
self.mqttsendinterval !=
|
||||||
self.globalconfig["MQTT"].getint("sendinterval", 30) or
|
self.globalconfig["MQTT"].getint("sendinterval", 30) or
|
||||||
self.mqtthost !=
|
self.mqttbroker_address !=
|
||||||
self.globalconfig["MQTT"].get("host", "") or
|
self.globalconfig["MQTT"].get("broker_address", "localhost") or
|
||||||
self.mqttport !=
|
self.mqttport !=
|
||||||
self.globalconfig["MQTT"].getint("port", 1883) or
|
self.globalconfig["MQTT"].getint("port", 1883) or
|
||||||
self.mqtttls_set !=
|
self.mqtttls_set !=
|
||||||
@@ -225,8 +225,8 @@ class RevPiPyLoad():
|
|||||||
self.globalconfig["MQTT"].get("basetopic", "")
|
self.globalconfig["MQTT"].get("basetopic", "")
|
||||||
self.mqttsendinterval = \
|
self.mqttsendinterval = \
|
||||||
self.globalconfig["MQTT"].getint("sendinterval", 30)
|
self.globalconfig["MQTT"].getint("sendinterval", 30)
|
||||||
self.mqtthost = \
|
self.mqttbroker_address = \
|
||||||
self.globalconfig["MQTT"].get("host", "")
|
self.globalconfig["MQTT"].get("broker_address", "localhost")
|
||||||
self.mqttport = \
|
self.mqttport = \
|
||||||
self.globalconfig["MQTT"].getint("port", 1883)
|
self.globalconfig["MQTT"].getint("port", 1883)
|
||||||
self.mqtttls_set = \
|
self.mqtttls_set = \
|
||||||
@@ -450,18 +450,6 @@ class RevPiPyLoad():
|
|||||||
if self.mqtt:
|
if self.mqtt:
|
||||||
try:
|
try:
|
||||||
from mqttserver import MqttServer
|
from mqttserver import MqttServer
|
||||||
th_plc = MqttServer(
|
|
||||||
self.mqttbasetopic,
|
|
||||||
self.mqttsendinterval,
|
|
||||||
self.mqtthost,
|
|
||||||
self.mqttport,
|
|
||||||
self.mqtttls_set,
|
|
||||||
self.mqttusername,
|
|
||||||
self.mqttpassword,
|
|
||||||
self.mqttclient_id,
|
|
||||||
self.mqttsend_events,
|
|
||||||
self.mqttwrite_outputs,
|
|
||||||
)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
proginit.logger.warning(
|
proginit.logger.warning(
|
||||||
"can not load revpimodio2 module. maybe its not installed "
|
"can not load revpimodio2 module. maybe its not installed "
|
||||||
@@ -469,6 +457,22 @@ class RevPiPyLoad():
|
|||||||
"like to use the mqtt feature, update/install "
|
"like to use the mqtt feature, update/install "
|
||||||
"revpimodio2: 'apt-get install python3-revpimodio2'"
|
"revpimodio2: 'apt-get install python3-revpimodio2'"
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
th_plc = MqttServer(
|
||||||
|
self.mqttbasetopic,
|
||||||
|
self.mqttsendinterval,
|
||||||
|
self.mqttbroker_address,
|
||||||
|
self.mqttport,
|
||||||
|
self.mqtttls_set,
|
||||||
|
self.mqttusername,
|
||||||
|
self.mqttpassword,
|
||||||
|
self.mqttclient_id,
|
||||||
|
self.mqttsend_events,
|
||||||
|
self.mqttwrite_outputs,
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
proginit.logger.error(e)
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad._plcmqtt()")
|
proginit.logger.debug("leave RevPiPyLoad._plcmqtt()")
|
||||||
return th_plc
|
return th_plc
|
||||||
@@ -753,7 +757,7 @@ class RevPiPyLoad():
|
|||||||
dc["mqtt"] = self.mqtt
|
dc["mqtt"] = self.mqtt
|
||||||
dc["mqttbasetopic"] = self.mqttbasetopic
|
dc["mqttbasetopic"] = self.mqttbasetopic
|
||||||
dc["mqttsendinterval"] = self.mqttsendinterval
|
dc["mqttsendinterval"] = self.mqttsendinterval
|
||||||
dc["mqtthost"] = self.mqtthost
|
dc["mqttbroker_address"] = self.mqttbroker_address
|
||||||
dc["mqttport"] = self.mqttport
|
dc["mqttport"] = self.mqttport
|
||||||
dc["mqtttls_set"] = self.mqtttls_set
|
dc["mqtttls_set"] = self.mqtttls_set
|
||||||
dc["mqttusername"] = self.mqttusername
|
dc["mqttusername"] = self.mqttusername
|
||||||
@@ -988,7 +992,7 @@ class RevPiPyLoad():
|
|||||||
"mqtt": "[01]",
|
"mqtt": "[01]",
|
||||||
"mqttbasetopic": ".*",
|
"mqttbasetopic": ".*",
|
||||||
"mqttsendinterval": "[0-9]+",
|
"mqttsendinterval": "[0-9]+",
|
||||||
"mqtthost": ".+",
|
"mqttbroker_address": ".+",
|
||||||
"mqttport": "[0-9]+",
|
"mqttport": "[0-9]+",
|
||||||
"mqtttls_set": "[01]",
|
"mqtttls_set": "[01]",
|
||||||
"mqttusername": ".*",
|
"mqttusername": ".*",
|
||||||
|
|||||||
Reference in New Issue
Block a user