Steuerung einer Tinkerforge WARP Wallbox

Begonnen von chris_kmn, 04 November 2021, 12:04:13

Vorheriges Thema - Nächstes Thema

chris_kmn

#15
Die Überschussregelung stoppt den Ladevorgang bei zu wenig Leistung, oder startet sie erst bei ausreichend Leistung. Auch wenn das Auto gesteckt ist.

Und der NFC Tag erteilt nur eine Ladefreigabe. Auch damit startet das Laden nur, wenn FHEM frei gibt.

Ich habe mir in FHEM einen Dummy-Schalter angelegt, mit dem ich ein Sofortladen aktivieren kann. Erst dann lädt er sofort beim Stecken.


chris_kmn

#16
Hier ist nochmal mein aktuelles Setup:

Wallbox:

defmod WARP2_CP HTTPMOD http://192.168.0.82/evse/state 23
attr WARP2_CP DbLogExclude .*
attr WARP2_CP alias Wallbox
attr WARP2_CP devStateIcon 1.3:message_socket_on2@red 1.2:message_socket_enabled@orange 1.1:message_socket_unknown@blue 1.0:message_socket_off@green\
2.1:robot 2.0:time_manual_mode
attr WARP2_CP enableControlSet 0
attr WARP2_CP enableCookies 1
attr WARP2_CP event-on-change-reading charger_state
attr WARP2_CP event-on-update-reading power
attr WARP2_CP extractAllJSON 0
attr WARP2_CP get01Name autostart
attr WARP2_CP get01Poll 67
attr WARP2_CP get01URL http://192.168.0.82/evse/auto_start_charging
attr WARP2_CP get04ExtractAllJSON 1
attr WARP2_CP get04Name power
attr WARP2_CP get04Poll 11
attr WARP2_CP get04URL http://192.168.0.82/meter/values
attr WARP2_CP get05ExtractAllJSON 1
attr WARP2_CP get05Name phases
attr WARP2_CP get05Poll 69
attr WARP2_CP get05URL http://192.168.0.82/meter/phases
attr WARP2_CP getHeader1 Content-Type: application/json
attr WARP2_CP group 01-Energie
attr WARP2_CP httpVersion 1.1
attr WARP2_CP icon wallbox
attr WARP2_CP reading01Name autostart
attr WARP2_CP reading01OMap false:0, true:1
attr WARP2_CP reading01Regex "auto_start_charging":([\w]+)
attr WARP2_CP reading02Name charger_state
attr WARP2_CP reading02Regex "charger_state":([\d])
attr WARP2_CP reading03Name MaxCurrent
attr WARP2_CP reading03Regex "allowed_charging_current":([\d]+)
attr WARP2_CP requestHeader Content-Type: application/json
attr WARP2_CP room Carport,Haus,MQTT
attr WARP2_CP set01Data {"current":$val}
attr WARP2_CP set01Header Content-Type: application/json
attr WARP2_CP set01Method PUT
attr WARP2_CP set01Name current
attr WARP2_CP set01URL http://192.168.0.82/evse/external_current_update
attr WARP2_CP set02Data {"auto_start_charging":$val}
attr WARP2_CP set02Header Content-Type: application/json
attr WARP2_CP set02IMap false:0, true:1
attr WARP2_CP set02Method PUT
attr WARP2_CP set02Name auto_start_charging
attr WARP2_CP set02URL http://192.168.0.82/evse/auto_start_charging_update
attr WARP2_CP set03Data null
attr WARP2_CP set03Header Content-Type: application/json
attr WARP2_CP set03Method PUT
attr WARP2_CP set03Name stop_charging
attr WARP2_CP set03NoArg 1
attr WARP2_CP set03URL http://192.168.0.82/evse/stop_charging
attr WARP2_CP set04Data null
attr WARP2_CP set04Header Content-Type: application/json
attr WARP2_CP set04Method PUT
attr WARP2_CP set04Name start_charging
attr WARP2_CP set04NoArg 1
attr WARP2_CP set04URL http://192.168.0.82/evse/start_charging
attr WARP2_CP showBody 0
attr WARP2_CP sortby 3
attr WARP2_CP stateFormat {sprintf("1:%d\n2:%d\n Imax: %.2f A\n . . Pch: %.3f kW\n .  . Ech: %.3f kWh",\
ReadingsNum($name,"charger_state",0),\
ReadingsNum($name,"autostart",0),\
ReadingsNum($name,"MaxCurrent",0)/1000,\
ReadingsNum($name,"power",0)/1000,\
ReadingsNum($name,"energy_abs",0))}
attr WARP2_CP timeout 10
attr WARP2_CP userReadings PwrFaktor {ReadingsNum($name,"phases_active_0",0)+ReadingsNum($name,"phases_active_1",0)+ReadingsNum($name,"phases_active_2",0)}
attr WARP2_CP verbose 0


Dann ein Schalter für den Lademodus (nurPV, minPV,etc):

defmod WB_pmode dummy
attr WB_pmode alias Lademode Wallbox
attr WB_pmode group 01-Energie
attr WB_pmode icon measure_photovoltaic_inst
attr WB_pmode readingList state current clouds
attr WB_pmode room Carport,Haus
attr WB_pmode setList state:minPV,nurPV,BattPV,fix current:slider,6000,500,16000
attr WB_pmode sortby 4
attr WB_pmode stateFormat {sprintf("Lademode: %s . . Wolken: %d%% . . Strom:",\
ReadingsVal($name,"state",0),\
ReadingsNum($name,"clouds",0))}
attr WB_pmode webCmd current:state


Dann der Sofortladen-Schalter:

defmod dSofortLaden dummy
attr dSofortLaden alexaName Sofortladen
attr dSofortLaden alias Sofortladen
attr dSofortLaden devStateIcon on:rc_GREEN:off off:rc_RED:on
attr dSofortLaden genericDeviceType switch
attr dSofortLaden group 01-Energie
attr dSofortLaden homebridgeMapping clear On=state,valueOn=on,valueOff=off,cmdOn=on,cmdOff=off
attr dSofortLaden icon control_arrow_rightward
attr dSofortLaden realRoom Carport
attr dSofortLaden room Carport,Haus,Homekit
attr dSofortLaden setList on off
attr dSofortLaden siriName Sofortladen
attr dSofortLaden sortby 5
attr dSofortLaden webCmd on:off



Dann das Notify, welches die Regelfunktion bei gestecktem Auto und geändertem Ladestrom aufruft:

defmod nty_WARP_CP_chg notify WARP2_CP:power:.* IF ([WARP2_CP:charger_state] >= 1) ({myChargeCurrent()})
attr nty_WARP_CP_chg group Notify
attr nty_WARP_CP_chg room Carport



Und hier final die angepasste Funktion im myUtils:

Aktuell nutze ich eine Variable "$PwrFaktor" um die Anzahl der Phasen mit der das Auto lädt zu berücksichtigen. Die könnte man auch noch in FHEM festlegen um sie flexibel vorzugeben. Ich überlege aber auch, ob man den Wert aus dem Stromzähler der Box, welcher auch die Phasennutzung ausgibt, beziehen kann. Da ich aber nur ein Fahrzeug lade
ist das bei mir erstmal nicht nötig.

##########################################################
# Ladestrom berechnen  kontinuierlich
sub myChargeCurrent() {

#Quelle Solar-Inverter:
my $overpow = 0; # ReadingsNum("RCTPower_AR","overpow",0); # Leistungsüberschuss ("-" = Überschuss)
my $BatteryPower = ReadingsNum("RCTPower_AR","power_battery",0); # Leistung Batterie ("-" = laden)
my $GridPower = ReadingsNum("RCTPower_AR","power_grid_total",0); # Leistung Netz ("-" = einspeisen)
#Quelle Wallbox:
my $maxcurr = ReadingsNum("WARP2_CP","MaxCurrent",0); # Maximaler Ladestrom Wallbox
my $ChargePower = ReadingsNum("WARP2_CP","power",0); # Ladestrom
my $VehicleState = ReadingsNum("WARP2_CP","charger_state",0); # Fahrzeugstatus
my $PwrFaktor = ReadingsNum("WARP2_CP","PwrFaktor",2); # Faktor Anzahl aktive Phasen
#Quelle Dummy Lademode:
my $WB_pmode = ReadingsVal("WB_pmode","state",0); # Sollwert PV-Lademodus
my $FixStrom = ReadingsNum("WB_pmode","current",0); # Ladestrom Vorgabe

if ($PwrFaktor == 0) {$PwrFaktor = 2}; # Initialisierung Leistungsfaktor (hier zwei Phasen, Autospezifisch)

$overpow = $GridPower + $BatteryPower; # Leistungsüberschuss ("-" = Überschuss)

if ($VehicleState == 1 ){ # Fahrzeug ist angeschlossen
if (ReadingsNum("WARP2_CP","autostart",1) == 1) { # Autostart ?
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
}
if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
fhem("set WARP2_CP start_charging");
return; # bei Sofortladen Routine verlassen
}
elsif ($WB_pmode eq "minPV" ) { # minPV Laden: Ladevorgang sofort starten mit min Ladestrom
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP start_charging");
}
elsif ($WB_pmode eq "nurPV") { # nurPV Laden: Ladevorgang bei Überschuss starten
if ($overpow <= -(1420*$PwrFaktor)) { # Laden starten bei PV Überschuss  (1A ca. 430 Watt)
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP start_charging");
}
}
elsif ($WB_pmode eq "BattPV") { # BattPV Laden: Ladevorgang bei Überschuss starten
if ($GridPower <= 20 && $BatteryPower <= 5300) { # Laden starten bei Leistungsüberschuss
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP start_charging");
}
}
elsif ($WB_pmode eq "fix") { # fix Laden: Ladevorgang mit festem Strom laden
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
fhem("set WARP2_CP start_charging");
}
return;
}

if ($VehicleState == 3)  { # Fahrzeug lädt
 
if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
return; # bei Sofortladen Routine verlassen
}
elsif ($WB_pmode eq "minPV" || $WB_pmode eq "nurPV") { # minPV Laden:
if ($overpow <= -1000) { # bei Überschuss Strom anheben
$maxcurr = int((500 + $ChargePower)/($PwrFaktor*21.5))*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
elsif ($overpow > 0 ) { # Strom absenken bei Strommangel
$maxcurr = int(($ChargePower-$overpow-400)/($PwrFaktor*21.5))*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
else {
return;
}
if ($maxcurr < 6000) {
$maxcurr = 6000;
if ($WB_pmode eq "nurPV" ) {
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
fhem("set WARP2_CP stop_charging"); # Laden unterbrechen bei nurPV !
}
}
if ($maxcurr > 16000) {$maxcurr = 16000};
fhem("set WARP2_CP current $maxcurr");
}
elsif ($WB_pmode eq "BattPV") {
if ($GridPower <= 20 && $BatteryPower <= 7000) { # keine Stromentnahme aus Netz und Batt-Leistung kleiner 7kW ?
$maxcurr = int((500 + $ChargePower)/($PwrFaktor*21.5))*100; # Strom anheben
if ($maxcurr > 16000) {$maxcurr = 16000};
}
if ($GridPower > 100 ) { # Strom aus Netz ?
$maxcurr = int(($ChargePower-$overpow-400)/($PwrFaktor*21.5))*100; # Ladestrom reduzieren
}
if ($maxcurr < 6000) { # Laden unterbrechen wenn zu wenig Leistung
$maxcurr = 6000;
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
fhem("set WARP2_CP stop_charging"); # Laden unterbrechen bei nurPV !
}
fhem("set WARP2_CP current $maxcurr");
}
elsif ($WB_pmode eq "fix") { # fix Strom laden
if ($maxcurr != $FixStrom) {
fhem("set WARP2_CP current $FixStrom");
}
}
}
} #End Sub



smoudo

Vielen Dank für Deine Mühe und Geduld!

Ich schau mir deinen aktuellen Code später an.

Aus meiner sicht sollte der nfc immer eine Freigabe erteilen auch wenn fhem keine erteilt. Das ist der Fall wenn wir mit leerem Akku ankommen und am nächsten morgen wieder ,,voll" weg müssen.
Szenario: nachtladen, winterladen.
Der sofortladebutton in fhem ist sinnvoll. Ich hatte das einfach per webcmd im device hinzugefügt, das meine Frau auch mit klar kommt.

Die ganze Zeit habe ich allerdings einfach bei Überschuss das laden mit 6A gestartet bis das Auto voll war. Ist aber auch nur ein Hybrid der einphasig lädt.

Viele Grüße

Matze

chris_kmn

Da gibt es auch keinen Königsweg. Muss jeder nach seinen Bedürfnissen gestalten 😊

smoudo

Ich habe jetzt mal bei Tinkerforge nachgefragt warum das seit Firmware 2.0.0 so kompliziert ist mit freigabe über api + nfc.

Antwort war, es hängt mit dem Usersystem zusammen und man könnte einen nfc chip simulieren um eine Freigabe zu erzeugen.
Ich sehe das als blödsinn an und viel zu kompliziert. Vorher gings ja auch ohne den Schnickschnack. Hier der link zur Funktion falls es jemand gebrauchen kann.

https://www.warp-charger.com/api.html#nfc_inject_tag

Da das Usersystem für mich nicht relevant ist gehe ich zurück zu 1.1.2
Die Instabilitäten versuch ich mit einem täglichen neustart des brick in den griff zu bekommen. Das hat schon bei zahlreichen ESP zum Erfolg geführt   :D

Viele Grüße

Matze

chris_kmn

#20
Du kannst doch aber die ganze Authentifizierung abschalten. Dann sollte sie sich wie die 1.x Firmware verhalten.

smoudo

Ne dann geht die direkte Freigabe per nfc nicht. Wartet dann zusätzlich noch auf die fhem Freigabe.

chris_kmn

#22
Also ganz einfach und schnell könntest du meinen myUtils-Code mit einer Zeile ergänzen:

if ($VehicleState == 1 ){ # Fahrzeug ist angeschlossen
if (ReadingsNum("WARP2_CP","autostart",1) == 1) { # Autostart ?
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
}
if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
fhem("set WARP2_CP start_charging");
qx(curl -H "Content-Type: application/json" -X PUT -d "null" http://192.168.0.82/nfc/inject_tag_start);
return; # bei Sofortladen Routine verlassen
}


Dazu ist natürlich der Dummy für Sofortladen nötig. Aber das kann man auch beliebig abändern.

Ich habe es auch gerade bei mir getestet und es funktioniert.

Alternativ kann ich das auch gerne in das Wallbox-Device integrieren

smoudo

wenn ich das richtig verstehe wird dann nach jeder fhem aktion der virtuelle nfc vorgetäuscht und somit die freigabe erteilt. richtig?

Das ist denke ich eine Lösung die funktioniert wird.

Währe toll wenn du das integrieren könntest. Welches nfc tag wird da standardmäßig genommen? ich würde ein virtuelles mit dem namen fhem nehmen, damit man es identifizieren kann.

Viele Grüße

Matze

chris_kmn

#24
Laut Beschreibung der API wird leider immer nur der zuletzt benutzte NFC Tag simuliert.
Allerdings könnte man, wenn das Auto gesteckt wird, per ,,inject_tag" einen virtuellen Tag erzeugen und diesen dann zum Starten verwenden. Ich überlege mir mal, wie man das am einfachsten umsetzt.

Aber Tinkerforge hat ein Forum in dem die Entwickler Ideen von Kunden aufgreifen und relativ schnell umsetzen. Ich fände es auch sinnvoll, wenn man einen der bekannten Tags auswählen könnte. Aber ich sehe gerade, da bist du schon aktiv zum gleichen Thema. Man könnte dort den Wunsch äußern, dass sie das anpassen. Bzw. sie haben wir da ja schon etwas zugesagt.

Allerdings ehrlich gesagt finde ich deinen Wunsch nach ,,per NFC sofort starten und ohne NFC nur bei Überschuss" etwas am Ziel vorbei. Die NFC Freigabe soll ja schließlich einen Benutzer authentifizieren. D.h. kein NFC -> kein Laden. Du willst vielmehr einen Sofortladen-Button an der Box. Wäre es nicht sinnvoll den Taster dafür zu verwenden. Also erst Freigabe per NFC und wenn man dann den Taster drückt wird sofortladen gestartet ?! Allerdings müssten die Entwickler das auch erst anpassen.

Ich werd die NFC Freigabe die Tage einbauen.

Viele Grüße,

  Chris

chris_kmn

#25
So ich habe mal eine Ergänzung zum WARP Device gemacht:

attr WARP2_CP set05Data {"tag_type":0,"tag_id":"D3:B1:4F:B7"}
attr WARP2_CP set05Header Content-Type: application/json
attr WARP2_CP set05Method PUT
attr WARP2_CP set05Name tagstart
attr WARP2_CP set05NoArg 1
attr WARP2_CP set05URL http://192.168.0.82/nfc/inject_tag_start


,,tag_type" und ,,tag_id" müssen aus der Wallbox von einem freigegebenen Tag kopiert werden.

Dementsprechend müsste man noch die myUtils anpassen:

if ($VehicleState == 1 ){ # Fahrzeug ist angeschlossen
if (ReadingsNum("WARP2_CP","autostart",1) == 1) { # Autostart ?
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
}
if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
################# NFC ##########################
fhem("set WARP2_CP tagstart"); # NFC Freigabe
################# NFC ##########################
fhem("set WARP2_CP start_charging");
return; # bei Sofortladen Routine verlassen
}



Hier habe ich den Befehl:

fhem("set WARP2_CP tagstart");   

in den Bereich für das Sofortladen platziert. Das kann man nach seinen Wünschen variieren oder gleich nach der "Vehicle_State" Abfrage für alle Modi setzen.

chris_kmn

#26
so, grad mal probiert. Er übernimmt tatsächlich die Tag-Id und man kann einen angelernten Tag simulieren. Vermutlich geht das gleiche auch mit Tag-Start, so dass man nur eine der beiden Funktionen benötigt.

Edit: ich habe den code oben dementsprechend angepasst

smoudo

Das mit dem Taster währe auch eine tolle Idee. Ich nutze momentan eben den nfc als Taster. Taste vorne drücken währe aber auf alle Fälle funktionell.

chris_kmn

Den Taster müsste man in dem Warp2 device einfach per event_on_change und notify abfragen können. Und dann den ,,sofortladen" dummy setzen. Mal schauen wann ich dazu komme. Würde mir selber auch gut gefallen in meiner Automatisierung 😀

chris_kmn

#29
Sodele, ich hab das mal versucht umzusetzen. Ist aber erst zu 50% getestet.

Ich hänge hier nochmal meine ganze Konfig und Devices mit an, damit man einen kompletten Satz hat. Jedoch funktioniert das hier natürlich nur, wenn man seine PV-Anlnage entsprechend integriert. Bei mir ist es eine RCT-Power und per fhempy angebunden:

Wallbox:


defmod WARP2_CP HTTPMOD http://192.168.0.82/evse/state 23
attr WARP2_CP DbLogExclude .*
attr WARP2_CP alias Wallbox
attr WARP2_CP devStateIcon 1.3:message_socket_on2@red 1.2:message_socket_enabled@orange 1.1:message_socket_unknown@blue 1.0:message_socket_off@green\
2.1:robot 2.0:time_manual_mode
attr WARP2_CP enableControlSet 0
attr WARP2_CP enableCookies 1
attr WARP2_CP event-on-change-reading charger_state,button_press_time,vehicle_state
attr WARP2_CP event-on-update-reading power
attr WARP2_CP extractAllJSON 0
attr WARP2_CP get01Name autostart
attr WARP2_CP get01Poll 67
attr WARP2_CP get01URL http://192.168.0.82/evse/auto_start_charging
attr WARP2_CP get04ExtractAllJSON 1
attr WARP2_CP get04Name power
attr WARP2_CP get04Poll 11
attr WARP2_CP get04URL http://192.168.0.82/meter/values
attr WARP2_CP get05ExtractAllJSON 1
attr WARP2_CP get05Name phases
attr WARP2_CP get05Poll 69
attr WARP2_CP get05URL http://192.168.0.82/meter/phases
attr WARP2_CP get06ExtractAllJSON 1
attr WARP2_CP get06Name button_state
attr WARP2_CP get06Poll 17
attr WARP2_CP get06URL http://192.168.0.82/evse/button_state
attr WARP2_CP getHeader1 Content-Type: application/json
attr WARP2_CP group 01-Energie
attr WARP2_CP httpVersion 1.1
attr WARP2_CP icon wallbox
attr WARP2_CP reading01Name vehicle_state
attr WARP2_CP reading01Regex "iec61851_state":([\d])
attr WARP2_CP reading02Name charger_state
attr WARP2_CP reading02Regex "charger_state":([\d])
attr WARP2_CP reading03Name MaxCurrent
attr WARP2_CP reading03Regex "allowed_charging_current":([\d]+)
attr WARP2_CP requestHeader Content-Type: application/json
attr WARP2_CP room Carport,Haus,MQTT
attr WARP2_CP set01Data {"current":$val}
attr WARP2_CP set01Header Content-Type: application/json
attr WARP2_CP set01Method PUT
attr WARP2_CP set01Name current
attr WARP2_CP set01URL http://192.168.0.82/evse/external_current_update
attr WARP2_CP set02Data {"auto_start_charging":$val}
attr WARP2_CP set02Header Content-Type: application/json
attr WARP2_CP set02IMap false:0, true:1
attr WARP2_CP set02Method PUT
attr WARP2_CP set02Name auto_start_charging
attr WARP2_CP set02URL http://192.168.0.82/evse/auto_start_charging_update
attr WARP2_CP set03Data null
attr WARP2_CP set03Header Content-Type: application/json
attr WARP2_CP set03Method PUT
attr WARP2_CP set03Name stop_charging
attr WARP2_CP set03NoArg 1
attr WARP2_CP set03URL http://192.168.0.82/evse/stop_charging
attr WARP2_CP set04Data null
attr WARP2_CP set04Header Content-Type: application/json
attr WARP2_CP set04Method PUT
attr WARP2_CP set04Name start_charging
attr WARP2_CP set04NoArg 1
attr WARP2_CP set04URL http://192.168.0.82/evse/start_charging
attr WARP2_CP set05Data {"tag_type":0,"tag_id":"D3:B1:4F:B7"}
attr WARP2_CP set05Header Content-Type: application/json
attr WARP2_CP set05Method PUT
attr WARP2_CP set05Name tagstart
attr WARP2_CP set05NoArg 1
attr WARP2_CP set05URL http://192.168.0.82/nfc/inject_tag_start
attr WARP2_CP showBody 0
attr WARP2_CP sortby 3
attr WARP2_CP stateFormat {sprintf("1:%d\n2:%d\n Imax: %.2f A\n . . Pch: %.3f kW\n .  . Ech: %.3f kWh",\
ReadingsNum($name,"charger_state",0),\
ReadingsNum($name,"autostart",0),\
ReadingsNum($name,"MaxCurrent",0)/1000,\
ReadingsNum($name,"power",0)/1000,\
ReadingsNum($name,"energy_abs",0))}
attr WARP2_CP timeout 10
attr WARP2_CP userReadings PwrFaktor {ReadingsNum($name,"phases_active_0",0)+ReadingsNum($name,"phases_active_1",0)+ReadingsNum($name,"phases_active_2",0)}
attr WARP2_CP verbose 0


Notify für Taster an der Wallbox (Sofortladen):

defmod nty_WARP_CP_btn notify WARP2_CP:button_press_time:.* IF ([WARP2_CP:button_press_time] > 0) (set dSofortLaden on)
attr nty_WARP_CP_btn group Notify
attr nty_WARP_CP_btn room Carport


Dummy für Sofortladen:

defmod dSofortLaden dummy
attr dSofortLaden alexaName Sofortladen
attr dSofortLaden alias Sofortladen
attr dSofortLaden devStateIcon on:rc_GREEN:off off:rc_RED:on
attr dSofortLaden genericDeviceType switch
attr dSofortLaden group 01-Energie
attr dSofortLaden homebridgeMapping clear On=state,valueOn=on,valueOff=off,cmdOn=on,cmdOff=off
attr dSofortLaden icon control_arrow_rightward
attr dSofortLaden realRoom Carport
attr dSofortLaden room Carport,Haus,Homekit
attr dSofortLaden setList on off
attr dSofortLaden siriName Sofortladen
attr dSofortLaden sortby 5
attr dSofortLaden webCmd on:off


Notify zum Resetten von "Sofortladen" bei Fahrzeug abstöpseln:


defmod nty_Vehiclestate_uplg notify WARP2_CP:vehicle_state:.0 set dSofortLaden off
attr nty_Vehiclestate_uplg disable 0
attr nty_Vehiclestate_uplg group Notify
attr nty_Vehiclestate_uplg room Carport


Notify zur Stromsteuerung/aufrufen myUtils:

defmod nty_WARP_CP_chg notify WARP2_CP:power:.* IF ([WARP2_CP:charger_state] >= 1) ({myChargeCurrent()})
attr nty_WARP_CP_chg group Notify
attr nty_WARP_CP_chg room Carport


Das Dummy zum einstellen des Lademodes und des Fixstroms bei Sofortladen:

defmod WB_pmode dummy
attr WB_pmode alias Lademode Wallbox
attr WB_pmode group 01-Energie
attr WB_pmode icon measure_photovoltaic_inst
attr WB_pmode readingList state current
attr WB_pmode room Carport,Haus
attr WB_pmode setList state:minPV,nurPV,BattPV,fix current:slider,6000,500,16000
attr WB_pmode sortby 4
attr WB_pmode stateFormat {sprintf("Lademode: %s  . . Strom:",\
ReadingsVal($name,"state",0))}
attr WB_pmode webCmd current:state


Und zu guterletzt die Funktion im myUtils:

##########################################################
# Ladestrom berechnen  kontinuierlich
sub myChargeCurrent() {
my $overpow = 0; # Leistungsüberschuss ("-" = Überschuss)
### PV-Wechselrichter + Battterie (RCT-Power):
my $BatteryPower = ReadingsNum("RCTPower_AR","power_battery",0); # Leistung Batterie ("-" = laden)
my $GridPower = ReadingsNum("RCTPower_AR","power_grid_total",0); # Leistung Netz ("-" = einspeisen)
### Wallbox:
my $maxcurr = ReadingsNum("WARP2_CP","MaxCurrent",0); # Maximaler Ladestrom Wallbox
my $ChargePower = ReadingsNum("WARP2_CP","power",0); # Ladestrom
my $VehicleState = ReadingsNum("WARP2_CP","charger_state",0); # Fahrzeugstatus
my $PwrFaktor = ReadingsNum("WARP2_CP","PwrFaktor",0); # Faktor Anzahl aktive Phasen
### FHEM Devices zur Steuerung:
my $FixStrom = ReadingsNum("WB_pmode","current",0); # Ladestrom Vorgabe
my $WB_pmode = ReadingsVal("WB_pmode","state",0); # Sollwert PV-Lademodus

if ($PwrFaktor == 0) {$PwrFaktor = 2}; # Anzahl aktive Phasen (gelesen von WB-Stromzähler). Hier 2 als Default (fahrzeugspezifisch)

$overpow = $GridPower + $BatteryPower; # Leistungsüberschuss ("-" = Überschuss)

if ($VehicleState == 1 ){ # Fahrzeug ist angeschlossen
if (ReadingsNum("WARP2_CP","autostart",1) == 1) { # Autostart ?
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
}
if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
fhem("set WARP2_CP start_charging");
return; # bei Sofortladen Routine verlassen
}
elsif ($WB_pmode eq "minPV" ) { # minPV Laden: Ladevorgang sofort starten mit min Ladestrom
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP start_charging");
}
elsif ($WB_pmode eq "nurPV") { # nurPV Laden: Ladevorgang bei Überschuss starten
if ($overpow <= -(1420*$PwrFaktor)) { # Laden starten bei PV Überschuss  (1A ca. 430 Watt)
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP start_charging");
}
}
elsif ($WB_pmode eq "BattPV") { # BattPV Laden: Ladevorgang bei Überschuss starten
if ($GridPower <= 20 && $BatteryPower <= 5300) { # Laden starten bei Leistungsüberschuss
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP start_charging");
}
}
elsif ($WB_pmode eq "fix") { # fix Laden: Ladevorgang mit festem Strom laden
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
fhem("set WARP2_CP start_charging");
}
return;
}

if ($VehicleState == 3)  { # Fahrzeug lädt
 
if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
return; # bei Sofortladen Routine verlassen
}
elsif ($WB_pmode eq "minPV" || $WB_pmode eq "nurPV") { # minPV Laden:
if ($overpow <= -1000) { # bei Überschuss Strom anheben
$maxcurr = int((500 + $ChargePower)/($PwrFaktor*21.5))*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
elsif ($overpow > 0 ) { # Strom absenken bei Strommangel
$maxcurr = int(($ChargePower-$overpow-400)/($PwrFaktor*21.5))*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
else {
return;
}
if ($maxcurr < 6000) {
$maxcurr = 6000;
if ($WB_pmode eq "nurPV" ) {
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
fhem("set WARP2_CP stop_charging"); # Laden unterbrechen bei nurPV !
}
}
if ($maxcurr > 16000) {$maxcurr = 16000};
fhem("set WARP2_CP current $maxcurr");
}
elsif ($WB_pmode eq "BattPV") {
if ($GridPower <= 20 && $BatteryPower <= 7000) { # keine Stromentnahme aus Netz und Batt-Leistung kleiner 7kW ?
$maxcurr = int((500 + $ChargePower)/($PwrFaktor*21.5))*100; # Strom anheben
if ($maxcurr > 16000) {$maxcurr = 16000};
}
if ($GridPower > 100 ) { # Strom aus Netz ?
$maxcurr = int(($ChargePower-$overpow-400)/($PwrFaktor*21.5))*100; # Ladestrom reduzieren
}
if ($maxcurr < 6000) { # Laden unterbrechen wenn zu wenig Leistung
$maxcurr = 6000;
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
fhem("set WARP2_CP stop_charging"); # Laden unterbrechen bei nurPV !
}
fhem("set WARP2_CP current $maxcurr");
}
elsif ($WB_pmode eq "fix") { # fix Strom laden
if ($maxcurr != $FixStrom) {
fhem("set WARP2_CP current $FixStrom");
}
}
}
} #End Sub


Das sollte es gewesen sein.

Funktion:

- Laden kann nur mit NFC Tag gestartet werden oder über taginject-Befehl des Wallbox-Devices (NFC Freigabe kann natürlich auch komplett in der WB abgeschalet werden)
- mit dem Taster wird der Modus Sofortladen gesetzt. Dann wir mit dem im Dummy eingestellen Strom (Slider) geladen
- der Taster sollte dann in der Wallbox ohne Funktion konfiguriert werden, da start-stop über NFC oder FHEM
- Die Konfiguration ist auf 2-phasen-Laden eingestellt. Wenn das bei euch anders ist bitte die Variable $PwrFaktor anpassen (Defaultwert 1-3) Ich bin noch dabei das ganze
automatisch einstellen zu lassen. Dann muss aber ein Zähler in der WB verbaut sein.

Viel Spaß damit.....