DOIF - Perl: Triggert nicht obwohl sich Wert ändert

Begonnen von bmwfan, 15 August 2025, 13:41:16

Vorheriges Thema - Nächstes Thema

bmwfan

Hallo,
da meine Lüftungssteuerung bei Änderung des Feuchtigkeitswertes nicht triggert habe ich ein Test-DOIF erstellt, um verschiedene Möglichkeiten zu testen und den Fehler zu finden. Leider bin ich trotz Durcharbeitens der Commandref, Internetsuche, Bemühen einer KI und vieler Versuche nicht erfolgreich gewesen. Ich hoffe, dass jemand aus dem Forum mir auf die Sprünge helfen kann.

Anbei mein Test-DOIF:
defmod di_Test DOIF {\
# Definitionen\
my $Device = $hash->{NAME};; # kann auch mit $hash->{NAME} gesetzt werden.\
my $HumIst = ReadingsNum("du_Test", "state", 60);; # Versuch 2, um sicher zu gehen dass bei Wertänderung ein Event ausgelöst wird\
# my $HumIst = ReadingsNum("HmIP_BWTH_000C9BE99C66F8_9", "humidity", 60);; # Versuch 1 wie in Lüftersteuerung\
my $HumSchwelle = ReadingsNum("HmIP_BWTH_000C9BE99C66F8_9", "humidity20minSchwelle", 58);;\
# Programm\
Log3($Device, 3, "$Device: HumIst: $HumIst");;\
if ([$HumIst] > [$HumSchwelle]) {\
Log3($Device, 3, "$Device: HumIst: $HumIst;; HumSchwelle: $HumSchwelle");;\
  } #\
} # Anweisungssequenz DOIF
attr di_Test disable 0
attr di_Test room 9.8.1_DOIF,Test
attr di_Test verbose 5

setstate di_Test initialized
setstate di_Test 2025-08-15 13:21:24 mode enabled
setstate di_Test 2025-08-15 13:21:25 state initialized

1.te Abfrage war: if ($HumIst > $HumSchwelle) {\
Trigger nur, wenn ich den Block manuell ausführe. Nicht bei Wertänderung von $HumIst oder $HumSchwelle

2.te Abfrage: if ([$HumIst] > [$HumSchwelle]) {\
Nach Lesen der Commandref war ich der Meinung, dass die eckigen Klammern zum Erkennen der Wertänderung notwendig sind.
Leider keine Änderung zu 1.

3.te Abfrage: if ([ReadingsNum("du_Test", "state", 60)] > [$HumSchwelle]) {\
Hatte dann die Zuweisung zu my $HumIst in Verdacht. Leider keine Änderung zu 1.

4.te Abfrage: if ([du_Test:state] > [$HumSchwelle]) {\
Triggert das erste Log: Log3($Device, 3, "$Device: HumIst: $HumIst"); nicht aber das 2.te Log: Log3($Device, 3, "$Device: HumIst: $HumIst;; HumSchwelle: $HumSchwelle");;\
=> DOIF hat zwar getriggert, aber obwohl du_Test:state mit dem Wert 80 über $HumSchwelle mit Wert 76 liegt, wurde das if nicht ausgelöst.

5.te Abfrage: if ([du_Test:state] > 70) {\
Dies funktioniert. Beide Log-Einträge sind da!

Ist es generell nicht möglich, dass mit readingsNum oder readingsVal erstellte Werte triggern oder liegt es an der Zuweisung mit my $...?

Bitte um Info zur Lösung des Problemes.

Besten Dank und Grüße

Jürgen

P.S.: Ich finde nicht mehr, wie ich bei Lösen des Problems in den Betreff [Gelöst] eintragen kann. Wie geht das denn?
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

passibe

Brauchst du den Perl-Modus?

Jedenfalls im FHEM-Modus sollte das einfach hiermit umsetzbar sein:
defmod di_Test DOIF ([HmIP_BWTH_000C9BE99C66F8_9:humidity] > [HmIP_BWTH_000C9BE99C66F8_9:humidity20minSchwelle]) (set test on)

bmwfan

Ich hatte die Logik zuerst im FHEM-Modus, aber im Laufe der Zeit wurde das DOIF so groß und unübersichtlich, dass ich es in den PERL-Modus umgestellt habe. Nicht gerechnet habe ich damit, dass es diese Probleme mit dem Trigger gibt.

Ich würde es auch gerne in dem Modus lassen und das Trigger-Problem lösen. Das holt mich ja sonst bei der nächsten Logik wieder ein, wenn ich es nicht verstehe.
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Damian

Zitat von: bmwfan am 15 August 2025, 21:38:09Ich hatte die Logik zuerst im FHEM-Modus, aber im Laufe der Zeit wurde das DOIF so groß und unübersichtlich, dass ich es in den PERL-Modus umgestellt habe. Nicht gerechnet habe ich damit, dass es diese Probleme mit dem Trigger gibt.

Ich würde es auch gerne in dem Modus lassen und das Trigger-Problem lösen. Das holt mich ja sonst bei der nächsten Logik wieder ein, wenn ich es nicht verstehe.

Die Triggerangaben im Perlmodus sind die gleichen, wie im FHEM-Modus also:

defmod di_Test DOIF { ...

if ([HmIP_BWTH_000C9BE99C66F8_9:humidity] > [HmIP_BWTH_000C9BE99C66F8_9:humidity20minSchwelle]) {...
...


Variablen dürfen nicht als Trigger verwendet werden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Der Code wird doch nur ausgeführt, wenn ein Trigger anspricht. D.h., dass die Änderungen der Variablen nur erfolgt, wenn der Code ausgeführt wird, also ein Trigger das vorher ausgelöst hat. Damit kann sich die Variable nicht selbst auslösen.