Verwendung von selbst gesetzten Attributwerten z.B. aus userattr

Begonnen von Spook112, 24 November 2015, 23:16:36

Vorheriges Thema - Nächstes Thema

Spook112

Hi,
ich bräuchte mal Unterstützung bei folgender "Aufgabenstellung:
Meine batteriebetriebenen ZWAVE Devices werden zyklisch (täglich) per GET Abfrage nach dem "Füllstand" der Batterien gefragt.
Wenn die Rückmeldung (ein Prozentwert) einen gewissen Wert unterschreitet soll automatisch eine Email versendet werden.
Das klappt so weit auch ganz gut.
SZE_Fenster:battery:.*|WZA_Terrassentuer:battery:.* {my @EVENT = split(/ /,$EVENT);{if ($EVENT[1] <= 99) {system ("echo 'Achtung! \nDer Fenster-\/Tuerkontakt $NAME hat folgende Meldung abgesetzt:\n$EVENT\n$EVENT[1]' |mail -s 'FHEM Warning von $NAME' webmaster\@mydomain.de" );}}}
Hinweis am Rande: Die Ausgabe die in $EVENT landet lautet:  battery: xxx %
Deshalb der split des Attributwertes, um an die Zahl des Prozentwertes ran zu kommen.
Nun sind die 99% natürlich nur ein Testwert und ich möchte eigentlich in einem selbstdefinierten oder bereits vorhandenen und dafür nutzbaren Attribut einen Wert hinterlegen und auch zentral ändern können, ohne dabei immer den Code der Abfrage anpassen zu müssen.

Gibt es dafür eine Möglichkeit über ein globales Atribut oder ein Atribut, dass man bei dem verwendeten notify setzen könnte?
Ich dachte dabei beispielsweise an das Attribut "userattr" - das scheint ja sonst nicht verwendet zu werden.
Geht das und wie müsste man das machen?
Speziell das Auslesen des Attributwertes zur Laufzeit, also wenn das Notify "abgearbeitet" wird, iteressiert mich dabei.

Danke im Voraus
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

igami

Das Split kannst du dir schon mal sparen, dafür gibt es EVTPART.
Deinen Ladestand solltest du eher in ein Reading, als in ein Attribut schreiben, dafür kannst du einfach setreading verwenden.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

rudolfkoenig

Oder man verwendet ds Attribut comment, oder man erweitert userattr (global: dann gilt es fuer alle oder lokal) mit minBattery:slider,10,10,90, und man fragt diesen mit AttrVal($NAME, "minBattery", 10) ab.

Spook112

Hi und danke für die Antworten.
Zu igami:
ZitatDas Split kannst du dir schon mal sparen, dafür gibt es EVTPART.
Irgendwie hatte ich den Hinweis in der Command Ref so verstanden, dass die "deprecated and will be removed" status haben, aber beim nochmaligen Lesen bezieht sich das wohl doch nicht komplett auf die $EVTPART0,$EVTPART1,$EVTPART2,etc

Den Ladezustand möchte ich auch nicht in ein Attribut schreiben, sondern den von mir festgelegten Grenzwert, mit dem die Rückmeldung des Ladezustands verglichen werden soll.

Den Hinweis von rudolfkönig habe ich ehrlich gesagt noch nicht ganz verstanden.
Ich möchte doch nur statt des jetzt fest eingetagenen Wertes 99% (Beispielwert) ($EVENT[1] <= 99) eine Variable nutzen, die sich den jeweils aktuellen Wert aus einem Attribut ausliest.
Ist das tatsächlich ein Lösungsansatz dafür?

Und wenn ja, dann versteheh ich noch nicht so recht was davon genau was macht oder machen soll.

Bin für jeden Hinweis oder Erläuterung dankbar
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

rudolfkoenig

attr SZE_Fenster userattr minBattery:slider,10,10,90
attr WZA_Terrassentuer userattr minBattery:slider,10,10,90
define n_battery notify SZE_Fenster:battery:.*|WZA_Terrassentuer:battery:.* {\
  if ($EVTPART1 <= AttrVal($NAME,"minBattery",10) {\
    system("echo 'Achtung! \nDer Fenster-\/Tuerkontakt $NAME hat folgende Meldung abgesetzt:\n$EVENT\n$EVTPART1' |mail -s 'FHEM Warning von $NAME' webmaster\@mydomain.de" );\
  }\
}


Im Detailfenster von SZE_Fenster oder WZA_Terrassentuer kann man in der Attributszeile minBattery auswaehlen, und per slider einen gewuenschten Wert einstellen (danach attr druecken). Dieser Wert wird ab sofort zum Vergleich drangezogen. Falls vorher Werte in userattr waren, dann bitte ergaenzen, nicht ersetzen.

Spook112

Hm, das sieht schon mal ganz gut aus.
Nachdem ich kapiert habe, dass ich erst mittels attr WZA_Terrassentuer userattr minBattery:slider,10,10,90
das neue Attribut erzeugen muss, und wenn ich dass dadurch neu entstandene Attribut minBattery dann auswähle den Schieberegler sehe und den Wert zwischen Untergrenze 10 in Intervallgröße 10 bis Obergrenze 90 einstellen kann war diesbezüglich alles klar  :)

Allerdings stellt sich mir trotzdem noch die Frage was der Wert 10 in der IF Abfrage zu suchen/bedeuten hat.
Den möchte ich da ja nicht fest reinschreiben sondern automatisch auslesen lassen.
if ($EVTPART1 <= AttrVal($NAME,"minBattery",10)
Wenn ich diesen Teil richtig verstehe sorgt $NAME dafür, dass der Attributwert des Attributes minBattery des Gerätes das den Event ausgelöst hat abgefragt werden soll. Das müsste dann ja der zuletzt dort eingestellte und abgespeicherte Schiebereglerwert sein.
Wozu ist dann noch die 10 gut?

Weitergehende Überlegung dazu:
Wenn ich bei allen Geräten den selben Grenzwert verwenden wollte/würde könnte ich doch das Attribut minBattery auch direkt in dem zugehörigen "notify" Low_Battery_Warning erstellen und dann in der IF Abfrage statt der Variablen $NAME den "Gerätenamen" Low_Battery_Warning eintragen - oder nicht.
Also quasi so:
define Low_Battery_Warning notify AZ_Fenster:battery:.*|FEG_Hauseingangstuer:battery:.*|WZA_Terrassentuer:battery:.* {if ($EVTPART1 <= AttrVal(Low_Battery_Warning,"minBattery",10) {system ("echo 'Achtung! \nDer Fenster-\/Tuerkontakt $NAME hat folgende Meldung abgesetzt:\n$EVENT\n$EVENT[1]' |mail -s 'FHEM Warning von $NAME' webmaster\@mydomain.de" );;}}
attr Low_Battery_Warning userattr minBattery:slider,10,10,90
attr Low_Battery_Warning minBattery 90


Es bleibt aber die Frage nach dem Zweck der Zahl 10 :)
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren

rudolfkoenig

#6
ZitatEs bleibt aber die Frage nach dem Zweck der Zahl 10 (http://forum.fhem.de/Smileys/default/smiley.gif)
Die Frage laesst sich leicht nach dem Studium der commandref (http://fhem.de/commandref.html#perl) beantworten: falls man vergessen hat das Attribut zu setzen, dann liefert AttrVal 10 zurueck.

P.S.: in
ZitatAttrVal(Low_Battery_Warning,"minBattery",10)
fehlt das Hochkomma fuer Low_Battery_Warning. Fuer sowas empfehle ich das Studium eines Perl-Anfaenger-Buches.

Spook112

Vielen Dank für die Erläuterungen - es funktioniert jetzt genau so wie ich es erhofft hatte.

Für alle die den Anwendungsfall vielleicht auch mal haben und eine Lösung suchen:
define Low_Battery_Warning notify AZ_Fenster:battery:.*|FEG_Hauseingangstuer:battery:.*|WZA_Terrassentuer:battery:.* {if ($EVTPART1 <= AttrVal("Low_Battery_Warning","minBattery",10) {system ("echo 'Achtung! \nDer Fenster-\/Tuerkontakt $NAME hat folgende Meldung abgesetzt:\n$EVENT' |mail -s 'FHEM Warning von $NAME' webmaster\@mydomain.de" );;}}
attr Low_Battery_Warning userattr minBattery:slider,10,10,90
attr Low_Battery_Warning minBattery 90


Für alle batteriebetriebenen Geräte muß natürlich noch dafür gesorgt werden, dass sie zyklisch ein wakeup machen und dabei eine mittels "get AZ_Fenster battery" abgesetzte Abfrage der Batterieladung zurückmelden.
Das habe ich so gemacht:
define AZ_Fenster_batterie_auslesen at *12:00:00 get AZ_Fenster battery
Raspberry PI / RaZberry ZWAVE Modul / RFXTRX433E / 13 Fibaro FGS-222-EN-A-v1.00 / 17 VISION ZD2102-5 / 10 Somfy RTS / 4 Greenwave GWRENS310-F / Gardena Sileno City / 3 Gardena Gartensteckdosen / 2 devolo Home Control Funkschalter / 8 FIBARO System FGSD002 Smoke Sensoren