From 2460f570d8e1b00fd0450e4f0cd20416848b9d0a Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Wed, 17 Jul 2019 14:49:01 +0200 Subject: [PATCH] another converter --- src/Converters.py | 7 +++++++ src/RegisterDatapoint.py | 24 +++++++++++++++++++++--- src/registers.json | 4 ++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Converters.py b/src/Converters.py index a79af12..8870fc6 100644 --- a/src/Converters.py +++ b/src/Converters.py @@ -3,9 +3,16 @@ # 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 +import struct + + Converters = { "dht20TOFloat": { "in": lambda x : float(x[0]) / 10.0, "out": None + }, + "uint32": { + "in": lambda x : struct.unpack('I', x)[0], + "out": lambda x : struct.pack('I', x) } } \ No newline at end of file diff --git a/src/RegisterDatapoint.py b/src/RegisterDatapoint.py index e13e2c7..b12d8c8 100644 --- a/src/RegisterDatapoint.py +++ b/src/RegisterDatapoint.py @@ -71,10 +71,19 @@ class HoldingRegisterDatapoint(AbstractModbusDatapoint): # perform write operation logger.debug("Holding register, perform write operation") self.processCount += 1 - v = int(self.writeRequestValue) + values = None + logger.debug("{0}: raw: {1!s}".format(self.label, self.writeRequestValue)) + if self.converter and Converters.Converters[self.converter]['out']: + try: + values = Converters.Converters[self.converter]['out'](self.writeRequestValue) + logger.debug("{0}: converted: {1!s}".format(self.label, values)) + except Exception as e: + raise DatapointException("Exception caught when trying to converter modbus data: {0!s}".format(e)) + else: + values = [int(self.writeRequestValue)] result = client.write_registers(address=self.address, unit=self.unit, - values=[v]) + values=values) logger.debug("Write result: {0!s}".format(result)) self.writeRequestValue = None else: @@ -88,7 +97,16 @@ class HoldingRegisterDatapoint(AbstractModbusDatapoint): self.errorCount += 1 raise DatapointException(result) logger.debug("{0}: {1!s}".format(self.label, result.registers)) - pubQueue.put(MqttProcessor.PublishItem(self.publishTopic, str(result.registers))) + value = None + if self.converter and Converters.Converters[self.converter]['in']: + try: + value = Converters.Converters[self.converter]['in'](result.registers) + logger.debug("{0}: converted: {1!s}".format(self.label, value)) + 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() def onMessage(self, value): diff --git a/src/registers.json b/src/registers.json index 9de77d6..2016041 100644 --- a/src/registers.json +++ b/src/registers.json @@ -43,6 +43,7 @@ "count": 2, "feedbackTopic": null, "label": "Counter1", + "converter": "uint32", "publishTopic": "Pub/Counter1", "scanRate": null, "subscribeTopic": null, @@ -56,6 +57,7 @@ "count": 2, "feedbackTopic": null, "label": "Counter2", + "converter": "uint32", "publishTopic": "Pub/Counter2", "scanRate": null, "subscribeTopic": null, @@ -69,6 +71,7 @@ "count": 2, "feedbackTopic": null, "label": "Counter3", + "converter": "uint32", "publishTopic": "Pub/Counter3", "scanRate": null, "subscribeTopic": null, @@ -82,6 +85,7 @@ "count": 2, "feedbackTopic": null, "label": "Counter4", + "converter": "uint32", "publishTopic": "Pub/Counter4", "scanRate": 1.0, "subscribeTopic": null,