[gelöst] Notify mit mehreren Auslösern für die Abfolgezeit sperren

Begonnen von timmy2000, 17 Oktober 2021, 09:09:21

Vorheriges Thema - Nächstes Thema

timmy2000

Guten morgen zusammen,
vielleicht kann mir jemand helfen. Ich habe ein notify, welches durch 3 verschiedene Auslöser getriggert wird.

Audi_GTag1_orange:presence:.present|
Fiat_GTag2_green:presence:.present|
Same_GTag3_red:presence:.present

set Relais_5_Tor_Licht_Pfosten on;;sleep 7;;
set Relais_5_Tor_Licht_Pfosten off;;sleep 30;;
set Relais_5_Tor_Licht_Pfosten on ;;sleep 10;;
set Relais_5_Tor_Licht_Pfosten off;


Nun würde ich es gerne verwirklichen, dass sobald einer dieser Trigger das notify auslöst, dieses sich für die Abfolgezeit sperrt und sich somit vor dem erneuten Auslösen durch einen der anderen Trigger schützt. Meine einzige Idee wäre es über ein event-min-interval zu lösen, aber irgendwie schützt mich das ja dann nur vor dem erneuten auslösen von ein und dem selben trigger, oder sehe ich das falsch? Ich könnte mir vorstellen das ich dem notify vlt ein "disabledAfterTrigger" verpassen könnte, dies schützt das notify aber irgendwie wohl auch nur für ein paar sekunden vor dem erneuten Auslösen.

Danke im voraus ihr lieben "Maschinenflüsterer"


jhohmann

Da gibt es mehrere Möglichkeiten. Alles ungetestet und freihändig hier eingegeben  ;).
Du kannst das notify auf inactive setzen.

set "notifyname" inactive;set Relais_5_Tor_Licht_Pfosten on;sleep 7;
set Relais_5_Tor_Licht_Pfosten off;sleep 30;
set Relais_5_Tor_Licht_Pfosten on;sleep 10;
set Relais_5_Tor_Licht_Pfosten off;set "notifyname" active

Oder du wechselst auf die perl Ebene und fragst zuerst ab, ob Relais_5_Tor_Licht_Pfosten den Status off hat. Nur dann wird die Aufruffolge an fhem übergeben.

{
if (ReadingsVal("Relais_5_Tor_Licht_Pfosten", "state", "off") eq "off") {
  fhem("set Relais_5_Tor_Licht_Pfosten on;sleep 7;set Relais_5_Tor_Licht_Pfosten off;sleep 30;set Relais_5_Tor_Licht_Pfosten on;sleep 10;set Relais_5_Tor_Licht_Pfosten off");
}
}

Und ich meine, dass du in diesem Fall keine doppelten ; brauchst. Hier sollten einfache reichen.
Und beim nächsten Mal bitte ein List vom Device in code Tags eingebettet mitposten. Das macht es einfacher zu lesen.
Raspberry Pi 4 - bookworm / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung+Rollo
plus dovecot, minidlna

Beta-User

Na ja, "ein paar Sekunden" können auch Monate sein... (solange kein FHEM-Nestart erfolgt), von daher bist du m.E. schon auf der richtigen Spur ;) .

Ansonsten (teils doppelt):
- Der #-Knopf in der "Formatierungs-Leiste" des Forums ist für Code-Tagging gedacht. Das macht es lesbarer und man kann auch die ; besser zählen ;) ;
- Falls es mit den Zeiten nicht so genau gemeint ist ginge ggf. auch ein "blink"-Befehl, falls das Modul des Aktors das unterstützt. Dann könnte man alternativ abfragen, ob das Gerät im SetExtensions-(Timer-) Modus ist. (ein list würde nach Aktivierung verraten, was ich meine).
- falls der Aktor "nur" on-for-timer unterstützt, könnte das den Code verkürzen.
- Wenn du die sleep "benennst" (siehe commandref zu sleep), könntest du auch alternativ nachsehen, ob die grade existieren (siehe "help cancel", braucht aber etwas mehr Coding)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Nicht auszuschliessen bei mir das ich hinterherhinke, mich würde interessieren was denn dagegen spricht mit disabledAftertrigger 47, also die Zeit die die Abfolge des Ausführungsteil dauert, das erneute auslösen zu verhindern ?
Wäre doch nix anderes wie der erste Vorschlag von jhohmann ?

Damian

Ich würde es so lösen:

DOIF ([Audi_GTag1_orange:"present"] or [Fiat_GTag2_green:"present"] or [Same_GTag3_red:"present"])
(set Relais_5_Tor_Licht_Pfosten on)
(set Relais_5_Tor_Licht_Pfosten off)
(set Relais_5_Tor_Licht_Pfosten on)
(set Relais_5_Tor_Licht_Pfosten off)

attr do always
attr wait 0,7,30,10


Solange die Sequenz läuft, wird sie beim erneuten Trigger nicht wiederholt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

timmy2000

#5
Danke für die vielen Antworten. Ich weiß die Hilfe hier wirklich sehr zu schätzen!
Ich habe mich dafür entschieden das notify zu Anfang auf inactive und im Abschluss der Abfolge wieder auf active zu setzen
klappt Super :-) Danke Danke


TomLee

Die Umsetzung mit inactive/active erinnert mich an diese Worte:

Zitat von: rudolfkoenig am 11 Juli 2017, 18:08:52
Rudi hat eher gehofft, dass es ein undokumentierter Feature bleibt, weil er meint, irgendetwas ist faul, wenn man $SELF braucht.

$SELF könntest hier jetzt nämlich gebrauchen.
Ich habs immer noch nicht durchschaut ob das mit disabledAfterTrigger 47 hinkt oder nicht, aber wenn nicht, dann versteh ich jetzt die Aussage das irgendwas faul ist wenn man es benötigt, weil man es einfacher mit Bordmitteln umsetzt.

jhohmann

Auch wenn meine Lösung "gewonnen" hat ;D, bin ich doch ein Fan, solche Geschichten eher über Attribute zu lösen.
Wenn man nämlich irgendwann anfängt, seinen Zoo an Devices nach einer gewissen Zeit zu durchforsten, kommt man schnell auf die Idee, dass die alte Namenskonvention eher Mist war und man inzwischen was viel besseres, cooleres entwickelt hat.
Und wenn die Devices an zu vielen Stellen namentlich erwähnt werden, werden nicht alle Stellen umbenannt und irgendwas geht dann nicht.

Ein schönes Beispiel ist der watchdog.
Wenn man damit seine Fenster überwacht, muss man dem Watchdog am Ende noch ein trigger <name> . mit schicken, damit er wieder neu überwacht. Inzwischen weiß ich, dass es das Attribut autoRestart gibt. Und dem ist eine Umbenennung völlig egal.

Also habe ich mir einige Dummys definiert und den Hinweis von TomLee ausprobiert.
Und ja, es funktioniert. Das notify nimmt für diese Anzahl in Sekunden keine weiteren Events an.
Also würde ich empfehlen, den Vorschlag von TomLee aufzugreifen und es mit disabledAfterTrigger 47 auszuprobieren.
Raspberry Pi 4 - bookworm / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung+Rollo
plus dovecot, minidlna