Batteriewarnung: ein Wert als Summe aller leeren Batterien

Begonnen von Tobias, 01 April 2019, 08:59:54

Vorheriges Thema - Nächstes Thema

Tobias

Hi,
ich habe eine RG meiner Batterien. Nun möchte ich aber ein Reading haben, welches angibt, ob mindestens eine leere Batterie in der RG dabei ist. Hat dafür einer eine Lösung parat?

defmod RG_Battery readingsGroup .*:[Bb]attery .*:[Bb]atteryLevel
attr RG_Battery DbLogExclude .*
attr RG_Battery disable 1
attr RG_Battery mapping {'battery' => ' %DEVICE', 'batteryLevel' => ' %DEVICE'}
attr RG_Battery notime 1
attr RG_Battery room 99_Devices
attr RG_Battery valueFormat {return "0" if( $VALUE eq "low" );;;; return "100" if( $VALUE eq "ok" );;;; return "25" if( $VALUE < 2.1 );;;; return "50" if( $VALUE < 2.3 );;;; return "75" if( $VALUE < 2.5 );;;; return "100"}
attr RG_Battery valueIcon {'battery.0' => 'measure_battery_0@red','battery.100' => 'measure_battery_100@green','Battery.0' => 'measure_battery_0@red','Battery.100' => 'measure_battery_100@green','batteryLevel.0' => 'measure_battery_0@red','batteryLevel.25' => 'measure_battery_25@red','batteryLevel.50' => 'measure_battery_50@orange','batteryLevel.75' => 'measure_battery_75@green','batteryLevel.100' => 'measure_battery_100@green'}

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

pataya

Würde behaupten das das in der RG nicht funktioniert.

Habe es bei mir vor einiger Zeit mit einem Dummy (Batteriewarnung_devs) und folgendem notify gelöst:

.*:[Bb]attery:.* {
fhem ('setreading Batteriewarnung_devs '.$NAME.' '.$EVTPART1);;
}


Lässt sich für deinen Fall ja erweitern/ändern indem du bspw. die Readings des Dummys überprüfst.

Beta-User

Da mich in der ReadingsGroup häufiger interessiert, was nicht ok ist, habe ich ein paar gebastelt, die nur bedingt was anzeigen:
Gut funktioniert z.B. das hier:
define Status_RS485 readingsGroup <Gerät>,<Status> TYPE=MYSENSORS_DEVICE:FILTER=IODev=MySensorsRS485GW:state
attr Status_RS485 valueFormat {$VALUE !~ m/alive/?$VALUE:undef;;}
attr Status_RS485 valueIcon {'state.dead' => 'lan_rs485@orange','state.NACK' => 'lan_rs485@red' }


Für Batterien (HM-Gerät@CUL_HM) habe ich auch was, aber der Code sieht bei genauer Betrachtung schräg aus (wieso ist da "ok" noch drin und die 4 ";" müssen auch nicht sein, zwei sollten genügen...?; funktioniert aber optisch, daher ist mir das bisher nicht aufgefallen.) :
define ZE.Batterie readingsGroup <Gerät>,<Batterie>,<Aktualisierung> .*:batteryLevel
attr ZE.Batterie valueFormat {return "0" if( $VALUE eq "low" );; return "100" if( $VALUE eq "ok" );; return "25" if( $VALUE < 2.1 );; return "50" if( $VALUE < 2.3 );;;;return undef}
attr ZE.Batterie valueIcon {'battery.0' => 'measure_battery_0@red','battery.100' => 'measure_battery_100@green','Battery.0' => 'measure_battery_0@red','Battery.100' => 'measure_battery_100@green','batteryLevel.0' => 'measure_battery_0@red','batteryLevel.25' => 'measure_battery_25@red','batteryLevel.50' => 'measure_battery_50@orange','batteryLevel.75' => 'measure_battery_75@green','batteryLevel.100' => 'measure_battery_100@green'}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Ellert

#3
DOIF stellt eine Aggregationsfunktion bereit, siehe https://commandref.fhem.de/commandref_DE.html#DOIF_aggregation

für Raw definition

defmod batt DOIF {}
attr batt event_Readings batt_ne_ok:[@"":battery:$_ ne "ok"]

Das Reading batt_ne_ok lässt sich dann in eine readingsGroup einbinden.

Damit nicht alle Geräte triggern sollte eine Regex für die Batteriegeräte erstellt werden, z.B.
Zitat[@"^HM_":battery:$_ ne "ok"]

Tobias

#4
Danke Ellert,
bei DOIF sehe ich nicht wirklich durch, liegt aber an der Komplexität.

Ich habe es jetzt folgendermassen. Das Userreading ist für eine MQTT_Bridge für ein ESP8266 HomeStatusDisplay von Joker
defmod DOIF_BatteryCheck DOIF {}
attr DOIF_BatteryCheck DbLogExclude .*
attr DOIF_BatteryCheck event-min-interval batt_ne.*:1800
attr DOIF_BatteryCheck event_Readings batt_ne_ok:[@"^(BM|Door|HZ|RM|BF)_":battery:$_ ne "ok"],\
batt_ne_ok_cnt:[#"^(BM|Door|HZ|RM|BF)_":battery:$_ ne "ok"],
attr DOIF_BatteryCheck room CUL_HM
attr DOIF_BatteryCheck stateFormat batt_ne_ok_cnt NOK
attr DOIF_BatteryCheck userReadings batt_ne_ok_status:batt_ne_ok_cnt.* {(ReadingsVal($name,"batt_ne_ok_cnt",0)>0)?"On":"Off"}
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Ellert

Warum ist diese Angabe doppelt?
batt_ne_ok_cnt:[#"^(BM|Door|HZ|RM|BF)_":battery:$_ ne "ok"],

Tobias

einmal werden die Devices als Liste ausgegeben, einmal als anzahl.
Die Anzahl wird im Stateformat als Status angezeigt als auch als Input für das Userreading benutzt.
Hast du eine bessere Idee? Ist das doppelt inperformant?
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Ellert

Zitat von: Tobias am 02 April 2019, 10:13:13
einmal werden die Devices als Liste ausgegeben, einmal als anzahl.
Die Anzahl wird im Stateformat als Status angezeigt als auch als Input für das Userreading benutzt.
Hast du eine bessere Idee? Ist das doppelt inperformant?
Ok, jetzt sehe ich den Unterschied.
Wenn Du alle 3 Readings benötigst, würde ich das mit DOIF im Perlmodus lösen. Dann kannst Du alle Reading über BulkUpdate setzen und musst die Aggregation nur einmal ausführen.

{
  my $batt = [@"^(BM|Door|HZ|RM|BF)_":battery:$_ ne "ok"];
  set_Reading_Begin;
    set_Reading_Update("batt_ne_ok",$batt);
    set_Reading_Update("batt_ne_ok_cnt",split(",",$batt));
    set_Reading_Update("batt_ne_ok_status",split(",",$batt)>0?"On":"Off");
  set_Reading_End(1);
}