Skip to content

Commit

Permalink
feat: Add common scaling for custom sensors
Browse files Browse the repository at this point in the history
  • Loading branch information
davidrapan committed Sep 22, 2024
1 parent 8159eeb commit 0709481
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions custom_components/solarman/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,6 @@ def try_parse_field(self, rawData, definition, start, length):
return

def _read_registers(self, rawData, definition, start, length):
scale = definition["scale"] if "scale" in definition else 1
found = True
value = 0
shift = 0
Expand Down Expand Up @@ -238,7 +237,8 @@ def _read_registers(self, rawData, definition, start, length):
if "offset" in definition:
value = value - definition["offset"]

value = value * scale
if "scale" in definition and (scale := definition["scale"]):
value = value * scale

if "divide" in definition and (divide := definition["divide"]) and divide != 0:
value //= divide
Expand All @@ -247,7 +247,6 @@ def _read_registers(self, rawData, definition, start, length):

def _read_registers_signed(self, rawData, definition, start, length):
magnitude = definition["magnitude"] if "magnitude" in definition else False
scale = definition["scale"] if "scale" in definition else 1
found = True
maxint = 0
value = 0
Expand All @@ -273,7 +272,8 @@ def _read_registers_signed(self, rawData, definition, start, length):
if value > (maxint >> 1):
value = (value - maxint) if not magnitude else -(value & (maxint >> 1))

value = value * scale
if "scale" in definition and (scale := definition["scale"]):
value = value * scale

if "divide" in definition and (divide := definition["divide"]) and divide != 0:
value //= divide
Expand All @@ -287,6 +287,8 @@ def try_parse_unsigned(self, rawData, definition, start, length):

if "sensors" in definition:
for s in definition["sensors"]:
if not "scale" in s and "scale" in definition and (scale := definition["scale"]):
s["scale"] = scale
if (n := (self._read_registers(rawData, s, start, length) if not "signed" in s else self._read_registers_signed(rawData, s, start, length))) is not None:
if not "operator" in s:
value += n
Expand Down

0 comments on commit 0709481

Please sign in to comment.