DOIF Batterie Überwachung

Begonnen von wuast94, 27 Dezember 2019, 17:25:19

Vorheriges Thema - Nächstes Thema

noom0815

Hallo amenomade,

das habe ich bereits:

Zitat von: noom0815 am 10 April 2020, 19:35:04
...
Auch im EventMonitor sehen die jeweiligen Einträge gleich aus: DUOFERN Feuermelder batteryPercent: 100 vs HUEDevice FB_Schlafzimmer battery: 74...

Genau das sind die Events im EventMonitor - aber vielleicht gibt es ja noch weitere Infos . Musst mir dann nur sagen, wie ich die liefern kann... ;)

noom0815

Zitat von: Damian am 11 April 2020, 19:55:47
[":^battery$",100] geht nicht, weil hinter battery noch der Wert kommt. Ich befürchte, du musst dir anschauen, welche Devices sinnvolle battery-Angaben haben und diese Devices per Regex mit in die Bedingung angeben.

["^(Dev1|Dev2|Dev3):^battery",100]

Dabei gelten die Angaben nur als Präfix, d. h. alle die mit Dev1 oder mit Dev2 oder mit Dev3 anfangen.

und das Gleiche mit or mit batteryPercent für die anderen Devices definieren.

Danke Damian - soweit verstanden.
Der erste Teil [":^battery",100] funktioniert wie gesagt einwandfrei mit allen Hue und Xiaomi devices - nur mein EINER Feuermelder macht Probleme... ::)

Was ich nicht kapiere:
In meiner readingsGroup für die Batterie-Level bekomme ich mit
defmod Batterie readingsGroup .*:battery .*:batteryPercent
korrekte Daten für die verschiedenen Device-Typen, also z.B.:

Bewegungsmelder:battery 87
2020-04-11 20:42:38
...
Fenster_Test:battery 98
2020-04-11 20:45:13
...
Feuermelder:batteryPercent 100
2020-04-11 19:27:32


Warum ist das reading in der readingsGroup korrekt, im DOIF allerdings wird ein anderes ausgewertet?
Ich werde vermutlich im DOIF zukünftig den Batteriestatus des Feuermelders auswerten, aber interessieren würde es mich trotzdem...

Grüße,
Ian

amenomade

#32
Zitat von: noom0815 am 11 April 2020, 20:30:19
Hallo amenomade,

das habe ich bereits:


Genau das sind die Events im EventMonitor - aber vielleicht gibt es ja noch weitere Infos . Musst mir dann nur sagen, wie ich die liefern kann... ;)
Ich meinte einen Auszug aus dem Eventmonitor, damit man u.a. auch sehen kann, ob andere Readings gleichzeitig geliefert werden, insb. Readings, die mit battery anfangen.

Wie ich dir im anderen DUOFERN Thread geantwortet habe, liefert das Modul systematisch zwei Readings:
1418     my $battery      = (hex(substr($msg,  8, 2)) <= 10 ? "low" : "ok");
1419     my $batteryLevel =  hex(substr($msg,  8, 2));
1420    
1421     readingsBeginUpdate($hash);
1422     readingsBulkUpdate($hash, "batteryState",     $battery,       1);
1423     readingsBulkUpdate($hash, "batteryPercent",   $batteryLevel,  1);


Daher:
[":^battery$",100] => wird dabei gar nicht reagieren
[":^battery",100] = wird bei beiden Readings reagieren, einmal mit batteryState "ok" oder "low", wo ich nicht weiss, wie DOIF es dann bewertet, und einmal mit dem numerischen Wert batteryPercent, der dann korrekt bewertet wird.

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

Zitat von: noom0815 am 11 April 2020, 20:59:11
Danke Damian - soweit verstanden.
Der erste Teil [":^battery",100] funktioniert wie gesagt einwandfrei mit allen Hue und Xiaomi devices - nur mein EINER Feuermelder macht Probleme... ::)

Was ich nicht kapiere:
In meiner readingsGroup für die Batterie-Level bekomme ich mit
defmod Batterie readingsGroup .*:battery .*:batteryPercent
korrekte Daten für die verschiedenen Device-Typen, also z.B.:

Bewegungsmelder:battery 87
2020-04-11 20:42:38
...
Fenster_Test:battery 98
2020-04-11 20:45:13
...
Feuermelder:batteryPercent 100
2020-04-11 19:27:32


Warum ist das reading in der readingsGroup korrekt, im DOIF allerdings wird ein anderes ausgewertet?
Ich werde vermutlich im DOIF zukünftig den Batteriestatus des Feuermelders auswerten, aber interessieren würde es mich trotzdem...

Grüße,
Ian
Wenn die Readings in einem Event-Block kommen, dann wird immer der erste Treffer ausgewertet, d. h. wenn zuerst batteryState zuschlägt, wird innerhalb der Blocks nicht weiter gesucht und batteryPercent kommt nicht mehr zum Zuge.

Es gibt aber noch eine Möglichkeit:

[":^(battery:|batteryPercent:)",100]

Damit wird genau auf battery und genau auf batteryPercent getriggert und sonst nichts. Wenn ein battery-Reading ok oder low beinhaltet, müsste man es vor dem Vergleich abfangen. Das lässt sich leicht mit DOIF-Perl bewerkstelligen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

Frage an dich Damian zu meinem Verständnis: was liefert [":^battery",100] wenn batteryState mit "low" oder "on" triggert?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

#35
Zitat von: amenomade am 11 April 2020, 21:54:27
Frage an dich Damian zu meinem Verständnis: was liefert [":^battery",100] wenn batteryState mit "low" oder "on" triggert?

Ganz einfach low bzw.  on, denn in der Heiligen Bibel (Commandref) steht:

ZitatWenn kein Filter, wie obigen Beispiel, angegeben wird, so wird intern folgende Regex vorbelegt: "[^\:]*: (.*)" Damit wird der Wert hinter der Readingangabe genommen. Durch eigene Regex-Filter-Angaben kann man beliebige Teile des Events herausfiltern, ggf. über Output formatieren und in der Bedingung entsprechend auswerten, ohne auf Readings zurückgreifen zu müssen.

Damit gilt der Filter: "[^\:]*: (.*)"

Wie gesagt, damit sollte das Problem vom Tisch sein:

defmod di_battery DOIF {$_value=[":^(battery:|batteryPercent:)",100];; if ($_value eq "low" or $_value < 20) {fhem_set("Pushnachricht message Batteriewarnung $device $_value")}}


Falls es noch andere battery-Readings gibt, so kann man sie genau mit einem Doppelpunkt jeweils am Ende spezifizieren. batteryState wird bei diesen Angabe ausgeschlossen.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

noom0815

Die Feuermelder-readings kommen tatsächlich in einem Event-Block:


2020-04-07 12:55:28 DUOFERN Feuermelder batteryState: ok
2020-04-07 12:55:28 DUOFERN Feuermelder batteryPercent: 100


Mit Damians Erläuterung ist dann klar, dass das zweite reading batteryPercent nicht mehr ausgewertet wird.

@Damian:
Habe ich es richtig verstanden, dass man bei der expliziten Abfrage von [":^(battery:|batteryPercent:)",100] das erste reading im Block (also hier batteryState) ignoriert wird und DOIF dann auch weitere readings (hier das zweite batteryPercent) auswertet?

Müsste es dann (da ja nicht mehr der batteryState ausgewertet wird) nicht heißen:


defmod di_battery DOIF {$_value=[":^(battery:|batteryPercent:)",100];; if ($_value < 20) {fhem_set("Pushnachricht message Batteriewarnung $device $_value")}}



Danke für eure Hilfe - so ganz trivial scheint es dann ja doch nicht zu sein... ;)

Damian

Mit der Angabe des Doppelpunktes sind die Readingangaben keine Präfixe mehr, sondern konkrete Readings. Die low-Abfrage habe ich einfach nur zur Sicherheit eingebaut, falls es bei den angegebenen Readings angaben mit low geben sollte. Bei mir z. B. im ganzen System  gibt es nur low und ok.

Du solltest dir aber bewusst machen, dass solche Definitionen jedes Event im System durchsuchen müssen - mir hätte die hier bereits vorgestellte Lösung mit dem Timer ausgereicht.



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

Zitat von: Damian am 11 April 2020, 22:06:21
Ganz einfach low bzw.  on, denn in der Heiligen Bibel (Commandref) steht:

Damit gilt der Filter: "[^\:]*: (.*)"
Danke für die Erklärung. Dummerweise hatte ich mir vorgestellt, dass er durch die Eingabe von 100  irgendwie versucht, den Wert wie einen numerischen Wert zu interpretieren. Das ist eigentlich simpler.

Das mit dem Evenblock war mir auch nicht bekannt. Das sind aber doch 2 unterschiedliche Events? Aber ok, vom gleichen Device (Trigger)
Man lernt ja jeden Tag ;)

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

Zitat von: amenomade am 12 April 2020, 01:20:05
Danke für die Erklärung. Dummerweise hatte ich mir vorgestellt, dass er durch die Eingabe von 100  irgendwie versucht, den Wert wie einen numerischen Wert zu interpretieren. Das ist eigentlich simpler.

Das mit dem Evenblock war mir auch nicht bekannt. Das sind aber doch 2 unterschiedliche Events? Aber ok, vom gleichen Device (Trigger)
Man lernt ja jeden Tag ;)

Beim numerischen Vergleich mit "on" wird er eine Warnung bekommen haben. Man kann auch einen Filter so angeben, dass nur Zahlen durchkommen.

ja, es sind zwei unterschiedliche Events innerhalb eines Event-Blocks. Dieser wird komplett an ein Device wie notify oder DOIF gesendet.

DOIF hört beim ersten Treffer auf, notify macht beim nächsten weiter.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

noom0815

Zitat von: Damian am 11 April 2020, 22:57:38
Mit der Angabe des Doppelpunktes sind die Readingangaben keine Präfixe mehr, sondern konkrete Readings. Die low-Abfrage habe ich einfach nur zur Sicherheit eingebaut, falls es bei den angegebenen Readings angaben mit low geben sollte. Bei mir z. B. im ganzen System  gibt es nur low und ok.

Du solltest dir aber bewusst machen, dass solche Definitionen jedes Event im System durchsuchen müssen - mir hätte die hier bereits vorgestellte Lösung mit dem Timer ausgereicht.

Hallo zusammen,

besten Dank nochmal für Eure Hilfe!
Die Hinweise waren wirklich sehr hilfreich - und da eine täglich einmalige Abfrage des Batteriezustandes völlig ausreichend ist, habe ich auch dies (nach stundenlangem try & error  ::)) umgesetzt...

Grüße,
Ian

Thomas0401

#41
Hallo an die Profis,

dieser Thread ist schon etwas älter aber ich denke immer noch passend. Ich habe ein DOIF für die Abfrage meiner Rauchmelder und eins für Abfrage Türen/Fenster. Allerdings lasse ich mir keine Nachricht senden, sondern visualisiere die Anzahl und welchen Device ausglöst hat.
Hier mal die Abfrage Türen/Fenster

([#".*_Tuer":dwIsOpened:"1"] >0)
(
  set $SELF openWindowsCount [#".*_Tuer":dwIsOpened:"1"],
  set $SELF openWindowsState geoeffnet
)
DOELSE
(
  set $SELF openWindowsCount [#".*_Tuer":dwIsOpened:"0"],
  set $SELF openWindowsState geschlossen
)


Das gleiche möchte ich gerne mit meinen batteriebetriebenen Aktoren machen (Fensterkontakt, Thermostat, Rauchmelder)

Am folgenden Code habe ich mich versucht aber bekomme es nicht hin

([#".*_Tuer\_HK\_Rauchmelder":[Bb]attery:"1"] >35)
(
  set $SELF Batterystate [#".*_Tuer\_HK\_Rauchmelder":[Bb]attery:"<35"],
  set $SELF BatteryState Batterie-LOW
)
DOELSE
(
  set $SELF Batterystate [#".*_Tuer\_HK\_Rauchmelder":[Bb]attery:" >35"],,
  set $SELF BatteryState Batterie-OK
)


Trotz lesen der Bibel komme ich nicht auf eine Lösung. Kann mir evtl. jemand einen Tipp geben?

VG Thomas

Thomas0401

#42
Moin,

so wie ich das gedacht habe funktioniert das wohl leider nicht. Ich habe mir stattdessen ein userReading angelegt.
batterylevel { if (ReadingsVal($name,"battery",0) <= 25) {return "1";} else {return "0";} }

Hier mal ein List, vielleicht kann es jemand nutzen.
Internals:
   .FhemMetaInternals 1
   FUUID      607f1a04-f33f-20b7-84d1-7c818dc5a2c9e68a
   FVERSION   10_MQTT_DEVICE.pm:0.173620/2018-09-17
   IODev      Mosquitto
   NAME       MQTT_EG_Flur_Rauchmelder
   NR         134
   STATE      0
   TYPE       MQTT_DEVICE
   .attraggr:
   .attreocr:
     .*
   .attrminint:
   .qos:
     *          0
   .retain:
     *          0
   .userReadings:
     HASH(0x6b06a68)
     HASH(0x6bad838)
   READINGS:
     2021-05-09 10:09:21   IODev           Mosquitto
     2021-05-09 11:07:26   battery         100
     2021-05-09 11:07:26   batterylevel    0
     2021-05-08 22:00:30   smoke-detected  false
     2021-05-09 11:07:26   transmission-state incoming publish received
     2021-05-09 11:07:26   truefalse       0
   message_ids:
   sets:
   subscribe:
     zigbee/0/00158d00052cdc7d/battery
     zigbee/0/00158d00052cdc7d/detected
   subscribeExpr:
     ^zigbee\/0\/00158d00052cdc7d\/battery$
     ^zigbee\/0\/00158d00052cdc7d\/detected$
   subscribeQos:
     zigbee/0/00158d00052cdc7d/battery 0
     zigbee/0/00158d00052cdc7d/detected 0
   subscribeReadings:
     zigbee/0/00158d00052cdc7d/battery:
       cmd       
       name       battery
     zigbee/0/00158d00052cdc7d/detected:
       cmd       
       name       smoke-detected
Attributes:
   DbLogExclude .*
   IODev      Mosquitto
   alias      Rauchmelder-EG-Flur
   devStateIcon 1:secur_smoke_detector@red 0:secur_smoke_detector
   event-on-change-reading .*
   icon       secur_smoke_detector
   room       EG->Flur,MQTT,Rauchmelder
   stateFormat truefalse
   subscribeReading_battery zigbee/0/00158d00052cdc7d/battery
   subscribeReading_smoke-detected zigbee/0/00158d00052cdc7d/detected
   userReadings truefalse { if(ReadingsVal($name,"smoke-detected",0) eq "false") {return "0";} else {return "1";} },
batterylevel { if (ReadingsVal($name,"battery",0) <= 25) {return "1";} else {return "0";} }
   userattr   subscribeReading_smoke-detected subscribeReading_battery


und vom Monitoring-DOIF

Internals:
   .FhemMetaInternals 1
   DEF        ([#".*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK:batterylevel:"0"] <1)
(
  set $SELF Batterystate [#".*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK:batterylevel:"1"],
  set $SELF BatteryState Batterie-LOW
)
DOELSE
(
  set $SELF Batterystate [#".*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK:batterylevel:"0"],,
  set $SELF BatteryState Batterie-OK
)
   DOIFDEV    ^global$|.*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK
   FUUID      60961836-f33f-20b7-c8ee-cd0b27df57a840f4
   FVERSION   98_DOIF.pm:0.244000/2021-05-08
   MODEL      FHEM
   NAME       doif_Monitoring_Batterie
   NR         156
   NTFY_ORDER 50-doif_Monitoring_Batterie
   STATE      Batterie-OK (23)
   TYPE       DOIF
   VERSION    24400 2021-05-08 16:30:53
   .attraggr:
   .attreocr:
     .*
   .attrminint:
   READINGS:
     2021-05-09 11:31:03   BatteryState    Batterie-OK
     2021-05-09 11:31:03   Batterystate    23
     2021-05-09 11:31:03   cmd             2
     2021-05-09 11:31:03   cmd_event       doif_Monitoring_Batterie
     2021-05-09 11:31:03   cmd_nr          2
     2021-05-09 11:31:00   mode            enabled
     2021-05-09 11:31:03   state           cmd_2
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           ".*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK:batterylevel:" .*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK:batterylevel:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'#','.*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK') <1
   do:
     0:
       0             set doif_Monitoring_Batterie Batterystate [#".*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK:batterylevel:"1"],   set doif_Monitoring_Batterie BatteryState Batterie-LOW
     1:
       0             set doif_Monitoring_Batterie Batterystate [#".*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK:batterylevel:"0"],,   set doif_Monitoring_Batterie BatteryState Batterie-OK
   helper:
     DEVFILTER  ^global$|.*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK
     NOTIFYDEV  global|.*.*_Tuer|.*_Rauchmelder|.*_Motion|.*_HK.*
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Abfrage-Batterie
   checkall   event
   do         always
   event-on-change-reading .*
   icon       measure_battery_75
   readingList Batterystate BatteryState
   room       Monitor-Batterie,System->Logik
   stateFormat BatteryState (Batterystate)


und ein Auszug aus FTUI


<li data-row="6" data-col="4" data-sizex="1" data-sizey="3">
<header>Status Batterie</header>
<div class="sheet">
<div class="row">
<div class="cell">
<div data-type="popup" id="fenster" data-height="600px" data-width="1300px" data-return-time="45" data-draggable="false" data-return-time="10" data-mode="no-animate">
<div data-type="symbol" data-device="doif_Monitoring_Batterie" data-get="BatteryState" data-get-on='["Batterie-OK","Batterie-LOW"]' data-icons='["oa-measure_battery_100 green bigger","oa-measure_battery_25 blink red bigger"]'
data-warn="doif_Monitoring_Batterie:Batterystate" data-warn-background-color="#505050"
data-warn-color="#ffffff" data-colors='["white","orange"]' style="font-size:150%; margin-top:2px;"></div>
<div class="dialog">
<header style="background-color:#202020;">
<div class="sheet">
<div class="left" style="margin-left:15px; margin-top:17px; margin-bottom:15px; font-size:20px; color:white;"> STATUS Batterie</div>
<div data-type="link" data-on-color="white" onclick="$('.dialog-close').trigger('click');"></div>
</div>
<div class="inline">
<div data-type="symbol" data-device="MQTT_OG_Bad_Motion" data-get="batterylevel" data-get-on='["0","1"]' data-icons='["oa-measure_battery_100","oa-measure_battery_25"]' data-colors='["green","red"]' class="tall"></div>
<div class="big top-narrow">Bewegungsmelder-Bad-OG</div>
</div>
<div class="inline">
<div data-type="symbol" data-device="MQTT_CUBE_XIAOMI" data-get="batterylevel" data-get-on='["0","1"]' data-icons='["oa-measure_battery_100","oa-measure_battery_25"]' data-colors='["green","red"]' class="tall"></div>
<div class="big top-narrow">Zauberwürfel</div>
</div>
</div>
</div>
</div>
</li>