Der Marstek Offline Endpoint ist ein kleiner Container für den Heimserver, der den Telemetrie-Upload beantwortet, den ein Marstek Venus (Venus E, Venus D, Venus E v3) erwartet. Die Batterie setzt daraufhin ihren Netzwerkchip nicht mehr alle halbe Stunde zurück, Modbus TCP bleibt erreichbar, und die Messwerte verlassen das Heimnetz nicht.
Das Problem
Auf der Control-Firmware v150 puffert das Gerät Telemetrie-Datensätze und lädt sie in die Marstek-Cloud hoch. Leert der Upload den Puffer nicht, setzt die Firmware den eigenen Netzwerkchip nach einem festen Timer per Hardware zurück: bei Ethernet (CH395) nach 1800 s, bei WLAN (FC41D) nach 900 s. Während des Resets ist das Gerät weg – Modbus-Sitzungen sterben, Ping bleibt aus, zwei bis drei Sekunden später ist alles zurück. In Home Assistant zeigt sich das als regelmäßig „nicht verfügbare“ Batterie und als Modbus-Zeitüberschreitungen. Wer die Batterie vom Internet fernhält, bekommt genau das.
Wie es funktioniert
Zwei DNS-Einträge (marstekcloud.com und hamedata.com) zeigen auf die Maschine, auf der der Container läuft. Er beantwortet, was die Firmware erwartet, der Puffer läuft nie voll, der Reset feuert nicht. An der Batterie wird nichts verändert, es gibt keine Einstellung und keine Firmware zu flashen. Nebenbei entstehen die eigenen Telemetriedaten lokal: rund siebzig Felder je Upload in einer JSONL-Datei. Zusätzlich beantwortet der Container die Zeitabfrage, sodass die Batterie ihre Uhr von der lokalen Maschine setzt.
Das Image gibt es für amd64, 386, arm64, armv7 und armv6 – vom normalen Server über ein NAS bis zum Raspberry Pi Zero. Ein Docker-Aufruf genügt; TZ sollte gesetzt werden, weil der echte Endpunkt in der Ortszeit des Geräts antwortet.
Grenzen
- MQTT wird nicht bedient und kann es nicht: Das Gerät prüft das Zertifikat des Brokers gegen eine CA im Flash und legt ein eigenes Client-Zertifikat vor. Der MQTT-Broker darf nicht umgeleitet werden.
- Andere Endpunkte werden protokolliert und mit 404 beantwortet, nicht geraten.
- Der Container muss laufen: Fällt er lange genug aus, dass der Puffer sich füllt, beginnen die Resets von vorn.
--restart unless-stoppedund ein beim Booten startendes Docker sind Pflicht. - Seit v150 läuft der Upload über TLS. Jeder Upload kostet das Gerät etwa vier Sekunden für den Schlüsselaustausch, in denen es kein Modbus beantwortet. Das lässt sich nicht beheben; ein Modbus-Client sollte deshalb ein Antwort-Timeout über 8 Sekunden haben.
- Der Container ist bewusst TLS-permissiv und gehört nicht ins Internet.
Gemessen wurde auf einer Venus D mit Control v150: vorher ein Abbruch alle 1824 s, danach sieben Stunden keiner; ein zweites Gerät in einem anderen Haushalt bestätigte das über 12,8 Stunden. Die Analyse stammt aus dem Firmware-Reverse-Engineering; die passende Home-Assistant-Seite liefert die Marstek Modbus Suite. Ausführliche Anleitungen (Deutsch und Englisch) gibt es im Repository, von der leeren SD-Karte bis zum DNS-Eintrag in Pi-hole oder AdGuard Home.