[gelöst] FHEM per HTTP Request vom Browser aus ASYNCRON steuern

Begonnen von popy, 23 Februar 2018, 19:45:02

Vorheriges Thema - Nächstes Thema

popy

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




MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

popy

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

MadMax-FHEM

#3
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

popy

#4
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:

  • Gewünschter Befehl wird als state des dummys AsyncCMD per Webrequest gesetzt
  • notify act_AsyncCMD wird mit Befehl als $EVENT getriggert
  • notify ruft fhem_async() Funktion auf
  • diese ruft einen curl befehl im Hintergrund auf und kehrt SOFORT zurück
  • Erfolgreich, sofortige Rückgabe auf ersten WebRequest
  • Alexa sagt sofort "ok"  ;)

Hoffe das kann mal jemand benötigen.

pOpY

MadMax-FHEM

Komisch.
Weil ich mit dem Dummy und Notify bei mir keine Wartezeit habe...

Aber wenn es funktioniert...

Viel Erfolg und Spaß weiterhin, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

popy

Hmmm, bei mir leider nicht.
Mit dem Workaround funkt es bei mir ☺

Gesendet von meinem LG-H815 mit Tapatalk