Autor Thema: Batteriewarnung: ein Wert als Summe aller leeren Batterien  (Gelesen 533 mal)

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3705
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'}
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamps, RPi für BLE Bodenfeuchtesenoren, Text2Speech.
Maintainer der Module: Text2Speech, TrashCal, MediaList

Meine Projekte auf https://github.com/tobiasfaust
u.a. PumpControl v2: Bewässerungssteuerung mit ESP und FHEM

Offline pataya

  • Full Member
  • ***
  • Beiträge: 203
Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
« Antwort #1 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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7592
  • eigentlich eher user wie "developer"
Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
« Antwort #2 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'}
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN
svn:MySensors, WeekdayTimer, AttrTemplate => {mqtt2, mysensors, httpmod}

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3594
Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
« Antwort #3 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"]
« Letzte Änderung: 01 April 2019, 19:00:49 von Ellert »

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3705
Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
« Antwort #4 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"}
« Letzte Änderung: 02 April 2019, 09:40:42 von Tobias »
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamps, RPi für BLE Bodenfeuchtesenoren, Text2Speech.
Maintainer der Module: Text2Speech, TrashCal, MediaList

Meine Projekte auf https://github.com/tobiasfaust
u.a. PumpControl v2: Bewässerungssteuerung mit ESP und FHEM

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3594
Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
« Antwort #5 am: 02 April 2019, 09:49:59 »
Warum ist diese Angabe doppelt?
batt_ne_ok_cnt:[#"^(BM|Door|HZ|RM|BF)_":battery:$_ ne "ok"],

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3705
Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
« Antwort #6 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?
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamps, RPi für BLE Bodenfeuchtesenoren, Text2Speech.
Maintainer der Module: Text2Speech, TrashCal, MediaList

Meine Projekte auf https://github.com/tobiasfaust
u.a. PumpControl v2: Bewässerungssteuerung mit ESP und FHEM

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3594
Antw:Batteriewarnung: ein Wert als Summe aller leeren Batterien
« Antwort #7 am: 02 April 2019, 15:13:28 »
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);
}