Lichtsteuerung tageszeitabhängig und mit PIR

Begonnen von maddinthebrain, 06 Januar 2020, 18:26:25

Vorheriges Thema - Nächstes Thema

maddinthebrain

    Hallo zusammen,

    ich setze als Zigbee Gateway den Conbee Stick ein. Dies funzt sehr gut. Die zur Konfiguration des Conbee Sticks verwendete Phoscon Software kann einfache Dinge schon selbst automatisieren. Leider ist das für einen Einsatz bei mir nicht mehr ausreichend. Daher möchte ich dies FHEM machen lassen.

    Es ist folgendes Einsatzszenario:
    Eine LED Stehlampe dimmbar (HUEDevice7) soll ausgelöst durch einen Bewegungsmelder (FL_OG_PIR) angehen

    • jedoch nur von Sonnenuntergang bis 22:00 mit 100% Helligleit
    • ab 22:00 bis 0:00 Uhr mit nur noch 50%
  • ansonsten gar nicht

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
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

Damian

#1
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

roedert

#2
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)

maddinthebrain

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

Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

KyleK

Das geht, indem eine Sequenz von commands pro Zweig gesetzt wird, ein Beispiel findest du hier: https://fhem.de/commandref_DE.html#DOIF_wait
FHEM on Raspberry Pi 3B+
CUL868
7x MAX! Thermostat, 8x MAX! Fensterkontakte
Conbee II + deConz, TradFri Lampen, Osram Smart+ Steckdosen

maddinthebrain

Perfekt, das war genau, was ich gesucht habe. Viele Dank!
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

maddinthebrain

#6
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
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

maddinthebrain

Niemand?

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

Gruß und Dank

Martin
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

maddinthebrain

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...
Viele Grüße
Martin

Futro mit Proxmox und Debian: FHEM, Signalduino 433MHz & 868MHz, MAX!, WeeWX, FHEM2FHEM,
Raspi 4 mit ConBee mit deCONZ und Phoscon für ZigBee Aktoren und Sensoren

Damian

Alternative 1

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

Alternative 2

Mehrere DOIF´s definieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF