Zum Inhalt springen
Alles Automatisch

Home AssistantApps & ErweiterungenSnippetsSmart Home & Gadgets

Jackery SolarVault in Home Assistant: HACS & MQTT

· Aktualisiert am

Ich habe bei mir gerade zwei Jackery SolarVaults laufen, den Pro im Garten und den Pro Max in der Garage. Und natürlich wollte ich beide in Home Assistant sehen. Spoiler: Es gibt genau zwei Wege, das zu lösen. Der erste ist wahnsinnig schnell, der zweite gibt dir die volle Kontrolle. Ich musste beide gehen, weil die HACS-Integration nur ein Gerät verwaltet. Genau das erkläre ich dir hier Schritt für Schritt, inklusive der Falle, die mich selbst ein paar Stunden gekostet hat.

Was du brauchst, bevor es losgeht

Beide Wege haben dieselbe Grundlage: ein laufendes Home Assistant (2024.x oder neuer) und einen MQTT-Broker. Am einfachsten ist die Mosquitto-Broker-App (früher Add-on), die du direkt in HA unter Einstellungen → Apps findest. Installieren, starten, fertig.

Außerdem brauchst du die MQTT-Integration in HA (Einstellungen → Geräte & Dienste → MQTT) und deinen SolarVault natürlich im selben Netzwerk, per WLAN oder LAN. Für Weg 1 brauchst du zusätzlich noch HACS.

Drei Werte wirst du durch die ganze Anleitung immer wieder brauchen. Ersetze überall die Platzhalter:

  • DEINE_SN: die Seriennummer deines SolarVault (steht in der Jackery-App auf der MQTT-Seite)
  • DEIN_TOKEN: der Token von derselben Seite (pro Gerät unterschiedlich!)
  • DEINE_BROKER_IP: die IP deines MQTT-Brokers, in den meisten Fällen die IP deiner Home-Assistant-Instanz

Schritt 0: Den SolarVault mit dem MQTT-Broker verbinden

Das ist der allererste Schritt, ganz egal welchen Weg du danach gehst. Ohne diese Verbindung bleiben alle Sensoren leer.

Zuerst musst du in der Mosquitto-Broker-App einen Login anlegen. Geh in die Konfiguration der App, trag unter logins: einen Benutzernamen und ein Passwort ein und starte die App neu.

Dann öffnest du die Jackery-App, gehst auf dein Gerät, dann auf Einstellungen und dort auf MQTT. Dort trägst du folgendes ein:

  • Host: DEINE_BROKER_IP
  • Port: 1883
  • Username / Password: der Login, den du gerade in Mosquitto angelegt hast
  • Token: den vorgegebenen Token aus der App notieren, das ist dein DEIN_TOKEN
  • Seriennummer: ebenfalls hier notieren, das ist deine DEINE_SN

Dann setzt du den Haken bei „Aktivieren" und drückst Senden. Im Mosquitto-Log sollte jetzt eine neue Client-Verbindung vom Gerät auftauchen.

Wenn das nicht klappt, sind das die häufigsten Ursachen: Port falsch getippt (1833 statt 1883 passiert erstaunlich oft), Gerät im falschen WLAN, oder der Login stimmt nicht überein.

Wichtig bei zwei Geräten: Jeder SolarVault hat seinen eigenen Token und seine eigene Seriennummer. Du musst Schritt 0 für jedes Gerät einzeln machen.

Weg 1: Die HACS-Integration (schnell, für ein Gerät)

Die Community-Integration ht-it-lab/jackery legt alle Sensoren automatisch an, komplett lokal über MQTT, kein Cloud-Konto nötig. Das ist die Lösung, wenn du einen SolarVault hast und in fünf Minuten fertig sein willst.

Schritt 1.1: Integration über HACS installieren

HACS öffnen, oben rechts Menü, dann Custom repositories. Dort fügst du folgendes ein:

  • URL: https://github.com/ht-it-lab/jackery
  • Typ: Integration

HACS schließen und neu öffnen, nach „Jackery" suchen, herunterladen. Danach Home Assistant neu starten.

Schritt 1.2: Integration einrichten

Einstellungen → Geräte & Dienste → Integration hinzufügen, nach „Jackery" suchen. Im Dialog trägst du ein:

  • device_sn: DEINE_SN
  • token: DEIN_TOKEN

Bestätigen und die Integration verbindet sich über den MQTT-Broker mit deinem Gerät. Entities wie sensor.jackery_battery_soc, sensor.jackery_solar_power und sensor.jackery_battery_charge_power entstehen automatisch und lassen sich direkt aufs Dashboard oder ins Energie-Dashboard legen.

Grenze der Integration: Sie ist single-instance, verwaltet also nur ein Gerät. Für einen zweiten SolarVault nimmst du Weg 2.

Eine Alternative für mehrere Geräte in einer einzigen Integration wäre Bigdaddy1990/jackery_solarvault. Die meldet sich am Jackery-Konto an und findet alle Systeme automatisch. Der Nachteil: sie braucht ein Cloud-Konto und war im Juni 2026 noch stark im Umbau (v0.1.x). Wer rein lokal bleiben möchte, bleibt bei ht-it-lab/jackery und nutzt für das zweite Gerät Weg 2.

Und noch kurz als Info: Jackery hat mir bestätigt, dass eine offizielle Home-Assistant-Integration in Arbeit ist. Einen Termin gibt es noch nicht. Bis dahin sind HACS und MQTT die Wahl.

Weg 2: Das MQTT-Package (für ein zweites Gerät oder volle Kontrolle)

Wer ein zweites Gerät hat, oder einfach keine Custom-Integration möchte, baut die Sensoren selbst per MQTT. Das ist mehr Arbeit, aber komplett transparent und beliebig erweiterbar. Bei mir läuft der Pro Max in der Garage auf diese Weise.

So funktioniert das Protokoll

Der SolarVault sendet nicht von selbst. Er antwortet nur, wenn er angefragt wird:

  • HA schickt einen type: 25-Frame an hb/device/DEINE_SN/action
  • Das Gerät antwortet mit einem Status-Frame auf hb/device/DEINE_SN/status
  • Aus diesem JSON lesen die Sensoren ihre Werte

Welche Felder aus dem JSON du wirklich brauchst, ist nicht ganz offensichtlich. Ich habe alles live gegen die Jackery-App validiert:

FeldBedeutung
batSocGesamt-SoC des Geräts (= App-Anzeige „insgesamt")
socPack-SoC eines einzelnen Akkus, NICHT der Gesamtwert
stackInPw / stackOutPwLade-/Entladeleistung des ganzen Akku-Turms (Master + Erweiterungen)
batInPw / batOutPwNur die Master-Einheit (Zusatzakkus fehlen!)
inOngridPw / outOngridPwAC-Bezug / AC-Abgabe des Geräts
pvPw, pv1..4.pvPwSolar gesamt bzw. pro MPPT-String
cellTempZellentemperatur in Zehntelgrad (194 = 19,4 °C)

Die wichtigste Falle, die mich selbst Stunden gekostet hat: Für die Akku-Leistung immer stackInPw und stackOutPw nehmen, niemals batInPw und batOutPw. Die Master-Felder zählen nur die Haupteinheit, die Erweiterungsakkus fehlen komplett. In der Praxis zeigt HA dann vielleicht 350 W, obwohl das Gerät 600 W liefert.

Schritt 2.1: Package-Ordner aktivieren

Falls du noch keine Packages-Struktur nutzt, trägst du in der configuration.yaml folgendes ein:

yaml
homeassistant:
  packages: !include_dir_named packages

Dann legst du im Ordner /config/packages/ eine neue Datei an, zum Beispiel jackery_promax.yaml.

Schritt 2.2: Die MQTT-Sensoren

Das {%- if … is defined -%}-Muster sorgt dafür, dass der Sensor seinen letzten Wert behält, wenn ein Frame das Feld nicht enthält. Das ist wichtig für die Stabilität.

yaml
1mqtt:
2  sensor:
3    # Gesamt-SoC (App-Wert)
4    - name: "Jackery ProMax SoC"
5      unique_id: jackery_promax_soc
6      state_topic: "hb/device/DEINE_SN/status"
7      unit_of_measurement: "%"
8      device_class: battery
9      state_class: measurement
10      expire_after: 120
11      value_template: >-
12        {%- if value_json.type == 2 and value_json.body.batSoc is defined -%}
13          {{ value_json.body.batSoc }}
14        {%- endif -%}
15
16    # Akku-Ladeleistung, ganzer Turm (stackInPw, NICHT batInPw!)
17    - name: "Jackery ProMax Batterie Ladeleistung"
18      unique_id: jackery_promax_batterie_ladeleistung
19      state_topic: "hb/device/DEINE_SN/status"
20      unit_of_measurement: "W"
21      device_class: power
22      state_class: measurement
23      expire_after: 120
24      value_template: >-
25        {%- if value_json.type == 2 and value_json.body.stackInPw is defined -%}
26          {{ value_json.body.stackInPw }}
27        {%- endif -%}
28
29    # Akku-Entladeleistung, ganzer Turm (stackOutPw)
30    - name: "Jackery ProMax Batterie Entladeleistung"
31      unique_id: jackery_promax_batterie_entladeleistung
32      state_topic: "hb/device/DEINE_SN/status"
33      unit_of_measurement: "W"
34      device_class: power
35      state_class: measurement
36      expire_after: 120
37      value_template: >-
38        {%- if value_json.type == 2 and value_json.body.stackOutPw is defined -%}
39          {{ value_json.body.stackOutPw }}
40        {%- endif -%}
41
42    # Solar gesamt
43    - name: "Jackery ProMax Solar Leistung"
44      unique_id: jackery_promax_solar_leistung
45      state_topic: "hb/device/DEINE_SN/status"
46      unit_of_measurement: "W"
47      device_class: power
48      state_class: measurement
49      expire_after: 120
50      value_template: >-
51        {%- if value_json.type == 2 and value_json.body.pvPw is defined -%}
52          {{ value_json.body.pvPw }}
53        {%- endif -%}
54
55    # AC-Abgabe ins Haus (outOngridPw)
56    - name: "Jackery ProMax AC Abgabe"
57      unique_id: jackery_promax_ac_abgabe
58      state_topic: "hb/device/DEINE_SN/status"
59      unit_of_measurement: "W"
60      device_class: power
61      state_class: measurement
62      expire_after: 120
63      value_template: >-
64        {%- if value_json.type == 2 and value_json.body.outOngridPw is defined -%}
65          {{ value_json.body.outOngridPw }}
66        {%- endif -%}
67
68    # Zellentemperatur (Zehntelgrad -> °C)
69    - name: "Jackery ProMax Zellentemperatur"
70      unique_id: jackery_promax_zellentemperatur
71      state_topic: "hb/device/DEINE_SN/status"
72      unit_of_measurement: "°C"
73      device_class: temperature
74      state_class: measurement
75      expire_after: 120
76      value_template: >-
77        {%- if value_json.type == 2 and value_json.body.cellTemp is defined -%}
78          {{ (value_json.body.cellTemp | float / 10) | round(1) }}
79        {%- endif -%}

Weitere Sensoren nach demselben Muster: pv1.pvPw bis pv4.pvPw für die einzelnen MPPT-Strings, inOngridPw für den AC-Bezug, wsig für das WLAN-Signal, batNum für die Anzahl der Zusatzakkus und socChgLimit bzw. socDischgLimit für die Lade- und Entladelimits.

Schritt 2.3: Netto-Batterieleistung als Template-Sensor

Ein einzelner Wert, positiv heißt laden, negativ heißt entladen. Der availability-Guard ist Pflicht. Ohne ihn macht float(0) aus einem unavailable eine echte Null und HA verbucht das als Zählerreset. Das erzeugt Phantom-kWh, die du danach mühsam wieder loswerden musst.

yaml
1template:
2  - sensor:
3      - name: "Jackery ProMax Batterie Leistung"
4        unique_id: jackery_promax_batterie_leistung
5        availability: "{{ has_value('sensor.jackery_promax_batterie_ladeleistung') and has_value('sensor.jackery_promax_batterie_entladeleistung') }}"
6        unit_of_measurement: "W"
7        device_class: power
8        state_class: measurement
9        state: >-
10          {{
11            (states('sensor.jackery_promax_batterie_ladeleistung') | float(0)) -
12            (states('sensor.jackery_promax_batterie_entladeleistung') | float(0))
13          }}

Schritt 2.4: Aus Leistung wird Energie

Das Energie-Dashboard braucht kWh, keine Watt. Die integration-Plattform summiert die Leistung über die Zeit auf. max_sub_interval ist dabei wichtig: Ohne die Option zählt der Sensor nur weiter, wenn ein neuer Messwert reinkommt. Bleibt die Leistung eine Weile konstant, steht der Zähler still und die Energie fehlt.

yaml
1sensor:
2  - platform: integration
3    source: sensor.jackery_promax_solar_leistung
4    name: Jackery ProMax Solar Energie
5    unique_id: jackery_promax_solar_energie
6    unit_prefix: k
7    unit_time: h
8    round: 3
9    method: trapezoidal
10    max_sub_interval:
11      minutes: 5
12
13  - platform: integration
14    source: sensor.jackery_promax_batterie_ladeleistung
15    name: Jackery ProMax Batterie geladen
16    unique_id: jackery_promax_batterie_geladen
17    unit_prefix: k
18    unit_time: h
19    round: 3
20    method: trapezoidal
21    max_sub_interval:
22      minutes: 5
23
24  - platform: integration
25    source: sensor.jackery_promax_batterie_entladeleistung
26    name: Jackery ProMax Batterie entladen
27    unique_id: jackery_promax_batterie_entladen
28    unit_prefix: k
29    unit_time: h
30    round: 3
31    method: trapezoidal
32    max_sub_interval:
33      minutes: 5

Schritt 2.5: Tages-, Monats- und Jahreszähler

yaml
1utility_meter:
2  jackery_promax_solar_tag:
3    name: Jackery ProMax Solar Heute
4    unique_id: jackery_promax_solar_tag
5    source: sensor.jackery_promax_solar_energie
6    cycle: daily
7
8  jackery_promax_solar_monat:
9    name: Jackery ProMax Solar Monat
10    unique_id: jackery_promax_solar_monat
11    source: sensor.jackery_promax_solar_energie
12    cycle: monthly
13
14  jackery_promax_solar_jahr:
15    name: Jackery ProMax Solar Jahr
16    unique_id: jackery_promax_solar_jahr
17    source: sensor.jackery_promax_solar_energie
18    cycle: yearly

Schritt 2.6: Die Poll-Automation

Das ist das Herzstück des ganzen Setups. Ohne diese Automation bleibt alles leer, weil das Gerät von sich aus nichts sendet. Alle 10 Sekunden wird ein type: 25-Frame rausgeschickt:

yaml
1automation:
2  - id: jackery_promax_mqtt_poll
3    alias: "Jackery ProMax: MQTT Status-Poll"
4    description: "Fragt alle 10s den Status des SolarVault ab (type 25)."
5    mode: single
6    triggers:
7      - trigger: time_pattern
8        seconds: "/10"
9    actions:
10      - action: mqtt.publish
11        data:
12          topic: "hb/device/DEINE_SN/action"
13          payload: >-
14            {{ {
15              "type": 25,
16              "eventId": 0,
17              "messageId": range(1000, 9999) | random,
18              "ts": now().timestamp() | int,
19              "token": "DEIN_TOKEN",
20              "body": none
21            } | tojson }}

Schritt 2.7: Prüfen und neu starten

Unter Einstellungen → System → Reparaturen kannst du die Konfiguration prüfen lassen. Danach Home Assistant neu starten. In den Werkzeugen (bis Version 2026.7 hießen sie Entwicklerwerkzeuge) unter Zustände nach jackery_promax filtern. Die Werte sollten sich innerhalb von etwa 10 Sekunden füllen.

Tun sie das nicht, ist meistens eines dieser drei Dinge das Problem: die Poll-Automation ist nicht aktiv, SN oder Token sind falsch, oder das Gerät hat sich gar nicht erst am Broker angemeldet (zurück zu Schritt 0).

Beide Wege parallel? Wenn du Weg 1 und Weg 2 gleichzeitig nutzt, also die HACS-Integration für Gerät 1 und ein Package für Gerät 2, musst du sicherstellen, dass die Geräte sauber getrennt bleiben. Die Integration filtert standardmäßig nicht nach Seriennummer und kann Frames des zweiten Geräts fälschlich den eigenen Entities zuordnen. In meinem Setup ist die Integration deshalb mit einem SN-Filter gepatcht. Für die meisten, die nur ein Gerät haben, ist das kein Thema.

Das Energie-Dashboard einrichten

Das gilt für beide Wege gleichermaßen. Einstellungen → Dashboards → Energie, dort pro Gerät:

  • Solarpanele: die Solar-Energie-Entity (…_solar_energie beim MQTT-Package, oder die entsprechende Entity aus der HACS-Integration)
  • Batterie: je eine Entity für Energie in den Akku und aus dem Akku

Auch hier gilt: unbedingt die Entities nehmen, die auf stackIn/stackOut basieren, nicht die Master-only-Felder. Sonst zeigt das Dashboard zu wenig Akku-Durchsatz.

Feintuning und was ich sonst noch beachte

expire_after: 120 setzt einen Sensor auf unavailable, wenn 2 Minuten kein Frame angekommen ist. Das ist wahnsinnig praktisch, weil du sofort siehst, wenn ein Gerät offline ist, statt einem eingefrorenen Wert zu vertrauen.

Das Poll-Intervall von 10 Sekunden ist ein guter Kompromiss. Schneller bringt kaum mehr, belastet aber Broker und Gerät unnötig.

Für ein zweites Gerät legst du einfach ein zweites Package an, mit eigener SN, eigenem Token und eigenen unique_ids. Alles andere bleibt gleich.

Und noch ein kurzer Ausblick: Das Gerät lässt sich auch steuern. number.jackery_max_output_power_ongrid (intern maxOutPw) kann aus HA gesetzt werden, das ist der Hebel für eine dynamische Nulleinspeisung. Das ist aber Stoff für ein eigenes Thema.

Jackery hat mir übrigens bestätigt, dass der Netzwerk-Parallelbetrieb voraussichtlich im Juli kommt. Dann können zwei SolarVaults miteinander kommunizieren und teilen sich ein Smart Meter, aktuell braucht jedes seinen eigenen. Bis dahin ist das hier der Weg.

Weiterführende Inhalte

Nutzt du den SolarVault schon in Home Assistant, oder bist du gerade beim Einrichten? Schreib mir gerne, welchen Weg du nimmst und wie es läuft.

Diskussion im Forum

Hast du Fragen oder Ideen zu diesem Thema?

Diskutiere im Forum

Video teilen

Community

Unterstütze den Kanal

Hat dir der Beitrag geholfen? Es gibt zwei Wege, etwas zurückzugeben.