mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 23:23: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
|
||||
send_on_event = 0
|
||||
write_outputs = 0
|
||||
host =
|
||||
broker_address = localhost
|
||||
port = 1883
|
||||
tls_set = 0
|
||||
username =
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": ".*",
|
||||
|
||||
Reference in New Issue
Block a user