Wie du deinen Marstek Speicher (B2500-D und andere Modelle) über MQTT mit Home Assistant verbinden, steuern und im Energiedashboard einrichten kannst ✅
Inhaltsverzeichnis
- Voraussetzungen
- Marstek-Speicher
- Repos und Quellen
- Energiedashboard
- Code
- Fazit: Dein Marstek Speicher im Home Assistant-Ökosystem – mehr als nur Energie managen!
Voraussetzungen
Stromverbrauch
Du brauchst natürlich Home Assistant & dein Stromzähler, bzw. Stromverbrauch deiner Wohnung sollte bereits ausgelesen werden bzw. irgendwie in Home Assistant vorhanden sein 👇
Einspeisung ins Netz als kWh
Falls dein Stromzähler nur den Bezug aber nicht die Einspeisung ins Netz als Datenpunkt liefert (ist selten der Fall, kommt aber vor), habe ich mal im Balkonsolar-Beitrag erklärt, wie du das selbst über den aktuellen Verbrauch (watt) berechnen kannst 👇
MQTT
Da der Speicher auf MQTT konfiguriert wird muss auf deinem Home Assistant das Mosquitto Addon laufen. Die Einrichtung zeige ich aber auch im Video 👆
Marstek-Speicher
Hier noch der Link zu meinem Speicher, allerdings sollten noch mehr Modelle mit dem Addon bzw. der Web-App kompatibel sein. Wenn du mehr weißt, lass gerne ein Kommentar auf YT oder hier im Blog da!
Repos und Quellen
URL | Beschreibung |
---|---|
https://community.simon42.com/t/marstek-b2500-batteriespeicher/24919/78?u=simon42 | Community-Beitrag zum Thema 🫶 |
https://tomquist.github.io/hame-relay/b2500.html | Web-App zur Bluetooth-Konfiguration des Speichers auf MQTT |
https://github.com/tomquist/hm2mqtt | Addon für Home Assistant um das MQTT-Gerät zu erstellen. Benötigt die Bluetooth-Mac deines Gerätes aus der Marstek-App (wird im Video gezeigt) |
Bei Fragen zu hm2mqtt 👆 schau bitte in die Doku auf GitHub!
Energiedashboard

Wenn du auch wie im Video gezeigt deine Einzel-Geräte zum Energiedashboard hinzufügen willst bzw. die Verbräuche dieser Geräte berechnen willst, schau mal im PowerCalc-Beitrag.
Code
Hier noch alle benötigten Code-Snippets zum kopieren 🫶
Du willst dich bedanken? Am Ende vom Beitrag in der Autor-Box findest du Spenden-Buttons für die Kaffee-Kasse oder du kannst auch Kanalmitglied werden 🎉
Abschnitte wie z.B. frontend:
dürfen nicht doppelt vorkommen.
Das bedeutet also, wenn du den unten gezeigten Abschnitt schon hast, musst du diesen nicht noch einmal hinzufügen, sondern nur die Code-Zeilen darunter ggf. ergänzen.
Nach dem Einfügen kannst du eventuell noch die Entitäten-IDs an deine eigenen anpassen. Suchen und ersetzen kannst du mit „STRG+F“ (Windows) oder „CMD+F“ (Mac).
Templates
template: - sensor: - name: "Netzeinspeisung" # <- Nur nötig, um die Entität vom SML-Lesekopf in HA auszuwählen state_class: total_increasing device_class: energy icon: mdi:home-export-outline unit_of_measurement: kWh state: "{{ states('sensor.hichiirwifi_sgm_c4_4a920l_energy_supply')|float}}" availability: "{{ is_number(states('sensor.hichiirwifi_sgm_c4_4a920l_energy_supply')) }}" - name: "Netzbezug" # <- Nur nötig, um die Entität vom SML-Lesekopf in HA auszuwählen state_class: total_increasing device_class: energy icon: mdi:home-import-outline unit_of_measurement: kWh state: "{{ states('sensor.hichiirwifi_sgm_c4_4a920l_energy_total')|float}}" availability: "{{ is_number(states('sensor.hichiirwifi_sgm_c4_4a920l_energy_total')) }}" - name: "Wohnung Leistungsbedarf gesamt (Watt)" # <- Berechnet den Leistungsbedarf für die Wohnung in Watt, damit wir das in der Automation nutzten können unique_id: "WohnungLeistungsbedarfgesamtWatt" unit_of_measurement: W device_class: energy state_class: measurement state: "{{ (states('sensor.hichiirwifi_sgm_c4_4a920l_energy_power') | float + states('sensor.hame_energy_hma_1_94706cce02f5_micro_inverter_power') | float ) }}" sensor: - platform: statistics # <- 5 Minuten stimmt zwar nicht mehr (auf 2 geändert), aber so muss ich nicht die ganze Automation nochmal bearbeiten 😅 name: "Wohnung Leistungsbedarf gesamt Mittelwert 5Min (Watt)" # <- Mittel-Wert entity_id: sensor.wohnung_leistungsbedarf_gesamt_watt state_characteristic: mean max_age: minutes: 2 # Da die Automation schon nach 3 Minuten wieder nachjustiert, muss dieser Wert kleiner sein sampling_size: 1200 percentile: 90 - platform: statistics # <- 5 Minuten stimmt zwar nicht mehr (auf 2 geändert), aber so muss ich nicht die ganze Automation nochmal bearbeiten 😅 name: "Wohnung Leistungsbedarf gesamt Min 5Min (Watt)" # <- Min-Wert entity_id: sensor.wohnung_leistungsbedarf_gesamt_watt state_characteristic: value_min max_age: minutes: 2 # Da die Automation schon nach 3 Minuten wieder nachjustiert, muss dieser Wert kleiner sein sampling_size: 1200 percentile: 90
Automation
Hinweis zum Ersetzen: Mindestens den Gerätenamen hame_energy_hma_1_94706cce02f5
wirst du durch deinen eigenen ersetzen müssen. Kopiere dir hierfür am besten den Code in einen Code-Editor und nutze suchen & ersetzen.
Falls deine Templates anders heißen, meine IDs sind:
sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt
sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt
alias: Marstek B2500-D Nulleinspeisung (also so halbwegs) description: "" triggers: - entity_id: - sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt trigger: state id: Energy - trigger: numeric_state entity_id: - sensor.hame_energy_hma_1_94706cce02f5_battery_percentage below: 11 alias: LowBat id: LowBat conditions: - condition: or conditions: - alias: Energie-Bedingungen condition: and conditions: - condition: trigger id: - Energy - condition: not conditions: - condition: state entity_id: sensor.hame_energy_hma_1_94706cce02f5_battery_capacity state: unknown alias: Gerät ist nicht "unbekannt" - condition: not conditions: - condition: state entity_id: sensor.hame_energy_hma_1_94706cce02f5_battery_capacity state: unavailable alias: Gerät ist nicht "nicht verfügbar" - alias: "Nicht: Max ist bereits gesetzt und es würde mehr benötigt werden" condition: not conditions: - condition: and conditions: - alias: 800W gesetzt condition: numeric_state entity_id: >- number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value above: 799 - alias: Min-Wert ist um mind. 10% größer condition: template value_template: >- {{(float(states('number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value')) * 1.10 ) <= states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt') | float}} - alias: >- Nicht: Speicherprio ist gesetzt und es würde weniger benötigt werden condition: not conditions: - condition: and conditions: - condition: state entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode state: Fully Charge Then Discharge - alias: Min-Wert ist um mind. 5% kleiner condition: template value_template: >- {{ float(states('number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value')) >= (states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt') | float * 1.04 )}} - alias: Ist & Bedarfs-Werte vergleichen (oder) condition: or conditions: - condition: and conditions: - alias: >- Nur, wenn nicht innerhalb der letzten 3 Minuten getriggert wurde (hierfür muss der Aktionsblock erreicht worden sein) condition: template value_template: >- {{ state_attr("automation.marstek_b2500_d_nulleinspeisung_also_so_halbwegs", "last_triggered") == None or ( as_timestamp(now()) - as_timestamp(state_attr("automation.marstek_b2500_d_nulleinspeisung_also_so_halbwegs", "last_triggered")) |int(0) ) > 180 }} - alias: Min-Wert ist um mind. 10% größer condition: template value_template: >- {{(float(states('number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value')) * 1.10 ) <= states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt') | float}} alias: >- Mehr Energie wird benötigt & letzter Lauf ist mind. 3 Minuten her - alias: >- Weniger Energie wird benötigt & letzter Lauf ist mind. 15 Sekunden her condition: and conditions: - alias: Min-Wert ist um mind. 3% kleiner condition: template value_template: >- {{ float(states('number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value')) >= (states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt') | float * 1.02 )}} - alias: >- Nur, wenn nicht innerhalb der letzten 15 Sekunden getriggert wurde (hierfür muss der Aktionsblock erreicht worden sein) condition: template value_template: >- {{ state_attr("automation.marstek_b2500_d_nulleinspeisung_also_so_halbwegs", "last_triggered") == None or ( as_timestamp(now()) - as_timestamp(state_attr("automation.marstek_b2500_d_nulleinspeisung_also_so_halbwegs", "last_triggered")) |int(0) ) > 15 }} - condition: not conditions: - condition: and conditions: - condition: state entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode state: Fully Charge Then Discharge - condition: numeric_state entity_id: sensor.hame_energy_hma_1_94706cce02f5_battery_percentage below: 15 - condition: trigger id: - LowBat alias: LowBat actions: - choose: - conditions: - condition: trigger id: - LowBat sequence: - action: select.select_option metadata: {} data: option: Fully Charge Then Discharge target: entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode - action: number.set_value metadata: {} data: value: "50" target: entity_id: number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value - action: switch.turn_off metadata: {} data: {} target: entity_id: switch.hame_energy_hma_1_94706cce02f5_time_period_1_enabled - stop: Akku erschöpft alias: Wenn LowBat dann Energiemodus umstellen - conditions: - condition: numeric_state entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt above: 29 value_template: " {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}" enabled: true - condition: numeric_state entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt value_template: " {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}" below: 801 sequence: - alias: >- Vermittelten Wert aus Min (doppelt gewichtet) & Durchschnitt einstellen metadata: {} data: value: >- {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt')) ) / 3}} action: number.set_value target: entity_id: number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value - if: - condition: or conditions: - condition: state entity_id: >- switch.hame_energy_hma_1_94706cce02f5_time_period_1_enabled state: "off" - condition: state entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode state: Fully Charge Then Discharge then: - action: switch.turn_on metadata: {} data: {} target: entity_id: switch.hame_energy_hma_1_94706cce02f5_time_period_1_enabled - action: select.select_option metadata: {} data: option: Simultaneous Charging/Discharging target: entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode alias: Wenn Deaktiviert, wieder aktivieren - conditions: - condition: numeric_state entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt value_template: " {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}" below: 30 - condition: not conditions: - condition: state entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode state: Fully Charge Then Discharge sequence: - alias: >- Vermittelten Wert aus Min (doppelt gewichtet) & Durchschnitt einstellen metadata: {} data: value: "30" action: number.set_value target: entity_id: number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value alias: Set Min Watt if not Set - conditions: - condition: numeric_state entity_id: sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt value_template: " {{( (float(states('sensor.wohnung_leistungsbedarf_gesamt_min_5min_watt')) * 2) + float(states('sensor.wohnung_leistungsbedarf_gesamt_mittelwert_5min_watt'))) / 3}}" above: 800 - condition: not conditions: - condition: numeric_state entity_id: >- number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value above: 799 sequence: - metadata: {} data: value: "800" action: number.set_value target: entity_id: number.hame_energy_hma_1_94706cce02f5_time_period_1_output_value - if: - condition: or conditions: - condition: state entity_id: >- switch.hame_energy_hma_1_94706cce02f5_time_period_1_enabled state: "off" - condition: state entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode state: Fully Charge Then Discharge then: - action: switch.turn_on metadata: {} data: {} target: entity_id: switch.hame_energy_hma_1_94706cce02f5_time_period_1_enabled - action: select.select_option metadata: {} data: option: Simultaneous Charging/Discharging target: entity_id: select.hame_energy_hma_1_94706cce02f5_charging_mode alias: Wenn Deaktiviert, wieder aktivieren alias: Set Max Watt if not Set - alias: Graveyard choose: [] enabled: true mode: single
Screenshot der Automation

Fazit: Dein Marstek Speicher im Home Assistant-Ökosystem – mehr als nur Energie managen!
Wir haben gesehen, wie du deinen Marstek Speicher – sei es ein B2500-D oder ein kompatibles Modell – dank der Power von MQTT nahtlos in dein Home Assistant integrieren kannst. Von der initialen Konfiguration über die detaillierte Steuerung bis hin zur eleganten Darstellung im Energiedashboard ist jetzt alles in deiner Hand.
Die Verbindung über MQTT und die Nutzung des hm2mqtt
-Addons eröffnen dir nicht nur die Möglichkeit, den Ladestatus und die Leistung deines Speichers zu überwachen, sondern auch komplexe Automatisierungen zu erstellen. Das Beispiel der Nulleinspeisungs-Automation zeigt eindrucksvoll, wie du mit Home Assistant nicht nur Daten ausliest, sondern aktiv und intelligent auf den Energiebedarf deines Zuhauses reagieren kannst, um den Eigenverbrauch zu maximieren und den Bezug aus dem Netz zu minimieren.
Es mag am Anfang nach viel Code und Konfiguration aussehen, aber die Investition lohnt sich: Du gewinnst nicht nur volle Kontrolle über deinen Batteriespeicher, sondern optimierst auch deine Energieflüsse im Smart Home. Die Kombination aus Marstek und Home Assistant ist ein echter Gewinn für jeden, der seine Energiedaten transparent sehen und aktiv beeinflussen möchte.
Ich hoffe, dieser Beitrag hat dir geholfen, dein Marstek-Setup auf das nächste Level zu heben. Experimentiere mit den Vorlagen und passe sie an deine individuellen Bedürfnisse an. Dein Smart Home wird es dir danken!
Hallo, ich habe den Marstek Venus E jetzt in HA.Habe allerdings schon eine Batteriespeicheranlage von E3DC.Jetzt habe ich eine Automation geschrieben die Verhindert das sich die beiden Batterien gegenseitig be und entladen.Das funktioniert auch relativ gut.
Leider ist der Abfrageintervall für den Marstek fest auf 60 Sekunden eigestellt obwohl im Adone von hm2mqtt eine Einstellmöglichkeit ist.Auch kann ich die Werte max Discharge und max Charge nicht dauerhaft ändern.Oder mache ich etwas falsch?
Hallo, coole Sache! Funktioniert das auch bei anderen Produkten von Marstek? Also z.B. bei den Venus Speichern? Das wäre ja noch cooler dann. Viele Grüße