FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: tgv_boost am 29 Mai 2020, 21:16:15

Titel: (Gelöst) SUB in HttpUtils_NonblockingGet
Beitrag von: tgv_boost am 29 Mai 2020, 21:16:15
Hallo Forum,
gebt mir mal bitte einen kleinen Schubs ...
Folgende einfache Funktion versuche ich als callback eines HttpUtils_NonblockingGet zu verwenden.

#99_myUtils.pm

sub
CBF($$$)
{
my ($hash, $err, $data) = @_;
if($err eq "")
            {
Log 1, "AZ Tauf OK";
            } elsif($data ne "")   
          {
  Log 1, "AZ Tauf Error";
  Log 1, $err;
          }
}


Hier das notify dazu
define AZ_T2 notify JalousieAZ_T:.* {\
if (ReadingsVal("JalousieAZ_T","state","off") eq "off") {\
{HttpUtils_NonblockingGet({url=>"http://192.168.0.138:80/Tauf", callback=>\&CBF($$$)})};;\
}\
}


und hier der Logauszug mit der Fehlermeldung can't use string as a SCALAR ref while "strict refs" in use

2020.05.29 20:55:54 1: ERROR evaluating my $SELF='AZ_T2';my $EVTPART0='Auf';my $EVENT='Auf';my $TYPE='dummy';my $NAME='JalousieAZ_T';{
if (ReadingsVal("JalousieAZ_T","state","off") eq "off") {
{HttpUtils_NonblockingGet({url=>"http://192.168.0.138:80/Tauf", callback=>\&CBF($$$)})};
}
}: can't use string as a SCALAR ref while "strict refs" in use at (eval 63827) line 4.


das hier tut seinen Dienst

{HttpUtils_NonblockingGet( { url=>"http://192.168.0.138:80/Tauf", callback=>sub($$$) { my ($hash, $err, $data) = @_;; Log 1, "$data" } }) };;\

allerdings erschließt sich mir hier nicht wie ich $hash, $err, $data für weitere Aktionen nutzen kann und habs deshalb über eine Subroutine versucht.

Mit bestem Dank für Eure Tips im Voraus
Walter

(Gelöst) allerdings am SUB Thema mit 99_myUtils.pm vorbei

define AZF_01 notify JalousieAZ_F:.* {\
if (ReadingsVal("JalousieAZ_F","state","on") eq "on") {\
{ HttpUtils_NonblockingGet( { url=>"http://192.168.0.138:80/?=/Fab", incrementalTimout=>"1", callback=>sub($$$) { my ($hash, $err, $data) = @_;; {if ("$err" eq "") {Log 1, "Fab: ".("$data")}};; {if ("$err" ne "") {Log 1, "Err Fab: ".("$err") ;; {fhem("sleep 60 ;; set JalousieAZ_F on")}} }}} )};;\
}\
}


Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: amenomade am 14 Juni 2020, 23:00:24
mach die"($$$)" weg
- im notify
- in der sub
Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: tgv_boost am 15 Juni 2020, 00:24:39
besten Dank für den Schubs :) gerade im Moment ist es mir auch wie Schuppen von den Augen gefallen. Nächste Herausforderung, Timer (+at) in der 99_myUtils.pm mit ...
sub
CBF_ROT_Fab($$$)
{
my ($hash, $err, $data) = @_;
if($data eq "")   
          {
  Log 1, "Fab: ".("$data")
  }
if($err ne "")   
          {
  { HttpUtils_NonblockingGet( { url=>"http://192.168.0.172:80/?=/Fab", incrementalTimout=>"1", callback=>sub($$$) { my ($hash, $err, $data) = @_;; {if ("$err" ne "") {Log 1, "ERR Fab: ".("$err")} } }} )}
                  }
 
}

Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: amenomade am 15 Juni 2020, 00:28:24
Verstehe die Frage nicht...
Aber vielleicht war es doch keine Frage?
Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: tgv_boost am 15 Juni 2020, 00:30:52
verstehs einfach als Danke, und wenn Du eine Idee hast wie ich eine Verzögerung des Nonblocking umsetzen kann, erspare ich mir vielleicht Syntaxgebastel
Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: amenomade am 15 Juni 2020, 00:47:07
Ich weiss nicht, was Du genau machen willst, aber das gesamte Konstrukt wird langsam wackelig. Wenn Du NonBlockingGet in einem at packst (ich weiss überhaupt nicht, ob das geht...), dann wird die callback Funktion mit dem Hash des at zurückkommen. Und zwar schon in einer Callback Funktion vom NonBlockingGet im notify?  Wie Du das danach benutzen wirst......?..

Kann man das nicht irgendwie glätten?
Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: CoolTux am 15 Juni 2020, 08:04:31
Laut
https://wiki.fhem.de/wiki/HttpUtils#HttpUtils_NonblockingGet

Muss es lauten
MyCallbackFn ( $param, $err, $data )

Also nicht $hash

Du musst also Deinen $param etwas besser zusammen setzen.


my $param = {
                url      => "http://192.168.0.172:80/?=/Fab",
                timeout  => 30,
                hash     => $hash,
                method   => 'GET',
                callback => \&CBF,
            };

HttpUtils_NonblockingGet($param);


Und dann halt Deine CallbackFunktion


sub
CBF {
my ($hash, $err, $data) = @_;
        my $hash      = $param->{hash};
if($err eq "")
            {
Log 1, "AZ Tauf OK";
            } elsif($data ne "")   
          {
  Log 1, "AZ Tauf Error";
  Log 1, $err;
          }
}
Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: tgv_boost am 15 Juni 2020, 11:50:06
Zitat von: amenomade am 15 Juni 2020, 00:47:07
Ich weiss nicht, was Du genau machen willst, aber das gesamte Konstrukt wird langsam wackelig. Wenn Du NonBlockingGet in einem at packst (ich weiss überhaupt nicht, ob das geht...), dann wird die callback Funktion mit dem Hash des at zurückkommen. Und zwar schon in einer Callback Funktion vom NonBlockingGet im notify?  Wie Du das danach benutzen wirst......?..

Kann man das nicht irgendwie glätten?

was ich machen will klingt eigentlich einfach, eigentlich ...

hiermit ohne SUB in 99_myUtils.pm ...
{ HttpUtils_NonblockingGet( { url=>"http://192.168.0.172:80/?=/Fab", incrementalTimout=>"1", callback=>sub($$$) { my ($hash, $err, $data) = @_;; {if ("$err" eq "") {Log 1, "Fab: ".("$data")} };; {if ("$err" ne "") {Log 1, "Fab: ".("$err")} } }} )};;\
Fab})};;\

steuere ich einen ESP8266, alles gut, bis auf die gelegentlichen WiFi Aussetzer, die ich mittels einer Fehlerroutine auffangen möchte.

Die Idee also, ist diese Alternative:
if (ReadingsVal("JalousieROT","state","on") eq "on") {HttpUtils_NonblockingGet({url=>"http://192.168.0.172:80/Fab", incrementalTimout=>"1", callback=>\&CBF_ROT_Fab})};;\
wobei ich dann in der Subroutine im Fehlerfall (if($err ne "")) das Kommando "http://192.168.0.138:80/?=/Fab" nach einer gewissen Zeit nochmal schicken möchte.


@CoolTux: wo/wie in dem Kontext oben definiere ich das?
my $param = {
                url      => "http://192.168.0.172:80/?=/Fab",
                timeout  => 30,
                hash     => $hash,
                method   => 'GET',
                callback => \&CBF,
            }


Jede Hilfe und Idee ist herzlich willkommen

Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: CoolTux am 15 Juni 2020, 13:00:12
Das definierst Du in der Funktion in der Du das HttpUtils_NonblockingGet aufrufen willst. Schließlich musst Du das $param ja der Funktion übergeben. Es ist das selbe als wenn Du
HttpUtils_NonblockingGet({url=>"http://192.168.0.172:80/Fab", incrementalTimout=>"1", callback=>\&CBF_ROT_Fab})
auf rufst nur das Du den Hash
{url=>"http://192.168.0.172:80/Fab", incrementalTimout=>"1", callback=>\&CBF_ROT_Fab}
vorher füllst als $param
Titel: Antw:SUB in HttpUtils_NonblockingGet
Beitrag von: tgv_boost am 15 Juni 2020, 15:40:08
Danke für die Tipps ... ich versuchs jetzt mal mit einer sehr klammerhaltigen Lösung

define AZF_01 notify JalousieAZ_F:.* {\
if (ReadingsVal("JalousieAZ_F","state","on") eq "on") {\
{ HttpUtils_NonblockingGet( { url=>"http://192.168.0.138:80/?=/Fab", incrementalTimout=>"1", callback=>sub($$$) { my ($hash, $err, $data) = @_;; {if ("$err" eq "") {Log 1, "Fab: ".("$data")}};; {if ("$err" ne "") {Log 1, "Err Fab: ".("$err") ;; {fhem("sleep 30 ;; set JalousieAZ_F on")}} }}} )};;\
}\
}


Im Fehlerfall ruft Nonblocking den ursprünglichen Trigger für das Notify mit einer Verzögerung (FHEM sleep mit nachfolgenden Befehl sollte OK sein) nochmal auf, und das Spiel geht solange, bis das Ergebnis OK ist. Da wäre sicher noch über ein Maximum an Versuchen nachzudenken. Aber jetzt geb ich erstmal dieser Lösung eine Chance, ausser ihr seht grobe Fehler
Danke nochmal