|
7 | 7 | import logging |
8 | 8 |
|
9 | 9 | import pymodbus |
10 | | -from pymodbus.constants import Endian |
11 | | -from pymodbus.payload import BinaryPayloadDecoder |
12 | 10 |
|
13 | 11 | if "3.7.0" <= pymodbus.__version__ <= "3.7.4": |
14 | 12 | from pymodbus.pdu.register_read_message import ReadHoldingRegistersResponse |
@@ -112,42 +110,36 @@ async def _async_update_data(self) -> dict: |
112 | 110 | def parse_register_data( |
113 | 111 | self, |
114 | 112 | buffer: ReadHoldingRegistersResponse, |
115 | | - registerInfo: OrderedDict(str, RegisterInfo), |
| 113 | + registerInfo: OrderedDict[str, RegisterInfo], |
116 | 114 | unit: int, |
117 | 115 | ) -> dict: |
118 | | - """Parse the register data.""" |
119 | | - decoder = BinaryPayloadDecoder.fromRegisters( |
120 | | - buffer.registers, byteorder=Endian.BIG |
121 | | - ) |
| 116 | + """Parse the register data using convert_from_registers.""" |
122 | 117 | decoded_data = OrderedDict() |
| 118 | + registers = buffer.registers |
| 119 | + offset = 0 |
| 120 | + |
123 | 121 | for key, value in registerInfo.items(): |
124 | | - full_key = str(unit) + "." + key |
125 | | - if value.dataType == UINT16: |
126 | | - decoded_data[full_key] = self.decode_scaling( |
127 | | - decoder.decode_16bit_uint(), value.scale, value.unit |
128 | | - ) |
129 | | - elif value.dataType == INT16: |
130 | | - decoded_data[full_key] = self.decode_scaling( |
131 | | - decoder.decode_16bit_int(), value.scale, value.unit |
132 | | - ) |
133 | | - elif value.dataType == UINT32: |
134 | | - decoded_data[full_key] = self.decode_scaling( |
135 | | - decoder.decode_32bit_uint(), value.scale, value.unit |
136 | | - ) |
137 | | - elif value.dataType == INT32: |
138 | | - decoded_data[full_key] = self.decode_scaling( |
139 | | - decoder.decode_32bit_int(), value.scale, value.unit |
140 | | - ) |
| 122 | + full_key = f"{unit}.{key}" |
| 123 | + count = 0 |
| 124 | + if value.dataType in (INT16, UINT16): |
| 125 | + count = 1 |
| 126 | + elif value.dataType in (INT32, UINT32): |
| 127 | + count = 2 |
141 | 128 | elif isinstance(value.dataType, STRING): |
142 | | - decoded_data[full_key] = ( |
143 | | - decoder.decode_string(value.dataType.readLength) |
144 | | - .split(b"\x00")[0] |
145 | | - .decode() |
146 | | - ) |
| 129 | + count = value.dataType.length |
| 130 | + segment = registers[offset : offset + count] |
| 131 | + |
| 132 | + if isinstance(value.dataType, STRING): |
| 133 | + raw = self.api.convert_string_from_register(segment) |
| 134 | + decoded_data[full_key] = raw |
147 | 135 | else: |
148 | | - raise DecodeDataTypeUnsupported( |
149 | | - f"Not supported dataType: {value.dataType}" |
| 136 | + raw = self.api.convert_number_from_register(segment, value.dataType) |
| 137 | + # _LOGGER.warning("trying to decode %s with value %s", key, raw) |
| 138 | + decoded_data[full_key] = self.decode_scaling( |
| 139 | + raw, value.scale, value.unit |
150 | 140 | ) |
| 141 | + offset += count |
| 142 | + |
151 | 143 | return decoded_data |
152 | 144 |
|
153 | 145 | def decode_scaling(self, number, scale, unit): |
|
0 commit comments