Skip to content

Commit

Permalink
Parameter fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
StephanJoubert committed Nov 15, 2021
1 parent 4b4f7b2 commit c0b5685
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 14 deletions.
5 changes: 5 additions & 0 deletions custom_components/solarman/parameters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ parameters:
uom: "°C"
scale: 0.1
rule: 1
offset: 1000
registers: [0x00B6]
icon: 'mdi:battery'

Expand Down Expand Up @@ -329,13 +330,15 @@ parameters:
uom: "°C"
scale: 0.1
rule: 2
offset: 1000
registers: [0x005A]
icon: 'mdi:thermometer'

- name: "AC Temperature"
uom: "°C"
scale: 0.1
rule: 2
offset: 1000
registers: [0x005B]
icon: 'mdi:thermometer'

Expand Down Expand Up @@ -374,6 +377,8 @@ parameters:
rule: 1
registers: [0x00A6]
lookup:
- key: 0
value: "none"
- key: 1
value: "On"

Expand Down
40 changes: 28 additions & 12 deletions custom_components/solarman/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,6 @@
# just after the first two bytes.
OFFSET_PARAMS = 28

# Parser Rules constants
PARSER_RULE_INT16 = 1
PARSER_RULE_INT32 = 2
PARSER_RULE_UINT16 = 3
PARSER_RULE_UINT32 = 4
PARSER_RULE_ASCII = 5
PARSER_RULE_BITS = 6


class ParameterParser:
def __init__(self, path):
Expand Down Expand Up @@ -45,9 +37,10 @@ def try_parse_field (self, rawData, definition, start, length):
self.try_parse_unsigned(rawData,definition, start, length)
elif rule == 4:
self.try_parse_signed(rawData,definition, start, length)
elif rule == PARSER_RULE_ASCII:
elif rule == 5:
self.try_parse_ascii(rawData,definition, start, length)

elif rule == 6:
self.try_parse_bits(rawData,definition, start, length)
return

def try_parse_signed (self, rawData, definition, start, length):
Expand All @@ -59,7 +52,7 @@ def try_parse_signed (self, rawData, definition, start, length):
maxint = 0
for r in definition['registers']:
index = r - start # get the decimal value of the register'
if (index > 0) and (index < length):
if (index >= 0) and (index < length):
maxint <<= 16
maxint |= 0xFFFF
offset = OFFSET_PARAMS + (index * 2)
Expand All @@ -69,6 +62,9 @@ def try_parse_signed (self, rawData, definition, start, length):
else:
found = False
if found:
if 'offset' in definition:
value = value - definition['offset']

if value > maxint/2:
value = (value - maxint) * scale
else:
Expand All @@ -88,7 +84,7 @@ def try_parse_unsigned (self, rawData, definition, start, length):
shift = 0
for r in definition['registers']:
index = r - start # get the decimal value of the register'
if (index > 0) and (index < length):
if (index >= 0) and (index < length):
offset = OFFSET_PARAMS + (index * 2)
temp = struct.unpack('>H', rawData[offset:offset + 2])[0]
value += (temp & 0xFFFF) << shift
Expand All @@ -99,6 +95,9 @@ def try_parse_unsigned (self, rawData, definition, start, length):
if 'lookup' in definition:
self.result[title] = self.lookup_value (value, definition['lookup'])
else:
if 'offset' in definition:
value = value - definition['offset']

value = value * scale
if self.is_integer_num (value):
self.result[title] = int(value)
Expand Down Expand Up @@ -130,7 +129,24 @@ def try_parse_ascii (self, rawData, definition, start, length):
if found:
self.result[title] = value
return

def try_parse_bits (self, rawData, definition, start, length):
title = definition['name']
found = True
value = []
for r in definition['registers']:
index = r - start # get the decimal value of the register'
if (index >= 0) and (index < length):
offset = OFFSET_PARAMS + (index * 2)
temp = struct.unpack('>H', rawData[offset:offset + 2])[0]
value.append(hex(temp))
else:
found = False

if found:
self.result[title] = value
return

def get_sensors (self):
result = []
for i in self._lookups['parameters']:
Expand Down
6 changes: 4 additions & 2 deletions custom_components/solarman/solarman.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,11 @@ def get_statistics(self):
params = ParameterParser(self.path)
self.send_request (params, 0x0003, 0x000E)
# Gap from 0x00F to 0x003A
self.send_request (params, 0x003A, 0x0070)
self.send_request (params, 0x003B, 0x0070)
# There is a gap from 0x0070 to 0x0096
self.send_request (params, 0x0095, 0x00C3)
self.send_request (params, 0x0096, 0x00C3)

self.send_request (params, 0x00f4, 0x00f8)
self._current_val = params.get_result()

def get_current_val(self):
Expand Down

0 comments on commit c0b5685

Please sign in to comment.