Hauptmenü

cmdpause vorzeitig beenden

Begonnen von bismosa, 06 September 2018, 20:58:10

Vorheriges Thema - Nächstes Thema

bismosa

Hallo,

ich bastel schon wieder an meiner Rolladensteuerung. (Ich glaube ich denke hier viel zu kompliziert...)

##1 Zeitsteuerung vor allen anderen: Wenn schließzeit früher, wird die Bedingung sonst nicht wahr!
([Rolladen_TEST:Autom_zu] eq "Ja"
and [di_Einst_Rolladen:Schliessen_aktiv] eq "Ja" ##Alle An/Aus
and [[Rolladen_TEST:Autom_zu_zeit]|012345678]
and [Rolladen_TEST:Autom_zu_sonne] eq "Nein"
)({
Rollo_Zu("Zeit", "Rolladen_TEST", "Fenster_EG_Buero", "di_Rolladen_TEST_Auto");
})

##2 Zeitsteuerung nach Dämmerung
DOELSEIF
([Rolladen_TEST:Autom_zu] eq "Ja"
and [di_Einst_Rolladen:Schliessen_aktiv] eq "Ja" ##Alle An/Aus
and [Rolladen_TEST:Autom_zu_sonne] eq "Ja"
and [([twilight:ss_weather]+[Rolladen_TEST:Autom_zu_sonne_offset]*60)|012345678]
)({
Rollo_Zu("Sonne", "Rolladen_TEST", "Fenster_EG_Buero", "di_Rolladen_TEST_Auto");
})

##3 Dämmerung 1
DOELSEIF ([di_Einst_Rolladen:Autom_aktiv] eq "Ja" ##Alle An/Aus
and [Rolladen_TEST:Autom_aktiv] eq "Ja" ##Dieser Rolladen aktiv
and [[Rolladen_TEST:Autom_von]-[Rolladen_TEST:Autom_bis]] ##Zeitraum
and [wetter_syke:temperature] >= [Rolladen_TEST:Autom_tempAussen] ##Temperatur Außen
and [Max_WT_Wohnzimmer:temperature] >= [Rolladen_TEST:Autom_tempInnen] ##Temperatur Innen
and [Rolladen_TEST:Autom_azimutMin] < [twilight:azimuth] ##Azimuth min
and [Rolladen_TEST:Autom_azimutMax] > [twilight:azimuth] ##Azimut max
and [Rolladen_TEST:Autom_elevationMin] < [twilight:elevation] ##Elevation min ##K!
and [Rolladen_TEST:Autom_elevationMax] > [twilight:elevation] ##Elevation max ##K!
and ([di_Einst_Rolladen:Licht_aktiv] eq "Nein" or [Rolladen_TEST:solar_state] eq "1") ##1 = Hell
)({
Rollo_Sonnenschutz("Rolladen_TEST", "Fenster_EG_Buero", "di_Rolladen_TEST_Auto");
})

##4 Ausgeschaltet -> Nix mehr machen!
DOELSEIF ([Rolladen_TEST:Autom_aktiv] eq "Nein"
or [di_Einst_Rolladen:Autom_aktiv] eq "Nein" ##Alle An/Aus
)({
my $RolloDevice="Rolladen_TEST";
my $Log="$RolloDevice [4] abgeschaltet";
fhem("setReading $SELF Logtxt '$Log'");
})

##5 Wenn keine Bedingung war ist, zurücksetzen!
DOELSE ({
Rollo_Hoch("Rolladen_TEST", "Fenster_EG_Buero", "di_Rolladen_TEST_Auto");
})



attr di_Rolladen_TEST_Auto checkall all
attr di_Rolladen_TEST_Auto cmdpause 900:900:900:900:300


Soweit lief es bisher "fast" problemlos. Gestern bin ich dann doch auf ein Problem gestossen.
Um 19:28Uhr ist der DOELSE-Zweig aktiv geworden, da es draußen dunkel wurde. Der Timer für das Schließen (cmd 1) ist aber eigentlich um 19.30Uhr eingetreten. Da ich cmdpause benutze, konnte in dem Moment der Zweig nicht aktiv werden und wurde ignoriert.
Da ich bei "Rollo_Hoch"in der myutils prüfe, ob die Zeit bis zum schließen nicht zu knapp ist, könnte ich gut ein "cancel cmdpause" gebrauchen. Gibt es da eine Möglichkeit? Ich hatte u.a. schon probiert, ob ich nicht manuell in ein weiteren Zweig ohne cmdpause springen könnte "set di_Rolladen_TEST_Auto cmd_x" aber das wird während der cmdpause ebenfalls ignoriert. Lässt sich da vielleicht ein interner Timer löschen?

Wenn gewünscht kann ich auch gerne den Code aus der myUtils hier veröffentlichen. Aber das hat mit dem eigentlichen Problem nichts zu tun.

Vielen Dank!

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

Ohne die Logik verstanden zu haben, würde ich zwei Zweige (mit/ohne pause) gegeneinander verriegeln.

...
DOELSEIF (<Bedingung> and [$SELF:pause]) (<Befehle>)
DOELSEIF (<Bedingung> and ![$SELF:pause]) (<Befehle>)
...

und
cmdpause ...:900:0:...

bismosa

Hallo,

danke für den Tipp! Leider passt es glaube ich nicht ganz.
Zur Logik:
Wenn cmd_3 (Dämmerung 1) ausgeführt wird, wird in der myUtils über die Funktion "Rollo_Sonnenschutz("Rolladen_TEST", "Fenster_EG_Buero", "di_Rolladen_TEST_Auto");" gepüft, ob
- Der Rolladen bereits in der richtigen Position ist
- Ein Timer für das automatische herunterfahren aktiviert ist und die Zeit bis zum herunterfahren nicht zu kurz ist
- Alternativ ob nach Sonnenstand mit einem Offset die Rolläden geschlossen werden sollen und hier die Zeit nicht zu kurz ist
-> Tritt einer dieser Fälle ein, braucht keine Verzögerung laufen.

Also weiß ich erst bei Ausführung des Codes in der myUtils ob eine Verzögerung notwendig ist.

Dazu habe ich jetzt spontan drei Ideen:
1.) Ich entferne die cmdpause komplett. Dies soll hauptsächlich dazu dienen ein ständiges hin- und herfahren zu blocken. Statt dessen setze ich - sobald ein Rolladen gefahren wurde - von der myUtils aus das DOIF komplett aus ("set di_Rolladen_TEST_Auto disabled") und schalte es nach der "Sperrzeit" wieder aktiv. ("fhem("sleep 900; set di_Rolladen_TEST_Auto enabled")). Alternativ geht es sicherlich auch mit einem temporären at...
Dann hätte ich die Wartezeiten vielleicht besser im Griff.
Nachteil: Wird z.B. Zweig 3 aktiv und in der myUtils deaktivere ich das DOIF für 15Min wird nach den 15Min wieder der Zweig aktiv und ich muss es erneut für 15Min deaktiveren...also ein ständiges laufen der Scripte...

2.) Ich übernehme die "Logik" aus der myUtils ins DOIF. Eigentlich ja das, was Ellert vorgeschlagen hat. Dann wird der Zweig aber recht kompliziert.
Ungetestet...bin gerade unterwegs und mein System nicht zur Verfügung. Auch der Part der Zeitprüfung ist garantiert falsch!

DOELSEIF ([di_Einst_Rolladen:Autom_aktiv] eq "Ja" ##Alle An/Aus
and [Rolladen_TEST:Autom_aktiv] eq "Ja" ##Dieser Rolladen aktiv
and [[Rolladen_TEST:Autom_von]-[Rolladen_TEST:Autom_bis]] ##Zeitraum
and [wetter_syke:temperature] >= [Rolladen_TEST:Autom_tempAussen] ##Temperatur Außen
and [Max_WT_Wohnzimmer:temperature] >= [Rolladen_TEST:Autom_tempInnen] ##Temperatur Innen
and [Rolladen_TEST:Autom_azimutMin] < [twilight:azimuth] ##Azimuth min
and [Rolladen_TEST:Autom_azimutMax] > [twilight:azimuth] ##Azimut max
and [Rolladen_TEST:Autom_elevationMin] < [twilight:elevation] ##Elevation min ##K!
and [Rolladen_TEST:Autom_elevationMax] > [twilight:elevation] ##Elevation max ##K!
and ([di_Einst_Rolladen:Licht_aktiv] eq "Nein" or [Rolladen_TEST:solar_state] eq "1") ##1 = Hell
and (
(
[Rolladen_TEST:Autom_zu] eq "Ja"
and [Rolladen_TEST:Autom_zu_sonne] eq "Nein"
and [di_Einst_Rolladen:Schliessen_aktiv] eq "Ja"
and [Rolladen_TEST:Autom_zu_zeit] - [now] lt 1800 #Syntax garantiert falsch...
)
or
(
[Rolladen_TEST:Autom_zu] eq "Ja"
and [Rolladen_TEST:Autom_zu_sonne] eq "Ja"
and [di_Einst_Rolladen:Schliessen_aktiv] eq "Ja"
and [Rolladen_TEST:Autom_zu_sonne] eq "Ja"
and [([twilight:ss_weather]+[Rolladen_TEST:Autom_zu_sonne_offset]*60)|012345678]
and [Rolladen_TEST:Autom_zu_zeit] - [now] lt 1800 #Syntax garantiert falsch...
)
)

Also wenn die Zeit zu knapp ist in den ersten Teil ohne cmdpause springen, sonst in diesen:

DOELSEIF ([di_Einst_Rolladen:Autom_aktiv] eq "Ja" ##Alle An/Aus
and [Rolladen_TEST:Autom_aktiv] eq "Ja" ##Dieser Rolladen aktiv
and [[Rolladen_TEST:Autom_von]-[Rolladen_TEST:Autom_bis]] ##Zeitraum
and [wetter_syke:temperature] >= [Rolladen_TEST:Autom_tempAussen] ##Temperatur Außen
and [Max_WT_Wohnzimmer:temperature] >= [Rolladen_TEST:Autom_tempInnen] ##Temperatur Innen
and [Rolladen_TEST:Autom_azimutMin] < [twilight:azimuth] ##Azimuth min
and [Rolladen_TEST:Autom_azimutMax] > [twilight:azimuth] ##Azimut max
and [Rolladen_TEST:Autom_elevationMin] < [twilight:elevation] ##Elevation min ##K!
and [Rolladen_TEST:Autom_elevationMax] > [twilight:elevation] ##Elevation max ##K!
and ([di_Einst_Rolladen:Licht_aktiv] eq "Nein" or [Rolladen_TEST:solar_state] eq "1") ##1 = Hell


Macht die Sache irgendwie noch komplizierter.

3.)
Ich mache ein eigenes DOIF für die Logik des Schließens nach Uhrzeit. Dann bin ich nicht mehr von den Wechselwirkungen der Zeitschaltung betroffen. Ich könnte jedoch weiterhin in der myUtils das Fahren blocken, wenn bereits die Rolläden geschlossen sind. Also in meinem Fall 9 weitere DOIFs...

Fazit:
Ich muss da nochmal drüber nachdenken. Variante 2 schließe ich mal aus. Das geht mir dann irgendwie zu weit.
Variante 1 finde ich ganz gut. Allerdings wird dann auch das System mehr strapaziert. Also doch Variante 3?

Danke!

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, ...