[gelöst] fhem-Befehle mit zeitlichem Abstand ausführen?

Begonnen von gestein, 13 Mai 2020, 15:52:34

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich habe da ein Verständnisproblem, wenn man mehrere Befehle im Abstand von z.B. mehreren Sekunde ausführen möchte.
Hintergrund ist, dass ich mit irblaster meinen Fernseher einschalten und dann auf HDMI1 wechseln möchte.
Dazu muss ich zuerst mit "set irblaster send Power" den Fernseher einschalten, etwas warten und dann mit auf den Fernseh-Eingang zurückwechseln.
Von dort muss ich dann mit mehreren "Source"-Befehlen zum HDMI1-Eingang wechseln.
Dem Fernseher muss man da etwas Zeit geben richtig zu reagieren.

Zuerst dachte ich, an folgendes in einem Perlscript:
fhem("set irblaster send Power");
sleep 5; fhem("set irblaster send TV");
sleep 2; fhem("set irblaster send Source");
sleep 2; fhem("set irblaster send Source");
sleep 2; fhem("set irblaster send Source");
sleep 2; fhem("set irblaster send Ok");

Aber das ist ja ganz schlecht, weil das perl sleep alles blockiert.

Also so etwas, weil das fhem-interne sleep einen quasi-at erzeugt:
fhem("set irblaster send Power");
fhem("sleep 5; set irblaster send TV");
fhem("sleep 2; set irblaster send Source");
fhem("sleep 2; set irblaster send Source");
fhem("sleep 2; set irblaster send Source");
fhem("sleep 2; set irblaster send Ok");

Geht aber auch nicht, weil alle "at" zur fast gleichen Zeit mit unterschiedlichen bzw. gleichen Zeiträumen erstellt werden.
Der Befehl "fhem" erzeugt z.B. ein at mit 5 Sekunden mit dem Kommando "set irblaster send TV" und kehrt gleich wieder in das perl-script zurück.

Muss man also so etwas verwenden?
fhem("set irblaster send Power");
fhem("sleep 5; set irblaster send TV");
fhem("sleep 6; set irblaster send Source");
fhem("sleep 7; set irblaster send Source");
fhem("sleep 8; set irblaster send Source");
fhem("sleep 9; set irblaster send Ok");


Oder müsste ich das so schreiben?
fhem("set irblaster send Power; sleep 5; set irblaster send TV; sleep 2; set irblaster send Source; sleep 2; set irblaster send Source; sleep 2; set irblaster send Source; sleep 2; set irblaster send Ok");


Wie ist so etwas in fhem richtig zu lösen?

Danke im Voraus
liebe Grüße
Gerhard

MadMax-FHEM

#1
Die letzte Variante sollte das sein, was du willst...

EDIT: du hast dir doch selbst schon alles genau erläutert... Warum dann die Frage(n) hier!? ;)  Und "richtig" ist immer eine Frage des "womit"!? Man kann/könnte es durch explizite at lösen (unschön, weil unübersichtlich) bzw. alternativ kann man den sleep auch eine id geben und hat dann auch "explizite" at. Man könnte es mit DOIF und wait lösen... Aber warum DOIF, wenn es kein IF gibt ;) und es gibt bestimmt noch weitere Möglichkeiten... Wichtig mit sleep (aber das hast du ja erkannt und erläutert): ein fhem sleep nehmen UND am Ende immer einen fhem-Befehl weil es sonst blockiert...

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)

gestein

Hallo Joachim,

Tja, manchmal benötigt man einen Stups in die richtige Richtung.
Und manchmal gibt es halt Wege in die man sich verrennt.

Dann werde ich mal den Weg mit dem einen fhem-Aufruf mit den vielen sleeps nehmen.

lg, Gerhard

gestein

Hallo,

ich habe das nun wie folgt gelöst:
fhem("set irblaster send IR_Power;sleep 12;set irblaster send TV;sleep 2; set irblaster send Source;sleep 2; set irblaster send Source;sleep 2; set irblaster send Source;sleep 1; set irblaster send IR_Ok");

Vielleicht kann es ja jemand brauchen.
lg, Gerhard