relais feedback and meter feedback in same topic
This commit is contained in:
@ -9,8 +9,6 @@ port = 1883
|
|||||||
relaisSubscribeTopic = IoT/PV/Cmd
|
relaisSubscribeTopic = IoT/PV/Cmd
|
||||||
meterPublishTopic = IoT/PV/Meter
|
meterPublishTopic = IoT/PV/Meter
|
||||||
meterPublishPeriod = 15
|
meterPublishPeriod = 15
|
||||||
relaisPublishTopic = IoT/PV/Relais
|
|
||||||
relaisPublishPeriod = 15
|
|
||||||
|
|
||||||
[modbus]
|
[modbus]
|
||||||
gateway = 172.16.2.42
|
gateway = 172.16.2.42
|
||||||
|
@ -4,14 +4,21 @@ from MqttBase import AbstractMqttPublisher
|
|||||||
import json
|
import json
|
||||||
import datetime
|
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 = [
|
REGISTERS = [
|
||||||
{ "slave":2, "addr":0x0048, "attr": "importEnergy", "name":"Import active energy", "unit":"kWh" },
|
{ "slave":2, "addr":0x0048, "type":"input", "attr": "importEnergy", "name":"Import active energy", "unit":"kWh", "adaptor": floatAdaptor },
|
||||||
{ "slave":2, "addr":0x004a, "attr": "exportEnergy", "name":"Export active energy", "unit":"kWh" },
|
{ "slave":2, "addr":0x004a, "type":"input", "attr": "exportEnergy", "name":"Export active energy", "unit":"kWh", "adaptor": floatAdaptor },
|
||||||
{ "slave":2, "addr":0x000c, "attr": "power", "name":"Power", "unit":"W" },
|
{ "slave":2, "addr":0x000c, "type":"input", "attr": "power", "name":"Power", "unit":"W", "adaptor": floatAdaptor },
|
||||||
# { "slave":2, "addr":0x0058, "attr": "positivePower", "name":"Positive power", "unit":"W" },
|
{ "slave":2, "addr":0x0000, "type":"input", "attr": "voltage", "name":"Voltage", "unit":"V", "adaptor": floatAdaptor },
|
||||||
# { "slave":2, "addr":0x005c, "attr": "reversePower", "name":"Reverse power", "unit":"W" },
|
{ "slave":2, "addr":0x0006, "type":"input", "attr": "current", "name":"Current", "unit":"A", "adaptor": floatAdaptor },
|
||||||
{ "slave":2, "addr":0x0000, "attr": "voltage", "name":"Voltage", "unit":"V" },
|
{ "slave":1, "addr":0x0001, "type":"holding", "attr": "state", "name":"State", "unit":"-", "adaptor": onOffAdaptor },
|
||||||
{ "slave":2, "addr":0x0006, "attr": "current", "name":"Current", "unit":"A" },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -29,13 +36,13 @@ class MeterPublish(AbstractMqttPublisher):
|
|||||||
payload = str(cnt)
|
payload = str(cnt)
|
||||||
|
|
||||||
try:
|
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['status'] = "Error"
|
||||||
payload['timestamp'] = datetime.datetime.isoformat(datetime.datetime.utcnow())
|
payload['timestamp'] = datetime.datetime.isoformat(datetime.datetime.utcnow())
|
||||||
for reg in self.registers:
|
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']}")
|
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"
|
payload['status'] = "Ok"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Caught exception: {str(e)}")
|
logger.error(f"Caught exception: {str(e)}")
|
||||||
|
@ -25,6 +25,15 @@ class ModbusHandler:
|
|||||||
self.client = ModbusTcpClient(self.config['gateway'])
|
self.client = ModbusTcpClient(self.config['gateway'])
|
||||||
self.client.connect()
|
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):
|
def readInputRegister(self, slave, addr):
|
||||||
res = self.client.read_input_registers(addr, 2, slave=slave)
|
res = self.client.read_input_registers(addr, 2, slave=slave)
|
||||||
if (isinstance(res, ReadInputRegistersResponse)):
|
if (isinstance(res, ReadInputRegistersResponse)):
|
||||||
|
@ -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"]))
|
|
Reference in New Issue
Block a user