Marstek CT Smart Meter Integration (CT002/CT003) für HACS

Hallo zusammen,

ich möchte euch meine Custom Integration für das Marstek CT Smart Meter (CT002/CT003) vorstellen.

Ziel war es, eine einfache und stabile Möglichkeit zu schaffen, das Gerät direkt über die Benutzeroberfläche in Home Assistant einzubinden und die Daten rein lokal abzufragen.

Einige Highlights:

  • :laptop: Komplett über die UI konfigurierbar
  • :satellite_antenna: Rein lokale Datenabfrage (keine Cloud)
  • :battery: Unterstützung für mehrere Speicher am selben CT-Meter
  • :bar_chart: Viele Sensoren, die bei Bedarf einzeln aktiviert werden können

Alle weiteren Details zur Installation, Konfiguration und zu den Features findet ihr direkt auf der Projektseite auf GitHub. Die Installation erfolgt ganz einfach über HACS als “Benutzerdefiniertes Repository”.

:right_arrow: Hier geht’s zum GitHub-Projekt: d-shmt/hass_marstek-smart-meter

Ich freue mich über Feedback, Fehlermeldungen oder Vorschläge direkt auf der GitHub-Seite.

Viel Spaß damit! :rocket:

Hi, coole Integration. Hat auf Anhieb funktioniert. Warum wird die Mac vom Speicher benötigt? Ich habe auch z.B. zwei von marstek.

Hi, die Logik des Skripts kommt nicht direkt von mir, ich habe das Ganze nur als Integration verpackt. Soweit ich das aber beurteilen kann wird der Speicher dem Smart Meter gegenüber emuliert und dieses sendet dann die Daten an den „Speicher“ (was in unserem Fall dann die Home Assistant Instanz ist) und wir können diese dann weiterverarbeiten.

Wenn du 2 Speicher hast kannst du auch mehrere Einträge der Integration hinzufügen.

Hätte auch interesse gehabt, wollte mir den Marstek kaufen, wenn ich auf den link klicke öffnen bei mir nur Google^^

Hier der tatsächliche Link zum Repository: https://github.com/d-shmt/hass_marstek-smart-meter

Ich hätte da mal eine Frage. Verstehe ich das richtig das deine Marstek CT Meter - Home Assistant Integration den ct002 und auch den venus e die entitäten ausliest und bereitstellt?

Die Integration emuliert einen Speicher und greift die Werte ab die dann vom Smart Meter gesendet werden. Informationen vom Speicher sind davon nicht betroffen.

Ich konnte die Integration anhand der Anleitung gut hinzufügen, vielen Dank. Das SmartMeter ist bei mir in der FritzBox als “wlan0” aufgeführt, vielleicht hilft das jemandem beim Suchen. Die MACs habe ich in der App unter Einstellungen→Gerät gefunden.
Allerdings bekomme ich beim Konfigurieren der Integration den Fehler “Verbindung zum Meter fehlgeschlagen. Prüfe die IP-Adresse.” - Die IP ist aber ziemlich sicher die Korrekte, da es das einzige WLAN-Gerät an der Fritzbox ist (alles andere ist per LAN). Das Smart-Meter ist auch verbunden, denn ich bekomme Live-Werte in der App. Hat jemand einen Tipp für mich, woran es liegen könnte?
Vielen Dank und viele Grüße
Paul

Hi,

funktioniert die Integration auch mit mehreren Venus E 3.0 Geräten?

Beste Grüße!

Hallo Paul, ich habe aktuell genau das gleich Problem, hast du schon eine Lösung gefunden?? Ich bin noch am Suchen wie ich die Daten aus dem CT002 heraus bringe. LG Hans

Hallo Hans,

ich wünschte, ich könnte mich erinnern. Ich weiß noch, dass ich ziemlich lange verzweifelt bin, aber nicht mehr, was die Lösung war. So kann ich Dir bedauerlicherweise nur sagen, dass es am Ende funktioniert hat :-/

Wenn es mir in einer schlaflosen Nacht wieder einfällt, werde ich es sofort hier mitteilen.

Viele Grüße

Moin,

ich weiß nicht ob das noch aktuell ist, aber bei mir gab es auch diesen Fehler mit “Verbindung zum Meter fehlgeschlagen. Prüfe die IP-Adresse.” ich konnte es lösen indem ich die MAC vom Speicher und vom CT002 in Kleinbuchstaben eingetragen habe.

Mit 0123ABCDEF z.B. ging es nicht aber mit 0123abcdef ging es der scheint echt auf Groß- und Kleinschreibung zu achten.

Versuche es einfach mal mit alles klein schreiben.

War ein Kampf die Daten herauszufinden. Aber meine Erkenntnisse:

  • Bei mir war der CT002 auch ein WLAN0 2,4Ghz Wifi Gerät.
  • Die MAC Adressen müssen kleingeschrieben werden
  • Es muss die “normale” MAC Adresse genommen werden (glaube in der Doku stand oder habe ich irgendwo gelesen, das es nicht die MAC Adresse ist die im Router steht, doch das stimmt nicht. Es ist die reguläre normale MAC nötig).
  • Beim Venus muss die Wifi MAC genommen werden, falls man auch via LAN verbunden ist, diese kann man auch aus dem Router oder der Marstek Local API Integration entnommen werden.

Wie stabil läuft die Integration bei euch? Beobachte das nun 10 Minuten und mal ist es verfügbar, mal nicht. Wifi sollte auf Anschlag sein, da der Router 1m Luftlinie vom CT002 und Venus E 3.0 entfernt ist.

Guten Morgen, die Integration hat sehr gut geklappt, danke.

Leider hab ich es sehr regelmäßig, dass keine Daten abgerufen werden können?
Woran kann das liegen, kann ich daran was ändern?

Danke

Ich hatte das auch, nicht un den Griff bekommen, die Integration letztenflich wieder gelöscht - ich meine die Integration hatte auch Störungen in der Kommunikation zwischen meinen beiden Venussen verursacht, mit dem Resultat, dass die eingeschlafen sind, nichts mehr gemacht hatten.

Seitdem, mit dem Löschen, ist Ruhe, laufen beide Speicher stabil.

Hallo. Ich habe es bei mir im Homeassistant integriert. Nur zeigt er irgendwie nicht das richtige an. Zb Ladeleistung steht 0,00000kw.

Obwohl ich Strom aus dem Jupiter beziehe und von pv Strom kommt.

Weiß da jemand irgendwie weiter?

Hallo,

ich habe auch heute den CT002 nachgeliefert bekommen und wollte den in HA integrieren, damit ich genaue Werte über Netzbezug/Einspeisung bekomme.
Allerdings habe ich aus das Phänomen, dass die Sensoren 30s da, 30s weg, 30s da, 30 s weg sind.
Nervig. WLAN ist stabil. Ich ent-/belade 2x Mars aktuell über eine HA Automation, die die Daten über meine PV Anlage erhält. Das muss ich so machen, damit sich der PV Speicher und die Mars nicht gegenseitig hochschaukeln und be-/entladen.
Das funktioniert sehr gut. Nur sind die Netzbezugdaten über die PV halt noch träger. Drum dachte ich, nehme ich halt die CT daten.

ich habe jetzt mal die “_init_.py” etwas verändert.
zu finden unter: “/homeassistant/custom_components/marstek_ct/_init_.py”
Dann werden die Fehler ignoriert und beim nächsten Verbinden aktualisiert:

"""The Marstek CT Meter integration."""

from __future__ import annotations

import asyncio
from datetime import timedelta
import logging

from homeassistant.config_entries import ConfigEntry
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed

from .api import MarstekCtApi
from .const import DOMAIN

_LOGGER = logging.getLogger(__name__)
PLATFORMS: list[Platform] = [Platform.SENSOR]


async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    """Set up Marstek CT Meter from a config entry."""

    api = MarstekCtApi(
        host=entry.data["host"],
        device_type=entry.data["device_type"],
        battery_mac=entry.data["battery_mac"],
        ct_mac=entry.data["ct_mac"],
        ct_type=entry.data["ct_type"],
    )

    coordinator = None  # Vorab definieren, damit die Referenz sicher existiert

    async def async_update_data():
        """Fetch data from API endpoint with immediate retry on failure."""
        max_attempts = 3
        for attempt in range(max_attempts):  # 3 Versuche (1. + 2 Retries)
            try:
                data = await hass.async_add_executor_job(api.fetch_data)
                if data and "error" not in data:
                    return data  # Erfolgreich!
                _LOGGER.debug(
                    "Fehler beim Versuch %d/%d: %s",
                    attempt + 1,
                    max_attempts,
                    data.get("error") if data else "Keine Daten",
                )
            except Exception as err:
                _LOGGER.debug(
                    "Exception beim Versuch %d/%d: %s", attempt + 1, max_attempts, err
                )

            # 2 Sekunden Pause vor dem nächsten Versuch
            if attempt < max_attempts - 1:
                await asyncio.sleep(2)

        # Wenn alle Versuche fehlschlagen: Alte Daten behalten (falls vorhanden)
        _LOGGER.warning(
            "Marstek API Kollision (%d Versuche fehlgeschlagen), behalte alte Werte.",
            max_attempts,
        )

        # Sichere Abfrage: Nur alte Daten zurückgeben, wenn der Coordinator bereits existiert und Daten hat
        if coordinator is not None and getattr(coordinator, "data", None) is not None:
            return coordinator.data

        raise UpdateFailed("Erster Abruf beim Start fehlgeschlagen.")

    coordinator = DataUpdateCoordinator(
        hass,
        _LOGGER,
        name="marstek_ct_sensor",
        update_method=async_update_data,
        update_interval=timedelta(seconds=25),
    )

    await coordinator.async_config_entry_first_refresh()
    hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
    await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
    return True


async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    """Unload a config entry."""
    if unload_ok := await hass.config_entries.async_unload_platforms(
        entry, PLATFORMS
    ):
        hass.data[DOMAIN].pop(entry.entry_id)
    return unload_ok