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