From 4200aaf30441d78545e6ff10c77141b101d0ca1f Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Wed, 17 Jul 2019 16:47:14 +0200 Subject: [PATCH] coil --- src/RegisterDatapoint.py | 59 ++++++++++++++++++++++++++++++++++++++++ src/registers.json | 12 ++++++++ 2 files changed, 71 insertions(+) diff --git a/src/RegisterDatapoint.py b/src/RegisterDatapoint.py index 540a2b2..c40d51f 100644 --- a/src/RegisterDatapoint.py +++ b/src/RegisterDatapoint.py @@ -114,6 +114,65 @@ class HoldingRegisterDatapoint(AbstractModbusDatapoint): self.writeRequestValue = value +class CoilDatapoint(AbstractModbusDatapoint): + def __init__(self, label=None, unit=None, address=None, scanRate=None, publishTopic=None, subscribeTopic=None, + feedbackTopic=None): + super().__init__(label, unit, address, 1, scanRate, None) + self.argList = ['label', 'unit','address','scanRate','publishTopic', 'subscribeTopic', 'feedbackTopic'] + self.publishTopic = publishTopic + self.subscribeTopic = subscribeTopic + self.feedbackTopic = feedbackTopic + self.writeRequestValue = None + self.type = 'coil' + + def __str__(self): + return ("{0}, {1}: unit: {2}, address: {3}, scanRate: {4}, " + "enqueued: {5}, lastContact: {6}, errorCount: {7}, processCount: {8}, " + "publishTopic: {9}, subscribeTopic: {10}, feedbackTopic: {11}" + .format(self.type, self.label, self.unit, self.address, + self.scanRate, self.enqueued, self.lastContact, + self.errorCount, self.processCount, + self.publishTopic, self.subscribeTopic, self.feedbackTopic)) + + def onMessage(self, value): + self.writeRequestValue = value + + def process(self, client, pubQueue): + logger = logging.getLogger('CoilDatapoint') + if self.writeRequestValue: + # perform write operation + logger.debug("Coil, perform write operation") + self.processCount += 1 + logger.debug("{0}: raw: {1!s}".format(self.label, self.writeRequestValue)) + value=None + if self.writeRequestValue in ['true', 'True', 'yes', 'Yes', 'On', 'on']: + value = True + elif self.writeRequestValue in ['false', 'False', 'no', 'No', 'Off', 'off']: + value = False + else: + self.writeRequestValue = None + raise DatapointException('illegal value {0!s} for coil write'.format(self.writeRequestValue)) + result = client.write_coil(address=self.address, + unit=self.unit, + value=value) + logger.debug("Write result: {0!s}".format(result)) + self.writeRequestValue = None + else: + # perform read operation + logger.debug("Coil, perform read operation") + self.processCount += 1 + result = client.read_coil(address=self.address, + unit=self.unit) + if type(result) in [ExceptionResponse, ModbusIOException]: + self.errorCount += 1 + raise DatapointException(result) + logger.debug("{0}: {1!s}".format(self.label, result.registers)) + value = result.getBit(0) + if self.publishTopic: + pubQueue.put(MqttProcessor.PublishItem(self.publishTopic, str(value))) + self.lastContact = datetime.datetime.now() + + class ReadOnlyDatapoint(AbstractModbusDatapoint): def __init__(self, label=None, unit=None, address=None, count=None, scanRate=None, updateOnly=None, publishTopic=None, converter=None): super().__init__(label, unit, address, count, scanRate, converter) diff --git a/src/registers.json b/src/registers.json index 1c56667..a69138e 100644 --- a/src/registers.json +++ b/src/registers.json @@ -92,5 +92,17 @@ "unit": 4 }, "type": "HoldingRegisterDatapoint" + }, + { + "args": { + "address": 0, + "feedbackTopic": "FB/Coil1", + "label": "Coil1", + "publishTopic": "Pub/Coil1", + "scanRate": 1.0, + "subscribeTopic": "Sub/Coil1", + "unit": 4 + }, + "type": "CoilDatapoint" } ]