In einem DOIF hole ich mit AttrVal einen Wert aus einem anderen Device. Problem: es wird immer cmd_3 (also das DOELSE) ausgeführt. Wo liegt der Fehler?
Hier der Code ... zum Ausprobieren die erste [Uhrzeit:Tag] auf die aktuelle Zeit + 1 Minute stellen:
defmod tester_Gefrierschrank dummy
attr tester_Gefrierschrank userattr Programm
attr tester_Gefrierschrank Programm Schockfrosten
attr tester_Gefrierschrank room Training->DOIF->Gefrierschrank
defmod tester_di_Gefrierschrank DOIF ( [10:51|Di] and AttrVal("tester_Gefrierschrank", "Programm", 0) eq "Schockfrosten" ) \
{ Log 3, "Block 1" } \
DOELSEIF ( [12:04|Di]) \
{ Log 3, "Block 2" } \
DOELSE \
{ Log 3, "Block 3" }\
attr tester_di_Gefrierschrank room Training->DOIF->Gefrierschrank
Weil Du ein Reading erzeugst setreading tester_Gefrierschrank Programm Schockfrosten
Und anschließend davon ausgehst das es ein Atrribute geworden ist :o
AttrVal("tester_Gefrierschrank", "Programm", 0) nimm stattdessen ReadingsVal("tester_Gefrierschrank", "Programm", 0)
Dieses Attr solltest Du einfach weglassen und vergessen dass es userattr überhaupt gibt
attr tester_Gefrierschrank userattr Programm
Gruß Otto
Zitat von: Otto123 am 08 Dezember 2020, 10:56:08
Weil Du ein Reading erzeugst setreading tester_Gefrierschrank Programm Schockfrosten
Und anschließend davon ausgehst das es ein Atrribute geworden ist :o
AttrVal("tester_Gefrierschrank", "Programm", 0) nimm stattdessen ReadingsVal("tester_Gefrierschrank", "Programm", 0)
Ich habe zumindest jetzt einmal oben die Zuordnung korrigiert ... von setreading auf attr tester_Gefrierschrank Programm Schockfrosten
Aber es wird noch immer block_3 ausgeführt :(
Zitat von: Otto123 am 08 Dezember 2020, 10:56:08
Dieses Attr solltest Du einfach weglassen und vergessen dass es userattr überhaupt gibt
attr tester_Gefrierschrank userattr Programm
Meinst Du genererll userattr nicht mehr nutzen? Ich hab es eigentlich so: Readings für bewegliche Daten und Attribute für feste.
Gut ich will nicht urteilen ob AttrVal() an der Stelle ( innerhalb runde Klammern) funktioniert. Ich denke dort muss Du sowas nehmen
Zitat[device:name] mit dem Wert des Readings, Internals oder Attributes für device, falls sowohl device, als auch Reading, Internal oder Attribut existiert, und nicht leer ist.
Man kann einen der Präfixe r:, i: oder a: verwenden, um die Suche einzuschränken, genau wie im devspec.
Ansonsten: Wenn DOIF triggert und keine der Bedingungen wird erfüllt (Zeiten) wird DOELSE gemacht.
Zitat von: Otto123 am 08 Dezember 2020, 11:15:53
Gut ich will nicht urteilen ob AttrVal() an der Stelle ( innerhalb runde Klammern) funktioniert. Ich denke dort muss Du sowas nehmenAnsonsten: Wenn DOIF triggert und keine der Bedingungen wird erfüllt (Zeiten) wird DOELSE gemacht.
Danke, scheint zu funktionieren. Ich war davon ausgegangen, das mit den eckigen Klammern nur Readings gelesen werden. Der Irrglaube hat viel Lesezeit gekostet :(
Heute wird wieder ein schöner fhem-Tag :)
M - I - S - T :(
Ich hatte mich schon gefreut ... habe das Beispiel jetzt angepasst, aber der DOIF-Zweig cmd_1 wird nicht ausgeführt. Ich setze die Uhrzeit der ersten Bedingung immer eine Minute vor die aktuelle Zeit warte ab und schaue ins Log: Und wieder Block 3 anstatt 1 :(
defmod tester_Gefrierschrank dummy
attr tester_Gefrierschrank userattr Programm
attr tester_Gefrierschrank Programm Schockfrosten
attr tester_Gefrierschrank room Training->DOIF->Gefrierschrank
defmod tester_di_Gefrierschrank DOIF ( [12:41|Di] and [tester_Gefrierschrank:Programm] eq "Schockfrosten" ) \
{ Log 3, "Block 1" } \
DOELSEIF ( [12:33|Di]) \
{ Log 3, "Block 2" } \
DOELSE \
{ Log 3, "Block 3" }\
attr tester_di_Gefrierschrank do always
attr tester_di_Gefrierschrank room Training->DOIF->Gefrierschrank
Also [tester_Gefrierschrank:Programm] ist eine korrekte Abfrage eines Readings
AttrVal("tester_Gefrierschrank", "Programm", 0) ist eine korrekte Abfrage eines Attributes
mit list tester_Gefrierschrank kann man sehen, was da passiert
Zitat von: Damian am 08 Dezember 2020, 13:06:38
Also [tester_Gefrierschrank:Programm] ist eine korrekte Abfrage eines Readings
AttrVal("tester_Gefrierschrank", "Programm", 0) ist eine korrekte Abfrage eines Attributes
mit list tester_Gefrierschrank kann man sehen, was da passiert
Ich habe das AttrVal("tester_Gefrierschrank", "Programm", 0) jetzt wieder eingesetzt, wie ganz oben in meiner Threaderöffnung^und jetzt plötzlich klappt es ... vielleicht weil ich "do allways" geschaltet habe.
Mein Problem scheint ja jetzt gelöst zu sein.
Trotzdem würde ich gerne wissen, wie "list" hilft. Ich nehme an, Du meinst list tester_di_Gefrierschrank. Habe im es im folgenden Mal gemacht. Welche Zeilen sagen dort was passiert?
Internals:
CFGFN
DEF ( [14:34|Di] and AttrVal("tester_Gefrierschrank", "Programm", 0) eq "Schockfrosten" )
{ Log 3, "Block 1" }
DOELSEIF ( [14:35|Di])
{ Log 3, "Block 2" }
DOELSE
{ Log 3, "Block 3" }
FUUID 5fcf6326-f33f-5e92-1901-90e3562fd8502c43
MODEL FHEM
NAME tester_di_Gefrierschrank
NOTIFYDEV global
NR 4950
NTFY_ORDER 50-tester_di_Gefrierschrank
STATE cmd_2
TYPE DOIF
VERSION 23235 2020-11-25 22:42:28
Helper:
DBLOG:
cmd:
logdb:
TIME 1607434500.01224
VALUE 2
cmd_event:
logdb:
TIME 1607434500.01224
VALUE timer_2
cmd_nr:
logdb:
TIME 1607434500.01224
VALUE 2
mode:
logdb:
TIME 1607434416.61369
VALUE enabled
state:
logdb:
TIME 1607434500.01224
VALUE cmd_2
READINGS:
2020-12-08 14:35:00 cmd 2
2020-12-08 14:35:00 cmd_event timer_2
2020-12-08 14:35:00 cmd_nr 2
2020-12-08 14:33:36 mode enabled
2020-12-08 14:35:00 state cmd_2
2020-12-08 14:34:00 timer_01_c01 09.12.2020 14:34:00|Di
2020-12-08 14:35:00 timer_02_c02 09.12.2020 14:35:00|Di
Regex:
accu:
attr:
cmdState:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday,"Di") and AttrVal("tester_Gefrierschrank", "Programm", 0) eq "Schockfrosten"
1 ::DOIF_time_once($hash,1,$wday,"Di")
days:
0 Di
1 Di
do:
0:
0 { Log 3, "Block 1" }
1:
0 { Log 3, "Block 2" }
2:
0 { Log 3, "Block 3" }
helper:
DEVFILTER ^global$
NOTIFYDEV global
event timer_2
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_2
triggerDev
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: timer_2
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: timer_2
state: cmd_2
timerevents:
timer_2
timereventsState:
timer_2
triggerEvents:
timer_2
triggerEventsState:
timer_2
interval:
intervalfunc:
localtime:
0 1607520840
1 1607520900
realtime:
0 14:34:00
1 14:35:00
time:
0 14:34:00
1 14:35:00
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
triggertime:
1607520840:
localtime 1607520840
hash:
1607520900:
localtime 1607520900
hash:
uiState:
uiTable:
Attributes:
do always
room Training->DOIF->Gefrierschrank
Man kann nicht alles sehen.
Immerhin sehe ich, welchen Zustand das Modul hat, welche Readings und welche Attribute gesetzt sind.
Daraus kann man schon einiges ableiten. Bei Ereignissen kann man zusätzlich erkennen, welches Ereignis zur Auslösung geführt hat, hier unerheblich, da hier Zeit der Trigger ist.
Zitat von: jannis am 08 Dezember 2020, 12:00:53
Danke, scheint zu funktionieren. Ich war davon ausgegangen, das mit den eckigen Klammern nur Readings gelesen werden. Der Irrglaube hat viel Lesezeit gekostet :(
naja da lag ich offenbar falsch, ich hatte gedacht es geht auch sowas [device:name:a] für Attribute - aber da hatte ich die Rechnung ohne DOIF gemacht. Sorry! Mein Zitat oben war aus set magic, sieht so ähnlich aus ist aber was völlig anderes.