HttpUtils_NonblockingGet POST data

Begonnen von reisner, 17 April 2024, 14:35:58

Vorheriges Thema - Nächstes Thema

reisner

Hallo,
um ein iKamand(Grilllüftersteuerung) anzusteuern benutze ich HttpUtils_NonblockingGet mit folgender Funktion:
sub start_cook()
{
my $tpt = Value("Pit_Solltemp");
my $tft = Value("Food_Solltemp");
my $ct = int(time());
my $cooktime = $ct + int(ReadingsVal("Cooktime","state",1)*60);
$uuid = genUUID;
my $param = {
                    url        => "http://192.168.0.153/cgi-bin/cook",
                    method     => "POST",
                    timeout    => 10,
                    callback   => \&CBF,
                    header     =>  "Content-Type': 'application/x-www-form-urlencoded",
                    data       => {
acs => 1,
csid => $uuid,
tpt => $tpt,
ct => $ct,
sce => $cooktime,
p => 1,
tft => $tft,
as => 0,
},
                };
while ( my ($key,$val) = each  %{$param->{data}} ){
#foreach my $key (keys %{$param->{data}}) {
Log 1, "$key => $val";
      }
HttpUtils_NonblockingGet($param);
}

Manchmal reagiert der iKamand, aber meistens nicht. Wenn ich mit Wireshark den HTTP POST von FHEM mit dem einer  funktionierenden HTML/Javascript Anwendung vergleiche, dann fällt auf, dass die data-Reihenfolge jedes mal wechselt. Die foreach Schleife in fer Funktion habe ich zu Überprüfung drin und die zeigt im Log auch immer wechselnde data-Reihenfolgen:
2024.04.17 14:15:19 1: csid => wdhvka8r-5s03-cdud-w0to-gxrlj2q568eh
2024.04.17 14:15:19 1: sce => 1713356419
2024.04.17 14:15:19 1: tft => 70
2024.04.17 14:15:19 1: p => 1
2024.04.17 14:15:19 1: as => 0
2024.04.17 14:15:19 1: tpt => 100
2024.04.17 14:15:19 1: acs => 1
2024.04.17 14:15:19 1: ct => 1713356119
2024.04.17 14:15:22 1: alles OK

2024.04.17 14:16:43 1: sce => 1713356503
2024.04.17 14:16:43 1: csid => m1msam86-fn20-i31q-6uoz-0lej7ksq3n78
2024.04.17 14:16:43 1: acs => 1
2024.04.17 14:16:43 1: ct => 1713356203
2024.04.17 14:16:43 1: tpt => 100
2024.04.17 14:16:43 1: p => 1
2024.04.17 14:16:43 1: tft => 70
2024.04.17 14:16:43 1: as => 0
2024.04.17 14:16:45 1: alles OK
Kann mir jemand sagen, wie ich die Reihenfolge in der Ausgabe so fixiere, wie sie in dem data-hash steht?

LG Ralph

betateilchen

Zitat von: reisner am 17 April 2024, 14:35:58Kann mir jemand sagen, wie ich die Reihenfolge in der Ausgabe so fixiere, wie sie in dem data-hash steht?

Das ist in perl bei einem hash nicht vorgesehen.

Zitathttps://perldoc.perl.org/functions/keys

Hash entries are returned in an apparently random order. The actual random order is specific to a given hash; the exact same series of operations on two hashes may result in a different order for each hash. Any insertion into the hash may change the order, as will any deletion, with the exception that the most recent key returned by each or keys may be deleted without changing the order.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

reisner

Hallo Betateilchen,
danke für die schnelle Antwort, auch wenn sie mir nicht gefällt ;)
Ist in HttpUtils_NonblockingGet für data zwingend ein hash vorgesehen, oder gibt es eine andere Übergabemöglichkeit, die zu meinem gewünschten Ergebnis führt? Bei Http::request werde ich ja bestimmt auf das selbe Problem stoßen, oder?

Danke!

reisner

Hi,
ich habe nun die Funktion auf HTTP::Request umgestellt und damit funktioniertes ;D
sub start_cook()
{
my $tpt = Value("Pit_Solltemp");
my $tft = Value("Food_Solltemp");
my $ct = int(time());
my $cooktime = $ct + int(ReadingsVal("Cooktime","state",1)*60);
$uuid = genUUID;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

my $server_endpoint = "http://192.168.0.153/cgi-bin/cook";

# set custom HTTP request header fields
my $req = HTTP::Request->new(POST => $server_endpoint);
$req->header('content-type' => 'application/x-www-form-urlencoded');

# add POST data to HTTP request body
my $post_data = 'acs=1&csid='.$uuid.'&tpt='.$tpt.'&sce='.$cooktime.'&p=1&tft='.$tft.'&as=0'.'&ct='.$ct;
$req->content($post_data);

my $resp = $ua->request($req);
if ($resp->is_success) {
my $message = $resp->decoded_content;
Log 1, "Received reply: $message";
}
else {
Log 1, "HTTP POST error code: ".$resp->code;
Log 1, "HTTP POST error message: ".$resp->message;
}

}

Danke!

betateilchen

Das hättest Du vermutlich auch mit HttpUtils.pm umsetzen können, es gibt dort ja noch ein paar andere Funktionen zum Aufrufen von urls  :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

reisner

Ja, wäre mir ja auch lieber, da der Weg über HTTP::Request im Moment zwar funktioniert, aber nicht non-blocking.
Leider sehe ich im Wust der HttpUtils nicht den Weg, um ohne ein hash, aber non-blocking zum Ergebnis zu kommen >:(

LG

reisner

Kaum macht man es richtig, dann klappt es auch mit der HttpUtils;D
sub start_cook()
{
my $tpt = Value("Pit_Solltemp");
my $tft = Value("Food_Solltemp");
my $ct = int(time());
my $cooktime = $ct + int(ReadingsVal("Cooktime","state",1)*60);
$uuid = genUUID;
my $post_data = {'acs=1&csid='.$uuid.'&tpt='.$tpt.'&sce='.$cooktime.'&p=1&tft='.$tft.'&as=0&ct='.$ct};
my $param = {
                    url        => "http://192.168.0.153/cgi-bin/cook",
                    method     => "POST",
                    timeout    => 10,
                    callback   => \&CBF,
                    header     =>  "Content-Type': 'application/x-www-form-urlencoded",
                    data       => $post_data,
                };
      }
HttpUtils_NonblockingGet($param);
}

LG

betateilchen

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