Aktion ausführen wenn Sensor über längere Zeit Schwellwert überschritten hat

Begonnen von JMC, 11 Juli 2017, 15:58:13

Vorheriges Thema - Nächstes Thema

JMC

Hi,

Das ist jetzt mein DOIF
define di_TEST_Rollo1 DOIF ([Rollo1] <= 20 and [08:46-23:59])(set Licht1:FILTER=STATE!=off off) DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE!=on on)

(ich habe die negierung des Zeitraums schon geändert weil ich gedacht habe, dass es daran vielleicht liegt)

Und das ein LIST
Internals:
   DEF        ([Rollo1] <= 20 and [08:46-23:59])(set Licht1:FILTER=STATE!=off off) DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE!=on on)
   NAME       di_TEST_Rollo1
   NR         58
   NTFY_ORDER 50-di_TEST_Rollo1
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2017-07-12 14:06:31   Device          Rollo1
     2017-07-12 12:07:26   cmd             1
     2017-07-12 12:07:26   cmd_event       Rollo1
     2017-07-12 12:07:26   cmd_nr          1
     2017-07-12 14:06:31   e_Rollo1_STATE 0
     2017-07-12 12:07:26   state           cmd_1
     2017-07-12 14:15:46   timer_01_c01    13.07.2017 08:46:00
     2017-07-12 14:15:46   timer_02_c01    12.07.2017 23:59:00
     2017-07-12 14:15:46   wait_timer      no timer
   condition:
     0          InternalDoIf($hash,'Rollo1','STATE') <= 20 and DOIF_time($hash,0,1,$wday,$hms)
     1          InternalDoIf($hash,'Rollo1','STATE') > 20
   days:
   devices:
     0           Rollo1
     1           Rollo1
     all         Rollo1
   do:
     0:
       0          set Licht1:FILTER=STATE!=off off
     1:
       0          set Licht1:FILTER=STATE!=on on
     2:
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   internals:
     0           Rollo1:STATE
     1           Rollo1:STATE
     all         Rollo1:STATE
   interval:
     0          -1
     1          0
   itimer:
   localtime:
     0          1499928360
     1          1499896740
   realtime:
     0          08:46:00
     1          23:59:00
   regexp:
     all:
   state:
     STATE:
   time:
     0          08:46:00
     1          23:59:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1499896740:
       localtime  1499896740
       hash:
     1499928360:
       localtime  1499928360
       hash:
Attributes:
   room       1
   wait       65:65
Viele Grüße
JMC

pc1246

Ok
Fuer meine Begriffe bist du im cmd1, also "off"! Du kannst das doch jetzt gar nicht testen! Wenn Du das Rollo (>20) bewegst, geht es in on, und wenn es wieder kleiner wird triggert es auch wieder! ausser du stellst jetzt ein Fragezeichen vor das erste Rollo1, zum Test!
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

JMC

Die Lampe1 ist aber "on" - und soll jetzt auf "off" geschaltet werden. Es ist zwischen 08:46 und 23:59 und das Roll1 ist bei 0 - warum schaltet das DOIF denn dann nicht? Klar würde es schalten wenn ich das Rollo1 bewege, aber es geht ja explizit um den Fall, dass es nicht bewegt wird und nur die Uhrzeit das cmd_1 auslösen soll
Viele Grüße
JMC

pc1246

????
Wenn Du im cmd1-State bist, dann kommt er da nicht noch einmal hin!
Kannst du bei Deinem DOIF mal set cmd2 machen? Und dann warten!
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

JMC

Selbst wenn ich ihn auf cmd2 setze passiert nix - ich hab jetzt über 5 Minuten gewartet. Passieren tut aber ohne ein fahren des Rollos nix :(
Viele Grüße
JMC

pc1246

Hallo Peter
Ich habe es gerade auch mal ausprobiert. Anscheinend triggert eine Zeitspanne nicht! In der commendref finde ich das leider auch nicht richtig beschrieben! Da Damian schon mal hier war wird er sich bestimmt noch mal melden!
Seltsam ist, dass ich das bei mir zu Hause definitiv per Fragezeichen ausgeschaltet habe, da mir das Probleme bereitet hat!
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

pc1246

Hallo
So jetzt habe ich es doch gefunden. Es wird nur zum Beginn und zum Ende getriggert! Aber auch das wuerde ja bei Deinem Fall funktionieren! Rollo kleiner 20, und dann wird um 8:45 ausgeschaltet! Wenn Du das fragezeichen weglaesst!
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

JMC

Hi Christoph,

vielen Dank für dein testen! Damit hätte ich in der Tat eine Lösung die dann um 08:45 schalten würde. Wenn ich dann später hingehe und noch dran schalte passiert dann wieder nix. Daher habe ich mir jetzt mit at was gebastelt das nicht nur fest um 08:45 triggert sondern auch jederzeit danach wenn ich den Status geändert habe.

Viele Grüße
Viele Grüße
JMC

pc1246

Aber wenn Du dran schaltest, dann greift doch der Rollo1-trigger!?
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

JMC

Nur wenn ich über FHEM schalte, nicht wenn ich über den Taster am Aktor selber schalte - dann bekommt FHEM den neuen Wert zwar mit, löst aber kein DOIF aus. Wenn ich den Zustand über FHEM ändere wird auch das DOIF sofort mit ausgelöst.

Was nicht heißen soll, dass der Fehler im DOIF ist, der sitzt mit Sicherheit vor dem Bildschirm und bekommt es nur nicht richtig hin.

define di_TEST_Rollo1 DOIF ([Rollo1] <= 20 and [Licht1] eq "on" and ![00:00-08:45])(set Licht1:FILTER=STATE=on off) DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE=off on)

Ich hatte jetzt schon Licht1 mit in die IF Bedingung genommen, darum funktioniert es vermutlich auch wenn es vom FHEM aus geschaltet wird. Aber es gibt da halt auch Taster ausserhalb die auch funktionieren sollten.
Viele Grüße
JMC

JMC

Zitat von: Damian am 11 Juli 2017, 19:41:23
nimm einfach if und watchdog in einem:

my_threshold DOIF ([mein_sensor]>[mein_schwellenwert])(set bla on)

attr my_threshold wait 600


Hi,

was bei mir aber nicht klappt ist das wenn sich der Wert in den 600 ändert (also wieder unter den Schwellwert geht) der Befehl NICHT ausgeführt wird:

([Steckdose2:merker] eq "1" and [Thermo2:humidity] >= 55 and [Steckdose2] eq "off")(set Steckdose2 on) DOELSEIF ([Steckdose2:merker] eq "1" and [Thermo2:humidity] <= 48 and [Steckdose2] eq "on")(set Steckdose2 off) DOELSEIF ([Steckdose2:merker] eq "0" and [?Steckdose2] eq "on")(set Steckdose2 off)

Als wait habe ich 300:600:600

Den merker setze ich morgens spätestens zu einer gewissen Uhrzeit (oder beim ersten anschalten über den Taster am Aktor) und abends nehme ich ihn je nach Tag zu bestimmten Zeiten weg - das ist auch kein Problem.

Ich hatte eben für humidity einen Wert von 49, habe dann per setreading "manuell" zum testen ein reading von 56 gesetzt. Daraufhin hat das von mir definierte wait angefangen (300 Sekunden) - während der 300 Sekunden kam aber der "echte" humidity Wert von 49 zurück und so wie ich das DOIF verstanden hatte sollte ja dann die Ausführung des Befehls (bzw der wait timer) abgebrochen werden, oder? Oder habe ich da mal wieder nur was verpeilt?

Viele Grüße
Viele Grüße
JMC