some changes, meter reading works so far
This commit is contained in:
48
src/pv_controller/MeterPublish.py
Normal file
48
src/pv_controller/MeterPublish.py
Normal file
@ -0,0 +1,48 @@
|
||||
from threading import Event
|
||||
from loguru import logger
|
||||
from MqttBase import AbstractMqttPublisher
|
||||
import json
|
||||
import datetime
|
||||
|
||||
REGISTERS = [
|
||||
{ "addr":0x0048, "attr": "importEnergy", "name":"Import active energy", "unit":"kWh" },
|
||||
{ "addr":0x004a, "attr": "exportEnergy", "name":"Export active energy", "unit":"kWh" },
|
||||
{ "addr":0x000c, "attr": "activePower", "name":"Active power", "unit":"W" },
|
||||
{ "addr":0x0058, "attr": "positivePower", "name":"Positive power", "unit":"W" },
|
||||
{ "addr":0x005c, "attr": "reversePower", "name":"Reverse power", "unit":"W" },
|
||||
{ "addr":0x0000, "attr": "voltage", "name":"Voltage", "unit":"V" },
|
||||
{ "addr":0x0006, "attr": "current", "name":"Current", "unit":"A" }
|
||||
]
|
||||
|
||||
|
||||
class MeterPublish(AbstractMqttPublisher):
|
||||
def __init__(self, config, modbusHandler):
|
||||
super().__init__(config)
|
||||
self.modbusHandler = modbusHandler
|
||||
self.registers = REGISTERS
|
||||
|
||||
def localLoop(self):
|
||||
cnt = 0
|
||||
while not self.killBill:
|
||||
cnt += 1
|
||||
topic = self.config["meterPublishTopic"]
|
||||
payload = str(cnt)
|
||||
|
||||
try:
|
||||
payload = { r['attr']: 0.0 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['addr'])
|
||||
logger.info(f"{reg['name']}: {v} {reg['unit']}")
|
||||
payload[reg['attr']] = float(f"{v:0.2f}")
|
||||
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.warning(f"mqtt message sent: {topic} -> {payloadStr}")
|
||||
|
||||
self.killEvent.wait(timeout=float(self.config["meterPublishPeriod"]))
|
Reference in New Issue
Block a user