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:
2018-09-06 12:38:57 +02:00
parent 54b2dfbe44
commit 46fb7cc7fc
4 changed files with 67 additions and 34 deletions

View File

@@ -29,7 +29,7 @@ basetopic = revpi01
sendinterval = 30
send_on_event = 0
write_outputs = 0
host =
broker_address = localhost
port = 1883
tls_set = 0
username =

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- 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 -->
<Project version="5.1">
<Language>en_US</Language>
@@ -23,6 +23,7 @@
<Source>revpipyload/proginit.py</Source>
<Source>revpipyload/revpipyload.py</Source>
<Source>revpipyload/shared/__init__.py</Source>
<Source>revpipyload/shared/ipaclmanager.py</Source>
<Source>revpipyload/xrpcserver.py</Source>
<Source>setup.py</Source>
</Sources>

View File

@@ -6,7 +6,7 @@ __license__ = "GPLv3"
import proginit
import revpimodio2
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 threading import Thread, Event
@@ -16,14 +16,14 @@ class MqttServer(Thread):
"""Server fuer die Uebertragung des Prozessabbilds per MQTT."""
def __init__(
self, basetopic, sendinterval, host, port=1883,
self, basetopic, sendinterval, broker_address, port=1883,
tls_set=False, username="", password=None, client_id="",
send_events=False, write_outputs=False):
"""Init MqttServer class.
@param basetopic Basis-Topic fuer Datenaustausch
@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 tls_set TLS fuer Verbindung zum MQTT-Server verwenden
@param username Optional Benutzername fuer MQTT-Server
@@ -37,10 +37,12 @@ class MqttServer(Thread):
raise ValueError("parameter topic must be <class 'str'>")
if not (isinstance(sendinterval, int) and sendinterval > 0):
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):
raise ValueError(
"parameter sendinterval must be <class 'int'> and 1 - 65535"
@@ -64,7 +66,7 @@ class MqttServer(Thread):
self.__exit = False
self._evt_data = Event()
self._exported_ios = []
self._host = host
self._broker_address = broker_address
self._port = port
self._reloadmodio = False
self._rpi = None
@@ -155,8 +157,8 @@ class MqttServer(Thread):
"""Verbindung zu MQTT Broker."""
if rc > 0:
proginit.logger.warning(
"can not connect to mqtt broker - error {0} - will retry"
"".format(rc)
"can not connect to mqtt broker '{0}' - error '{1}' - "
"will retry".format(self._broker_address, connack_string(rc))
)
else:
# Subscribe piCtory Anforderung
@@ -184,6 +186,7 @@ class MqttServer(Thread):
try:
io = self._rpi_write.io[ioname]
io_needbytes = type(io.value) == bytes
except Exception:
proginit.logger.error(
"can not find io '{0}' for MQTT".format(ioname)
@@ -207,9 +210,21 @@ class MqttServer(Thread):
if value.isdecimal():
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
elif value == "true":
elif value == "true" and not io_needbytes:
value = 1
else:
proginit.logger.error(
@@ -220,8 +235,15 @@ class MqttServer(Thread):
# Write Value to RevPi
io._parentdevice.syncoutputs()
io.value = value
io._parentdevice.writeprocimg()
try:
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):
"""Sendet piCtory Konfiguration per MQTT."""
@@ -248,7 +270,13 @@ class MqttServer(Thread):
proginit.logger.debug("enter MqttServer.run()")
# 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()
# mainloop

View File

@@ -107,8 +107,8 @@ class RevPiPyLoad():
self.globalconfig["MQTT"].get("basetopic", "") or
self.mqttsendinterval !=
self.globalconfig["MQTT"].getint("sendinterval", 30) or
self.mqtthost !=
self.globalconfig["MQTT"].get("host", "") or
self.mqttbroker_address !=
self.globalconfig["MQTT"].get("broker_address", "localhost") or
self.mqttport !=
self.globalconfig["MQTT"].getint("port", 1883) or
self.mqtttls_set !=
@@ -225,8 +225,8 @@ class RevPiPyLoad():
self.globalconfig["MQTT"].get("basetopic", "")
self.mqttsendinterval = \
self.globalconfig["MQTT"].getint("sendinterval", 30)
self.mqtthost = \
self.globalconfig["MQTT"].get("host", "")
self.mqttbroker_address = \
self.globalconfig["MQTT"].get("broker_address", "localhost")
self.mqttport = \
self.globalconfig["MQTT"].getint("port", 1883)
self.mqtttls_set = \
@@ -450,18 +450,6 @@ class RevPiPyLoad():
if self.mqtt:
try:
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:
proginit.logger.warning(
"can not load revpimodio2 module. maybe its not installed "
@@ -469,6 +457,22 @@ class RevPiPyLoad():
"like to use the mqtt feature, update/install "
"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()")
return th_plc
@@ -753,7 +757,7 @@ class RevPiPyLoad():
dc["mqtt"] = self.mqtt
dc["mqttbasetopic"] = self.mqttbasetopic
dc["mqttsendinterval"] = self.mqttsendinterval
dc["mqtthost"] = self.mqtthost
dc["mqttbroker_address"] = self.mqttbroker_address
dc["mqttport"] = self.mqttport
dc["mqtttls_set"] = self.mqtttls_set
dc["mqttusername"] = self.mqttusername
@@ -988,7 +992,7 @@ class RevPiPyLoad():
"mqtt": "[01]",
"mqttbasetopic": ".*",
"mqttsendinterval": "[0-9]+",
"mqtthost": ".+",
"mqttbroker_address": ".+",
"mqttport": "[0-9]+",
"mqtttls_set": "[01]",
"mqttusername": ".*",