Hallo zusammen,
ich habe ein DOIF gebaut, welches in Abhängigkeit der Aussentemperatur ein Fernsehlicht schalten soll.
Zum Sonnenuntergang wird es korrekt ausgeführt und ruft den entsprechenden Command auf.
Wenn es nun aber während des abends kälter wird, aktualisiert sich die Lichtfarbe nicht.
Erst bei einem manuallen "set d_Beleuchtung_Fernsehen checkall" aktualisiert sich die Lichtfarbe.
Wo ist mein Fehler?
Danke und schöne Grüße
Christian
Internals:
DEF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) <= "0")
(set Li_Fernsehen rgb FF5D46)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "0" and ReadingsNum("Waermepumpe", "temp2", 0) <= "5")
(set Li_Fernsehen rgb FF8B46)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "5" and ReadingsNum("Waermepumpe", "temp2", 0) <= "10")
(set Li_Fernsehen rgb B9A57E)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "10" and ReadingsNum("Waermepumpe", "temp2", 0) <= "15")
(set Li_Fernsehen rgb 74BFB5)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "15" and ReadingsNum("Waermepumpe", "temp2", 0) <= "20")
(set Li_Fernsehen rgb 17E2FF)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "20" and ReadingsNum("Waermepumpe", "temp2", 0) <= "25")
(set Li_Fernsehen rgb 109EFF)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "25" and ReadingsNum("Waermepumpe", "temp2", 0) <= "30")
(set Li_Fernsehen rgb 0744FF)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "30")
(set Li_Fernsehen rgb 0000FF)
DOELSEIF ([[Twilight:ss_indoor]-02:00] and [Fernseher_WohnZi] eq "on")
(set Li_Fernsehen rgb FF0000)
FUUID ##########
MODEL FHEM
NAME d_Beleuchtung_Fernsehen
NOTIFYDEV Fernseher_WohnZi,Twilight,global
NR 91
NTFY_ORDER 50-d_Anwesenheit_Stehlampe_WohnZi
STATE 16.09.2020 19:00:48, off
TYPE DOIF
VERSION 22588 2020-08-12 19:25:15
READINGS:
2020-09-15 23:00:11 Device Fernseher_WohnZi
2020-09-15 19:26:11 cmd 6
2020-09-15 19:26:11 cmd_event d_Beleuchtung_Fernsehen
2020-09-15 19:26:11 cmd_nr 6
2020-09-15 23:00:11 e_Fernseher_WohnZi_STATE off
2020-09-08 20:59:23 mode enabled
2020-09-15 19:26:11 state cmd_6
2020-09-16 02:00:00 timer_01_c01 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_02_c01 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_03_c02 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_04_c02 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_05_c03 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_06_c03 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_07_c04 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_08_c04 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_09_c05 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_10_c05 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_11_c06 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_12_c06 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_13_c07 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_14_c07 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_15_c08 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_16_c08 17.09.2020 02:00:00
2020-09-16 02:00:00 timer_17_c09 16.09.2020 19:00:48
2020-09-16 02:00:00 timer_18_c09 17.09.2020 02:00:00
Regex:
accu:
cond:
Fernseher_WohnZi:
0:
&STATE ^Fernseher_WohnZi$
1:
&STATE ^Fernseher_WohnZi$
2:
&STATE ^Fernseher_WohnZi$
3:
&STATE ^Fernseher_WohnZi$
4:
&STATE ^Fernseher_WohnZi$
5:
&STATE ^Fernseher_WohnZi$
6:
&STATE ^Fernseher_WohnZi$
7:
&STATE ^Fernseher_WohnZi$
8:
&STATE ^Fernseher_WohnZi$
itimer:
Twilight:
itimer:
ss_indoor ^Twilight$:^ss_indoor:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) <= "0"
1 ::DOIF_time($hash,2,3,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "0" and ReadingsNum("Waermepumpe", "temp2", 0) <= "5"
2 ::DOIF_time($hash,4,5,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "5" and ReadingsNum("Waermepumpe", "temp2", 0) <= "10"
3 ::DOIF_time($hash,6,7,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "10" and ReadingsNum("Waermepumpe", "temp2", 0) <= "15"
4 ::DOIF_time($hash,8,9,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "15" and ReadingsNum("Waermepumpe", "temp2", 0) <= "20"
5 ::DOIF_time($hash,10,11,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "20" and ReadingsNum("Waermepumpe", "temp2", 0) <= "25"
6 ::DOIF_time($hash,12,13,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "25" and ReadingsNum("Waermepumpe", "temp2", 0) <= "30"
7 ::DOIF_time($hash,14,15,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on" and ReadingsNum("Waermepumpe", "temp2", 0) > "30"
8 ::DOIF_time($hash,16,17,$wday,$hms) and ::InternalDoIf($hash,'Fernseher_WohnZi','STATE') eq "on"
days:
do:
0:
0 set Li_Fernsehen rgb FF5D46
1:
0 set Li_Fernsehen rgb FF8B46
2:
0 set Li_Fernsehen rgb B9A57E
3:
0 set Li_Fernsehen rgb 74BFB5
4:
0 set Li_Fernsehen rgb 17E2FF
5:
0 set Li_Fernsehen rgb 109EFF
6:
0 set Li_Fernsehen rgb 0744FF
7:
0 set Li_Fernsehen rgb 0000FF
8:
0 set Li_Fernsehen rgb FF0000
9:
helper:
DEVFILTER ^global$|^Fernseher_WohnZi$|^Twilight$
NOTIFYDEV global|Fernseher_WohnZi|Twilight
event timer_18
globalinit 1
last_timer 18
sleeptimer -1
timerdev
timerevent timer_13
timerevents
timereventsState
triggerDev
triggerEvents:
timer_18
triggerEventsState:
timer_18
internals:
all Fernseher_WohnZi:STATE
interval:
0 -1
1 0
10 -1
11 10
12 -1
13 12
14 -1
15 14
16 -1
17 16
2 -1
3 2
4 -1
5 4
6 -1
7 6
8 -1
9 8
intervalfunc:
intervaltimer:
localtime:
0 1600275648
1 1600300800
10 1600275648
11 1600300800
12 1600275648
13 1600300800
14 1600275648
15 1600300800
16 1600275648
17 1600300800
2 1600275648
3 1600300800
4 1600275648
5 1600300800
6 1600275648
7 1600300800
8 1600275648
9 1600300800
readings:
realtime:
0 19:00:48
1 02:00:00
10 19:00:48
11 02:00:00
12 19:00:48
13 02:00:00
14 19:00:48
15 02:00:00
16 19:00:48
17 02:00:00
2 19:00:48
3 02:00:00
4 19:00:48
5 02:00:00
6 19:00:48
7 02:00:00
8 19:00:48
9 02:00:00
time:
0 [Twilight:ss_indoor]
1 02:00:00
10 [Twilight:ss_indoor]
11 02:00:00
12 [Twilight:ss_indoor]
13 02:00:00
14 [Twilight:ss_indoor]
15 02:00:00
16 [Twilight:ss_indoor]
17 02:00:00
2 [Twilight:ss_indoor]
3 02:00:00
4 [Twilight:ss_indoor]
5 02:00:00
6 [Twilight:ss_indoor]
7 02:00:00
8 [Twilight:ss_indoor]
9 02:00:00
timeCond:
0 0
1 0
10 5
11 5
12 6
13 6
14 7
15 7
16 8
17 8
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 4
timer:
0 0
1 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timers:
0 0 1
1 2 3
2 4 5
3 6 7
4 8 9
5 10 11
6 12 13
7 14 15
8 16 17
trigger:
triggertime:
1600275648:
localtime 1600275648
hash:
1600300800:
localtime 1600300800
hash:
uiState:
uiTable:
Attributes:
do always
group Beleuchtung
room Logik
stateFormat timer_01_c01, e_Fernseher_WohnZi_STATE
Ich nutze ja so kein DOIF und es mag auch nicht DER Fehler sein...
...ABER:
Zitatand ReadingsNum("Waermepumpe", "temp2", 0) <= "0")
Du nimmst ReadingsNum -> numerisches Ergebnis
machst aus einer numerischen '0' "extra" (warum!?) eine "Zeichenkette" -> "0"
um dann einen numerischen Wert (ReadingsNum) mit einer "Zeichenkette" ("0") zu vergleichen und nutzt dazu einen "numerischen Vergleich": <=
Also das 0 -> "0" ist "unnötig" (um es "freundlich" auszudrücken ;) )
Und dann stimmt auch der Vergleichsoperator... :)
Ansosnten bei "Zeichenkettenvergleich": eq, ne, gt, lt
Gruß, Joachim
Moin,
versuch doch mal komplett bei DOIF-Syntax zu bleiben, also statt
ReadingsNum("Waermepumpe", "temp2", 0) <= "0"
kannst du
[Waermepumpe:temp2:d] <= 0
nehmen. Liefert ganze Zahlen für temp2.
und dann wie von MadMax-FHEM schon beschrieben muss der Vergleichsoperator stimmen, also <= 0 etc.
CommandRef DOIF:
ZitatEreignissteuerung über Auswertung von Events
...
Filtern nach Ausdrücken mit Ausgabeformatierung back
Syntax: [<device>:<reading>|<internal>:d<number>|"<regex>":<output>]
d - Der Buchstabe "d" ist ein Synonym für das Filtern nach Dezimalzahlen, es entspricht intern dem regulären Ausdruck "(-?\d+(\.\d+)?)". Ebenfalls lässt sich eine Dezimalzahl auf eine bestimmte Anzahl von Nachkommastellen runden. Dazu wird an das "d" eine Ziffer angehängt. Mit der Angabe d0 wird die Zahl auf ganze Zahlen gerundet.
...
Beispiele:
Es soll aus einem Reading, das z. B. ein Prozentzeichen beinhaltet, nur der Zahlenwert für den Vergleich genutzt werden:
define di_heating DOIF ([adjusting:actuator:d] < 10) (set heating off) DOELSE (set heating on)
sowie
ZitatLesbarkeit der Definitionen
...
Ereignissteuerung
Vergleichende Abfragen werden in der Bedingung, mit Perl-Operatoren ==, !=, <, <=, >, >= bei Zahlen und mit eq, ne, lt, le, gt, ge, =~, !~ bei Zeichenketten angegeben
Viel Erfolg!
Habe die Syntax entsprechend angepasst und es funktioniert jetzt.
Danke für eure Hilfe.
Christian