Hallo,
ich komme leider mit dem DOIF nicht weiter. Über einen kurzen Tastendruck an der FB möchte ich einen Shelly RGBW und den LED-Streifen dahinter ein-/ausschalten. Seltsamerweise triggert immer nur cmd1, auch wenn die Beleuchtung an ist. Denn Grund kann ich mir nicht erklären, da ich ja explizit den Status des Shelly abfrage. Ich habe auch schon die Reihenfolge der Abfragen im cmd geändert, aber keine Auswirkung.
di_Tageslicht:SunDownTimeKor ist ein DOIF, mit dem ich den Sonnenuntergang (horizon-3) bestimme und über ein User-Reading die Zeit in HH:MM ermittele und davon 30 min. abziehe. Grund: Bei Sonnenuntergang ist es im WZ schon zu dunkel und die Raumbeleuchtung muss vorher angehen.
Internals:
DEF ([di_Tageslicht:SunDownTimeKor] or ([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "off")) (set MQTT2_shellyrgbw2_01083F on)
DOELSEIF (([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "on") or [22:30]) (set MQTT2_shellyrgbw2_01083F off)
FUUID 603ba6b2-f33f-6b6f-32a8-eb1d693a1f0ad3e2
MODEL FHEM
NAME di_Licht_WZ_Schrank_Oben
NOTIFYDEV FB_8_Btn_05,global,di_Tageslicht
NR 1831
NTFY_ORDER 50-di_Licht_WZ_Schrank_Oben
STATE An
TYPE DOIF
VERSION 24020 2021-03-20 09:46:38
READINGS:
2021-03-21 19:57:50 Device FB_8_Btn_05
2021-03-21 19:57:50 cmd 1
2021-03-21 19:57:50 cmd_event FB_8_Btn_05
2021-03-21 19:57:50 cmd_nr 1
2021-03-21 19:57:50 e_FB_8_Btn_05_STATE Short 1_52 (to HM_572922)
2021-03-21 19:57:24 mode enabled
2021-03-21 19:57:50 state An
2021-03-21 19:57:24 timer_01_c02 21.03.2021 22:30:00
Regex:
accu:
cond:
FB_8_Btn_05:
0:
&STATE ^FB_8_Btn_05$
1:
&STATE ^FB_8_Btn_05$
di_Tageslicht:
0:
SunDownTimeKor ^di_Tageslicht$:^SunDownTimeKor:
attr:
cmdState:
0:
An
1:
Aus
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'di_Tageslicht','SunDownTimeKor') or (::InternalDoIf($hash,'FB_8_Btn_05','STATE') =~ "Short" and ::InternalDoIf($hash,'MQTT2_shellyrgbw2_01083F','STATE') eq "off")
1 (::InternalDoIf($hash,'FB_8_Btn_05','STATE') =~ "Short" and ::InternalDoIf($hash,'MQTT2_shellyrgbw2_01083F','STATE') eq "on") or ::DOIF_time_once($hash,0,$wday)
days:
do:
0:
0 set MQTT2_shellyrgbw2_01083F on
1:
0 set MQTT2_shellyrgbw2_01083F off
2:
helper:
DEVFILTER ^global$|^FB_8_Btn_05$|^di_Tageslicht$
NOTIFYDEV global|FB_8_Btn_05|di_Tageslicht
event Short 1_52 (to HM_572922),trigger: Short_52,triggerTo_HM_572922: Short_52,trigger_cnt: 52
globalinit 1
last_timer 1
sleeptimer -1
timerdev FB_8_Btn_05
timerevent Short 1_52 (to HM_572922),trigger: Short_52,triggerTo_HM_572922: Short_52,trigger_cnt: 52
triggerDev FB_8_Btn_05
timerevents:
Short 1_52 (to HM_572922)
trigger: Short_52
triggerTo_HM_572922: Short_52
trigger_cnt: 52
timereventsState:
state: Short 1_52 (to HM_572922)
trigger: Short_52
triggerTo_HM_572922: Short_52
trigger_cnt: 52
triggerEvents:
Short 1_52 (to HM_572922)
trigger: Short_52
triggerTo_HM_572922: Short_52
trigger_cnt: 52
triggerEventsState:
state: Short 1_52 (to HM_572922)
trigger: Short_52
triggerTo_HM_572922: Short_52
trigger_cnt: 52
internals:
all FB_8_Btn_05:STATE MQTT2_shellyrgbw2_01083F:STATE
intervalfunc:
localtime:
0 1616362200
readings:
all di_Tageslicht:SunDownTimeKor
realtime:
0 22:30:00
time:
0 22:30:00
timeCond:
0 1
timer:
0 0
timers:
1 0
trigger:
triggertime:
1616362200:
localtime 1616362200
hash:
uiState:
uiTable:
Attributes:
cmdState An | Aus
comment Versuch über Reading Tageslicht (ist Zeit) zu triggern.
do always
room 1.1_Wohnzimmer,9.8.1_DOIF
Hat jemand eine Idee, woran das liegen kann.
Gruß
Jürgen
Noch ein weiteres Problem ist aufgetreten.
Meine Idee, anhand des Readings "di_Tageslicht:SunDownTimeKor", in dem die Zeit steht zu dem das Licht angehen soll, ein Event zu generieren und das Licht anzuschalten geht nicht. Morgens um 06:01 frage ich die Zeit des Sonnenunterganges des Tages ab und errechne daraus das Reading "di_Tageslicht:SunDownTimeKor". Genau zu dem Zeitpunkt triggert dieses DOIF, da die Änderung des Wertes "di_Tageslicht:SunDownTimeKor" ein Event generiert.
Internals:
DEF ([{sunrise("HORIZON=-4")}]) (set du_Tageslicht hell)
DOELSEIF ([{sunset("HORIZON=-3")}]) (set du_Tageslicht dunkel)
FUUID 5c4c3931-f33f-6b6f-479e-df5724a54a7d2405
MODEL FHEM
NAME di_Tageslicht
NOTIFYDEV global
NR 1327
NTFY_ORDER 50-di_Tageslicht
STATE hell
TYPE DOIF
VERSION 24020 2021-03-20 09:46:38
READINGS:
2021-03-22 06:01:03 Sonnenaufgang 06:01
2021-03-22 06:01:03 Sonnenuntergang 18:47
2021-03-22 06:01:03 SunDownTimeKor 18:17
2021-03-21 14:31:41 SundownTime 14:28
2021-03-22 06:01:03 cmd 1
2021-03-22 06:01:03 cmd_event timer_1
2021-03-22 06:01:03 cmd_nr 1
2021-03-21 14:28:32 mode enabled
2021-03-22 06:01:03 state hell
2021-03-22 06:01:03 timer_01_c01 23.03.2021 05:58:59
2021-03-21 18:47:01 timer_02_c02 22.03.2021 18:48:30
Regex:
accu:
attr:
cmdState:
0:
hell
1:
dunkel
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday)
1 ::DOIF_time_once($hash,1,$wday)
days:
do:
0:
0 set du_Tageslicht hell
1:
0 set du_Tageslicht dunkel
2:
helper:
DEVFILTER ^global$
NOTIFYDEV global
event timer_1
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_1
triggerDev
timerevents:
timer_1
timereventsState:
timer_1
triggerEvents:
timer_1
triggerEventsState:
timer_1
interval:
intervalfunc:
localtime:
0 1616475539
1 1616435310
perlblock:
realtime:
0 05:58:59
1 18:48:30
time:
0 {sunrise("HORIZON=-4")}
1 {sunset("HORIZON=-3")}
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
triggertime:
1616435310:
localtime 1616435310
hash:
1616475539:
localtime 1616475539
hash:
uiState:
uiTable:
Attributes:
cmdState hell | dunkel
comment SunDownTimeKor: Sonnenuntergang minus 30 Minuten.
$4 ergibt Fehlermeldung beim booten. Uninitialiced value???
Bisheriger Code:
Sonnenaufgang {(split " ",(ReadingsVal($name, "timer_01_c01", "")))[1]},
Sonnenuntergang {(split " ",(ReadingsVal($name, "timer_02_c02", "")))[1]},
do always
initialize hell
room 9.8.1_DOIF
userReadings Sonnenaufgang {ReadingsTimestamp($name,"timer_01_c01","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
return "$4";},
Sonnenuntergang {ReadingsTimestamp($name,"timer_02_c02","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
return "$4";},
SunDownTimeKor {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name,"timer_02_c02","2000-01-01 00:00:00"))-30*60))},
Wie muss ich dieses Reading abfragen, damit die darin stehende Zeit als Triggerereignis genommen wird. Ich dachte es geht wie eine übliche Zeitabfrage im DOIF wie z.B.: [20:00]
Grüße Jürgen
Moin Jürgen,
schau mal in die Doku und dort unter indirekte Zeitangaben und Events.
https://commandref.fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
https://commandref.fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
[di_Tageslicht:SunDownTimeKor] -> [[di_Tageslicht:SunDownTimeKor]]
Allerdings ist das was Du da im Userreading verhackstückst auch direkt in der Funktion sunrise_el vorhanden. Siehe Offset:
https://commandref.fhem.de/commandref_DE.html#SUNRISE_EL
Gruß Otto
Hallo Jürgen,
beschreibe doch einfach mal was Du eigentlich tun willst?
Du willst einen Shelly schalten zu einer errechneten Zeit und per Tastendruck an der FB?
Es ist oft übersichtlicher, wenn Du das in separtaten Zweigen machst, zumindest bis es funktioniert.
"di_Tageslicht" kannst Du Dir sparen, das
Zitatich den Sonnenuntergang (horizon-3) bestimme und über ein User-Reading die Zeit in HH:MM ermittele und davon 30 min. abziehe.
geht im DOIF selbst gut.
DOELSEIF ([{sunset_abs("REAL", 600, "15:30","20:45")}]) (set FS7 on)
nur mal als Beispiel.
Morgen Otto,
auf das Thema mit den doppelten eckigen Klammern bei der indirekten Zeitangabe bin ich heute Morgen auch gestossen und habe es eingefügt. Das löst hoffentlich das Problem, dass durch die Änderung des Wertes und nicht durch die hinterlegte Zeit getriggert wird. Wird sich heute Abend zeigen.
Offset in sunriese_el: Kenne ich, dachte aber es ist programmtechnisch besser, direkt beim ermitteln der Sonnenauf- und untergangszeit über ein Userreading meine Sollzeit zu errechnen anstatt in einem weiteren DOIF noch einmal die Funktion aufzurufen und dort die Sollzeit zu errechnen.
Auswertung von Events: Da muss ich gestehen, dass ich an meine Grenzen des Verständnisses komme da sich mir der Unterschied nicht erschließt. Auch in der Teilausdrucksabfrage wird doch nach dem Wort "Short" gesucht und wenn es gefunden wird, sollte die Bedingung wahr werden. Wird sie aber nicht und deswegen wird die Bedingung nicht wahr. Kann es daran liegen, dass der String "Short" immer darin vorkommt und nur ein Index hochgezählt wird, wenn die FB betätigt wird?
Ich versuche mal die Version mit Eventauswertung, auch wenn ich den Unterschied nicht verstehe.
Gruß Jürgen
@rabehd:
Genau. Shelly per Taste der FB und nach einer vom Sonnenuntergang abhängigen Zeit.
di_Tageslicht brauche ich an vielen Stellen im Programm (Jalousiensteuerung, Lichtsteuerung...).
Zum Start in separaten Zweigen ist eine gute Idee. Ich versuche immer alles gleich "perfekt" zu machen und dann wird es halt manchmal zu kompliziert.
Gruß Jürgen
Erste Erfolgsmeldung!
Nach Umstellung auf
([[di_Tageslicht:SunDownTimeKor]] and [?MQTT2_shellyrgbw2_01083F] eq "off") (set MQTT2_shellyrgbw2_01083F on)
DOELSEIF ([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "off") (set MQTT2_shellyrgbw2_01083F on)
DOELSEIF (([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "on") or [22:30]) (set MQTT2_shellyrgbw2_01083F off)
gehen Zweig 2 und 3, Schalten mit der FB. Zweig 1 wird sich heute Abend zeigen.
Danke schon mal für die Hilfe.
ZitatOffset in sunriese_el: Kenne ich, dachte aber es ist programmtechnisch besser, direkt beim ermitteln der Sonnenauf- und untergangszeit über ein Userreading meine Sollzeit zu errechnen anstatt in einem weiteren DOIF noch einmal die Funktion aufzurufen und dort die Sollzeit zu errechnen.
Das meinte ich auch nicht. Ich meine, wenn Du die Temperatur in deinem Keller in die Berechnung Deines persönlichen Sonnenaufganges mit einfließen lassen musst ist das ok, aber einfach nur eine Zeitverschiebung? Da muss Du die Daten nicht rumschubsen, die Funktion macht das doch direkt!?
[{sunrise("HORIZON=-4",-30*60)}]
Das mit den Events oder Abfrage ist am Ende egal, nur ist die direkte Auswertung des Events effizienter.
Noch ein Hinweis wegen der Auswertung von Short: Die eine Hälfte der Menschheit kommt damit mEn nicht klar. Sie will drücken bis was passiert. Du solltest also auch long auswerten!
Gruß Otto
@Otto
Den tatsächlichen Sonnenuntergang brauche ich in 95% der Fälle. Nur für wenige Lichter, die ich früher einschalten will, benötige ich eine andere Zeit. Dachte, dass es über ein Userreading am Einfachsten wäre.
Mit LONG wollte ich später eine Dimmfunktion einbauen. Soweit bin ich aber noch nicht, deswegen ist es einstweilen sicher besser, auch Long abzufragen.
Ich bekomme manchmal auch einen Zustand "LongRelease", wenn ich lange auf der Taste bleibe und sie dann loslasse. Weist Du, für was das gedacht ist?
Na genau dafür: das Ende von Long - Du weisst damit das es zu Ende ist. ;)
Das mit dem Sonnuntergang verstehe ich immer noch nicht. Wenn Du Tag Nacht brauchst ist isday() am Einfachsten. Ansonsten nimmts Du {sunrise("HORIZON=-4")} direkt oder eben mit Korrektur. Aber man braucht doch diesen Wert nicht immer extra abzulegen? Aber wenn Du das so willst - mach es gerne. :) Ob es so oder so einfacher oder logischer ist - liegt immer im Auge des Betrachters :)
Erschließt sich mir nicht, wofür man das Ende vom Long (Tastendruck) benötigt, aber wenn das so vorgesehen ist. ;)
Vermutlich hätte ich anstatt meinem dummy du_tageslicht mit Status hell/dunkel, der von di_Tageslicht einmal am Tag gesetzt wird, auch immer isday() im Programm abfragen können. Bin ich in der Anfangszeit von FHEM gar nicht daraufgekommen. Jetzt habe ich das zig-fach in den Abfragen drinnen und will es nicht mehr ändern.
Zitat von: bmwfan am 22 März 2021, 10:40:14
Erschließt sich mir nicht, wofür man das Ende vom Long (Tastendruck) benötigt, aber wenn das so vorgesehen ist. ;)
Wäre eine einfache Abfrage, dass jemand
lange gedrückt hat - egal wie lange. Du denkst nur an Deinen Dimmer :) und willst das bei long was passiert