Steuerung Wallbox Warp Smart mit HttpMod - Übergabe der Werte scheitert

Begonnen von rolifhem, 13 August 2021, 12:34:55

Vorheriges Thema - Nächstes Thema

rolifhem

Hallo,
ich möchte meine Wallbox so steuern, dass mit dem PV-Überschuss geladen wird.
Den verfügbaren Ladestrom lass ich mit dem OBIS-Modul von meinem Zähler auslesen. Das klappt gut.
Von der Warp Wallbox bekomme ich mit der HttpMod Anfrage auch die Status Readings geliefert.
Wenn ich den Ladestrom  einstellen möchte, geht das mit dem Beispiel aus der Hilfe mit dem Slider sehr gut. Aber ich schaffe es nicht, meinen Wert des UserReadings Ladestrom zu übergeben.
Meine RawDef:

defmod Warp1 HTTPMOD http://192.168.2.102:80/evse/state/ 30
attr Warp1 extractAllJSON 1
attr Warp1 httpVersion 1.1
attr Warp1 icon black_Steckdose.on
attr Warp1 reAuthJSON Status
attr Warp1 reading01Map 0:Nicht verbunden, 1:verbunden, 2:laedt, 4:Fehler
attr Warp1 reading01Name iec61851_state
attr Warp1 reading02Name vehicle_state
attr Warp1 reading03Name contactor_state
attr Warp1 reading04Name contactor_error
attr Warp1 reading05Name allowed_charging_current
attr Warp1 reading06Name error_state
attr Warp1 reading07Name lock_state
attr Warp1 reading08Name time_since_state_change
attr Warp1 room Energie
attr Warp1 set01Data {"current":{Readingsval("Warp1","Ladestrom",0)}}
attr Warp1 set01Header Content-Type: application/json
attr Warp1 set01Header2 Accept: */*
attr Warp1 set01Hint slider,6000,10,16000
attr Warp1 set01Max 16000
attr Warp1 set01Method PUT
attr Warp1 set01Min 6000
attr Warp1 set01Name current
attr Warp1 set01URL Http://192.168.2.102/evse/current_limit
attr Warp1 setHeader1 Content-Type: application/json
attr Warp1 timeout 10
attr Warp1 userReadings Ladestrom {int(ReadingsVal("Zaehler","Stromueberschuss",0)/5+ReadingsVal("Warp","allowed_charging_current",0))}
attr Warp1 verbose 0


Wenn ich statt
attr Warp1 set01Data {"current":{Readingsval("Warp1","Ladestrom",0)}}
den Wert aus $val nehme,
attr Warp1 set01Data {"current":$val}
funktioniert es.
Wie muss ich die Werteübergabe machen, damit HttpMod den Ladestrom übernimmt.

Gruß
Roland

betateilchen

ich kenne die Syntax von setXXData nicht, aber zwei geschweifte Klammerebenen ineinander finde ich seltsam.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rolifhem

Hallo, danke für den Tipp.
Ich hatte die 2 Ebenen von geschweiften Klammern gesetzt, weil das ein Json Konstrukt ist, der aus der Bezeichnung "Current" und dem Wert besteht.
Aber ich habe es auch ohne das zweite Klammerpaar erfolglos probiert.
Anbei das Log:

2021.08.13 20:34:30 5: Warp1: AddToQueue adds type set01 to URL Http://192.168.2.102/evse/current_limit, data {"current":Readingsval("Warp1","Ladestrom",0)}, header Content-Type: application/json
Accept: */*, retry 0, initial queue len: 0
2021.08.13 20:34:30 5: Warp1: HandleSendQueue called from AddToSendQueue, qlen = 1
2021.08.13 20:34:30 5: Warp1: HandleSendQueue - call with HTTP METHOD: PUT
2021.08.13 20:34:30 4: Warp1: HandleSendQueue sends set01 with timeout 10 to Http://192.168.2.102/evse/current_limit,
data: {"current":Readingsval("Warp1","Ladestrom",0)},
header: Content-Type: application/json
Accept: */*
2021.08.13 20:34:31 5: Warp1: ReadCallback called from __ANON__
2021.08.13 20:34:31 4: Warp1: Read callback: request type was set01 retry 0,
header: HTTP/1.1 400 Bad Request

Es wird leider nur der Text, aber nicht der Wert des Ladestrom übergeben.

Gruß
Roland

betateilchen

Zitat von: rolifhem am 13 August 2021, 20:47:25
weil das ein Json Konstrukt ist, der aus der Bezeichnung "Current" und dem Wert besteht.

ah, jetzt hab ich verstanden, was Du tun möchtest.

Vermutlich (wenn ich die commandref richtig verstehe) musst Du den Wert aus ReadingsVal() erstmal in die HTTPMOD-Variable $val übergeben, bevor das so funktioniert, wie Du Dir das vorstellst. Aber ich habe diese Möglichkeit des Ersetzens selbst noch nicht eingesetzt, deshalb kann ich Dir spontan keine Lösung vorschlagen.

Verschiebe den Thread mal nach "Sonstiges" - das ist das richtige Forum für Fragen zu HTTPMOD. Da wird Dir bestimmt schneller geholfen als in den Anfängerfragen. Zum Verschieben solltest Du unten auf der Seite dieses Threads einen Button finden "Thema verschieben"


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

StefanStrobel

Hallo Roland,

set01Data wird nicht als Perl-Expression ausgewertet, auch nicht wenn Du {} reinschreibst. Es wird aber $val textuell durch den bei set übergebenen Wert ersetzt.
Wenn Du also set Warp1 current 10 aufrufst, dann landet 10 an der Stelle von $val. Das solltest Du auch im Log bei HandleSendQueue sehen.
Wie rufst Du den set-Befehl denn auf?

Gruss
   Stefan

rolifhem

Hallo Stefan,
ich wollte das nicht mit einem set Befehl machen sondern kontinuierlich laufen lassen. Da sich der PV-Überschuss, den ich nutzen möchte, ja auch laufend ändert.
Mit dem get01Poll 1 - attribut sollte der Ladestrom dann im gleichen Intervall wie die Status-Abfrage aktualisiert werden.
Ich bräuchte nur eine Lösung für die Werteübergabe von Ladestrom nach $val.
Oder denke ich hier falsch??

Gruß
Roland

StefanStrobel

Hallo Roland,

Mit dem poll-Attribut steuerst Du welche Werte zyklisch abgefragt werden. Geschrieben wird dabei nichts.
Wenn Du aber einen Wert (z.B. ein Reading vom Zähler) per HTTPMOD an die Wallbox senden möchtest, dann brauchst Du dafür einen Set-Befehl. Den kannst Du z.B. per Notify oder DOIF automatisch auslösen lassen, sobald Dein OBIS-Modul einen neuen Wert hat.

Gruß
   Stefan

rolifhem

Hallo Stefan,
vielen Dank für die Unterstützung.
Ich lass jetzt mit einem at im 30 sekundenzyklus den Ladestrom aktualisieren.

defmod LadestromSetz at +*00:00:30 { fhem "set Warp current " . ReadingsVal('Warp','Ladestrom','value')}

Damit habe ich die wichtigsten Teile der Steuerung funktionsfähig.
Nun muss ich noch einige Bedingungen dazu bauen, damit ich auch ohne PV-Strom laden und die Wallbox abschalten kann.

Gruß
Roland

rolifhem

Hallo,
falls es jemand brauchen kann. Hier meine Steuerung des PV-überschusslanden mit der Tinkerforge Warp Smart Wallbox.

1. Stromeinstellung (ich werde nur eine Phase nutzen, da die Ladung erst ab 6A möglich ist und meine PV nur 5KW hat.)
defmod Warp HTTPMOD http://192.168.2.102/evse/state/ 30
attr Warp devStateIcon .*:ampel_gruen
attr Warp extractAllJSON 1
attr Warp httpVersion 1.1
attr Warp icon black_Steckdose.on
attr Warp room Energie
attr Warp set01Data {"current":$val}
attr Warp set01Header Content-Type: application/json
attr Warp set01Header2 Accept: */*
attr Warp set01Method PUT
attr Warp set01Name current
attr Warp set01URL http://192.168.2.102/evse/current_limit
attr Warp setHeader1 Content-Type: application/json
attr Warp stateFormat {sprintf ("%s",ReadingsVal($name,"iec61851_state ",0)==0?"Fahrzeug nicht verbunden":ReadingsVal($name,"iec61851_state ",0)==2?"laedt":ReadingsVal($name,"iec61851_state ",0)==4?"Fehler":ReadingsVal($name,"iec61851_state ",0)==1?"Verbunden":ReadingsVal($name,"current",0))}
attr Warp timeout 10
attr Warp userReadings Ladestrom {int(ReadingsVal("Zaehler","Stromueberschuss",0)+ReadingsVal("Warp","allowed_charging_current",0))}

2. Ein- und Ausschalten der automatischen Ladung, wenn Auto angesteckt ist.
defmod Warp1 HTTPMOD http://192.168.2.102:80/evse/auto_start_charging/ 30
attr Warp1 devStateIcon "Autostart Ein":ampel_gruen "Autostart Aus":ampel_rot
attr Warp1 extractAllJSON 1
attr Warp1 httpVersion 1.1
attr Warp1 icon black_Steckdose.on
attr Warp1 room Energie
attr Warp1 set01Data {"auto_start_charging":$val}
attr Warp1 set01Header Content-Type: application/json
attr Warp1 set01Header2 Accept: */*
attr Warp1 set01IMap false:0, true:1
attr Warp1 set01Method PUT
attr Warp1 set01Name auto_start_charging
attr Warp1 set01URL http://192.168.2.102/evse/auto_start_charging_update
attr Warp1 stateFormat {sprintf ("%s",ReadingsVal($name,"auto_start_charging",0)==0?"Autostart Aus":ReadingsVal($name,"auto_start_charging",0)==1?"Autostart Ein":ReadingsVal($name,"current",0))}
attr Warp1 timeout 15

3. DOIT, das Warp1 steuert (Den SchalterEilt nutze ich zur Ladung, wenn kein PV-Überschuss vorhanden ist und geladen werden muß)
defmod autocharging_Setz DOIF {if([SchalterEilt:"1"] or [Zaehler:Stromueberschuss] > 6000)  {fhem_set "Warp1 auto_start_charging 1"}} {if([Zaehler:Stromueberschuss] < 6000) {fhem "set Warp1 auto_start_charging 0" }}
attr autocharging_Setz room Energie

4. Das AT, das den Ladestrom über Warp regelmäßig aktualisiert.
defmod LadestromSetz at +*00:00:30 { fhem "set Warp current " . ReadingsVal('Warp','Ladestrom','value')}
attr LadestromSetz room Energie

Der Stromüberschuss wird mit einem IR-Lesekopf und dem OBIS-Modul ausgelesen und umgerechnet.
Gruß
Roland