DOIF Vergleich mit Werten aus diskreter Liste

Begonnen von weini, 10 Juli 2020, 09:13:08

Vorheriges Thema - Nächstes Thema

weini

Vorneweg: Habe die Suche bemüht, bin aber nicht fündig geworden. Wenn ich etwas übersehen habe, dann mea-culpa - stoßt mich bitte mit der Nase drauf.

Ich möchte in einem DOIF sinngemäß folgende Bedingung prüfen:
[myDev....Pattern] inlist {"initialized"|"Initialized"|"opend"|"active"}

Inhaltlich geht es mir darum, dass ich für die verschiedenen Steuergeräte wie CUL, sDuino, LaCrosse GW etc. mit einem DOIF eine Überwachung aufbaue, die mir eine Email schickt, falls ein Gerät disconnected. Genau genommen brauche ich also den negativen Fall "NOT inlist".

Ich denke, dass das "Defizit" hier schon von Perl kommt, wo ich keinen einfachen (=skalaren) Operator gefunden habe. DOIF "erbt" das ja quasi.
Gibt es über die Perl-Syntax ggf. einen enigermaßen eleganten Weg, das zu lösen?

Viele Grüße,
weini

MadMax-FHEM

Also Perl ist an der Stelle sicher nicht die Limitierung ;)

Also nur mal so (ohne DOIF):

notify mit entsprechender Regex auf die Geräte und Werte die du willst (inlist) oder eben nicht willst (not in list)...

Dann eine Sub aufrufen wo du $NAME (-> NAME des auslösenden Devices) mitgibst

Dort dann in einer Schleife (foreach) prüfst, ob das Device einen der "inlist" Zustände hat -> dann scheint es ja ok zu sein!?

Oder eben prüfen, ob das Gerät einen unerwünschten Zustand hat, dann auch "inlist" ;) aber dort steht halt dann drin welchen Zusatnd die Geräte NICHT einnehemen sollen!?

Oder ich hab generell nicht richtig verstanden...

Gruß, Joachim
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)

weini

#2
Doch, doch, du hat micht voll verstanden  ;)

Gehen wird das über Perl in einem Sub sicherlich. "Schöner" fände ich natürlich, wenn man es direkt in der DOIF Bedingung abbilden könnte. Auch ein Perl Einzeler würde mir noch besser gefallen. Die Lösung mit foreach hatte ich beim Recherchieren gefunden, aber das macht ja nur über ein Sub wirklich Sinn.

Damian

Zitat von: weini am 10 Juli 2020, 13:58:01
Doch, doch, du hat micht voll verstanden  ;)

Gehen wird das über Perl in einem Sub sicherlich. "Schöner" fände ich natürlich, wenn man es direkt in der DOIF Bedingung abbilden könnte. Auch ein Perl Einzeler würde mir noch besser gefallen. Die Lösung mit foreach hatte ich beim Recherchieren gefunden, aber das macht ja nur über ein Sub wirklich Sinn.

Du kannst in der Bedingung eines DOIFs beliebige subs aufrufen und entsprechend abfragen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MadMax-FHEM

Warum (frage ich mich eigentlich bei DOIF immer) willst du Programmierung in Perl und Konfiguration mischen und findest das noch schöner!? ;)

Ein sauberes notify -> Konfiguration mit einem Sub-Aufruf -> Programmierung ist (finde ich) sehr viel übersichtlicher...
...als "alles" in ein DOIF quetschen und dann evtl. dort doch auch noch Perl und dann noch "Feinjustierung" mittels Attribute...

Aber: jeder wie er will...

Da ich aber (aus besagtem Grund ;) ) DOIF praktisch NICHT nutze: kann ich an dieser Stelle nicht weiterhelfen...

Außer auf die commandref und vielen Beispiele verweisen...

Gruß, Joachim
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)

xenos1984

Für mich klingt das nach einem Anwendungsfall für DOIF mit Aggregationsbedingung:

http://fhem.de/commandref_DE.html#DOIF_aggregation

Dort gibt es einige Beispiele, die ähnliches tun, siehe z.B. das Beispiel "offene Fenster". Nur würde in deinem Fall die Aggregationsbedingung nicht

$_ =~ "open"

lauten, sondern z.B. sowas wie

$_ =~ "initialized|Initialized|opened|active"

wenn das entsprechende Wort vorkommen soll, oder

$_ =~ "^(initialized|Initialized|opened|active)$"

wenn nur auf kompletten Wert reagiert werden soll. Wie das nun im Detail aussehen muss, hängt davon ab, wie deine Geräte und deren Readings heißen.

weini

Danke dir, das sieht sehr vielversprechend aus!
Werde damit mal einen Versuch starten und euch wissen lassen, wie es mir ergangen ist.

weini

Kurzes Update hier: Ich bin mit der Aggregation nicht ganz glücklich geworden. Das DOIF hat mir aus nebulösen Gründen immer auch bei Messages getriggert, die mich nicht interessiert haben. Das lag wohl zum einen am Sonderfall "state" Event (habs auch mit AddStateEvent versucht). Zum anderen lag es wohl auch daran, dass ich mir zum Testen mein LaCrosse Device ausgesucht habe und genau von dem Modul beim Disconnect kein Event generiert wird.

Am Ende habe ich es jetzt m. M. nach recht elegant über DOIF Templates gelöst bekommen: https://forum.fhem.de/index.php/topic,84969.msg1073693.html#msg1073693

Vielen Dank euch!