relais feedback and meter feedback in same topic

This commit is contained in:
2022-11-24 16:41:12 +01:00
parent 59559a3cd1
commit c62f0c019c
4 changed files with 26 additions and 48 deletions

View File

@ -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

View File

@ -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)}")

View File

@ -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)):

View File

@ -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"]))