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