BYD-Speicher direkt aus der BMU auslesen
gatherBYDData.py fragt die BMU der HVM unter 192.168.16.254:8080 ab (BE-Connect-Protokoll, nach ioBroker.bydhvs): Ladestand und SOH laut BMU, 128 Zellspannungen, 64 Temperaturen, Spreizung, Ausgleich, Fehlerbits, Gesamtzaehler. Das Netzwerkmodul startet alle ~102 s neu und bedient nur die ersten Verbindungen danach - eigene Klopf-Schleife, ein Satz etwa alle 100 s. Werte unter solarManager/byd/#, Historie in byd und byd_zellen. tbatt kommt jetzt aus der BMU statt fest 0. mqttClient.publish legt ein einzelnes Dataclass-Objekt in rtData als Untertopics ab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@ flowchart LR
|
||||
WR["Wechselrichter<br/><small>GoodWe · OpenDTU · DTU-BI</small>"]
|
||||
EM3["Stromzähler<br/><small>2× Shelly EM3</small>"]
|
||||
HEIZ["Heizung"]
|
||||
BYD["BYD-Speicher<br/><small>BMU</small>"]
|
||||
GOE["go-eCharger"]
|
||||
WPILOT["Wattpilot"]
|
||||
SKODA["MySkoda-API"]
|
||||
@@ -25,7 +26,7 @@ flowchart LR
|
||||
VENTILE["Ventilsteuerungen<br/><small>2× ESP32</small>"]
|
||||
HAUSGER["Thermostate · Shellys · Schalter<br/><small>melden sich per<br/>Home-Assistant-Discovery</small>"]
|
||||
|
||||
MGR["<b>solarManager.py</b><br/><small>gatherModbusData · gatherOpenDTUData<br/>gatherDTUBIData · gatherShellyEM3Data EG/UG<br/>gatherHeaterData · gatherSkodaData<br/>gatherWaterData · charger_goE</small>"]
|
||||
MGR["<b>solarManager.py</b><br/><small>gatherModbusData · gatherOpenDTUData<br/>gatherDTUBIData · gatherShellyEM3Data EG/UG<br/>gatherHeaterData · gatherSkodaData<br/>gatherBYDData · gatherWaterData<br/>charger_goE</small>"]
|
||||
WPB["<b>wattpilot_bruecke.py</b>"]
|
||||
WSB["<b>wsMQTTbridge.py</b>"]
|
||||
RAIN["<b>gatherRainData.py</b>"]
|
||||
@@ -36,6 +37,7 @@ flowchart LR
|
||||
WR -->|Modbus · HTTP| MGR
|
||||
EM3 -->|HTTP| MGR
|
||||
HEIZ -->|HTTP| MGR
|
||||
BYD -->|Modbus-RTU in TCP| MGR
|
||||
GOE -->|HTTP| MGR
|
||||
WPILOT -->|WebSocket| MGR
|
||||
SKODA -->|HTTPS| MGR
|
||||
@@ -44,7 +46,7 @@ flowchart LR
|
||||
METEO -->|HTTPS| RAIN
|
||||
|
||||
SOLARLOG -->|zisterne| MGR
|
||||
MGR -->|"EnergyFlow · skoda<br/>skoda_ladepunkte"| SOLARLOG
|
||||
MGR -->|"EnergyFlow · skoda<br/>skoda_ladepunkte · byd<br/>byd_zellen"| SOLARLOG
|
||||
|
||||
MGR -->|"solarManager/#"| BROKER
|
||||
WPB -->|"wattpilot/#"| BROKER
|
||||
@@ -57,7 +59,7 @@ flowchart LR
|
||||
classDef quelle fill:#eef4fb,stroke:#7f9dc0
|
||||
classDef skript fill:#fff6e5,stroke:#d0a548
|
||||
classDef speicher fill:#eaf5ee,stroke:#6fa981
|
||||
class WR,EM3,HEIZ,GOE,WPILOT,SKODA,STATION,METEO,VENTILE,HAUSGER quelle
|
||||
class WR,EM3,HEIZ,BYD,GOE,WPILOT,SKODA,STATION,METEO,VENTILE,HAUSGER quelle
|
||||
class MGR,WPB,WSB,RAIN skript
|
||||
class BROKER,SOLARLOG speicher
|
||||
```
|
||||
@@ -68,11 +70,20 @@ Home-Assistant-Discovery spricht, schreiben ohne Umweg auf den Broker. Für
|
||||
deren Messwerte ist also **kein Skript** zuständig — wer sie sucht, sucht am
|
||||
Gerät, nicht im Quelltext.
|
||||
|
||||
`solarManager.py` ist der Sonderfall: ein Prozess, aber acht
|
||||
`solarManager.py` ist der Sonderfall: ein Prozess, aber neun
|
||||
Sammler-Module, jedes für eine Anlage. Sie laufen nicht einzeln, sondern
|
||||
werden importiert; ihr gemeinsames Ergebnis geht als ein Baum nach
|
||||
`solarManager/#`.
|
||||
|
||||
`gatherBYDData` liest die BMU der Batterie direkt (192.168.16.254:8080) und
|
||||
legt alles unter `solarManager/byd/…` ab: Ladestand und Gesundheit laut BMU,
|
||||
Zellspannungen (`zellen`, 128 Werte in mV, 16 je Modul), Temperaturen
|
||||
(`temperaturen`, 64 Werte, 8 je Modul), Spreizung, Ausgleich, Fehlerbits und
|
||||
die Gesamtzähler. `ok` fällt auf 0, wenn zehn Minuten nichts kam. Das
|
||||
Netzwerkmodul der BMU startet etwa alle 102 Sekunden neu und antwortet nur
|
||||
kurz danach — der Sammler klopft deshalb jede Sekunde an und bekommt so rund
|
||||
alle 100 Sekunden einen vollständigen Satz. Einzelheiten im Kopf des Moduls.
|
||||
|
||||
Die Zisterne fällt aus der Reihe — ihr Stand steht in `solarLog`, und
|
||||
`gatherWaterData` liest ihn von dort. Die Daten laufen also durch die
|
||||
Datenbank hindurch von einem Prozess zum nächsten.
|
||||
@@ -147,6 +158,7 @@ von Hand, wenn sich am Bestand etwas geändert hat.
|
||||
| `Raumtemp/#`, `Power_*/#`, `wasser/#` | die Geräte selbst | Browser, Runner |
|
||||
| `homeassistant/#` | die Geräte selbst | `device_discovery.py` |
|
||||
| **`solarLog`** | `solarManager.py` | `ajax/*.php`, `gatherWaterData` |
|
||||
| `byd`, `byd_zellen` (in `solarLog`) | `gatherBYDData.py`, alle 5 bzw. 15 Minuten | Web-Repo (`solarLog_byd.sql`) |
|
||||
| **`homeMesh`** | `device_discovery.py`, Runner, Web-Editor | Runner, `ajax/*.php` |
|
||||
| `skoda.conf` | Einstellungen → Fahrzeug (`restricted/skodaKeys.php`) oder von Hand | `gatherSkodaData.py`, `ajax/skodaCmd.php` |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user