Plugins
Plugins können verwendet werden, um Geräte und externe Datenquellen in evcc zu integrieren, für die es keine direkte Unterstützung gibt. Plugins können für folgende Kategorien verwendet werden:
meter
: PV, Batterie, Netz, Zählercharger
: Wallboxen, Smarte Schalter, Wärmepumpen, Heizstäbevehicle
: Fahrzeugetariff
: Tarife, Vorhersagencircuit
: Lastmanagement
Zusätzlich können Plugins auch für die in Messaging beschriebenen Endpunkte zum Versenden von Lifecycle-Events genutzt werden.
Übersicht
evcc bietet folgende Plugins an:
- Modbus Plugin - Plugin zum Auslesen von einem Modbus-fähigen Gerät.
- MQTT Plugin - Plugin um indirekt über MQTT mit den MQTT-fähigen Geräten zu kommunizieren.
- HTTP Plugin - Plugin, das über HTTP-API mit Endgeräten spricht.
- Websocket Plugin - Plugin zum Empfangen von Gerätedaten über einen eigenen Webserver. Kann nur zum Lesen von Daten genutzt werden.
- SMA/Speedwire Plugin - Plugin speziell für SMA Geräte, die mit dem Speedwire Protokoll kommunizieren können.
- JavaScript Plugin - Plugin, das Werte in über ein JavaScript Skript bereitstellt oder entgegennimmt.
- Shell Plugin - Plugin, das ein Shell Skript ausführen kann, um Daten zu extrahieren oder schreibend entgegennimmt.
Neben diesen Integrations-Plugins, gibt es noch Helfer-Plugins, die Zusatzfunktionen bereit stellt:
- Const Plugin - Spezielles Plugin das einfach einen konstanten Wert zurückliefert.
- Calc Plugin - Meta-Plugin um Ausgaben von anderen Plugins arithmetisch zu verknüpfen.
- Combined Plugin - Meta-Plugin speziell für
charger
um die booleschen Status-Werte für den angeschlossenen (plugged) und ladenden (charging) Zustand zu einem einzigen Ladestatus zu kombinieren.
Syntax
Jedes Plugin besitzt ein individuelles Konfigurationsschema. Dabei ist es wichtig zu wissen, ob das Plugin in einem lesenden oder schreibenden Kontext verwendet wird. Einige Konfigurationsparameter machen nur in einem lesenden Kontext Sinn, andere nur, wenn sie im Schreibmodus genutzt werden.
Beispielsweise kann über die folgende Konfiguration ein MQTT Plugin als meter
eingebunden werden, bei dem der aktuelle Stromverbrauch über das spezifizierte MQTT Topic eingelesen wird:
meters:
- name: imsys
type: custom
power:
source: mqtt
topic: "home/current/imsys/chn2/raw"
Das Schema der Plugin Konfiguration hat dabei immer folgende Struktur:
- name: <name>
type: custom
<attr1>:
source: <plugin>
<p-attr1>: ...
<p-attr2>: ...
....
<attr2>:
....
Dabei steht <name>
für den Namen des Geräts, <attr1>
und <attr2>
für eine der unten beschriebenen Geräte-spezifischen Attribute, <plugin>
für den Plugin-Typ und <p-attr1>
, <p-attr2>
für Plugin-spezifische Konfigurationen (z.b. source
, topic
für Plugins vom Typ mqtt
)
Lesen
Beim Lesen von Daten mithilfe eines Plugins können sogenannte Pipelines verwendet werden. Damit können Daten aus der Ausgabe des Plugins fein granular extrahiert werden. Dies ermöglicht es, komplexe Datenstrukturen wie JSON oder XML zu verarbeiten und die benötigten Informationen herauszufiltern. Mögliche Parameter für die Datenextraktion sind:
regex
: Ein regulärer Ausdruck, um Werte aus dem empfangenen Text zu extrahieren.jq
: Ein jq-Ausdruck, um Werte aus JSON-Strukturen zu extrahieren. Die volle Syntax und Möglichkeiten finden sich in der jq-Dokumentation.unpack
: Konvertiert Werte aus anderen Zahlenrepräsentationen, z. B.hex
.decode
: Dekodiert Binärformate wieuint32
,float32
etc.
Schreiben
Beim Schreiben können Parameter in der Konfiguration durch Platzhalter ersetzt werden.
Die Daten werden in Form von ${var[:format]}
zur Verfügung gestellt.
Wenn Format nicht angegeben wird, werden die Daten im Standard %v Go-Format bereitgestellt.
Die Variablen werden mit dem entsprechenden Wert ersetzt, bevor das Plugin ausgeführt wird.
Zusätzlich können sämtliche Funktionen der Go Template Library verwendet werden, um komplexere Datentransformationen durchzuführen.
Je nach Gerät (meter
, charger
oder vehicle
) können andere Attribute mit Plugins gelesen oder gesetzt werden.
Meter
Stromzähler werden in der Konfigurationssektion meters
konfiguriert.
Zähler, die unter meters:
definiert werden, können an verschiedenen Stellen innerhalb der site
Konfiguration verwendet werden:
grid
: Netzzählerpv
: PV Zählerbattery
: Hausbatteriezählercharge
: Zähler für die Ladeleistung der Wallboxaux
: Verbrauchszähler für intelligente Verbraucherext
: weiterer Zähler, bspw. für Lastmanagement oder Datenerfassung
power
ist das einzig zwingend erforderliche Attribut das in jeder meter
Definition vorhanden sein muss, alle weiteren Attribute sind optional.
Jedoch unterstützen nicht alle Metertypen alle Pluginattribute:
limitsoc
undbatterymode
werden ausschließlich für Batteriezähler genutzt (d.h. fürmeter
die insite.battery
referenziert werden).currents
,voltages
undpowers
sind Phasen Attribute, die mit jeweils genau drei Plugin-Konfigurationen (in einem YAML Array) konfiguriert werden müssen und für Netzzähler (grid
) und Wallboxen (charge
) verwendet werden können.
Die folgenden Tabellen enthalten alle Attribute, die von Plugins bereitgestellt werden können, wenn sie für meter
konfiguriert werden.
Bei der Verwendung der Plugins ist es auch wichtig, dass diese den richtigen Datentyp zurückliefern.
Um zu dem verlangten Datentypen zu konvertieren, können die in Lesen beschriebenen Pipelines genutzt werden.
Attribut | Typ | Erfordert | Kontext | Beschreibung |
---|---|---|---|---|
power | float | ja | alle | Aktuelle Leistung in W |
energy | float | nein | alle | Zählerstand in kWh |
maxpower | int | nein | pv (hybrid) | Maximale AC-Leistung in W |
soc | int | nein | battery | Ladestand in % |
capacity | float | nein | battery | Kapazität in kWh |
powers | [float,float,float] | nein | alle | Phasenleistungen in W |
currents | [float,float,float] | nein | alle | Phasenströme in A |
voltages | [float,float,float] | nein | alle | Phasenspannungen in V |
Beispiel
In diesem Beispiel wird die Konfiguration eines Meters um die aktuelle elektrische Gridleistung über einen HTTP-Aufruf abgefragt:
meters:
- name: volkszaehler
type: custom
power:
source: http
uri: http://zaehler.network.local:8080/api/data.json?from=now
jq: .data.tuples[0][1]
site:
meters:
grid: volkszaehler
...
...
Neben den Attributen, die Plugins zur lesenden Auswertung bereitstellen, werden folgende Attribute von evcc genutzt, um Aktionen zu triggern:
Attribut | Typ | Erfordert | Kontext | Beschreibung |
---|---|---|---|---|
limitsoc | int | nein | battery | Setze Ladeziel für Batterie in %. Das Ladeziel wird aus den konfigurierten MinSoc , MaxSoc und dem aktuellen Ladestand (Attribut soc ) berechnet. |
batterymode | int | nein | battery | Setze Lademodus direkt (1: normal, 2: hold, 3: charge) |
Charger
Wallboxen und Ladegeräte haben folgende Attribute die ausgelesen werden können:
Attribut | Typ | Erfordert | Beschreibung |
---|---|---|---|
status | string | ja | Status (A..F) |
enabled | bool | ja | Ist Ladung freigegeben? |
power | float | nein | Ladeleistung in W |
energy | float | nein | Zählerstand in kWh |
identify | string | nein | Aktuelle RFID-Kennung |
soc | int | nein | Ladestand in % |
phases | int | nein | Anzahl der physischen Phasen (1..3) |
powers | [float,float,float] | nein | Phasenleistungen in W |
currents | [float,float,float] | nein | Phasenströme in A |
voltages | [float,float,float] | nein | Phasenspannungen in V |
temp | float | nein | Aktuelle Temperatur in °C (Heizung) |
templimit | int | nein | Temperaturlimit in °C (Heizung) |
getmode | int | nein | SG-Ready Modus (Wärmepumpe) |
Beispiel
Dieses Beispiel zeigt, wie man über das Modbus-Plugin den Ladestatus (ladend/nicht ladend) eines Chargers abfragen kann:
chargers:
- name: icharge
type: custom
enabled:
source: modbus
id: 4711
uri: modbus.local:502
rtu: false
register:
address: 100
type: holding
decode: uint16
Neben den read-only Werten können über Plugins auch Aktionen getriggert oder Konfigurationswerte gesetzt werden:
Attribut | Typ | Erfordert | Beschreibung |
---|---|---|---|
enable | bool | ja | Ladung freigeben / sperren |
maxcurrent | int | ja | Setze maximalen Ladestrom in A |
maxcurrentmilis | float | nein | Setze maximalen Ladestrom in A |
phases1p3p | int | nein | Phasenumschaltung durchführen (erfordert tos: true ) |
wakeup | bool | nein | Wecke Fahrzeug auf |
setmode | int | nein | Ändere SG-Ready Modus (1: normal, 2: boost, 3: stop) |
Beispiel
Dieses Beispiel schaltet eine Tasmota-Steckdose über eine MQTT Nachricht gesendet an:
chargers:
- name: unu-charger
type: custom
enable:
source: mqtt
broker: mosquitto.local:883
topic: cmd/unu-switch/Power
payload: ON
Vehicle
Fahrzeugparameter können ebenfalls über Plugins ausgelesen werden.
Attribut | Typ | Erfordert | Beschreibung |
---|---|---|---|
soc | int | ja | Ladestand in % |
limitsoc | int | nein | Ladelimit in % |
status | string | nein | Status (A..F) |
range | int | nein | Reichweite in km |
odometer | int | nein | Kilometerstand in km |
climater | bool | nein | Klimatisierung aktiv? |
getmaxcurrent | float | nein | Maximaler Ladestrom in A |
finishtime | string | nein | Geplantes Ladeende (RFC3339) |
Beispiel
Im folgenden Beispiel wird die aktuelle Reichweite des Fahrzeugs aus MQTT Nachrichten gelesen:
vehicles:
- name: Mazda
type: custom
range:
source: mqtt
topic: mazda2mqtt/c53/chargeInfo/drivingRangeKm
Zusätzlich können spezielle Kommandos über Plugins an das Fahrzeug geschickt werden:
Attribut | Typ | Erfordert | Beschreibung |
---|---|---|---|
wakeup | bool | nein | Fahrzeug aufwecken |
chargeenable | bool | nein | Starte/stoppe den Ladevorgang |
maxcurrent | int | nein | Setze maximalen Ladestrom in A |
Beispiel
Um ein Auto über einen HTTP Ping aufzuwecken, um weiter Abfragen zu senden, kann wie im folgenden Beispiel das HTTP-Plugin genutzt werden:
vehicles:
- name: model-y
type: custom
wakeup:
source: http
uri: http://teslalogger.local:5000/command/08154711/wake_up
Tarife & Vorhersagen
Siehe Tarife & Vorhersagen > Eigenes Plugin für mehr Details.
Lastmanagement
...
Messaging
...
Plugins
Folgende Plugins stehen zur Verfügung und können für die oben beschriebenen Attribute konfiguriert werden, um eine flexible Anbindung an die verschiedenen Systeme zu ermöglichen.
Modbus lesen schreiben
Das modbus
-Plugin kann Daten von jedem Modbus-fähigen Gerät oder SunSpec-kompatiblen Wechselrichter lesen.
Viele Strommessgeräte sind bereits vorkonfiguriert (siehe MBMD Supported Devices).
Es ist ebenfalls möglich Modbus Register zu Schreiben um weitere Wallboxen zu integrieren.
Schaue in die Modbus Dokumentation für weitere Details.
MQTT lesen schreiben
Das mqtt
-Plugin ermöglicht das Lesen von Werten über MQTT-Topics.
Das ist insbesondere für Strommessgeräte nützlich, z. B. wenn diese ihre Daten bereits über MQTT bereitstellen.
Schaue in die MBMD Dokumentation für ein Beispiel, wie man Modbus Messdaten in MQTT bekommt.
Das Plugin bietet auch die Fähigkeit JSON Datenstrukturen über jq-ähnliche Abfragen zu lesen oder zu parsen (Siehe HTTP plugin).
Beispiel Lesen:
source: mqtt
topic: mbmd/sdm1-1/Power
timeout: 30s # don't accept values older than timeout
scale: 0.001 # factor applied to result, e.g. for Wh to kWh conversion
Für den Schreibzugriff werden die Daten mit dem Attribut payload
bereitgestellt.
Falls dieser Parameter in der Konfiguration fehlt, wird der Wert im Standardformat geschrieben.
Beispiel Schreiben:
source: mqtt
topic: mbmd/charger/maxcurrent
payload: ${var:%d}
HTTP lesen schreiben
Das http
-Plugin führt HTTP Aufrufe durch, um Daten zu lesen oder zu aktualisieren.
Es beinhaltet auch die Fähigkeit, JSON-Datenstrukturen über jq-Abfragen (z. B. für REST-APIs) zu lesen oder einfache Transformationen durchzuführen.
Der volle Funktionsumfang ist in der offiziellen jq Dokumentation zu finden.
Methoden der Authentifizierung sind basic
, bearer
und digest
.
Die Namen der jeweiligen Parameter finden sich hier.
XML-Dokumente werden intern automatisch in JSON-Form überführt, welche dann mit jq wie eine native JSON-Antwort weiter gefiltert werden können.
Attribute bekommen das prefix attr
.
Für den Test von jq-Abfragen bietet sich z. B. das Online-Tool https://jqplay.org/ und für Regex-Tests z. B. das Online-Tool https://regex101.com/ an.
Beispiel Lesen:
source: http
uri: https://volkszaehler/api/data/<uuid>.json?from=now
method: GET # default HTTP method
headers:
- content-type: application/json
auth: # basic authentication
type: basic
user: foo
password: bar
insecure: false # set to true to trust self-signed certificates
jq: .data.tuples[0][1] # parse response json
scale: 0.001 # factor applied to result, e.g. for kW to W conversion
cache: 60s # response cache duration
timeout: 10s # timeout in golang duration format,
# see https://golang.org/pkg/time/#ParseDuration
source: http
uri: http://charger/status
jq: .total_power > 10 # Converts a json integer to a boolean value
Beispiel Schreiben:
body: %v # only applicable for PUT or POST requests
enable:
source: http
uri: "http://charger/relay/0?turn={{if .enable}}on{{else}}off{{end}}"
Websocket lesen
Das websocket
-Plugin bietet einen WebSocket-Listener.
Es beinhaltet auch die Fähigkeit, JSON-Datenstrukturen über jq-ähnliche Abfragen zu lesen oder zu parsen.
Dies kann z. B. verwendet werden, um Daten von Volkszählers Push Server zu empfangen.
Beispiel Lesen:
source: http
uri: ws://<volkszaehler host:port>/socket
jq: .data | select(.uuid=="<uuid>") .tuples[0][1] # parse message json
scale: 0.001 # factor applied to result, e.g. for Wh to kWh conversion
timeout: 30s # error if no update received in 30 seconds
SMA/Speedwire lesen
Das sma
Plugin bietet eine Schnittstelle zu SMA Geräten, welche das Speedwire Protokoll beherrschen.
Beispiel Lesen:
source: sma
uri: 192.168.4.51 # alternative to serial
serial: 123456 # alternative to uri
value: ActivePowerPlus # ID of value to read
password: "0000" # optional (default: 0000)
interface: eth0 # optional
scale: 1 # optional scale factor for value
Unterstützte Werte für value
können in der Diagnoseausgabe über das Kommando evcc meter
(mit konfigurierten SMA meter
Geräten) gefunden werden.
Alle möglichen Werte können als Konstanten hier gefunden werden (verwende den Namen der Konstante für value
).
JavaScript lesen schreiben
evcc integriert einen JavaScript Interpreter mit der Underscore.js Bibliothek, welche direkt über _.
zugreifbar ist, z. B. _.random(0,5)
.
Das js
Plugin kann JavaScript code über den script
Parameter ausführen. Sehr hilfreich für das schnelle Erstellen von Prototypen:
Beispiel Lesen:
source: js
script: |
var res = 500;
2 * res; // returns 1000
Wenn das js
Plugin zum Schreiben verwendet wird, wird der zu schreibende Wert dem Script als Variable übergeben:
Beispiel Schreiben:
charger:
- type: custom
maxcurrent:
source: js
script: |
console.log(maxcurrent);
Shell Script lesen schreiben
Das script
Plugin führt externe Skripte zum Lesen oder Aktualisieren von Daten aus. Das Plugin ist hilfreich um jede Art von externer Funktionalität einzubinden.
Beispiel Lesen:
source: script
cmd: /bin/bash -c "cat /dev/urandom"
timeout: 5s
Beispiel Schreiben:
source: script
cmd: /home/user/my-script.sh ${enable:%b} # format boolean enable as 0/1
timeout: 5s
Const lesen
Das const
Plugin gibt einen konstanten Wert zurück.
Es eignet sich z. B. um in Verbindung mit dem calc
Plugin feste Korrekturwerte (Offset) auf einen variablen Wert anzuwenden oder auch zur Simulation von Mess- und Statuswerten zu Testzwecken.
Beispiel Lesen:
source: const
value: -16247
Calc lesen
Das calc
Plugin erlaubt es mehrere Einzelwerte mathematisch weiterzuverarbeiten:
Beispiel Lesen:
source: calc
add:
- source: ...
...
- source: ...
...
source: calc
mul:
- source: calc
sign:
source: ... (power)
...
- source: ... (current)
...
Als Operanden werden dabei die Grundrechenarten Addition (add
) und Multiplikation (mul
) unterstützt.
Mit scale: -1
bei einem der Werte kann eine einfache Subtraktion durchgeführt werden, mit scale: 0.001
eine Division z. B. zur Konvertierung von kWh in Wh.
Mit sign:
(jede positive Zahl wird zu +1, jede negative Zahl wird zu -1, 0 bleibt 0) können (in Verbindung mit mul
) Vorzeichen auf andere Werte übertragen werden.
Z. B. um bei Zählern die „Richtung“ der Leistung (Einspeisung oder Bezug) auf die gemessenen Ströme zu übertragen.
Das calc
Plugin ist hilfreich um z. B.
- Leistungswerte von einzelnen PV-Strings zu summieren (addieren)
- Die Scheinleistung aus Spannung und Strom zu berechnen (multiplizieren)
- Getrennte Leistungswerte für Import und Export zu einem vorzeichenbehafteten Einzelwert zu kombinieren (subtrahieren).
- Prozentuale Füllstände zu berechnen (dividieren)
- Die richtige Richtung des Stromflusses festlegen (sign)
- Bekannte Offsets zu eliminieren (addieren mit
const
Plugin)
Konstante Hilfswerte (z. B. für Offsets) lassen sich mithilfe des const
Plugins als Operand erzeugen.
Combined lesen
Das combined
Status Plugin wird verwendet um gemischte Boolean Status Werte von Plugged
(angeschlossen) / Charging
(Laden) in einen evcc-kompatiblen Ladestatus von A..F zu konvertieren.
Es wird z.b. zusammen mit einer OpenWB MQTT Integration verwendet.
Beispiel Lesen:
source: combined
plugged:
source: mqtt
topic: openWB/lp/1/boolPlugStat
charging:
source: mqtt
topic: openWB/lp/1/boolChargeStat