DOIF Reading mit AttrVal - wie update triggern?

Begonnen von Tsturm, 14 April 2020, 22:12:52

Vorheriges Thema - Nächstes Thema

Tsturm

Hallo zusammen,

ich möchte ein Attribut von mehreren Devices auslesen, und den maximalen Wert ermitteln. Klappt alles mit Aggregation - nur das ich bei der Änderung eines Attributes eines Devices kein Event auslöse, und damit auch das DOIF-Reading nicht aktualisiert wird.

Gibt es was Eleganteres, als alle Devices durchzuschalten (dann wird's richtig aktualisiert), oder die Zuweisung schlicht einmal am Tag im DOIF über "set $SELF..." durchzuführen?

Hintergrund - Bewässerung mit 9 Kreisen; Laufzeiten sind berechnet und folgen min / max werten; Geräte werden in Gruppen zusammengefasst, um mehrere Geräte gleichzeitig zu nutzen; ich brauche das Maximum der errechneten Laufzeit, um die einzelnen Gruppen sauber nacheinander zu fahren. Die Attribute werden über alle Geräte hinweg in einer Readingsgroup modifiziert.

VG Timmo

Auszug List DOIF
Internals:

   VERSION    21224 2020-02-18 18:45:49
   DOIF_Readings:
     Runtime_Beete_Kueche_max ::AggregateDoIf($hash,'#max:','RainSW_.*','"^Runtime"','AttrVal($name,"Rain_Group_A","a") eq "Beete_Kueche"')
     Runtime_Beete_Vorne_max ::AggregateDoIf($hash,'#max:','RainSW_.*','"^Runtime"','AttrVal($name,"Rain_Group_A","a") eq "Beete_Vorne"')
     Runtime_Rasen_max ::AggregateDoIf($hash,'#max:','RainSW_.*','"^Runtime"','AttrVal($name,"Rain_Group_A","a") eq "Rasen"')
     Runtime_Terrasse_max ::AggregateDoIf($hash,'#max:','RainSW_.*','"^Runtime"','AttrVal($name,"Rain_Group_A","a") eq "Terrasse"')
   READINGS:
     2020-04-14 21:52:33   Runtime_Beete_Kueche_max 15
     2020-04-14 21:50:50   Runtime_Beete_Vorne_max 6
     2020-04-14 21:50:50   Runtime_Rasen_max 45
     2020-04-14 21:50:50   Runtime_Terrasse_max 12

   Regex:
     DOIF_Readings:
       :
         Runtime_Beete_Kueche_max:
           "RainSW_.*" RainSW_.*
         Runtime_Beete_Vorne_max:
           "RainSW_.*" RainSW_.*
         Runtime_Rasen_max:
           "RainSW_.*" RainSW_.*
         Runtime_Terrasse_max:
           "RainSW_.*" RainSW_.*
     accu:
Attributes:
   DOIF_Readings Runtime_Rasen_max:[#max:"RainSW_.*":"^Runtime":AttrVal($name,"Rain_Group_A","a") eq "Rasen"],
Runtime_Beete_Vorne_max:[#max:"RainSW_.*":"^Runtime":AttrVal($name,"Rain_Group_A","a") eq "Beete_Vorne"],
Runtime_Beete_Kueche_max:[#max:"RainSW_.*":"^Runtime":AttrVal($name,"Rain_Group_A","a") eq "Beete_Kueche"],
Runtime_Terrasse_max:[#max:"RainSW_.*":"^Runtime":AttrVal($name,"Rain_Group_A","a") eq "Terrasse"]


Auszug List eines Devices
Internals:
   NAME       RainSW_1_Beet_Teich
   NOTIFYDEV  global
   NR         89
   NTFY_ORDER 50-RainSW_1_1
   STATE      off
   TYPE       CUL_HM
(usw)
     2020-04-14 21:52:34   state           off
     2020-04-14 21:52:34   timedOn         off
     2020-04-14 21:52:34   trigLast        fhem:02
Attributes:
   Rain_Days_A 2
   Rain_Factor_A 1.0
   Rain_Group_A Beete_Vorne
   Rain_Runtime_max_A 135
   Rain_Runtime_min_A 6


Damian

Du könntest auf das Global-Event beim Ändern von Attributen triggern.

Es wäre allerdings besser min-, max-Werte in Readings abzulegen.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tsturm

Hi Damian,

danke für die Anregung - die Min/Max Werte sind Vorgaben pro Gerät (hängt vom Beet ab) - daher meine Idee, das über Attribute zu machen, die sollen sich ja nicht ständig ändern. Die eigentliche Beregnungszeit wird über Verdunstung berechnet, nur dann wird jeweils der aktuelle Maximalwert errechnet und über die Aggregation geholt, um das DOIF sauber zu timen.

Aber ich denke, ich gehe zurück auf Readings, scheint einfacher zu sein - oder ich mache einmal am Tag eine DOIF Ausführung, um die Attribute per Befehl einzusammeln, mal schauen.

BTW - einfach mal herzlichen Dank für Deine Arbeit, schon die Bastelei an den Aggregationsfunktionen war für mich echte Gehirnakrobatik - wie viel Zeit hast Du in das ganze Modul reingesteckt...

VG Timmo

Damian

Attributsänderungen bedeuten Änderung der Konfiguration, also sollten sie sich nicht ständig ändern. Ich würde sie zeitgesteuert entsprechend auswerten.

Es gibt eigentlich für die User die AggrDoIf-Funktion, die ohne interne $hash-Angaben auskommt.

PS: Wenn man etwas in der Freizeit als Hobby macht, dann zählt man nicht die Stunden, die man in sein Hobby investiert :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tsturm

Hi Damian,

Ok, mache ich so.

Die Hashes sind tatsächlich nur im List, sonst habe ich ganz normal mit den Aggregationsfunktionen gearbeitet (sieht man unten in der Definition). Kann durch das list entstanden sein, oder ein Überbleibsel der AggrDoif versuche... hash hatte ich nicht in Verwendung).

Viele Grüße - Timmo

Damian

Zitat von: Tsturm am 15 April 2020, 09:21:30
Hi Damian,

Ok, mache ich so.

Die Hashes sind tatsächlich nur im List, sonst habe ich ganz normal mit den Aggregationsfunktionen gearbeitet (sieht man unten in der Definition). Kann durch das list entstanden sein, oder ein Überbleibsel der AggrDoif versuche... hash hatte ich nicht in Verwendung).

Viele Grüße - Timmo

ja, ist mir später aufgefallen - es ist die interne Perldefinition im DOIF-Modul, weiter unten sind die tatsächlichen DOIF-Readings Definitionen zu sehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF