From c62f0c019c11fff2fe847a471f88b750c5dc5ca8 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Thu, 24 Nov 2022 16:41:12 +0100 Subject: [PATCH] relais feedback and meter feedback in same topic --- config.ini | 2 -- src/pv_controller/MeterPublish.py | 27 +++++++++++++--------- src/pv_controller/ModbusBase.py | 9 ++++++++ src/pv_controller/RelaisPublish.py | 36 ------------------------------ 4 files changed, 26 insertions(+), 48 deletions(-) delete mode 100644 src/pv_controller/RelaisPublish.py diff --git a/config.ini b/config.ini index b8f4109..e03593f 100644 --- a/config.ini +++ b/config.ini @@ -9,8 +9,6 @@ port = 1883 relaisSubscribeTopic = IoT/PV/Cmd meterPublishTopic = IoT/PV/Meter meterPublishPeriod = 15 -relaisPublishTopic = IoT/PV/Relais -relaisPublishPeriod = 15 [modbus] gateway = 172.16.2.42 diff --git a/src/pv_controller/MeterPublish.py b/src/pv_controller/MeterPublish.py index e64f928..e63484d 100644 --- a/src/pv_controller/MeterPublish.py +++ b/src/pv_controller/MeterPublish.py @@ -4,14 +4,21 @@ from MqttBase import AbstractMqttPublisher import json import datetime + +def floatAdaptor(i): + return float(f"{i:0.2f}") if i else 0.0 + +def onOffAdaptor(i): + return ('Off' if i[0] == 0 else 'On') if i else 'x' + + REGISTERS = [ - { "slave":2, "addr":0x0048, "attr": "importEnergy", "name":"Import active energy", "unit":"kWh" }, - { "slave":2, "addr":0x004a, "attr": "exportEnergy", "name":"Export active energy", "unit":"kWh" }, - { "slave":2, "addr":0x000c, "attr": "power", "name":"Power", "unit":"W" }, - # { "slave":2, "addr":0x0058, "attr": "positivePower", "name":"Positive power", "unit":"W" }, - # { "slave":2, "addr":0x005c, "attr": "reversePower", "name":"Reverse power", "unit":"W" }, - { "slave":2, "addr":0x0000, "attr": "voltage", "name":"Voltage", "unit":"V" }, - { "slave":2, "addr":0x0006, "attr": "current", "name":"Current", "unit":"A" }, + { "slave":2, "addr":0x0048, "type":"input", "attr": "importEnergy", "name":"Import active energy", "unit":"kWh", "adaptor": floatAdaptor }, + { "slave":2, "addr":0x004a, "type":"input", "attr": "exportEnergy", "name":"Export active energy", "unit":"kWh", "adaptor": floatAdaptor }, + { "slave":2, "addr":0x000c, "type":"input", "attr": "power", "name":"Power", "unit":"W", "adaptor": floatAdaptor }, + { "slave":2, "addr":0x0000, "type":"input", "attr": "voltage", "name":"Voltage", "unit":"V", "adaptor": floatAdaptor }, + { "slave":2, "addr":0x0006, "type":"input", "attr": "current", "name":"Current", "unit":"A", "adaptor": floatAdaptor }, + { "slave":1, "addr":0x0001, "type":"holding", "attr": "state", "name":"State", "unit":"-", "adaptor": onOffAdaptor }, ] @@ -29,13 +36,13 @@ class MeterPublish(AbstractMqttPublisher): payload = str(cnt) try: - payload = { r['attr']: 0.0 for r in self.registers } + payload = { r['attr']: r['adaptor'](None) for r in self.registers } payload['status'] = "Error" payload['timestamp'] = datetime.datetime.isoformat(datetime.datetime.utcnow()) for reg in self.registers: - v = self.modbusHandler.readInputRegister(reg['slave'], reg['addr']) + v = self.modbusHandler.readRegister(reg['type'], reg['slave'], reg['addr']) logger.debug(f"{reg['name']}: {v} {reg['unit']}") - payload[reg['attr']] = float(f"{v:0.2f}") + payload[reg['attr']] = reg['adaptor'](v) payload['status'] = "Ok" except Exception as e: logger.error(f"Caught exception: {str(e)}") diff --git a/src/pv_controller/ModbusBase.py b/src/pv_controller/ModbusBase.py index 4b2b29b..c25e03d 100644 --- a/src/pv_controller/ModbusBase.py +++ b/src/pv_controller/ModbusBase.py @@ -25,6 +25,15 @@ class ModbusHandler: self.client = ModbusTcpClient(self.config['gateway']) self.client.connect() + + def readRegister(self, typ, slave, addr): + if typ == 'input': + return self.readInputRegister(slave, addr) + elif typ == 'holding': + return self.readHoldingRegister(slave, addr) + else: + raise LocalModbusException('unsupported read type') + def readInputRegister(self, slave, addr): res = self.client.read_input_registers(addr, 2, slave=slave) if (isinstance(res, ReadInputRegistersResponse)): diff --git a/src/pv_controller/RelaisPublish.py b/src/pv_controller/RelaisPublish.py deleted file mode 100644 index fe0a5e1..0000000 --- a/src/pv_controller/RelaisPublish.py +++ /dev/null @@ -1,36 +0,0 @@ -from threading import Event -from loguru import logger -from MqttBase import AbstractMqttPublisher -import json -import datetime - - -class RelaisPublish(AbstractMqttPublisher): - def __init__(self, config, modbusHandler): - super().__init__(config) - self.modbusHandler = modbusHandler - - def localLoop(self): - cnt = 0 - while not self.killBill: - cnt += 1 - topic = self.config["relaisPublishTopic"] - payload = str(cnt) - - try: - payload = {} - payload['status'] = "Error" - payload['timestamp'] = datetime.datetime.isoformat(datetime.datetime.utcnow()) - v = self.modbusHandler.readHoldingRegister(1, 1) - logger.debug(f"{v}") - payload['state'] = 'Off' if v[0] == 0 else 'On' - payload['status'] = "Ok" - except Exception as e: - logger.error(f"Caught exception: {str(e)}") - - payload['cnt'] = cnt - payloadStr = json.dumps(payload) - self.client.publish(topic, payloadStr) - logger.info(f"mqtt message sent: {topic} -> {payloadStr}") - - self.killEvent.wait(timeout=float(self.config["relaisPublishPeriod"]))