From fb6250a1098f371d96fe409849e011ce1b970f19 Mon Sep 17 00:00:00 2001
From: Christian Ehrlicher <ch.ehrlicher@gmx.de>
Date: Mon, 12 Sep 2022 19:45:20 +0200
Subject: [PATCH] RPI: Request alarm when alarm id changes

---
 tools/rpi/hoymiles/__init__.py          | 12 ++++++++----
 tools/rpi/hoymiles/__main__.py          | 10 +++++++++-
 tools/rpi/hoymiles/decoders/__init__.py |  6 ++++--
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/tools/rpi/hoymiles/__init__.py b/tools/rpi/hoymiles/__init__.py
index 965971b8..5b305e70 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 7253b677..4fbaa8ac 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 @@ if __name__ == '__main__':
 
     mqtt_client = None
 
+    event_message_index = {}
     command_queue = {}
     mqtt_command_topic_subs = []
 
@@ -286,7 +292,9 @@ if __name__ == '__main__':
     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 4d8e218f..42d1fd0f 100644
--- a/tools/rpi/hoymiles/decoders/__init__.py
+++ b/tools/rpi/hoymiles/decoders/__init__.py
@@ -294,10 +294,12 @@ class EventsResponse(UnknownResponse):
 
         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):