Hauptmenü

DOIF Ereignissteuerung

Begonnen von GunterB, 30 November 2022, 14:02:07

Vorheriges Thema - Nächstes Thema

GunterB

Ich bin mal wieder am Verzweifeln, irgendwie werde ich mit dem DOIF nicht warm und komme mal wieder nicht weiter...
CommandRef studiert, viel probiert aber voll versagt. https://fhem.de/commandref_DE.html#DOIF_

Über MQTT sende ich mir per JSON alle erkannten Objekte meiner Kameras.
Dies geschieht in einem MQTT2_DEVICE namens MQTT2_surv.

Per Hand kann ich mir zum Testen ein Objekt auf 100% Wahrscheinlichkeit setzen.
setreading MQTT2_surv 43_object_1_person_prob 100

Nun habe ich für das Licht ein Sonoff mit Tasmota. Ich möchte mir nun das Licht einschalten, sobald eine Person mit über 80% Wahrscheinlichkeit erkannt wurde.
(["^MQTT2_surv$:^43_object_\d+_person_prob"] >= 80) (set MQTT_DVES_7D5AA4 POWER1 on)
Aber egal was ich mache, das Licht geht nicht an. Set cmd_1 funktioniert, am Befehl liegt es also nicht.

e_MQTT2_surv_events 43_object_1_person_prob: 100        2022-11-30 13:56:57
Ich vermute, es muss an der Auswertung des Dezimalteils liegen.

Vielleicht könnte mir wieder jemand helfen, Danke schon mal dafür :-[

Internals:
   CFGFN     
   DEF        (["^MQTT2_surv$:^43_object_\d+_person_prob"] >= 80) (set MQTT_DVES_7D5AA4 POWER1 on)
   MODEL      FHEM
   NAME       DOIF_Kamera43_person
   NOTIFYDEV  MQTT2_surv,global
   NR         11510
   NTFY_ORDER 50-DOIF_Kamera43_person
   STATE      initialized
   TYPE       DOIF
   VERSION    26703 2022-11-14 16:43:41
   eventCount 36
   READINGS:
     2022-11-30 13:47:07   Device          MQTT2_surv
     2022-11-30 13:46:54   cmd             0
     2022-11-30 13:46:54   mode            enabled
     2022-11-30 13:46:54   state           initialized
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           "^MQTT2_surv$:^43_object_\d+_person_prob" ^MQTT2_surv$:^43_object_\d+_person_prob
   attr:
     cmdState:
   condition:
     0          ::EventDoIf('^MQTT2_surv$',$hash,'^43_object_\d+_person_prob',0) >= 80
   do:
     0:
       0          set MQTT_DVES_7D5AA4 POWER1 on
     1:
   helper:
     NOTIFYDEV  MQTT2_surv,global
     event      43_object_1_person_prob: 100
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev MQTT2_surv
     triggerEvents:
       43_object_1_person_prob: 100
     triggerEventsState:
       43_object_1_person_prob: 100

Damian

Ereignisabfragen liefern normalerweise nur wahr oder nicht wahr, aber nicht den Wert, wie eine Readingabfrage, der Art [MQTT2_surv:43_object_1_person_prob]

Es gibt aber eine Ausnahme, wenn man einen Defaultwert angibt, hier also:

(["^MQTT2_surv$:^43_object_\d+_person_prob",0] >= 80)

Auszug aus der Commandref zu Ereignissteuerung:

ZitatPerl-Modus:
define di_warning DOIF {if ([":^temperature",0] < 0) {fhem_set"pushmsg danger of frost $DEVICE}}

Damit wird auf alle Devices getriggert, die mit "temperature" im Event beginnen. Zurückgeliefert wird der Wert, der im Event hinter "temperature: " steht. Wenn kein Event stattfindet, wird der Defaultwert, hier 0, zurückgeliefert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GunterB

Danke Damian für deine Hilfe, es hat funktioniert.

Jetzt wollte ich noch das State eines Dummys dazu verwenden und schon wieder gehts nicht weiter. Das State ist "on" aber der Befehl danach wird nicht ausgeführt.
(["^MQTT2_surv$:^43_object_\d+_person_prob",0] >= 80 and [?Kamera_bw])  {

Ich gebe es auf!
Für mich hat das DOIF hier keine Hilfe und ein reiner Zeitfresser. Trial an Error.
Es gibt zu viel zu Beachten was man in den Tiefen der Doku irgendwo mühsam suchen muss eine für mich nicht verständliche Syntax.

Als Programmierer, werde ich das direkt in Perl mit einem NOTIFY machen, im Code die Readings auslesen und verarbeiten.

Damian

Zitat von: GunterB am 01 Dezember 2022, 21:56:35
Danke Damian für deine Hilfe, es hat funktioniert.

Jetzt wollte ich noch das State eines Dummys dazu verwenden und schon wieder gehts nicht weiter. Das State ist "on" aber der Befehl danach wird nicht ausgeführt.
(["^MQTT2_surv$:^43_object_\d+_person_prob",0] >= 80 and [?Kamera_bw])  {

Ich gebe es auf!
Für mich hat das DOIF hier keine Hilfe und ein reiner Zeitfresser. Trial an Error.
Es gibt zu viel zu Beachten was man in den Tiefen der Doku irgendwo mühsam suchen muss eine für mich nicht verständliche Syntax.

Als Programmierer, werde ich das direkt in Perl mit einem NOTIFY machen, im Code die Readings auslesen und verarbeiten.
Ist wahrscheinlich besser für dich. Allerdings wirst du als Programmierer wissen, dass man den Inhalt einer Variablen, die auf "on" steht mit einem Vergleichsoperator vergleichen muss ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GunterB

Ja, sieht so aus als ob das für mich besser ist. Ich nutze gerne fertige Werkzeuge und erfinde nicht gerne das Rad neu.

Ich habe es momentan noch wie folgt umgesetzt:
(["^MQTT2_surv$:^43_object_\d+_person_prob",0] >= 80 and [?Kamera_bw] eq "ON")
Worin aber der Unterschied besteht zu folgender Schreibweise verstehe wiederrum auch nicht:
[?Kamera_bw]:"on"
Mir ist auch nicht klar, wie sowas case insensitive gemacht werden könnte...

Gerne würde ich den ganzen Overhead vermeiden, und auch das unten stehende NOTIFY mit einem DOIF lösen, aber nach vielen Versuchen bekomme ich es nicht hin :-\.
MQTT2_surv:\d+_bw.* {
    my $Kamera_bw = ReadingsVal("Kamera_bw", "state", "");

    if ($Kamera_bw ne "ON" and
        ReadingsVal("MQTT2_surv", "41_bw", "") eq "1" and
        ReadingsVal("MQTT2_surv", "42_bw", "") eq "1" and
        ReadingsVal("MQTT2_surv", "43_bw", "") eq "1" and
        ReadingsVal("MQTT2_surv", "44_bw", "") eq "1" ) {
        fhem("set Kamera_bw ON");
    }

    if ($Kamera_bw ne "OFF" and
        ReadingsVal("MQTT2_surv", "41_bw", "") eq "0" and
        ReadingsVal("MQTT2_surv", "42_bw", "") eq "0" and
        ReadingsVal("MQTT2_surv", "43_bw", "") eq "0" and
        ReadingsVal("MQTT2_surv", "44_bw", "") eq "0" ) {
        fhem("set Kamera_bw OFF");
    }
}

Damian

Zitat von: GunterB am 03 Dezember 2022, 14:01:29
Ja, sieht so aus als ob das für mich besser ist. Ich nutze gerne fertige Werkzeuge und erfinde nicht gerne das Rad neu.

Ich habe es momentan noch wie folgt umgesetzt:
(["^MQTT2_surv$:^43_object_\d+_person_prob",0] >= 80 and [?Kamera_bw] eq "ON")
Worin aber der Unterschied besteht zu folgender Schreibweise verstehe wiederrum auch nicht:
[?Kamera_bw]:"on"
Mir ist auch nicht klar, wie sowas case insensitive gemacht werden könnte...

Gerne würde ich den ganzen Overhead vermeiden, und auch das unten stehende NOTIFY mit einem DOIF lösen, aber nach vielen Versuchen bekomme ich es nicht hin :-\.
MQTT2_surv:\d+_bw.* {
    my $Kamera_bw = ReadingsVal("Kamera_bw", "state", "");

    if ($Kamera_bw ne "ON" and
        ReadingsVal("MQTT2_surv", "41_bw", "") eq "1" and
        ReadingsVal("MQTT2_surv", "42_bw", "") eq "1" and
        ReadingsVal("MQTT2_surv", "43_bw", "") eq "1" and
        ReadingsVal("MQTT2_surv", "44_bw", "") eq "1" ) {
        fhem("set Kamera_bw ON");
    }

    if ($Kamera_bw ne "OFF" and
        ReadingsVal("MQTT2_surv", "41_bw", "") eq "0" and
        ReadingsVal("MQTT2_surv", "42_bw", "") eq "0" and
        ReadingsVal("MQTT2_surv", "43_bw", "") eq "0" and
        ReadingsVal("MQTT2_surv", "44_bw", "") eq "0" ) {
        fhem("set Kamera_bw OFF");
    }
}


Ich würde es an deiner Stelle so lassen.

Man kann es zwar in einer Zeile formulieren, aber dann müsste man neue Syntax lernen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF