Hallo zusammen,
ich habe eine 4-flutige Esstischlampe, ausgestattet mit 4 Tradfri Ikea Birnchen, die jeweils als eigenes Device in FHEM integriert sind und seit Januar 2020 ihren Dienst als Gruppenverband zuverlässig verrichten.
Nun möchte ich zum Spaß, um Frau & Kinder zu erschrecken, gern diese 4 Devices nutzen, um ein Lauflicht mit FHEM zu realisieren. Damit meine ich, dass ich z.B. auf einen virtuellen Taster drücke, und dann Birne 1 von 0% auf 100% Helligkeit ansteigt, Birne 2 ebenfalls danach usw. Das Ganze soll primär erstmal funktionieren, sekundär auch noch cool aussehen, d.h. die optisch sichtbaren Helligkeitsübergänge sollten "smooth" wirken (z.B. beginnt Birne 2 bereits heller zu werden, während Birne 1 erst bei ~50% Helligkeit angelangt ist) ähnlich wie in den 80ern das rote Lauflicht bei K.I.T.T aus der Serie Knight Rider 8) Einziger Unterschied: das Lauflicht soll nicht hin und her wandern, sondern nach Zyklusende von Birne 4 wieder bei Birne 1 beginnen.
Leider habe ich überhaupt keine Idee, wie ich diese Ablaufkette realisieren soll und wäre um Ratschläge dankbar.
Erste eigene Gedanken:
- Dummy für das Ein-/ Ausschalten der Sequenz
- für jede Birne ein eigenes DOIF
-- DOIF1: Wenn Dummy=ON, Birne1 auf 100% Helligkeit setzen; Birne1 auf 0% wenn Birne2=ON
-- DOIF2: Wenn Dummy=ON, Wait=0,5 Sek, danach Birne2 auf 100% Helligkeit; Birne2 auf 0% wenn Birne3=ON
-- DOIF3: Wenn Dummy=ON, wait=1,0 Sek, danach Birne3 auf 100; Birne3 auf 0% wenn Birne 4=ON
-- DOIF4: Wenn Dummy=ON, wait=1,5 Sek, danach Birne4 auf 100; Birne4 auf 0% wenn Birne 1=ON
usw.
Lustige Idee, das würde auch in einem DOIF gehen - sogar in einem cmd. Pseudocode:
DOIF (DUMMY eq "on")
(SET BIRNE1 100%)
(SET BIRNE2 100%)
(SET BIRNE1 0%, SET BIRNE3 100%)
(SET BIRNE2 0%, SET BIRNE4 100%)
(SET BIRNE4 0%)
Attribute:
wait 0,1,1,1,1:
do always
https://fhem.de/commandref_DE.html#DOIF_wait
Hi,
Tradfri kann sowas halt nicht selbstständig sprich FHEM hat den Hut auf und gibt die Kommandos/Sequenzen vor und das kann schon zu ordentlich last führen, Tradfri ist da nicht das schnellste :-)
Du kannst das in ein DOIF packen, entweder mit Abfrage der vorherigen Lampe, dazu ist Tradfri aber vermutlich zu langsam oder halt hardcodiert in Sekunden.
([irgendwas zum starten z.b. [dummy_licht] eq "on")
(set lampe1 100%)
PS: ah ich sehe yersinia hatte ne ähnliche idee :-)
(set lampe2 100%)
(set lampe 1 0%)
(set lampe3 100%)
(set lampe2 0%)
(set lampe 4 100%)
(set lampe 3 0%)
(set Lampe 4 0%)
mit dem Attribut wait kannst du die verschiedenen (set lampe) "unterteilen" hier mal 2 Sekunden Abstand (0 für die erste lampe):
wait 0,2,2,2,2,2,2,2
mit repeatcmd kannst das ganze dann auch wiederholen solange dummy_licht auf on ist
Probiers mal aus, ich denke aber Tradfri wird sich da verschlucken :-)
Moin zusammen,
danke für die Tips, ich habe mal etwas rumprobiert gestern abend:
Internals:
DEF ([Lauflichtschalter:state] eq "on") (set HUEDevice5 100%) (set HUEDevice6 100%) (set HUEDevice7 100%, set HUEDevice5 0%) (set HUEDevice8 100%, set HUEDevice6 0%) (set HUEDevice7 0%) (set HUEDevice8 0%)
FUUID 5f4fc664-f33f-4dec-a473-15a60c61f9f018c2
MODEL FHEM
NAME doif_Lauflicht
NOTIFYDEV Lauflichtschalter,global
NR 121
NTFY_ORDER 50-doif_Lauflicht
STATE cmd_1
TYPE DOIF
VERSION 22030 2020-05-25 14:10:16
READINGS:
2020-09-03 06:50:48 Device Lauflichtschalter
2020-09-03 06:50:46 cmd 1.6
2020-09-03 06:50:46 cmd_event Lauflichtschalter
2020-09-03 06:50:46 cmd_nr 1
2020-09-03 06:50:46 cmd_seqnr 6
2020-09-03 06:50:48 e_Lauflichtschalter_state off
2020-09-02 18:32:56 mode enabled
2020-09-03 06:50:46 state cmd_1
2020-09-03 06:50:46 wait_timer no timer
Regex:
accu:
cond:
Lauflichtschalter:
0:
state ^Lauflichtschalter$:^state:
attr:
cmdState:
wait:
0:
0
2
2
2
2
2
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Lauflichtschalter','state') eq "on"
do:
0:
0 set HUEDevice5 100%
1 set HUEDevice6 100%
2 set HUEDevice7 100%, set HUEDevice5 0%
3 set HUEDevice8 100%, set HUEDevice6 0%
4 set HUEDevice7 0%
5 set HUEDevice8 0%
1:
helper:
DEVFILTER ^global$|^Lauflichtschalter$
NOTIFYDEV global|Lauflichtschalter
event off
globalinit 1
last_timer 0
sleepdevice Lauflichtschalter
sleepsubtimer -1
sleeptimer -1
timerdev Lauflichtschalter
timerevent on
triggerDev Lauflichtschalter
timerevents:
on
timereventsState:
state: on
triggerEvents:
off
triggerEventsState:
state: off
internals:
perlblock:
readings:
all Lauflichtschalter:state
trigger:
uiState:
uiTable:
Attributes:
do always
room Befehle
wait 0,2,2,2,2,2
Die Birnchen werden der Reihe nach im Abstand von 2 Sekunden eingeschaltet und es wird versucht, diese auch wieder auszuschalten, ABER: Nach dem ersten Durchlauf stoppt die Sequenz und alle Birnen beinhalten in FHEM noch den Status Helligkeit=1%, ergo ist keine Lampe richtig aus gegangen.
Ich poste noch schnell den Event-Monitor Abschnitt und muss jetzt erstmal zur Arbeit :-)
Zitat
2020-09-03 06:54:07 DOIF doif_Lauflicht cmd_nr: 1
2020-09-03 06:54:07 DOIF doif_Lauflicht cmd_seqnr: 1
2020-09-03 06:54:07 DOIF doif_Lauflicht cmd: 1.1
2020-09-03 06:54:07 DOIF doif_Lauflicht cmd_event: Lauflichtschalter
2020-09-03 06:54:07 DOIF doif_Lauflicht cmd_1_1
2020-09-03 06:54:07 DOIF doif_Lauflicht wait_timer: 03.09.2020 06:54:09 cmd_1_2 Lauflichtschalter
2020-09-03 06:54:07 dummy Lauflichtschalter on
2020-09-03 06:54:07 HUEDevice HUEDevice5 bri: 100
2020-09-03 06:54:07 HUEDevice HUEDevice5 onoff: 1
2020-09-03 06:54:07 HUEDevice HUEDevice5 pct: 39
2020-09-03 06:54:07 HUEDevice HUEDevice5 dim37%
2020-09-03 06:54:07 HUEDevice HUEGroup2 any_on: 1
2020-09-03 06:54:07 HUEDevice HUEDevice5 bri: 2
2020-09-03 06:54:07 HUEDevice HUEDevice5 pct: 1
2020-09-03 06:54:07 HUEDevice HUEDevice5 dim06%
2020-09-03 06:54:08 HUEDevice HUEDevice5 bri: 100
2020-09-03 06:54:08 HUEDevice HUEDevice5 pct: 39
2020-09-03 06:54:08 HUEDevice HUEDevice5 dim37%
2020-09-03 06:54:09 DOIF doif_Lauflicht wait_timer: no timer
2020-09-03 06:54:09 DOIF doif_Lauflicht cmd_nr: 1
2020-09-03 06:54:09 DOIF doif_Lauflicht cmd_seqnr: 2
2020-09-03 06:54:09 DOIF doif_Lauflicht cmd: 1.2
2020-09-03 06:54:09 DOIF doif_Lauflicht cmd_event: Lauflichtschalter
2020-09-03 06:54:09 DOIF doif_Lauflicht cmd_1_2
2020-09-03 06:54:09 DOIF doif_Lauflicht wait_timer: 03.09.2020 06:54:11 cmd_1_3 Lauflichtschalter
2020-09-03 06:54:09 HUEDevice HUEDevice6 bri: 100
2020-09-03 06:54:09 HUEDevice HUEDevice6 onoff: 1
2020-09-03 06:54:09 HUEDevice HUEDevice6 pct: 39
2020-09-03 06:54:09 HUEDevice HUEDevice6 dim37%
2020-09-03 06:54:09 HUEDevice HUEDevice6 bri: 2
2020-09-03 06:54:09 HUEDevice HUEDevice6 pct: 1
2020-09-03 06:54:09 HUEDevice HUEDevice6 dim06%
2020-09-03 06:54:10 HUEDevice HUEDevice6 bri: 100
2020-09-03 06:54:10 HUEDevice HUEDevice6 pct: 39
2020-09-03 06:54:10 HUEDevice HUEDevice6 dim37%
2020-09-03 06:54:11 DOIF doif_Lauflicht wait_timer: no timer
2020-09-03 06:54:11 DOIF doif_Lauflicht cmd_nr: 1
2020-09-03 06:54:11 DOIF doif_Lauflicht cmd_seqnr: 3
2020-09-03 06:54:11 DOIF doif_Lauflicht cmd: 1.3
2020-09-03 06:54:11 DOIF doif_Lauflicht cmd_event: Lauflichtschalter
2020-09-03 06:54:11 DOIF doif_Lauflicht cmd_1_3
2020-09-03 06:54:11 DOIF doif_Lauflicht wait_timer: 03.09.2020 06:54:13 cmd_1_4 Lauflichtschalter
2020-09-03 06:54:11 HUEDevice HUEDevice5 bri: 0
2020-09-03 06:54:11 HUEDevice HUEDevice5 pct: 1
2020-09-03 06:54:11 HUEDevice HUEDevice5 dim06%
2020-09-03 06:54:11 HUEDevice HUEDevice7 bri: 100
2020-09-03 06:54:11 HUEDevice HUEDevice7 onoff: 1
2020-09-03 06:54:11 HUEDevice HUEDevice7 pct: 39
2020-09-03 06:54:11 HUEDevice HUEDevice7 dim37%
2020-09-03 06:54:11 HUEDevice HUEDevice7 bri: 2
2020-09-03 06:54:11 HUEDevice HUEDevice7 pct: 1
2020-09-03 06:54:11 HUEDevice HUEDevice7 dim06%
2020-09-03 06:54:11 HUEDevice HUEDevice5 bri: 1
2020-09-03 06:54:12 HUEDevice HUEDevice7 bri: 100
2020-09-03 06:54:12 HUEDevice HUEDevice7 pct: 39
2020-09-03 06:54:12 HUEDevice HUEDevice7 dim37%
2020-09-03 06:54:13 DOIF doif_Lauflicht wait_timer: no timer
2020-09-03 06:54:13 DOIF doif_Lauflicht cmd_nr: 1
2020-09-03 06:54:13 DOIF doif_Lauflicht cmd_seqnr: 4
2020-09-03 06:54:13 DOIF doif_Lauflicht cmd: 1.4
2020-09-03 06:54:13 DOIF doif_Lauflicht cmd_event: Lauflichtschalter
2020-09-03 06:54:13 DOIF doif_Lauflicht cmd_1_4
2020-09-03 06:54:13 DOIF doif_Lauflicht wait_timer: 03.09.2020 06:54:15 cmd_1_5 Lauflichtschalter
2020-09-03 06:54:13 HUEDevice HUEDevice6 bri: 0
2020-09-03 06:54:13 HUEDevice HUEDevice6 pct: 1
2020-09-03 06:54:13 HUEDevice HUEDevice6 dim06%
2020-09-03 06:54:13 HUEDevice HUEDevice8 bri: 100
2020-09-03 06:54:13 HUEDevice HUEDevice8 onoff: 1
2020-09-03 06:54:13 HUEDevice HUEDevice8 pct: 39
2020-09-03 06:54:13 HUEDevice HUEDevice8 dim37%
2020-09-03 06:54:13 HUEDevice HUEGroup2 all_on: 1
2020-09-03 06:54:13 HUEDevice HUEDevice8 bri: 2
2020-09-03 06:54:13 HUEDevice HUEDevice8 pct: 1
2020-09-03 06:54:13 HUEDevice HUEDevice8 dim06%
2020-09-03 06:54:13 HUEDevice HUEDevice6 bri: 1
2020-09-03 06:54:13 ESPEasy ESPEasy_ESP_Easy1_am2302_sensor presence: present
2020-09-03 06:54:13 ESPEasy ESPEasy_ESP_Easy1_am2302_sensor hum: 49.8 tem: 23.3
2020-09-03 06:54:14 HUEDevice HUEDevice8 bri: 100
2020-09-03 06:54:14 HUEDevice HUEDevice8 pct: 39
2020-09-03 06:54:14 HUEDevice HUEDevice8 dim37%
2020-09-03 06:54:15 DOIF doif_Lauflicht wait_timer: no timer
2020-09-03 06:54:15 DOIF doif_Lauflicht cmd_nr: 1
2020-09-03 06:54:15 DOIF doif_Lauflicht cmd_seqnr: 5
2020-09-03 06:54:15 DOIF doif_Lauflicht cmd: 1.5
2020-09-03 06:54:15 DOIF doif_Lauflicht cmd_event: Lauflichtschalter
2020-09-03 06:54:15 DOIF doif_Lauflicht cmd_1_5
2020-09-03 06:54:15 DOIF doif_Lauflicht wait_timer: 03.09.2020 06:54:17 cmd_1_6 Lauflichtschalter
2020-09-03 06:54:15 HUEDevice HUEDevice7 bri: 0
2020-09-03 06:54:15 HUEDevice HUEDevice7 pct: 1
2020-09-03 06:54:15 HUEDevice HUEDevice7 dim06%
2020-09-03 06:54:15 HUEDevice HUEDevice7 bri: 1
2020-09-03 06:54:17 DOIF doif_Lauflicht wait_timer: no timer
2020-09-03 06:54:17 DOIF doif_Lauflicht cmd_nr: 1
2020-09-03 06:54:17 DOIF doif_Lauflicht cmd_seqnr: 6
2020-09-03 06:54:17 DOIF doif_Lauflicht cmd: 1.6
2020-09-03 06:54:17 DOIF doif_Lauflicht cmd_event: Lauflichtschalter
2020-09-03 06:54:17 DOIF doif_Lauflicht cmd_1
2020-09-03 06:54:17 HUEDevice HUEDevice8 bri: 0
2020-09-03 06:54:17 HUEDevice HUEDevice8 pct: 1
2020-09-03 06:54:17 HUEDevice HUEDevice8 dim06%
2020-09-03 06:54:17 HUEDevice HUEDevice8 bri: 1
Hi,
auf die schnelle:
Versuche es mal mit set off anstatt der 0%
Und ergänze das Doif noch um repeatcmd
Hey das funktioniert, super.
Auch habe ich die Timings auf 0.5 Sekunden pro Befehl reduzieren können und die Lampen reagieren fein.
Einzig die Wiederholung des doif verstehe ich noch nicht so ganz. Mit dem Attribut repeatcmd =1 läuft die Sequenz endlos wie eine Schleife durch, aber scheinbar wird die Bedingung (Lauflichtschalter =on) nicht mehr abgefragt, da sich das doif nicht mehr stoppen lässt. Da muss ich mich nachher nochmal reindenken, wo meine Fehler sind.
edit:
Attribut do always gelöscht, jetz läufts.
Ich bastel noch etwas herum und werde Euch abends eine YT-Sequenz einstellen
Guten Morgen, hier das optische Ergebnis bisher
https://youtu.be/ts2G_GSRSPA
Moin,
sehr schön, welches Gateway etc nutzt du da?
Bei mir läuft FHEM auf einem Raspberry Pi 4 mit einem ConBee II USB-Stick. Das ist mein einziges zigbee Gateway; ich hatte nie ein anderes. Damit läuft Tradfri, eine HUE-Lampe und diverse Aqara Sensoren
Ich habe die Timings auf 0,4 Sek runtersetzen können und weiterhin die Befehle auf
set HUEDevice6 pct 100
geändert. Letzteres bewirkt, dass jede Birne ganz kurz volle Helligkeit erreicht und der optische Effekt besser wirkt, als auf dem YT-Video (Stand: gestern abend).
Wo ich mich gedanklich schwer tue, ist, wie die Befehlsreihenfolge verändert werden müsste, damit nach Abschluss der Sequenz der Restart schneller geht.
Aktuell siehts so aus:
0 set HUEDevice5 pct 100
1 set HUEDevice6 pct 100
2 set HUEDevice7 pct 100, set HUEDevice5 off
3 set HUEDevice8 pct 100, set HUEDevice6 off
4 set HUEDevice7 off
5 set HUEDevice8 off
Theoretisch würde ich die letzte Zeile ändern wollen:
5 set HUEDevice8 off, set HUEDevice5 pct 100
damit die erste Birne bereits wieder startet. Jedoch müsste ab dem zweiten Durchlauf die erste Befehlszeile ignoriert werden ???
Zuviel Gehirnschmalz soll auch nicht hineinfliessen, es bleibt ein Spaß. Eventuell wäre dieser Effekt ganz nützlich als parallel optische Anzeige, wenn die Haustürklingel betätigt wurde (welche noch nicht smart ist bei mir)
Sowas ähnliches habe ich in einem langen Flur gebaut, aber nicht, um Leute zu erschrecken, sondern um das Licht (einzelne Strahler) der Person die durch den Flur geht, folgen zu lassen. Es muss schließlich nicht über die gesamte Zeit der gesamte Flur beleuchtet sein. Dafür habe ich die Lampen in eine structure gepackt und entscheide am Anfang und Ende des Flurs mittels jeweils einem Bewegungsmelder die Laufrichtung.
Funktioniert seit langem völlig zuverlässig.
Lustige Idee!
@Dracolein: magst du mal deinen aktuellen Code posten?
Zitat von: betateilchen am 04 September 2020, 09:02:28
Sowas ähnliches habe ich in einem langen Flur gebaut, aber nicht, um Leute zu erschrecken, sondern um das Licht (einzelne Strahler) der Person die durch den Flur geht, folgen zu lassen. Es muss schließlich nicht über die gesamte Zeit der gesamte Flur beleuchtet sein. Dafür habe ich die Lampen in eine structure gepackt und entscheide am Anfang und Ende des Flurs mittels jeweils einem Bewegungsmelder die Laufrichtung.
Funktioniert seit langem völlig zuverlässig.
Coole Idee vom Grundsatz.
Wenn die Person jedoch sich mitten im Flur umdreht, kannst du diesen Fall nicht abfangen, oder?
Die Idee eines Lauflichts kenne ich sonst nur von Treppenstufen, die nacheinander wellenförmig beleuchtet werden. Sowas finde ich auch mega, zumal ich endlos Treppenstufen hätte. Aber der Installationsaufwand ist mir viel zu groß.
Zitat von: Mitch am 04 September 2020, 10:23:11
Lustige Idee!
@Dracolein: magst du mal deinen aktuellen Code posten?
Dummy Lauflichtschalter:
Internals:
FUUID 5f4fc600-f33f-4dec-6071-13aaea661b21f5bd
NAME Lauflichtschalter
NR 120
STATE off
TYPE dummy
READINGS:
2020-09-04 07:34:43 state off
Attributes:
genericDeviceType switch
room Befehle,Homekit
setList on off
webCmd on:off
DOIF Lauflicht:
Internals:
DEF ([Lauflichtschalter:state] eq "on") (set HUEDevice5 pct 100) (set HUEDevice6 pct 100) (set HUEDevice7 pct 100, set HUEDevice5 off) (set HUEDevice8 pct 100, set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off) DOELSEIF ([Lauflichtschalter:state] eq "off") (set HUEDevice5 off) (set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off)
FUUID 5f4fc664-f33f-4dec-a473-15a60c61f9f018c2
MODEL FHEM
NAME doif_Lauflicht
NOTIFYDEV Lauflichtschalter,global
NR 121
NTFY_ORDER 50-doif_Lauflicht
STATE cmd_2
TYPE DOIF
VERSION 22030 2020-05-25 14:10:16
READINGS:
2020-09-04 07:34:43 Device Lauflichtschalter
2020-09-04 07:34:43 cmd 2.4
2020-09-04 07:34:43 cmd_event Lauflichtschalter
2020-09-04 07:34:43 cmd_nr 2
2020-09-04 07:34:43 cmd_seqnr 4
2020-09-04 07:34:43 e_Lauflichtschalter_state off
2020-09-04 07:33:18 mode enabled
2020-09-04 07:34:43 state cmd_2
2020-09-04 07:34:43 wait_timer no timer
Regex:
accu:
cond:
Lauflichtschalter:
0:
state ^Lauflichtschalter$:^state:
1:
state ^Lauflichtschalter$:^state:
attr:
cmdState:
repeatcmd:
1
wait:
0:
0
0.4
0.4
0.4
0.4
0.4
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Lauflichtschalter','state') eq "on"
1 ::ReadingValDoIf($hash,'Lauflichtschalter','state') eq "off"
do:
0:
0 set HUEDevice5 pct 100
1 set HUEDevice6 pct 100
2 set HUEDevice7 pct 100, set HUEDevice5 off
3 set HUEDevice8 pct 100, set HUEDevice6 off
4 set HUEDevice7 off
5 set HUEDevice8 off
1:
0 set HUEDevice5 off
1 set HUEDevice6 off
2 set HUEDevice7 off
3 set HUEDevice8 off
2:
helper:
DEVFILTER ^global$|^Lauflichtschalter$
NOTIFYDEV global|Lauflichtschalter
event off
globalinit 1
last_timer 0
sleepdevice Lauflichtschalter
sleepsubtimer 3
sleeptimer -1
timerdev Lauflichtschalter
timerevent off
triggerDev Lauflichtschalter
DOIF_eventa:
cmd_nr: 2
cmd_seqnr: 4
cmd_event: Lauflichtschalter
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd_seqnr: 4
cmd_event: Lauflichtschalter
state: cmd_2
timerevents:
off
timereventsState:
state: off
triggerEvents:
off
triggerEventsState:
state: off
internals:
readings:
all Lauflichtschalter:state
trigger:
uiState:
uiTable:
Attributes:
repeatcmd 1
room Befehle
wait 0,0.4,0.4,0.4,0.4,0.4
Zitat von: Dracolein am 04 September 2020, 10:32:08
Coole Idee vom Grundsatz.
Wenn die Person jedoch sich mitten im Flur umdreht, kannst du diesen Fall nicht abfangen, oder?
Doch. Wenn nicht innerhalb einer bestimmten Zeit der zweite Bewegungsmelder auslöst, greift ein watchdog und schaltet sicherheitshalber die gesamte Beleuchtung ein.
Ich hätte noch eine weitere Frage, um diesem Mini-Projekt tatsächlich ein wenig Sinn zu verleihen:
Angenommen meine Haustürklingel schaltet diese DOIF-Lauflichtsequenz für eine eine Zeit t=10 Sekunden ein. So endet diese Sequenz immer damit, dass alle 4 Birnen am Ende abgeschaltet werden. Soweit so gut. Nun besteht die Möglichkeit, dass die Esstischlampe abends ganz normal eingeschaltet ist, während das besagte Event ausgelöst wird und die Lampe ihre Lauflichtsequenz beginnt, durchläuft und mit vollständig ausgeschalteter Lampe endet.
Wie schaffe ich es, dass die Lampe nach Ende der Lauflichtsequenz in ihren vorherigen Zustand zurückkehrt ?
Das Reading "pct" jeder Birne dient als Referenz zur Speicherung des jeweiligen Ist-Zustands (falls Lampe aus ist: pct=0, sonst pct=Dimmstufe in Prozent). Theoretisch müsste ich mein obiges DOIF verändern, dass besagtes HUEDevice-Reading zunächst irgendwo zwischengespeichert wird, danach die Lauflichtsequenz abgespult wird und zum Abschluss der Ursprungsstatus wieder hergestellt wird.
Nun habe ich mir aus diversen Beispielen folgende Puzzleteile zusammengebaut:
Istwerte auslesen und auf neuen Readings abspeichern:
(setreading HUEDevice5 last_pct [HUEDevice5:pct], setreading HUEDevice6 last_pct [HUEDevice6:pct], setreading HUEDevice7 last_pct [HUEDevice7:pct], setreading HUEDevice8 last_pct [HUEDevice8:pct])
Gespeicherte Werte wieder zurück übertragen auf alle 4 Birnen:
(set HUEDevice5 pct [HUEDevice5:last_pct], set HUEDevice6 pct [HUEDevice6:last_pct], set HUEDevice7 pct [HUEDevice7:last_pct], set HUEDevice8 pct [HUEDevice8:last_pct])
Wären diese Codeschnipsel korrekt und innerhalb eines DOIF nutzbar, oder muss ich mit{ReadingsVAL...} arbeiten?
Weiterhin kann ich diese Puzzleteile nicht einfach in obiges Doif einfügen, sondern muss das irgendwie verschachteln. Andernfalls würden bei jedem Sequenzdurchlauf die Readings gelesen & überschrieben werden. Hier scheitere ich derzeit noch gedanklich und hoffe auf Tips. Im Prinzip bräuchte ich ein Konstrukt
WENN Lauflichtschalter=on DANN werte zwischenspeichern, Sequenz endlos abspielen
WENN Lauflichtschalter=off DANN sequenz beenden, werte zurückspeichern
WENN Haustürklingel=on DANN werte zwischenspeichern, Sequenz für 10 Sekunden abspielen, danach Werte zurückspeichern
Geht das alles in einem einzigen DOIF ?
Zitat von: Dracolein am 04 September 2020, 12:11:57
Ich hätte noch eine weitere Frage, um diesem Mini-Projekt tatsächlich ein wenig Sinn zu verleihen:
Angenommen meine Haustürklingel schaltet diese DOIF-Lauflichtsequenz für eine eine Zeit t=10 Sekunden ein. So endet diese Sequenz immer damit, dass alle 4 Birnen am Ende abgeschaltet werden. Soweit so gut. Nun besteht die Möglichkeit, dass die Esstischlampe abends ganz normal eingeschaltet ist, während das besagte Event ausgelöst wird und die Lampe ihre Lauflichtsequenz beginnt, durchläuft und mit vollständig ausgeschalteter Lampe endet.
Wie schaffe ich es, dass die Lampe nach Ende der Lauflichtsequenz in ihren vorherigen Zustand zurückkehrt ?
Das Reading "pct" jeder Birne dient als Referenz zur Speicherung des jeweiligen Ist-Zustands (falls Lampe aus ist: pct=0, sonst pct=Dimmstufe in Prozent). Theoretisch müsste ich mein obiges DOIF verändern, dass besagtes HUEDevice-Reading zunächst irgendwo zwischengespeichert wird, danach die Lauflichtsequenz abgespult wird und zum Abschluss der Ursprungsstatus wieder hergestellt wird.
Nun habe ich mir aus diversen Beispielen folgende Puzzleteile zusammengebaut:
Istwerte auslesen und auf neuen Readings abspeichern:
(setreading HUEDevice5 last_pct [HUEDevice5:pct], setreading HUEDevice6 last_pct [HUEDevice6:pct], setreading HUEDevice7 last_pct [HUEDevice7:pct], setreading HUEDevice8 last_pct [HUEDevice8:pct])
Gespeicherte Werte wieder zurück übertragen auf alle 4 Birnen:
(set HUEDevice5 pct [HUEDevice5:last_pct], set HUEDevice6 pct [HUEDevice6:last_pct], set HUEDevice7 pct [HUEDevice7:last_pct], set HUEDevice8 pct [HUEDevice8:last_pct])
Wären diese Codeschnipsel korrekt und innerhalb eines DOIF nutzbar, oder muss ich mit{ReadingsVAL...} arbeiten?
Weiterhin kann ich diese Puzzleteile nicht einfach in obiges Doif einfügen, sondern muss das irgendwie verschachteln. Andernfalls würden bei jedem Sequenzdurchlauf die Readings gelesen & überschrieben werden. Hier scheitere ich derzeit noch gedanklich und hoffe auf Tips. Im Prinzip bräuchte ich ein Konstrukt
WENN Lauflichtschalter=on DANN werte zwischenspeichern, Sequenz endlos abspielen
WENN Lauflichtschalter=off DANN sequenz beenden, werte zurückspeichern
WENN Haustürklingel=on DANN werte zwischenspeichern, Sequenz für 10 Sekunden abspielen, danach Werte zurückspeichern
Geht das alles in einem einzigen DOIF ?
Im Prinzip geht vieles, allerdings bist du im DOIF-FHEM-Modus auf eine flache Hierarchie der Form if ... elseif ... elseif ... beschränkt. Irgendwann musst du mehr tricksen als programmieren, damit es funktioniert.
Wenn die Sache komplexer wird, dann musst du die Aufgabe auf mehrere Module verteilen oder im DOIF-Perl-Modus programmieren. Dort kannst du innerhalb eines Moduls beliebige Komplexität unterbringen, allerdings musst du dir etwas Perl und das Konzept des DOIF-Perl-Modus mit Perlblöcken, Variablen, Timern usw. erst einmal klar machen.
So würde eine "programmierte" Lösung aussehen:
defmod lauflicht DOIF subs \
{\
@{$_a}=qw/lamp1 lamp2 lamp3/;; # Liste mit Lampen\
$_max_repeat=5;; # Maximale Anzahl der Durchläufe\
$_delay=0.5;; # Verzögerung\
\
@{$_state}=();; # Liste für Status der Lampen\
$_counter=0;; # Zähler wird auf den ersten Wert gesetzt\
$_repeat=0;; # Nummer der Durchlaufs\
\
sub lauflicht { # Funktion zum Schalten der Lampen\
if ($_repeat == $_max_repeat) { # Wenn maximale Anzahl der Wiederholungen erreicht\
set_states();; # Status der Lampen wiederherstellen\
return;; # Ende\
}\
if ($_counter == @{$_a}) { # letzte Lampe erreicht\
fhem_set ($_a[@{$_a}-1]." off");;\
$_counter=0;;\
$_repeat++;;\
}\
fhem_set ($_a[$_counter]." on");;\
fhem_set ($_a[$_counter-1]." off") if ($_counter > 0) ;;\
$_counter++;;\
set_Exec("Timer",$_delay,'lauflicht');; # Timer für den nächsten Schaltvorgang setzen\
}\
\
sub save_states { \
for ($i=0;;$i<@{$_a};;$i++) {$_state[$i]=ReadingsVal($_a[$i],"state","")};; # Status der Lampen sichern\
for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] off")};; # alle Lampen ausschalten\
}\
\
sub set_states { # Status der Lampen wiederherstellen\
for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] $_state[$i]")};;\
$_counter=0;;\
$_repeat=0;;\
}\
}\
\
{## ["Taster:on"];; # Aktion zum Staten des Lauflichts \
save_states();; # Merke Status der Lampen\
lauflicht();; # Lauflicht starten\
}\
\
{## ["Taster:off"];; # Aktion zum Beenden des Lauflichts\
del_Exec("Timer");; # Timer löschen\
set_states();; # Status der Lampen wiederherstellen\
}
attr lauflicht room DOIF_Labor
Die Angaben zu Lampen, Anzahl der Durchläufe und die Verzögerung werden am Anfang definiert. Die Aktion zum Starten oder vorzeitigen Beenden wird am Ende im jeweiligen Block definiert (Taster:on/off).
Testen kann man es mit Dummys lamp1, lamp2, lamp3. Starten des Lauflichts mit set lauflicht block_01, vorzeitiges Beenden mit set lauflicht block_02.
Die Lampen werden immer auf ihren ursprünglichen Zustand zurückgesetzt.
Hallo, ich nochmal.
Inzwischen habe ich unsere 20 jahre alte Haustürklingel ganz simpel per 12VAC Relais und einem batteriebetriebenen Zigbee Türkontakt in FHEM integriert.
Kleines Problem: Beim Auslösen der Klingel werden kurzzeitig ganz viele Statusänderungen des Zigbee-Devices an FHEM übertragen, weil die Spule natürlich flickert.
Jetzt bin ich am überlegen, wie ich mein Lauflicht mit dem Klingelsignal kombinieren kann unter Verwendung des hier gebastelten DOIFs. Mein Problem: Sobald die Bedingung des DOIF-Befehls erlischt, bricht natürlich auch meine Lauflicht-Ablaufkette mittendrin ab, sodass manchmal eine Birne nicht abschaltet.
Jetzt könnte ich irgendwie versuchen, die Bedingung mit einem Timer zu kombinieren und die Zeit per trial&error genau abzupassen, sodass alle Birnen noch abgeschaltet werden; aber gibt es nicht eine elegantere Lösung?
Ideal wäre eine Ablaufkette / Schrittkette, die sich per Trigger einschaltet und durchläuft.
Zitat von: Dracolein am 15 September 2020, 18:33:51
Hallo, ich nochmal.
Inzwischen habe ich unsere 20 jahre alte Haustürklingel ganz simpel per 12VAC Relais und einem batteriebetriebenen Zigbee Türkontakt in FHEM integriert.
Kleines Problem: Beim Auslösen der Klingel werden kurzzeitig ganz viele Statusänderungen des Zigbee-Devices an FHEM übertragen, weil die Spule natürlich flickert.
Jetzt bin ich am überlegen, wie ich mein Lauflicht mit dem Klingelsignal kombinieren kann unter Verwendung des hier gebastelten DOIFs. Mein Problem: Sobald die Bedingung des DOIF-Befehls erlischt, bricht natürlich auch meine Lauflicht-Ablaufkette mittendrin ab, sodass manchmal eine Birne nicht abschaltet.
Jetzt könnte ich irgendwie versuchen, die Bedingung mit einem Timer zu kombinieren und die Zeit per trial&error genau abzupassen, sodass alle Birnen noch abgeschaltet werden; aber gibt es nicht eine elegantere Lösung?
Ideal wäre eine Ablaufkette / Schrittkette, die sich per Trigger einschaltet und durchläuft.
In meiner Lösung wird der ursprünglicher Zustand der Lampen wiederhergestellt, wenn die Bedingung (Taster:off) erlischt.
ZitatInzwischen habe ich unsere 20 jahre alte Haustürklingel ganz simpel per 12VAC Relais und einem batteriebetriebenen Zigbee Türkontakt in FHEM integriert.
Off-Topic, aber kannst du das etwas näher erläutern? Überlege schon lange wie ich meine bestehende Klingel smart machen kann.
Zitat von: KyleK am 15 September 2020, 22:53:04
Off-Topic, aber kannst du das etwas näher erläutern? Überlege schon lange wie ich meine bestehende Klingel smart machen kann.
Bzgl. Klingel smart machen sollte im Forum einiges zu finden sein -> schon mal gesucht!!?
Es kommt auch drauf an: welche Art von Klingel/Türsprcher etc. du hast...
Welche Systeme du schon laufen hast...
Hier denke ich: Relais "in" den Klingelkreis, Klingel wird gedrückt und klingelt -> Relais "schnappt zu" -> Zigbee-Sensor "erkennt" (wie Fensterkontakt) das und gibt das weiter...
Ich habe einen Homematic-Schalter-Sensor per "Gleichrichter" und Optokoppler (statt Relais) hängen...
Es gibt von Homematic auch direkt einen Klingelsensor, der kann "einfach so" in den Klingelkreis "gebaut" werden (hatte ich auch, hat aber vom Platz her nicht in meinen Türsprecher gepasst, daher andere Lösung)
Und wenn du z.B. einen Türsprecher mit "Bussystem" hast, dann musst du eben schauen.
Für z.B. Siedle gibt es wohl auch dafür Lösungen...
Ansonsten, da ja komplett off-topic: neuen Thread aufmachen... Dann verm. den 1000 und ersten ;)
Gruß, Joachim
Zitat von: MadMax-FHEM am 16 September 2020, 00:42:05
Hier denke ich: Relais "in" den Klingelkreis, Klingel wird gedrückt und klingelt -> Relais "schnappt zu" -> Zigbee-Sensor "erkennt" (wie Fensterkontakt) das und gibt das weiter...
Exakt, die Idee stammt auch weniger von mir, sondern mehr von Google.
Meine Klingel basiert auf 8-10VAC, wenn geklingelt wird, zieht eine Spule an und betätigt per Schieber die Klangmetalle.
Eigentlich wollte ich den Zigbee Türkontakt direkt an die Spule drankleben, mit der Absicht, dass der verbaute Reedkontakt von der besagten Spule magnetisch betätigt wird. Klappte leider nicht zuverlässig, also habe ich parallel zur Klingel das genannte Relais verbaut, dessen Spule von den 8-10VAC betätigt wird und dann einen Wechsler aktiviert, der den Reedkontakt des Zigbee Sesors schließt. Fertig. Zumindest auf der Hardwareseite.
Ich hätte noch ein weiteres Problem, was ich nicht verstehe.
Inzwischen habe ich ein Notify gebastelt
define notify_Haustuerklingel notify Haustuerklingel:closed set dummy_Haustuerklingel on
was einen Dummy schaltet, sobald der Sensor das Klingelsignal bemerkt.
Der Dummy wiederum dient als Bedingung meines in diesem Thread gezeigten DOIFs. Sobald Dummy=on, startet das Doif seine Ablaufkette.
Nun dachte ich mir, jung und naiv wie ich bin, setze ich zum Schluss der Ablaufkette noch den Befehl dran
set dummy_Haustuerklingel off
Das klappt augenscheinlich auch. Die Ablaufkette läuft durch und zum Schluss wird der Dummy auf off gesetzt, ABER: das Doif lässt sich danach kein zweites Mal starten. Erst wenn ich im Webfrontend das Dummy per Mausklick "Off" betätige dann kann man die Ablaufkette ganz normal erneut einmalig starten.
Frage: wo liegt der Fehler?
do = always hast du gesetzt?
Super cooles Beispliel!
Bekommt man da noch mehr Knight Rider rein? also nicht "im Kreis" blinken, sondern lauflicht von links nach rechts und dann wieder von rechts nach links etc?
Zitat von: Damian am 05 September 2020, 13:19:57
So würde eine "programmierte" Lösung aussehen:
defmod lauflicht DOIF subs \
{\
@{$_a}=qw/lamp1 lamp2 lamp3/;; # Liste mit Lampen\
$_max_repeat=5;; # Maximale Anzahl der Durchläufe\
$_delay=0.5;; # Verzögerung\
\
@{$_state}=();; # Liste für Status der Lampen\
$_counter=0;; # Zähler wird auf den ersten Wert gesetzt\
$_repeat=0;; # Nummer der Durchlaufs\
\
sub lauflicht { # Funktion zum Schalten der Lampen\
if ($_repeat == $_max_repeat) { # Wenn maximale Anzahl der Wiederholungen erreicht\
set_states();; # Status der Lampen wiederherstellen\
return;; # Ende\
}\
if ($_counter == @{$_a}) { # letzte Lampe erreicht\
fhem_set ($_a[@{$_a}-1]." off");;\
$_counter=0;;\
$_repeat++;;\
}\
fhem_set ($_a[$_counter]." on");;\
fhem_set ($_a[$_counter-1]." off") if ($_counter > 0) ;;\
$_counter++;;\
set_Exec("Timer",$_delay,'lauflicht');; # Timer für den nächsten Schaltvorgang setzen\
}\
\
sub save_states { \
for ($i=0;;$i<@{$_a};;$i++) {$_state[$i]=ReadingsVal($_a[$i],"state","")};; # Status der Lampen sichern\
for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] off")};; # alle Lampen ausschalten\
}\
\
sub set_states { # Status der Lampen wiederherstellen\
for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] $_state[$i]")};;\
$_counter=0;;\
$_repeat=0;;\
}\
}\
\
{## ["Taster:on"];; # Aktion zum Staten des Lauflichts \
save_states();; # Merke Status der Lampen\
lauflicht();; # Lauflicht starten\
}\
\
{## ["Taster:off"];; # Aktion zum Beenden des Lauflichts\
del_Exec("Timer");; # Timer löschen\
set_states();; # Status der Lampen wiederherstellen\
}
attr lauflicht room DOIF_Labor
Die Angaben zu Lampen, Anzahl der Durchläufe und die Verzögerung werden am Anfang definiert. Die Aktion zum Starten oder vorzeitigen Beenden wird am Ende im jeweiligen Block definiert (Taster:on/off).
Testen kann man es mit Dummys lamp1, lamp2, lamp3. Starten des Lauflichts mit set lauflicht block_01, vorzeitiges Beenden mit set lauflicht block_02.
Die Lampen werden immer auf ihren ursprünglichen Zustand zurückgesetzt.
Zitat von: slor am 16 September 2020, 13:04:39
Super cooles Beispliel!
Bekommt man da noch mehr Knight Rider rein? also nicht "im Kreis" blinken, sondern lauflicht von links nach rechts und dann wieder von rechts nach links etc?
Das ist dir überlassen ;)
Da es fast ausschließlich Perl ist, kannst du alles programmieren, was du willst ;)
Vorausgesetzt man kann etwas Perl und versteht, was da passiert.
Zu der im Mittelpunkt stehenden Funktion
set_Exec findet man hier die Doku: https://fhem.de/commandref_DE.html#DOIF_set_Exec
Sie wird demnächst etwas aufgebohrt und kann dann mit Wiederholungen umgehen, siehe: https://forum.fhem.de/index.php/topic,114252.0.html
Zitat von: slor am 16 September 2020, 13:01:42
do = always hast du gesetzt?
Nein das hatte ich nicht, mit Deinem Tip funktioniert es, danke. Den Rest muss ich heute abend vor Ort ausprobieren.
Ich setze zum Abschluss deses Projekts nochmal mein aktuelles DOIF rein, falls andere Anfänger dies benötigen.
Im Prinzip habe ich auf simpelstem Niveau - aber funktionell - nun auch die Zustände jeder Birne vor Beginn der Lichtsequenz zwischengespeichert und nach Abschluss selbiger überschreibe ich die Readings wieder mit dem alten Wert. Sollte es z.B. eines winterlichen Abends klingeln und die Leuchten sind auf 25% gedimmt, aktiviert sich die Lauflichtsequenz und setzt die 25% Dimmung zum Abschluss wieder ein, sodass niemand im dunkeln sitzen bleibt.
Danken allen Helfern, das klappt bisher zuverlässig und gut.
Internals:
DEF ([dummy_Haustuerklingel:state] eq "on") (setreading HUEDevice5 pct_backup [HUEDevice5:pct]) (setreading HUEDevice6 pct_backup [HUEDevice5:pct]) (setreading HUEDevice7 pct_backup [HUEDevice5:pct]) (setreading HUEDevice8 pct_backup [HUEDevice5:pct]) (set HUEDevice5 pct 100) (set HUEDevice6 pct 100) (set HUEDevice7 pct 100, set HUEDevice5 off) (set HUEDevice8 pct 100, set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off) (set HUEDevice5 pct 100) (set HUEDevice6 pct 100) (set HUEDevice7 pct 100, set HUEDevice5 off) (set HUEDevice8 pct 100, set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off) (set HUEDevice5 pct 100) (set HUEDevice6 pct 100) (set HUEDevice7 pct 100, set HUEDevice5 off) (set HUEDevice8 pct 100, set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off) (set dummy_Haustuerklingel off) (set HUEDevice5 pct [HUEDevice5:pct_backup]) (set HUEDevice6 pct [HUEDevice6:pct_backup]) (set HUEDevice7 pct [HUEDevice7:pct_backup]) (set HUEDevice8 pct [HUEDevice8:pct_backup])
FUUID 5f61b6f0-f33f-4dec-c606-5dcdf20d2d0171d6
MODEL FHEM
NAME doif_Lauflicht_Klingel
NOTIFYDEV global,dummy_Haustuerklingel
NR 123
NTFY_ORDER 50-doif_Lauflicht_Klingel
STATE cmd_1
TYPE DOIF
VERSION 22030 2020-05-25 14:10:16
READINGS:
2020-09-20 19:04:48 Device dummy_Haustuerklingel
2020-09-20 19:04:55 cmd 1.27
2020-09-20 19:04:55 cmd_event dummy_Haustuerklingel
2020-09-20 19:04:55 cmd_nr 1
2020-09-20 19:04:55 cmd_seqnr 27
2020-09-20 19:04:48 e_dummy_Haustuerklingel_state on
2020-09-18 13:56:31 mode enabled
2020-09-20 19:04:55 state cmd_1
2020-09-20 19:04:55 wait_timer no timer
Regex:
accu:
cond:
dummy_Haustuerklingel:
0:
state ^dummy_Haustuerklingel$:^state:
attr:
cmdState:
wait:
0:
0
0
0
0
0
0.4
0.4
0.4
0.4
0.4
0
0.4
0.4
0.4
0.4
0.4
0
0.4
0.4
0.4
0.4
0.4
0.4
0
0
0
0
waitdel:
condition:
0 ::ReadingValDoIf($hash,'dummy_Haustuerklingel','state') eq "on"
do:
0:
0 setreading HUEDevice5 pct_backup [HUEDevice5:pct]
1 setreading HUEDevice6 pct_backup [HUEDevice5:pct]
10 set HUEDevice5 pct 100
11 set HUEDevice6 pct 100
12 set HUEDevice7 pct 100, set HUEDevice5 off
13 set HUEDevice8 pct 100, set HUEDevice6 off
14 set HUEDevice7 off
15 set HUEDevice8 off
16 set HUEDevice5 pct 100
17 set HUEDevice6 pct 100
18 set HUEDevice7 pct 100, set HUEDevice5 off
19 set HUEDevice8 pct 100, set HUEDevice6 off
2 setreading HUEDevice7 pct_backup [HUEDevice5:pct]
20 set HUEDevice7 off
21 set HUEDevice8 off
22 set dummy_Haustuerklingel off
23 set HUEDevice5 pct [HUEDevice5:pct_backup]
24 set HUEDevice6 pct [HUEDevice6:pct_backup]
25 set HUEDevice7 pct [HUEDevice7:pct_backup]
26 set HUEDevice8 pct [HUEDevice8:pct_backup]
3 setreading HUEDevice8 pct_backup [HUEDevice5:pct]
4 set HUEDevice5 pct 100
5 set HUEDevice6 pct 100
6 set HUEDevice7 pct 100, set HUEDevice5 off
7 set HUEDevice8 pct 100, set HUEDevice6 off
8 set HUEDevice7 off
9 set HUEDevice8 off
1:
helper:
DEVFILTER ^global$|^dummy_Haustuerklingel$
NOTIFYDEV global|dummy_Haustuerklingel
event on
globalinit 1
last_timer 0
sleepdevice dummy_Haustuerklingel
sleepsubtimer -1
sleeptimer -1
timerdev dummy_Haustuerklingel
timerevent on
triggerDev dummy_Haustuerklingel
DOIF_eventa:
cmd_nr: 1
cmd_seqnr: 27
cmd_event: dummy_Haustuerklingel
cmd_1
DOIF_eventas:
cmd_nr: 1
cmd_seqnr: 27
cmd_event: dummy_Haustuerklingel
state: cmd_1
timerevents:
on
timereventsState:
state: on
triggerEvents:
on
triggerEventsState:
state: on
internals:
perlblock:
readings:
all dummy_Haustuerklingel:state
trigger:
uiState:
uiTable:
Attributes:
do always
room Befehle
wait 0,0,0,0,0,0.4,0.4,0.4,0.4,0.4,0,0.4,0.4,0.4,0.4,0.4,0,0.4,0.4,0.4,0.4,0.4,0.4,0,0,0,0