diff --git a/sunspec.py b/sunspec.py index 152a165..f056643 100644 --- a/sunspec.py +++ b/sunspec.py @@ -21,7 +21,7 @@ class Registers: def read_uint16(self, address, scale=None): self.check_address(address) - value = self.lower.getRegister(address) + value = self.lower.registers[address] return self.scale(value, scale) def read_int16(self, address, scale=None): @@ -64,7 +64,28 @@ class CommonBlock: self.version = '.'.join(s.lstrip('0') for s in regs.read_bytes(42, 16).decode('ascii').split('.')) self.serial = regs.read_bytes(50, 32) self.device = regs.read_uint16(66) - + +meter_types = { 201: 'single', + 202: 'split_single', + 203: 'wye_three', + 204: 'delta_three', } + + +class MeterInfo: + def __init__(self, regs): + self.did = regs.read_uint16(0) + self.info_len = regs.read_uint16(1) + self.manufacturer = regs.read_bytes(2,32) + self.model = regs.read_bytes(18,32) + self.option = regs.read_bytes(34,16) + self.version = regs.read_bytes(42,16) + self.serial = regs.read_bytes(50,32) + self.device = regs.read_uint16(66) + typ = regs.read_uint16(67) + self.type = meter_types.get(typ, typ) + self.data_len = regs.read_uint16(68) + + meter_events_bits = { 2: 'Power Failure', 3: 'Under Voltage', 4: 'Low PF', @@ -154,7 +175,7 @@ class InverterBlock: class Inverter: def __init__(self, host, port=1502, device=1): - self._conn = ModbusTcpClient(host, port) + self._conn = ModbusTcpClient(host, port=port) self._device = 1 def connect(self): @@ -165,7 +186,7 @@ class Inverter: if device is None: device = self._device self.connect() - rs = self._conn.read_holding_registers(addr, length, slave=device) + rs = self._conn.read_holding_registers(addr, count=length, device_id=device) return Registers(rs, length) def header(self, base): @@ -180,3 +201,7 @@ class Inverter: def meter(self, n): base = 40190 + 174*n return Meter(self.registers(base, 105)) + + def meter_info(self, n): + base = 40121 + 174*n + return MeterInfo(self.registers(base, 69))