FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: z0lt1 am 21 Januar 2020, 21:24:43

Titel: Mal wieder Batterie-Warnung DOIF
Beitrag von: z0lt1 am 21 Januar 2020, 21:24:43
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?
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: Damian am 21 Januar 2020, 23:43:53
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
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: z0lt1 am 22 Januar 2020, 08:09:52
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 ;-)

Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: MadMax-FHEM am 22 Januar 2020, 08:19:38
Wie wäre es damit:

https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514

Gruß, Joachim
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: Damian am 22 Januar 2020, 08:29:14
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.
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: z0lt1 am 22 Januar 2020, 21:45:57
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
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: Damian am 22 Januar 2020, 22:22:26
https://fhem.de/commandref_DE.html#DOIF_aggregation
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: z0lt1 am 23 Januar 2020, 13:49:56
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?
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: Damian am 23 Januar 2020, 15:47:07
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.
Titel: Antw:Mal wieder Batterie-Warnung DOIF
Beitrag von: z0lt1 am 05 Februar 2020, 20:28:25
Etwas spät, aber wollte mich trotzdem nochmal für die Hilfe und die Erläuterungen bedanken. Es funktioniert alles super!