Cmd1 Bedingung wird ausgeführt, obwohl die Bedingungen alle erfüllt sind

Begonnen von luftdieb, 30 August 2020, 21:50:18

Vorheriges Thema - Nächstes Thema

luftdieb

Hallo,
folgende DoIf Abfrage geht nicht mehr (schon seit >1 Jahr) und ich weiß nicht warum... Bisher hatte ich noch nicht die Zeit und die Muse danach zu schauen...

([09:00-21:00,+:15] and checkBeschatten("w")) (set .*West_RL pct 20) DOELSEIF
([09:00-21:00,+:15] and !checkBeschatten("w") and [duAutomatic:state] eq "on" and [HM_Hellligkeit:state]>20) (set .*West_RL pct 100) DOELSEIF
([16:00-23:00] and [HM_Hellligkeit:state]<20] or [21:00]) (set .*West_RL pct 0)


Die Perl Routine checkBeschatten() lieft immer 0 oder 1 zurück und erstellt einen Logbook Eintrag. Im Logbook sehe ich Einträge mit 0 und mit 1. Von daher muss ich davon ausgehen, dass die Routine mehrfach am Tag aufgerufen wird und eigentlich auch die cmd1 ausführen müsste. Aber genau das passiert nicht mehr. Es wird nur noch morgens cmd2 ausgeführt und abends cmd3.
Das Attribut "do always" habe ich auch schon probiert.
Ich verstehe es nicht. Vielleicht fällt jemanden hierzu was ein.

Gruß
luftdieb

Otto123

Hi,

kannst Du nochmal tief Luft holen und die Widersprüche lösen?
ZitatCmd1 Bedingung wird ausgeführt, obwohl die Bedingungen alle erfüllt sind
Zitatmehrfach am Tag aufgerufen wird und eigentlich auch die cmd1 ausführen müsste. Aber genau das passiert nicht mehr.
Wird jetzt oder wird nicht?
Zumindest in der 3 Bedingung ist ein Fehler:
Zitat([16:00-23:00] and [HM_Hellligkeit:state]<20] or [21:00])

Ein list zum fraglichen Zeitpunkt ist eventuell aussagekräftiger.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

luftdieb

Hi Otto,
sorry, irgendwie scheint die Beschreibung widersprüche zuzulassen :-)
Mein Problem ist, dass  Cmd1 nie ausgeführt wird. Ich versuchte zu schreiben, dass die Perl Funktion checkBeschatten() mehrfach am Tag aufgerufen wird und dies auch 1 zurückliefert, was beschatten bedeuten würde und daher cmd1 ausgeführt werden sollte... Das passiert aber nicht :-(
Oder kann doif nicht 1 als true interpretieren?

Gruß
luftdieb

Otto123

Deine Beschreibung - Deine Widersprüche...
Deine DEF bringt folgenden Fehler wenn ich die speichern will:
test DOIF: right bracket without left bracket: ] or [21:00]
Also: wie immer Du es fertig gebracht hast, aber dieses DOIF macht gar nix, das ist einfach falsch. Oder Du hast hier einen Fake gepostet ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Poste doch einfach list von deinem DOIF, dann kann man dazu was sagen, sonst wird es wie immer ein Rätselraten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

ZitatOder kann doif nicht 1 als true interpretieren?
Doch, das kann es. Ich hab das testhalber mal nachgestellt.
Zum List des DOIF könntest Du noch die Funktion checkBeschatten() hier mal zeigen. Ich finde den Ansatz über die Funktion eigentlich zu kompliziert, das kannst Du doch bestimmt direkt im DOIF machen und bleibst "sprachlich" in einer Welt (Stichwort: DOIF_Readings).
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

luftdieb

Ich hatte das DoIf statement etwas vereinachft darstellen wollen. Hier ist das Original
([09:00-21:00,+:15] and checkBeschatten("w")) (set .*West_RL pct [duBeschattenPctRollo:state]) DOELSEIF
([09:00-21:00,+:15] and !checkBeschatten("w") and [duAutomatic:state] eq "on" and [HM_Hellligkeit:state]>[duHelligkeit:state]) (set .*West_RL pct 100) DOELSEIF
([16:00-23:00] and [HM_Hellligkeit:state]<[duHelligkeit:state] or [21:00]) (set .*West_RL pct 0)


Da das DoIf mir zu groß wurde, habe die zumindest die Beschattung ausgelagert in die 99_myUtils. Hier ist das Modul:
sub checkBeschatten($) {
# Benötigt: nur die Himmelsrichtung (n o s w)

# Rückgabe: 1 = Beschatten sinnvoll
# 0 =Beschatten nicht erforderlich
my ($Himmelsrichtung) = @_;
my $CurrentSunPosition = ReadingsVal("TC_TWILIGHT","azimuth", "");
my $CurrentTemp = ReadingsVal("Heizung","Temp-Aussen","");
my $CurrentMaxTemp = ReadingsVal("duBeschattenTemp","state","");
my $Automatic = ReadingsVal("duAutomatic","state","");
my $HelligkeitBeschattung = ReadingsVal("duHelligkeitBeschattung","state","");
my $HelligkeitBeschattungZeit = ReadingsVal("duHelligkeitBeschattungZeit","state","");
my $CurrentBrightness = movingAverage("HM_Hellligkeit","1.LUX",$HelligkeitBeschattungZeit,"average");
my $BeschattenAktiv = ReadingsVal("duBeschattenAktiv","state","");
# my $CurrentBrightness = ReadingsVal("HM_Hellligkeit","1.LUX","");
# select round(avg (value),2) from history where history.DEVICE = 'HM_Hellligkeit' and  history.TIMESTAMP > DATE_ADD(Now(),INTERVAL -1500 Minute)
Log3(undef,4,"checkBeschatten: $Himmelsrichtung / SonnenPos:$CurrentSunPosition / CurrTemp:$CurrentTemp / MaxTemp:$CurrentMaxTemp / Auto:$Automatic / Helligkeit:$CurrentBrightness");
my $timestamp = getTime('%H:%M:%S');   
if ($CurrentBrightness < $HelligkeitBeschattung){
addRollbufferBeschatten($timestamp." Zu Dunkel! (".$CurrentBrightness.")");
Log3(undef,4,"checkBeschatten: Zu Dunkel! ($CurrentBrightness)");
return (0);
}
if ($Himmelsrichtung eq ""){
Log3(undef,3,"checkBeschatten: Keine Himmerlsrichtung angegeben!");
return ( 0 );
}
if ($Automatic eq "off"){
Log3(undef,3,"checkBeschatten: duAutomatic = 0");
return ( 0 );
}
if ($BeschattenAktiv eq "0"){
Log3(undef,3,"checkBeschatten: duBeschattenAktiv = 0");
return ( 0 );
}
if ($CurrentTemp < $CurrentMaxTemp ){
addRollbufferBeschatten($timestamp." Kalt genug!(".$CurrentTemp.")");
Log3(undef,4,"checkBeschatten: Kalt genug!");
return ( 0 );
}
if ($CurrentSunPosition > 60 and $CurrentSunPosition < 157 and $Himmelsrichtung eq "o") {
addRollbufferBeschatten($timestamp."_".$Himmelsrichtung."_ Beschattung sinnvoll!");
Log3(undef,3,"checkBeschatten: Im Osten beschatten sinnvoll");
return ( 1 );
}
elsif ($CurrentSunPosition > 152 and $CurrentSunPosition < 268 and $Himmelsrichtung eq "s") {
addRollbufferBeschatten($timestamp."_".$Himmelsrichtung."_ Beschattung sinnvoll!");
Log3(undef,3,"checkBeschatten: Im Sueden beschatten sinnvoll");
return ( 1 );
}
elsif ($CurrentSunPosition > 230 and $Himmelsrichtung eq "w") {
addRollbufferBeschatten($timestamp."_".$Himmelsrichtung."_ Beschattung sinnvoll!");
Log3(undef,3,"checkBeschatten: Im Westen beschatten sinnvoll");
return ( 1 );
}
else {
addRollbufferBeschatten($timestamp."_".$Himmelsrichtung."_ Keine Beschattung erforderlich!");
Log3(undef,3,$Himmelsrichtung."_checkBeschatten: Keine Beschattung erforderlich");
Log3(undef,4,"checkBeschatten: $Himmelsrichtung / SonnenPos:$CurrentSunPosition / CurrTemp:$CurrentTemp / MaxTemp:$CurrentMaxTemp / Auto:$Automatic / Helligkeit:$CurrentBrightness");
return ( 0 );
}
return ( 0 );
}


Sorry wenn ich nicht gleich Antworte... Aber irgendwie fehlt mir Zeit :-)

Gruß
luftdieb

Christoph Morrison

Bitte ein list vom DOIF (nicht nur die DEF) und die Definition von addRollbufferBeschatten() noch.

Schau dir mal deinen if-Bandwurm noch mal an. So wie du das gemacht hast, brauchst du nirgendwo ein elsif und das letzte return (bitte ohne Klammern wenn du nur einen Wert zurück geben willst) wird niemals erreicht.

sub checkBeschatten($) {
Erklär mir mal was ein Prototyp tut.

if ($CurrentBrightness < $HelligkeitBeschattung){
HelligkeitBeschattung ist ein String und das Ergebnis von movingAverage() (falls du die aus dem Wiki genommen hast), eine Zahl. Nimm lieber ReadingsNum() und lösche bitte den Prototypen.

addRollbufferBeschatten($timestamp." Zu Dunkel! (".$CurrentBrightness.")");
Nimm für sowas doch bitte qq und konkateniere den String nicht durch.

if ($BeschattenAktiv eq "0"){
Tests auf "0" sind in Perl false, d.h. du brauchst kein eq.

if ($CurrentTemp < $CurrentMaxTemp ){
Beides Strings die du numerisch vergleichst. Nimm lieber ReadingsNum().




luftdieb

Hallo Christoph,
vielen Dank dass du dir mein Problem angeschaut hast. Mein Perl ist sicherlich grotig... Aber ich habe den Eindruck, dass die Funktion checkBeschatten($) ihren Dienst erfüllt. Zumindest gibt sie mir zuverlässig, wenn ich es von Hand aufrufe im FHEM sauber 0 und 1 zurück, je nach Übergabe Parameter.

Ich nehme mal an, dass du mit Prototype den Übergabeparameter ($) meinst. Damit möchte ich die Himmelsrichtung als String (s, o, w) übergeben, um passend hierzu abzufragen, ob Beschattung sinnvoll ist oder nicht.

Die Funktion "addRollbufferBeschatten()" schreibt einfach nur ein Zustand in einen Rollpuffer, der im FHEM angezeigt wird.

Ich werde deine Empfehlung zur Verbesserung des Perl Scriptes mir mal genauer anschauen.


Ich frage mich allerdings immer noch, warum das doif nicht funktioniert. Wenn ich mehrfach die Funktion "{checkBeschatten("w")}" aus FHEM aufrufe, kommt reproduzierbar eine 1 zurück, wenn Beschatten sinnvoll ist. Für eine andere Himmelsrichtung, z.B. {checkBeschatten("o")} kommt dann zuverlässig eine 0 zurück. Von daher bin ich bisher überzeugt, dass es was mit dem doif zu tun haben muss.

Gruß
luftdieb

amenomade

Zitat von: luftdieb am 12 September 2020, 16:20:05Ich frage mich allerdings immer noch, warum das doif nicht funktioniert.
So wie es geht, wirst Du dich noch lange fragen.

Zitat von: Otto123 am 30 August 2020, 22:12:27
Ein list zum fraglichen Zeitpunkt ist eventuell aussagekräftiger.

Zitat von: Damian am 01 September 2020, 22:42:34
Poste doch einfach list von deinem DOIF, dann kann man dazu was sagen, sonst wird es wie immer ein Rätselraten.

Zitat von: Sany am 02 September 2020, 09:07:15
Zum List des DOIF könntest Du ...

Zitat von: Christoph Morrison am 07 September 2020, 18:05:32
Bitte ein list vom DOIF (nicht nur die DEF)

Also... zum 5. Mal: poste doch bitte endlich ein "list" vom DOIF. Nur damit kann man weiter analysieren. Du hast schon fast 2 Wochen verloren.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

luftdieb

Oops. Sorry, das war nicht mit Absicht ignoriert worden.
Die list <doif> Funktion kannte ich bisher noch gar nicht und habe sie im DoIf "Gerät" gesucht. Aber eine kurze google Suche verschafft Klarheit. Hier die gewünschte Ausgabe
Internals:
   DEF        ([09:00-21:00,+:15] and checkBeschatten("w")) (set .*West_RL pct [duBeschattenPctRollo:state]) DOELSEIF
([09:00-21:00,+:15] and !checkBeschatten("w") and [duAutomatic:state] eq "on" and [HM_Hellligkeit:state]>[duHelligkeit:state]) (set .*West_RL pct 100) DOELSEIF
([16:00-23:00] and [HM_Hellligkeit:state]<[duHelligkeit:state] or [21:00]) (set .*West_RL pct 0)
   FUUID      5c4e1f48-f33f-68c5-65c8-7f81acec9890d03a
   MODEL      FHEM
   NAME       di_Rollos_Westen
   NOTIFYDEV  HM_Hellligkeit,global,duAutomatic,duHelligkeit
   NR         104
   NTFY_ORDER 50-di_Rollos_Westen
   STATE      cmd_2
   TYPE       DOIF
   VERSION    22588 2020-08-12 19:25:15
   READINGS:
     2020-09-13 09:16:28   Device          HM_Hellligkeit
     2020-09-13 09:15:00   cmd             2
     2020-09-13 09:15:00   cmd_event       timer_6
     2020-09-13 09:15:00   cmd_nr          2
     2020-09-13 09:16:28   e_HM_Hellligkeit_state 2135.6
     2020-09-12 10:00:00   e_duAutomatic_state on
     2020-09-01 20:57:15   e_duHelligkeit_state 17
     2020-08-27 22:56:01   mode            enabled
     2020-09-13 09:15:00   state           cmd_2
     2020-09-12 21:00:00   timer_01_c01    13.09.2020 09:00:00
     2020-09-12 21:00:00   timer_02_c01    13.09.2020 21:00:00
     2020-09-13 09:15:00   timer_03_c01    13.09.2020 09:30:00
     2020-09-12 21:00:00   timer_04_c02    13.09.2020 09:00:00
     2020-09-12 21:00:00   timer_05_c02    13.09.2020 21:00:00
     2020-09-13 09:15:00   timer_06_c02    13.09.2020 09:30:00
     2020-09-12 23:00:00   timer_07_c03    13.09.2020 16:00:00
     2020-09-12 23:00:00   timer_08_c03    13.09.2020 23:00:00
     2020-09-12 21:00:00   timer_09_c03    13.09.2020 21:00:00
     2020-09-13 09:10:41   wait_timer      13.09.2020 09:20:41 cmd_2 HM_Hellligkeit
   Regex:
     accu:
     cond:
       HM_Hellligkeit:
         0:
         1:
           state      ^HM_Hellligkeit$:^state:
         2:
           state      ^HM_Hellligkeit$:^state:
       duAutomatic:
         0:
         1:
           state      ^duAutomatic$:^state:
       duHelligkeit:
         0:
         1:
           state      ^duHelligkeit$:^state:
         2:
           state      ^duHelligkeit$:^state:
   attr:
     cmdState:
     wait:
       0:
         600
       1:
         600
       2:
         240
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and checkBeschatten("w")
     1          ::DOIF_time($hash,3,4,$wday,$hms) and !checkBeschatten("w") and ::ReadingValDoIf($hash,'duAutomatic','state') eq "on" and ::ReadingValDoIf($hash,'HM_Hellligkeit','state')>::ReadingValDoIf($hash,'duHelligkeit','state')
     2          ::DOIF_time($hash,6,7,$wday,$hms) and ::ReadingValDoIf($hash,'HM_Hellligkeit','state')<::ReadingValDoIf($hash,'duHelligkeit','state') or ::DOIF_time_once($hash,8,$wday)
   days:
   do:
     0:
       0          set .*West_RL pct [duBeschattenPctRollo:state]
     1:
       0          set .*West_RL pct 100
     2:
       0          set .*West_RL pct 0
     3:
   helper:
     DEVFILTER  ^global$|^duHelligkeit$|^duAutomatic$|^HM_Hellligkeit$
     NOTIFYDEV  global|duHelligkeit|duAutomatic|HM_Hellligkeit
     event      1.LUX: 2135.6,control: 2135.6,2135.6,hmstate: 2135.6
     globalinit 1
     last_timer 9
     sleepdevice HM_Hellligkeit
     sleepsubtimer 0
     sleeptimer 1
     timerdev   HM_Hellligkeit
     timerevent 1.LUX: 2135.6,control: 2135.6,2135.6,hmstate: 2135.6
     triggerDev HM_Hellligkeit
     timerevents:
       1.LUX: 2135.6
       control: 2135.6
       2135.6
       hmstate: 2135.6
     timereventsState:
       1.LUX: 2135.6
       control: 2135.6
       state: 2135.6
       hmstate: 2135.6
     triggerEvents:
       1.LUX: 2135.6
       control: 2135.6
       2135.6
       hmstate: 2135.6
     triggerEventsState:
       1.LUX: 2135.6
       control: 2135.6
       state: 2135.6
       hmstate: 2135.6
   internals:
   interval:
     0          -1
     1          0
     3          -1
     4          3
     6          -1
     7          6
   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          1599980400
     1          1600023600
     2          1599982200
     3          1599980400
     4          1600023600
     5          1599982200
     6          1600005600
     7          1600030800
     8          1600023600
   perlblock:
   readings:
     all         duAutomatic:state HM_Hellligkeit:state duHelligkeit:state
   realtime:
     0          09:00:00
     1          21:00:00
     2          09:30:00
     3          09:00:00
     4          21:00:00
     5          09:30:00
     6          16:00:00
     7          23:00:00
     8          21:00:00
   time:
     0          09:00:00
     1          21:00:00
     2          +:15
     3          09:00:00
     4          21:00:00
     5          +:15
     6          16:00:00
     7          23:00:00
     8          21:00:00
   timeCond:
     0          0
     1          0
     2          0
     3          1
     4          1
     5          1
     6          2
     7          2
     8          2
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
   timers:
     0           0  1  2
     1           3  4  5
     2           6  7  8
   trigger:
   triggertime:
     1599982200:
       localtime  1599982200
       hash:
     1600005600:
       localtime  1600005600
       hash:
     1600023600:
       localtime  1600023600
       hash:
     1600030800:
       localtime  1600030800
       hash:
   uiState:
   uiTable:
Attributes:
   alias      di_Rollos_Westen
   do         always
   room       Automatismen
   verbose    5
   wait       600:600:240


Wenn es nachher etwas wärmer ist und die Beschattung zuschlage sollte, schicke ich noch mal die list<> Ausgabe.

Christoph Morrison

Zitat von: luftdieb am 12 September 2020, 16:20:05
Hallo Christoph,
vielen Dank dass du dir mein Problem angeschaut hast. Mein Perl ist sicherlich grotig...

Deshalbe habe ich dir Tipps gegeben, wie du dein Perl verbessern kannst. Dein list ist jetzt schon mal gut, aber da checkBeschatten im Moment eine 0 zurück geliefert hat (sonst wäre die 2. Cond. nicht wahr), kann man schlecht beurteilen warum die 1. Cond. nicht wahr ist. Insofern hast du Recht, dass du noch mal ein list machen musst, wenn das DOIF den "falschen" (aka nicht intendierten) Zustand hat.

Ich würde übrigens zum Debugging den Rückgabewert von checkBeschatten in ein Reading im DOIF schreiben lassen, folgend als formatierte DEF, denn der Rückgabewert ist im list des DOIF nicht enthalten:

DOIF
    (
            [09:00-21:00,+:15]
        and checkBeschatten("w")
    )
    (
        setreading $SELF checkBeschatten_retVal_cond1 checkBeschatten(q(w)),
        set .*West_RL pct [duBeschattenPctRollo:state]
    )
DOELSEIF
    (
            [09:00-21:00,+:15]
        and !checkBeschatten("w")
        and [duAutomatic:state] eq "on"
        and [HM_Hellligkeit:state] > [duHelligkeit:state]
    )
    (
        setreading $SELF checkBeschatten_retVal_cond2 !checkBeschatten(q(w)),
        set .*West_RL pct 100
    )
DOELSEIF
    (
            [16:00-23:00]
        and [HM_Hellligkeit:state] < [duHelligkeit:state]
        or  [21:00]
    )
    (
        set .*West_RL pct 0
    )


luftdieb

Hallo,
hier die Ausgabe, nachdem ich die SollTemperatur von 26 auf 23 reduziert habe, um eine 1 bei checkbeschatten("s") zu erhalten.

Internals:
   DEF        (
            [09:00-21:00,+:15]
        and checkBeschatten("s")
    )
    (
        setreading $SELF checkBeschatten_retVal_cond1 checkBeschatten(q(s)),
        set .*Sued_RL pct [duBeschattenPctRollo:state]
    )
DOELSEIF
    (
            [09:00-21:00,+:15]
        and !checkBeschatten("s")
        and [duAutomatic:state] eq "on"
        and [HM_Hellligkeit:state] > [duHelligkeit:state]
    )
    (
        setreading $SELF checkBeschatten_retVal_cond2 !checkBeschatten(q(s)),
        set .*Sued_RL pct 100
    )
DOELSEIF
    (
            [16:00-23:00]
        and [HM_Hellligkeit:state] < [duHelligkeit:state]
        or  [21:00]
    )
    (
        set .*Sued_RL pct 0
    )
   FUUID      5c4e1f45-f33f-68c5-e288-334c34dd90a527d7
   MODEL      FHEM
   NAME       di_Rollos_Sueden
   NOTIFYDEV  global,HM_Hellligkeit,duAutomatic,duHelligkeit
   NR         90
   NTFY_ORDER 50-di_Rollos_Sueden
   STATE      initialized
   TYPE       DOIF
   VERSION    22588 2020-08-12 19:25:15
   READINGS:
     2020-09-13 13:08:30   Device          HM_Hellligkeit
     2020-09-13 13:07:14   cmd             0
     2020-09-13 13:08:30   e_HM_Hellligkeit_state 6063.4
     2020-09-13 13:07:14   mode            enabled
     2020-09-13 13:07:14   state           initialized
     2020-09-13 13:07:14   timer_01_c01    14.09.2020 09:00:00
     2020-09-13 13:07:14   timer_02_c01    13.09.2020 21:00:00
     2020-09-13 13:07:14   timer_03_c01    13.09.2020 13:15:00
     2020-09-13 13:07:14   timer_04_c02    14.09.2020 09:00:00
     2020-09-13 13:07:14   timer_05_c02    13.09.2020 21:00:00
     2020-09-13 13:07:14   timer_06_c02    13.09.2020 13:15:00
     2020-09-13 13:07:14   timer_07_c03    13.09.2020 16:00:00
     2020-09-13 13:07:14   timer_08_c03    13.09.2020 23:00:00
     2020-09-13 13:07:14   timer_09_c03    13.09.2020 21:00:00
     2020-09-13 13:08:37   wait_timer      13.09.2020 13:18:37 cmd_1 di_Rollos_Sueden
   Regex:
     accu:
     cond:
       HM_Hellligkeit:
         0:
         1:
           state      ^HM_Hellligkeit$:^state:
         2:
           state      ^HM_Hellligkeit$:^state:
       duAutomatic:
         1:
           state      ^duAutomatic$:^state:
       duHelligkeit:
         1:
           state      ^duHelligkeit$:^state:
         2:
           state      ^duHelligkeit$:^state:
   attr:
     cmdState:
     wait:
       0:
         600
       1:
         600
       2:
         240
     waitdel:
   condition:
     0                       ::DOIF_time($hash,0,1,$wday,$hms)         and checkBeschatten("s")     
     1                       ::DOIF_time($hash,3,4,$wday,$hms)         and !checkBeschatten("s")         and ::ReadingValDoIf($hash,'duAutomatic','state') eq "on"         and ::ReadingValDoIf($hash,'HM_Hellligkeit','state') > ::ReadingValDoIf($hash,'duHelligkeit','state')     
     2                       ::DOIF_time($hash,6,7,$wday,$hms)         and ::ReadingValDoIf($hash,'HM_Hellligkeit','state') < ::ReadingValDoIf($hash,'duHelligkeit','state')         or  ::DOIF_time_once($hash,8,$wday)     
   days:
   do:
     0:
       0                   setreading di_Rollos_Sueden checkBeschatten_retVal_cond1 checkBeschatten(q(s)),         set .*Sued_RL pct [duBeschattenPctRollo:state]     
     1:
       0                   setreading di_Rollos_Sueden checkBeschatten_retVal_cond2 !checkBeschatten(q(s)),         set .*Sued_RL pct 100     
     2:
       0                   set .*Sued_RL pct 0     
     3:
   helper:
     DEVFILTER  ^global$|^HM_Hellligkeit$|^duAutomatic$|^duHelligkeit$
     NOTIFYDEV  global|HM_Hellligkeit|duAutomatic|duHelligkeit
     event      1.LUX: 6063.4,control: 6063.4,6063.4,hmstate: 6063.4
     globalinit 1
     last_timer 9
     sleepdevice di_Rollos_Sueden
     sleepsubtimer 0
     sleeptimer 0
     timerdev   
     timerevent 1.LUX: 6063.4,control: 6063.4,6063.4,hmstate: 6063.4
     timerevents
     timereventsState
     triggerDev
   internals:
   interval:
     0          -1
     1          0
     3          -1
     4          3
     6          -1
     7          6
   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          1600066800
     1          1600023600
     2          1599995700
     3          1600066800
     4          1600023600
     5          1599995700
     6          1600005600
     7          1600030800
     8          1600023600
   readings:
     all         duAutomatic:state HM_Hellligkeit:state duHelligkeit:state
   realtime:
     0          09:00:00
     1          21:00:00
     2          13:15:00
     3          09:00:00
     4          21:00:00
     5          13:15:00
     6          16:00:00
     7          23:00:00
     8          21:00:00
   time:
     0          09:00:00
     1          21:00:00
     2          +:15
     3          09:00:00
     4          21:00:00
     5          +:15
     6          16:00:00
     7          23:00:00
     8          21:00:00
   timeCond:
     0          0
     1          0
     2          0
     3          1
     4          1
     5          1
     6          2
     7          2
     8          2
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
   timers:
     0           0  1  2
     1           3  4  5
     2           6  7  8
   trigger:
   triggertime:
     1599995700:
       localtime  1599995700
       hash:
     1600005600:
       localtime  1600005600
       hash:
     1600023600:
       localtime  1600023600
       hash:
     1600030800:
       localtime  1600030800
       hash:
     1600066800:
       localtime  1600066800
       hash:
   uiState:
   uiTable:
Attributes:
   alias      di_Rollos_Sueden
   room       Automatismen
   verbose    5
   wait       600:600:240


Die beiden Conditions checkBeschatten_retVal_cond1 und checkBeschatten_retVal_cond2 habe ich jetzt noch nicht im Device gefunden. Evtl. muss ich hier noch etwas warten. In meinem  Rollpuffer (addRollbufferBeschatten) erscheint zumindest "13:08:37_s_ Beschattung sinnvoll!".

Oh Wunder. Eben sind die Rollos runtergegangen. Hier die list Ausgabe dazu
Internals:
   DEF        (
            [09:00-21:00,+:15]
        and checkBeschatten("s")
    )
    (
        setreading $SELF checkBeschatten_retVal_cond1 checkBeschatten(q(s)),
        set .*Sued_RL pct [duBeschattenPctRollo:state]
    )
DOELSEIF
    (
            [09:00-21:00,+:15]
        and !checkBeschatten("s")
        and [duAutomatic:state] eq "on"
        and [HM_Hellligkeit:state] > [duHelligkeit:state]
    )
    (
        setreading $SELF checkBeschatten_retVal_cond2 !checkBeschatten(q(s)),
        set .*Sued_RL pct 100
    )
DOELSEIF
    (
            [16:00-23:00]
        and [HM_Hellligkeit:state] < [duHelligkeit:state]
        or  [21:00]
    )
    (
        set .*Sued_RL pct 0
    )
   FUUID      5c4e1f45-f33f-68c5-e288-334c34dd90a527d7
   MODEL      FHEM
   NAME       di_Rollos_Sueden
   NOTIFYDEV  global,HM_Hellligkeit,duAutomatic,duHelligkeit
   NR         90
   NTFY_ORDER 50-di_Rollos_Sueden
   STATE      cmd_1
   TYPE       DOIF
   VERSION    22588 2020-08-12 19:25:15
   READINGS:
     2020-09-13 13:18:18   Device          HM_Hellligkeit
     2020-09-13 13:18:37   checkBeschatten_retVal_cond1 checkBeschatten(q(s))
     2020-09-13 13:18:38   cmd             1
     2020-09-13 13:18:38   cmd_event       di_Rollos_Sueden
     2020-09-13 13:18:38   cmd_nr          1
     2020-09-13 13:18:18   e_HM_Hellligkeit_state 6098.4
     2020-09-13 13:07:14   mode            enabled
     2020-09-13 13:18:38   state           cmd_1
     2020-09-13 13:07:14   timer_01_c01    14.09.2020 09:00:00
     2020-09-13 13:07:14   timer_02_c01    13.09.2020 21:00:00
     2020-09-13 13:15:02   timer_03_c01    13.09.2020 13:30:00
     2020-09-13 13:07:14   timer_04_c02    14.09.2020 09:00:00
     2020-09-13 13:07:14   timer_05_c02    13.09.2020 21:00:00
     2020-09-13 13:15:02   timer_06_c02    13.09.2020 13:30:00
     2020-09-13 13:07:14   timer_07_c03    13.09.2020 16:00:00
     2020-09-13 13:07:14   timer_08_c03    13.09.2020 23:00:00
     2020-09-13 13:07:14   timer_09_c03    13.09.2020 21:00:00
     2020-09-13 13:18:37   wait_timer      no timer
   Regex:
     accu:
     cond:
       HM_Hellligkeit:
         0:
         1:
           state      ^HM_Hellligkeit$:^state:
         2:
           state      ^HM_Hellligkeit$:^state:
       duAutomatic:
         1:
           state      ^duAutomatic$:^state:
       duHelligkeit:
         1:
           state      ^duHelligkeit$:^state:
         2:
           state      ^duHelligkeit$:^state:
   attr:
     cmdState:
     wait:
       0:
         600
       1:
         600
       2:
         240
     waitdel:
   condition:
     0                       ::DOIF_time($hash,0,1,$wday,$hms)         and checkBeschatten("s")     
     1                       ::DOIF_time($hash,3,4,$wday,$hms)         and !checkBeschatten("s")         and ::ReadingValDoIf($hash,'duAutomatic','state') eq "on"         and ::ReadingValDoIf($hash,'HM_Hellligkeit','state') > ::ReadingValDoIf($hash,'duHelligkeit','state')     
     2                       ::DOIF_time($hash,6,7,$wday,$hms)         and ::ReadingValDoIf($hash,'HM_Hellligkeit','state') < ::ReadingValDoIf($hash,'duHelligkeit','state')         or  ::DOIF_time_once($hash,8,$wday)     
   days:
   do:
     0:
       0                   setreading di_Rollos_Sueden checkBeschatten_retVal_cond1 checkBeschatten(q(s)),         set .*Sued_RL pct [duBeschattenPctRollo:state]     
     1:
       0                   setreading di_Rollos_Sueden checkBeschatten_retVal_cond2 !checkBeschatten(q(s)),         set .*Sued_RL pct 100     
     2:
       0                   set .*Sued_RL pct 0     
     3:
   helper:
     DEVFILTER  ^global$|^HM_Hellligkeit$|^duAutomatic$|^duHelligkeit$
     NOTIFYDEV  global|HM_Hellligkeit|duAutomatic|duHelligkeit
     event      timer_3
     globalinit 1
     last_timer 9
     sleepdevice di_Rollos_Sueden
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_3
     triggerDev
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: di_Rollos_Sueden
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: di_Rollos_Sueden
       state: cmd_1
     timerevents:
       timer_3
     timereventsState:
       timer_3
     triggerEvents:
       timer_3
     triggerEventsState:
       timer_3
   internals:
   interval:
     0          -1
     1          0
     3          -1
     4          3
     6          -1
     7          6
   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          1600066800
     1          1600023600
     2          1599996600
     3          1600066800
     4          1600023600
     5          1599996600
     6          1600005600
     7          1600030800
     8          1600023600
   readings:
     all         duAutomatic:state HM_Hellligkeit:state duHelligkeit:state
   realtime:
     0          09:00:00
     1          21:00:00
     2          13:30:00
     3          09:00:00
     4          21:00:00
     5          13:30:00
     6          16:00:00
     7          23:00:00
     8          21:00:00
   time:
     0          09:00:00
     1          21:00:00
     2          +:15
     3          09:00:00
     4          21:00:00
     5          +:15
     6          16:00:00
     7          23:00:00
     8          21:00:00
   timeCond:
     0          0
     1          0
     2          0
     3          1
     4          1
     5          1
     6          2
     7          2
     8          2
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
   timers:
     0           0  1  2
     1           3  4  5
     2           6  7  8
   trigger:
   triggertime:
     1599996600:
       localtime  1599996600
       hash:
     1600005600:
       localtime  1600005600
       hash:
     1600023600:
       localtime  1600023600
       hash:
     1600030800:
       localtime  1600030800
       hash:
     1600066800:
       localtime  1600066800
       hash:
   uiState:
   uiTable:
Attributes:
   alias      di_Rollos_Sueden
   room       Automatismen
   verbose    5
   wait       600:600:240


Ich vermute es liegt an den Klammern. Beim Übernehmen der vorgeschlagenen Anpassung sind mir ein paar Klammern aufgefallen, die irgendwie unstimmig wirken. Das muss ich mir noch mal in Ruhe anschauen.

Christoph Morrison

Achso, ich hatte das vorhin nur so runtergeschrieben, checkBeschattung funktioniert im Ausführungsteil ohne {()} nicht. Das muss also wie folgt heißen:

DOIF
    (
            [09:00-21:00,+:15]
        and checkBeschatten("w")
    )
    (
        setreading $SELF checkBeschatten_retVal_cond1 {( checkBeschatten(q(w));  )},
        set .*West_RL pct [duBeschattenPctRollo:state]
    )
DOELSEIF
    (
            [09:00-21:00,+:15]
        and !checkBeschatten("w")
        and [duAutomatic:state] eq "on"
        and [HM_Hellligkeit:state] > [duHelligkeit:state]
    )
    (
        setreading $SELF checkBeschatten_retVal_cond2 {( !checkBeschatten(q(w)); )},
        set .*West_RL pct 100
    )
DOELSEIF
    (
            [16:00-23:00]
        and [HM_Hellligkeit:state] < [duHelligkeit:state]
        or  [21:00]
    )
    (
        set .*West_RL pct 0
    )

luftdieb

Hallo,
leider funktioniert die Beschattung noch nicht so, wie erwartet. Im Rollpuffer wird mir die Beschattung als empfohlen eingetragen aber das cmd1 vom doif wird scheinbar nicht ausgeführt. Wird cmd1 manuell aufgerufen, reagiert der Rollo und würde in die Position der Beschattung anfahren. Aber in den Attributen steht als letzter command cmd2 von heute früh.
Ich habe vom Zustand eben, wo checkBeschatten() true zurückliefert ein list<> erstellt

Internals:
   DEF        (
        ([09:00-19:00|7,+:15] or [08:00-20:00|8,+:15])
        and checkBeschatten("s")
    )
    (
        setreading $SELF checkBeschatten_retVal_cond1 {( checkBeschatten(q(s));  )},
        set .*Sued_RL pct [duBeschattenPctRollo:state]
    )
DOELSEIF
    (
        ([09:00-18:30|7,+:15] or [08:00-18:30|8,+:15])
        and !checkBeschatten("s")
        and [duAutomatic:state] eq "on"
        and [HM_Hellligkeit:state] > [duHelligkeit:state]
    )
    (
        setreading $SELF checkBeschatten_retVal_cond2 {( !checkBeschatten(q(s)); )},
        set .*Sued_RL pct 100
    )
DOELSEIF
    (
        [16:00-23:00]
        and [HM_Hellligkeit:state] < [duHelligkeit:state]
        or  [21:00]
    )
    (
        set .*Sued_RL pct 0
    )
   FUUID      5c4e1f45-f33f-68c5-e288-334c34dd90a527d7
   MODEL      FHEM
   NAME       di_Rollos_Sueden
   NOTIFYDEV  duHelligkeit,HM_Hellligkeit,duAutomatic,global
   NR         90
   NTFY_ORDER 50-di_Rollos_Sueden
   STATE      cmd_2
   TYPE       DOIF
   VERSION    22588 2020-08-12 19:25:15
   READINGS:
     2020-09-18 16:23:27   Device          HM_Hellligkeit
     2020-09-17 10:51:45   checkBeschatten_retVal_cond1 0
     2020-09-18 08:00:01   checkBeschatten_retVal_cond2 1
     2020-09-18 08:00:02   cmd             2
     2020-09-18 08:00:02   cmd_event       timer_7
     2020-09-18 08:00:02   cmd_nr          2
     2020-09-18 16:23:27   e_HM_Hellligkeit_state 6648.2
     2020-09-18 10:00:00   e_duAutomatic_state on
     2020-09-16 19:24:04   mode            enabled
     2020-09-18 08:00:02   state           cmd_2
     2020-09-17 19:00:00   timer_01_c01    18.09.2020 09:00:00|7,+:15
     2020-09-17 19:00:00   timer_02_c01    18.09.2020 19:00:00|7,+:15
     2020-09-17 20:00:00   timer_03_c01    18.09.2020 08:00:00|8,+:15
     2020-09-17 20:00:00   timer_04_c01    18.09.2020 20:00:00|8,+:15
     2020-09-17 18:30:00   timer_05_c02    18.09.2020 09:00:00|7,+:15
     2020-09-17 18:30:00   timer_06_c02    18.09.2020 18:30:00|7,+:15
     2020-09-17 18:30:00   timer_07_c02    18.09.2020 08:00:00|8,+:15
     2020-09-17 18:30:00   timer_08_c02    18.09.2020 18:30:00|8,+:15
     2020-09-17 23:00:00   timer_09_c03    18.09.2020 16:00:00
     2020-09-17 23:00:00   timer_10_c03    18.09.2020 23:00:00
     2020-09-17 21:00:00   timer_11_c03    18.09.2020 21:00:00
     2020-09-17 19:47:29   wait_timer      no timer
   Regex:
     accu:
     cond:
       HM_Hellligkeit:
         0:
         1:
           state      ^HM_Hellligkeit$:^state:
         2:
           state      ^HM_Hellligkeit$:^state:
       duAutomatic:
         0:
         1:
           state      ^duAutomatic$:^state:
       duHelligkeit:
         1:
           state      ^duHelligkeit$:^state:
         2:
           state      ^duHelligkeit$:^state:
   attr:
     cmdState:
     wait:
       0:
         600
       1:
         600
       2:
         240
     waitdel:
   condition:
     0                   (::DOIF_time($hash,0,1,$wday,$hms,"7,+:15") or ::DOIF_time($hash,2,3,$wday,$hms,"8,+:15"))         and checkBeschatten("s")     
     1                   (::DOIF_time($hash,4,5,$wday,$hms,"7,+:15") or ::DOIF_time($hash,6,7,$wday,$hms,"8,+:15"))         and !checkBeschatten("s")         and ::ReadingValDoIf($hash,'duAutomatic','state') eq "on"         and ::ReadingValDoIf($hash,'HM_Hellligkeit','state') > ::ReadingValDoIf($hash,'duHelligkeit','state')     
     2                   ::DOIF_time($hash,8,9,$wday,$hms)         and ::ReadingValDoIf($hash,'HM_Hellligkeit','state') < ::ReadingValDoIf($hash,'duHelligkeit','state')         or  ::DOIF_time_once($hash,10,$wday)     
   days:
     0          7,+:15
     1          7,+:15
     2          8,+:15
     3          8,+:15
     4          7,+:15
     5          7,+:15
     6          8,+:15
     7          8,+:15
   do:
     0:
       0                   setreading di_Rollos_Sueden checkBeschatten_retVal_cond1 {( checkBeschatten(q(s));  )},         set .*Sued_RL pct [duBeschattenPctRollo:state]     
     1:
       0                   setreading di_Rollos_Sueden checkBeschatten_retVal_cond2 {( !checkBeschatten(q(s)); )},         set .*Sued_RL pct 100     
     2:
       0                   set .*Sued_RL pct 0     
     3:
   helper:
     DEVFILTER  ^global$|^duAutomatic$|^HM_Hellligkeit$|^duHelligkeit$
     NOTIFYDEV  global|duAutomatic|HM_Hellligkeit|duHelligkeit
     event      1.LUX: 6648.2,control: 6648.2,6648.2,hmstate: 6648.2
     globalinit 1
     last_timer 11
     sleepdevice HM_Hellligkeit
     sleepsubtimer -1
     sleeptimer -1
     timerdev   HM_Hellligkeit
     timerevent 1.LUX: 4888.2,control: 4888.2,4888.2,hmstate: 4888.2
     triggerDev HM_Hellligkeit
     timerevents:
       1.LUX: 4888.2
       control: 4888.2
       4888.2
       hmstate: 4888.2
     timereventsState:
       1.LUX: 4888.2
       control: 4888.2
       state: 4888.2
       hmstate: 4888.2
     triggerEvents:
       1.LUX: 6648.2
       control: 6648.2
       6648.2
       hmstate: 6648.2
     triggerEventsState:
       1.LUX: 6648.2
       control: 6648.2
       state: 6648.2
       hmstate: 6648.2
   internals:
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
     6          -1
     7          6
     8          -1
     9          8
   intervalfunc:
   intervaltimer:
   localtime:
     0          1600412400
     1          1600448400
     10         1600455600
     2          1600408800
     3          1600452000
     4          1600412400
     5          1600446600
     6          1600408800
     7          1600446600
     8          1600437600
     9          1600462800
   perlblock:
   readings:
     all         duAutomatic:state HM_Hellligkeit:state duHelligkeit:state
   realtime:
     0          09:00:00
     1          19:00:00
     10         21:00:00
     2          08:00:00
     3          20:00:00
     4          09:00:00
     5          18:30:00
     6          08:00:00
     7          18:30:00
     8          16:00:00
     9          23:00:00
   time:
     0          09:00:00
     1          19:00:00
     10         21:00:00
     2          08:00:00
     3          20:00:00
     4          09:00:00
     5          18:30:00
     6          08:00:00
     7          18:30:00
     8          16:00:00
     9          23:00:00
   timeCond:
     0          0
     1          0
     10         2
     2          0
     3          0
     4          1
     5          1
     6          1
     7          1
     8          2
     9          2
   timer:
     0          0
     1          0
     10         0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
     9          0
   timers:
     0           0  1  2  3
     1           4  5  6  7
     2           8  9  10
   trigger:
   triggertime:
     1600446600:
       localtime  1600446600
       hash:
     1600448400:
       localtime  1600448400
       hash:
     1600452000:
       localtime  1600452000
       hash:
     1600455600:
       localtime  1600455600
       hash:
     1600462800:
       localtime  1600462800
       hash:
   uiState:
   uiTable:
Attributes:
   alias      di_Rollos_Sueden
   room       Automatismen
   verbose    5
   wait       600:600:240


Vielleicht fällt da jemandem noch was auf. Die Ausgabe fällt mir schwer zu interpretieren.

Gruß
luftdieb