[gelöst] Hilfe bei DOIF und ReadingsAge

Begonnen von dora71, 18 Mai 2019, 17:46:02

Vorheriges Thema - Nächstes Thema

dora71

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

Damian

Du hast keinen Trigger definiert, daher wird deine Anweisung nie ausgeführt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dora71

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?

Damian

Dafür benutzt du das wait-Attribut. ReadingsAge brauchst du nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

#4
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.


dora71

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

Per

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).