Der cFos Charging Manager erlaubt die dynamische Auswertung von Formeln. Diese Funktionalität gibt es bei einem Zähler vom Typ "Expression" und bei Laderegeln vom Typ "Formel".
Sie können also Zähler einrichten, die aus anderen Zählern oder Wallboxen Werte berechnen und diese bereithalten und anzeigen. Die Laderegeln können ebenfalls mittels Formeln den Ladestrom dynamisch berechnen und dabei auch auf Zähler und Wallboxen (inklusive Zähler vom Typ "Expression") zugreifen.
Folgende Operationen sind mit den Formeln möglich:
+ - * / % | Addition, Subtraktion, Multiplikation, Division, Modulus |
& | | bitweise AND und OR |
^ | Potenzrechnung, z.B. 10^2 = 100 |
min(x,y) | Minimum von x und y, mehr als 2 Argumente möglich |
max(x,y) | Maximum von x und y, mehr als 2 Argumente möglich |
abs(x) | Absolutbetrag von x, z.B. abs(-2) = 2 |
clamp(x,min,max) | Wert x = min (falls x < min), x = max (falls x > max), sonst x beibehalten |
round(x) | Runden von x auf ganze Zahl. Beispiel: Runden auf 1 Stelle nach dem Komma: round(10*x)/10. |
sqrt(x) | Quadratwurzel von x |
exists(x) | true, falls die Variable x existiert, sonst false |
Weiterhin sind folgende logische Ausdrücke möglich:==
(gleich), !=
(ungleich), <
(kleiner), <=
(kleiner-gleich), >
(größer), >=
(größer-gleich), !
(nicht), ||
(logisches Oder), &&
(logisches Und), ?
(Bedingter Operator, z.B. x ? y : z
, liefert y falls x wahr ist, andernfalls z)
Dies erlaubt z.B. den Strom in Abhängigkeit von Bedingungen abzuschalten: M1.current >= 6500 ? M1.current : 0
liefert den Strom von M1, falls er größer 6,5A ist und andernfalls 0, wodurch das Laden pausiert wird. Für solche Bedingungen bietet sich auch das Abfragen von Inputs an (s.u.)
Folgende Namen sind möglich:
Mx | Zähler mit Geräte ID x, z.B. M1 |
Ex | Wallbox mit Geräte ID x, z.B. E1 |
Es ist auch möglich auf virtuelle Zähler, wie Solarüberschuss, Netzbezug oder "Power avail. for EVSEs" (für Wallboxen verfügbare Leistung), zuzugreifen, indem man den Zähler einrichtet und dann in der Formel die entsprechende Geräte ID benutzt.
Mittels Punkt kann man dann auf einzelne Werte der Geräte zugreifen. Diese heißen wie folgt:
current_l1 | Strom der Phase 1 in mA |
current_l2 | Strom der Phase 2 in mA |
current_l3 | Strom der Phase 3 in mA |
current | Strom der aktuellen Phase in mA (bei Laderegeln fragt der Charging Manager alle Phasen nacheinander ab, bei Zählern vom Typ "Expression" gilt die jeweilige Phase auf die sich die Formel bezieht. Wenn Sie für "Strom L1" eine Formel angegeben haben, können Sie die Felder für Strom L2 und L3 weglassen. Dann wird die Formel für Strom L1 verwendet) |
power_w | Aktuelle Wirkleistung in Watt |
offered | Wallbox: Aktuell angebotener Strom in mA |
import_wh | Bezogene Energie in Wh |
export_wh | Eingespeiste Energie in Wh |
dt | Die Zeit, seit dem letzten vergangenen Update vergangen ist (in Sekunden), nur für Zähler "Expression", siehe auch CM._dt. |
inputN | Input Nummer N des Gerätes, 1 = aktiv, 0 = inaktiv, N ist die Nummer des Inputs, beginnend mit 1. |
soc | SOC, Ladestand in Prozent (Zähler/Speicher) - sofern vom Gerät unterstützt |
id | Geräte Id, Modbus ID |
txn_duration | Dauer der aktuellen Transaktion in Sekunden (Wallbox) |
charging_dur | Tatsächliche Ladezeit der aktuellen Transaktion in Sekunden (Wallbox) |
txn_energy | Geladene Energie der aktuellen Transaktion in Wh (Wallbox) |
min_current | Minimaler Ladestrom in mA (Wallbox) |
max_current | Maximaler Ladestrom in mA (Wallbox) |
state | Status: 1 warten, 2 eingesteckt, 3 laden, 4 laden mit Lüftung, 5 Fehler, 6 offline (Wallbox) |
cphases | Anzahl ladender Phasen (0-3) |
pphases | Anzahl vorhergesagter ladender Phasen (0-3) |
lb_cur_l1 | Aktuell errechneter Strom der Phase 1 in mA (Wallbox). Nur während der Berechnung der Wallbox Laderegeln, sonst 0 |
lb_cur_l2 | Aktuell errechneter Strom der Phase 2 in mA (Wallbox). Nur während der Berechnung der Wallbox Laderegeln, sonst 0 |
lb_cur_l3 | Aktuell errechneter Strom der Phase 3 in mA (Wallbox). Nur während der Berechnung der Wallbox Laderegeln, sonst 0 |
lb_cur | Aktuell errechneter Strom der aktuellen Phase in mA (Wallbox). Nur während der Berechnung der Wallbox Laderegeln, sonst 0. Der Charging Manager fragt alle Phasen nacheinander ab. |
surplus_pcur | PV-Überschuss-Strom pro (vorhergesagter) Phase in mA |
surplus_wanted | 1, wenn schon eine PV-Überschussregel angewendet wurde, sonst 0 |
budget | Auf dem aktuellen Budget befindliche kWh oder Minuten |
budget_amount | Auf dem aktuellen Budget maximale kWh oder Minuten |
budget_used | Auf dem aktuellen Budget genutzte kWh oder Minuten |
com_err | 1, falls ein COM Error vorliegt, sonst 0 |
com_err2 | 1, falls ein COM Error länger als 12 sec. vorliegt, sonst 0 |
reactive_power | Blindleistungsvorgabe in Watt (sofern das Gerät dies unterstützt), positive Werte: Induktiv, negative Werte: Kapazitiv |
switch_phases | Bei Wallboxen mit Phasenumschaltung: Manuelle Phasenumschalten, 1 = 1-phasig, 3 = 3-phasig, -1 = automatische Phasenumschaltung |
departure | ISO 15118 Abfahrtszeit als Unit timestamp (bei Wallboxen, die das unterstützen, sonst 0) |
req_energy | ISO 15118 Benötigte Energie in Wh (bei Wallboxen, die das unterstützen, sonst 0) |
plugin_start | Unix timestamp, Zeitpunkt des Kabel-Einsteckens |
plugin_energy | Bisher geladene Energie in Wh ab Zeitpunkt des Kabel-Einsteckens |
M1.current_l1 | Strom des Zählers M1, Phase 1 |
E2.import_wh | Verbrauchte Wh der Wallbox E2 |
E3.power_w | Aktuelle Ladeleistung von E3 in Watt |
Wenn man die Formeln für einen Zähler von Typ "Expression" nutzt, kann man die Geräte ID auch weglassen. Dann beziehen sich die Feldnamen auf diesen Zähler, z.B. ist 'power_w' dann die Leistung dieses Zählers in Watt. Mittels 'dt' kann man ein paar erweitere Funktionen realisieren, z.B. in einem Zähler vom Typ "Expression":
import_wh + M1.power_w * dt / 3600
aktualisiert die bezogene Energie anhand der Leistung während der vergangenen Updatezeit(power_w * (20 - dt) + M1.power_w * dt) / 20
glättet die Leistung über die letzten 20 Sekunden.date
date.year | Aktuelles Jahr |
date.month | Monat von 0..11 |
date.day | Tag von 1..31 |
date.weekday | Wochentag SO=0, Mo=1, Di=2, ... Sa=6 |
date.yearday | Tag im Jahr von 0..366 |
date.hour | Stunde von 0..23 |
date.minute | Minute von 0..60 |
date.second | Sekunde von 0..60 |
date.daysecond | Sekunde dieses Tages von 0..86399 |
date.dayminute | Minute dieses Tages von 0..1439 |
date.dst | 0 = Winterzeit, 1 = Sommerzeit |
date.timestamp | Unix timespamp, secs since 1.1.1970 |
PB (nur cFos Power Brain)
PB.input1 | S0 Input 1, 1 = aktiv, 0 = inaktiv |
PB.input2 | S0 Input 2, 1 = aktiv, 0 = inaktiv |
CM Charging Manager Variablen
Diese Variablen können vom Admin unter "Konfiguration" gesetzt werden. Wenn der Admin z.B. die Variable 'var_x' auf 1.5 setzt, liefert CM.var_x den Wert 1.5.
Vordefinierte Variablen:
_num_charging: Anzahl der aktuell ladenden Wallboxen
_num_charging1: Anzahl der aktuell ladenden Wallboxen, 1 wenn keine lädt
_max_total_current: Maximaler Strom des Hausanschluss in mA pro Phase
_max_total_evse_current: Maximaler Strom für Wallboxen in mA pro Phase
_price: Aktueller Strompreis
_price_level: Aktuelles Strompreis-Niveau, -2=sehr teuer, -3=teuer, -4=normal, -5=billig, -6=sehr billig
_surplus: Aktueller Solarüberschuss in Watt
_org_surplus: Solarüberschuss, wie ihn der Charging Manager unabhängig von eigenen Formeln berechnet hätte
_storage_home_max_capacity: Gesamt Kapazität der Speicher, Home, sofern in der Zähler-Konfiguration angegeben, in Wh
_storage_home_capacity: Aktuelle Kapazität der Speicher, Home, sofern in der Zähler-Konfiguration angegeben, in Wh
_storage_all_max_capacity: Gesamt Kapazität der Speicher, All, sofern in der Zähler-Konfiguration angegeben, in Wh
_storage_all_capacity: Aktuelle Kapazität der Speicher, All, sofern in der Zähler-Konfiguration angegeben, in Wh
_max_total_current_prc: Prozentsatz des verfügbaren max. Gesamtladestroms. Diese Variable kann auch (durch Zählerdefinitionen und Charging Manager Variablen) geschrieben werden
_dt: Die Zeit, seit dem letzten vergangenen Update vergangen ist (in Sekunden).
Benutzung der globalen Objekte:
charge 8A starting at 8:00am: date.dayminute >= 480 ? 8000 : 0
charge 16A on Saturday and Sunday: date.weekday == 5 || date.weekday == 6 ? 16000 : 0
charge 6A if input 2 active: PB.input2 ? 6000 : 0
charge 6A if CM variable non-zero: cm.var1 ? 6000 : 0
Hinweis:
Unter Benutzerdefinierte Zähler finden Sie auch eine Anleitung, wie Sie Formeln mit globalen Charging Manager Variablen und Outputs benutzen können.
GM Globale Zähler
GM.grid_demand | Netzbezug |
GM.consumed | Verbrauch |
GM.produced | Erzeugung |
GM.consumed_evse | Verbrauch E-Autos |
GM.available_evse | Verfügbare Leistung |
GM.surplus | PV-Überschuss |
GM.storage_home | Speicher Home |
GM.storage_all | Speicher Alles |
GM.error | Leistung durch Fehler |
Nutzung der globalen Zähler
Jeder Zähler hat die Felder power_w, current, current_l1, current_l2, current_l3, import_wh und export_wh,
z.B. GM.prod_pwr.current_l1 oder GM.cons_pwr.power_w
. Bei 'current' wird der Strom der gerade betrachteten Phase ausgewertet. Ströme werden in mA geliefert, Leistung in W, Energie in Wh.
Sie möchten den Ladestrom hinsichtlich eine Verbrauchszählers einer Wohnung zusätzlich limitieren. Hierzu können Sie eine Laderegel mit der Formel 16000 - M1.current
einrichten.
M1 ist der Zähler, der den Verbrauch der Wohnung misst. Das Lastmanagement des cFos Charging Managers versucht zunächst der Wallbox den maximalen Strom bzgl. der Hausanschlussleistung zur Verfügung zu stellen, limitiert diesen dann aber auf 16A abzgl. des Wohnungsverbrauchs.
Mittels min_price(s), max_price(s) können Sie den günstigsten Preis Ihres Energieanbieters in Euro ermitteln, wobei die Preise von der aktuellen Uhrzeit bis max s Sekunden des Tages bzw. nachfolgenden Tages durchsucht werden, z.B. liefert min_price(25200) den günstigsten Preis bis nachts um 7:00 Uhr. So können Sie z.B. eine Laderegel erstellen mit der Bedingung CM._price <= min_price(25200), um zum günstigsten Zeitpunkt zu laden, aber mit der Bedingung, dass Sie z.B. ab 8:00 Uhr losfahren möchten (1 Stunde Ladezeit vorausgesetzt). Analog gibt es noch die beiden Funktionen min_price_secs(s) und max_price_secs(s), die den Startzeit des günstigsten Preises in Sekunden des angefangenen Tages zurückliefern. Diese können Sie dann z.B. mit date.daysecond vergleichen.