[gelöst] Übertragen von JSON Daten per HTTP an externes Gerät (CFOS Wallbox)

Begonnen von andi11, 28 Mai 2022, 18:26:20

Vorheriges Thema - Nächstes Thema

andi11

Hallo zusammen,
ich habe seit neuestem eine cFos Wallbox. Diese verfügt über eine HTTP API Schnittstelle.
Über diese würde ich gerne einen Zähler anlegen, so dass FHEM der Wallbox sagen kann, was gerade an PV Überschuss da ist.
Doku ist hier unter "HTTP Zähler und Wallboxen" https://www.cfos-emobility.de/de/cfos-power-brain/http-api.htm
Beispielaufruf curl -i -X POST -H 'Content-Type: application/json' -d '{ "model": "TestModell", "import_wh": 12345, "export_wh": 23456, "voltage": [231, 232, 233], "current": [10001, 10002, 10003], "power_va": 2000 }' --user admin:1234abcd 'http://192.168.2.111/cnf?cmd=set_ajax_meter&dev_id=M3'

Mein Ansatz wäre jetzt "pfuschen" dass es läuft. Also in die myutils eine Funktion, die mir den String zusammensetzt. Aber wie könnte ich das elegant lösen? Die Kommunikation FHEM<>cFOS Wallbox ist sicherlich nicht nur für mich interessant.
HTTPMOD ist zum auslesen mächtig, aber für die POST Richtung finde ich hier nicht so recht was.

rudolfkoenig

Mit HttpUtils_NonblockingGet wuerde ich das so machen:

HttpUtils_NonblockingGet({
  url=>'http://admin:1234abcd@192.168.2.111/cnf?cmd=set_ajax_meter&dev_id=M3',
  header=>{ "Content-Type"=>"application/json" },
  data=>toJSON({
    "model"=>"TestModell",
    "import_wh"=>12345,
    "export_wh"=>23456,
    "voltage"=>[231, 232, 233],
    "current"=>[10001, 10002, 10003],
    "power_va"=>2000}),
  callback=>sub($$$){ Log 1,"ERR:$_[1] Response:".length($_[2]) }});

andi11

vielen Dank für deine Antwort.
Ich hab mir damit jetzt ein Notify gebaut. Allerdings aktualisiert es nicht ganz wie gewollt.

defmod NOTIFY_CFOS_EHZ notify Stromverbrauch_Zaehler1_EHZ:aktuellerverbrauch-get:.* {\
my $powerva=ReadingsNum("Stromverbrauch_Zaehler1_EHZ","aktuellerverbrauchin-get",0);;\
Log(3,"powerva".$powerva."a");;\
#$powerva=20;;\
\
HttpUtils_NonblockingGet({\
  url=>'http://hierstehtdaskennwort@192.168.10.78/cnf?cmd=set_ajax_meter&dev_id=M4',\
  header=>{ "Content-Type"=>"application/json" },\
  data=>toJSON({\
    "model"=>"TestModell",\
    "import_wh"=>12345,\
    "export_wh"=>23456,\
    "voltage"=>[231, 232, 233],\
    "current"=>[10001, 10002, 10003],\
    "power_va"=>$powerva}),\
  callback=>sub($$$){ \
  fhem("setreading NOTIFY_CFOS_EHZ HTTPStatus ".$_[2]);;\
  Log 1,"ERR:$_[1] Response:".$_[2]." ".length($_[2]) }});;\
\
}
attr NOTIFY_CFOS_EHZ DbLogExclude .*
attr NOTIFY_CFOS_EHZ room Versuche

setstate NOTIFY_CFOS_EHZ active
setstate NOTIFY_CFOS_EHZ 2022-05-28 19:46:33 HTTPStatus "OK"
setstate NOTIFY_CFOS_EHZ 2022-05-28 19:45:38 state active
setstate NOTIFY_CFOS_EHZ 2022-05-28 19:46:33 triggeredByDev Stromverbrauch_Zaehler1_EHZ
setstate NOTIFY_CFOS_EHZ 2022-05-28 19:46:33 triggeredByEvent aktuellerverbrauch-get: 0.009


$powerva=20 => Aktualisierung läuft
$powerva=20 auskommentiert, der echte Wert kommt nicht an, und das obwohl im Logfile sowas auftaucht
2022.05.28 19:44:30 3: powerva-1a
Setze ich dagegen $powerva auf fest auf -1, dann wird der Wert übertragen und kommt an.
Als Status erhalte ich in allen Fällen "ok".

rudolfkoenig

Ich empfehle den Aufruf in eine Funktion in 99_myUtils.pm auszulagern.
Da wuerde ich data vorher berechnen und per Log ausgeben, und damit pruefen, was uebertragen wird.

andi11

ein auslagern der Defintion in
sub updateWallboxEHZ () {
my $powerva=ReadingsNum("Stromverbrauch_Zaehler1_EHZ","aktuellerverbrauchin-get",0);
my $import=ReadingsNum("Stromverbrauch_Zaehler1_EHZ","totalin-get",0);
my $export=ReadingsNum("Stromverbrauch_Zaehler1_EHZ","ueberschuss-totalin-get",0);
Log(3,"lof".$import. " ".$export. " ".$powerva."a");
#$powerva=125;
$import=222;
my $data={
    "model"=>"TestModell",
    "import_wh"=>$import,
    "export_wh"=>$export,
    "voltage"=>[231, 232, 233],
    "current"=>[10001, 10002, 10003],
    "power_va"=> $powerva,
"is_va"=>"false"
};
Log(3,toJSON($data));

HttpUtils_NonblockingGet({
  url=>'http://admin:password@192.168.10.78/cnf?cmd=set_ajax_meter&dev_id=M4',
  header=>{ "Content-Type"=>"application/json" },
  data=>toJSON($data),

  callback=>sub($$$){
  fhem("setreading NOTIFY_CFOS_EHZ HTTPStatus ".$_[2]);
  Log 1,"ERR:$_[1] Response:".$_[2]." ".length($_[2]) }});
  return 0;
}

liefert
{"current":[10001,10002,10003],"export_wh":"20623295","import_wh":222,"is_va":"false","model":"TestModell","power_va":"-7","voltage":[231,232,233]}

Wenn ich #$powerva=.... nicht mehr auskommentiere, sondern einen Werz zuweise klappt es, mit dem Wert aus dem Reading nicht. Selbst wenn ich den Text aus dem Log nehme und $powerva zuweise klappt es

andi11

ich habe eine kleine Spur, laut Log wird erzeugt:
"power_va":"-16"
verschicken muss ich aber "power_va":-16 probiert mit CURL, nur letzteres geht.

Beim fest zugewiesen Wert kommt -16 ohne Anführungszeichen raus

rudolfkoenig