UserReadings: Unterschied zwischen den Versionen
(→Syntax) |
|||
(17 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{SEITENTITEL:userReadings}} <!-- da richtige Schreibweise kleinen Anfangsbuchstaben hat --> | {{SEITENTITEL:userReadings}} <!-- da richtige Schreibweise kleinen Anfangsbuchstaben hat --> | ||
Über das Attribut [[userReadings]] können bei einem Device benutzerdefinierte | Über das Attribut [[userReadings]] können bei einem Device benutzerdefinierte [[reading|readings]] einschließlich der Anweisungen zum Befüllen derselben festgelegt werden. Das können zum Einen Formatänderungen ("sprintf"), oder aber auch durch die ''Modifier'' | ||
* difference | * difference | ||
* differential | * differential | ||
Zeile 13: | Zeile 13: | ||
Im April 2016 hat sich die Verarbeitung des ''Triggers'' dahingehend geändert, dass die Trigger-Spezifikation jetzt als [[Regulärer Ausdruck]] interpretiert wird, damit also z.B. ein <code>avgTemp:temperature</code> geändert werden muss in <code>avgTemp:temperature.*</code>. | Im April 2016 hat sich die Verarbeitung des ''Triggers'' dahingehend geändert, dass die Trigger-Spezifikation jetzt als [[Regulärer Ausdruck]] interpretiert wird, damit also z.B. ein <code>avgTemp:temperature</code> geändert werden muss in <code>avgTemp:temperature.*</code>. | ||
Technische Details dazu wurden in {{Link2Forum|Topic=52165|LinkText=diesem Forenthread}} diskutiert. | Technische Details dazu wurden in {{Link2Forum|Topic=52165|LinkText=diesem Forenthread}} diskutiert.}} | ||
}} | Siehe {{Link2CmdRef|Anker=readingFnAttributes}}. | ||
Siehe | |||
* Bei | * Bei Eingabe im Editor-Feld müssen mehrere Befehle mit einem ";" getrennt werden, bei Änderung in der Eingabezeile sind zwei ";" notwendig. | ||
* Die Variable, dessen Wert man im Reading haben möchte, kann man einfach ans Ende stellen. | * Die Variable, dessen Wert man im Reading haben möchte, kann man einfach ans Ende stellen[https://perldoc.perl.org/functions/return.html] | ||
* mehrere UserReadings werden durch Komma getrennt. | * mehrere UserReadings werden durch Komma getrennt. | ||
:<code>myreading {my $v = ReadingsVal($name,"actuation","error")+62; fhem("set PID desired $v"); $v},</code> | |||
:<code>myreading2 {my $v = ReadingsVal($name,"actuation","error")+62; fhem("set PID2 desired $v"); $v}</code> | |||
== Beispiele == | |||
{{Randnotiz|RNTyp=g|RNText=Die nachfolgenden Beispiele sind ohne Trigger notiert. In der Regel sollte jedoch geprüft werden, ob nicht ein solcher Trigger gesetzt werden kann. Dies ist insbesondere in den Fällen sinnvoll, in denen in einem Gerät sehr viele Readings vorhanden sind, die ggf. zu unterschiedlichen Zeitpunkten aktualisiert werden. Das erste Beispiel wäre daher besser so zu schreiben:<br><code>attr ElbePegelSchoena userReadings Pegel:value.* { ReadingsVal("ElbePegelSchoena","value",0) }</code> }} | |||
==== Ein Reading soll einen anderen Namen bekommen ==== | |||
Das vorhandene Reading "value" des Devices "ElbePegelSchoena" soll künftig in "Pegel" umbenannt werden. Das geht nicht. Man kann aber ein neues Reading "Pegel" mit genau gleichem Wert erzeugen: | |||
:<code>attr ElbePegelSchoena userReadings Pegel { ReadingsVal("ElbePegelSchoena","value",0) }</code> | |||
==== Ausgabe eines Homematic 3-State Fenstersensor als Zahl für Visualisierung mit Icons ==== | |||
:<code><nowiki>attr HM_XXXXXX userReadings Statenum {if(ReadingsVal("HM_XXXXXX","state","") eq "closed") {return 0} elsif (ReadingsVal("HM_XXXXXX","state","") eq "tilted") {return 1} elsif (ReadingsVal("HM_XXXXXX","state","") eq "open") {return 2} else {return -1}}</nowiki></code> | |||
==== Ausgabe als Moving Average und Formatierung mit sprintf ==== | |||
:<code>attr HZ_EINSTRAHLUNG_RAW userReadings Einstr_Mean.av {sprintf("%.1f",movingAverage("HZ_EINSTRAHLUNG_RAW","reading",1200))}</code> | |||
==== Umrechnung der Temperatur (durch 10 geteilt) und Einheit [°C] angehängt ==== | |||
:<code>attr HZ_EINSTRAHLUNG_T userReadings SolarTemp {ReadingsVal("HZ_EINSTRAHLUNG_T","reading",0)/10 ." °C"}</code> | |||
==== Batterieüberwachung durch Erweiterung mit notify und userReading ==== | |||
... ist im Detail auf der Seite [[Batterieüberwachung]] beschrieben. | |||
= | ==== Integralfunktion - integral ==== | ||
=== Integralfunktion - integral === | |||
Die Verwendung der Integralfunktion bei ''userReadings'' ist ausführlich im Forenbeitrag {{Link2Forum|Topic=26300|Message=193084|LinkText=Integralfunktion bei UserReadings}} erklärt. | Die Verwendung der Integralfunktion bei ''userReadings'' ist ausführlich im Forenbeitrag {{Link2Forum|Topic=26300|Message=193084|LinkText=Integralfunktion bei UserReadings}} erklärt. | ||
==== Trigger ==== | |||
Die Trigger-Regex muss ein Event matchen inklusive Wert. Hier soll ''countTotalSum'' um den Wert im Reading ''count'' erhöht werden, natürlich nur wenn ein Event für das Reading ''count'' eintrifft, damit der Wert nur einmal hinzu addiert wird. (Alle anderen Events werden ignoriert.) Hier ist auf das Wortende zu achten "'''\b'''" in der Regex, damit z.B. Events für ''count1'', ''count2'', ... keinen Trigger auslösen. (Hinweis: Beim bilden der Summe kann die Benutzung von event-on-change-reading zu falschen Ergebnissen führen.) | |||
:<code>attr GasPulseCounter userReadings countTotalSum:count\b.* {my $val=ReadingsVal($name,"countTotalSum",0)+ReadingsVal($name,"count",0);;$val}</code> | |||
Hier werden einfach die Anzahl der Events für ''count'' gezählt. Events für Readingnamen, welche ledichglich mit ''count'' beginnen werden ignoriert, wegen "\b". | |||
:<code>attr GasPulseCounter userReadings inc:count\b.* {my $val=ReadingsVal($name,"inc",0)+1;;$val}</code> | |||
Zusätzlich kann der Trigger auf einen bestimmten Value beschränkt werden. Hier wird jedes auftreten des Wertes "5" gezählt. | |||
:<code>attr GasPulseCounter userReadings inc:count:.5 {my $val=ReadingsVal($name,"inc",0)+1;;$val}</code> | |||
== Links == | == Links == | ||
* | * {{Link2CmdRef|Lang=de|Anker=userReadings}} - userReadings | ||
[[Kategorie:Attribut (allgemeingültig)]] | [[Kategorie:Attribut (allgemeingültig)]] |
Aktuelle Version vom 19. März 2023, 20:25 Uhr
Über das Attribut userReadings können bei einem Device benutzerdefinierte readings einschließlich der Anweisungen zum Befüllen derselben festgelegt werden. Das können zum Einen Formatänderungen ("sprintf"), oder aber auch durch die Modifier
- difference
- differential
- integral
- offset
- monotonic
gesteuerte Berechnungen sein.
Syntax
Im April 2016 hat sich die Verarbeitung des Triggers dahingehend geändert, dass die Trigger-Spezifikation jetzt als Regulärer Ausdruck interpretiert wird, damit also z.B. ein avgTemp:temperature
geändert werden muss in avgTemp:temperature.*
.
Siehe commandref/readingFnAttributes.
- Bei Eingabe im Editor-Feld müssen mehrere Befehle mit einem ";" getrennt werden, bei Änderung in der Eingabezeile sind zwei ";" notwendig.
- Die Variable, dessen Wert man im Reading haben möchte, kann man einfach ans Ende stellen[1]
- mehrere UserReadings werden durch Komma getrennt.
myreading {my $v = ReadingsVal($name,"actuation","error")+62; fhem("set PID desired $v"); $v},
myreading2 {my $v = ReadingsVal($name,"actuation","error")+62; fhem("set PID2 desired $v"); $v}
Beispiele
attr ElbePegelSchoena userReadings Pegel:value.* { ReadingsVal("ElbePegelSchoena","value",0) }
Ein Reading soll einen anderen Namen bekommen
Das vorhandene Reading "value" des Devices "ElbePegelSchoena" soll künftig in "Pegel" umbenannt werden. Das geht nicht. Man kann aber ein neues Reading "Pegel" mit genau gleichem Wert erzeugen:
attr ElbePegelSchoena userReadings Pegel { ReadingsVal("ElbePegelSchoena","value",0) }
Ausgabe eines Homematic 3-State Fenstersensor als Zahl für Visualisierung mit Icons
attr HM_XXXXXX userReadings Statenum {if(ReadingsVal("HM_XXXXXX","state","") eq "closed") {return 0} elsif (ReadingsVal("HM_XXXXXX","state","") eq "tilted") {return 1} elsif (ReadingsVal("HM_XXXXXX","state","") eq "open") {return 2} else {return -1}}
Ausgabe als Moving Average und Formatierung mit sprintf
attr HZ_EINSTRAHLUNG_RAW userReadings Einstr_Mean.av {sprintf("%.1f",movingAverage("HZ_EINSTRAHLUNG_RAW","reading",1200))}
Umrechnung der Temperatur (durch 10 geteilt) und Einheit [°C] angehängt
attr HZ_EINSTRAHLUNG_T userReadings SolarTemp {ReadingsVal("HZ_EINSTRAHLUNG_T","reading",0)/10 ." °C"}
Batterieüberwachung durch Erweiterung mit notify und userReading
... ist im Detail auf der Seite Batterieüberwachung beschrieben.
Integralfunktion - integral
Die Verwendung der Integralfunktion bei userReadings ist ausführlich im Forenbeitrag Integralfunktion bei UserReadings erklärt.
Trigger
Die Trigger-Regex muss ein Event matchen inklusive Wert. Hier soll countTotalSum um den Wert im Reading count erhöht werden, natürlich nur wenn ein Event für das Reading count eintrifft, damit der Wert nur einmal hinzu addiert wird. (Alle anderen Events werden ignoriert.) Hier ist auf das Wortende zu achten "\b" in der Regex, damit z.B. Events für count1, count2, ... keinen Trigger auslösen. (Hinweis: Beim bilden der Summe kann die Benutzung von event-on-change-reading zu falschen Ergebnissen führen.)
attr GasPulseCounter userReadings countTotalSum:count\b.* {my $val=ReadingsVal($name,"countTotalSum",0)+ReadingsVal($name,"count",0);;$val}
Hier werden einfach die Anzahl der Events für count gezählt. Events für Readingnamen, welche ledichglich mit count beginnen werden ignoriert, wegen "\b".
attr GasPulseCounter userReadings inc:count\b.* {my $val=ReadingsVal($name,"inc",0)+1;;$val}
Zusätzlich kann der Trigger auf einen bestimmten Value beschränkt werden. Hier wird jedes auftreten des Wertes "5" gezählt.
attr GasPulseCounter userReadings inc:count:.5 {my $val=ReadingsVal($name,"inc",0)+1;;$val}
Links
- commandref/userReadings - userReadings