Alle Rollos runter nach Sonnenuntergang

Begonnen von 87insane, 31 Januar 2019, 21:19:52

Vorheriges Thema - Nächstes Thema

87insane

Hi zusammen,

ich weiß es gibt schon viele Threads mit diesem Thema aber ich bekomme gleich einen Nervenzusammenbruch.
Ich nutze das Rollo Modul und dazu habe ich ESPeasy Schalter angebunden. Nun will ich das die Rollos nach dem Sonnenuntergang runter gehen. Wann genau muss ich noch testen. Ist hierfür auch egal.

Jetzt muss ich dem Rollo, da es leider über das Modul nie genau die richtige Position hat, sagen das es erst einmal für Sekunden x (20 z.B.) runter fahren soll. Danach soll es 2 Sekunden warten und dann auf PCT 80 fahren. Habe nun x Varianten ausprobiert aber leider klappt das alles nicht.

Das ist der aktuelle Code:
define sonnenuntergang_rollos DOIF ([{twilight("sonnenuntergang_nv","ss_indoor","17:00","23:00")}])
(set [a-z]?[a-z]_rollo extern open, set [a-z]?[a-z]_rollo pct 100, set [a-z]?[a-z]_rollo pct 80)
DOELSEIF ([00:15])


Was passiert hier? Das DOIF reagiert zu schnell und sendet die Befehle einfach durch. Ich würde aber gerne haben, dass das DOIF erst dann den nächsten Befehl ausführt wenn der vorherige Befehl abgeschlossen ist. Aus Batch Zeiten kenne ich das z.B. noch. Wenn Befehl xy durchgeführt wurde und das erfolgreich, dann mache dies und das. Bei DOS war das && - Gibt es hier auch eine Möglichkeit?

Gruß,
Kai

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

87insane

Hi,

wait ist ja ein fester Wert, geht das nicht auch wenn der Befehl erfolgreich beendet wurde? Mit einem festen Wert wird es wieder komisch durch die unterschiedlichen Fahrtzeiten der Rolladen.

CoolTux

Das kann ich Dir nicht sagen.
Aber ich empfehle den Thread ins DOIF Forum zu verschieben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ellert

Zitat von: 87insane am 31 Januar 2019, 21:28:11
Hi,

wait ist ja ein fester Wert, geht das nicht auch wenn der Befehl erfolgreich beendet wurde? Mit einem festen Wert wird es wieder komisch durch die unterschiedlichen Fahrtzeiten der Rolladen.
Falls das zugehörige Modul ein Event liefert wenn set abgearbeitet ist, dann ist das kein Problem.

Angenommen set Rollo1 open setzt nach erreichen der Position open das Reading position mit Event auf open, dann könnte man es etwa so lösen:

([Rollo1:position] eq "open" and [$SELF:state] =~ "cmd_<x>|initialized") (set Rollo2 open)
DOELSEIF ([Rollo2:position] eq "open" and [$SELF:state] =~ "cmd_1") (set Rollo3 open)
DOELSEIF ([Rollo3:position] eq "open" and [$SELF:state] =~ "cmd_2") (set Rollo4 open)
...
DOELSEIF ([Rollo<x-1>:position] eq "open" and [$SELF:state] =~ "cmd_<x-1>") (set Rollo<x> open)

Voraussetzung zum Starten der Befehlssequenz ist die Ausführung des Befehls set Rollo1 open
Ein set-Befehl gibt in der Regel nichts zurück, siehe https://commandref.fhem.de/commandref_DE.html#set

87insane

Also einiges von deinem code muss ich mir erst zusammen googlen. Da verstehe ich leider noch nicht alles. Aber du hast mich auf eine idee gebracht und vermutlich auch die Lösung damit. Das Set blabla ... Setzt am ende nur einen Schalter um. Dieser hat selber einen timer und meldet am ende zurück, dass er aus ist. Somit kann man das am ende Wohl auch verwerten.

Allerdings weiß ich noch nicht wie ich das Doif solange warten lasse. Hier werde ich auch noch ein wenig lesen müssen. Ist aber kein Problem. Die Idee von dir ist das was ich als Hinweis brauchte. Danke!!!

Gesendet von meinem LG-H850 mit Tapatalk


Ellert

ZitatAllerdings weiß ich noch nicht wie ich das Doif solange warten lasse
Das DOIF wartet solange mit der Ausführung des nächsten Zweiges bis Position<x-1> erreicht ist und triggert, erst dann wird der Befehl set Rollo<x> ausgeführt.

Du kannst auch ([{twilight("sonnenuntergang_nv","ss_indoor","17:00","23:00")}]) mit ein bauen, musst aber die Numerierung von cmd_<n> anpassen.

([{twilight("sonnenuntergang_nv","ss_indoor","17:00","23:00")}])  (set Rollo1 open)
DOELSEIF ([Rollo1:position] eq "open" and [$SELF:state] =~ "cmd_1|initialized") (set Rollo2 open)
DOELSEIF ([Rollo2:position] eq "open" and [$SELF:state] =~ "cmd_2") (set Rollo3 open)
DOELSEIF ([Rollo3:position] eq "open" and [$SELF:state] =~ "cmd_3") (set Rollo4 open)
...
DOELSEIF ([Rollo<x-1>:position] eq "open" and [$SELF:state] =~ "cmd_<x-1>") (set Rollo<x> open)

87insane

Hi,

aktuell läuft es so:
define sonnenuntergang_rollos DOIF ([{twilight("sonnenuntergang_nv","ss_civil","17:00","23:30")}]) \
(set [a-z]?[a-z]_rollo pct 80)\
DOELSEIF ([00:15])


Hatte am WE leider keine Zeit hierfür, da leider noch diverse Handys/Tablets ne neue Firmware geflasht haben wollten....

Folgende Probleme hat diese Lösung bei mir:
- Position der Rollos ungenau. Dies liegt aber am Rollo Modul in Verbindung mit meinen geflashten Sonoff Schaltern. Hier ist je nach Position ein delay (senden/empfangen).
- Eine Reset-Fahrt würde das Problem natürlich lösen aber diese konnte ich noch nicht implementieren.
  Am liebsten würde ich, wie oben schon beschrieben, erst komplett runter fahren und danach auf Position setzen. Aktuell überlege ich, ob ich das ganze nicht als "set" sondern als event
  an den Schalter sende. Auf dem Schalter könnte ich dann einen Timer auslösen und hätte trotz delay die korrekte Position. Als Beispiel mal mein Rollo in der Küche. Dieses empfängt
  immer mit einem großem delay (5-10s) die Info zu schalten. Wenn ich z.B. sende (pct 80) und das Rollo Modul fängt sofort an zu zählen, das Rollo fährt aber noch nicht. Dann
  hat man im Modul 80% stehen und das Rollo ist aber nicht mal 50% geschlossen. Generell muss ich mir hier was überlegen aber habe noch keine perfekte Idee.

Die Sonoff Schalter senden mir natürlich wann ein Schalter an/aus gemacht wird. Allerdings ist der delay halt das Problem. Das Rollo Modul kann meine Idee leider nicht umsetzen aber es ist einer Idee. Ich würde am liebsten immer erst nach einer Fahrt die Position berechnen lassen. Die Idee wäre wie folgt:
FHEM sendet den Befehl fahr auf Position 80%. Nun soll Fhem aber die Zeit, die das Rollo fahren soll als Event an den Schalter senden. Dann würde auf dem Schalter der Timer laufen und nicht in Fhem. Bisher sendet Fhem und sagt start/stop. Ich hoffe ich habe das halbwegs verständlich geschrieben...


Zurück zu diesem Thema........
Deinen Code verstehe ich nicht wirklich. Deine Aussage zu dem Code allerdings schon.
Wenn ich nun mit dem "alten" Gedanken die Rollos steuern würde, müsste ich die Problematik mit einer Reset Fahrt lösen.

Schalter in FHEM: ESPEasy_az_rollo / Rollo Modul Name: az_rollo

1. Also würde ich zuerst alle Rollos (z.B. set ESPEasy_az_rollo event taste_runter#taste_runter) setzen. Das Event kann ich nur über den originalen Schalter senden und nicht über das Modul. Hier wäre der Vorteil, dass ein interner Timer im jeweiligem Schalter durch läuft. Danach sendet ESPEasy_az_rollo ein off, da der Schalter nach Ablauf des Timers aus geht.

2. Jetzt sind alle Rollos komplett zu. Ich mag aber noch ein wenig Licht und deswegen würde ich gerne auf PCT 80. Dies könnte nach erfolgreichem kompletten herunter fahren bzw. nach der Info vom Schalter -> Fhem angetriggert werden. Dafür müsste ich nun aber anstelle von ESPEasy_az_rollo über az_rollo antriggern. Das Modul denkt ja nun auch das Rollo seie unten und deswegen funktioniert die Positionierung auch.

Das hier wird sicher nicht laufen aber so stelle ich mir das ca. vor. Das bezieht sich erstmal nur auf ein Rollo:


define sonnenuntergang_rollos DOIF ([{twilight("sonnenuntergang_nv","ss_civil","17:00","23:30")}])
(set ESPEasy_az_rollo event taste_runter#taste_runter)
...ICH DENKE HIER FEHLT WAS...Etwas wie, warte auf "ESPEasy_az_rollo strom_output_runter: off" im Event Monitor
IF ($EVTPART1 eq "off") {
fhem("set az_rollo pct 80")}
DOELSEIF ([00:15])



Ich hoffe ich konnte zur allgemeinen Verwirrung beitragen und es entsteht ggf. eine Art Diskussion, in der noch bessere Ideen zustande kommen. Das war jetzt mal so runter getippt.

Danke an ALLE!