IOBroker: Wallbox und Ladesäule bevorzugt mit eigenem Strom füttern (Teil 1)

Wer sowohl ein Elektroauto als auch eine Photovoltaik-Anlage hat, möchte das Auto bevorzugt mit dem selbst erzeugten Strom laden. Hier ein möglicher Ansatz für eine passende Steuerung.

Vorhanden sind im vorliegenden Fall eine Wallbox (Compleo eBox professional, 22kW) sowie eine Ladesäule (Compleo Duo, 2*22kW). Die Daten zum aktuellen Strom-Überschuss stehen minutengenau in IOBroker zur Verfügung, Wallbox und Ladesäule kommunizieren bereits per Modbus mit IOBroker.

Beim Erstellen der Regelung waren folgende Parameter maßgebend:

  • Die Ladepunkte sollen immer Strom abgeben, selbst wenn er zugekauft werden muss. Als Untergrenze wurden zunächst 6 Ampere, bei dreiphasigem Laden also ca. 4,1 kW angenommen.
  • Die Regelung sollte dem aktuellen Überschuss möglichst genau folgen, aber dem Fahrzeug zuliebe keine zu großen Sprünge aufweisen. Als Schrittweite wurden 3 Ampere gewählt, bei minutengenauer Regelung bedeutet das eine maximale Regeldauer von neun Minuten (von 6 auf 32 Ampere oder umgekehrt). Das schrittweise Nachregeln hat zudem den Vorteil, dass mehrere Endpunkte (hier Wallbox und Ladesäule) gesteuert werden können, ohne dass die Regelung sich aufschwingt.

Daraus wurden drei Grund-Fälle mit mehreren Unter-Fällen definiert:

  • Fall A: der aktuelle Überschuss ist kleiner als die Untergrenze fürs Laden
    • Fall A-A: der Überschuss ist minimal, und der Ladestrom ist nur geringfügig höher (Differenz kleiner Schrittweite). Der Ladestrom kann direkt aufs Minimum gesetzt werden.
    • Fall A-B: Überschuss ist minimal, der Ladestrom weicht deutlich ab. Der Ladestrom soll schrittweise gesenkt werden.
  • Fall B: der Überschuss ist größer als die Maximalleistung des Ladepunktes
    • Fall B-A: Überschuss maximal und Ladestrom nahe dran: Ladestrom kann direkt aufs Maximum gesetzt werden
    • Fall B-B: Überschuss maximal und Ladestrom deutlich geringer: Ladestrom soll schrittweise erhöht werden.
  • Fall C: Überschuss liegt zwischen Minimal- und Maximalwert
    • Fall C-A-A/C-A-B: Überschuss und Ladestrom weit auseinander: Ladestrom schrittweise erhöhen/senken
    • Fall C-B: Überschuss und Ladestrom nahe beieinander: Annäherung soll in kleinen Schritten (halbe Differenz der beiden Werte) erfolgen.

So sieht der Algorithmus in Blockly aus:

Hier das Blockly-Skript zum Kopieren (Pfeil links klicken zum Aufklappen)

<xml xmlns=”https://developers.google.com/blockly/xml”> <variables> <variable id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</variable> <variable id=”4Z}%p+n?FepUVkM*i!~.”>I_Ladung_min</variable> <variable id=”`_AhiXnPFGd.cy`HDlQ6″>I_Ladung_max</variable> <variable id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</variable> <variable id=”s?3#Sg`E_uN:7sRt:Oj?”>P_Ueberschuss</variable> <variable id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</variable> </variables> <block type=”comment” id=”loMbz(N2}#r;a$yEakR:” x=”128″ y=”260″> <field name=”COMMENT”>Konstanten setzen (in Ampere)</field> <next> <block type=”variables_set” id=”t/vaBp8L:}auGf//[a~.”> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> <value name=”VALUE”> <block type=”math_number” id=”wWwkVxc42GktS5fH0XT8″> <field name=”NUM”>3</field> </block> </value> <next> <block type=”variables_set” id=”A/J_,9O!/bulGBRYYr`C”> <field name=”VAR” id=”4Z}%p+n?FepUVkM*i!~.”>I_Ladung_min</field> <value name=”VALUE”> <block type=”math_number” id=”3Phx8A,JkJ|;nvda|z6P”> <field name=”NUM”>10</field> </block> </value> <next> <block type=”variables_set” id=”;9hfJ/S[VPJdLwXFu:u?”> <field name=”VAR” id=”`_AhiXnPFGd.cy`HDlQ6″>I_Ladung_max</field> <value name=”VALUE”> <block type=”math_number” id=”0XfI__7DiVf!|f2EtK?q”> <field name=”NUM”>32</field> </block> </value> <next> <block type=”variables_set” id=”UcKrNGAl^x}FlWq`,N~p”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”variables_get” id=”9(vyi/(e:p)^R,xN;S.5″> <field name=”VAR” id=”4Z}%p+n?FepUVkM*i!~.”>I_Ladung_min</field> </block> </value> <next> <block type=”on” id=”Ib8XGb(Gz.kFK:Fb3t4k”> <field name=”OID”>smartmeter.0.1-1:2_7_0.value</field> <field name=”CONDITION”>any</field> <field name=”ACK_CONDITION”></field> <statement name=”STATEMENT”> <block type=”comment” id=”$Wf}Q+S;)m1{#nFm:t#z”> <field name=”COMMENT”>P Überschuss berechnen: P_Abgabe / Wandlerfaktor 60 * 1000 (wegen kw zu W)</field> <next> <block type=”variables_set” id=”mSW^ki^Dopu[TR9zGd*C”> <field name=”VAR” id=”s?3#Sg`E_uN:7sRt:Oj?”>P_Ueberschuss</field> <value name=”VALUE”> <block type=”math_arithmetic” id=”7Zo5v}I^)G/Io^X7,K8c”> <field name=”OP”>MULTIPLY</field> <value name=”A”> <shadow type=”math_number” id=”G4jO=dBNmKGjQf%R4kyM”> <field name=”NUM”>1</field> </shadow> <block type=”get_value” id=”G9|]YQ?]S.weq8J|-?Y7″> <field name=”ATTR”>val</field> <field name=”OID”>smartmeter.0.1-1:2_7_0.value</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”P[w?4cMo8li:4$)muGYH”> <field name=”NUM”>60000</field> </shadow> </value> </block> </value> <next> <block type=”debug” id=”},sb|B~uh~ZF}x{T3%G_”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”oMLX;9JmK}PIf|q@*{t0″> <field name=”TEXT”>P_Ueberschuss:</field> </shadow> </value> <next> <block type=”debug” id=”dkS4T7KuR6+4H]`Z^k#G”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”T6]q1z|j//89u:rcq,L_”> <field name=”TEXT”>test</field> </shadow> <block type=”variables_get” id=”QyQ;9=HfpF#|BQXFH5@:”> <field name=”VAR” id=”s?3#Sg`E_uN:7sRt:Oj?”>P_Ueberschuss</field> </block> </value> <next> <block type=”comment” id=”yGC*puLR_]5cA)b`T%-A”> <field name=”COMMENT”>mittleren I_Überschuss berechnen: P_Überschuss/ U_L1 / 3 (wegen drei Phasen)</field> <next> <block type=”variables_set” id=”#KzK){/$s(62WP0^I=ve”> <field name=”VAR” id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</field> <value name=”VALUE”> <block type=”math_arithmetic” id=”q/U2z]8^=6$@oTM{yzNX”> <field name=”OP”>DIVIDE</field> <value name=”A”> <shadow type=”math_number” id=”d[Xn81a,ry|U2@PtQ4,*”> <field name=”NUM”>1</field> </shadow> <block type=”math_arithmetic” id=”?@G^=x4;1LQ6%Y_{a3LH”> <field name=”OP”>DIVIDE</field> <value name=”A”> <shadow type=”math_number” id=”G4jO=dBNmKGjQf%R4kyM”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”H?2Wj;S*},}2u8UH4Ow]”> <field name=”VAR” id=”s?3#Sg`E_uN:7sRt:Oj?”>P_Ueberschuss</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”PiZxO)z~S[(_%^`8ZQ:O”> <field name=”NUM”>1</field> </shadow> <block type=”get_value” id=”omW]q[Ue*cAfpi{BjtID”> <field name=”ATTR”>val</field> <field name=”OID”>smartmeter.0.1-1:32_7_0.value</field> </block> </value> </block> </value> <value name=”B”> <shadow type=”math_number” id=”n0BTqRph(`r$v1KK}6VJ”> <field name=”NUM”>3</field> </shadow> </value> </block> </value> <next> <block type=”debug” id=”JAPNb6e_Yv%h3fTFGuE1″> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”zuS./T`+4CbvX}c^C*6+”> <field name=”TEXT”>I_Ueberschuss</field> </shadow> </value> <next> <block type=”debug” id=”.bIvA#?0a=}{%oxcV)e+”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”)!7+A^KT+n;g#Y3cbps|”> <field name=”TEXT”>test</field> </shadow> <block type=”variables_get” id=”oU2e40+{ZuW}*i!M;fRr”> <field name=”VAR” id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</field> </block> </value> <next> <block type=”comment” id=”4y#$}=pUB;F;}tpeo?L~”> <field name=”COMMENT”>Ist Überschuss kleiner als Minimal-Ladestrom?</field> <next> <block type=”controls_if” id=”^026!a{THQe6z;puTHZv”> <mutation elseif=”1″ else=”1″></mutation> <value name=”IF0″> <block type=”logic_compare” id=”RDC4q.=Z=WHWftR/]:8.”> <field name=”OP”>LTE</field> <value name=”A”> <block type=”variables_get” id=”uV|=+`h6lQ~%u6;r=j2?”> <field name=”VAR” id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</field> </block> </value> <value name=”B”> <block type=”variables_get” id=”-6`m%.qfF:a!(k;FeSRl”> <field name=”VAR” id=”4Z}%p+n?FepUVkM*i!~.”>I_Ladung_min</field> </block> </value> </block> </value> <statement name=”DO0″> <block type=”debug” id=”Bb{D(s.?!gU.4gvQ.ax1″> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”y7{38o?1/]fgj2=XC{R;”> <field name=”TEXT”>A: I_Überschuss kleiner I_min</field> </shadow> </value> <next> <block type=”comment” id=”!#FFpudeo%3v;4n/+EEL”> <field name=”COMMENT”>Ist Ladestrom nahe an Minimalstrom? Sonst schrittweise nähern</field> <next> <block type=”controls_if” id=”[U;F5,l!8AW]tx3.9Eq?”> <mutation else=”1″></mutation> <value name=”IF0″> <block type=”logic_compare” id=”aq@lvXOj]k5UeJUa]2lZ”> <field name=”OP”>LTE</field> <value name=”A”> <block type=”math_single” id=”Y;2f)D~JSKXA+Z{}?3;`”> <field name=”OP”>ABS</field> <value name=”NUM”> <shadow type=”math_number” id=”yM1KWoTFLY454[cu#U]6″> <field name=”NUM”>9</field> </shadow> <block type=”math_arithmetic” id=”|)c@4wSC:3K^5Wo%DF@O”> <field name=”OP”>MINUS</field> <value name=”A”> <shadow type=”math_number” id=”/-;[PCo`0QJD[2-TBb9:”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”oCChRG}8:JRUWTd|[|mN”> <field name=”VAR” id=”4Z}%p+n?FepUVkM*i!~.”>I_Ladung_min</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”0g*n?]G]N)OY_j=s!b)8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”;m8I6A-`%`:UsN,MUOO]”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> </block> </value> </block> </value> <value name=”B”> <block type=”variables_get” id=”hgyg;Mt-vdji*PWA?H})”> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> </block> </value> </block> </value> <statement name=”DO0″> <block type=”debug” id=”gXfz70fe%q`WZeLH4WUc”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”0=_@wwNG7m??W5QW8%fX”> <field name=”TEXT”>AA: Überschuss minimal, und Ladestrom nahe dran: I_Ladung direkt auf I_min setzen</field> </shadow> </value> <next> <block type=”variables_set” id=”{fuM@bl?}ZJE$0%nK9R/”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”variables_get” id=”}RspxaFz3eRXanhHajH1″> <field name=”VAR” id=”4Z}%p+n?FepUVkM*i!~.”>I_Ladung_min</field> </block> </value> </block> </next> </block> </statement> <statement name=”ELSE”> <block type=”debug” id=”pdL#|YHxon9;:AZLGyx.”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”j?I[{ilKNoBq|AN|/T~H”> <field name=”TEXT”>AB: Überschuss minimal, und Ladestrom deutlich größer: schrittweise annähern</field> </shadow> </value> <next> <block type=”variables_set” id=”-U?[Cwy$bgdUyhG:lL/;”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”math_arithmetic” id=”Oe%~2wjD^a|BE~W5E]zA”> <field name=”OP”>MINUS</field> <value name=”A”> <shadow type=”math_number” id=”FDRKKr6|6VP{OqNYr+_8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”@n-5z*aEmeGuRXhUR0dk”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”%^23L@n`[7uNj%ThPoXh”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”,2B`Rka:(][yoW|DGE14″> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> </block> </value> </block> </value> </block> </next> </block> </statement> <next> <block type=”comment” id=”E%z$kC/^$J6$;PS/VBm(“> <field name=”COMMENT”>Ist Überschuss größer als Maximal-Ladestrom?</field> </block> </next> </block> </next> </block> </next> </block> </statement> <value name=”IF1″> <block type=”logic_compare” id=”~*UQ-XUNL#mE0^#caC`w”> <field name=”OP”>GTE</field> <value name=”A”> <block type=”variables_get” id=”*MugH9QjWMNu|rAc8$AH”> <field name=”VAR” id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</field> </block> </value> <value name=”B”> <block type=”variables_get” id=”fLr]EgSBY2$^:_0T0PIU”> <field name=”VAR” id=”`_AhiXnPFGd.cy`HDlQ6″>I_Ladung_max</field> </block> </value> </block> </value> <statement name=”DO1″> <block type=”debug” id=”i:nr9CN0~2qrOjwnAFZ{“> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”D#+i[)SM3tKYJmRm33hd”> <field name=”TEXT”>B: I_Überschuss größer I_max</field> </shadow> </value> <next> <block type=”comment” id=”6Lj=2PzZZwqd}@QV`-h_”> <field name=”COMMENT”>Ist Ladestrom nahe an Maximalstrom? Sonst schrittweise nähern</field> <next> <block type=”controls_if” id=”0L_KdcqI^sPp6%-gm10^”> <mutation else=”1″></mutation> <value name=”IF0″> <block type=”logic_compare” id=”.3qL3@g9+HoSuL`S4R%z”> <field name=”OP”>LTE</field> <value name=”A”> <block type=”math_single” id=”Ro5g%S%2yH#Tvf/d%yLw”> <field name=”OP”>ABS</field> <value name=”NUM”> <shadow type=”math_number” id=”yM1KWoTFLY454[cu#U]6″> <field name=”NUM”>9</field> </shadow> <block type=”math_arithmetic” id=”G9P5*(NZ)vUvNwScF7c%”> <field name=”OP”>MINUS</field> <value name=”A”> <shadow type=”math_number” id=”/-;[PCo`0QJD[2-TBb9:”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”rs%1v5JV8_9hg?sO5IGR”> <field name=”VAR” id=”`_AhiXnPFGd.cy`HDlQ6″>I_Ladung_max</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”0g*n?]G]N)OY_j=s!b)8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”M0}ROID1WhK:)4I;=N#o”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> </block> </value> </block> </value> <value name=”B”> <block type=”variables_get” id=”a?B#=I+,mrb|_eeiSOa-“> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> </block> </value> </block> </value> <statement name=”DO0″> <block type=”debug” id=”y!v1PP!3Dq4udGF}Vs]Z”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”%gk=a/;;bAIz7Ew9ApjF”> <field name=”TEXT”>BA: Überschuss maximal und Ladestrom nahe dran: I_Ladung direkt auf I_max setzen</field> </shadow> </value> <next> <block type=”variables_set” id=”]fq5}az~CJm_M%c^0*L_”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”variables_get” id=”sCKKJ[b93~Xb^qRS}(??”> <field name=”VAR” id=”`_AhiXnPFGd.cy`HDlQ6″>I_Ladung_max</field> </block> </value> </block> </next> </block> </statement> <statement name=”ELSE”> <block type=”debug” id=”#EI^.t.th1rqI2~EO/r@”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”)#n])BSRs;gH6iKbGJ2B”> <field name=”TEXT”>BB: Überschuss maximal und Ladestrom deutlich kleiner: schrittweise annähern</field> </shadow> </value> <next> <block type=”variables_set” id=”y8I|a}9y8XP2){o.e9D]”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”math_arithmetic” id=”][F{WV$/%(j$E^c+|Wv[“> <field name=”OP”>ADD</field> <value name=”A”> <shadow type=”math_number” id=”FDRKKr6|6VP{OqNYr+_8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”w{XN5N(d0]8nl6z5|2]j”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”%^23L@n`[7uNj%ThPoXh”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”=k!zg}~8d^V+bA^v(a*R”> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> </block> </value> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </statement> <statement name=”ELSE”> <block type=”comment” id=”@I?r^)ZH8lIg[q$z;BM@”> <field name=”COMMENT”>Überschuss liegt zwischen I_min und I_max</field> <next> <block type=”debug” id=”^aqE)+pQ+#gr,cF=MR^b”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”2owlKK=kvFkZ]45^p0,W”> <field name=”TEXT”>C: I_Überschuss zwischen I_min und I_max</field> </shadow> </value> <next> <block type=”controls_if” id=”0rj~hZ:.bV6g5VMj!|;@”> <mutation else=”1″></mutation> <value name=”IF0″> <block type=”logic_compare” id=”?m[Jz^^Dh;^m`~#Ptwrs”> <field name=”OP”>GTE</field> <value name=”A”> <block type=”math_single” id=”dUMxV0ZHmc?wz%%~F[^7″> <field name=”OP”>ABS</field> <value name=”NUM”> <shadow type=”math_number” id=”yM1KWoTFLY454[cu#U]6″> <field name=”NUM”>9</field> </shadow> <block type=”math_arithmetic” id=”0?(lCUYuxdybaz1N)vLb”> <field name=”OP”>MINUS</field> <value name=”A”> <shadow type=”math_number” id=”/-;[PCo`0QJD[2-TBb9:”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”^zBO#?$4/509Q,:P7ErZ”> <field name=”VAR” id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”0g*n?]G]N)OY_j=s!b)8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”EuwuMaa7o,.H3wR@zJB=”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> </block> </value> </block> </value> <value name=”B”> <block type=”variables_get” id=”baY{=5GW{Q`:j;NH^xE+”> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> </block> </value> </block> </value> <statement name=”DO0″> <block type=”debug” id=”YZW_,X)(kLBT1FnpD2}/”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”cp68b42,SJIywh(re5Gk”> <field name=”TEXT”>CA: I_Überschuss und I_Ladung deutlich unterschiedlich: schrittweise annähern</field> </shadow> </value> <next> <block type=”comment” id=”Tmv8SYfLvlHG~]zUkxZT”> <field name=”COMMENT”>I_Ladung ist weit entfernt von I_Überschuss, schrittweise herantasten</field> <next> <block type=”controls_if” id=”IW;@0]j85D;uW|LYCbrN”> <mutation else=”1″></mutation> <value name=”IF0″> <block type=”logic_compare” id=”VwY:Ou:a?=JeRk{~[:6o”> <field name=”OP”>GT</field> <value name=”A”> <block type=”variables_get” id=”5m.`4[VV0I|N%Da4,R@y”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <block type=”variables_get” id=”7vROJYezLsm^Ur82k+fa”> <field name=”VAR” id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</field> </block> </value> </block> </value> <statement name=”DO0″> <block type=”debug” id=”K~IByUjIzo-d1RRLop`4″> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”1Q,..OsU7KA|W;mGvzH?”> <field name=”TEXT”>CAA: I_Ladung größer I_Überschuss: I_Ladung senken</field> </shadow> </value> <next> <block type=”variables_set” id=”9esTSC1ePwT1mOMr0RHp”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”math_arithmetic” id=”n^)~m=ve:%=mg[pPWe#@”> <field name=”OP”>MINUS</field> <value name=”A”> <shadow type=”math_number” id=”FDRKKr6|6VP{OqNYr+_8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”v|-f`3IdPKIx%YP#8.Z#”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”%^23L@n`[7uNj%ThPoXh”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”g#iDr|7%i!`N|F}J/MRX”> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> </block> </value> </block> </value> </block> </next> </block> </statement> <statement name=”ELSE”> <block type=”debug” id=”fZHlC6__r9?;Q.1Tj-az”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”.q:aO]Va3XXGe;rwF=^c”> <field name=”TEXT”>CAB: I_Ladung kleiner I_Überschuss: I_Ladung erhöhen</field> </shadow> </value> <next> <block type=”variables_set” id=”^V!,fzl$Pzc]@!$Bi]w{“> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”math_arithmetic” id=”dQ5/k_~Z`U+X#1YJ+4g7″> <field name=”OP”>ADD</field> <value name=”A”> <shadow type=”math_number” id=”FDRKKr6|6VP{OqNYr+_8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”RG):4B%1XD9Y|2kzI9S|”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”%^23L@n`[7uNj%ThPoXh”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”@mM7OG(iVN1RbfK1@MgI”> <field name=”VAR” id=”zmh4SLp7El|uQ.pS:-_p”>Schrittweite</field> </block> </value> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </statement> <statement name=”ELSE”> <block type=”debug” id=”mBDgx[!9@snRRFD~s)6S”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”rUi!3%{gMWP;@Sg7U|+V”> <field name=”TEXT”>CB: I_Ladung nahe an I_Überschuss: schrittweise über halbe Differenz annähern</field> </shadow> </value> <next> <block type=”comment” id=”]$rQ0Y^uad]6SM5Ku,MH”> <field name=”COMMENT”>I_Ladung ist nahe an I_Überschuss, in kleinen Schritten herantasten</field> <next> <block type=”variables_set” id=”F{zd{]ybOTZoaH@vnYG$”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> <value name=”VALUE”> <block type=”math_arithmetic” id=”gZ9z3tumLQ4fpO_ft^vV”> <field name=”OP”>ADD</field> <value name=”A”> <shadow type=”math_number” id=”9]EdZWI$(Pf~H9CQY,k-“> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”[[YLt(MFv/QoqB)Gxz@e”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”bUvPh]nYMr^dZsZbp*Db”> <field name=”NUM”>1</field> </shadow> <block type=”math_arithmetic” id=”2eKM_#eJ*/4w}xumbi**”> <field name=”OP”>DIVIDE</field> <value name=”A”> <shadow type=”math_number” id=”zA@u/Y7N{87KAe#Kk%zZ”> <field name=”NUM”>1</field> </shadow> <block type=”math_arithmetic” id=”[3q*p(i]B8@;)6{at%Xv”> <field name=”OP”>MINUS</field> <value name=”A”> <shadow type=”math_number” id=”FDRKKr6|6VP{OqNYr+_8″> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”Umf1|1@NvF]bmVof}NrM”> <field name=”VAR” id=”SQ2.8c@WJz_Y1PY1naVf”>I_Ueberschuss</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”%^23L@n`[7uNj%ThPoXh”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”z[a:ht;@}YmKYWlmg^}X”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> </block> </value> <value name=”B”> <shadow type=”math_number” id=”f$Ti~-f19S6{;9Yc$U-c”> <field name=”NUM”>2</field> </shadow> </value> </block> </value> </block> </value> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </statement> <next> <block type=”debug” id=”;Yap4/qHAD%lBN*_f9Xg”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”kq#|L[Ueg%lf@2lXknL_”> <field name=”TEXT”>I_Ladung:</field> </shadow> </value> <next> <block type=”debug” id=”+F%.iQNaOs2)b|.;$rV#”> <field name=”Severity”>info</field> <value name=”TEXT”> <shadow type=”text” id=”2)}FcYVCY^_BAv%b0Lpn”> <field name=”TEXT”>I_Ladung direkt auf minimal</field> </shadow> <block type=”variables_get” id=”LP5?97,p?61ude=i{z/c”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <next> <block type=”comment” id=”5AlsYZds)rZ(p`5HhNw_”> <field name=”COMMENT”>Wallbox braucht Vorgabe in Ampere</field> <next> <block type=”update” id=”+`KUQzX|;@8WEy_V.Xo?”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.I_Laden</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”math_round” id=”5c_|x{^vLxi=Du]fW4=L”> <field name=”OP”>ROUND</field> <value name=”NUM”> <shadow type=”math_number” id=”-knglWW0pNJ%(G=xfuE#”> <field name=”NUM”>3.1</field> </shadow> <block type=”variables_get” id=”`![4l2`72YRYQc(w0DfZ”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> </block> </value> <next> <block type=”comment” id=”+*^Zq=W[-JOOdOEbVOb@”> <field name=”COMMENT”>Nachtabschaltung wegen defekter Comfort-Heizfunktion des Kangoo</field> <next> <block type=”controls_if” id=”4q(rksB-?T1gUjsb1y{w”> <mutation else=”1″></mutation> <value name=”IF0″> <block type=”time_compare” id=”R*7ShzYDTfKW|}9m`;Kj”> <mutation xmlns=”http://www.w3.org/1999/xhtml” end_time=”true”></mutation> <field name=”OPTION”>between</field> <field name=”START_TIME”>02:00</field> <field name=”END_TIME”>22:00</field> </block> </value> <statement name=”DO0″> <block type=”control” id=”0L~};-mhuhzOvUCWJD{l”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1012_MaxCurrentPhase1</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”get_value” id=”]U}pmku/WF.}#8!m+M=?”> <field name=”ATTR”>val</field> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.I_Laden</field> </block> </value> <next> <block type=”control” id=”}[.DZ,`}QG,k;+j#YiqK”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1014_MaxCurrentPhase2</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”get_value” id=”mQzw?HmFD[]:FJb7;#[0″> <field name=”ATTR”>val</field> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.I_Laden</field> </block> </value> <next> <block type=”control” id=”S)Rd1Gw=x=P:zacQ!|{;”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1016_MaxCurrentPhase3</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”get_value” id=”)v-{DPsz%a=ZXdz)2HuQ”> <field name=”ATTR”>val</field> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.I_Laden</field> </block> </value> </block> </next> </block> </next> </block> </statement> <statement name=”ELSE”> <block type=”control” id=”dc_VZGy~1H|j73*(!lKa”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1012_MaxCurrentPhase1</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”math_number” id=”{B(TN_D#X;uKj0W,L!*8″> <field name=”NUM”>0</field> </block> </value> <next> <block type=”control” id=”L“1AM0;1=WTZ0t~1g37″> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1014_MaxCurrentPhase2</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”math_number” id=”ob);m)nQ_AF@0piA2vhC”> <field name=”NUM”>0</field> </block> </value> <next> <block type=”control” id=”i4H9`}56{.#uF%m;X=Q1″> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1016_MaxCurrentPhase3</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”math_number” id=”qMXJqvy@:|B$j{3iYuHu”> <field name=”NUM”>0</field> </block> </value> </block> </next> </block> </next> </block> </statement> <next> <block type=”comment” id=”pE@-0kgGkM?A*DS]_+gX”> <field name=”COMMENT”>Ladesäule bekommt Vorgabe in kW pro Ladepunkt, damit gleichzeitige Nutzung beider Ladepunkte bei minimaler Vorgabe nicht zum Pausieren beider Ladevorgänge führt</field> <next> <block type=”update” id=”-v6{^R=1q:I~e[JBKKG`”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.P_Laden</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”math_round” id=”5ug6-@#dd[R2(MrH#_LI”> <field name=”OP”>ROUND</field> <value name=”NUM”> <shadow type=”math_number” id=”n(e6SiO[6s:]y:O=GQtH”> <field name=”NUM”>3.1</field> </shadow> <block type=”math_arithmetic” id=”}xCX-I|x4?axX0tzAgX{“> <field name=”OP”>MULTIPLY</field> <value name=”A”> <shadow type=”math_number” id=”[,`XPwi*1,4*}GlS/_?F”> <field name=”NUM”>1</field> </shadow> <block type=”math_arithmetic” id=”GlJEm8-Yn97K/)KXXrjZ”> <field name=”OP”>MULTIPLY</field> <value name=”A”> <shadow type=”math_number” id=”du3gszRPESiiXd[n?,6s”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”[_S4_4l@Shf|voS+R3fc”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”O0i4_MIR9AMzC@:P9-`O”> <field name=”NUM”>1</field> </shadow> <block type=”get_value” id=”8~vrR=yy#dhKedh;8:F{“> <field name=”ATTR”>val</field> <field name=”OID”>smartmeter.0.1-1:32_7_0.value</field> </block> </value> </block> </value> <value name=”B”> <shadow type=”math_number” id=”5l6zMfzq1dJ]=HEBu$Z3″> <field name=”NUM”>3</field> </shadow> </value> </block> </value> </block> </value> <next> <block type=”control” id=”*@@xKm#i:ioQ~PXC!.Gh”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.3.holdingRegisters.256_max__Einspeiseleistung_links</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”get_value” id=”z}^Y7I`)d]IBKX!D]r+x”> <field name=”ATTR”>val</field> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.P_Laden</field> </block> </value> <next> <block type=”control” id=”wTlKSzLW^=WjR*Z@4#.(“> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.3.holdingRegisters.272_max__Einspeiseleistung_rechts</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”get_value” id=”R/)sxKUR2Jrb(.B5@E(#”> <field name=”ATTR”>val</field> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.P_Laden</field> </block> </value> <next> <block type=”comment” id=”6+yl]qZw]3N!Y!2My+ek”> <field name=”COMMENT”>Ladesäule alternativ Vorgabe in Prozent?</field> <next> <block type=”update” id=”[^,-f/CxNrj^m:i{M-YI”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.Prozent_Laden</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”math_round” id=”58R+)Bdh+;Z(LMm0Z1+1″> <field name=”OP”>ROUND</field> <value name=”NUM”> <shadow type=”math_number” id=”Ex1Qe`c_=Gjjr!Q;@mLo”> <field name=”NUM”>3.1</field> </shadow> <block type=”math_arithmetic” id=”eV~Qe$w*_E.f81[`Ov+d”> <field name=”OP”>MULTIPLY</field> <value name=”A”> <shadow type=”math_number” id=”[,`XPwi*1,4*}GlS/_?F”> <field name=”NUM”>1</field> </shadow> <block type=”math_arithmetic” id=”bR3;n42HN]gJU`CS_gI%”> <field name=”OP”>DIVIDE</field> <value name=”A”> <shadow type=”math_number” id=”du3gszRPESiiXd[n?,6s”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”qL(iI[ahhEI@LH*AWW)=”> <field name=”VAR” id=”*0X_={F53.9sM~qyaiH^”>I_Ladung</field> </block> </value> <value name=”B”> <shadow type=”math_number” id=”O0i4_MIR9AMzC@:P9-`O”> <field name=”NUM”>1</field> </shadow> <block type=”variables_get” id=”wE4Uh5`Xf@4Bpm?58jd@”> <field name=”VAR” id=”`_AhiXnPFGd.cy`HDlQ6″>I_Ladung_max</field> </block> </value> </block> </value> <value name=”B”> <shadow type=”math_number” id=”f4`JeS50.d/S,N%}Sv=4″> <field name=”NUM”>100</field> </shadow> </value> </block> </value> </block> </value> <next> <block type=”control” id=”dofl[+U[75YnY!_dAN~*” disabled=”true”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.3.holdingRegisters.1_Leistungsvorgabe_Ladesäule</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”get_value” id=”fO[:-ETL/NTqO3~1hm@p”> <field name=”ATTR”>val</field> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.Prozent_Laden</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> <next> <block type=”comment” id=”yDCq|uJZ~IH17Bi}]^(~”> <field name=”COMMENT”>Kangoo-Heizbremse zusätzlich via Zeitplan steuern, weil es oben nur geschieht, wenn sich P_Ueberschuss ändert. Da der Kangoo einphasig lädt, reicht es, MaxCurrentPhase1 zu setzen</field> <next> <block type=”schedule” id=”Us{.3{OTJ@O%+g.:l%*$”> <field name=”SCHEDULE”>0 22 * * *</field> <statement name=”STATEMENT”> <block type=”control” id=”$alqQN?@GQ8rz-r`^]7S”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1012_MaxCurrentPhase1</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”math_number” id=”Ig?u?zse%K$E5XX%w+LN”> <field name=”NUM”>0</field> </block> </value> </block> </statement> <next> <block type=”schedule” id=”%[MG]v?MMdv@iPFU!%0+”> <field name=”SCHEDULE”>0 2 * * *</field> <statement name=”STATEMENT”> <block type=”control” id=”%4ZAx7MU)H2~1k#-{S}T”> <mutation xmlns=”http://www.w3.org/1999/xhtml” delay_input=”false”></mutation> <field name=”OID”>modbus.5.holdingRegisters.1012_MaxCurrentPhase1</field> <field name=”WITH_DELAY”>FALSE</field> <value name=”VALUE”> <block type=”get_value” id=”=9/LRP0/L`n9*ZqZ(n1e”> <field name=”ATTR”>val</field> <field name=”OID”>0_userdata.0.ZEGG.Hauptgelände.Überschussladen.I_Laden</field> </block> </value> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </xml>

Eine Herausforderung war, dass die Wallbox den Vorgabewert in Ampere, die Ladesäule dagegen in Prozent oder wahlweise kW entgegennimmt. Es müssen also alle drei Werte berechnet werden. Wann bei der Ladesäule der Prozent- und wann der kW-Vorgabewert greift, war mir nicht ganz klar. Klar ist lediglich, dass man nicht beide schreiben sollte, vermutlich gilt dann der zuletzt gesetzte.

Nach der Aktivierung zeigte sich, dass manche Fahrzeuge bei 6A nicht anfangen zu laden. Daher habe ich die Untergrenze auf 10A erhöht. Manche Fahrzeuge reizen diese Grenze aus, manche liegen ein wenig darunter. Ein einzelner Ausreißer wollte trotz 10A-Budget nur mit knapp 2 kW laden.

Das Objekt, das eine Neuberechnung auslöst, ist der Überschuss-Strom, den das Smartmeter ausgibt. Dieser Wert wird einmal pro Minute gelesen; ändert er sich nicht (z.B. weil aktuell Bezug statt Einspeisung stattfindet), wird das Skript nicht ausgeführt. Vereinzelt wurde das Zurücksetzen auf den Minimalwert “verpasst”, wenn ein Wechsel von Einspeisung zu Bezug stattfand – den Fehler habe ich nicht gefunden und kann damit leben.

Was im Skript noch auftaucht, obwohl es nichts mit dem Überschussladen zu tun hat, ist die Nachtabschaltung der Wallbox aufgrund einer defekten Heizungssteuerung.

Die Ladesäule hatte ich zunächst in Prozent angesteuert, also minimal 32%. Das führt aber dazu, dass beim Einstecken eines zweiten Fahrzeugs diese sich die 32% Leistung teilen müssen, jedes also statt 10 A nur noch 5 A bekommt und schlimmstenfalls beide nicht mehr laden. Daher wird die Ladesäulenvorgabe nun in kW pro Ladepunkt gesetzt. Und so sieht das dann aus:

In Grau die kW-Vorgabe – gut zu erkennen der Überschuss am Nachmittag, während am Rest des Tages nur der Minimalwert bereitgestellt wird. Links und mittig zweimal dasselbe Fahrzeug (Modell leider nicht notiert), das mit der Steuerung nicht klarkommt und das Budget nicht ausreizt. Rechts ein Tesla, dem das besser gelingt.
Hier zwei Renault Zoes – der eine reizt das Budget gut aus, der andere nicht optimal. Aber die Hauptsache: beide laden.
Hier im Screenshot ist zu sehen, wie ein Renault Kangoo Z.E. an der Wallbox der wechselnden Vorgabe folgt.
Hier zuletzt Überschuss vs. Lade-Vorgabe. Zu sehen ist, wie die Vorgabe (grau) dem Überschuss (gelb) folgt, grobe Sprünge aber durch schrittweise Anpassung abmildert.

Ausblick

Die Regelung funktioniert so also ganz gut – blöd ist lediglich, wenn man nicht unbegrenzt Zeit zum Laden hat. Dann möchte man “auf Knopfdruck” ausnahmsweise doch die volle Ladeleistung abrufen. Dieser Knopf soll der zweite Teil des Projekts werden.

Die Ladesäule soll um einen Knopf pro Ladepunkt erweitert werden, mit dem die Regelung außer Kraft gesetzt werden kann (an der Wallbox ist die Ladedauer unkritisch). Vorgesehen ist ein beleuchteter Taster Tru Components TC-12647504, der mit einem GPIO des nächstgelegenen RaspberryPi (IOBroker-Slave) verbunden wird. Wird an diesem GPIO-Pin ein Tastendruck erkannt, soll der Vorgabewert für den entsprechenden Ladepunkt drei Stunden lang auf den Maximalwert gesetzt werden. Optisches Feedback erfolgt über den Leuchtring des Tasters. Die LED im Taster wird über einen weiteren GPIO-Pin angesteuert, die nötigen 12V durch einen Step-Up-Regler erzeugt (zu prüfen ist, ob die Ausgangsleistung des GPIO dafür ausreicht, sonst braucht es ein Relais pro Kanal, das eine separate Versorgungsspannung schaltet).

Ein erneuter Tastendruck während aktiver Maximalladung könnte den Timer auf null zurücksetzen, oder aber auf Überschussladen zurückschalten. Das Beenden des Ladevorgangs soll einen Wechsel zurück zum Überschussladen auslösen. Denkbar wäre auch, nur einen gemeinsamen Taster für beide Ladepunkte vorzusehen, das könnte aber unerwünschte Effekte haben (unnötiger Mehrbezug, obwohl nur eines von beiden Fahrzeugen die volle Leistung braucht). Zudem liefert die vorhandene Ladesäule nur insgesamt 22 kW. Wenn an einem Ladepunkt die volle Leistung gewünscht ist, während auch am anderen geladen wird, müssten sich beide die 22 kW teilen.

Eine weiteres denkbares Detail wäre, bei Nutzung der Überschussladung den stundenbasierten Ladetarif auszusetzen und nur pro kWh abzurechnen, während beim Schnellladen eine zusätzliche Gebühr pro Stunde in Rechnung gestellt wird (zu prüfen ist, ob giro-e das kann).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert