Batteriestatus mit DOIF und unterschiedlichen Readings [GELOEST]

Begonnen von jual, 15 Januar 2023, 12:33:29

Vorheriges Thema - Nächstes Thema

jual

Jetzt muß ich mich bezüglich DOIF mal als Anfänger outen, da ich irgendwie nicht weiter komme ;-).

Ich würde gerne eine Info erstellen, wieviele Geräte einen niedrigen Batteriestand haben. Interessant finde ich den Weg über DOIF mit der Aggregatfunktion. Hier gibt es ja auch ein entsprechendes Beispiel.

Mit [#":battery":battery:$_ ne "ok"] bekomme ich die Anzahl aller Devices, deren Reading "battery" nicht auf "ok" steht. Soweit so gut.

Problem ist nun, dass die HUE Devices und auch die ZWave Devices in "battery" die Prozentangabe angeben und nicht den Status. Dieser steht in "batteryState".

Meine Idee war nun eine Aggregatfunktion zu definieren, die in etwa wie folgt aussieht:

              zähle alle Devices, (die nicht vom Typ "Zwave" sind und  nicht vom Typ "HUEDevice" und deren "battery" nicht "ok" entspricht) oder (die vom Typ "Zwave" oder Typ "HUEDevice" sind und deren "battery" == 0)

Wie ich das in ein DOIF packe für eine state-Definition ist mir nicht klar. Vielleicht kann mir jemand mal auf die Sprünge helfen.

MadMax-FHEM

Ist zwar jetzt nicht die Antwort zu DOIF...
...aber da du nicht im DOIF-Unterforum gefragt/gepostet hast, erlaube ich mir (trotzdem) eine Antwort (in eine andere Richtung):

ich nutze das hier https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514

Damit werden auch unterschiedliche Device-Typen erfasst (und es lässt sich ja erweitern).

Bzgl. Batterie und DOIF gibt es aber doch einige Threads (verm. im Unterforum zu DOIF?)...

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)

KernSani

Eine andere Möglichkeit (die nutze ich) ist, Readings zu vereinheitlichen - bei mir haben alle Batteriedevices, die keinen BatteryState liefern, ein UserReading in der Art:

batteryState {if (ReadingsNum($name, "battery", 0) > 25) {return "ok"} else {return "low"}}

(könnte man deutlich kürzer schreiben, ich weiß ;-))

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

jual

Zitat von: MadMax-FHEM am 15 Januar 2023, 14:03:34
Ist zwar jetzt nicht die Antwort zu DOIF...
...aber da du nicht im DOIF-Unterforum gefragt/gepostet hast, erlaube ich mir (trotzdem) eine Antwort (in eine andere Richtung):

ich nutze das hier https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514

Damit werden auch unterschiedliche Device-Typen erfasst (und es lässt sich ja erweitern).

Bzgl. Batterie und DOIF gibt es aber doch einige Threads (verm. im Unterforum zu DOIF?)...

Gruß, Joachim

Danke für den Hinweis, werde ich mir mal anschauen. Tatsächlich wäre es wohl besser gewesen, die Frage direkt im DOIF-Thread zu posten ;-).

jual

Zitat von: KernSani am 15 Januar 2023, 14:13:03
Eine andere Möglichkeit (die nutze ich) ist, Readings zu vereinheitlichen - bei mir haben alle Batteriedevices, die keinen BatteryState liefern, ein UserReading in der Art:

batteryState {if (ReadingsNum($name, "battery", 0) > 25) {return "ok"} else {return "low"}}

(könnte man deutlich kürzer schreiben, ich weiß ;-))

Grüße,

Oli

Vielen Dank für den Vorschlag. Das hatte ich mir jetzt auch schon überlegt, nachdem ich mit dem ersten Ansatz nicht weitergekommen bin. Ist nur etwas aufwendiger und man muß bei möglichen neuen Geräten daran denken.

jual

Nach einem Spaziergang habe ich jetzt nochmal ein paar Versuche gestartet und siehe da, ich habe tatsächlich eine Lösung gefunden.

Folgende Aggregratfunktion liefert genau die Anzahl aller Geräte zum Batteriestatus von allen Geräten - auch mit unterschiedlichen Readings. Voraussetzung ist, dass alle gesuchten Geräte mindestens das Reading "battery" haben.


[#":battery":battery:$_ if(($_ ne "ok" and $TYPE ne "ZWave" and $TYPE ne "HUEDevice") or (ReadingsNum($name,"batteryPercent",100) < 25 ))]

Damian

Du kannst statt eines festen Readings eine RegEx für verschiedene Readings angeben. In der if-Bedingung kannst du über $reading auf das jeweils aktuelle Reading zugreifen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF