Autor Thema: [gelöst] Notify mit mehreren Auslösern für die Abfolgezeit sperren  (Gelesen 381 mal)

Offline timmy2000

  • New Member
  • *
  • Beiträge: 29
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"

« Letzte Änderung: 17 Oktober 2021, 15:25:03 von timmy2000 »

Offline jhohmann

  • Full Member
  • ***
  • Beiträge: 145
Antw:Notify mit mehreren Auslösern für die Abfolgezeit sperren
« Antwort #1 am: 17 Oktober 2021, 10:14:35 »
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 - buster / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung
plus nextcloud, dovecot, minidlna

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16325
Antw:Notify mit mehreren Auslösern für die Abfolgezeit sperren
« Antwort #2 am: 17 Oktober 2021, 10:18:52 »
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-T620@Debian 10, 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:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3663
  • ... wer sät, der erntet ...
Antw:Notify mit mehreren Auslösern für die Abfolgezeit sperren
« Antwort #3 am: 17 Oktober 2021, 10:56:06 »
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 ?

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8810
Antw:Notify mit mehreren Auslösern für die Abfolgezeit sperren
« Antwort #4 am: 17 Oktober 2021, 12:02:55 »
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

Offline timmy2000

  • New Member
  • *
  • Beiträge: 29
Antw:Notify mit mehreren Auslösern für die Abfolgezeit sperren
« Antwort #5 am: 17 Oktober 2021, 15:17:42 »
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

« Letzte Änderung: 17 Oktober 2021, 15:28:10 von timmy2000 »

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3663
  • ... wer sät, der erntet ...
Die Umsetzung mit inactive/active erinnert mich an diese Worte:

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.

Offline jhohmann

  • Full Member
  • ***
  • Beiträge: 145
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 - buster / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung
plus nextcloud, dovecot, minidlna