FHEM Forum

FHEM => Frontends => readingsGroup / readingsHistory => Thema gestartet von: Tobias am 01 April 2019, 08:59:54

Titel: Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag von: Tobias am 01 April 2019, 08:59:54
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'}

Titel: Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag von: pataya am 01 April 2019, 15:09:40
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.
Titel: Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag von: Beta-User am 01 April 2019, 15:22:56
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'}
Titel: Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag von: Ellert am 01 April 2019, 18:57:15
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"]
Titel: Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag von: Tobias am 02 April 2019, 09:39:05
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"}
Titel: Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag von: Ellert am 02 April 2019, 09:49:59
Warum ist diese Angabe doppelt?
batt_ne_ok_cnt:[#"^(BM|Door|HZ|RM|BF)_":battery:$_ ne "ok"],
Titel: Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag 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?
Titel: Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
Beitrag von: Ellert am 02 April 2019, 15:13:28
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);
}