Ausblick: akkumulierte Abfrage, Aggregationsfunktion

Begonnen von Damian, 18 Februar 2017, 20:00:43

Vorheriges Thema - Nächstes Thema

Damian

Ich plane eine neue Form von akkumulierten Abfragen:

Die Syntax:

[#<Device>|"regex Device:regex Event":<Reading>|"regex für Reading","regex match"|<Rechnungsausdruck>,<Aggregationsausdruck>]

"regex Device:regex Event" spezifiziert sowohl den Trigger, als auch die betroffenen Devices

"regex für Reading" ist optional. Wenn es weggelassen wird, werden Stati der passenden Devices ausgewertet.

"regex match": regex für Übereinstimmungen

<Rechnungsausdruck>: mit Hilfe der Variablen $value kann eine Berechnung für das jeweilige Reading bzw. Status durchgeführt werden

<Aggregationsausdruck>: das Ergebnis der aggregierten Rechnung mit <Rechnungsausdruck> kann für weitere Berechnung verwendet werden, $number beinhaltet die Anzahl der Treffer

Rückgabe: Anzahl der Übereinstimmungen oder Ergebnis einer aggregierten Rechnung

Beispiele:

Fenster Status/Meldung

define di_Fenster DOIF ([#"^Window:open","open"] != 0) (push "Fenster $DEVICE wurde geöffnet")
DOELSEIF ([#"^Window:closed","open"] == 0) (push "alle Fenster geschlossen")

attr di_Fenster do always
attr di_Fenster cmdState $DEVICE zuletzt geöffnet|alle geschlossen


Raumtemperatur-Überwachung

define di_Raumtemp DOIF ([#"^Rooms:temperature":temperature, $value < 20] != 0) (push "Im Zimmer $DEVICE ist zu kalt")
DOELSEIF ([#"^Rooms:temperature":temperature, $value > 20] == 0) (push "alle Zimmmer sind warm")

attr di_Raumtemp cmdState es muss geheizt werden|alle Räume sind warm


Durchschnittstemperatur

define di_Tempdurchschnitt DOIF

attr di_Tempdurchschnitt State Die durchschnittliche Temperatur aller Zimmer beträgt [#"^Rooms:temperature":temperature,$value=+$value,$value/$number]


Summe aller Readings eines Devices

define di_summe DOIF

attr di_sum State Summe der Readings im mydevice, die mit "my" beginnen beträgt: [#mydevice:"^my",$value=+$value,$value]


Mit diesen Funktionen lassen sich mehrfach in einander verschachtelte Perl-Schleifen mit einem Ausdruck abdecken, es könnte aber auch als structure-Ersatz dienen, ohne einzelne Devices angeben zu müssen.

Mit einem Fragezeichen beginnend lässt sich die Triggerung wie gewohnt abschalten
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Könnte ich damit einen Zähler realisieren?

([?07:00-08:00] and $cmd=~"0|2" and  [#"^PIR$:^on$","on",$value++] = 5) ({$value=0}, set ...)
DOELSEIF ([00:00]) ({$value=0})

Wenn der PIR zwischen 7 und 8 Uhr fünf mal Bewegung (on) erkannt hat, dann führe den Befehl aus und setze $value zurück. Setze $value um Mitternacht zurück.

Damian

Zitat von: Ellert am 19 Februar 2017, 20:25:20
Könnte ich damit einen Zähler realisieren?

([?07:00-08:00] and $cmd=~"0|2" and  [#"^PIR$:^on$","on",$value++] = 5) ({$value=0}, set ...)
DOELSEIF ([00:00]) ({$value=0})

Wenn der PIR zwischen 7 und 8 Uhr fünf mal Bewegung (on) erkannt hat, dann führe den Befehl aus und setze $value zurück. Setze $value um Mitternacht zurück.

Die Idee ist etwas anders. Es geht hier um eine Funktion ohne Gedächtnis, die einfach zum Triggerzeitpunkt den aktuellen Zustand des Systems, hier aller passenden Devices in einer Schleife abarbeitet und entweder überprüft und zählt oder die Werte der dazugehörenden Stati oder Readings per Rechnung aggregiert und das Ergebnis zurückliefert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF