Batteriestatus von unterschiedlichen Hersteller auslesen

Begonnen von pi-user, 08 Mai 2017, 11:45:57

Vorheriges Thema - Nächstes Thema

MadMax-FHEM

#15
Zitat von: pi-user am 09 Mai 2017, 10:22:16
Hallo Joachim,

wie kommst Du an Batteriestatus-Wert bei Deinem Code? Wie kann man den Batteriestatus in eine Variable speichern?

Danke.

Da ich wieder unterwegs bin wieder mal nur beschreibend:

ich habe ein notify auf .*battery.* in etwa so oder so ähnlich:

define nCalculateAndStoreBatteryStates notify .*battery.* {my_CalculateAndStoreBatteryStates($NAME)}

(ich übergebe auch gleich noch irgendwie den Readingnamen [müsste aber nachschauen wie: $READING ??] und vielleicht auch den Wert)

Dann habe ich eben eine Sub in myUtils:


my_CalculateAndStoreBatteryStates($$$) # wieviele Parameter es nun sind weiß ich grad nicht ;)
{


}


Wo ich dann abfrage, ob das Reading im Event battery oder batteryLevel (glaube ich heißt es bei Homematic), da ich Homematic Geräte habe, die sowohl battery (ok/low) als auch die aktuelle Batteriespannung melden.
Bei diesen gibt es auch ein Register wo das Batterielimit drin steht.

Dann frage ich noch den Typ ab, also ob Homematic oder ZWave und wenn Homematic, ob es vom Typ eines ist, was auch batteryLevel hat, dann nehme ich das und nicht den battery der ja auch kommt...
...bei diesen ignoriere ich dann den "battery".

Bei HM-Geräten, die nur "battery" liefern (z.B. Fensterkontank):
Bei battery = ok setze ich ein entsprechendes Reading in einem Dummy auf 100, bei low auf 0.

Bei HM-Geräten die auch den batteryLevel liefern (z.B. Wandthermostat):
Mit den batteryLevel "berechne" ich einen groben Prozentwert (voll: ca. 3.0V - 3.2V und "leer" ist dann das Limit aus dem Register) und trage den ebenfalls als Reading in den Dummy ein.

Bei ZWave nehme ich die Prozent weg und schreibe nur den Wert (ist ja bereits "Prozent") ebenfalls in den Dummy.

Den Dummy nutze ich dann zur Anzeige mit unterschiedlichen Icons und Farben (je nach "Füllstand")...

Geht sicher auch "einfacher" aber so habe ich das gelöst...

Ist aber halt sehr spezifisch für meine Gerätelandschaft...

Du müsstest halt festlegen wie du dann evtl. "Berechnungen" in der myUtils-Sub machst/machen müsstest...

EDIT: wenn ein gewisser Level unterschritten wird (bzw. von ok auf low), dann schicke ich eine Nachricht, dass es bald Zeit zum Wechseln ist.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

pi-user

Hallo Joachim,

ich danke Dir für die Infos. Ich habe nun die Richtung, die ich gehen kann.

pi-user

Nach einem get Befehl ist auf einmal das Attribut battery in der Readings Tabelle aufgetaucht. Hä!

Ich gehe davon aus, dass der Wert von diesem Attribut (battery) sich nicht mehr ändert bis ich wieder get <Device> battery aufruft! Ist das korrekt?

Danke.

Thorsten Pferdekaemper

Zitat von: pi-user am 09 Mai 2017, 15:37:59
Nach einem get Befehl ist auf einmal das Attribut battery in der Readings Tabelle aufgetaucht. Hä!
Das war zu erwarten, wenn man mal Antwort #5 und Antwort #8 aufmerksam liest.
Gruß,
   Thorsten
FUIP

MadMax-FHEM

#19
Zitat von: pi-user am 09 Mai 2017, 15:37:59
Nach einem get Befehl ist auf einmal das Attribut battery in der Readings Tabelle aufgetaucht. Hä!

Ich gehe davon aus, dass der Wert von diesem Attribut (battery) sich nicht mehr ändert bis ich wieder get <Device> battery aufruft! Ist das korrekt?

Danke.

Korrekt.

Der Wert wird bei diesem ZWave Gerät nur geliefert, wenn gefragt wird und geantwortet auf eine Frage wird erst beim Aufwachen (daher ja auch das Popup beim Absetzen des get, dein Screenshot).

Daher ja der "Trick" auf das Aufwachen zu lauschen (notify) und dann die Frage zu stellen solange das Gerät noch wach ist ;-)

Wie häufig das Gerät aufwacht kann man sich auch holen/auslesen, wenn es noch kein Reading gibt: get Befehl absetzen und warten oder aufwecken...
...den Wert kann man auch verändern.
Aber je häufiger wach desto kürzer hält die Batterie, eh klar...

Und das Attribut battery ist ein Reading ;)

Daher gibt es (bei Änderung) auch einen Event und daher kann dann das andere notify auf .*battery.* reagieren und tun was es tun soll... ;)


Zitat von: Thorsten Pferdekaemper am 09 Mai 2017, 15:42:19
Das war zu erwarten, wenn man mal Antwort #5 und Antwort #8 aufmerksam liest.
Gruß,
   Thorsten

Korrekt! ;)


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

pi-user

Zuerst vielen Dank für die Antworten. Ich werde aber mein notify direkt an diesem Z-Wave Gerät binden. Wenn ich einfach

define NotifyName notify .*battery.*

aufrufe, dann weiß ich doch nicht welches Gerät? Ich habe auch andere NICHT Z-Wave Sensoren, die ein battery Attribut haben.

Also, so wird es aussehen:

define EingangstuerBatteryState notify Eingangstuer:wakeup:.notification get Eingangstuer battery {\

# Hier kann ich den neuen Wert (Batteriestatus) aus der Reading Tabelle lesen.
}


Danke.

MadMax-FHEM

ACHTUNG:

du musst zwei Sachen auseinander halten:

1. Notify auf wakeup. "define nZWaveGetBattery notify .*.wakeup:.notification get $NAME battery" Das sollte eigentlich nur für ZWave passen, da andere Geräte andere Events erzeugen (aber besser mal prüfen). Damit holst du dir immer den aktuellen Batteriezustand von deinen ZWave-Geräten.

2. Notify auf *.battery.* mache ich deshalb, weil ich dann in meiner Sub die battery-Werte aller Geräte bekomme und dann wie geschrieben halt je nach Gerät/Typ etc. verschiedene "Berechungen" durchführe und entsprechend die Ergebnisse dann pro Gerät genau eines in einen Dummy schreibe...

Ansonsten musst du ja/halt für jedes Gerät ein )(oder zwei) passendes Notify machen und evtl. auch eine "Funktion" wo dann entsprechend "gerechnet" wird.

Wenn dir die "%" nichts ausmachen und dich nicht stören, reicht auch das Notify zum Abrufen des Batteriewertes...
...das andere mache ich ja nur, damit alle Geräte die ich habe eine "vergleichbare Anzeige" bzgl. Batteriewert haben...

...und ich eine NAchricht schicken kann, wenn etwas unterschritten wird.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Thorsten Pferdekaemper

Hi,
könnte man das "get battery" nicht auch ganz banal mit einem "at" machen? Ich nehme mal an, dass diese Geräte alle paar Minuten aufwachen, aber so oft braucht man den Batteriezustand nicht. ...also ein "at +*01:00:00..."?
Gruß,
   Thorsten
FUIP

MadMax-FHEM

Zitat von: Thorsten Pferdekaemper am 09 Mai 2017, 18:28:16
Hi,
könnte man das "get battery" nicht auch ganz banal mit einem "at" machen? Ich nehme mal an, dass diese Geräte alle paar Minuten aufwachen, aber so oft braucht man den Batteriezustand nicht. ...also ein "at +*01:00:00..."?
Gruß,
   Thorsten

Im Prinzip schon aber zumindest bei den ZWave Geräten die ich so habe sind die wakeup-Intervalle schon eher größer:

86400 Sekunden -> 24h

21600 Sekunden -> 6h

Aber ginge auch, die Antwort kommt halt erst beim nächsten Wakeup.
Ein Auslösen reicht (zumindest soweit mir bekannt und ich probiert habe, eben noch mal) nicht...

Ich hab's für ZWave halt mal wo gelesen und es tut ;)

Hauptsächlich habe ich Homematic...
...bei ZWave bin ich froh, wenn's läuft...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Thorsten Pferdekaemper

Zitat von: MadMax-FHEM am 09 Mai 2017, 18:34:00
Im Prinzip schon aber zumindest bei den ZWave Geräten die ich so habe sind die wakeup-Intervalle schon eher größer:
Ok, ich bin da von so etwas wie den HM-Thermostaten, also wenige Minuten, ausgegangen. Bei den großen Intervallen ist natürlich ein notify besser.
Gruß,
   Thorsten
FUIP

pi-user

Ich habe mir jetzt folgendes vorgenommen:

1. Ich werde auf wakeup:.notification reagieren. Ich gehe davon aus, dass nach dem Notification der Wert battery sofort in der Reading Tabelle aktualisiert wird! Vielleicht sollte ich ein sleep einbauen bevor ich den Wert aus der Reading Tabelle auslese!
2. Ich werden den Wert battery in der Tabelle Reading auslesen, da der battery Wert aktualisiert wurden ist. Und fertig oder?

MadMax-FHEM

Zu 1.: nur, wenn du dann im notify den "get Gerät battery" absetzt (wie in meinem notify von weiter vorher). Der get aktulaisiert den Wert. Sleep? Auslesen wozu? Der Wert steht doch dann im Reading battery des jeweiligen Gerätes das den notify getriggert hat und somit für den der get abgesetzt wurde.

Zu 2.: ich weiß nicht was du meinst. Warum (noch mal) auslesen? Siehe 1.

Noch mal:

wenn du nur willst, dass das Reading battery auch bei deinen ZWave Geräten kommt und aktualisiert wird (von Zeit zu Zeit), dann reicht das notify mit dem get.
Alternativ geht auch das von Thorsten vorgeschlagene at, also einfach ab und an den get battery absetzen.
Die Antwort kommt halt dann nicht sofort wenn der at den get Befehl absetzt sondern halt wenn das Gerät aufwacht.
Bei der Variante mit dem notify auf wakeup kommt die Antwort quasi sofort, da das Gerät ja (noch) wach ist...

Allerdings (zumindest) bei mir steht dann im Reading battery halt z.B. 100% also inkl. dem %-Zeichen. Und das wollte ich nicht, daher der notify auf .*battery.* wo ich dann bei ZWave eben das %-Zeichen entferne (ja geht auch anders aber nachdem ich die Funktion schon mal hatte mache ich das so). Und für meine Homematic-Geräte "berechne" ich halt Prozentangaben damit ich das für alle Geräte einheitlich habe...
Und wenn bestimmte Dinge gegeben sind schicke ich eine entsprechende Nachricht etc.

Wenn dich das %-Zeichen nicht stört und dir nur wichtig ist von allen (bzw. in dem Fall ZWave) Geräten das Reading battery zu haben, dann reicht das eine notiy auf wakeup inkl. dem get battery.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

Wo gibst du das denn ein und wie?

Warum sleep und auslesen?

Wenn du mit dem Wert arbeiten willst, dann mach doch einfach ein notify auf den battery Event, dann ist auch sicher, dass der Wert den du willst da ist...

Du musst auch deinen notify auf wakeup anpassen, dass er auch nur bei diesem Gerät triggert.

Aktuell frägst du bei jedem Wakeup von egal welchem Gerät genau nur bei WD.Eingangstuer nach battery ohne zu wissen ob das Gerät überhaupt wach ist (weil ja vielleicht der wakup von einem ganz anderen Gerät kam).

Was gefällt dir an meinem Notify nicht?
Das frägt immer für das passende (gerade aufgewachte) Gerät nach battery...

Eventuell zuerst mal ein wenig in notify etc. einlesen!?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

pi-user

#28
>Zu 1.: nur, wenn du dann im notify den "get Gerät battery" absetzt (wie in meinem notify von weiter vorher). Der get aktulaisiert den Wert. Sleep? Auslesen wozu? Der Wert steht doch dann im Reading battery >des jeweiligen Gerätes das den notify getriggert hat und somit für den der get abgesetzt wurde.

OK. Genau das möchte ich doch tun. Also, Reading battery wird nach jedem get aktualisiert. Soweit so gut. Jetzt möchte ich den Reading battery Wert auslesen.

Es funktioniert so nicht. Ich kann die Datei fhem.cfg nicht speichern, da ich eine Fehlermeldung belommen: Unknown command }, try help.

define EingangstuerBatteriestatus notify Eingangstuer.*:wakeup.* get WD.Eingangstuer battery {\

     $wert = ReadingsVal("WD.Eingangstuer ", "battery", "-1")
}


Sorry, aber ich stehe gerade wirklich auf dem Schlauch! Ich möchte nur den Wert mit % in $wert speichern. Mehr möchte ich nicht.

Danke.



DeeSPe

Anbei mal meine DEF.
Es werden Geräte mit prozentualem Batteriewert ausgewertet und Geräte mit Batteriewerten "ok/low".

define n_battery_msg notify .*:battery:.* {\
  fhem "msg ACHTUNG!!! Die Batterie von ".AttrVal($NAME,"alias",$NAME)." geht zur Neige ($EVENT)!"\
    if (($EVTPART1 =~ /^([a-z]+)$/ && $1 !~ /ok/)\
    || ($EVTPART1 =~ /^(\d{1,3})%$/ && $1 < 50))\
}


So bekomme ich eine Nachricht wenn der Batteriewert Text und was anderes als "ok" ist, oder wenn der Batteriewert ein Prozentwert und unter 50 ist.

Besser wäre natürlich dann ein Custom Reading anzulegen welches auf "lowBat" geht. Auf dieses dann das notify zum Versenden der msg. Das hätte den Vorteil dass die Nachrichten nur 1x pro Gerät rausgehen und nicht bei jedem Batterieabfragen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe