FHEM > Sonstiges

Steuerung einer Tinkerforge WARP Wallbox

(1/1)

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:


--- Code: ---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
--- Ende Code ---

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:


--- Code: ---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
--- Ende Code ---

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

Timer:

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


Funktion in 99_myUtils.pm:


--- Code: ---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;
}
--- Ende Code ---

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

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:


--- Code: ---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)
)
}


--- Ende Code ---

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

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

Navigation

[0] Themen-Index

Zur normalen Ansicht wechseln