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?
Weil du den gleichen $param fuer alle Aufrufe verwendest.
Hier speichert HttpUtils_NonblockingGet alle alle seine Variablen.
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!
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