From 1b78857b3d03b5be807b1a9b94ae758dfec8175c Mon Sep 17 00:00:00 2001 From: retr0 <42kdesigners@gmail.com> Date: Tue, 25 Aug 2026 16:11:13 +0200 Subject: [PATCH] =?UTF-8?q?ShineBridge=20v1.10.1=20=E2=80=94=20Fix:=20Conf?= =?UTF-8?q?ig-Import=20scheiterte=20an=20Ger=C3=A4ten=20ohne=20modbus=5Fip?= =?UTF-8?q?=20(ha=5Fentity-Typ)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /api/import-config verlangte bisher zwingend modbus_ip fuer jedes Geraet in der importierten Config — der neue GROWATT_WIFI_X-Typ (ha_entity) hat aber keins, nutzt stattdessen ha_entity_prefix. Import schlug dadurch mit 400 fehl, sobald so ein Geraet enthalten war. Validierung jetzt protokollabhaengig. Co-Authored-By: Claude Sonnet 5 --- haos-addon/config.yaml | 2 +- haos-addon/src/main.py | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/haos-addon/config.yaml b/haos-addon/config.yaml index 83bd29f..adbd845 100644 --- a/haos-addon/config.yaml +++ b/haos-addon/config.yaml @@ -1,5 +1,5 @@ name: ShineBridge -version: "1.10.0" +version: "1.10.1" slug: shinebridge description: Energiemanagement für Growatt/Goodwe-Wechselrichter — PV-Überschussladen, Wallbox-EMS, Tarifvergleich, Zigbee2MQTT-Überschussgeräte url: https://gitea.bitfire.work/retr0/shinebridge diff --git a/haos-addon/src/main.py b/haos-addon/src/main.py index 998642c..84e2796 100644 --- a/haos-addon/src/main.py +++ b/haos-addon/src/main.py @@ -837,10 +837,17 @@ def api_import_config(): if not isinstance(inverters, list): return jsonify({"error": "inverters ungültig"}), 400 for inv in inverters: - if not inv.get("modbus_ip"): + model_id = inv.get("inverter_model") + if model_id not in INVERTERS: + return jsonify({"error": f"Unbekanntes Modell: {model_id}"}), 400 + protocol = INVERTERS[model_id].protocol + # modbus_ip wird als generisches Host-Feld fuer alle IP-basierten Protokolle + # wiederverwendet (modbus, goodwe_udp, kathrein) — nur ha_entity braucht keins. + if protocol == "ha_entity": + if not inv.get("ha_entity_prefix"): + return jsonify({"error": f"ha_entity_prefix fehlt in Gerät {inv.get('name', '?')}"}), 400 + elif not inv.get("modbus_ip"): return jsonify({"error": f"modbus_ip fehlt in Gerät {inv.get('name', '?')}"}), 400 - if inv.get("inverter_model") not in INVERTERS: - return jsonify({"error": f"Unbekanntes Modell: {inv.get('inverter_model')}"}), 400 with State.lock: if mqtt := data.get("mqtt"):