FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: dora71 am 18 Mai 2019, 17:46:02

Titel: [gelöst] Hilfe bei DOIF und ReadingsAge
Beitrag von: dora71 am 18 Mai 2019, 17:46:02
Hallo Forum,

ich möchte es verstehen, warum mein (ReadingsAge-)Code nicht funktioniert, es geht um den Perl-Modus von DOIF:

Einfaches Beispiel (ein list auf's Device):
Internals:
   CFGFN     
   DEF        { if (ReadingsAge('lampe1','zustand',0) == 820) { fhem("set lampe2 on") } }
   FUUID      5ce02375-f33f-be1b-d49e-aa5c0201752ec29c
   MODEL      Perl
   NAME       di_agetest
   NR         94
   NTFY_ORDER 50-di_agetest
   STATE      ???
   TYPE       DOIF
   VERSION    19303 2019-05-01 08:47:16
   READINGS:
     2019-05-18 17:35:01   mode            enabled
   Regex:
     accu:
   condition:
     0           if (ReadingsAge('lampe1','zustand',0) == 820) { fhem("set lampe2 on") }
   devices:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   itimer:
   perlblock:
     0         
   uiState:
   uiTable:
Attributes:
   verbose   


Führe ich in der Kommandozeile oben den ReadingsAge Befehl alleine aus, gibt er mir brav die Sekunden zurück, so weit so gut.
Aber ich bekomme keinen Trigger für das DOIF, es passiert gar nichts, auch mit verbose 5 sehe ich im Log nichts, was auslöst.
Habe ich einen Knoten im Hirn oder mache ich was falsch?!?

Bitte um Hilfe, vielen Dank und Gruß

Rainer
Titel: Antw:Hilfe bei DOIF und ReadingsAge
Beitrag von: Damian am 18 Mai 2019, 17:51:12
Du hast keinen Trigger definiert, daher wird deine Anweisung nie ausgeführt.
Titel: Antw:Hilfe bei DOIF und ReadingsAge
Beitrag von: dora71 am 18 Mai 2019, 18:17:38
OK, habe ich verstanden. Dann fehlt mir aber irgendwie der richtige Trigger ... ReadingsAge ist dann wahrscheinlich nicht der richtige Kandidat, oder?

Wenn ich prüfen will, ob das Reading zustand von lampe1 seit 820 Sekunden den Wert 0 hat, würde ich mich doch mit einem [lampe1:zustand] == 0 mit einer and-Verknüpfung und dem ReadingsAge im Kreis drehen, denn der triggert doch nur, wenn ich lampe1 irgendwann auf 0 setze. Das habe ich auch schon probiert (und wieder verworfen)

Ich möchte aber prüfen, ob das Reading seit 820 Sekunden den Wert 0 hat, dann soll lampe2 geschaltet werden.

Wahrscheinlich denke ich zu kompliziert? Gibt es einen anderen Denkansatz?
Titel: Antw:Hilfe bei DOIF und ReadingsAge
Beitrag von: Damian am 18 Mai 2019, 19:31:48
Dafür benutzt du das wait-Attribut. ReadingsAge brauchst du nicht.
Titel: Antw:Hilfe bei DOIF und ReadingsAge
Beitrag von: Ellert am 18 Mai 2019, 19:32:54
Du könntest mit wait arbeiten

lampe1:zustand == 0 wait 820 set lampe2 on
lampe1:zustand != 0

Der Zustandswechsel setzt wait zurück, im FHEM-Mode

alternativ, aber nicht empfohlen, könntest Du pollen mit einem Intervalltimer.

Titel: Antw:Hilfe bei DOIF und ReadingsAge
Beitrag von: dora71 am 19 Mai 2019, 13:45:20
Hallo zusammen,

und vielen Dank für Eure Hilfe. Manchmal ist es ja ganz einfach, man muss nur drauf kommen.

Für alle, die die gleichen Probleme hatten wie ich, hier die Definition:

define di_agetest DOIF ([lampe1:zustand] == 0)
  (set lampe2 on)
  (set lampe3 on)


attr di_agetest wait 820,30

So wird lampe2 nach 820 Sekunden eingeschaltet, solange lampe1:zustand den Wert 0 nicht verändert.
Kleine Erweiterung: nach weiteren 30 Sekunden schaltet dann lampe3 an.

Nochmals danke und schönen Sonntag.

Gruß Rainer
Titel: Antw:Hilfe bei DOIF und ReadingsAge
Beitrag von: Per am 20 Mai 2019, 14:08:22
Zitat von: dora71 am 18 Mai 2019, 18:17:38ReadingsAge ist dann wahrscheinlich nicht der richtige Kandidat, oder?
ReadingsAge kann nie triggern. Einzig bei 0, aber dann kannst du auch den Status selbst triggern lassen.
Umgekehrt: wenn der Status triggert, ist dessen RA immer genau 0. Du kannst also nur mit einem separaten Timeout ("wait") oder Watchdog arbeiten und dann das RA abfragen (oder dessen Alter implizieren).