Praxisnahe Tutorials, auf die du zählen kannst.
Einsteiger Guide für Home Assistant

Marstek PV-Speicher & Home Assistant (MQTT)

Wie du deinen Marstek Speicher (B2500-D und andere Modelle) über MQTT mit Home Assistant verbinden, steuern und im Energiedashboard einrichten kannst ✅

https://youtu.be/VKYjrlfsUiM

Inhaltsverzeichnis

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!

Zuletzt aktualisiert am 14.07.2025 um 15:34 . Wir weisen darauf hin, dass sich hier angezeigte Preise inzwischen geändert haben können. Alle Angaben ohne Gewähr.

Repos und Quellen

URLBeschreibung
https://community.simon42.com/t/marstek-b2500-batteriespeicher/24919/78?u=simon42Community-Beitrag zum Thema 🫶
https://tomquist.github.io/hame-relay/b2500.htmlWeb-App zur Bluetooth-Konfiguration des Speichers auf MQTT
https://github.com/tomquist/hm2mqttAddon 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

Marstek B2500-D Nulleinspeisung (also so halbwegs)

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!

Verpasse keine Tipps!

Ich sende keinen Spam! Erfahre mehr in der Datenschutzerklärung.

Transparenz: In diesem Artikel sind Partnerlinks enthalten. Durch einen Klick darauf ge­lan­gt ihr direkt zum Anbieter. Solltet ihr euch dort für einen Kauf entscheiden, erhalte ich ei­ne kleine Provision. Für euch ändert sich am Preis nichts & Partnerlinks haben keinerlei Einfluss auf meine Berichterstattung. Vielen Dank für deine Unterstützung!

Gründer von simon42. Schreibt hier ehrlich und leidenschaftlich über Smart Home und Technik Themen, denn das Zuhause wurde bereits von Sprachassistenten übernommen und die Kontrolle abgegeben 😁

Beginnen die Diskussion unter community.simon42.com

2 Gedanken zu „Marstek PV-Speicher & Home Assistant (MQTT)“

  1. 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?

    Antworten
  2. 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

    Antworten

Schreibe einen Kommentar