[gelöst] Eventaktion erst nach Verzögerung ausführen

Begonnen von ThomasFh, 28 September 2021, 09:42:59

Vorheriges Thema - Nächstes Thema

ThomasFh

Hallo,

irgendwo habe ich einen generellen Verständnisfehler, aber evtl. hat das schon einer vor mir gemacht und kann helfen:

An einem Tor ist ein Öffnungskontakt (Reed), der auf geht, sobald das Tor offen ist und schließt, wenn das Tor zu ist.
Testweise geht hier eine LED an bei Tor auf und aus bei Tor zu.
Es ist erstmal in zwei notify's getrennt, da hier noch weitere Abhängigkeiten hinzu kommen werden.

Die funktionierende Konfig:


define GPIO_PIN11_LED RPI_GPIO 25
attr GPIO_PIN11_LED direction output

define GPIO_PIN13_Oeffner RPI_GPIO 27
attr GPIO_PIN13_Oeffner devStateIcon on:fts_door_right_open@red off:fts_door_right@green
attr GPIO_PIN13_Oeffner direction input
attr GPIO_PIN13_Oeffner interrupt both
attr GPIO_PIN13_Oeffner pud_resistor up
define TorIstOffen notify GPIO_PIN13_Oeffner:on  set GPIO_PIN11_LED on
define TorIstZu    notify GPIO_PIN13_Oeffner:off set GPIO_PIN11_LED off


Nun soll aber die LED erst 7.5 Sekunden nach dem Schließen des Tores aus gehen
https://wiki.fhem.de/wiki/Notify#Zeitverz.C3.B6gert_schalten


defmod TorIstZu    notify GPIO_PIN13_Oeffner:off sleep 7.5;; set GPIO_PIN11_LED off


was nach 3h rumprobieren auch klappt, da ich mit den Semikolons nicht klar gekommnen bin ...

Dazu mehrere Fragen:

sleep 7.5 is ja perl code, wegen ;;  , woran ich mich nach 3h vergeblichen Probierens dann erinnert habe:

-kann man den Perl Code der Übersichtlichkeit anders schreiben? Wenn ich da in 2 Jahren wieder in den Code schaue, weiß ich das echt nicht mehr ;-(
-kann man einen GPIO-Eingang in fhem mit debounce entprellen und reicht ein interner Pullup aus?

Danke ..
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

Damian

Zitatsleep 7.5 is ja perl code, wegen ;;

Das ist falsch.

sleep 7.5 ist hier FHEM-Code, mit einem Semikolon dahinter werden die folgenden Angaben als Parameter für sleep interpretiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Wernieman

Ja .. sleep gibt es auch in Perl, aber dazu müstest Du mit {} erst in die perl Ebene. Hier also ist es die fhem-Ebene.

Wegen der ";;": Kommt es aus der Config (Config-Datei) oder aus der GUI?

Wichtiger Hinweis: Der Perl sleep-Code blockiert fhem! Das tut also in der Wartezeit nichts. Der fhem-sleep dagegen wird von fhem zu einem at aufgelöst und blockiert deshalb fhem nicht. Ein wichtiger und gravierender Unterschied!
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Adimarantis

Eine weitere Option wäre statt NOTIFY ein DOIF zu verwenden.
Dieses hat ein "wait" Attribut mit dem man einzelne Teile (auch innerhalb der Zweige und ohne Perl) zeitlich gestaffelt ausführen kann.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

ThomasFh

#4
Zitat von: Wernieman am 28 September 2021, 11:03:01
Ja .. sleep gibt es auch in Perl, aber dazu müstest Du mit {} erst in die perl Ebene. Hier also ist es die fhem-Ebene.

Wegen der ";;": Kommt es aus der Config (Config-Datei) oder aus der GUI?

Wichtiger Hinweis: Der Perl sleep-Code blockiert fhem! Das tut also in der Wartezeit nichts. Der fhem-sleep dagegen wird von fhem zu einem at aufgelöst und blockiert deshalb fhem nicht. Ein wichtiger und gravierender Unterschied!

@all: Vielen Dank für die hilfreichen Antworten.

Ich stolpere leider immer wieder über dieses ";;"  Ja es steht in der config, denn ich "scripte" alle fhem Einstellungen und klicke nichts über die GUI zusammen.

Dient ";;"  dazu mehre fhem Befehle zu trennen?  Ich bin gerade dabei meine notify's zu erweitern, da ich mehrere Relais steuern muss. Da musste ich diese Semikolons auch setzen. Das macht mich echt irre. ich programmiere in C, C++, C#, VB, VBA, Assembler und bin zu blöd dieses fhem zu verstehen.



define GPIO_PIN07_Relay1 RPI_GPIO 4
attr GPIO_PIN07_Relay1 direction output
attr GPIO_PIN07_Relay1 room GPIO


defmod TorIstOffen notify GPIO_PIN13_Oeffner:on  set GPIO_PIN11_LED on ;; set GPIO_PIN07_Relay1 off
defmod TorIstZu    notify GPIO_PIN13_Oeffner:off sleep 7;; set GPIO_PIN11_LED off ;; set GPIO_PIN07_Relay1 on




D.h., braucht man das ;; nun um mehrere fhem Befehle hintereinander abzuarbeiten oder kann man damit nur im einen notify mehrere Befehle hintereinander ausführen? Siehe die beiden letzten fett gedruckten defmod Zeilen
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

Otto123

Die Antwort steht hier https://fhem.de/commandref_DE.html#command

und das semikolon muss "geschützt" werden wenn es in die config soll, damit es nicht als Befehlstrenner in der Kommandozeile ausgwertet wird.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

Und genau deshalb mache ist es mittlerweile über die GUI (wo man auch nicht zusammenklickt). Im Defeditor nimmt FHEM einem viel vom Maskieren ab.

(Und das, ob wohl ich auch ein Shell-Junkie bin)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

ThomasFh

noch ein kleiner Nachtrag. Die Verzögerung ging in meinem Fall ganz trivial mit on-for-timer
mit einem sleep klappte das ganze nicht immer, ich habe da aber nicht weiter nachgeforscht ..

define TorIstOffen notify TorOeffnerKontakt:on  set ShutterRelay on-for-timer 180 ;; set LED_TorIstOffen on
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

Otto123

Da hat die Lösung aber nichts mit der Aufgabe zu tun?
ZitatNun soll aber die LED erst 7.5 Sekunden nach dem Schließen des Tores aus gehen
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ThomasFh

Zitat von: Otto123 am 29 September 2021, 17:43:40
Da hat die Lösung aber nichts mit der Aufgabe zu tun?

korrekt bemerkt.

Die 7.5 Sekunden stammten nur aus dem Wiki Beispiel. Ich nehem nun aber das TorAufEvent. Die 180 Sekunden sind nur zum Testen ob nichts blockt und werden noch auf 30 verkürzt.

EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

Otto123

Na gut Du wirst es schon wissen. :)
Oben wolltest Du eine LED ausschalten nach einer Zeit. Jetzt machst Du einen Aktor "an" für eine Zeit und schaltest eine LED sofort an.

Ich wollte Dir ja eigentlich bloß das Verständnis für das Semikolon nahebringen. ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz