introduce converter stuff

This commit is contained in:
Wolfgang Hottgenroth 2019-07-17 11:51:15 +02:00
parent 34ca87f734
commit b9e0fefe17
Signed by: wn
GPG Key ID: 6C1E5E531E0D5D7F
3 changed files with 29 additions and 6 deletions

11
src/Converters.py Normal file
View File

@ -0,0 +1,11 @@
# in: from Modbus to MQTT, input is a list of 16bit integers, output shall be the desired format
# to be sent in the MQTT message
# out: from MQTT to Modbus, input is the format received from MQTT, output shall be a list of
# 16bit integers to be written to the Modbus slave
Converters = {
"dht20TOFloat": {
"in": lambda x : float(x[0]) / 10.0,
"out": None
}
}

View File

@ -4,17 +4,18 @@ from pymodbus.exceptions import ModbusIOException
import MqttProcessor import MqttProcessor
import logging import logging
import json import json
import Converters
class DatapointException(Exception): pass class DatapointException(Exception): pass
class AbstractModbusDatapoint(object): class AbstractModbusDatapoint(object):
def __init__(self, label=None, unit=None, address=None, count=None, scanRate=None): def __init__(self, label=None, unit=None, address=None, count=None, scanRate=None, converter=None):
self.argList = ['label', 'unit', 'address', 'count', 'scanRate'] self.argList = ['label', 'unit', 'address', 'count', 'scanRate']
self.label = label self.label = label
self.unit = unit self.unit = unit
self.address = address self.address = address
self.count = count self.count = count
self.converter = None
if type(scanRate) == float: if type(scanRate) == float:
self.scanRate = datetime.timedelta(seconds=scanRate) self.scanRate = datetime.timedelta(seconds=scanRate)
else: else:
@ -31,10 +32,11 @@ class AbstractModbusDatapoint(object):
def __str__(self): def __str__(self):
return ("{0}, {1}: unit: {2}, address: {3}, count: {4}, scanRate: {5}, " return ("{0}, {1}: unit: {2}, address: {3}, count: {4}, scanRate: {5}, "
"enqueued: {6}, lastContact: {7}, errorCount: {8}, processCount: {9}" "enqueued: {6}, lastContact: {7}, errorCount: {8}, processCount: {9}, "
"converter: {10}"
.format(self.type, self.label, self.unit, self.address, self.count, .format(self.type, self.label, self.unit, self.address, self.count,
self.scanRate, self.enqueued, self.lastContact, self.scanRate, self.enqueued, self.lastContact,
self.errorCount, self.processCount)) self.errorCount, self.processCount, self.converter))
def jsonify(self): def jsonify(self):
return {'type':self.__class__.__name__, return {'type':self.__class__.__name__,
@ -126,8 +128,16 @@ class InputRegisterDatapoint(ReadOnlyDatapoint):
raise DatapointException(result) raise DatapointException(result)
if not self.updateOnly or (result.registers != self.lastValue): if not self.updateOnly or (result.registers != self.lastValue):
self.lastValue = result.registers self.lastValue = result.registers
logger.debug("{0}: {1!s}".format(self.label, result.registers)) logger.debug("{0}: {1!s}".format(self.label, result.registers))
pubQueue.put(MqttProcessor.PublishItem(self.publishTopic, str(result.registers))) value = None
if Converters.Converters[self.converter]['in']:
try:
value = Converters.Converters[self.converter]['in'](result.registers)
except Exception as e:
raise DatapointException("Exception caught when trying to converter modbus data: {0!s}".format(e))
else:
value = result.registers
pubQueue.put(MqttProcessor.PublishItem(self.publishTopic, str(value)))
self.lastContact = datetime.datetime.now() self.lastContact = datetime.datetime.now()

View File

@ -4,6 +4,7 @@
"address": 1, "address": 1,
"count": 1, "count": 1,
"label": "Temperature", "label": "Temperature",
"converter": "dht20TOFloat",
"publishTopic": "Pub/Temperature", "publishTopic": "Pub/Temperature",
"scanRate": null, "scanRate": null,
"unit": 5, "unit": 5,
@ -16,6 +17,7 @@
"address": 2, "address": 2,
"count": 1, "count": 1,
"label": "Humidity", "label": "Humidity",
"converter": "dht20TOFloat",
"publishTopic": "Pub/Humidity", "publishTopic": "Pub/Humidity",
"scanRate": null, "scanRate": null,
"unit": 5, "unit": 5,