Zum Inhalt springen
EN | DE

Benutzerdefinierte Geräte

Beim Anlegen einer Wallbox, eines Heizgeräts, eines Netzzählers, einer Batterie, einer PV-Anlage, eines weiteren Verbrauchers, eines Fahrzeugs, eines Tarifs oder eines Benachrichtigungsdienstes lässt sich in der Geräteliste der Eintrag Benutzerdefiniertes Gerät wählen und eine eigene Logik auf Basis des Plugin-Systems beschreiben.

So lassen sich auch Geräte einbinden, die nicht von einem eingebauten Template abgedeckt sind, z. B. die aktuelle Leistung über einen HTTP-Endpunkt lesen oder einen Zielstrom per Modbus schreiben.

In der Benutzeroberfläche steht bei jedem Gerätetyp der Eintrag Benutzerdefiniertes Gerät in der Template-Auswahl bereit. Damit öffnet sich der Editor für die eigene Konfiguration. Standardmäßig wird ein Gerät mit type: custom angelegt. Der Typ lässt sich bei Bedarf mit einem anderen Wert überschreiben (z. B. type: heatpump).

power:
source: mqtt
topic: home/current/imsys/chn2/raw

Alternativ lässt sich die vollständige Konfiguration direkt in die evcc.yaml schreiben, mit name, type: custom und den Attributen darunter:

meters:
- name: imsys
type: custom
power:
source: mqtt
topic: home/current/imsys/chn2/raw

Alle weiteren Beispiele auf dieser Seite verwenden die flache Attribut-Block-Form, wie sie in der UI eingegeben wird.

Die Liste der verfügbaren Plugin-Quellen (http, mqtt, modbus, …) und Helper (calc, map, watchdog, …) steht in der Plugins-Referenz.

Jedes benutzerdefinierte Gerät besteht aus drei Arten von Feldern:

  • Lese-Attribute — Plugins, die evcc regelmäßig abfragt, um einen Wert zu erhalten (z. B. power, soc, status).
  • Schreib-Attribute — Plugins, die evcc aufruft, um einen Wert zu setzen oder eine Aktion auszulösen (z. B. enable, maxcurrent, wakeup). Der zu schreibende Wert steht im Plugin zur Verfügung.
  • Featuresfeatures-Liste, die abweichendes Verhalten freischaltet. Verfügbare Flags hängen vom Gerätetyp ab.

Allgemeine Form:

# Lese-Attribute
power:
source: http
uri: http://meter.local/power
soc:
source: mqtt
topic: battery/soc
# Schreib-Attribute
enable:
source: http
uri: "http://charger/relay?turn={{if .enable}}on{{else}}off{{end}}"
maxcurrent:
source: mqtt
topic: charger/maxcurrent
payload: ${maxcurrent:%d}
# Features
features:
- heating
- integrateddevice

Welche Attribut-Namen und Feature-Flags verfügbar sind, hängt vom Gerätetyp ab und steht in den nachfolgenden Abschnitten.

Stromzähler werden in der Sektion meters konfiguriert. Zähler unter meters: können an verschiedenen Stellen innerhalb der site Konfiguration referenziert werden:

  • grid: Netzzähler
  • pv: PV-Zähler
  • battery: Hausbatteriezähler
  • charge: Zähler für die Ladeleistung der Wallbox
  • aux: Verbrauchszähler für intelligente Verbraucher
  • ext: Weiterer Zähler, z. B. für Lastmanagement oder Datenerfassung

power ist das einzig erforderliche Attribut. Nicht alle Zählerrollen unterstützen alle Attribute:

  • limitsoc und batterymode werden ausschließlich für Batteriezähler genutzt (referenziert in site.battery).
  • currents, voltages und powers sind Phasen-Attribute, die mit genau drei Plugin-Konfigurationen (als YAML-Array) konfiguriert werden müssen und für Netzzähler (grid) und Wallboxen (charge) verwendet werden können.

Plugins müssen den richtigen Datentyp zurückliefern. Zur Konvertierung dienen die Lese-Pipelines.

AttributTypErfordertKontextBeschreibung
powerfloatjaalleAktuelle Leistung in W
energyfloatneinalleZählerstand in kWh
maxpowerintneinpv (hybrid)Maximale AC-Leistung in W
socintneinbatteryLadestand in %
capacityfloatneinbatteryKapazität in kWh
powers[float,float,float]neinallePhasenleistungen in W. Zur Vorzeichenerkennung bei vorzeichenlosen Strömen.
currents[float,float,float]neinallePhasenströme in A. Zur Erkennung aktiver Phasen.
voltages[float,float,float]neinallePhasenspannungen in V. Zur Anschlusserkennung (1p/3p).
AttributTypErfordertKontextBeschreibung
limitsocintneinbatterySetze Ladeziel für Batterie in %. Das Ladeziel wird aus den konfigurierten MinSoc, MaxSoc und dem aktuellen Ladestand (Attribut soc) berechnet.
batterymodeintneinbatterySetze Lademodus direkt (1: normal, 2: hold, 3: charge)

Lese die aktuelle Netzleistung über einen HTTP-Endpunkt.

power:
source: http
uri: http://zaehler.network.local:8080/api/data.json?from=now
jq: .data.tuples[0][1]

Der Standardtyp type: custom deckt Wallboxen mit stufenloser Stromregelung ab. Für andere Geräte stehen spezialisierte Charger-Typen unter Switchsocket und Wärmepumpen bereit.

AttributTypErfordertBeschreibung
statusstringjaStatus (A..F)
enabledbooljaIst Ladung freigegeben?
powerfloatneinLadeleistung in W
energyfloatneinZählerstand in kWh
identifystringneinAktuelle RFID-Kennung
socintneinLadestand in %
limitsocintneinLadelimit in %
tempfloatneinAktuelle Temperatur in °C (Heizung, Alias für soc)
limittempintneinTemperaturlimit in °C (Heizung, Alias für limitsoc)
finishtimestringneinGeschätztes Ladeende (RFC3339, Go-Duration, Unix-Zeitstempel oder verbleibende Sekunden)
phasesintneinAnzahl der physischen Phasen (1..3)
powers[float,float,float]neinPhasenleistungen in W. Zur Vorzeichenerkennung bei vorzeichenlosen Strömen.
currents[float,float,float]neinPhasenströme in A. Zur Erkennung aktiver Phasen.
voltages[float,float,float]neinPhasenspannungen in V. Zur Anschlusserkennung (1p/3p).
AttributTypErfordertBeschreibung
enablebooljaLadung freigeben / sperren
maxcurrentintjaSetze maximalen Ladestrom in A
maxcurrentmillisfloatneinSetze maximalen Ladestrom in A (mit Nachkommastellen)
phases1p3pintneinPhasenumschaltung durchführen (erfordert tos: true)
wakeupboolneinWecke Fahrzeug auf
FeatureBeschreibung
integrateddeviceGerät ohne angeschlossenes Fahrzeug und ohne Ladesitzungen (z. B. Wärmepumpe, Heizstab, fest installierter Verbraucher). Keine Fahrzeugauswahl.
heatingBehandelt das Gerät als Heizung: SOC und Limits werden in °C statt in % dargestellt.
continuousGerät läuft im “deaktivierten” Zustand eigenständig in seinem Normalbetrieb weiter. Statt “Standby” wird “Normalbetrieb” angezeigt. Eine Empfehlung zur Leistungserhöhung (z. B. bei PV-Überschuss oder günstigem Strom) wird als “Boost” gekennzeichnet.
switchdeviceGerät kann nur ein- und ausgeschaltet werden (keine stufenlose Stromregelung). Min/Max-Strom-Einstellungen und der Min+PV-Modus werden ausgeblendet.

Häufige Feature-Kombinationen aus den vorkonfigurierten Templates:

Heizstab:

features:
- integrateddevice
- heating

Steckdose:

features:
- switchdevice
- integrateddevice # optional, wenn die Steckdose einen festen Verbraucher schaltet
- heating # optional, wenn ein Heizgerät geschaltet wird

Wärmepumpe:

features:
- integrateddevice
- heating
- continuous
- switchdevice # optional, wenn keine Stromregelung vorhanden (SG Ready)

Frage den Ladestatus einer Wallbox per Modbus ab.

features:
- integrateddevice
enabled:
source: modbus
id: 4711
uri: modbus.local:502
rtu: false
register:
address: 100
type: holding
decode: uint16

Schalte eine Tasmota-Steckdose per MQTT-Nachricht.

enable:
source: mqtt
broker: mosquitto.local:883
topic: cmd/unu-switch/Power
payload: ON

type: switchsocket

Für schaltbare Steckdosen und vergleichbare Relais-Geräte, die nur ein-/ausgeschaltet werden können, ohne stufenlose Stromregelung. Der Ladestatus wird aus der aktuellen Leistung abgeleitet (oberhalb standbypower gilt als Laden). Vollständige Einrichtung unter Schaltbare Steckdosen.

AttributTypErfordertBeschreibung
enabledbooljaStatus der Steckdose (an/aus)
powerfloatjaAktuelle Leistung in W
energyfloatneinZählerstand in kWh
socfloatneinLadestand in %
enablebooljaSteckdose ein-/ausschalten
standbypowerfloatneinSchwellwert in W. Darüber: Laden, darunter: Standby. Negativ: statisch (keine Leistungsmessung möglich)

Für Wärmepumpen und vergleichbare Heizgeräte gibt es eigene Charger-Typen mit jeweils eigenen Attributen. Die vollständige Einrichtung ist unter Wärmepumpen, Heizstäbe beschrieben.

type: heatpump

Für wechselrichtergesteuerte Wärmepumpen, die einen kontinuierlichen Leistungs-Sollwert per Modbus, HTTP o. Ä. annehmen. Die Ziel-Heizleistung wird direkt über setmaxpower geschrieben.

AttributTypErfordertBeschreibung
powerfloatneinAktuelle Leistung in W
energyfloatneinZählerstand in kWh
tempfloatneinAktuelle Temperatur in °C
limittempintneinGeräte-internes Temperaturlimit in °C
setmaxpowerintjaSetze maximale Heizleistung in W
getmaxpowerfloatneinAktuelle maximale Heizleistung in W

Fahrzeugparameter können ebenfalls über Plugins ausgelesen werden.

AttributTypErfordertBeschreibung
socintjaLadestand in %
limitsocintneinLadelimit in %
statusstringneinStatus (A..F)
rangeintneinReichweite in km
odometerintneinKilometerstand in km
climaterboolneinKlimatisierung aktiv?
getmaxcurrentfloatneinMaximaler Ladestrom in A
finishtimestringneinGeschätztes Ladeende (RFC3339, Go-Duration, Unix-Zeitstempel oder verbleibende Sekunden)
AttributTypErfordertBeschreibung
wakeupboolneinFahrzeug aufwecken
chargeenableboolneinStarte/stoppe den Ladevorgang
maxcurrentintneinSetze maximalen Ladestrom in A
AttributTypErfordertBeschreibung
titlestringneinAnzeigename des Fahrzeugs
capacityfloatneinBatteriekapazität in kWh
iconstringneinIcon in der Benutzeroberfläche
FeatureBeschreibung
coarsecurrentFahrzeug akzeptiert den Ladestrom nur in ganzen 1 A Schritten. Die Regelung wird auf grobe 1 A-Stufen beschränkt, auch wenn die Wallbox feiner regeln könnte.
streamingFahrzeug liefert Daten per Push statt per Polling (z. B. BMW Cardata). SOC-Updates außerhalb aktiver Ladevorgänge werden als zuverlässig behandelt.
welcomechargeFahrzeug erwartet beim Anschließen eine aktive Wallbox, um die Verbindung als funktionierend zu erkennen. Andernfalls meldet das Fahrzeug einen Fehler.

Lese die aktuelle Reichweite aus MQTT-Nachrichten.

title: Grüner Mazda # Anzeigename (optional)
capacity: 50 # Batteriekapazität in kWh (optional)
features:
- coarsecurrent
range:
source: mqtt
topic: mazda2mqtt/c53/chargeInfo/drivingRangeKm

Ein Auto per HTTP-Ping aufwecken, bevor weitere Abfragen folgen.

wakeup:
source: http
uri: http://teslalogger.local:5000/command/08154711/wake_up

onIdentify setzt den Lademodus automatisch, sobald das Fahrzeug erkannt wird.

soc:
source: mqtt
topic: car/soc
onIdentify:
mode: pv

Verfügbare Modi sind: off, now, minpv, pv.

Ein benutzerdefinierter Tarif bindet eine eigene Wertquelle über den Plugin-Mechanismus an. Das Attribut tariff legt fest, was die Quelle liefert und in welcher Einheit.

Die Attribute price und forecast schließen sich gegenseitig aus. Genau eines der beiden ist erforderlich.

AttributTypBeschreibung
pricefloatAktueller Wert. Float-Wert des Plugins.
forecaststringVorhersage als JSON-String mit einer Liste von Zeiträumen und Werten (siehe Schema unten). Stündlich geholt.
AttributTypErfordertBeschreibung
tariffstringneinprice (Standard), co2 oder solar. Bestimmt die Einheit der zurückgegebenen Werte: Preis in konfigurierter Währung pro kWh, CO₂-Intensität in g/kWh, Solar-Vorhersage in W.
chargesfloatneinFester Aufschlag pro kWh, der zu jedem Wert addiert wird. Standard 0.
taxfloatneinProzentualer Steuersatz auf das Ergebnis, z. B. 0.2 für 20 %. Standard 0.
formulastringneinGo-Ausdruck für eine eigene Berechnung, mit price, charges und tax im Scope. Siehe Beispiele.
intervaldurationneinAbfrageintervall für forecast. Standard 1h.
cachedurationneinCache-Dauer für price. Standard 15m.
FeatureBeschreibung
averageGlättet feingranulare Preisstufen (z. B. 15-Minuten-Werte) zu Stundenmittelwerten.
cacheableSpeichert abgerufene Werte persistent. Bei Neustart oder Ausfall des Anbieters dienen sie als Fallback (bis zu 24 Stunden).

Aktueller Preis via HTTP:

price:
source: http
uri: https://example.com/api/price

Vorhersage via HTTP:

forecast:
source: http
uri: https://api.allinpower.nl/troodon/api/p/spot_market/prices/?product_type=ELK
jq: '[.timestamps, .prices] | transpose | map({ "start": (.[0] | strptime("%Y-%m-%dT%H:%M:%S.%f%z") | strftime("%Y-%m-%dT%H:%M:%SZ")), "end": (.[0] | strptime("%Y-%m-%dT%H:%M:%S.%f%z") | mktime + 3600 | strftime("%Y-%m-%dT%H:%M:%SZ")), "value": .[1] }) | tostring'

Das Plugin muss eine JSON-Struktur mit einer Liste von Zeiträumen und Preisen zurückgeben. Die Datumsfelder müssen in der Form YYYY-MM-DDTHH:MM:SSZ vorliegen, der Preis in der korrekten Währungseinheit (z. B. EUR). evcc arbeitet intern mit 15-Minuten-Intervallen; Plugins können auch stündliche Daten liefern, die automatisch in 15-Minuten-Intervalle umgerechnet werden.

[
{
"start": "2025-01-01T00:00:00Z",
"end": "2025-01-01T00:15:00Z",
"value": 25.0
},
{
"start": "2025-01-01T00:15:00Z",
"end": "2025-01-01T00:30:00Z",
"value": 26.5
},
{
"start": "2025-01-01T00:30:00Z",
"end": "2025-01-01T00:45:00Z",
"value": 24.8
},
{
"start": "2025-01-01T00:45:00Z",
"end": "2025-01-01T01:00:00Z",
"value": 27.2
}
]

Das formula-Feld akzeptiert einen Go-Ausdruck mit price, charges, tax und dem Slot-Zeitstempel ts im Scope. Die math-Bibliothek und time.Time-Methoden auf ts stehen zur Verfügung. Die Formel wird für den aktuellen Preis und jeden Forecast-Slot ausgeführt.

Preisobergrenze:

charges: 0.22
tax: 0.19
formula: math.Min(0.5, (price + charges) * (1 + tax))

Deckelt das Ergebnis bei 50 ct/kWh.

Keine Einspeisevergütung bei negativen Börsenpreisen (deutsche PV-Anlagen, Inbetriebnahme ab 25. Februar 2025):

formula: factor := 1.0; if price < 0 { factor = 0.0 }; factor * 0.07

Zahlt eine feste Einspeisevergütung von 7 ct/kWh, außer wenn der Börsenstrompreis negativ ist.