@@ -24,7 +24,21 @@ def __init__(self, hass, client: AsyncModbusSerialClient, slave_id: int, registe
2424 self .slave_id = slave_id
2525 self .register_map = register_map
2626 self ._address_groups = self ._group_addresses (register_map ) # Use passed map
27-
27+
28+ @staticmethod
29+ def _apply_scaling (value : int , index : int ) -> int | float :
30+ """Apply scaling based on index from register dict."""
31+ if index == 1 : # /10
32+ return value / 10.0
33+ if index == 2 : # /100
34+ return value / 100.0
35+ if index == 3 : # signed 16-bit
36+ if value >= 0x8000 :
37+ return value - 0x10000
38+ return value
39+ # Add more if needed later (e.g. index 4 for high/low – but that's combined)
40+ return value # default: raw
41+
2842 def _group_addresses (self , reg_map : dict ) -> Dict [int , list ]:
2943 """Group consecutive register addresses to minimize requests."""
3044 addresses = sorted ([(info ["address" ], key ) for key , info in reg_map .items ()])
@@ -78,22 +92,26 @@ async def _async_update_data(self) -> dict:
7892 registers = result .registers
7993
8094 for i , key in enumerate (keys ):
81-
8295 reg_offset = i * 2
83- reg1 = registers [reg_offset ]
84- reg2 = registers [reg_offset + 1 ]
85-
86- # Convert to big-endian float
87- raw = struct .pack (">HH" , reg1 , reg2 )
88- value = struct .unpack (">f" , raw )[0 ]
89-
90- # Handle NaN/invalid values
91- if value is None or (value != value ): # NaN check
92- value = None
96+ if reg_offset + 1 < len (registers ):
97+ # Existing float path (your current code)
98+ reg1 = registers [reg_offset ]
99+ reg2 = registers [reg_offset + 1 ]
100+ raw = struct .pack (">HH" , reg1 , reg2 )
101+ value = struct .unpack (">f" , raw )[0 ]
102+ if value != value : # NaN
103+ value = None
104+ else :
105+ precision = self .register_map [key ].get ("precision" , 2 )
106+ value = round (value , precision )
93107 else :
94- precision = self .register_map [key ].get ("precision" , 2 )
95- value = round (value , precision )
96-
108+ # New: single register fallback (uint16 raw)
109+ value = registers [reg_offset ]
110+ index = self .register_map [key ].get ("index" , 0 )
111+ value = self ._apply_scaling (value , index )
112+ precision = self .register_map [key ].get ("precision" , 0 )
113+ if isinstance (value , float ):
114+ value = round (value , precision )
97115 new_data [key ] = value
98116
99117 return new_data
0 commit comments