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_ (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
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.
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.
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 ;)
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");
}
}
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.