FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: jannis am 08 Dezember 2020, 10:40:17

Titel: DOIF mit AttrVal
Beitrag von: jannis am 08 Dezember 2020, 10:40:17
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
Titel: Antw:DOIF mit AttrVal
Beitrag 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)

Dieses Attr solltest Du einfach weglassen und vergessen dass es userattr überhaupt gibt
attr tester_Gefrierschrank userattr Programm

Gruß Otto
Titel: Antw:DOIF mit AttrVal
Beitrag von: jannis am 08 Dezember 2020, 11:06:35
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.
Titel: Antw:DOIF mit AttrVal
Beitrag 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 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.
Titel: Antw:DOIF mit AttrVal
Beitrag von: jannis am 08 Dezember 2020, 12:00:53
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 :)
Titel: Antw:DOIF mit AttrVal
Beitrag von: jannis am 08 Dezember 2020, 12:44:00
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


Titel: Antw:DOIF mit AttrVal
Beitrag 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




Titel: Antw:DOIF mit AttrVal
Beitrag von: jannis am 08 Dezember 2020, 14:41:57
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
Titel: Antw:DOIF mit AttrVal
Beitrag von: Damian am 08 Dezember 2020, 14:54:22
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.
Titel: Antw:DOIF mit AttrVal
Beitrag von: Otto123 am 08 Dezember 2020, 15:21:12
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.