DOIF neue Features (Sleep-Alternative)

Begonnen von Damian, 12 Juli 2015, 21:17:52

Vorheriges Thema - Nächstes Thema

Ellert

@dancatt: Senden deine Fensterkontakte regelmäßig Ereignisse? Es wird immer der Befehlszweig ausgeführt, bei dem, nach seinem Ereigniss "open", 900 s kein anderer Fensterkontakt ein Ereignis "open" sendet.

versuch es so:
([+900] and [Fenster] eq "open") (push ...)
do always

Für jedes Fenster ein DOIF.

moonsorrox

Zitat von: Damian am 18 Oktober 2015, 12:58:38
Zitat aus der Commandref zu DOIF
Da in der Bedingung 100% Perl gilt, kannst du auch noch all das verwenden:

++ -- (Inkrementieren, Dekrementieren)
** (Potenzierung)
! ~ (logische und bitweise Negation)
=~ !~ (Bindung an reguläre Ausdrücke)
* / % x (Multiplikation, Division, Modulo-Operation, Zeichenkettenwiederholung)
<< >> (Verschieben von Bits)
< > <= >= lt gt le ge (Vergleich größer/kleiner)
== != <=> eq ne cmp ~~ (Gleichheit/Ungleichheit)
& (bitweises UND)
| ^ (bitweises ODER - inklusiv/exklusiv)
&& (logisches UND)
|| (logisches ODER)
not (logische Negation)
and (logisches UND)
or xor (logisches ODER (inklusiv/exklusiv)


Gruß

Damian

OK Danke  :D
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

dancatt

ZitatSenden deine Fensterkontakte regelmäßig Ereignisse? Es wird immer der Befehlszweig ausgeführt, bei dem, nach seinem Ereigniss "open", 900 s kein anderer Fensterkontakt ein Ereignis "open" sendet.
Sobald ich ein Fenster öffne wird auch ein Ereignis "open" ausgelöst.

Zitat
versuch es so:
([+900] and [Fenster] eq "open") (push ...)
do always

Für jedes Fenster ein DOIF.
Ich möchte eigentlich lieber nur ein DOIF. Desweiteren wäre es bei dieser Lösung so, dass alle 15 Minuten überprüft wird. Sympathischer wäre mir meine Lösung, da nur dann reagiert wird, wenn ein Fenster geöffnet wird. Aber vielleicht geht meine Lösung ja garnicht :-(
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Amenophis86

Zitat von: dancatt am 18 Oktober 2015, 17:14:01
Ich möchte eigentlich lieber nur ein DOIF. Desweiteren wäre es bei dieser Lösung so, dass alle 15 Minuten überprüft wird. Sympathischer wäre mir meine Lösung, da nur dann reagiert wird, wenn ein Fenster geöffnet wird. Aber vielleicht geht meine Lösung ja garnicht :-(

Kannst du nochmal in Textform sagen, was genau du möchtest was das DOIF machen soll unter welchen Bedingungen? Habe es leider noch nicht ganz verstanden, vll kann ich dir dann helfen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

dancatt

Zitat
Kannst du nochmal in Textform sagen, was genau du möchtest was das DOIF machen soll unter welchen Bedingungen? Habe es leider noch nicht ganz verstanden, vll kann ich dir dann helfen.
:-)
Ich möchte eine Fensterüberwachung. Wenn das Fenster 15 Minuten offen ist möchte ich eine Nachricht. Die Nachricht soll dann auch nur kommen wenn das Fenster auch nach 15 Minuten noch offen ist. Also wenn es innerhalb der 15 Minuten nicht geschlossen wird. Und das Ganze nach 15 Minuten wieder.
Nun habe ich mehrere Fensterkontakte und ich würde gerne alle in einem DOIF abfackeln. Z.B. so:
Internals:
   CFGFN
   DEF        ([2_02_KL_Fensterkontakt:?open] && [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","doif 2_02_KL_Fensterkontakt ist offen","",0,"")})
({EximMail("test@test.de", "doif FHEM Überwachung: 2_02_KL_Fensterkontakt", "Fenster ist offen")})
DOELSEIF ([2_03_SZ_Fensterkontakt:?open] && [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","doif 2_03_SZ_Fensterkontakt ist offen","",0,"")})
({EximMail("test@test.de", "doif FHEM Überwachung: 2_03_SZ_Fensterkontakt", "Fenster ist offen")})
DOELSEIF ([2_05_BZ_Fensterkontakt:?open] && [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","doif 2_05_BZ_Fensterkontakt ist offen","",0,"")})
({EximMail("test@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")})

...

Attributes:
   do         always
   group      Überwachung
   loglevel   6
   room       9_09_Einstellungen
   wait       900:900:900


Mit watchdog (funktioniert) sieht die Lösung so aus:

DEF        ([0123]).([0-9][0-9]).([A-Z][A-Z0-9])(.2)?.(Fensterkontakt):open 00:15:00 ([A-Z][A-Z0-9]).(Fensterkontakt):closed {
my $heizungmodus = ReadingsVal("Heizungmodus","state",undef);
  if ($heizungmodus eq "Winter") {
  PushMassage("Fhem","Fenster ist offen","",0,"");
    EximMail("test@test.de", "FHEM Überwachung: Fenster", "Fenster ist offen");
  fhem("setstate watchdog_Ueberwachung_Fenster defined");
  }
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

dancatt

Zusatz:
wenn man natürlich nacheinander alle 3 Fenster aufmacht und mindestens 15 min. offen lässt, dann sollen auch je eine Nachricht gesendet werden.
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Amenophis86

Zitat von: dancatt am 18 Oktober 2015, 17:36:40
Zusatz:
wenn man natürlich nacheinander alle 3 Fenster aufmacht und mindestens 15 min. offen lässt, dann sollen auch je eine Nachricht gesendet werden.

Folgendes Problem sehe ich:
Sobald ein Fenster geöffnet wird, kannst du nach 15 Minuten eine Meldung mittels Wait schicken, jedoch wird der Waittimer überschrieben, wenn eine andere Bedingung des DOIFs wahr wird. Dh wenn zb nach 7 Minuten Fenster zwei geöffnet wurde, dann wird der Waittimer von Fenster 1 gelöscht und die Nachricht wird nicht kommen, sondern nach 15 Minuten nur die Meldung, dass Fenster 2 geöffnet wurde.
Somit wird es nicht wirklich möglich sein das ganze entweder in einem DOIF zu machen, oder die Funktionen zu haben, wie du sie willst. Selbst, wenn du mittels "or" arbeiten wirst, sehe ich keine Lösung. Bzw die einzige wäre, dass du jeden Fall im DOIF genau beschreibst und anlegst, aber das wäre keine schöne und auch keine clevere Lösung, da du dich dumm und dämmlich schreibst. Dann würde ich lieber einfach beim watchdog bleiben, wenn dieser doch funktioniert, oder du musst auf meherere DOIF ausweichen, wenn es unbedingt DOIF sein soll.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

dancatt

Zitat von: Amenophis86 am 18 Oktober 2015, 18:04:49
Dann würde ich lieber einfach beim watchdog bleiben, wenn dieser doch funktioniert,...
In meinem generischen Watchdog kann ich leider nicht auf $NAME zugreifen und somit weiß ich leider nicht um welches Fenster es sich handelt. Und mehrere Watchdogs wollte ich auch nicht anlegen.

Danke noch für deine ausführliche Erklärung.
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Damian

Zitat von: dancatt am 18 Oktober 2015, 18:26:27
In meinem generischen Watchdog kann ich leider nicht auf $NAME zugreifen und somit weiß ich leider nicht um welches Fenster es sich handelt. Und mehrere Watchdogs wollte ich auch nicht anlegen.

Danke noch für deine ausführliche Erklärung.

define di_fenster DOIF ([?Heizungmodus] eq "Winter" and ([2_02_KL_Fensterkontakt:?open] or [2_03_SZ_Fensterkontakt:?open] or [2_05_BZ_Fensterkontakt:?open]))
({PushMassage("Fhem","doif [di_fenster:Device]","",0,"")},{EximMail("test@test.de", "doif FHEM Überwachung: [di_fenster:Device]", "Fenster ist offen")})
attr di_fenster wait 300


Allerdings sind mehrer Fenster, die gleichzeitig geöffnet werden (innerhalb von 300 Sekunden) kritisch zu sehen - es kann gleichzeitig nur ein Waittimer laufen.

Die sauberste Lösung ist tatsächlich, pro Fenster ein eigenes Modul (paste und copy) zu definieren.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Amenophis86

Zitat von: dancatt am 18 Oktober 2015, 18:26:27
In meinem generischen Watchdog kann ich leider nicht auf $NAME zugreifen und somit weiß ich leider nicht um welches Fenster es sich handelt. Und mehrere Watchdogs wollte ich auch nicht anlegen.

Danke noch für deine ausführliche Erklärung.

Ok, dachteder Watchdog hätte die Ansprüche zu 100% erfüllt. Dann bleibt wohl wirklich nur ein DOIF pro Fenster. Sry
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

moonsorrox

Zitat von: Amenophis86 am 18 Oktober 2015, 19:37:45
Ok, dachteder Watchdog hätte die Ansprüche zu 100% erfüllt. Dann bleibt wohl wirklich nur ein DOIF pro Fenster. Sry

lieber ein DOIF mehr als eines zu wenig...!  ;) :D ;) sind doch gut die Teile...!
Ich baue mir auch immer lieber ein DOIF dazu als alles in einem unterzubringen und da dann evtl. Fehlschaltungen zu haben  :D
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

dancatt

Zitat von: Damian am 18 Oktober 2015, 18:42:37
Die sauberste Lösung ist tatsächlich, pro Fenster ein eigenes Modul (paste und copy) zu definieren.
Das habe ich nun gemacht. Allerdings bekomme ich auch eine Meldung, wenn da Fenster innerhalb der 15 Minuten wieder geschlossen wird.
Fehlt mir da noch eine Definition eines Attributes?

Definition:

Internals:
   CFGFN
   DEF        ([2_05_BZ_Fensterkontakt:?open] && [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","doif 2_05_BZ_Fensterkontakt ist offen","",0,"")})
({EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")})
   NAME       doif_Ueberwachung_2_05_BZ_Fensterkontakt
   NR         1025
   NTFY_ORDER 50-doif_Ueberwachung
   STATE      cmd_1
   TYPE       DOIF
   CHANGETIME:
   Helper:
     Dblog:
       Cmd_event:
         Dblog:
           TIME       1445193369.45506
           VALUE      2_05_BZ_Fensterkontakt
       Cmd_nr:
         Dblog:
           TIME       1445193369.45506
           VALUE      1
       Cmd_seqnr:
         Dblog:
           TIME       1445193369.45506
           VALUE      2
       Error:
         Dblog:
           TIME       1445193369.45506
           VALUE      {EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")}: -1
       State:
         Dblog:
           TIME       1445193369.45506
           VALUE      cmd_1
       Wait_timer:
         Dblog:
           TIME       1445193369.01392
           VALUE      no timer
   Readings:
     2015-10-18 20:21:24   Device          2_05_BZ_Fensterkontakt
     2015-10-18 20:36:09   cmd_event       2_05_BZ_Fensterkontakt
     2015-10-18 20:36:09   cmd_nr          1
     2015-10-18 20:36:09   cmd_seqnr       2
     2015-10-18 20:21:24   e_2_05_BZ_Fensterkontakt_events battery: ok contact: closed (to VCCU) closed trigDst_VCCU: noConfig trigger_cnt: 98
     2015-10-18 20:36:09   error           {EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")}: -1
     2015-10-18 20:36:09   state           cmd_1
     2015-10-18 20:36:09   wait_timer      no timer
   Condition:
     0          EventDoIf('2_05_BZ_Fensterkontakt',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'open') && InternalDoIf('Heizungmodus','STATE','') eq "Winter"
   Devices:
     0           2_05_BZ_Fensterkontakt
     all         2_05_BZ_Fensterkontakt
   Do:
     0:
       0          {PushMassage("Fhem","doif 2_05_BZ_Fensterkontakt ist offen","",0,"")}
       1          {EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")}
     1:
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice 2_05_BZ_Fensterkontakt
     sleepsubtimer -1
     sleeptimer -1
     triggerDev 2_05_BZ_Fensterkontakt
     triggerEvents:
       battery: ok
       contact: closed (to VCCU)
       closed
       trigDst_VCCU: noConfig
       trigger_cnt: 98
   Internals:
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
     all         2_05_BZ_Fensterkontakt
Attributes:
   do         always
   group      Überwachung
   room       9_09_Einstellungen
   wait       900
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Ellert

Du kannst alles in ein DOIF bauen und für jede Fenster "offen" Kombination einen Bedingungszweig erstellen. Dann bestimmt allerdings des zuletzt geöffnete Fenster wann die 15 Minuten zu zählen beginnen.

F1 and F2   push "F1 und F2 sind offen"
F1 and !F2 push ...
!F1 and F2 push ...


Syntax verkürzt

Ellert

Zitat von: dancatt am 18 Oktober 2015, 20:44:36
Das habe ich nun gemacht. Allerdings bekomme ich auch eine Meldung, wenn da Fenster innerhalb der 15 Minuten wieder geschlossen wird.
Fehlt mir da noch eine Definition eines Attributes?

Definition:

Internals:
   CFGFN
   DEF        ([2_05_BZ_Fensterkontakt:?open] && [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","doif 2_05_BZ_Fensterkontakt ist offen","",0,"")})
({EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")})
   NAME       doif_Ueberwachung_2_05_BZ_Fensterkontakt
   NR         1025
   NTFY_ORDER 50-doif_Ueberwachung
   STATE      cmd_1
   TYPE       DOIF
   CHANGETIME:
   Helper:
     Dblog:
       Cmd_event:
         Dblog:
           TIME       1445193369.45506
           VALUE      2_05_BZ_Fensterkontakt
       Cmd_nr:
         Dblog:
           TIME       1445193369.45506
           VALUE      1
       Cmd_seqnr:
         Dblog:
           TIME       1445193369.45506
           VALUE      2
       Error:
         Dblog:
           TIME       1445193369.45506
           VALUE      {EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")}: -1
       State:
         Dblog:
           TIME       1445193369.45506
           VALUE      cmd_1
       Wait_timer:
         Dblog:
           TIME       1445193369.01392
           VALUE      no timer
   Readings:
     2015-10-18 20:21:24   Device          2_05_BZ_Fensterkontakt
     2015-10-18 20:36:09   cmd_event       2_05_BZ_Fensterkontakt
     2015-10-18 20:36:09   cmd_nr          1
     2015-10-18 20:36:09   cmd_seqnr       2
     2015-10-18 20:21:24   e_2_05_BZ_Fensterkontakt_events battery: ok contact: closed (to VCCU) closed trigDst_VCCU: noConfig trigger_cnt: 98
     2015-10-18 20:36:09   error           {EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")}: -1
     2015-10-18 20:36:09   state           cmd_1
     2015-10-18 20:36:09   wait_timer      no timer
   Condition:
     0          EventDoIf('2_05_BZ_Fensterkontakt',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'open') && InternalDoIf('Heizungmodus','STATE','') eq "Winter"
   Devices:
     0           2_05_BZ_Fensterkontakt
     all         2_05_BZ_Fensterkontakt
   Do:
     0:
       0          {PushMassage("Fhem","doif 2_05_BZ_Fensterkontakt ist offen","",0,"")}
       1          {EximMail("test\@test.de", "doif FHEM Überwachung: 2_05_BZ_Fensterkontakt", "Fenster ist offen")}
     1:
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice 2_05_BZ_Fensterkontakt
     sleepsubtimer -1
     sleeptimer -1
     triggerDev 2_05_BZ_Fensterkontakt
     triggerEvents:
       battery: ok
       contact: closed (to VCCU)
       closed
       trigDst_VCCU: noConfig
       trigger_cnt: 98
   Internals:
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
     all         2_05_BZ_Fensterkontakt
Attributes:
   do         always
   group      Überwachung
   room       9_09_Einstellungen
   wait       900


Das verhindert die Ansage nach dem Schließen.

DOELSEIF ([Fenster] eq "closed") ()

Damian

Zitat von: dancatt am 18 Oktober 2015, 20:44:36
Das habe ich nun gemacht. Allerdings bekomme ich auch eine Meldung, wenn da Fenster innerhalb der 15 Minuten wieder geschlossen wird.
Fehlt mir da noch eine Definition eines Attributes?


Bei do always brauchst du noch ein DOELSE am Ende.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF