Skip to content

Commit

Permalink
Merge pull request lumapu#277 from chehrlic/rpi_alarmid
Browse files Browse the repository at this point in the history
RPI: Request alarm when alarm id changes
  • Loading branch information
lumapu authored Sep 13, 2022
2 parents 8b7a6ff + fb6250a commit 99c2b9f
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 7 deletions.
12 changes: 8 additions & 4 deletions tools/rpi/hoymiles/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,7 @@ def compose_esb_packet(packet, mtu=17, **params):
fragment = compose_esb_fragment(packet[i:i+mtu], **params)
yield fragment

def compose_send_time_payload(cmdId):
def compose_send_time_payload(cmdId, alarm_id=0):
"""
Build set time request packet
Expand All @@ -493,9 +493,13 @@ def compose_send_time_payload(cmdId):
"""
timestamp = int(time.time())

payload = struct.pack('>B', cmdId) + b'\x00'
payload = payload + struct.pack('>L', timestamp) # big-endian: msb at low address
payload = payload + b'\x00\x00\x00\x00\x00\x00\x00\x00'
# indices from esp8266 hmRadio.h / sendTimePacket()
payload = struct.pack('>B', cmdId) # 10
payload = payload + b'\x00' # 11
payload = payload + struct.pack('>L', timestamp) # 12..15 big-endian: msb at low address
payload = payload + b'\x00\x00' # 16..17
payload = payload + struct.pack('>H', alarm_id) # 18..19
payload = payload + b'\x00\x00\x00\x00' # 20..23

return frame_payload(payload)

Expand Down
10 changes: 9 additions & 1 deletion tools/rpi/hoymiles/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ def poll_inverter(inverter, do_init, retries=4):
string_id = string_id + 1
print()

if 'event_count' in data:
if event_message_index[inv_str] < data['event_count']:
event_message_index[inv_str] = data['event_count']
command_queue[inv_str].append(hoymiles.compose_send_time_payload(InfoCommands.AlarmData, alarm_id=event_message_index[inv_str]))

if mqtt_client:
mqtt_send_status(mqtt_client, inverter_ser, data,
topic=inverter.get('mqtt', {}).get('topic', None))
Expand Down Expand Up @@ -244,6 +249,7 @@ def mqtt_on_command(client, userdata, message):

mqtt_client = None

event_message_index = {}
command_queue = {}
mqtt_command_topic_subs = []

Expand Down Expand Up @@ -286,7 +292,9 @@ def mqtt_on_command(client, userdata, message):
g_inverters = [g_inverter.get('serial') for g_inverter in ahoy_config.get('inverters', [])]
for g_inverter in ahoy_config.get('inverters', []):
g_inverter_ser = g_inverter.get('serial')
command_queue[str(g_inverter_ser)] = []
inv_str = str(g_inverter_ser)
command_queue[inv_str] = []
event_message_index[inv_str] = 0

#
# Enables and subscribe inverter to mqtt /command-Topic
Expand Down
6 changes: 4 additions & 2 deletions tools/rpi/hoymiles/decoders/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,10 +294,12 @@ def __init__(self, *args, **params):

crc_valid = self.validate_crc_m()
if crc_valid:
print(' payload has valid modbus crc')
#print(' payload has valid modbus crc')
self.response = self.response[:-2]

status = self.response[:2]
status = struct.unpack('>H', self.response[:2])[0]
a_text = self.alarm_codes.get(status, 'N/A')
print (f' Inverter status: {a_text} ({status})')

chunk_size = 12
for i_chunk in range(2, len(self.response), chunk_size):
Expand Down

0 comments on commit 99c2b9f

Please sign in to comment.