FHEM Forum

FHEM => Automatisierung => Thema gestartet von: maddinthebrain am 06 Januar 2020, 18:26:25

Titel: Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: maddinthebrain am 06 Januar 2020, 18:26:25

Ich hätte das nun mit einem Notify und verschiedenen ifs gemacht:

FL_OG_PIR:motion
if ($hms >= sunset && $hms < 22:00:00){
set HUEDevice7 on-for-timer 300 : pct 100
}
else if ($hms >= 22:00:00 && $hms < 00:00:00){
set HUEDevice7 on-for-timer 300 : pct 50
}

usw.

Nur habe ich keine so rechte Idee, wie ich das mit den Zeiträumen in den Code bringe. Auch das mit dem sunset ist mir noch nicht so klar, ob das so richtig ist.

Kann mir jemand einen Tipp geben?

Vielen Dank Martin
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: Damian am 06 Januar 2020, 20:42:06
Wenn du es in Perl machen willst, dann musst du dir noch etwas Wissen zu String-Vergleichen aneignen.

Alternativ kannst du es so lösen:

define di_pir DOIF ([FL_OG_PIR:"motion"] and [?{sunset}-20:00]) (set HUEDevice7 on-for-timer 300 : pct 100)
DOELSEIF  ([FL_OG_PIR:"motion"] and [?20:00-00:00]) (set HUEDevice7 on-for-timer 300 : pct 50)

attr di_pir do always


Es gibt da auch elegantere Lösungen, wo nicht bei jeder Bewegung ein set-Befehl abgesetzt werden muss.
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: roedert am 08 Januar 2020, 18:48:56
Wenn die Zeitbereiche volle Stunden sind, reicht es mit einem if nur die Stunde abzufragen - das ist ein ganz normaler numerischer Vergleich ohne Uhrzeiten oder Strings.

if ($hour <= 22)
if ($hour > 22)
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: maddinthebrain am 10 Januar 2020, 21:46:11
So jetzt habe das mal mit dem DOIF eingerichtet:
([FL_OG_PIR:"motion"] and [?{sunset}-20:00]) (set HUEDevice7 on-for-timer 60 : pct 100) 
DOELSEIF  ([FL_OG_PIR:"motion"] and [?20:00-22:00]) (set HUEDevice7 on-for-timer 60 : pct 50)
DOELSEIF  ([FL_OG_PIR:"motion"] and [?22:00-00:00]) (set HUEDevice7 on-for-timer 60 : pct 5)


Nun kommt noch Idee: Ich hätte gerne eine Verlauf z.B. Für 60s 100%, dann für 180s 50% und danach aus.

Wäre wait ne Idee? Aber es wären ja pro if bzw. else if ja mehrere Befehle, wo erst einer und dann der nächste usw. ausgeführt werden sollen. Und ich verstehe wait ja so, dass das für jeweils für die ganzen Befehle in der Klammer gilt.

Grüße Martin

Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: KyleK am 10 Januar 2020, 22:38:31
Das geht, indem eine Sequenz von commands pro Zweig gesetzt wird, ein Beispiel findest du hier: https://fhem.de/commandref_DE.html#DOIF_wait
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: maddinthebrain am 10 Januar 2020, 22:56:57
Perfekt, das war genau, was ich gesucht habe. Viele Dank!
Titel: Antw: Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: maddinthebrain am 03 Februar 2020, 09:52:40
So, nach drei Wochen Testbetrieb gibt es paar Fragen. Dazu nochmal meine DOIF Definition:

Internals:
   DEF        ([FL_OG_PIR:"motion"] and [?{sunset("REAL")}-20:00])
(set HUEDevice7 on 3 : pct 100) 
(set HUEDevice7 pct 75 2)
(set HUEDevice7 pct 25 2)
(set HUEDevice7 off 2)
DOELSEIF  ([FL_OG_PIR:"motion"] and [?20:00-22:00])
(set HUEDevice7 on 3 : pct 50)
(set HUEDevice7 pct 25 2)
(set HUEDevice7 off 2)
DOELSEIF  ([FL_OG_PIR:"motion"] and [?06:30-{sunrise("REAL")}])
(set HUEDevice7 on 3 : pct 30)
(set HUEDevice7 pct 15 2)
(set HUEDevice7 off 2)
DOELSEIF  ([FL_OG_PIR:"motion"] and [?22:00-00:00])
(set HUEDevice7 on 2 : pct 5)
(set HUEDevice7 off 2)
DOELSE
()
   FUUID      5e18c77c-f33f-ab72-a49a-805089d24caf48db
   MODEL      FHEM
   NAME       di_zeitstrg_licht_flur_og
   NOTIFYDEV  global,FL_OG_PIR
   NR         295
   NTFY_ORDER 50-di_zeitstrg_licht_flur_og
   STATE      cmd_5
   TYPE       DOIF
   VERSION    20744 2019-12-14 10:26:26
   Helper:
     DBLOG:
       cmd:
         logmysql:
           TIME       1580717702.86457
           VALUE      5
       cmd_event:
         logmysql:
           TIME       1580717702.86457
           VALUE      FL_OG_PIR
       cmd_nr:
         logmysql:
           TIME       1580717702.86457
           VALUE      5
       cmd_seqnr:
         logmysql:
           TIME       1580712059.64964
           VALUE      3
       state:
         logmysql:
           TIME       1580717702.86457
           VALUE      cmd_5
       wait_timer:
         logmysql:
           TIME       1580712059.63956
           VALUE      no timer
   READINGS:
     2020-02-03 09:15:02   Device          FL_OG_PIR
     2020-02-03 09:15:02   cmd             5
     2020-02-03 09:15:02   cmd_event       FL_OG_PIR
     2020-02-03 09:15:02   cmd_nr          5
     2020-02-03 09:15:02   e_FL_OG_PIR_events reachable: 1,battery: 34
     2020-01-18 21:15:12   mode            enabled
     2020-02-03 09:15:02   state           cmd_5
     2020-02-02 20:00:00   timer_01_c01    03.02.2020 17:09:09
     2020-02-02 20:00:00   timer_02_c01    03.02.2020 20:00:00
     2020-02-02 22:00:00   timer_03_c02    03.02.2020 20:00:00
     2020-02-02 22:00:00   timer_04_c02    03.02.2020 22:00:00
     2020-02-03 07:51:35   timer_05_c03    04.02.2020 06:30:00
     2020-02-03 07:51:35   timer_06_c03    04.02.2020 07:50:04
     2020-02-03 00:00:00   timer_07_c04    03.02.2020 22:00:00
     2020-02-03 00:00:00   timer_08_c04    04.02.2020 00:00:00
     2020-02-03 07:40:59   wait_timer      no timer
   Regex:
     accu:
     cond:
       FL_OG_PIR:
         0:
           &STATE     ^FL_OG_PIR$
         1:
           &STATE     ^FL_OG_PIR$
         2:
           &STATE     ^FL_OG_PIR$
         3:
           &STATE     ^FL_OG_PIR$
   attr:
     cmdState:
     wait:
       0:
         0
         60
         120
         120
       1:
         0
         60
         90
       2:
         0
         60
         90
       3:
         0
         61
     waitdel:
   condition:
     0          ::EventDoIf('FL_OG_PIR',$hash,'motion',1) and ::DOIF_time($hash,0,1,$wday,$hms)
     1          ::EventDoIf('FL_OG_PIR',$hash,'motion',1) and ::DOIF_time($hash,2,3,$wday,$hms)
     2          ::EventDoIf('FL_OG_PIR',$hash,'motion',1) and ::DOIF_time($hash,4,5,$wday,$hms)
     3          ::EventDoIf('FL_OG_PIR',$hash,'motion',1) and ::DOIF_time($hash,6,7,$wday,$hms)
   days:
   do:
     0:
       0          set HUEDevice7 on 3 : pct 100
       1          set HUEDevice7 pct 75 2
       2          set HUEDevice7 pct 25 2
       3          set HUEDevice7 off 2
     1:
       0          set HUEDevice7 on 3 : pct 50
       1          set HUEDevice7 pct 25 2
       2          set HUEDevice7 off 2
     2:
       0          set HUEDevice7 on 3 : pct 30
       1          set HUEDevice7 pct 15 2
       2          set HUEDevice7 off 2
     3:
       0          set HUEDevice7 on 2 : pct 5
       1          set HUEDevice7 off 2
     4:
       0         
   helper:
     DEVFILTER  ^global$|^FL_OG_PIR$
     NOTIFYDEV  global|FL_OG_PIR
     event      reachable: 1,battery: 34
     globalinit 1
     last_timer 8
     sleepdevice FL_OG_PIR
     sleepsubtimer -1
     sleeptimer -1
     timerdev   FL_OG_PIR
     timerevent reachable: 1,battery: 34
     triggerDev FL_OG_PIR
     timerevents:
       reachable: 1
       battery: 34
     timereventsState:
       reachable: 1
       battery: 34
     triggerEvents:
       reachable: 1
       battery: 34
     triggerEventsState:
       reachable: 1
       battery: 34
   internals:
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
     6          -1
     7          6
   intervalfunc:
   intervaltimer:
   localtime:
     0          1580746149
     1          1580756400
     2          1580756400
     3          1580763600
     4          1580794200
     5          1580799004
     6          1580763600
     7          1580770800
   perlblock:
   readings:
   realtime:
     0          17:09:09
     1          20:00:00
     2          20:00:00
     3          22:00:00
     4          06:30:00
     5          07:50:04
     6          22:00:00
     7          00:00:00
   time:
     0          {sunset("REAL")}
     1          20:00:00
     2          20:00:00
     3          22:00:00
     4          06:30:00
     5          {sunrise("REAL")}
     6          22:00:00
     7          00:00:00
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
     6          3
     7          3
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   timers:
   trigger:
     all         FL_OG_PIR
   triggertime:
     1580746149:
       localtime  1580746149
       hash:
     1580756400:
       localtime  1580756400
       hash:
     1580763600:
       localtime  1580763600
       hash:
     1580770800:
       localtime  1580770800
       hash:
     1580794200:
       localtime  1580794200
       hash:
     1580799004:
       localtime  1580799004
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   wait       0,60,120,120:0,60,90:0,60,90:0,61


Im Großen und Ganzen funktioniert das ja. Nur es gibt Probleme, wenn es z.B. zeitlich einen Übergang in einen anderen Zweig gibt. Also z.B. Zeit ist nun kurz nach, der Ablauf wurde ein paar Sekunden bis  sunrise(REAL) über den PIR getriggert. Erkennt nun der PIR nochmals kurz nach sunrise(REAL) während der Ablauf noch nicht zu Ende ist, dann bleibt die HUEDevice7 an und schaltet nicht mehr aus. Es wird also wohl der wait Timer abgebrochen. Ich hatte schon mit set HUEDevice7 on-for-time statt set HUEDevice7 on experimentiert, nur interessiert sich das IKEA Leuchtmittel nicht dafür. Es schaltet ein und das wars. Hat jemand eine Idee?

Viele Grüße

Martin
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: maddinthebrain am 04 Februar 2020, 08:33:45
Niemand?

Wie kann ich denn den Abbruch der Wait-Timer abfangen? Über den DOELSE Pfad der im Moment leer ist?

Gruß und Dank

Martin
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: Damian am 04 Februar 2020, 09:36:32
Zitat von: maddinthebrain am 04 Februar 2020, 08:33:45
Niemand?

Wie kann ich denn den Abbruch der Wait-Timer abfangen? Über den DOELSE Pfad der im Moment leer ist?

Gruß und Dank

Martin

Du musst dafür Sorge tragen, dass kein anderer Zweig zuschlägt.

DOELSE muss dann raus.
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: maddinthebrain am 04 Februar 2020, 10:42:47
ZitatDu musst dafür Sorge tragen, dass kein anderer Zweig zuschlägt.

DOELSE muss dann raus.

Nur das führt wieder zu anderen Problemen: Wenn der PIR wieder eine Bewegung erkennt und dann logischerweise die Lampe wieder heller leuchten soll, würde das nicht gehen... Hmm, und hier beißt sich die Katze in den Schwanz.  ???

Einfache Anforderung, schwierige Umsetzung...
Titel: Antw:Lichtsteuerung tageszeitabhängig und mit PIR
Beitrag von: Damian am 04 Februar 2020, 14:58:38
Alternative 1

Statt DOELSE ein DOELSIF mit zusätzlichen Zustandsabfragen, dass kein unerwünschter Abbruch stattfindet.

Alternative 2

Mehrere DOIF´s definieren.