Steuerung einer Tinkerforge WARP Wallbox

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

Vorheriges Thema - Nächstes Thema

chris_kmn

Hallo zusammen,

ich habe meine neue Tinkerforge WARP2 Wallbox nun in FHEM zwecks Steuerung und PV Überschussladen integriert.

Entgegen der Lösung bei EVCC die Box per MQTT zu steuern habe ich den Weg per HTTPMOD genutzt, da die Box bei aktiviertem MQTT sämtliche Werte im Sekundentakt sendet. Das erschein mir als eine unnötige Belastung des Netzwerks.

Im HTTPMOD Device habe ich mehrere Konfigurations- und Steuerungsbefehle zusammengefasst:

defmod WARP2_CP HTTPMOD http://192.168.0.82/evse/state 10
attr WARP2_CP devStateIcon 1.2:message_socket_on2@red 1.1:message_socket_enabled@orange 1.0:message_socket_off@green\
2.0:time_automatic 2.1:time_manual_mode
attr WARP2_CP enableControlSet 0
attr WARP2_CP enableCookies 1
attr WARP2_CP extractAllJSON 0
attr WARP2_CP get01Name auto_start
attr WARP2_CP get01Poll 1
attr WARP2_CP get01PollDelay 30
attr WARP2_CP get01URL http://192.168.0.82/evse/auto_start_charging
attr WARP2_CP group Wallbox
attr WARP2_CP httpVersion 1.1
attr WARP2_CP icon electric_car_icon
attr WARP2_CP reading01Name Status
attr WARP2_CP reading01Regex iec61851_state":([\d\.]+)
attr WARP2_CP reading02Name MaxCurrent
attr WARP2_CP reading02Regex allowed_charging_current":([\d\.]+)
attr WARP2_CP reading03Name charge_mode
attr WARP2_CP reading03Regex charge_release":([\w]+)
attr WARP2_CP reading04Name vehicle_state
attr WARP2_CP reading04Regex vehicle_state":([\w]+)
attr WARP2_CP requestHeader Content-Type: application/json
attr WARP2_CP room Carport
attr WARP2_CP set01Data {"current":$val}
attr WARP2_CP set01Header Content-Type: application/json
attr WARP2_CP set01Header2 Accept: */*
attr WARP2_CP set01Method PUT
attr WARP2_CP set01Name current
attr WARP2_CP set01URL http://192.168.0.82/evse/current_limit
attr WARP2_CP set02Data {"auto_start_charging":$val}
attr WARP2_CP set02Header Content-Type: application/json
attr WARP2_CP set02Header2 Accept: */*
attr WARP2_CP set02Map 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 true
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 set04NoData 0
attr WARP2_CP set04URL http://192.168.0.82/evse/start_charging
attr WARP2_CP showBody 0
attr WARP2_CP stateFormat {sprintf("1:%d\n2:%d\n%d A",\
ReadingsNum($name,"vehicle_state",0),\
ReadingsVal($name,"charge_mode",0),\
ReadingsVal($name,"MaxCurrent",0)/1000)}
attr WARP2_CP timeout 10
attr WARP2_CP verbose 0


Da ich noch auf meinen PV Wechselrichter warte ist die PV Überschussregelung erstmal nur exemplarisch als Dummy angelegt. Dazu folgender "Stromzähler" mit dem ich per Regler den Überschuss fix einstelle:

defmod dStromzaehler dummy
attr dStromzaehler group Wallbox
attr dStromzaehler readingList Stromueberschuss
attr dStromzaehler room Anschlussraum,Carport
attr dStromzaehler setList Stromueberschuss:slider,0,200,16000
attr dStromzaehler stateFormat Stromueberschuss


Per AT und einem bischen Code in der 99_myUtils wird dann regelmäßig bei angeschlossenem Fahrzeug der Ladestrom gestellt.

Timer:
defmod tim_WB_ChrCurr at +*00:00:10 IF ([WARP2_CP:vehicle_state] >= 1) ({myChargeCurrent()})


Funktion in 99_myUtils.pm:

sub myChargeCurrent() {
#my ($overcurr,$maxcurr,$WBState,$ChargeMode) = @_;
my $overcurr = ReadingsVal("dStromzaehler","Stromueberschuss",0); # Stromüberschuss
my $maxcurr = ReadingsVal("WARP2_CP","MaxCurrent",0); # Maximaler Ladestrom
my $WBState = ReadingsVal("WARP2_CP","Status",0); # IEC Status WB
my $ChargeMode = ReadingsVal("WARP2_CP","charge_mode",0); # Startmodus (Autostart - manuelles Starten)
my $VehicleState = ReadingsVal("WARP2_CP","vehicle_state",0); # Fahrzeugstatus

if ($VehicleState == 1 && $overcurr >= 6000 ) { # Fahrzeug ist angeschlossen -> Laden starten bei PV Überschuss
$maxcurr = 6000;
{fhem("set WARP2_CP current $maxcurr")};
{fhem("set WARP2_CP start_charging")};
#qx(curl -H "Content-Type: application/json" -X PUT -d "null" http://192.168.0.82/evse/start_charging);
return;
}

if ($VehicleState == 2)  {

if ( $overcurr >= 1500 ) {

$maxcurr = $maxcurr + 1000;
if ($maxcurr > 16000) {$maxcurr = 16000};
{fhem("set WARP2_CP current $maxcurr")};
#qx(curl -H "Content-Type: application/json" -X PUT -d "{\"current\":$maxcurr}" 192.168.0.82/evse/current_limit);
}

elsif ($overcurr < 500) { # Überschuss zu reging ?

if ($overcurr < 100 && $maxcurr <= 6000) { # Überschuss kleiner als kleinster Ladestrom?

{fhem("set WARP2_CP stop_charging")}; # Laden unterbrechen !
# Alternative per curl:
#qx(curl -H "Content-Type: application/json" -X PUT -d "null" http://192.168.0.82/evse/stop_charging);
if ($ChargeMode == 0) {fhem("set WARP2_CP auto_start_charging 0")}; # Falls Autostart aktiv: deaktivieren
return; # Funktionsabbruch
}

$maxcurr = $maxcurr - 1000; # Ladestrom reduzieren
{fhem("set WARP2_CP current $maxcurr")};
#qx(curl -H "Content-Type: application/json" -X PUT -d "{\"current\":$maxcurr}" 192.168.0.82/evse/current_limit);
return;
}
}

return;
}


Was aus meiner Sicht noch nicht ganz passt ist die Stromeinstellung, da meiner Meinung nach der Ladestrom beim AC Laden nur in den Werten 6A, 10A, 13A und 16A gestellt werden kann.

Vielleicht kann man sich dazu hier mal ausstauschen.

e-t-h

Hi Chris,

habe heute meine neue Box in Gang gesetzt. Stehe aber mehr auf MQTT, HTTPMOD habe ich noch nie genutzt. Habe trotzdem mal Deinen Code bei mir mal adaptiert und werde damit rumspielen. Unabhängig davon: Man muss bei MQTT folgendes machen: "Leerer Payload. Es muss null übergeben werden.". Hast Du eine Ahnung wie das geht? Habe es über den MQTT-Explorer versucht und aus FEHM mit setlist
off:noArg    Tul/GT/warp-1/evse/stop_charging
on:noArg     Tul/GT/warp-1/evse/start_charging

mit und ohne Argument, nichts funktioniert..

Ansonsten habe ich eine 32A Version mit Zähler, die derzeit auf 16A begrenzt ist und nur einphasig laden muss. Können uns gerne austauschen, wenn Du willst. Überschussladen dauert bei mir noch etwas..
Ekki
e-t-h

chris_kmn

Hi Ekki,

sorry, ich habe gerade erst deinen Beitrag gelesen.

Mit MQTT habe ich leider auch noch keinen Nullwert gesendet. Hast du mal probiert einfach null (ohne alles) als message zu senden ?

VG, Chris

e-t-h

Hi Chris,
alles gut.. Hatte ich. Es war dann einfacher als gedacht:


defmod GT_Warp_1 MQTT2_DEVICE
attr GT_Warp_1 IODev myMQTTBroker
attr GT_Warp_1 alias Wallbox
attr GT_Warp_1 devStateIcon {
use v5.10;
my $spic = '';
given(ReadingsVal($name,"vehicle_state",0))
{
when (0) {$spic="car\@gray";;}
when (1) {$spic="car\@green";;}
when (2) {$spic="car\@orange";;}
when (3) {$spic="car\@red";;}
default {$spic ="car\@red"}
}
"<div>"
.
FW_makeImage("$spic") . "</br>"
.
sprintf("%.0f W / %.1f kWh (%.1f/%.1f/%.1f A)",
ReadingsVal("GT_Warp_1","25",0),
ReadingsVal("GT_Warp_1","energy_rel",0),
ReadingsVal("GT_Warp_1","4",0),
ReadingsVal("GT_Warp_1","5",0),
ReadingsVal("GT_Warp_1","6",0)
)
.
"</div>"
}

attr GT_Warp_1 group Technik
attr GT_Warp_1 icon electric_car_icon
attr GT_Warp_1 readingList xyz/GT/warp-1/evse/state:.* { json2nameValue($EVENT) }\
xyz/GT/warp-1/evse/energy_meter_values:.* { json2nameValue($EVENT) }\
xyz/GT/warp-1/meter/detailed_values:.* { json2nameValue($EVENT) }
attr GT_Warp_1 room Garten
attr GT_Warp_1 setList
off:noArg     Tul/GT/warp-1/evse/stop_charging null
on:noArg     Tul/GT/warp-1/evse/start_charging null
attr GT_Warp_1 stateFormat {
sprintf(
"%.0f W / %.1f kWh (%.1f/%.1f/%.1f A)<br>",
ReadingsVal("GT_Warp_1","25",0),
ReadingsVal("GT_Warp_1","energy_rel",0),
ReadingsVal("GT_Warp_1","4",0),
ReadingsVal("GT_Warp_1","5",0),
ReadingsVal("GT_Warp_1","6",0)
)
}



Also einfach null dahinter schreiben. Das senden einer NULL-Message mit
sudo mosquitto_pub -t xyz/GT/warp-1/evse/start_charging -n
hatte nicht geklappt, das sind nach der Mosquitto-Doku eigentlich Null-Messages.

Vielleicht hilft ja jemandem..
e-t-h

chris_kmn

Hi Ekki,

so meinte ich das auch mit dem null.

Wie es bei Mosquitto klappt steht in der API Doku bei Tinkerforge:

mosquitto_pub -t "warp/ABC/reboot" -m "null"

https://www.warp-charger.com/api.html?v=2

chris_kmn

Hallo zusammen,

nachdem die API der Tinkerforge WARP Wallbox geändert wurde veröffentliche ich hier auch meine Änderungen dazu.
In der jetzigen Version ist auch das Auslesen eines internen Stromzählers integriert.


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



smoudo

Hallo,

ich nutze den Code von Chris um die Warp2 box zu steuern. Hat bisher super funktioniert, auch das überschussladen! danke dafür!!
Bislang verwendete ich die Firmware 1.1.2. In letzter Zeit hatte ich des öfteren Ausfälle der box, die nach einem reboot (Sicherung aus/ein)
wieder behoben waren. (Eine art freeze)
Testweise wollte ich gestern auf die neueste Firmware 2.0.7 patchen mit einem katastrophalen Ergebnis. Stellenweise war nicht mal mehr das Webinterface zu erreichen sobald das auto angeschlossen war.

Also wieder zurück zur 1.1.2, alles auf den Stand von vorher gesetzt, allerdings funktioniert das Überschussladen nicht mehr. Das normale Ansteuern über fhem per "set warp2 start_charching" etc.
läuft fehlerfrei. ebenso das setzen von current und max.

lediglich der code aus der 99_myUtils wird nicht mehr ausgeführt.

Hat hier schon jemand ähnliche probleme mit der box gehabt?  fhem neustart etc. hab ich alles schon probiert. überschüsse sind ausreichend da, eingetragene readings etc. passen.

ich hoffe es hat jemand einen ansatz.

Viele Grüße

Matze


chris_kmn

#7
Hi Matze,

leider gab es mit der Version 2.x der WARP2 einen sogenannten API Bruch. Ich musste meine Steuerung für die WARP2 anpassen und habe die Änderungen hier auch gepostet.

Hast du die Änderungen so auch übernommen ?

Warum du Probleme mit der 2.0.7 hast kann ich nicht wirklich nachvollziehen. Vielleicht solltest du einfach nochmal flashen. Evtl. könnte es an der alten Ansteuerung vom FHEM liegen. Ich hatte bei mir mit dem Update auch gleich die Änderungen am FHEM umgesetzt und bis heute keinerlei Probleme.

Du kannst auch mal prüfen, ob die Wallbox den Ladecontroller ebenfalls auf die Version 2.0 geflasht hat.

Oder auch mal die Konfiguration zurück setzen. Auch wenn das bedeutet, dass du die Box neu konfigurieren musst...

VG, Chris

smoudo

Danke für die schnelle Antwort.

Ja das hatte ich so übernommen. Und seit dem zurückspielen auf Ursprung tut es nicht mehr mit dem überschussladen. Obwohl an dem Code ja nichts geändert wurde. Mir kommt es vor als wird das nicht mehr getriggert.

Was mit der 2.0.7 schief ging kann ich nicht sagen. Webinterface und Schnittstellen waren nicht mehr verfügbar. Die Box bootete auch erst als das Auto abgezogen war. Ganz komische Symptome.

chris_kmn

#9
hm, man sollte das Update eigentlich nur machen, wenn kein Auto angeschlossen ist. Hat das evtl. das Problem ausgelöst ?

Vielleicht solltest du die Box wirklich mal auf die Werkseinstellungen zurücksetzen. Am besten erst (direkt) nach dem Update.

smoudo

könnte das problem sein. Ich teste nochmal ohne auto.

smoudo

ich glaube ich komme dem problem auf die spur. 2.0.7 ist wieder drauf.

Wenn ich die ladefreigabe rausnehme kann ich laden.
sobald ich aber Benutzerautorisierung in der Wallbox aktiviere  geht von seiten fhem nichts mehr.
Jetzt habe ich einen user angelegt namens fhem. aber wie kann ich über fhem mein user/passwort mitgeben?
hab ich nix zu gefunden  :o

chris_kmn

#12
Gute Frage. Ich nutze die Benutzerautorisierung nicht. Das ist ja eh nur für den Zugriff auf die Wallbox-Oberfläche und nicht zum Laden, soweit ich weiß. Zum Laden habe ich die NFC Tags Nutzern zugeordnet. Das hat aber wiederum nichts mit dem Zugriff auf die Wallbox zu tun.

Um sich per FHEM zu autorisieren, muss man das httpmod entsprechen konfigurieren. Ich sehe aber keinen Mehrwert darin.

Es gibt mittlerweile mehrere Arten der Freigabe in der Wallbox. Zum Teil per Lademanager, per NFC Tags und über eine externe Steuerung.

Ich habe meine Box wie auf dem Foto konfiguriert.

chris_kmn


smoudo

#14
so habe ich das auch konfiguriert und damit lässt es keine Steuerung durch fhem zu.
erst wenn ich die nfc tag geschichte deaktiviere läuft die Steuerung über fhem.

Ich möchte aber nicht das einfach bei einstecken geladen wird. das soll ja die überschussregelung machen oder eben bei bedarf der nfc zum sofortladen.

State ist 1:1
und 2:0

sollte also grundsätzlich passen, ändert sich auch nicht wenn ich den nfc haken rausnehme

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.....

smoudo

Wow, das ist richtig umfangreich geworden! Danke das du Deine Arbeit mit uns teilst!
Ich werde das heute abend mal testen.
So wie ich das verstehe ist damit die nfc Freigabe der Wallbox aktiv gesetzt richtig? Muss in der Wallbox noch ein virtueller NFC angelegt werden?

Der PV-Bereich ist ja nach wie vor in der myutils untergebracht. und beschränkt sich auf die 3 readings:

"RCTPower_AR","overpow" = Überschuss, welcher gerade eingespeist wird - fehlt in deiner aktuellen Fassung?
"RCTPower_AR","power_battery" = Ladezustand Batterie
"RCTPower_AR","power_grid_total" = Netzbezug

richtig?

wenn ich die Zeile mit der Batterie auskommentiere sollte das ganze auch ohne Akku laufen?! Mein Akku lässt noch auf sich warten. Meine PV hat einen Fronius WR und ist komplett in Fhem integriert.
Bzw. könnte ich einfach ein reading erzeugen welches mit 0 gefüllt ist wenn das hilft?

Viele Grüße

Matze



chris_kmn

#31
Gern geschehen. Aber das Delta für das Sofortladen per Taster war nicht so viel Arbeit. So kann man sich auch mal für die viele Arbeit der anderen revanchieren :)

Zu deinen Fragen:

- NFC muss in der Wallbox aktiv geschaltet werden. Das macht fhem nicht.
- du kannst einen virtuellen NFC in der WB anlegen, wenn du für FHEM einen extra User/Ladebericht haben willst. Aber aktuell nutzt meine Konfiguration keine NFC-Simulation, da man ja eh per Tag freigeben muss. Wenn du per FHEM ohne NFC Tag das Laden starten willst, dann muss man den ,,taginject" Befehl des WB device nutzen.

- overpow: wird berechnet. In meiner letzten myutils war das auskommentiert. Ich habe jetzt nur den Kommentar gelöscht
- power_battery: ist die Leistung des PV Speichers, (-)=laden (+)=entladen.  Ich erhöhe den Ladestrom für das Auto so lange, bis der PV Speicher nicht weiter geladen wird. Auskommentieren wäre nicht gut, aber du kannst es standardmäßig auf 0 setzen.
- power_grid_total: ist Einspeisung vom Wechselrichter in das Netz (-) bzw. die Entnahmeleistung aus dem Netz (+)

Falls du auch eine RCT Anlage hast, kann ich dir gerne mein Device dazu schicken.

chris_kmn

So sieht ein Überschussladen bei mir aus. Das Auto wurde Abends angesteckt und am nächsten Morgen beim erreichen der PV-Mindestleistung hat fhem den Ladevorgang gestartet.

smoudo

#33
hab das ganze übernommen und werde es morgen früh testen.
Noch eine Verständnisfrage:
Ich habe ein Fahrzeug das nur 1 phasig lädt.

PwrFaktor habe ich dementsprechend auf 1 gesetzt. Muss an den Multiplikatoren im Bereich nurPV etwas verändert werden? wo kommen die 21.5 als Multiplikator her?


Wie oft bekommst du readings vom WR? meinen hatte ich auf ein interval von 60 gestellt. Das hatte aber sehr grobe Leistungssprünge der Wallbox zur Folge. Ich habe auch keine Ahnung wie das Auto dauerhaft auf unterschiedliche Ladeströme reagiert.

Das tolle an dem Wechselrichter ist, es ist ein hybrid und dementsprechend ist das battery reading schon da. Wenn byd irgendwann man wieder akkus (zu vernünftigen Preisen) liefern kann ist das praktisch schon integriert und sollte funktionieren.



smoudo

Nach ersten versuchen, funktioniert es gut! Danke!!
Was auch eine coole Funktion währe, wenn man unterschieden bekommt wieviel Anteil mit pv geladen und wieviel aus dem Netz bezogen wurde.
Lt. Zähler haben wir seit März schon über 1000kwh ins Auto geladen. Alles Kurzstreckenfahrten  :o

chris_kmn

Zitat von: smoudo am 11 August 2022, 00:15:03
hab das ganze übernommen und werde es morgen früh testen.
Noch eine Verständnisfrage:
Ich habe ein Fahrzeug das nur 1 phasig lädt.

PwrFaktor habe ich dementsprechend auf 1 gesetzt. Muss an den Multiplikatoren im Bereich nurPV etwas verändert werden? wo kommen die 21.5 als Multiplikator her?


Wie oft bekommst du readings vom WR? meinen hatte ich auf ein interval von 60 gestellt. Das hatte aber sehr grobe Leistungssprünge der Wallbox zur Folge. Ich habe auch keine Ahnung wie das Auto dauerhaft auf unterschiedliche Ladeströme reagiert.

Das tolle an dem Wechselrichter ist, es ist ein hybrid und dementsprechend ist das battery reading schon da. Wenn byd irgendwann man wieder akkus (zu vernünftigen Preisen) liefern kann ist das praktisch schon integriert und sollte funktionieren.

Bei Einphasig ist die 1 richtig. Aber am besten nur bei der ,,if-Abfrage auf 0" aus der dortigen 2 eine 1 machen. Sonst keine Faktoren ändern.

Die 21.5 sind abgeleitet von 220 Volt zur Berechnung der Leistung. Beim Laden sink bei mir die Spannung etwas. Zur Rundung und integer Bildung hab ich die 215 (220) Volt durch 10 geteilt. Man muss ja leider zwischen Leistung vom WR und Strom der Wallbox hin und her rechnen.

Von meinen WR hole ich die Werte alle 10 Sekunden. 60 Sek. ist tatsächlich etwas langsam für die Überschussregelung. Da ist die Wahrscheinlichkeit höher Strom aus dem Netz zu ziehen wenn die Lasten im Haus dynamisch sind (z.b. Waschmaschine) oder bei wechselnder Bewölkung. Wobei, wenn du einen Speicher hast ist das dann wieder abgepuffert und kein Problem.

Freut mich, dass es bei dir läuft :)

Den PV Ladestrom zu berechnen ist etwas kniffelig. Dann bräuchtest du noch die Hauslast als Meßwert und dann auf jeden Fall einen schnelleren Werteupdate als 60 sek.

ABER: du hast ja NFC. Wenn du also mit ,,nurPV" lädst könntest du einen virtuellen NFC Tag anlegen und mit diesem per tagstart laden. Dann hast du in der WB ein eigenes Profil mit eigenem Ladeenergie-Wert, der dann nur PV ist.

smoudo

Ich hatte heute das phänomen das er heute früh ganz normal mit pv Strom angefangen hat zu laden, dann war meine Frau unterwegs und als sie kam hat sie das Auto angesteckt und nichts ist passiert. Ich habe dann erneut auf ,,nurpv" geklickt, ging nichts. Erst nachdem ich die nfc Abfrage raus gemacht habe ging es sofort los. Muss ich den injecttag noch irgendwo setzen?

Dann hat er allerdings dauernd geladen, stop, geladen, stop obwohl insgesamt 3,2kw an Überschuss da war.
Das reading hat auch -3200 angezeigt. Verstehe ich noch nicht so ganz.

Das mit dem virtuellen nfc zum auswerten ist eine super Idee!

Viele Grüße

Matze

chris_kmn

#37
Moin Matze,

hat sie denn das Laden auch mit einem NFC Tag gestartet oder nur das Auto angesteckt ?

Das mit dem An/aus ist in der Tat merkwürdig. Hat es denn vorher mit dem alten Code funktioniert? Könnte am 1-Phasen-Betrieb liegen. Ich schaue mir die Funktion nochmal an.

Zeigt er im WB-FHEM-Device an, dass zwei Phasen aus und eine aktiv ist (phases_active_0-2)?

smoudo

Moin Chris,

ich gehe davon aus das sie das Auto nur eingesteckt hat. Ich habe gestern Abend nochmal in der WB geschaut, das Auto hatte wohl morgens noch den Tag aktiv mit dem ich abends vorher getestet hatte.

Das mit den aktiven Phasen schau ich mir an, geht momentan nicht, weil das Auto voll ist.
Aber da das Auto nur 1 phasig kann, dürfte da auch nichts anderes stehen oder?

Viele Grüße

Matte

chris_kmn

Hi Matte,

was sein könnte ist, dass das Ladegerät im Auto mit 400V betrieben wird, dann also über zwei Phasen anstatt einer Phase und Nulleiter. Dann passen meine Grenzwerte in den Formeln nicht mehr. Wäre mal interessant zu wissen, wie das bei dir ist und ob es vorher funktioniert hat. In meinem Ursprungscode waren glaube ich zwei Phasen fest eingestellt.

VG, Chris

smoudo

#40
Das Auto lädt nur mit einer Phase. Mehr ist auch pintechnisch nicht belegt.
Anbei ein Bild der readings. Geht alle 10 sek. An-aus
Überschuss zum zeitpunkt des screenshots: PowerFlow_Site_P_Grid -2771.01


Alter Code in 99myutils bislang mit V1.1.2:
sub myChargeCurrent() {
#my ($overcurr,$maxcurr,$WBState,$ChargeMode) = @_;
my $overcurr = ReadingsVal("Primo","Einspeisung",0); # Stromüberschuss
my $maxcurr = ReadingsVal("WARP2_CP","MaxCurrent",0); # Maximaler Ladestrom
my $WBState = ReadingsVal("WARP2_CP","Status",0); # IEC Status WB
my $ChargeMode = ReadingsVal("WARP2_CP","charge_mode",0); # Startmodus (Autostart - manuelles Starten)
my $VehicleState = ReadingsVal("WARP2_CP","vehicle_state",0); # Fahrzeugstatus

if ($VehicleState == 1 && $overcurr >= 1500 ) { # Fahrzeug ist angeschlossen -> Laden starten bei PV Überschuss
$maxcurr = 6000;
{fhem("set WARP2_CP current $maxcurr")};
{fhem("set WARP2_CP start_charging")};
#qx(curl -H "Content-Type: application/json" -X PUT -d "null" http://192.168.1.60/evse/start_charging);
return;
}

if ($VehicleState == 2)  {

if ( $overcurr >= 500 ) {

$maxcurr = $maxcurr + 1000;
if ($maxcurr > 10000) {$maxcurr = 10000};
{fhem("set WARP2_CP current $maxcurr")};
#qx(curl -H "Content-Type: application/json" -X PUT -d "{\"current\":$maxcurr}" 192.168.1.60/evse/current_limit);
}

elsif ($overcurr < 100) { # Überschuss zu reging ?

if ($overcurr < 100 && $maxcurr <= 6000) { # Überschuss kleiner als kleinster Ladestrom?

{fhem("set WARP2_CP stop_charging")}; # Laden unterbrechen !
# Alternative per curl:
#qx(curl -H "Content-Type: application/json" -X PUT -d "null" http://192.168.1.60/evse/stop_charging);
if ($ChargeMode == 0) {fhem("set WARP2_CP auto_start_charging 0")}; # Falls Autostart aktiv: deaktivieren
return; # Funktionsabbruch
}

$maxcurr = $maxcurr - 1000; # Ladestrom reduzieren
{fhem("set WARP2_CP current $maxcurr")};
#qx(curl -H "Content-Type: application/json" -X PUT -d "{\"current\":$maxcurr}" 192.168.1.60/evse/current_limit);
return;
}
}

return;
}


Strom hatte ich auf 10A begrenzt, weil meine PV meist nicht mehr bringt und sonst zuviel zurückregelt. Damit hatte ich das An-Aus problem eigentlich nur ganz früh morgens



Viele Grüße

Matze

chris_kmn

Du machst es einem aber auch nicht leicht   ;)

Du hast die myUtils noch von meiner alten Version für die WB Firmware 1.x. Das Device aber für die Firmware 2.x. Es gab doch einen API Bruch mit der neuen Firmware. Meine myutils und das WB device sind beide für 2.x.

Die vehicle_state Abfrage ist z.B. nicht mehr auf 2 beim Laden sondern auf 3. Daher kommen sicher deine Abbrüche nach 10 Sek.


smoudo

#42
Sorry, das war missverständlich. Ich habe dir die alte konfig für die stromkonfiguration gepostet( deshalb der Verweis auf V1.1.2) Als Code aktuell habe ich natürlich den von dir zuletzt geposteten übernommen. Lediglich auf 1 Phase gestellt.

Viele Grüße

Matze

chris_kmn

Ich vermute, dass die Umrechnung zwischen Strom und Leistung nicht passt. Was du tun kannst ist fhem auszuschalten und händisch den Ladestrom an der Wallbox beim Laden einstellen und ablesen wie viel Leistung der Zähler anzeigt.

Hast du es denn mal probehalber mit einer 2 als powerfaktor versucht oder geschaut, ob er beim Laden im FHEM Device auf 1 stehen bleibt ?

smoudo

Das teste ich mal.

Was mir noch aufgefallen ist:

- das notify Vehiclestate_uplg funktioniert nicht. Das steht zwar auf active, aber setzt den Sofortlade Button nicht zurück auf off wenn das auto abgezogen wird. geht das bei dir?
- Bei NFC direkt an der wallbox fängt es jetzt auch sofort das laden an. (wollte ich ja ursprünglich so, sollte aber für mein verständnis nur in zusammenhang mit dem Knopf drücken sein)
- virtuellen nutzer fhem habe ich angelegt und das virtuelle tag vergeben. Zeigt jetzt sauber fhem als user an beim laden. Top!

Gedankenspiel meinerseits:
was hälst du davon aus dem inject_tag_start einfach den inject_tag zu machen und den mit dem Sofortladebutton zu koppeln?  Dann sollte das ganze auch in fhem mit dem Sofortladeknopf funktionieren ohne nochmal set tagstart zu drücken.

chris_kmn

Hm, das mit dem unplug-notify ist mir noch nicht aufgefallen. Muss nochmal testen.

Das er nach NFC Freigabe sofort loslegt, könnte am vorhandenen PV Überschuss liegen. Wenn kein Überschuss da ist sollte er aber nicht starten (wenn ,,nurPV" aktiv), sondern nur nach Knopfdruck - also Sofortladen.

inject_tag und inject_tag start machen fast das gleiche. Mit dem ersten toggelst du quasi start/stop und mit _start startest du nur, keinen stop.

Wenn du das kit dem knopf koppeln willst, dann würde ich einen virtuellen Tag für ,,nurPV" machen und einen für ,,Sofortladen"

smoudo

Ich habe jetzt mal das unplug notify umgebaut
defmod nty_Vehiclestate_uplg notify WARP2_CP:vehicle_state:.* IF ([WARP2_CP:vehicle_state] = 0) (set dSofortLaden off)
attr nty_Vehiclestate_uplg group Wallbox
attr nty_Vehiclestate_uplg room Outdoor

setstate nty_Vehiclestate_uplg 2022-08-15 20:25:17
setstate nty_Vehiclestate_uplg 2022-08-15 19:05:22 state active
setstate nty_Vehiclestate_uplg 2022-08-15 20:25:17 triggeredByDev WARP2_CP
setstate nty_Vehiclestate_uplg 2022-08-15 20:25:17 triggeredByEvent vehicle_state: 2


Plus beim Wallboxdevice habe ich vehicle_state noch zu event-on-change-reading hinzugefügt.

Jetzt triggert das notify ABER der sofortladen knopf geht trotzdem nicht auf off   :o

Irgendwo ist da noch ein error drin!

Viele Grüße

Matze

chris_kmn

#47
Vielleicht ist es so einfacher ? Ich hab das glaube ich zu kompliziert gemacht.

defmod nty_Vehiclestate_uplg notify WARP2_CP:vehicle_state:0 set dSofortLaden off

Das mit dem event_on_change war sicher noch ein problem. Daran habe ich nicht gedacht.


Ich teste das morgen bei mir mal

smoudo

Ich teste morgen bei mir auch mal mit den 2 phasen. ich habe jetzt den multiplikator mal auf 23 gesetzt. Bei uns liegen eigentlich sauber 230V pro Phase an.
Allerdings verstehe ich die Formel noch nicht so richtig. Verbessere mich bitte wenn ich falsch liege.
$maxcurr = int((500 + $ChargePower)/($PwrFaktor*23))*100;      

Chargepower= Leistung in W = 1380W bei 6A
PwrFaktor= aktive Phasen =1

((500+1380)/(1*23))*100
(1880/23)*100
=8173

Ist das jetzt der current wert oder sind das die W?
Bei current währen das dann 8,17A bei 500W mehr.
korrekt?



chris_kmn

Ich glaube ich habe den Multiplikator damals anhand von Messungen berechnet, da es hier ja um eine zweiphasige Wechselstromleistung geht.

Zur Formel:

500= um 500 Watt die Ladeleistung erhöhen
500 + chargepower= die 500 Watt werden auf die anliegende (gemessene) Ladeleistung addiert

maxcurr = Ladestrom = Ladeleistung / Spannung = (500+chargepower) / (Anzahl Phasen * 230 V)
=> Der Wert hat Dimension Ampere, die Wallbox braucht aber Milliampere. Darum *1000

Und aus den oben stehenden 1000 und unten stehenden 230 habe ich 100 und 23 gemacht um mit dem Integer auf 100er Milliampereschritte zu runden, also 0,1 Ampere-Schritte.

Deine Berechnung sollte korrekt sein. Aber checke tatsächlich mal die Phasenströme beim Laden und die Leistungswerte am Zähler. Dann siehst du, ob die 23(0) passen.

smoudo

Ich hab das vorhin nochmal gecheckt. Bei uns liegen im Mittel bei 16A Ladestrom sogar 239,8V an.
Echt viel wie ich finde. Die Phasen liegen aber auch nur 0,3V auseinander. Morgen mal schauen wieviel das bei Sonne noch hoch geht.

smoudo

Heute morgen konnte ich das ganze gut testen.
Mit 2 Phasen aktiv geht die automatik nicht an. Mit 1 Phase startet der Ladevorgang.
Unter nurpv habe ich das gleiche Spiel An/Aus wie die ganze Zeit. Das ging soweit das ich nach einiger Zeit das Auto neu anstecken musste, weil es keine Ladung mehr zugelassen hat.

Unter Minpv läuft das ganze sauber. Startet bei 6A und war kurzzeitig mal auf 11A oben.
Das sieht gut aus!

Das notify stellt immer noch nicht zurück auf off. Hab jetzt mal das Tag umgestellt auf inject_tag
Leider ohne Erfolg.

Viele Grüße

Matze

chris_kmn

Ok, dann schaue ich mir das heute auch nochmal an.

Wenn es bei minPV klappt, dann kann es eigentlich nur an den Grenzwerten und der Berechnung der Leistung liegen.

Ich überlege, ob man nicht gleich alle Werte aus dem Zähler der WB holt, dann sollte die Berechnung auch passen. Oder ich lasse das mit dem Abgleich zur Leistung des Wechselrichters und regele einfach nur auf den Strom.

Schick mir bitte trotzdem mal deinen myutils code.

chris_kmn

Und nochmal eine blöde Frage. Speist dein Wechselrichter 3-phasig ein oder nur einphasig ?

smoudo

#-------------------------------------------------------------------------------
# Überschussladen PV zu Wallbox
#-------------------------------------------------------------------------------
# Ladestrom berechnen  kontinuierlich
sub myChargeCurrent() {
my $overpow = 0; # Leistungsüberschuss ("-" = Überschuss)
### PV-Wechselrichter + Battterie (RCT-Power):
my $BatteryPower = ReadingsNum("Primo","PowerFlow_Site_P_Akku",0); # Leistung Batterie ("-" = laden)
my $GridPower = ReadingsNum("Primo","PowerFlow_Site_P_Grid",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",2); # 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 = 1}; # 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 tagstart");
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 tagstart");
fhem("set WARP2_CP start_charging");
}
elsif ($WB_pmode eq "nurPV") { # nurPV Laden: Ladevorgang bei Überschuss starten
if ($overpow <= -(1500*$PwrFaktor)) { # Laden starten bei PV Überschuss  (1A ca. 230 Watt)
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP tagstart");
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 tagstart");
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 tagstart");
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 <= -400) { # bei Überschuss Strom anheben
$maxcurr = int((200 + $ChargePower)/($PwrFaktor*23.8))*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
elsif ($overpow > 0 ) { # Strom absenken bei Strommangel
$maxcurr = int(($ChargePower-$overpow-100)/($PwrFaktor*23.8))*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 tagstart");
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((250 + $ChargePower)/($PwrFaktor*23.8))*100; # Strom anheben
if ($maxcurr > 16000) {$maxcurr = 16000};
}
if ($GridPower > 100 ) { # Strom aus Netz ?
$maxcurr = int(($ChargePower-$overpow-250)/($PwrFaktor*23.8))*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 tagstart");
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 mit dem faktor 23.8 scheint wohl nicht ganz zu passen. da kommt weniger W raus. wenn ich den U R I rechne komme ich nur auf eine Spannung von 220 V
Ich habe das ganze heute auch schon mit faktor 22 gerechnet. Da passen wide W Werte besser. Das ergebnis mit An/aus ist das gleiche.
Bei minpv regelt er sauber bis ans Limit der Einspeisung ran. Meist relativ genau bis -300 und auch zurück. Sprich die Werte an sich können nicht so verkehrt sein. Irgendetwas triggert das teil auf off.
Mein Wechselrichter ist 1 Phasig. Sollte aber keine Relevanz haben das reading kommt sauber mit - bei Einspeisung an und Positiv bei Zukauf.

Das tagstart ist bei mir jetzt der inject_tag und nicht mehr der inject_tag_start

Viele Grüße

Matze

chris_kmn

Hi Matze,

erstmal das Notify. Da bei der Wallbox das vehicle_starte aus einem json extrahiert wird, ist dort noch ein Leerzeichen zu berücksichtigen. Also sieht der Trigger so aus:

defmod nty_Vehiclestate_uplg notify WARP2_CP:vehicle_state:.0 set dSofortLaden off

Der Punkt vor der 0 hatte gefehlt :( Habs bei mir gerade getestet und jetzt geht das ,,sofortladen" aus nach abstecken.




chris_kmn

#56
so und nun nochmal zu deinem Code:

Punkt 1:

Mach bitte mal aus der Zeile:

my $PwrFaktor = ReadingsNum("WARP2_CP","PwrFaktor",2); # Faktor Anzahl aktive Phasen

Folgende:
my $PwrFaktor = ReadingsNum("WARP2_CP","PwrFaktor",0); # Faktor Anzahl aktive Phasen

Punkt 2:

Die Funktion "tagstart" solltest du nur beim initialen Starten und finalen Stoppen des Ladevorgangs (also so als würdest du das mit dem NFC an der Wallbox starten oder abbrechen) benutzen. D.h. in der myutils nur in der Abfrage unter "vehicle_state ==1" nutzen. Nicht beim unterbrechen (also quasi pausieren) während eines Ladevorganges bei "vehicle_state==3".

Das könnte schon das Problem sein. Damit würde nämlich der vehicle state wieder in 1 gehen und dann startet die Prozedur von vorne. Ist jetzt nur eine Vermutung, aber nimm mal tagstart raus im zweiten Teil. Es reicht das stop_charging/start_charging.

Und zu deiner Änderung mit  inject_tag_start zu inject_tag:

Du weißt, dass du damit toggelst ? Sollte also jemand manuell mit dem NFC-Tag starten, dann würdest du mit  inject_tag wieder stoppen. Willst du das wirklich ? Damit ist dann der gesamte Ladevorgang gestoppt. Wenn FHEM ihn wieder startet wird damit in der Wallbox auch ein erneuter Vorgang angelegt. Ich sehe aktuell keinen Grund, warum FHEM den kompletten Ladevorgang stoppen sollte, außer man tut es bewußt. Dafür könnte man dann aber den Befehl  inject_tag_stop verwenden.
Ebenfalls könntest du, wenn Ladung per inject_tag gestoppt ist, keine Vorkonditionierung per Hausnetz starten. Ich lasse den Ladevorgang so lange aktiv, bis ich das Auto wieder abstöpsele.

smoudo

Danke für Dein Feedback!

Punkt 1 habe ich geändert, werde ich testen.
Punkt 2 hast du natürlich recht. Das war wohl der Versuch, viel hilft viel. - leider ohne Erfolg  ;)

Das mit dem Toggle könnte in der Tat komisch werden! Ist denn Fahrzeug abziehen gleich zu setzen mit inject_tag_stop ?
In dem Fall bräuchte man stop nicht.

Im Prinzip müsste man jetzt noch unterscheiden ob ein virtueller Tag eingesetzt wird bei sofortladen oder ob der Taster sofortladen auslöst in verbindung mit einem richtigen nfc. Dann sollten alle Vorgänge abgebildet sein oder?


chris_kmn

Fahrzeug abziehen kommt dem inject_tag_stop gleich. Was in der Wallbox damit gemacht wird, weiß ich nicht. Aber beim Abziehen wird der Ladevorgang genau so abgebrochen wie bei Stop durch inject_tag_stop. Ich denke auch man benötigt die Funktion nicht wirklich. Außer man möchte aus irgend einem Grund den ganzen Ladevorgang beenden. Z.B zu einer bestimmten Uhrzeit zu der es keinen Solarstrom mehr gibt und man zeitgesteuert auf Sofortladen schalten möchte. Dann könnte man das Profil zum Überschussladen beenden und auf das Profil Sofortladen wechseln. Also tag_inject_stop mit virtuellem Tag solar und tag_inject_start mit anderem virtuellen Tag Netzladen.

Deine letzte Frage verstehe ich nicht so ganz. Ich hatte verstanden, dass du beim PV Laden den virtuellen Tag nutzt, und beim Sofortladen kann man sowohl einen (anderen) virtuellen Tag nutzen als auch die ID eines realen Tags.

smoudo

#59
so ich bin der Sache mit den Abbrüchen nochmal nachgegangen. Es hängt am 10 sec interval der Wallbox. Anscheinend hat der script zu spät den charger_state 3 bekommen und ist in der 1er Schleife hängen geblieben?! Erst als ich den Code zu minPV umgeshrieben habe wurde es reproduzierbar. Verrückt!

Mit dem Tag teste ich noch was aus im wallbox device. Da hab ich eine Idee zu.

- Das notify zum sofortladen auf off bei Kabelzug funktioniert jetzt einwandfrei!

Edit: Nach mehreren Testdurchläufen wieder abbrüche. Ich habe jetzt die 2 Phasen Geschichte komplett rausgelöscht + den Faktor auf 21.5 runter genommen. Anscheinend war die box zu nah an der unteren Grenze. bis jetzt läuft es  ;D

smoudo

#60
Ich denke ich hab das teil jetzt ziemlich final.

Mein Wallbox device:
defmod WARP2_CP HTTPMOD http://192.168.1.60/evse/state 5
attr WARP2_CP alias Wallbox
attr WARP2_CP devStateIcon 1.3:message_socket_on2@green 1.2:message_socket_enabled@orange 1.1:message_socket_enabled@blue 1.0:message_socket_off@red\
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 eventMap tagstart:Ladefreigabe tagstop:STOP
attr WARP2_CP extractAllJSON 0
attr WARP2_CP get01Name autostart
attr WARP2_CP get01Poll 67
attr WARP2_CP get01PollDelay 30
attr WARP2_CP get01URL http://192.168.1.60/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.1.60/meter/values
attr WARP2_CP get05ExtractAllJSON 1
attr WARP2_CP get05Name phases
attr WARP2_CP get05Poll 69
attr WARP2_CP get05URL http://192.168.1.60/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.1.60/evse/button_state
attr WARP2_CP getHeader1 Content-Type: application/json
attr WARP2_CP group Wallbox
attr WARP2_CP httpVersion 1.1
attr WARP2_CP icon electric_car_icon
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 reading04Name vehicle_state
attr WARP2_CP reading04Regex vehicle_state":([\w]+)
attr WARP2_CP requestHeader Content-Type: application/json
attr WARP2_CP room Outdoor
attr WARP2_CP set01Data {"current":$val}
attr WARP2_CP set01Header Content-Type: application/json
attr WARP2_CP set01Header2 Accept: */*
attr WARP2_CP set01Method PUT
attr WARP2_CP set01Name current
attr WARP2_CP set01URL http://192.168.1.60/evse/external_current_update
attr WARP2_CP set02Data {"auto_start_charging":$val}
attr WARP2_CP set02Header Content-Type: application/json
attr WARP2_CP set02Header2 Accept: */*
attr WARP2_CP set02IMap false:0, true:1
attr WARP2_CP set02Map false:0, true:1
attr WARP2_CP set02Method PUT
attr WARP2_CP set02Name auto_start_charging
attr WARP2_CP set02URL http://192.168.1.60/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.1.60/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 set04NoData 0
attr WARP2_CP set04URL http://192.168.1.60/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.1.60/nfc/inject_tag_start
attr WARP2_CP set06Data {"tag_type":0,"tag_id":"D3:B1:4F:B7"}
attr WARP2_CP set06Header Content-Type: application/json
attr WARP2_CP set06Method PUT
attr WARP2_CP set06Name tagstop
attr WARP2_CP set06NoArg 1
attr WARP2_CP set06URL http://192.168.1.60/nfc/inject_tag_stop
attr WARP2_CP showBody 0
attr WARP2_CP sortby 3
attr WARP2_CP stateFormat {sprintf("1:%d\n2:%d\n Ladestrom: %.2f A\n | Leistung: %.3f kW\n | Zähler Total: %.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
attr WARP2_CP webCmd Ladefreigabe:STOP


Meine 99_myUtil:
#-------------------------------------------------------------------------------
# Überschussladen PV zu Wallbox
#-------------------------------------------------------------------------------
# Ladestrom berechnen  kontinuierlich
sub myChargeCurrent() {
my $overpow = 0; # Leistungsüberschuss ("-" = Überschuss)
### PV-Wechselrichter + Battterie (RCT-Power):
my $BatteryPower = ReadingsNum("Primo","PowerFlow_Site_P_Akku",0); # Leistung Batterie ("-" = laden)
my $GridPower = ReadingsNum("Primo","PowerFlow_Site_P_Grid",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",1); # 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 = 1}; # 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) { # Laden starten bei PV Überschuss  (1A ca. 430 Watt)
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
                        fhem("set WARP2_CP tagstart")
                        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 tagstart")
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 <= -400) { # bei Überschuss Strom anheben
$maxcurr = int((100 + $ChargePower)/21.5)*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
elsif ($overpow > 0 ) { # Strom absenken bei Strommangel
$maxcurr = int(($ChargePower-$overpow-100)/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)/21.5)*100; # Strom anheben
if ($maxcurr > 16000) {$maxcurr = 16000};
}
if ($GridPower > 100 ) { # Strom aus Netz ?
$maxcurr = int(($ChargePower-$overpow-400)/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


Die Phasenerkennung habe ich raus genommen und die Berechnung des Ladestroms wieder auf deinen Wert gesetzt.

Im Wallbox Device habe ich noch den tag_stop hinzugefügt und das ganze im webcmd gemappt.
Jetzt kann man praktisch mit der "Ladefreigabe" den Tag Start setzen und mit "STOP" die Freigabe entziehen. z.b. um einen bestehenden Ladevorgang abzubrechen. Die Steuerung läuft dann über minpv oder fixstrom. Bei nurpv und battpv bekommt es den virtuellen tag direkt zugeordnet.
Bei hardware nfc tag an der Box + Knopf drücken ist das ganze weiterhin funktionell + als tag separat erfasst.

Für mich ist es so top. Vielleicht findet noch jemand gefallen daran.

Vielen Dank nochmals an Chris für Deine Geduld!!

Viele Grüße

Matze

chris_kmn

#61
Prima, dann geht es ja endlich voran :) und danke auch dir für's Teilen, Matze. Die Ergänzung von tag stop ist prima :)

chris_kmn

Was mir gerade noch eingefallen ist, wo du über das Poll-Intervall sprichst.

Man muss natürlich sicherstellen, dass im Rahmen des Intervalls der Wallbox auch ein aktueller Wert vom WR kommt. Sonst läuft ggf. die Leistung der Wallbox dem Stromüberschuss-Wert des WR weg.

smoudo

Ja den WR habe ich auch auf 10sek. Gestellt. Allerdings werden die logfiles so riesig. Wird aber für den elektrocitycalculator benötigt.

chris_kmn

Du kannst ja mit dem Attribut:

event-min-interval battery_soc:1800,energy_day_grid_feed_in:1800,energy_day:1800,energy_day_grid_load:1800

Die Intervalle vom WR reading-spezifisch setzen, sodass nur die für das Überschussladen nötigen Readings im 10 sek. Takt kommen

chris_kmn

Auf Userwunsch stelle ich nochmals mein aktuelles Setup mit den Funktionen der letzten Posts hier zusammen.

Wallbox device:

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:tagstop 1.2:message_socket_enabled@orange 1.1:message_socket_unknown@blue:tagstart 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 eventMap tagstart:Laden-Start tagstop:Laden-Stop
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
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":"F4:E8:8E:4F"}
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 set06Data {"tag_type":0,"tag_id":"F4:E8:8E:4F"}
attr WARP2_CP set06Header Content-Type: application/json
attr WARP2_CP set06Method PUT
attr WARP2_CP set06Name tagstop
attr WARP2_CP set06NoArg 1
attr WARP2_CP set06URL http://192.168.1.82/nfc/inject_tag_stop
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


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 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


Funktion im myUtils:

##########################################################
# Ladestrom berechnen  kontinuierlich
sub myChargeCurrent() {
### PV-Wechselrichter + Battterie (RCT-Power):
my $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)
### 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)

$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 <= -(1500*$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 P-Batt < 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");
}
}
}
}



Funktion:

- Laden kann mit NFC Tag gestartet werden (muss in WB konfiguriert 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 eingestellten Strom (Slider) geladen.
- Der Taster muss in der WB auf "keine Funktion" konfiguriert werden. Sonst wird das Laden abgebrochen. Wichtig: Das muss nach jedem WB-Firmware-Update erneut gemacht werden, da der Taster standardmäßig auf Ladestop gesetzt ist.
- 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.
- Im Wallbox-Device müssen die IP-Adressen und die Tag-ID angepasst werden

Wechselrichter:

- power_battery: ist die Leistung des PV Speichers, (-)=laden (+)=entladen.  Der Ladestrom für das Auto wird so lange erhöht, bis der PV Speicher nicht weiter geladen wird. Wenn man keinen Speicher hat kann man den Wert statisch auf 0 setzen.
- power_grid_total: ist Einspeisung vom Wechselrichter in das Netz (-) bzw. die Entnahmeleistung aus dem Netz (+)

Diese Variablen müssen an den eigenen Wechselrichter angepasst werden. Die Daten sollten im 10 Sekunden Takt aktualisiert werden.

smoudo

Moin,

Aufgrund aktueller Probleme eines Users hätte ich zu dem Thema nochmal gerne Feedback und eine Idee um das Ganze robuster bei verschiedenen WR zu bekommen.

Problematik:
Anscheinend gibt es ähnlich zu dem Problem welches ich hatte, ständiges Ein-Aus der Wallbox im nurPV Betrieb. Da es sich um ein timing Problem handeln dürfte, habe ich mir überlegt vielleicht einen Mittelwert über 60sek. rechnen zu lassen. Das sollte die Problematik glätten. Nachteil ist, das dementsprechend auch öfter ein paar Watt aus dem Netz gezogen würden. Fände ich jetzt nicht ganz so schlimm. Wie seht ihr das?

Viele Grüße

Matze

chris_kmn

Könnte man machen mit dem von dir genannten Nebeneffekt.

Aber vielleicht sollten man in dem speziellen Fall erstmal rausfinden woher das an/aus kommt und dann das Problem bekämpfen und nicht die Auswirkung ?!

allgaier

Servus,
mit dem Vorschlag die Ursache finden, bin ich auf einverstanden.
Vorschlag, wir drei schreiben uns per PM zusammen und klären das untereinander und posten dann die Lösung hier im Forum.
Ausprobieren geht halt immer nur "Live" wenn die Sonne scheint, der Haus-Akku voll ist und ein Überschuss über 1,4kW, oder?

Gruß Markus

smoudo

Ich hatte die Tage auch wieder Probleme mit dem "nurPV" Überschussladen.
Ich denke ich habe den Fehler gefunden.

Fehlerbeschreibung:
Wenn die Wallbox bei genügend Überschuss das Laden mit 6A anfängt, sprich "$maxcurr 6000" werden nicht sofort die 6A am Ausgang zur Verfügung gestellt, sondern erst ein paar sekunden später. Was sich in den Readings mit falschen werten in der Funktion "$ChargePower" bemerbar machen kann. Hier sollten eigentlich rund 1450W stehen. Meist aber Anfangs eher kleinere Werte. Deshalb wird der Ladevorgang sofort wieder unterbrochen.

Lösungsansatz:
Ich lasse die Wallbox nur noch alle 20 sek. events schreiben.
Beisielkonfiguration im DEF:
http://ipadresse/evse/state 20
Damit funktioniert die Funktion bei mir jetzt einwandfrei.

Ein weiterer Ansatz währe bevor die Box ausschaltet, eine mindest Ladezeit zu generieren. Damit würde häufiges Ein/Aus geglättet werden. Vielleicht hat da jemand eine Idee in der Umsetzung.



Viele Grüße

Matze