Support for exporting meter events

This commit is contained in:
Max 2024-03-25 23:33:25 +01:00
parent 7716dd8418
commit d9657f1858
2 changed files with 22 additions and 3 deletions

View File

@ -17,7 +17,8 @@ metric_data = {
"ac_voltage_volts": ["gauge", "Output bus voltage"], "ac_voltage_volts": ["gauge", "Output bus voltage"],
'ac_frequency_hertz': ["gauge", "Output bus frequency"], 'ac_frequency_hertz': ["gauge", "Output bus frequency"],
'ac_power_watts': ["gauge", "Active/Reactive/Apparent AC power"], 'ac_power_watts': ["gauge", "Active/Reactive/Apparent AC power"],
'ac_power_factor': ["gauge", "AC Phase factor"] 'ac_power_factor': ["gauge", "AC Phase factor"],
'meter_event': ["gauge", 'Power meter event']
} }
def export(d, m): def export(d, m):
@ -51,6 +52,8 @@ def export(d, m):
yield ('energy_watthours_total', {'meter': meter}, m.energy_real[meter]) yield ('energy_watthours_total', {'meter': meter}, m.energy_real[meter])
yield ('ac_frequency_hertz', {'meter': 'mains'}, m.frequency) yield ('ac_frequency_hertz', {'meter': 'mains'}, m.frequency)
for event in m.events:
yield ('meter_event', {'event': event}, float(m.events[event]))

View File

@ -55,6 +55,14 @@ class CommonBlock:
self.serial = regs.read_bytes(50, 32) self.serial = regs.read_bytes(50, 32)
self.device = regs.read_uint16(66) self.device = regs.read_uint16(66)
meter_events_bits = { 2: 'Power Failure',
3: 'Under Voltage',
4: 'Low PF',
5: 'Over Current',
6: 'Over Voltage',
7: 'Missing Sensor' }
class Meter: class Meter:
def __init__(self, regs): def __init__(self, regs):
blocks16 = (('ac_current', 0, ('total', 'a', 'b', 'c'), 0.1), blocks16 = (('ac_current', 0, ('total', 'a', 'b', 'c'), 0.1),
@ -95,6 +103,12 @@ class Meter:
self.frequency = regs.read_int16(14, scale=15) self.frequency = regs.read_int16(14, scale=15)
event_bits = regs.read_uint32(103)
self.events = {}
for bit in meter_events_bits:
self.events[meter_events_bits[bit]] = bool(event_bits & (1 << bit))
status_codes = [None, 'off', 'sleep', 'start', 'on', 'throttled', 'stop', 'fault', 'setup'] status_codes = [None, 'off', 'sleep', 'start', 'on', 'throttled', 'stop', 'fault', 'setup']
class InverterBlock: class InverterBlock:
@ -134,9 +148,11 @@ class Inverter:
if not self._conn.connect(): if not self._conn.connect():
raise ConnectionFailed() raise ConnectionFailed()
def registers(self, addr, length): def registers(self, addr, length, device=None):
if device is None:
device = self._device
self.connect() self.connect()
rs = self._conn.read_holding_registers(addr, length, slave=self._device) rs = self._conn.read_holding_registers(addr, length, slave=device)
return Registers(rs, length) return Registers(rs, length)
def common_block(self): def common_block(self):