From adb86fc5dc9a02ed7448b1c2bb1e2de99290d053 Mon Sep 17 00:00:00 2001 From: Patrick Date: Sun, 28 Jun 2026 10:30:48 +0200 Subject: [PATCH 1/4] Add Firmware Register for Nexa and Noah --- grobro/model/growatt_nexa_registers.json | 68 ++++++++++++++++++++++++ grobro/model/growatt_noah_registers.json | 51 ++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/grobro/model/growatt_nexa_registers.json b/grobro/model/growatt_nexa_registers.json index fc6e4bc..42d006b 100644 --- a/grobro/model/growatt_nexa_registers.json +++ b/grobro/model/growatt_nexa_registers.json @@ -2242,6 +2242,74 @@ "state_class": "measurement", "icon": "mdi:thermometer" } + }, + "fw_part_1": { + "growatt": { + "position": { + "register_no": 119, + "offset": 0, + "size": 1 + }, + "data": { + "data_type": "INT" + } + }, + "homeassistant": { + "name": "Firmware Part 1", + "publish": true, + "icon": "mdi:information" + } + }, + "fw_part_2": { + "growatt": { + "position": { + "register_no": 119, + "offset": 1, + "size": 1 + }, + "data": { + "data_type": "INT" + } + }, + "homeassistant": { + "name": "Firmware Part 2", + "publish": true, + "icon": "mdi:information" + } + }, + "fw_part_3": { + "growatt": { + "position": { + "register_no": 120, + "offset": 0, + "size": 1 + }, + "data": { + "data_type": "INT" + } + }, + "homeassistant": { + "name": "Firmware Part 3", + "publish": true, + "icon": "mdi:information" + } + }, + "fw_part_4": { + "growatt": { + "position": { + "register_no": 120, + "offset": 1, + "size": 1 + }, + "data": { + "data_type": "INT" + } + }, + "homeassistant": { + "name": "Firmware Part 4", + "publish": true, + "icon": "mdi:information" + } } } } diff --git a/grobro/model/growatt_noah_registers.json b/grobro/model/growatt_noah_registers.json index 6349be0..23791b1 100644 --- a/grobro/model/growatt_noah_registers.json +++ b/grobro/model/growatt_noah_registers.json @@ -1920,6 +1920,57 @@ "publish": true, "icon": "mdi:counter" } + }, + "fw_part_1": { + "growatt": { + "position": { + "register_no": 119, + "offset": 0, + "size": 1 + }, + "data": { + "data_type": "INT" + } + }, + "homeassistant": { + "name": "Firmware Part 1", + "publish": true, + "icon": "mdi:information" + } + }, + "fw_part_2": { + "growatt": { + "position": { + "register_no": 119, + "offset": 1, + "size": 1 + }, + "data": { + "data_type": "INT" + } + }, + "homeassistant": { + "name": "Firmware Part 2", + "publish": true, + "icon": "mdi:information" + } + }, + "fw_part_3": { + "growatt": { + "position": { + "register_no": 120, + "offset": 0, + "size": 1 + }, + "data": { + "data_type": "INT" + } + }, + "homeassistant": { + "name": "Firmware Part 3", + "publish": true, + "icon": "mdi:information" + } } } } From e2e9fd3332da39be06eb397152dc3d89cfe4c336 Mon Sep 17 00:00:00 2001 From: Patrick Date: Sun, 28 Jun 2026 20:54:00 +0200 Subject: [PATCH 2/4] Add sensor for combined firmware version --- grobro/ha/client.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/grobro/ha/client.py b/grobro/ha/client.py index 92e2965..1e7dd98 100644 --- a/grobro/ha/client.py +++ b/grobro/ha/client.py @@ -641,6 +641,31 @@ def __publish_device_discovery(self, device_id: str, effective_max_bat: int | No "icon": "mdi:identifier", } + # Combined firmware version (NOAH = 3 parts, NEXA = 4 parts) + fw_parts = sorted( + name + for name in known_registers.input_registers + if name.startswith("fw_part_") + ) + + if fw_parts: + combined_name = "firmware_version" + firmware_unique_id = f"grobro_{device_id}_{combined_name}" + + value_template = ".".join( + f"{{{{ value_json['{part}'] }}}}" + for part in fw_parts + ) + + payload["cmps"][firmware_unique_id] = { + "platform": "sensor", + "name": "Firmware Version", + "state_topic": f"{HA_BASE_TOPIC}/grobro/{device_id}/state", + "value_template": value_template, + "unique_id": firmware_unique_id, + "icon": "mdi:information", + } + # Serial Number Entity serial_unique_id = f"grobro_{device_id}_serial" payload["cmps"][serial_unique_id] = { From ed13bb09fe9a60a8e2f1195a5967e93173d1a3aa Mon Sep 17 00:00:00 2001 From: Patrick Date: Mon, 29 Jun 2026 10:53:40 +0200 Subject: [PATCH 3/4] Rename Registers to include "version" --- grobro/ha/client.py | 8 ++++---- grobro/model/growatt_nexa_registers.json | 16 ++++++++-------- grobro/model/growatt_noah_registers.json | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/grobro/ha/client.py b/grobro/ha/client.py index 1e7dd98..6003eaf 100644 --- a/grobro/ha/client.py +++ b/grobro/ha/client.py @@ -642,19 +642,19 @@ def __publish_device_discovery(self, device_id: str, effective_max_bat: int | No } # Combined firmware version (NOAH = 3 parts, NEXA = 4 parts) - fw_parts = sorted( + fw_version_parts = sorted( name for name in known_registers.input_registers - if name.startswith("fw_part_") + if name.startswith("fw_version_part_") ) - if fw_parts: + if fw_version_parts: combined_name = "firmware_version" firmware_unique_id = f"grobro_{device_id}_{combined_name}" value_template = ".".join( f"{{{{ value_json['{part}'] }}}}" - for part in fw_parts + for part in fw_version_parts ) payload["cmps"][firmware_unique_id] = { diff --git a/grobro/model/growatt_nexa_registers.json b/grobro/model/growatt_nexa_registers.json index 42d006b..04b9bc6 100644 --- a/grobro/model/growatt_nexa_registers.json +++ b/grobro/model/growatt_nexa_registers.json @@ -2243,7 +2243,7 @@ "icon": "mdi:thermometer" } }, - "fw_part_1": { + "fw_version_part_1": { "growatt": { "position": { "register_no": 119, @@ -2255,12 +2255,12 @@ } }, "homeassistant": { - "name": "Firmware Part 1", + "name": "Firmware Version Part 1", "publish": true, "icon": "mdi:information" } }, - "fw_part_2": { + "fw_version_part_2": { "growatt": { "position": { "register_no": 119, @@ -2272,12 +2272,12 @@ } }, "homeassistant": { - "name": "Firmware Part 2", + "name": "Firmware Version Part 2", "publish": true, "icon": "mdi:information" } }, - "fw_part_3": { + "fw_version_part_3": { "growatt": { "position": { "register_no": 120, @@ -2289,12 +2289,12 @@ } }, "homeassistant": { - "name": "Firmware Part 3", + "name": "Firmware Version Part 3", "publish": true, "icon": "mdi:information" } }, - "fw_part_4": { + "fw_version_part_4": { "growatt": { "position": { "register_no": 120, @@ -2306,7 +2306,7 @@ } }, "homeassistant": { - "name": "Firmware Part 4", + "name": "Firmware Version Part 4", "publish": true, "icon": "mdi:information" } diff --git a/grobro/model/growatt_noah_registers.json b/grobro/model/growatt_noah_registers.json index 23791b1..cd3eec5 100644 --- a/grobro/model/growatt_noah_registers.json +++ b/grobro/model/growatt_noah_registers.json @@ -1921,7 +1921,7 @@ "icon": "mdi:counter" } }, - "fw_part_1": { + "fw_version_part_1": { "growatt": { "position": { "register_no": 119, @@ -1933,12 +1933,12 @@ } }, "homeassistant": { - "name": "Firmware Part 1", + "name": "Firmware Version Part 1", "publish": true, "icon": "mdi:information" } }, - "fw_part_2": { + "fw_version_part_2": { "growatt": { "position": { "register_no": 119, @@ -1950,12 +1950,12 @@ } }, "homeassistant": { - "name": "Firmware Part 2", + "name": "Firmware Version Part 2", "publish": true, "icon": "mdi:information" } }, - "fw_part_3": { + "fw_version_part_3": { "growatt": { "position": { "register_no": 120, @@ -1967,7 +1967,7 @@ } }, "homeassistant": { - "name": "Firmware Part 3", + "name": "Firmware Version Part 3", "publish": true, "icon": "mdi:information" } From 603b2ff13497bbb1404c91628b574c4e3e9302d5 Mon Sep 17 00:00:00 2001 From: Patrick Date: Mon, 29 Jun 2026 21:54:55 +0200 Subject: [PATCH 4/4] Don't publish firmware version parts to Home Assistant --- grobro/ha/client.py | 2 +- grobro/model/growatt_nexa_registers.json | 8 ++++---- grobro/model/growatt_noah_registers.json | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/grobro/ha/client.py b/grobro/ha/client.py index 6003eaf..57091cc 100644 --- a/grobro/ha/client.py +++ b/grobro/ha/client.py @@ -649,7 +649,7 @@ def __publish_device_discovery(self, device_id: str, effective_max_bat: int | No ) if fw_version_parts: - combined_name = "firmware_version" + combined_name = "fw_version" firmware_unique_id = f"grobro_{device_id}_{combined_name}" value_template = ".".join( diff --git a/grobro/model/growatt_nexa_registers.json b/grobro/model/growatt_nexa_registers.json index 04b9bc6..20d71ea 100644 --- a/grobro/model/growatt_nexa_registers.json +++ b/grobro/model/growatt_nexa_registers.json @@ -2256,7 +2256,7 @@ }, "homeassistant": { "name": "Firmware Version Part 1", - "publish": true, + "publish": false, "icon": "mdi:information" } }, @@ -2273,7 +2273,7 @@ }, "homeassistant": { "name": "Firmware Version Part 2", - "publish": true, + "publish": false, "icon": "mdi:information" } }, @@ -2290,7 +2290,7 @@ }, "homeassistant": { "name": "Firmware Version Part 3", - "publish": true, + "publish": false, "icon": "mdi:information" } }, @@ -2307,7 +2307,7 @@ }, "homeassistant": { "name": "Firmware Version Part 4", - "publish": true, + "publish": false, "icon": "mdi:information" } } diff --git a/grobro/model/growatt_noah_registers.json b/grobro/model/growatt_noah_registers.json index cd3eec5..1aa55f2 100644 --- a/grobro/model/growatt_noah_registers.json +++ b/grobro/model/growatt_noah_registers.json @@ -1934,7 +1934,7 @@ }, "homeassistant": { "name": "Firmware Version Part 1", - "publish": true, + "publish": false, "icon": "mdi:information" } }, @@ -1951,7 +1951,7 @@ }, "homeassistant": { "name": "Firmware Version Part 2", - "publish": true, + "publish": false, "icon": "mdi:information" } }, @@ -1968,7 +1968,7 @@ }, "homeassistant": { "name": "Firmware Version Part 3", - "publish": true, + "publish": false, "icon": "mdi:information" } }