FHEM > Anfängerfragen

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

(1/2) > >>

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

--- Code: ---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;
--- Ende Code ---

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.

--- Code: ---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

--- Ende Code ---
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.

--- Code: ---{
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");
}
}

--- Ende Code ---
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.

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)

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:


--- Code: ---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

--- Ende Code ---

Solange die Sequenz läuft, wird sie beim erneuten Trigger nicht wiederholt.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln