HttpUtils / Nonblocking_Get: Callback wird nicht wie erwartet ausgeführt

Begonnen von Phiolin, 04 Juli 2017, 08:52:58

Vorheriges Thema - Nächstes Thema

Phiolin

Habe gerade in meiner 99_myUtils.pm eine Funktion definiert, die mir meine Hue-Bewegungsmelder zurücksetzt. Verwende ich z.B., wenn ich über FHEM die Szenen der Bewegungsmelder ändere, damit bei der nächsten Bewegung sofort die neue Szene geschaltet wird.
Das funktioniert auch alles - sofern ich HttpUtils_BlockingGet verwende.
Da ich aber mal versuchen wollte, ob das auch Nonblocking funktioniert, habe ich das mal schnell umgebaut.

Dabei ist mir aufgefallen, dass ich zwar 3 mal HttpUtils_NonblockingGet aufrufe, der Callback aber nur 1 mal ausgeführt wird, nämlich nur für den letzten Aufruf.
Soll das so sein? Ich hätte erwartet, dass der Callback jeweils für jeden HttpUtils_NonblockingGet Call ausgeführt wird.

Hier der Code:

sub resetMotionSensors ()
{
        my @sensors = ( 55, 59, 63 );
my $err = "";
my $data = "";
        my $param = {
data    => "{ \"status\": 0 }",
                                        method     => "PUT",
noshutdown => 0,
callback   => \&myHttpCallbackFn,
name       => "resetMotionSensors"
};
                   
   
foreach my $sensorId (@sensors) {
    $param->{url} = "http://huebridge.fritz.box/api/myApiKey/sensors/$sensorId/state";
    Log3 "resetMotionSensors", 1, "resetting sensor $sensorId";
    HttpUtils_NonblockingGet($param);
}
}

sub myHttpCallbackFn ($)
{
my ($param, $err, $data) = @_;
        my $name = $param->{name};

if($name eq "resetMotionSensors") {
if($err ne "")
            {
            Log3 $name, 1, "error while requesting ".$param->{url}." - $err";
            } elsif($data ne "")   
{
Log3 $name, 1, "url ".$param->{url}." returned: $data";
}
}
}


Und hier die Log-Ausgaben:
2017.07.04 08:45:15 1: resetting sensor 55
2017.07.04 08:45:15 1: resetting sensor 59
2017.07.04 08:45:15 1: resetting sensor 63
2017.07.04 08:45:15 1: url http://huebridge.fritz.box/api/myApiKey/sensors/63/state returned: [{"success":{"/sensors/63/state/status":0}}]


Warum erhalte ich keine Callback-Ausgabe für Sensor 55 und 59?

rudolfkoenig

Weil du den gleichen $param fuer alle Aufrufe verwendest.
Hier speichert HttpUtils_NonblockingGet alle alle seine Variablen.

Phiolin

Stimmt, das ging für mich aus der Dokumentation nicht so klar hervor.
Habe den my $param Block in die foreach-Schleife geschoben und jetzt werden alle 3 Ausgaben wie erwartet erzeugt. :)

Danke!

Markus Bloch

Bitte beachte, dass $param eine Referenz auf eine Datenstruktur ist. Daher auch der Zugrif mit dem Pfeiloperator -> Es ist also nur ein Zeiger auf einen Speicherbereich mit dem du arbeitest, nicht mit einem eigenständigen Objekt.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)