[gelöst] ActionDetector mit DOIF auswerten

Begonnen von rih, 11 September 2019, 10:58:10

Vorheriges Thema - Nächstes Thema

rih

Hallo,

ich möchte den Status des ActionDetectors mit einem DOIF auswerten. Der Status wird ja in folgender Form dargestellt:

ActionDetector                  alive:14 dead:0 unkn:0 off:0

Mich interessiert aber nur, ob der Teilstatus "dead" ungleich Null ist. Mein Versuch

([ActionDetector:state:dead] ne "0") (set Snips say Homematik Geraete kontrollieren)

funktioniert nicht. Könnte ich bitte einen Tipp bekommen?

rabehd

Zitat([ActionDetector:state:dead] ne "0")
Ist das irgendwo beschrieben?
Ich würde ein Userreading "dead" anlegen und das auswerten.
Die Auswertung wäre bei mir numerisch.
Auch funktionierende Lösungen kann man hinterfragen.

marwal

Ich würde es über ein userReading lösen:

attr ActionDetector userReadings dead { ReadingsVal("$name","state","") =~ /.*dead:0.*/}

und abfragen ob "dead" != 1 ist

([ActionDetector:dead] != 1 ) (set Snips say Homematik Geraete kontrollieren)

LG - marwal

rabehd

Zitat"dead" != 1
Das macht für mich wenig Sinn. Das heißt doch versende die Meldung immer, wenn keiner oder mehr als 1 tot sind.
"dead" != 0, scheint mir sinnvoll zu sein. Alles größer 0 an Zahlen würde zu einer Meldung führen. Alles was keine Zahl ist wohl ebenso und da ist ein Hinweis/Meldung auch sinnvoll.
Auch funktionierende Lösungen kann man hinterfragen.

CBSnake

Hi,

ich habe vorhin mal eingebunden, wenn kein Gerät dead ist hat das userreading dead den Wert 1. Was passiert wenn eines ausfällt, teste ich gleich mal. ;-)
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

marwal

#5
ZitatDas macht für mich wenig Sinn. Das heißt doch versende die Meldung immer, wenn keiner oder mehr als 1 tot sind.
"dead" != 0, scheint mir sinnvoll zu sein. Alles größer 0 an Zahlen würde zu einer Meldung führen. Alles was keine Zahl ist wohl ebenso und da ist ein Hinweis/Meldung auch sinnvoll.

Da er nicht wissen möchte wie viele Geräte den "Status" dead haben, gibt das userReading bei dead:0 eine 1 zurück. Sobald keine 1 zurückgegeben wird, muss also mindestens 1 Gerät "dead" sein.

rabehd

Wenn das Userreading so definiert ist, dann passt es. :)
Ich würde da etwas selbsterklärendes reinpacken. Eine 1 für ein Reading dead ist Geschmacksache.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Nur der Vollständigkeit halber.

Mit Ausgabeformatierung funktioniert es auch ohne userReading:

([ActionDetector:state:"dead:(\d)"] ) (set Snips say Homematik Geraete kontrollieren)

siehe https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rih

Vielen Dank für die Lösungsvorschläge.

Die Idee mit einem Userreading hatte ich tatsächlich auch, doch da hatte ich das gleiche Problem: wie separiere ich das "dead"?
Eure Vorschläge haben mir ja nun aufgezeigt, wie es geht. Habe sie getestet und funktionieren auch. Letztendlich habe ich mich aber für Damian's Vorschlag ohne zusätzliches Userreading entschieden. Schien mir irgendwie eleganter. Trotzdem nochmals vielen Dank an Alle.

Invers

Zitat von: Damian am 11 September 2019, 16:27:35Nur der Vollständigkeit halber.

Mit Ausgabeformatierung funktioniert es auch ohne userReading:

([ActionDetector:state:"dead:(\d)"] ) (set Snips say Homematik Geraete kontrollieren)
siehe https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
Hallo Damian, ich habe das aus aktuellem Anlass mal probiert. Das funktioniert bei mir nicht.
state vom Actiondetector zeigt in der gesamten Zeile: alive:12 dead:0 unkn:0 off:0
Angesagt wird aber bei der aktuellen Syntax: 12. Ich habe in de Commandref geguckt, aber keine Lösung erkennen können. Ich vermute, es wird live statt dead angesagt. Kann man das überhaupt filtern?
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Damian

Ich denke, da fehlt ein Defaultwert, damit es zur Auswertung des Ereignisses kommt. Kannst ja mal probieren:

([ActionDetector:state:"dead:(\d)",0] ) (set Snips say Homematik Geraete kontrollieren)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Invers

Danke.
Klappt leider auch nicht. Ich habe mit checkall probiert. Es erfolgt lleider die Ansage, obwohl dead 0 ist.
Die Anzeige im ActionDetector sieht so aus: alive:12 dead:0 unkn:0 off:0

Das DOIF sieht so aus:

define DI_ActionDetector DOIF ([ActionDetector:state:"dead:(\d)",0] ) \
    (say Home matik Geräte kontrollieren)
attr DI_ActionDetector do always
attr DI_ActionDetector room Andere->CUL_HM
#  DEF        ([ActionDetector:state:"dead:(\d)",0] )
#    (say Home matik Geräte kontrollieren)
#  FUUID      61817015-f33f-8098-142c-27318832dfd6ef3c
#  MODEL      FHEM
#  NAME      DI_ActionDetector
#  NOTIFYDEV  global,ActionDetector
#  NR        431
#  NTFY_ORDER 50-DI_ActionDetector
#  STATE      cmd_1
#  TYPE      DOIF
#  VERSION    27452 2023-04-16 11:34:30
#  eventCount 7
#  READINGS:
#    2023-04-24 09:08:08  cmd            1
#    2023-04-24 09:08:08  cmd_event      DI_ActionDetector
#    2023-04-24 09:08:08  cmd_nr          1
#    2023-04-24 09:07:43  mode            enabled
#    2023-04-24 09:08:08  state          cmd_1
#  Regex:
#    accu:
#    bar:
#    barAvg:
#    collect:
#    cond:
#      ActionDetector:
#        0:
#          state      ^ActionDetector$:^state:
#  attr:
#    cmdState:
#    wait:
#    waitdel:
#  condition:
#    0          ::ReadingValDoIf($hash,'ActionDetector','state','0','dead:(\d)')
#  do:
#    0:
#      0          say Home matik Geräte kontrollieren
#    1:
#  helper:
#    NOTIFYDEV  global,ActionDetector
#    globalinit 1
#    last_timer 0
#    sleeptimer -1
#    timerdev 
#    timerevent
#    timerevents
#    timereventsState
#    triggerDev
#    DOIF_eventa:
#      cmd_nr: 1
#      cmd: 1
#      cmd_event: DI_ActionDetector
#      cmd_1
#    DOIF_eventas:
#      cmd_nr: 1
#      cmd: 1
#      cmd_event: DI_ActionDetector
#      state: cmd_1
#  readings:
#    all        ActionDetector:state
#  uiState:
#  uiTable:
#
setstate DI_ActionDetector cmd_1
setstate DI_ActionDetector 2023-04-24 09:08:08 cmd 1
setstate DI_ActionDetector 2023-04-24 09:08:08 cmd_event DI_ActionDetector
setstate DI_ActionDetector 2023-04-24 09:08:08 cmd_nr 1
setstate DI_ActionDetector 2023-04-24 09:07:43 mode enabled
setstate DI_ActionDetector 2023-04-24 09:08:08 state cmd_1


Hast du noch ne Idee?
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Damian

Ich sehe gerade, dass das Komma hier nicht sinnvoll ist, weil es ja keine Ereignisangabe ist, sondern schon die Ausgabeformatierung. Also die ursprüngliche Angabe sollte schon funktionieren.

Dass es bei dir nicht funktioniert, liegt daran, dass dead gleich 0 ist und damit ist die Bedingung nicht wahr - es kommt zur keiner Sprachausgabe.

Es kann also erst dann eine Meldung geben, wenn dead ungleich 0 sein.

Wenn du es mit Null testen willst, dann musst du definieren:

([ActionDetector:state:"dead:(\d)"] == 0 ) (set Snips say Homematik Geraete kontrollieren)
danach aber wieder rückgängig machen, damit es für dead ungleich Null funktioniert - wie ursprünglich angedacht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Invers

Ist mir ja jetzt unangenehm vielleicht zu nerven, aber bei mir ist das halt leider nicht so.
([ActionDetector:state:"dead:(\d)"] ) Sprachausgabe erfolgt
([ActionDetector:state:"dead:(\d)"] == 0 ) keine Sprachausgabe
teste ich mit:
([ActionDetector:state:"dead:(\d)"] ) 
    (say [ActionDetector:state:"dead:(\d)"])

wird 12 angesagt. Das ist aber alive und leider nicht dead. Das ist merkwürdig.

noch irgendeine Idee?








Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

rih

#14
Ich hatte damals zwar geschrieben, dass ich Damian's Lösung anwenden würde, weil die eleganter sei als mit dem zusätzlichen Userreading im Actiondetector. Aber nachdem ich nun aufgrund der neuen Nachfrage mal nachgeschaut habe, musste ich feststellen, dass ich doch die Lösung mit dem Usereading verwendet habe.

Habe nun auch Damian's neuen Vorschlag versucht. Ich kann bestätigen, dass es so leider noch nicht funktioniert:

([ActionDetector:state:"dead:(\d)"] != 0) (set Snips say Achtung Homematik Geraete kontrollieren)
"dead" ist gleich 0 und trotzdem wird die Meldung ausgegeben, wohl weil wie @Invers schreibt, auf alive-Anzahl zurück gegriffen wird.