diff --git a/src/pyfroniusreg/froniusreg.py b/src/pyfroniusreg/froniusreg.py index 0262eaa..c137e6f 100644 --- a/src/pyfroniusreg/froniusreg.py +++ b/src/pyfroniusreg/froniusreg.py @@ -3,26 +3,10 @@ # Copyright 2024, Paul Warren # Licensed under AGPLv3, See LICENSE.md for terms -from enum import Enum - from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder, BinaryPayloadBuilder -#from pymodbus.client.tcp import ModbusTcpClient as ModbusClient -#from pymodbus.diag_message import * -#from pymodbus.file_message import * -#from pymodbus.other_message import * -#from pymodbus.mei_message import * class DataType(): - String8 = 1 - String16 = 2 - String32 = 3 - Int16 = 4 - UInt16 = 5 - Int32 = 6 - UInt32 = 7 - Float32 = 8 - UInt64 = 7 def __init__(self, width, decode, add): self._width = width @@ -43,61 +27,11 @@ class DataType(): return encoder.build() - def old_decode_from_register(self, value): - decoder = BinaryPayloadDecoder.fromRegisters(value.registers, byteorder=Endian.BIG, wordorder=Endian.BIG) - - if (self == DataType.String8) or (self == DataType.String16) or (self == DataType.String32): - return str(decoder.decode_string(16).decode('utf-8')) - - elif (self == DataType.Int16): - return decoder.decode_16bit_int() - - elif (self == DataType.UInt16): - return decoder.decode_16bit_uint() - - elif (self == DataType.Int32): - return decoder.decode_32bit_int() - - elif (self == DataType.UInt32): - return decoder.decode_32bit_uint() - - elif (self == DataType.Float32): - return decoder.decode_32bit_float() - - else: - return str(decoder.decode_bits()) - - def old_encode_to_buffer(self, value): - encoder = BinaryPayloadBuilder(byteorder=Endian.BIG, wordorder=Endian.BIG) - - if (self == DataType.String8) or (self == DataType.String16) or (self == DataType.String32): - return encoder.add_string(value).build() - - elif (self == DataType.Int16): - encoder.add_16bit_int(int(value)) - return encoder.build() - # return int(value) - - elif (self == DataType.UInt16): - encoder.add_16bit_uint(int(value)) - return encoder.build() - - elif (self == DataType.Int32): - return encoder.add_32bit_int(value).build() - - elif (self == DataType.UInt32): - return encoder.add_32bit_uint(value).build() - - elif (self == DataType.Float32): - return encoder.add_32bit_float(value).build() - - else: - return encoder.add_bits(value).build() - - +# helper function for DataType constructors def decode_string(decoder, value): return str(decoder.decode_string(16).decode('utf-8')) +# The various data types that the fronius inverters use string8 = DataType(4, decode_string, BinaryPayloadBuilder.add_string) string16 = DataType(8, decode_string, BinaryPayloadBuilder.add_string) string32 = DataType(16, decode_string, BinaryPayloadBuilder.add_string) @@ -112,6 +46,7 @@ uint64 = DataType(4,BinaryPayloadDecoder.decode_64bit_uint, BinaryPayloadBuilder class registerReadError(Exception): pass +# Finally our fronius modbus register object. class FroniusReg: def __init__(self, address, datatype, unit, description): self.address = address @@ -156,8 +91,6 @@ class ScaledFroniusReg: return self.valueReg.setValue(modbusClient, value / 10 ** self.scaleReg.getValue(modbusClient)) - - MaxChaRte = FroniusReg(40155, uint16, 1, "Max Charge Rate") MaxChaRte_SF = FroniusReg(40156, int16, 1, "Max Charge Rate SF")