[gelöst] DOIF läuft weiter obwohl Bedingung "unwahr" ist

Begonnen von PS915, 07 Februar 2019, 19:49:15

Vorheriges Thema - Nächstes Thema

PS915

Hallo zusammen,

ich verzweifle gerade an folgender DOIF. Ich habe das Modul erst seit kurzem in Betrieb und das ist eine meiner ersten DOIFs!

Das DOIF soll bei Unterschreitung der Außentemperatur (15°C) und geöffnetem Fenster eine Pushnachricht nach 610 Sekunden lossenden. Diese Nachricht soll 5x versendet werden mit einem zeitlichen Abstand von 300 Sekunden.
[var.push.warn.temp.badezimmer] ist ein dummy, welcher die Pushfunktion anschaltet oder ausschaltet. In diesem Fall war es natürlich auf "on". Sobald eine der mit "and" verknüpften Bedinungen unwahr wird, soll keine Nachricht mehr versendet werden.


Das Problem:
Wenn ich nach der ersten Nachricht zum Beispiel das Fenster schließe (oder den Dummy [var.push.warn.temp.badezimmer] auf "off" schalte), werden trotzdem alle 5 Nachrichten versendet. Ich möchte aber, dass dann natürlich nichts mehr versendet wird. Anbei ein Screenshot, wo man es erkennen kann, dass die DOIF Prüfung unwahr ist, aber trotzdem noch Nachrichten versendet werden.

Wo habe ich den Fehler eingebaut?

Kurzer Hintergrund was das DOIF macht:

Wenn alle diese Zustände eintreffen...
[var.push.warn.temp.badezimmer] eq "on"
[window.badezimmer:state] eq "open"
[sensor.luft.Aussen:temperature] < [var.tempwarn.limit:state]

wir eine Pushnachricht versendet
(set pushmsg msg 'Badezimmerfenster bitte schließen!' 'Raum: [sensor.luft.Badezimmer_OG:temperature]°C / [sensor.luft.Badezimmer_OG:humidity]% - Außen: [sensor.luft.Aussen:temperature] °C')

das DOIF hat folgende Attribute
do:always
repeatcmd:[var.tempwarn.repeatcmd:state]
repeatsame:[var.tempwarn.repeatsame:state]
wait: [var.tempwarn.wait:state]

dies sind die Variablen
var.tempwarn.limit: 15
var.tempwarn.repeatcmd: 300
var.tempwarn.repeatsame: 5
var.tempwarn.wait: 610

Damian

Lösche das do always-Attribut.

Ansonsten, immer in der Kommandozeile list <dein DOIF-Modul> eingeben und die Ausgabe als Code (#-Symbol oben) hier posten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PS915

Hallo Damian,

danke für deine schnelle Antwort. Ich habe das "do always" Attribut entfernt und erneut einen Test gemacht. Leider besteht das Problem immer noch (siehe Screenshot)

Anbei mein "list push.warn.temp.badezimmer"
Internals:
   CFGFN     
   DEF        ([var.push.warn.temp.badezimmer] eq "on" and [window.badezimmer:state] eq "open" and [sensor.luft.Aussen:temperature] < [var.tempwarn.limit:state]) (set pushmsg msg 'Badezimmerfenster bitte schließen!' 'Raum: [sensor.luft.Badezimmer_OG:temperature]°C / [sensor.luft.Badezimmer_OG:humidity]% - Außen: [sensor.luft.Aussen:temperature] °C')
   FUUID      5c5c7225-f33f-1bb7-d5a1-c60bc735e22d2934
   MODEL      FHEM
   NAME       push.warn.temp.badezimmer
   NR         307
   NTFY_ORDER 50-push.warn.temp.badezimmer
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2019-02-07 20:32:13   Device          window.badezimmer
     2019-02-07 20:31:32   cmd             1
     2019-02-07 20:31:31   cmd_count       3
     2019-02-07 20:31:32   cmd_event       window.badezimmer
     2019-02-07 20:31:32   cmd_nr          1
     2019-02-07 20:31:13   e_sensor.luft.Aussen_temperature 6.4
     2019-02-07 20:11:13   e_var.push.warn.temp.badezimmer_STATE on
     2019-02-07 20:32:13   e_window.badezimmer_state closed
     2019-02-07 19:05:41   mode            enabled
     2019-02-07 20:31:32   state           cmd_1
     2019-02-07 20:31:32   wait_timer      07.02.2019 20:36:32 cmd_1 window.badezimmer
   Regex:
   attr:
     cmdState:
     repeatcmd:
       [var.tempwarn.repeatcmd:state]
     repeatsame:
       [var.tempwarn.repeatsame:state]
     wait:
       0:
         [var.tempwarn.wait:state]
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'var.push.warn.temp.badezimmer','STATE') eq "on" and ::ReadingValDoIf($hash,'window.badezimmer','state') eq "open" and ::ReadingValDoIf($hash,'sensor.luft.Aussen','temperature') < ::ReadingValDoIf($hash,'var.tempwarn.limit','state')
   devices:
     0           var.push.warn.temp.badezimmer window.badezimmer sensor.luft.Aussen var.tempwarn.limit
     all         var.push.warn.temp.badezimmer window.badezimmer sensor.luft.Aussen var.tempwarn.limit
   do:
     0:
       0          set pushmsg msg 'Badezimmerfenster bitte schließen!' 'Raum: [sensor.luft.Badezimmer_OG:temperature]°C / [sensor.luft.Badezimmer_OG:humidity]% - Außen: [sensor.luft.Aussen:temperature] °C'
     1:
   helper:
     event      contact: closed (to broadcast),closed,trigger_cnt: 23
     globalinit 1
     last_timer 0
     sleepdevice window.badezimmer
     sleepsubtimer 0
     sleeptimer 0
     timerdev   sensor.luft.Aussen
     timerevent temperature: 6.4,humidity: 81
     triggerDev window.badezimmer
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: window.badezimmer
       state: cmd_1
     timerevents:
       temperature: 6.4
       humidity: 81
     timereventsState:
       temperature: 6.4
       humidity: 81
     triggerEvents:
       contact: closed (to broadcast)
       closed
       trigger_cnt: 23
     triggerEventsState:
       contact: closed (to broadcast)
       state: closed
       trigger_cnt: 23
   internals:
     0           var.push.warn.temp.badezimmer:STATE
     all         var.push.warn.temp.badezimmer:STATE
   itimer:
   readings:
     0           window.badezimmer:state sensor.luft.Aussen:temperature var.tempwarn.limit:state
     all         window.badezimmer:state sensor.luft.Aussen:temperature var.tempwarn.limit:state
   trigger:
   uiState:
   uiTable:
Attributes:
   repeatcmd  [var.tempwarn.repeatcmd:state]
   repeatsame [var.tempwarn.repeatsame:state]
   room       push
   wait       [var.tempwarn.wait:state]

Damian

Dann hänge einfach DOELSE am Ende deiner Definition an, damit das Modul den Zustand wechselt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PS915

Okay, das haut hin! Vielen Dank!

Aber ich verstehe noch nicht, warum ich nicht nur ein DOIF nehmen kann, denn DOELSE ist doch optional, oder?

PS: Geniales Modul, was du da gemacht hast!  8)