Mal wieder Batterie-Warnung DOIF

Begonnen von z0lt1, 21 Januar 2020, 21:24:43

Vorheriges Thema - Nächstes Thema

z0lt1

Hallo,

obwohl es inzwischen schon reichlich zu lesen zu diesem Thema gibt, komme ich nicht auf die Lösung.

Aufgabenstellung: Ein DOIF welches die Readings "battery" aller Geräte erkennt und sobald ein "low" gemeldet wird, den Zustand "low" einnimmt. Das habe ich schon mal damit hingebastelt:
([":^battery:.*low"]) ()

DOELSE ()


Hier die List der DOIF-Definition:
Internals:
   CFGFN     
   DEF        ([":^battery:.*low"]) ()

DOELSE ()
   DOIFDEV    ^global$|
   FUUID      5e2623ed-f33f-d024-2d81-d53a739c8452e8a0
   MODEL      FHEM
   NAME       di_BatterieWarnung
   NR         3650
   NTFY_ORDER 50-di_HM_Batt_Warn
   STATE      low
   TYPE       DOIF
   VERSION    20929 2020-01-10 09:44:35
   READINGS:
     2020-01-21 21:12:25   Device          Test_Bat_2
     2020-01-21 21:12:25   cmd             1
     2020-01-21 21:12:25   cmd_event       Test_Bat_2
     2020-01-21 21:12:25   cmd_nr          1
     2020-01-21 21:12:16   mode            enabled
     2020-01-21 21:12:25   state           low
   Regex:
     accu:
     cond:
       :
         0:
           ":^battery:.*low" :^battery:.*low
   attr:
     cmdState:
       0:
         low
       1:
         ok
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('',$hash,'^battery:.*low',0)
   do:
     0:
       0         
     1:
       0         
   helper:
     DEVFILTER  ^global$|
     NOTIFYDEV  global|.*
     event      battery: low
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Test_Bat_2
     timerevent battery: low
     triggerDev Test_Bat_2
     timerevents:
       battery: low
     timereventsState:
       battery: low
     triggerEvents:
       battery: low
     triggerEventsState:
       battery: low
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdState   low|ok
   do         always
   group      Batterieüberwachung
   room       000_Global


Jetzt möchte ich, dass der Zustand des DOIFs wieder auf "ok" wechselt, sobald kein battery-Reading mehr mit "low" vorhanden ist.

Ist das einfach machbar, oder muss ich da jetzt mit irgendwelchen Zählern arbeiten?

Damian

Verneinung von reinen Ereignisabfragen sind nicht sinnvoll, weil sie immer wahr sind, wenn kein Ereignis eintritt.

Besser ist es so vorzugehen: https://forum.fhem.de/index.php/topic,106749.msg1006072.html#msg1006072
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

z0lt1

Hi, danke für deine Antwort.

Meinst du den kompletten Beitrag oder diesen speziellen Post:

([18:00] and [?@"":battery:$_ ne "ok",""]) (set TelegramBot _msg Batteriewarnung am Gerät [@"":battery:$_ ne "ok",""])


Leider stehe ich voll auf dem Schlauch, einerseits wegen meiner fehlenden Regex-Lesefähigkeiten anderseits weil ich den Lösungsansatz auch nicht verstehe.

Wie soll das DOIF erkennen dass wieder alle Batterien in Ordnung sind? Mir würde es ja eigentlich auch reichen, wenn ich einmal am Tag die Batteriestände der vorhandenen Devices "abhole". Wenn ich dann eine Batterie ausgetauscht habe, dann wird das halt erst am nächsten Tag wenn der nächste tägliche Scan gemacht wurde sichtbar.

Die Königslösung wäre natürlich dass es gleich nach dem Austausch der Batterie erkannt werden würde. Ich bevorzuge jedoch lieber die einfache Lösung, die ich dann auch noch verstehe, wenn ich mal 2-3 Monate kein FHEM gemacht habe ;-)


MadMax-FHEM

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)

Damian

DOIF ([18:00]  and  [?@"":battery:"low",""]) (setreading $SELF Battery [@"":battery:"low",""]) DOELSE (setreading $SELF battery alle ok)



Das würde bedeuten: Schaue um 18:00 Uhr, ob im System irgend ein Device mit dem Reading battery gleich "low" existiert, wenn ja, dann schreibe in das Reading battery des DOIFs die Devices, die auf "low" sind. Der Zustand des Moduls geht in cmd_1. Wenn du die Batterien aller genannten Devices gewechselt hast, sollte am nächsten Tag um 18:00 Uhr der Zustand auf cmd_2 wechseln und im Reading battery der Text "alle ok" stehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

z0lt1

Klasse, danke schön. Genau sowas habe ich gesucht! Wo kann ich jetzt nochmal nachlesen, was diese Zeichenabfolgen bedeutet?

[?@"":battery:"low",""]

Würde das gerne verstehen  ;D

Damian

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

z0lt1

Danke schön nochmal, fast alles verstanden. Nur das Fragezeichen vor dem @ konnte ich nicht nachvollziehen. Ist das etwas aus Perl? Und sollte es ohne Fragezeichen am Anfang nicht auch funktionieren?

Damian

Das Fragezeichen an dieser Stelle [?....], verhindert, dass das Modul durch die Angaben in den eckigen Klammern getriggert wird. Fragezeichen  bedeutet reine Abfrage ohne Trigger, so steht es in der Commandref zu DOIF.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

z0lt1

Etwas spät, aber wollte mich trotzdem nochmal für die Hilfe und die Erläuterungen bedanken. Es funktioniert alles super!