[gelöst] wait-timer wird bei initialize nicht gelöscht/Bewegungsmelder + Taster

Begonnen von holle75, 12 September 2018, 21:25:14

Vorheriges Thema - Nächstes Thema

holle75

Hallo Ihr, folgende DOIF´s schalten Licht mit Bewegungsmelder und Tastendruck. Damit das eine nicht das andere stört enable und initialisiere ich das eine DOIF mit dem anderen. Sonst wird das Licht grad wieder angeschaltet.

Warum zwei DOIF´s? ... das do resetwait macht mich wahnsinnig da der jeweilge Fall nicht gehalten wird und der Bewegungsmelder ständig das Licht, egal wie, immer wieder anschaltet. Ich bekomme keine Pause geschrieben "die hält".

define Waschhaus_PIR13_Licht_DOIF DOIF (["Waschhaus_TASTER_PIR:press"] and [?Wetterstation:luminosity] < 10000 and ([?Waschhaus_LICHT_Spiegel] eq "off" or [?$SELF] eq "cmd_1_1")) (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off)
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF group System
attr Waschhaus_PIR13_Licht_DOIF wait 0,600

define Waschhaus_PIR13_Licht_TasterLinks_DOIF DOIF (["Waschhaus_TASTER_links:press_short"]) (set Waschhaus_PIR13_Licht_DOIF disable) (set Waschhaus_PIR13_Licht_DOIF initialize)
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF do always
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF group System
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF wait 0,30


Die eigentliche Frage: der im ersten DOIF gestartete wait-timer wird durch das im zweiten DOIF ausgeführte disable und dann initialize nicht eliminiert.
Laut commandref, so wie ich es verstehe, sollte es das eigentlich?

Damian

Zitat von: holle75 am 12 September 2018, 21:25:14
Hallo Ihr, folgende DOIF´s schalten Licht mit Bewegungsmelder und Tastendruck. Damit das eine nicht das andere stört enable und initialisiere ich das eine DOIF mit dem anderen. Sonst wird das Licht grad wieder angeschaltet.

Warum zwei DOIF´s? ... das do resetwait macht mich wahnsinnig da der jeweilge Fall nicht gehalten wird und der Bewegungsmelder ständig das Licht, egal wie, immer wieder anschaltet. Ich bekomme keine Pause geschrieben "die hält".

define Waschhaus_PIR13_Licht_DOIF DOIF (["Waschhaus_TASTER_PIR:press"] and [?Wetterstation:luminosity] < 10000 and ([?Waschhaus_LICHT_Spiegel] eq "off" or [?$SELF] eq "cmd_1_1")) (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off)
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF group System
attr Waschhaus_PIR13_Licht_DOIF wait 0,600

define Waschhaus_PIR13_Licht_TasterLinks_DOIF DOIF (["Waschhaus_TASTER_links:press_short"]) (set Waschhaus_PIR13_Licht_DOIF disable) (set Waschhaus_PIR13_Licht_DOIF initialize)
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF do always
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF group System
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF wait 0,30


Die eigentliche Frage: der im ersten DOIF gestartete wait-timer wird durch das im zweiten DOIF ausgeführte disable und dann initialize nicht eliminiert.
Laut commandref, so wie ich es verstehe, sollte es das eigentlich?

Ich habe die wichtigen Stellen der Doku für dich markiert:

ZitatMit dem set-Befehl disable wird ein DOIF-Modul inaktiviert. Hierbei bleiben alle Timer aktiv, sie werden aktualisiert - das Modul bleibt im Takt, allerdings werden keine Befehle ausgeführt. Das Modul braucht mehr Rechenzeit, als wenn es komplett über das Attribut disable deaktiviert wird. Ein inaktiver Zustand bleibt nach dem Neustart erhalten. Ein inaktives Modul kann über set-Befehle enable bzw. initialize wieder aktiviert werden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Hello Damian, aber

Zitat
mit dem set-Befehl initialize wird ein DOIF-Modul initialisiert. Ein inaktives DOIF-Modul wieder aktiviert. Im Gegensatz zum set-Befehl enable wird der letzte Zustand des Moduls gelöscht, damit wird ein Zustandswechsel herbeigeführt, der nächste Trigger führt zur Ausführung eines wahren DOIF-Zweiges. Diese Eigenschaft kann auch dazu genutzt werden, ein bereits aktives Modul zu initialisieren.

wenn dann wieder aktiviert sollte das wait doch löschen?

Oder anders gefragt, wie bekomme ich ein DOIF angehalten und danach jungfräulich initialisiert?

Damian

Zitat von: holle75 am 12 September 2018, 21:44:37
Hello Damian, aber

wenn dann wieder aktiviert sollte das wait doch löschen?

Oder anders gefragt, wie bekomme ich ein DOIF angehalten und danach jungfräulich initialisiert?

Damit Timer gelöscht werden, musst du das Attribut disable auf 1 setzen, mit dem Attribut disable 0 wird das Modul wieder jungfräulich initialisiert. Wir reden hier von Attributen und nicht vom set-Befehl.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

#4
Danke, das sieht im schnellen Test gut aus. Jippie.

... aber ist das schön? Ist mein Anliegen ein DOIF (mit do resetwait) irgendwie über eine wait-Spanne "anzuhalten" so außergewöhnlich?

Mich würde mal interessieren wie andere mit Bewegungsmelder im Bad/wo auch immer/ ihr Licht schalten wenn sie außerdem noch manuell Gewahlt darüber haben möchten?

Damian

Zitat von: holle75 am 12 September 2018, 23:53:44
Danke, das sieht im schnellen Test gut aus. Jippie.

... aber ist das schön? Ist mein Anliegen ein DOIF (mit do resetwait) irgendwie über eine wait-Spanne "anzuhalten" so außergewöhnlich?

Mich würde mal interessieren wie andere mit Bewegungsmelder im Bad/wo auch immer/ ihr Licht schalten wenn sie außerdem noch manuell Gewahlt darüber haben möchten?

Das ist durch die Brust ins Auge.

Formuliere mal in Worten möglichst genau, was passieren soll, insb. im Zusammenhang mit den Kombinationen (Bewegung, Taster).
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

#6
define Waschhaus_PIR13_Licht_DOIF DOIF (["Waschhaus_TASTER_PIR:press"] and [?Wetterstation:luminosity] < 10000 and ([?Waschhaus_LICHT_Spiegel] eq "off" or [?$SELF] eq "cmd_1_1")) (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off)
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF wait 0,600

define Waschhaus_PIR13_Licht_TasterLinks_DOIF DOIF (["Waschhaus_TASTER_links:press_short"]) (attr Waschhaus_PIR13_Licht_DOIF disable 1) (attr Waschhaus_PIR13_Licht_DOIF disable 0)
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF do always
attr Waschhaus_PIR13_Licht_TasterLinks_DOIF wait 0,30


Waschhaus_PIR13_Licht_DOIF soll bei Bewegung (Waschhaus_TASTER_PIR) das Licht anschalten wenn Licht nicht schon an und eine bestimmte Dunkelheit erreicht ist.
Dies soll bei weiterer Bewegung immer wieder verlängert werden.
Nach 10 Minuten keine Bewegung soll es ausgehen.

Das ist für mich noch einfach und funktioniert.

Jetzt kommt das Gefrickel, was ich mit Waschhaus_PIR13_Licht_TasterLinks_DOIF versucht habe zu lösen:

Der Lichtschalter (Waschhaus_TASTER_links) soll das Lich ausschalten können, die Erfassung der Bewegung für 30 Sekunden unterbrochen werden und dann die Bewegungserfassung wieder geschärft werden. Also wie frisch initialisiertes Waschhaus_PIR13_Licht_DOIF.

Das an/auschalten Schalter (Waschhaus_TASTER_links) -> Licht (Waschhaus_LICHT_Spiegel) wird über ein zusätzliches notify gemacht. Das hat organisatorische Gründe. Glaube aber (hoffe ich jetzt mal, kommt mir eben in den Sinn), das ist irrelevant für das DOIF.

Problem ist, dass ich sehr wohl mit dem Schalter das Licht ausschalten kann, aber noch 10 Sekunden brauche um aus dem Waschhaus zu kommen. Dann aktiviert der Bewegungsmelder aber schon wieder. Durch das do resetwait was wie do always agiert, bekomme ich aber irgendwie keinen Zustand (Schalter wurde gedrückt) für eine bestimmte Zeit ins wait wenn der andere Zustand in der Zwischenzeit wieder eintritt. Habs schon mit allen möglichen repeatsame, repeatcmd, etc versucht und bekomme es nicht hin.

Hatte auch eine gedachte Lösung in der Richtung:

define Waschhaus_PIR13_Licht_DOIF DOIF ([?$SELF] ne "cmd_2" and ([?Waschhaus_LICHT_Spiegel] eq "off" or [?$SELF] eq "cmd_1_1") and [?Wetterstation:luminosity] < 10000 and ["Waschhaus_TASTER_PIR:press"]) (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off) \
DOELSEIF (["Waschhaus_TASTER_links:press_short"]) (set $SELF cmd_3) \
DOELSE
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF wait 0,600:20


Aber da funktioniert der Schritt von cmd_2 in cmd_3 nicht. Warum auch immer.

Damian

#7
z. B.

define Waschhaus DOIF

  if (["Waschhaus_TASTER_PIR:press"] and [?Wetterstation:luminosity] < 10000  and !defined $_deactivated)  { # wenn Deaktivierungsflag nicht gesetzt
     fhem"set Waschhaus_LICHT_Spiegel on" if ([?Waschhaus_LICHT_Spiegel) ne "on"]);
     set_Exec ("ausschalten",600,"aus");     # Schalte Licht in 600 Sekunden aus
  }
}
{
  if (["Waschhaus_TASTER_links:press_short"]) {
    fhem"set Waschhaus_LICHT_Spiegel off" if ([?Waschhaus_LICHT_Spiegel) ne "off"]);
    del_Exec ("ausschalten");                   # lösche Timer für das Ausschalten
    $_deactivated=1;                            # setze Deaktivierungsflag
    set_Exec ("aktiviere",30,"activate");       # lösche das Deaktivierungsflag in 30 Sekunden
  }
}
subs { # Funktionen
  sub aus { # schaltet Licht aus
    fhem"set Waschhaus_LICHT_Spiegel off";
  }
  sub activate {  # löscht Deaktivierungsflag
    delete ($_deactivated);
  }
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

#8
vielen Dank Damian für deine Mühe, aber ..... ich kann das so nicht nachvollziehen (oder sagen wir trotz all deiner Kommentare könnte ich nicht selbst drauf kommen).

Hab schon meinen Kampf DOIF in seiner doch recht angenehmen Überschaubarkeit ohne all die neuen Erweiterungen zu durchblicken.

Aber vielleicht nehm ich das einfach so copy+paste und freu mich? ;)

... oder es gibt eine Variante mit "alten" Bordmitteln?

EDIT: ... oder es sind alte Bordmittel, ich kenn sie nur nicht :D

Damian

#9
sollte auch im FHEM-Modus gehen:

define Waschhaus_PIR13_Licht_DOIF DOIF (["Waschhaus_TASTER_PIR:press"] and [?Wetterstation:luminosity] < 10000 and [?$SELF] ne "cmd_2_1")
  (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off)
DOELSEIF (["Waschhaus_TASTER_links:press_short"])
  (set Waschhaus_LICHT_Spiegel off)()
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF wait 0,600:0,30
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

kann ich auch deine Variante vor dem Edit mit den zwei () () nehmen? weil der Taster das Licht durch das notify auch einschaltet ....
Oder brauchts unbedingt einen Befehl?

define Waschhaus_PIR13_Licht_DOIF DOIF (["Waschhaus_TASTER_PIR:press"] and [?Wetterstation:luminosity] < 10000 and [?$SELF] ne "cmd_2_1")
  (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off)
DOELSEIF (["Waschhaus_TASTER_links:press_short"])
  ()()
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF wait 0,600:0,30


... und warum bin ich darauf nicht gekommen? .... ach so, wegen den zwei () () ... die sind mir neu. Ich hatte es so probiert:

define Waschhaus_PIR13_Licht_DOIF DOIF ([?$SELF] ne "cmd_2" and ([?Waschhaus_LICHT_Spiegel] eq "off" or [?$SELF] eq "cmd_1_1") and [?Wetterstation:luminosity] < 10000 and ["Waschhaus_TASTER_PIR:press"]) (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off) \
DOELSEIF (["Waschhaus_TASTER_links:press_short"]) (set $SELF cmd_3) \
DOELSE
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF wait 0,600:20



Damian

du kannst den Notify auch deaktivieren und so DOIF definieren:

define Waschhaus_PIR13_Licht_DOIF DOIF (["Waschhaus_TASTER_PIR:press"] and [?Wetterstation:luminosity] < 10000 and [?$SELF] ne "cmd_2_1")
  (set Waschhaus_LICHT_Spiegel on) (set Waschhaus_LICHT_Spiegel off)
DOELSEIF (["Waschhaus_TASTER_links:press_short"])
  (set Waschhaus_LICHT_Spiegel on)(set Waschhaus_LICHT_Spiegel off)
attr Waschhaus_PIR13_Licht_DOIF do resetwait
attr Waschhaus_PIR13_Licht_DOIF wait 0,600:0,30
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Danke Damian, mit den zwei () () funktioniert wie eine Eins.

Ich habe alle notifies für alle Schalter/Taster an einer Stelle und möchte das für den schnellen Zugriff so lassen.

Aber das notify scheint nicht zu stören. Bin happy und habe was gelernt!

Tausend Dank.

Damian

Zitat von: holle75 am 13 September 2018, 19:23:17
Danke Damian, mit den zwei () () funktioniert wie eine Eins.

Ich habe alle notifies für alle Schalter/Taster an einer Stelle und möchte das für den schnellen Zugriff so lassen.

Aber das notify scheint nicht zu stören. Bin happy und habe was gelernt!

Tausend Dank.

Die zwei () () sind nichts anders als eine Sequenz von zwei Befehlen wie im ersten Zweig, die aber nichts tun. Die sind nur dazu da, den Zustand cmd_2_1 und nach 30 Sekunden cmd_2 darzustellen.

Das Entscheidende ist die Abfrage von cmd_2_1 in deiner ersten Bedingung, damit das erneute Triggern für die Zeit des Zustands cmd_2_1 für 30 Sekunden unterbunden wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stonemuc

Kann ich mich hier mal anhängen? Ich habe ähnliches vor - allerdings mit einem Bewegungsmelder im Bad. Der soll folgende Funktion haben:

Wenn der Bewegungsmelder auf "on" steht und es dunkel ist und das Rollo nicht geschlossen, soll er anfangen das  Rollo zu schließen und 3 Sekunden später das Licht anschalten.

Wenn das Rollo unten ist, soll das Licht sofort angeschalten werden.

Wenn dann keine Bewegung mehr im Raum erkannt wird, sollte das Licht automatisch nach 5 Minute ausschalten.
Wenn ich manuell mit dem Taster AI einschalte, ist der Lux Wert ja sowieso über 50 und dann dürfte nichts passieren, außer dass das Licht an geht und an bleibt. Ist das so alles richtig konfiguriert? Ich bin noch ein FHEM Neuling und hab noch nicht den richtigen Durchblick und mir alles aus der commandref rausgesucht...


define Bad_Automatik DOIF ([Bewegungsmelder_Bad:motion] eq "on" and [Bewegungsmelder_Bad:brightness] <= 50 and [Rollo_Bad_OG:position] < 100  and [?$SELF] ne "cmd_3_1") (set Rollo_Bad_OG position 100) (set Licht_Bad_OG on) (set Licht_Bad_OG off)
DOELSEIF ([Bewegungsmelder_Bad:motion] eq "on" and [Bewegungsmelder_Bad:brightness] <= 50 and [Rollo_Bad_OG:position] = 100 and [?$SELF] ne "cmd_3_1") (set Licht_Bad_OG on) (set Licht_Bad_OG off)
DOELSEIF ([EnO_003250E1:state] eq "A0" and [EnO_003250E1:buttons] eq "pressed") ((set Licht_Bad_OG off) ()
attr Bad_Automatik wait 0,3,300:0,300:0,10
attr Bad_Automatik  do resetwait


Passiert hier das was ich oben beschrieben habe?
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe