Compare commits

...

2 Commits

Author SHA1 Message Date
Max
49224447bc Add requirements.txt 2026-08-04 19:09:37 +02:00
Max
896bf9f594 Update sunspec.py to adjust for pymodbus API changes 2026-08-04 19:08:33 +02:00
2 changed files with 31 additions and 4 deletions

2
requirements.txt Normal file
View File

@ -0,0 +1,2 @@
bottle==0.13.4
pymodbus==3.14.0

View File

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