[Gelöst] DOELSE wird angesprugen obwohl Bedingungen Wahr bleiben

Begonnen von bismosa, 26 Mai 2018, 15:22:36

Vorheriges Thema - Nächstes Thema

bismosa

Hallo,

Ich stelle die Frage mal in einen neuen Thread, da es in den vorherigen nicht passt.
Ich habe mir mit DOIF eine Rolladensteuerung gebastelt. Ich bin auch fest davon überzeugt, das es eigentlich funktionieren müsste. Aber irgendwo habe ich einen Wurm drin, den ich einfach nicht finde.

Kurzbeschreibung:
##1 Sobald die eingestellte Zeit kommt, den Rolladen runter fahren
##2 Wenn die Steuerung nach Dämmerung sein soll, dann nach dieser Zeit den Rolladen fahren
##3 Wenn im Zeitfenster, die Sonne im Bereich ist, Temperaturen stimmen -> Beschattungsposition
##4 Wenn ausgeschaltet nichts mehr machen
##5 DOELSE -> Hochfahren

Jetzt ist es aber so, dass sobald die Uhrzeit "Rolladen_Kueche:Autom_zu_zeit" erreicht wird sofort in den DOELSE Zweig gesprungen wird. Obwohl die Bedingungen in Zweig 3 immer noch gegeben sind und das DOIF hier "verweilt".
Dafür schreibe ich zum testen die Readings in Logfile. Ich finde aber den Fehler einfach nicht.

Hier die Definition:

defmod di_Rolladen_Kueche_Auto DOIF ##1 Zeitsteuerung vor allen anderen: Wenn schließzeit früher, wird die Bedingung sonst nicht wahr!\
([Rolladen_Kueche:Autom_zu] eq "Ja" \
and [di_Einst_Rolladen:Autom_aktiv] eq "Ja" ##Alle An/Aus\
and [[Rolladen_Kueche:Autom_zu_zeit]|012345678]\
and [Rolladen_Kueche:Autom_zu_sonne] eq "Nein"\
)({\
my $RolloDevice="Rolladen_Kueche";;\
##Nur, wenn nicht ganz unten\
Log 1, "Rollo $RolloDevice soll schließen (Zeit)";;\
my $RolloPos=ReadingsVal("$RolloDevice", "position", 0);;\
if ("$RolloPos" < 100){\
Log 1, "Rollo $RolloDevice soll geschlossen werden!";;\
##Je nachdem ob Fenster offen und welche Einstellung:\
my $FOA=ReadingsVal("Rolladen_Kueche", "Autom_zu_fenster_offen", "");; ##Aktion bei Fenster offen\
if ("$FOA" eq "Nichts unternehmen"){\
Log 1, "Rollo $RolloDevice muss runter gefahren werrden. Aber nur Wenn Fenster zu sind!";;\
##Nur wenn Fenster zu sind!\
my @FK=devspec2array("NAME=Fenster_EG_Kueche.*:FILTER=STATE=Offen|Kaputt");;\
if (scalar(@FK) == 0){\
Log 1, "Rollo $RolloDevice wird geschlossen!";;\
fhem("sleep 1;;set $RolloDevice closed");; \
} else {\
Log 1, "Rollo $RolloDevice wird nicht zu gefahren, da noch ein Fenster offen ist";;\
}\
} else {\
##Egal, ob Fenster offen...immer Fahren!\
Log 1, "Rollo $RolloDevice wird geschlossen!";;\
fhem("sleep 1;;set $RolloDevice closed");;\
}\
}\
})\
\
##2 Zeitsteuerung nach Dämmerung\
DOELSEIF\
([Rolladen_Kueche:Autom_zu] eq "Ja" \
and [di_Einst_Rolladen:Autom_aktiv] eq "Ja" ##Alle An/Aus\
and [Rolladen_Kueche:Autom_zu_sonne] eq "Ja"\
and [([twilight:ss_weather]+[Rolladen_Kueche:Autom_zu_sonne_offset]*60)|012345678]\
)({\
my $RolloDevice="Rolladen_Kueche";;\
##Nur, wenn nicht ganz unten\
Log 1, "Rollo $RolloDevice soll schließen (Dämmerung)";;\
my $RolloPos=ReadingsVal("$RolloDevice", "position", 0);;\
if ("$RolloPos" < 100){\
Log 1, "Rollo $RolloDevice soll geschlossen werden!";;\
##Je nachdem ob Fenster offen und welche Einstellung:\
my $FOA=ReadingsVal("Rolladen_Kueche", "Autom_zu_fenster_offen", "");; ##Aktion bei Fenster offen\
if ("$FOA" eq "Nichts unternehmen"){\
Log 1, "Rollo $RolloDevice muss runter gefahren werden. Aber nur Wenn Fenster zu sind!";;\
##Nur wenn Fenster zu sind!\
my @FK=devspec2array("NAME=Fenster_EG_Kueche.*:FILTER=STATE=Offen|Kaputt");;\
if (scalar(@FK) == 0){\
Log 1, "Rollo $RolloDevice wird geschlossen!";;\
fhem("sleep 1;;set $RolloDevice closed");; \
} else {\
Log 1, "Rollo $RolloDevice wird nicht zu gefahren, da noch ein Fenster offen ist";;\
}\
} else {\
##Egal, ob Fenster offen...immer Fahren!\
Log 1, "Rollo $RolloDevice wird geschlossen!";;\
fhem("sleep 1;;set $RolloDevice closed");; \
}\
}\
})\
\
##3 Dämmerung 1\
DOELSEIF ([di_Einst_Rolladen:Autom_aktiv] eq "Ja" ##Alle An/Aus\
and [Rolladen_Kueche:Autom_aktiv] eq "Ja" ##Dieser Rolladen aktiv\
and [[Rolladen_Kueche:Autom_von]-[Rolladen_Kueche:Autom_bis]] ##Zeitraum\
and [wetter_syke:temperature] >= [Rolladen_Kueche:Autom_tempAussen] ##Temperatur Außen\
and [Max_WT_Wohnzimmer:temperature] >= [Rolladen_Kueche:Autom_tempInnen] ##Temperatur Außen\
and [Rolladen_Kueche:Autom_azimutMin] < [twilight:azimuth] ##Azimuth min\
and [Rolladen_Kueche:Autom_azimutMax] > [twilight:azimuth] ##Azimut max\
and [Rolladen_Kueche:Autom_elevationMin] < [twilight:elevation] ##Elevation min ##K!\
and [Rolladen_Kueche:Autom_elevationMax] > [twilight:elevation] ##Elevation max ##K!\
##Dann eben solarradiation! ist gelegentlich 0 ! Also bei null nicht beachten!\
and ( [WUweather:solarradiation] > [Rolladen_Kueche:Autom_solar] or [WUweather:solarradiation] == 0)\
)({\
my $RolloDevice="Rolladen_Kueche";;\
my $RolloPos=ReadingsVal("Rolladen_Kueche","Autom_pos","");; ##K!\
##Wenn beriets in Position oder Tiefer nicht mehr fahren!\
my $RolloIstPos=ReadingsVal("$RolloDevice","position","0");;\
Log 1, "Fall1: Rollo $RolloDevice soll in Beschattungsposition $RolloPos" ;; ##K!\
if ("$RolloIstPos" < "$RolloPos"){\
Log 1, "Fall1: Rollo $RolloDevice fährt in Beschattungsposition $RolloPos" ;; ##K!\
fhem("sleep 1;;set $RolloDevice position $RolloPos");;\
}\
}) \
\
##4 Ausgeschaltet -> Nix mehr machen!\
DOELSEIF ([Rolladen_Kueche:Autom_aktiv] eq "Nein" \
or [di_Einst_Rolladen:Autom_aktiv] eq "Nein" ##Alle An/Aus\
)({\
my $RolloDevice="Rolladen_Kueche";;\
Log 1, "Rollo $RolloDevice abgeschaltet.";;\
})\
\
##5 Wenn keine Bedingung war ist, zurücksetzen!\
DOELSE ({\
my $RolloDevice="Rolladen_Kueche";;\
Log 1, "Rollo $RolloDevice DOELSE";;\
Log 1, ReadingsVal("di_Einst_Rolladen","Autom_aktiv","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_aktiv","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_von","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_bis","");;\
Log 1, ReadingsVal("wetter_syke","temperature","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_tempAussen","");;\
Log 1, ReadingsVal("Max_WT_Wohnzimmer","temperature","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_tempInnen","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_azimutMin","");;\
Log 1, ReadingsVal("twilight","azimuth","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_azimutMax","");;\
Log 1, ReadingsVal("twilight","azimuth","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_elevationMin","");;\
Log 1, ReadingsVal("twilight","elevation","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_elevationMax","");;\
Log 1, ReadingsVal("twilight","elevation","");;\
Log 1, ReadingsVal("WUweather","solarradiation","");;\
Log 1, ReadingsVal("Rolladen_Kueche","Autom_solar","");;\
##Prüfen, ob automatisch wieder geöffnet werden soll\
my $RolloAutoHoch=ReadingsVal("Rolladen_Kueche","Autom_auf","");;\
if ("$RolloAutoHoch" eq "Ja"){\
##Nur, wenn nicht ganz unten\
Log 1, "Rollo $RolloDevice soll hochfahren";;\
my $RolloPos=ReadingsVal("$RolloDevice", "position", 0);;\
if ("$RolloPos" < 99){\
Log 1, "Rollo $RolloDevice ist nicht geschlossen";;\
##Nur, wenn nicht bereits oben\
if ("$RolloPos" > 0){\
Log 1, "Rollo $RolloDevice wird hoch gefahren!";;\
fhem("sleep 1;;set $RolloDevice open");;\
}\
}\
}\
\
})
attr di_Rolladen_Kueche_Auto cmdpause 900:900:900:900:900
attr di_Rolladen_Kueche_Auto group _Einstellungen
attr di_Rolladen_Kueche_Auto room Rolläden

setstate di_Rolladen_Kueche_Auto cmd_5
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:16:32 Device Max_WT_Wohnzimmer
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:00 cmd 5
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:00 cmd_event timer_1
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:00 cmd_nr 5
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:16:32 e_Max_WT_Wohnzimmer_temperature 25.2
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_aktiv Ja
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_azimutMax 320
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_azimutMin 133
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_elevationMax 90
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_elevationMin 0
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_solar 150
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_tempAussen 16
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_tempInnen 19
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_zu Ja
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:25 e_Rolladen_Kueche_Autom_zu_sonne Ja
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:16:14 e_WUweather_solarradiation 667
setstate di_Rolladen_Kueche_Auto 2018-05-26 11:45:09 e_di_Einst_Rolladen_Autom_aktiv Ja
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:16:13 e_twilight_azimuth 203.42
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:16:13 e_twilight_elevation 57.21
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:31 e_wetter_syke_temperature 21.2
setstate di_Rolladen_Kueche_Auto 2018-05-25 20:52:08 mode enabled
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:00 state cmd_5
setstate di_Rolladen_Kueche_Auto 2018-05-26 14:15:00 timer_01_c01 27.05.2018 14:15:00|012345678
setstate di_Rolladen_Kueche_Auto 2018-05-26 04:32:25 timer_02_c02 26.05.2018 20:11:52|012345678
setstate di_Rolladen_Kueche_Auto 2018-05-25 22:00:00 timer_03_c03 26.05.2018 09:00:00
setstate di_Rolladen_Kueche_Auto 2018-05-25 22:00:00 timer_04_c03 26.05.2018 22:00:00


Und hier der Auszug aus dem Log:

2018.05.26 14:15:00 1: Rollo Rolladen_Kueche DOELSE
2018.05.26 14:15:00 1: Ja                     di_Einst_Rolladen  Autom_aktiv
2018.05.26 14:15:00 1: Ja                     Rolladen_Kueche   Autom_aktiv
2018.05.26 14:15:00 1: 09:00                Rolladen_Kueche   Autom_von
2018.05.26 14:15:00 1: 22:00                Rolladen_Kueche   Autom_bis
2018.05.26 14:15:00 1: 21.2                  wetter_syke   temperature
2018.05.26 14:15:00 1: 16                     Rolladen_Kueche   Autom_tempAussen
2018.05.26 14:15:00 1: 25.2                  Max_WT_Wohnzimmer   temperature
2018.05.26 14:15:00 1: 19                     Rolladen_Kueche   Autom_tempInnen
2018.05.26 14:15:00 1: 133                   Rolladen_Kueche   Autom_azimutMin
2018.05.26 14:15:00 1: 201.33              twilight   azimuth
2018.05.26 14:15:00 1: 320                   Rolladen_Kueche   Autom_azimutMax
2018.05.26 14:15:00 1: 201.33               twilight   azimuth
2018.05.26 14:15:00 1: 0                      Rolladen_Kueche   Autom_elevationMin
2018.05.26 14:15:00 1: 57.5                  twilight   elevation
2018.05.26 14:15:00 1: 90                      Rolladen_Kueche   Autom_elevationMax
2018.05.26 14:15:00 1: 57.5                 twilight   elevation
2018.05.26 14:15:00 1: 640                  WUweather   solarradiation
2018.05.26 14:15:00 1: 150                  Rolladen_Kueche  Autom_solar
2018.05.26 14:15:00 1: Rollo Rolladen_Kueche soll hochfahren
2018.05.26 14:15:00 1: Rollo Rolladen_Kueche ist nicht geschlossen
2018.05.26 14:15:00 1: Rollo Rolladen_Kueche wird hoch gefahren!


Und aus diesem Abschnitt kommt das DOIF:

DOELSEIF ([di_Einst_Rolladen:Autom_aktiv] eq "Ja" ##Alle An/Aus\
and [Rolladen_Kueche:Autom_aktiv] eq "Ja" ##Dieser Rolladen aktiv\
and [[Rolladen_Kueche:Autom_von]-[Rolladen_Kueche:Autom_bis]] ##Zeitraum\
and [wetter_syke:temperature] >= [Rolladen_Kueche:Autom_tempAussen] ##Temperatur Außen\
and [Max_WT_Wohnzimmer:temperature] >= [Rolladen_Kueche:Autom_tempInnen] ##Temperatur Außen\
and [Rolladen_Kueche:Autom_azimutMin] < [twilight:azimuth] ##Azimuth min\
and [Rolladen_Kueche:Autom_azimutMax] > [twilight:azimuth] ##Azimut max\
and [Rolladen_Kueche:Autom_elevationMin] < [twilight:elevation] ##Elevation min ##K!\
and [Rolladen_Kueche:Autom_elevationMax] > [twilight:elevation] ##Elevation max ##K!\
##Dann eben solarradiation! ist gelegentlich 0 ! Also bei null nicht beachten!\
and ( [WUweather:solarradiation] > [Rolladen_Kueche:Autom_solar] or [WUweather:solarradiation] == 0)\
)({\


Da ich auch in den anderen Bedingungen ins Log schreibe, müsste ja wenn kurzzeitig ein anderer Zweig aktiv wird auch etwas auftauchen. Tut es aber nicht.
Es ist auch reproduzierbar. Wenn ich die Zeit verändere, wird dann immer der DOELSE Zweig angesprungen.

So sieht es im Event-Monitor aus:

2018-05-26 14:15:00 DOIF di_Rolladen_Kueche_Auto cmd_nr: 5
2018-05-26 14:15:00 DOIF di_Rolladen_Kueche_Auto cmd: 5
2018-05-26 14:15:00 DOIF di_Rolladen_Kueche_Auto cmd_event: timer_1
2018-05-26 14:15:00 DOIF di_Rolladen_Kueche_Auto cmd_5


Also auch nichts auffälliges?
Was habe ich bloß wieder angestellt?

Gruß
Bismosa

1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Ellert

Das DOIF verweilt dort nicht, sondern das DOIF wartet auf den nächsten Trigger und wenn die dadurch geprüften Bedingungen unwahr sind, dann wird DOELSE ausgeführt und das natürlich auch, wenn ein Zweig noch wahr ist, aber nicht geprüft wird.

bismosa

Hallo,

dann verstehe ich wohl das Diagramm falsch: https://wiki.fhem.de/wiki/Datei:DOIF_Aufbau_Ablauf_nSVG.png

Kommt also das Ereignis "Zeit" wird das entsprechende DOELSEIF geprüft und da die Bedingung nicht stimmt wird der DOELSE Zweig ausgeführt?
Mist. Also muss ich im DOELSE nochmal alle Bedingungen aufführen damit dies nicht ausgeführt wird? (Also ein DOELSEIF daraus machen)

Ich hatte es so verstanden, das egal welches Ereignis ausgelöst wird alle Bedingungen geprüft werden...und somit es nicht zu diesem verhalten kommen kann.

Ich glaube ich muss einsehen, das eine simple Rolladensteuerung nicht so simpel ist.

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Damian

Zitat von: bismosa am 26 Mai 2018, 17:28:06
Hallo,

dann verstehe ich wohl das Diagramm falsch: https://wiki.fhem.de/wiki/Datei:DOIF_Aufbau_Ablauf_nSVG.png

Kommt also das Ereignis "Zeit" wird das entsprechende DOELSEIF geprüft und da die Bedingung nicht stimmt wird der DOELSE Zweig ausgeführt?
Mist. Also muss ich im DOELSE nochmal alle Bedingungen aufführen damit dies nicht ausgeführt wird? (Also ein DOELSEIF daraus machen)

Ich hatte es so verstanden, das egal welches Ereignis ausgelöst wird alle Bedingungen geprüft werden...und somit es nicht zu diesem verhalten kommen kann.

Ich glaube ich muss einsehen, das eine simple Rolladensteuerung nicht so simpel ist.

Gruß
Bismosa

Das Standard-Verhalten von DOIF kannst du beeinflussen mit: https://fhem.de/commandref_DE.html#DOIF_checkall
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bismosa

Hallo!

Zitat von: Damian am 26 Mai 2018, 17:41:24
Das Standard-Verhalten von DOIF kannst du beeinflussen mit: https://fhem.de/commandref_DE.html#DOIF_checkall
Du hast mir den Tag gerettet! Damit klappt es!
Es gibt ja auch wirklich gar nichts woran nicht gedacht wurde! Vielen vielen Dank für das Modul! Da habe ich noch viel zu lernen...sorry, das ich es nicht selbst in der commandref gefunden habe!

P.S: Die uiTable ist auch der Hammer! Genau danach hatte ich auch schon länger gesucht.

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...