Skip to content

Commit 61e2e61

Browse files
authored
Update coordinator.py
1 parent 9fd3050 commit 61e2e61

1 file changed

Lines changed: 33 additions & 15 deletions

File tree

custom_components/ha_felicity/coordinator.py

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)