diff --git a/tools/rpi/hoymiles/__init__.py b/tools/rpi/hoymiles/__init__.py index 965971b88..5b305e70c 100644 --- a/tools/rpi/hoymiles/__init__.py +++ b/tools/rpi/hoymiles/__init__.py @@ -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 @@ -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) diff --git a/tools/rpi/hoymiles/__main__.py b/tools/rpi/hoymiles/__main__.py index 7253b677b..4fbaa8ac9 100644 --- a/tools/rpi/hoymiles/__main__.py +++ b/tools/rpi/hoymiles/__main__.py @@ -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)) @@ -244,6 +249,7 @@ def mqtt_on_command(client, userdata, message): mqtt_client = None + event_message_index = {} command_queue = {} mqtt_command_topic_subs = [] @@ -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 diff --git a/tools/rpi/hoymiles/decoders/__init__.py b/tools/rpi/hoymiles/decoders/__init__.py index 4d8e218f2..42d1fd0fd 100644 --- a/tools/rpi/hoymiles/decoders/__init__.py +++ b/tools/rpi/hoymiles/decoders/__init__.py @@ -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):