FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: popy am 23 Februar 2018, 19:45:02

Titel: [gelöst] FHEM per HTTP Request vom Browser aus ASYNCRON steuern
Beitrag von: popy am 23 Februar 2018, 19:45:02
Hallo.

Hab HABridge am laufen und emuliere damit ca. 50 HUE Geräte für Alexa.
In jedem HA bridge device ist eine URL hinterlegt.

Ich habe jetzt Lightscenes die mehrere Geräte per nanoCUL schalten.
Da entsteht dann eine Verzögerung beim URL request.
Dies wieder führt dazu dass Alexa, bei zu langen requests (ich glaube 3 Sekunden) eine Meldung sagt "Das Gerät reagiert nicht....blabla"
Aber das Gerät schaltet ganz normal.

Eine URL ist z.B.:

http://127.0.0.1:8088/fhem?cmd=set%20WZ_KUCHE_Szenen%20scene%20Nachtlicht

Rufe ich diese im Browser auf kommt immer die ganze Seite von FHEM dann.
Habe jetzt mal "&XHR=1" angehängt, da kommt dann wenigstens nicht die ganze Seite, sondern eine leere weiße Seite.
Aber der Output kommt erst wenn die Szene "geschaltet" wurde.

Gibt es eine Möglichkeit einen Request asyncron abzusetzen?
Sprich, FHEM gibt sofort "ok" zurück und schaltet dann erst?

Danke
pOpY



&XHR=1



Titel: Antw:FHEM per HTTP Request vom Browser aus ASYNCRON steuern
Beitrag von: MadMax-FHEM am 23 Februar 2018, 20:17:25
Dummy setzen (geht sofort) und dann auf ein Notify des Dummy dann die länger laufenden Szenen etc. schalten...

Sonst fällt mir zu "asynchron" (wie du es brauchst/willst) nichts ein...

Kurz, da nur Handy...

Gruß, Joachim
Titel: Antw:FHEM per HTTP Request vom Browser aus ASYNCRON steuern
Beitrag von: popy am 23 Februar 2018, 21:03:45
Danke für den Hinweis mit dem dummy und dem notify.
Habe mir den Dummy "AsyncCMD" und folgendes Notify angelegt:

AsyncCMD:.* {
  Log 1, "AsyncCMD START: ".$EVENT;
  fhem($EVENT);
  Log 1, "AsyncCMD END: ".$EVENT;
}


Mittels curl teste ich es gerade vom RPI aus mit:

curl -basic "http://127.0.0.1:8088/fhem?cmd=set%20AsyncCMD%20set%20WZ_KUCHE_Szenen%20scene%20Nachtlicht"

Die Log ausgaben schauen auch gut aus:

2018.02.23 20:54:16 1: AsyncCMD START: set WZ_KUCHE_Szenen scene Nachtlicht
2018.02.23 20:54:20 1: AsyncCMD END: set WZ_KUCHE_Szenen scene Nachtlicht


Der Befehl wird auch ausgeführt und ich wäre transparent.
Leider blockiert aber fhem die Antwort auf den request wieder (siehe Log) & auch das curl kehrt erst nach 4 Sekunden zurück.

Hast du ev. noch eine Idee?
Ev. mit einem at + 1s?

Danke
pOpY
Titel: Antw:FHEM per HTTP Request vom Browser aus ASYNCRON steuern
Beitrag von: MadMax-FHEM am 23 Februar 2018, 21:17:11
Mit dem http nur den Dummy schalten...

Und im Notify dann die weiteren set Kommandos...

Also im Notify statt fhem("$EVENT") halt fhem("set WZ_KUCHE_Szenen scene Nachtlicht")

Und im web Kommando einfach set%20AsyncCMD%20on

Wobei bei deinem Notify egal ist was du setzt...

Immer noch Handy...

EDIT: wenn das auch nicht geht, dann wird es keine einfache Sache (zumindest hab ich keine andere einfache Idee mehr)...

Gruß, Joachim
Titel: Antw:FHEM per HTTP Request vom Browser aus ASYNCRON steuern
Beitrag von: popy am 23 Februar 2018, 23:30:00
Geht leider auch nicht.
Fhem blockiert, schaut nach single threaded aus.
Habe aber jetzt einen Workaround gefunden, der wie folgt aussieht.
Diesen habe ich global gestalltet, sodaß ich nur einen Dummy+Notify+Funktion brauche um JEDES fhem cmd asyncron ausführen zu können.

Dummy:

defmod AsyncCMD dummy
attr AsyncCMD alias AsyncCMD Dummy
attr AsyncCMD group HABridge/Alexa Helper
attr AsyncCMD icon control_return
attr AsyncCMD room System


Notify, welches die 99_myUtils.pm Funktion fhem_async() mit $EVENT (= fhem Befehl) als Parameter aufruft:
defmod act_AsyncCMD notify AsyncCMD:.* { \
  fhem_async($EVENT);;\
}
attr act_AsyncCMD alias Starte Asyncroner Web Request
attr act_AsyncCMD group HABridge/Alexa Helper
attr act_AsyncCMD icon edit_settings
attr act_AsyncCMD room System


Die Funktion in der 99_myUtils.pm baut ein curl commando zusammen welches mit "&" im Hintegrund aufgerufen wird und SOFORT wieder zurückkehrt.
Hier die Funktion:

#################################################
# Async FHEM cmd
#################################################
sub fhem_async($)
{
    my $Cmd = shift;

    $Cmd = "" unless(defined($Cmd));

    # Log
    Log 1, "fhem_async: ".$Cmd;

    # encode url
    $Cmd=~ s/([^A-Za-z0-9])/sprintf("%%%2.2X", ord($1))/ge;

    # Generate the curl cmd with & to run in the background and dont block fhem
    $Cmd = 'curl -basic --silent "http://127.0.0.1:8088/fhem?cmd='.$Cmd.'&XHR=1" &';

    # Log 1, "fhem_async: curl cmd: ".$Cmd;

    # run the cmd in background, ignore result!
    system($Cmd);
}


Dadurch ist es jetzt möglich in HA bridge (oder mit curl von einem anderen Linux Rechner usw.) ein beliebiges fhem cmd ASYNCRON auszuführen.
Dadurch Antwortet Alexa bei mir jetzt immer mit einem knackigen/schnellem "ok" und der Befehl wird dann anschließend sofort ausgeführt.

Beispiel Aufrufe HA Bridge:


http://127.0.0.1:8088/fhem?cmd=set%20AsyncCMD%20set%20WZ_KUCHE_Szenen%20scene%20Nachtlicht&XHR=1
http://127.0.0.1:8088/fhem?cmd=set%20AsyncCMD%20set%20WZ_KUCHE_Szenen%20scene%20Aus&XHR=1


Dazugekommen ist "set%20AsyncCMD%20".

Die Befehlskette schaut so aus:

Hoffe das kann mal jemand benötigen.

pOpY
Titel: Antw:[gelöst] FHEM per HTTP Request vom Browser aus ASYNCRON steuern
Beitrag von: MadMax-FHEM am 23 Februar 2018, 23:40:36
Komisch.
Weil ich mit dem Dummy und Notify bei mir keine Wartezeit habe...

Aber wenn es funktioniert...

Viel Erfolg und Spaß weiterhin, Joachim
Titel: Antw:[gelöst] FHEM per HTTP Request vom Browser aus ASYNCRON steuern
Beitrag von: popy am 24 Februar 2018, 10:44:43
Hmmm, bei mir leider nicht.
Mit dem Workaround funkt es bei mir ☺

Gesendet von meinem LG-H815 mit Tapatalk