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_wattsensor.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!




Ich möchte an dieser Stelle auf die Bluetooth-Schwachstelle hinweisen:
JEDER, der in Bluetooth-Funkreichweite eines Marstek-Produktes mit BLE ist, kann dieses (aktuell) nach Belieben manipulieren (also auch Nachbarn, Passanten, …). Bitte bedenkt dies und wählt ggf. einen Aufstellort, der keine BT-Reichweite in den öffentlichen Raum zulässt!
Weitere Details dazu z.B. hier:
https://www.photovoltaikforum.com/thread/251804-marstek-venus-sicherheit-bluetooth-schutz-gegen-unberechtigten-gerätezugriff/
(Sorry für den Fremdlink. Hoffe, dass das im Sinne der Aufklärung dennoch okay ist.)
Hallo
ich habs hinbekommen. Vergesst meinen Post vom 30.10.2025.
Grüße ThomasP
“
ThomasP
30.10.2025 um 14:33 Uhr
„
Servus
bitte um Hilfe beim Einfügen der Templates in meine config.yaml.
Das Snippet der Templates kann nicht fehlerfrei eingefügt werden. Der erste Fehler beginnt bereits bei Zeile 1 „template“. Hier ein Auszug :
duplicated mapping key (1406:1)
1403 | hz_start_ok:
1404 | name: Starte die Heizung
1405 |
1406 | template:
——–^
1407 | – sensor:
Das ganze steht am Ende meiner Config.yaml.
Leider bin ich mit YAML seit Jahren auf „Kriegsfuss“. D.h. das meiste was mein
HA-Integration aus macht isr via C+V gemacht worden.
Wo kann ich da ansetzen.
Bin mit dem Marstek schon zufrieden. Denke nur dass er über die B2500 Meter zuviel herschenkt.
Wie bist Du auf die Formel für die Regelung gekommen? Könntest Du da noch was zu schreiben?
Saucoole Implementierung. Ich habe es über den Nulleinspeisungsmodus des Marstek Venus C gelöst, der über die beiden Addons Hame Relay und hm2mqtt (und den mosquitto broker) seine Werte in Echtzeit an den HA überträgt. Die Regelung macht der Speicher selbst, über einen in meinem Fall emulierten Shelly 3EM Pro, auch das findet über HA (Addon B2500 meter) statt.
Nachteil meiner Lösung: ich bin Marstek und deren Regelkreis voll ausgeliefert.
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