Gelöst: cmdstate ändert sich obwohl Bedingung nicht erfüllt ist

Begonnen von bmwfan, 05 Juli 2022, 07:53:31

Vorheriges Thema - Nächstes Thema

bmwfan

Hallo,
ich habe eine Diskrepanz zwischen Anzeige des Zustandes und des Zustandes des DOIF selber und möchte das gerne beseitigen. Die Funktion des DOIF ist vorhanden, jedoch die Anzeige des cmdstate nicht korrekt.
Es ist ein DOIF für die Beschattungssteuerung:
Internals:
   DEF        ((([?Wetter_Pro:fc0_tempMax] >= 20 and ([?Wetter_Pro:fc0_weather06] =~ "sonnig" or [?Wetter_Pro:fc0_weather06] =~ "heiter")) or ([?Wetter_Pro:fc0_tempMax] >= 21 and
[?Wetter_Pro:fc0_weather06] =~ "bewölkt") or ([?Wetter_Pro:fc0_tempMax] >= 22 and ([?Wetter_Pro:fc0_weather06] =~ "bedeckt" or [?Wetter_Pro:fc0_weather06] =~ "wolkig"))) and
[?Wetter_Pro:fc0_tempMin] >= 8 and ($month >= 4 && $month <= 9) and ([([du_Sonnenaufgang])-08:30,+:15]))  { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja")
if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )}
DOELSEIF ((([?Wetter_Pro:fc0_tempMax] >= 20 and ([?Wetter_Pro:fc0_weather09] =~ "sonnig" or [?Wetter_Pro:fc0_weather09] =~ "heiter")) or ([?Wetter_Pro:fc0_tempMax] >= 21 and
[?Wetter_Pro:fc0_weather09] =~ "bewölkt") or ([?Wetter_Pro:fc0_tempMax] >= 22 and ([?Wetter_Pro:fc0_weather09] =~ "bedeckt" or [?Wetter_Pro:fc0_weather09] =~ "wolkig"))) and
[?Wetter_Pro:fc0_tempMin] >= 8 and ($month >= 4 && $month <= 9) and ([09:00-13:00,+:15])) { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja")
if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) }
DOELSEIF ([du_Tageslicht] eq "dunkel") { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=nein nein") } ## Merker zurücksetzen
   FUUID      6196b0e7-f33f-d125-3ba3-cc28813582c4badb
   MODEL      FHEM
   NAME       di_Beschattung_Haus_morgens
   NOTIFYDEV  du_Tageslicht,du_Sonnenaufgang,global
   NR         80
   NTFY_ORDER 50-di_Beschattung_Haus_morgens
   STATE      Beschatten bis 9:00
   TYPE       DOIF
   VERSION    26020 2022-05-03 16:28:02
   READINGS:
     2022-07-05 07:45:04   cmd             1
     2022-07-05 07:45:04   cmd_event       timer_3
     2022-07-05 07:45:04   cmd_nr          1
     2022-07-05 07:35:30   mode            enabled
     2022-07-05 07:45:04   state           Beschatten bis 9:00
     2022-07-05 07:35:30   timer_01_c01    06.07.2022 05:01:00
     2022-07-05 07:35:30   timer_02_c01    05.07.2022 08:30:00
     2022-07-05 07:45:00   timer_03_c01    05.07.2022 08:00:00
     2022-07-05 07:35:30   timer_04_c02    05.07.2022 09:00:00
     2022-07-05 07:35:30   timer_05_c02    05.07.2022 13:00:00
     2022-07-05 07:45:04   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       du_Tageslicht:
         2:
           &STATE     ^du_Tageslicht$
     itimer:
       du_Sonnenaufgang:
         itimer:
           &STATE     ^du_Sonnenaufgang$
   attr:
     cmdState:
       0:
         Beschatten bis 9:00
       1:
          Beschatten ab 9:00
       2:
          Dummy
     wait:
       0:
         rand(5)
       1:
         rand(5)
       2:
         0
     waitdel:
   condition:
     0          ((::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 20 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "sonnig" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "heiter")) or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 21 and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "bewölkt") or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 22 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "bedeckt" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "wolkig"))) and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMin') >= 8 and ($month >= 4 && $month <= 9) and (::DOIF_time($hash,0,1,$wday,$hms))
     1          ((::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 20 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "sonnig" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "heiter")) or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 21 and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "bewölkt") or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 22 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "bedeckt" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "wolkig"))) and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMin') >= 8 and ($month >= 4 && $month <= 9) and (::DOIF_time($hash,3,4,$wday,$hms))
     2          ::InternalDoIf($hash,'du_Tageslicht','STATE') eq "dunkel"
   days:
   do:
     0:
       0          { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja") if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )}
     1:
       0          { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja") if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) }
     2:
       0          { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=nein nein") }
     3:
   helper:
     NOTIFYDEV  du_Tageslicht,du_Sonnenaufgang,global
     event      timer_3
     globalinit 1
     last_timer 6
     sleepdevice timer_3
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_3
     triggerDev
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: timer_3
       Beschatten bis 9:00
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: timer_3
       state: Beschatten bis 9:00
     timerevents:
       timer_3
     timereventsState:
       timer_3
     triggerEvents:
       timer_3
     triggerEventsState:
       timer_3
   hmccu:
   internals:
     all         du_Tageslicht:STATE
   interval:
     0          -1
     1          0
     3          -1
     4          3
   intervalfunc:
     2          ::DOIF_time($hash,0,1,$wday,$hms)
     5          ::DOIF_time($hash,3,4,$wday,$hms)
   intervaltimer:
     0          2
     1          2
     3          5
     4          5
   localtime:
     0          1657076460
     1          1657002600
     2          1657000800
     3          1657004400
     4          1657018800
   realtime:
     0          05:01:00
     1          08:30:00
     2          08:00:00
     3          09:00:00
     4          13:00:00
   time:
     0          ([du_Sonnenaufgang])
     1          08:30:00
     2          +:15
     3          09:00:00
     4          13:00:00
     5          +:15
   timeCond:
     0          0
     1          0
     2          0
     3          1
     4          1
     5          1
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     0           0  1  2
     1           3  4  5
   triggertime:
     1657000800:
       localtime  1657000800
       hash:
     1657002600:
       localtime  1657002600
       hash:
     1657004400:
       localtime  1657004400
       hash:
     1657018800:
       localtime  1657018800
       hash:
     1657076460:
       localtime  1657076460
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   Beschatten bis 9:00 | Beschatten ab 9:00 | Dummy
   comment    05.07: Stündliche Abfrage +[1]:00 auf 15 Min. +:15 geändert
   initialize nein
   room       1.2_Kueche,9.8.1_DOIF
   timerWithWait 1
   wait       rand(5):rand(5):0


Heute morgen stand cmdstate ab 05:01 (Sonnenaufgang) auf "Beschatten bis 9:00", obwohl die Helligkeit des Sensors OG_UniSen_03 weit unter 400 war. Scheinbar wird cmdstate aktualisiert, obwohl die if-Bedingung nicht erfüllt ist.

Wie kann ich Funktion und Statusanzeige wieder in Übereinstimmung bringen?

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Per

Sehe ich das richtig, dass du alle 15 Minuten die Werte abfragst statt die Werte triggern zu lassen?
In welchem Abstand ändern sich die Werte der Sensoren?

bmwfan

Hallo Per,
stimmt. Frage aktuell alle 15 Minuten ab (vorher jede Stunde), wobei der einzige Sensor im Haus der OG_UniSen_03 (kombinierter Temperatur, Feuchtigkeit, Helligkeits-Sensor von Dirk) ist. Die anderen "Sensoren" (Wetter_Pro:..) sind Werte von Proplanta, das ich stündlich abfrage.
Den Helligkeitssensor wollte ich nicht triggern lassen, da sich diese ja permanent ändert und jedesmal eine Prüfung erfolgt. Erschien mir eine unnötige Belastung des Systems.
15 Minuten daher, da in der Küche Obst, Biomüll... sonst bei Sonnenschein direkt in der Sonne stehen. Hatte vorher 1 Stunde, was aber bei z.B. Bewölkung dazu führt, dass im Worst Case fast 1 Stunde der Biomüll und das Obst in der Sonne stehen.

Wenn es eine bessere Lösung gibt nur her damit.

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; 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 05 Juli 2022, 07:53:31
Heute morgen stand cmdstate ab 05:01 (Sonnenaufgang) auf "Beschatten bis 9:00", obwohl die Helligkeit des Sensors OG_UniSen_03 weit unter 400 war. Scheinbar wird cmdstate aktualisiert, obwohl die if-Bedingung nicht erfüllt ist.

cmdstate zeigt ja nur welcher Zweig ausgeführt wurde, aber nicht was im Ausführungsteil passiert ist - das kann das Modul auch nicht wissen.

Wenn du sehen willst, ob tatsächlich der set-Befehl ausgeführt wurde, dann musst du deine if-Abfrage in die Bedingung verlagern:

statt:

... and ([([du_Sonnenaufgang])-08:30,+:15]))  { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja")
if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )}



... and ([([du_Sonnenaufgang])-08:30,+:15]) and [?OG_UniSen_03:luminosity,0] > 400)  (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bmwfan

@ Damian
Danke für die Erklärung. Habs umgestellt.

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

daedalus0815

#5
Hallo zusammen,

....das Problem ist ja nun gelöst!   



Ich möchte es nur um eine (für mich leichter lesbare) syntaktische IF-Variante ohne Perlmodus als weitere Möglichkeit ergänzen,
da man ja öfter auf integrierte IFs im DOIF angewiesen ist:

...ich bleib' damit gedanklich mehr in der DOIF-Syntax...


Vorsicht mit den Leerzeichen nach dem IF !

(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )   (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
)


...bei mehreren IFs sollte auch folgendes funktionieren:
(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )   (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
IF (.......................................................................)   (...............................................................................)
)


@Damian...du bist ja näher dran...siehst du hier Probleme ?

Damian

Zitat von: daedalus0815 am 20 Juli 2022, 14:35:25
Hallo zusammen,

....das Problem ist ja nun gelöst!   



Ich möchte es nur um eine (für mich leichter lesbare) syntaktische IF-Variante ohne Perlmodus als weitere Möglichkeit ergänzen,
da man ja öfter auf integrierte IFs im DOIF angewiesen ist:

...ich bleib' damit gedanklich mehr in der DOIF-Syntax...


Vorsicht mit den Leerzeichen nach dem IF !

(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )   (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
)


...bei mehreren IFs sollte auch folgendes funktionieren:
(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )   (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
IF (.......................................................................)   (...............................................................................)
)


@Damian...du bist ja näher dran...siehst du hier Probleme ?

Das kannst du so machen. Im DOIF-FHEM-Modus stehen die Trigger immer in der Bedingung, daher kannst du auch  IF ([OG_UniSen_03:luminosity,0] > 400 ) ... angeben. Beim IF wird die Readingangabe im Gegensatz zur DOIF-Bedingung nicht als Trigger angesehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF