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
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.
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)
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
Das geht, indem eine Sequenz von commands pro Zweig gesetzt wird, ein Beispiel findest du hier: https://fhem.de/commandref_DE.html#DOIF_wait
Perfekt, das war genau, was ich gesucht habe. Viele Dank!
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
Niemand?
Wie kann ich denn den Abbruch der Wait-Timer abfangen? Über den DOELSE Pfad der im Moment leer ist?
Gruß und Dank
Martin
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.
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...
Alternative 1
Statt DOELSE ein DOELSIF mit zusätzlichen Zustandsabfragen, dass kein unerwünschter Abbruch stattfindet.
Alternative 2
Mehrere DOIF´s definieren.