Problem mit der Rollladensteuerung

Begonnen von Dennis D., 03 Januar 2013, 21:21:02

Vorheriges Thema - Nächstes Thema

Dennis D.

Hallo zusammen,

ich fange gerade an, mich mit Fhem zu beschäftigen und eine Haussteuerung zusammenzustellen. Derzeit versuche ich die Rollladen entsprechend nach Sonnenauf- und Untergang zu steuern. Soweit klappt das mit den bisher angelegten "Dummys" auch (die Aktoren kommen hoffentlich morgen).

Zur Sicherheit möchte ich jedoch, dass der Rollladen der Terrassentür bei Sonnenuntergang bzw. bei erreichten von 22 Uhr NUR dann geschlossen wird, wenn der Fenstergriffsensor "geschlossen" meldet, andernfalls soll der Rollladen offen bleiben. Dies soll verhindern, dass man im Sommer draußen sitzt und man plötzlich ausgeschlossen wird. Habe Null Plan von Perl und habe aus anderen Code-Schnipseln versucht was abzuleiten. Naja, dass ich jjetzt hier um Hilfe bitte sagt alles ;). Hier mal wie es aktuell aussieht:

define EZ_Jalousie_runter at *{ if ("$value{EZ_Fensterdrehgriff}" eq "geschlossen") && "sunset ("HORIZON=-3",0,"17:00","22:00")" { fhem ("set EZ_Jalousie zu")}}


Richtig klasse wäre, wenn sich der Rollladen dann noch schließen würde, wenn man nach Sonnenuntergang dann wieder ins Haus geht und das Fenster schließt, also der Fensterdrehgriff meldet, dass das Fenster geschlossen ist. Vielleicht sogar mit Zeitverzögerung von drei Minuten.

Sind meine Ansprche da zu hoch, oder lässt sich das realisieren. Hat jemand von euch ne Idee, wie der Code da auszusehen hat?

Viele Grüße
Dennis
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

MisterEltako

Hi!

Die Abfrage des Fenstergriffs kann man mit "notify" lösen.

define n_Fenstergriff notify EZ_Fenstergriff {\
       if ("$value("EZ_Fenstergriff")" eq "geschlossen") {\
          fhem("set EZ_Jalousie zu");;}}


MfG, MisterEltko
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Dennis D.

Hmm,

entspricht ja ungefähr dem Teil, den ich in meinem Code drin habe (bis auf meinen eventuellen Syntaxfehler mit den Klammern)

if ("$value{EZ_Fensterdrehgriff}" eq "geschlossen")

Wenn ich das richtig interpretiere, würden damit die Rollladen aber generell runterfahren, wenn das Fenster geschlossen wird. Also auch Tagsüber. Wie kann ich denn den obigen Syntax mit dem Sunset-Syntax in einer UND-Bedingung verknüpfen?

Viele Grüße,
spunky78
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

kossmann

Grundsätzlich würde ich nicht auf "geschlossen" prüfen, sondern auf "nicht offen" - wenn die Tür geklappt ist, darf das Rollo ja ruhig nach unten fahren. Bei mir sieht´s wie folgt aus:

define Job_Wohnzimmer_RolloBalkon_runter2 at *23:15 { if ( !(Value("Wohnzimmer_Balkontuer") eq "open") ) { fhem("set Wohnzimmer_RolloBalkon unten");; } }
Das automatische Herunterfahren nach dem Schließen ist eine gute Idee, die ich selbst noch nicht implementiert habe. Das Problem hierbei hast du schon erkannt - man muss die Uhrzeit beachten, ansonsten fährt das Rollo auch tagsüber nach unten.

Das Beispiel von MisterEltako müsste man entsprechend erweitern, z.B. ganz simpel mittels negiertem isday(), was dazu führt, dass das ganze nur nach Sonnenuntergang greift:

define n_Fenstergriff notify EZ_Fenstergriff {\
  if ("$value("EZ_Fenstergriff")" eq "geschlossen" && !(isday())) {\
  fhem("set EZ_Jalousie zu");;}}

Das ganze ist ungetestet, aber grundsätzlich wird in Perl eine Und-Verknüpfung mittels && gemacht.

Man kann auch die aktuelle Uhrzeit mit einfließen lassen:

# zwischen Sonnenuntergang und 22 Uhr einschalten, falls jemand kommt

define Job_Wohnzimmer_Weihnachtslicht_Abends1 notify (Anwesenheit_Nicole:on|Anwesenheit_Tino:on) { \
  my ($sec,$min,$hour,$heutetag,$heutemonat,$heutejahr,$wday,$yday,$isdst) = localtime(time);; \
  if ( !(isday()) && $hour<22 && $hour>15 ) { \
    if ( Value("Wohnzimmer_FunkSteckdose1") eq "off" ) { \
      fhem("set Wohnzimmer_FunkSteckdose1 on");; \
    } \
    if ( Value("Wohnzimmer_FunkSteckdose2") eq "off" ) { \
      fhem("set Wohnzimmer_FunkSteckdose2 on");; \
    } \
    if ( Value("Wohnzimmer_FunkSteckdose3") eq "off" ) { \
      fhem("set Wohnzimmer_FunkSteckdose3 on");; \
    } \
  } \
}

Dennis D.

Zitat von: kossmann schrieb am Fr, 04 Januar 2013 09:52Grundsätzlich würde ich nicht auf "geschlossen" prüfen, sondern auf "nicht offen" - wenn die Tür geklappt ist, darf das Rollo ja ruhig nach unten fahren. Bei mir sieht´s wie folgt aus:

define Job_Wohnzimmer_RolloBalkon_runter2 at *23:15 { [b]if ( !(Value("Wohnzimmer_Balkontuer") eq "open"[/b]) ) { fhem("set Wohnzimmer_RolloBalkon unten");; } }

Fragt er so nicht ab ob offen ist und fährt dann das Rollo runter? Müsste es nicht if ( !(Value("Wohnzimmer_Balkontuer") [b]ne[/b] "open" lauten?

Vielen Dank schon mal für die Vorschläge! Habe da mal versucht was draus zu basteln. Würde das so funktionieren?


# Wenn Fenstergriff geschlossen UND Sonnenuntergang, dann fahr das Rollo runter, jedoch nicht vor 17 Uhr und spätestens um 22
# Uhr, andernfalls schließe das Rollo, wenn der Fenstergriff geschlossen wird UND es nach 22 Uhr ist.

define EZ_Jalousie_runter at *{\
my ($sec,$min,$hour,$heutetag,$heutemonat,$heutejahr,$wday,$yday,$isdst) = localtime(time);; \
if ("$value("EZ_Fensterdrehgriff")" eq "geschlossen")\
&& "sunset ("HORIZON=-3",0,"17:00","22:00")" { fhem ("set EZ_Jalousie zu");;}\
elsif ("$value("EZ_Fensterdrehgriff")" eq "geschlossen") && $hour>22 { fhem ("set EZ_Jalousie zu");;}


FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

MisterEltako

Dann hast du aber nicht deinen zusätzlichen Wunsch nach einem Schliessen der Jalousie bei schliessen des Fenstergriffes erfüllt. Das "at"-Kommando wird ja nur einmal zu einer bestimmten Zeit abgefragt. Deswegen mein o.g. Vorschlag mit "notify"', welches bei jeder ausgeführten Bewegung des Fenstergriffes kontrolliert als Zusatz zu deinen eigenen Definitionen über "at" gedacht.

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

kossmann

Mit ne (not equal) könnte man genauso abfragen, richtig - dann muss das ! am Anfang aber weg - dieses negiert den kompletten Ausdruck (hier in Klammern dahinter). Du fragst hier "ist NICHT (Status NICHT offen)", ich frage "ist NICHT (Status GLEICH offen)" ;-)

Mit einem at * (ohne Uhrzeit dahinter) habe ich noch nicht gearbeitet - führt dies dazu, dass der Code jede Minute ausgeführt wird oder vielleicht sogar jede Sekunde (auweia)?

Dann fällt mir noch && sunset auf. Liefert sunset() nicht eine Uhrzeit zurück? Diese würde in einer IF-Abfrage wahrscheinlich immer als wahr interpretiert, da sie ungleich 0 ist. In Verbindung mit && wäre der gesamte Ausdruck immer wahr und den elsif-Block könnte man sich sparen.

Das ganze wird man wahrscheinlich trennen müssen, ich lasse mich hier aber gerne eines besseren belehren. Ein at-Job um die Rollo "normal" herunter zu fahren, also z.B. nach Sonnenuntergang, wenn die Tür nicht offen sein sollte. Und dann ein notify-Job, welcher beim Schließen oder Kippen der Tür prüft, ob kein Tag mehr ist (bzw. ob eine gewisse Uhrzeit schon erreicht ist) und dann das Rollo herunter fährt.

Erweitern könnte man das ganze natürlich noch um einen weiteren notify-Job, welcher beim Öffnen der Tür das Rollo nach oben fährt (egal zu welcher Uhrzeit) - wenn dies individuell Sinn ergibt (eine offene Tür bei komplett geschlossenen Rollos macht selten Sinn).

kossmann

Vergiss "Diese würde in einer IF-Abfrage wahrscheinlich immer als wahr interpretiert, da sie ungleich 0 ist. In Verbindung mit && wäre der gesamte Ausdruck immer wahr und den elsif-Block könnte man sich sparen."

Das ist natürlich Quatsch von mir, dies wäre bei ODER der Fall.

Warum kann man seinen eigenen Beitrag nicht editieren?

Dennis D.

Puhh! Gar nicht so einfach wenn man mit Perl bei Null einsteigt. Komme mir gerade vor, als versuche ich in Italien ne Pizza auf japanisch zu bestellen.

Also kann man das auch mit zwei Jobs realisieren? Ich dachte ich müsste das alles in einen packen. Habe das bisher so verstanden, dass ein "define" String ein abgeschlossener Befehl ist und wenn ich einen define at job für die Helligkeit und einen define notify job für den Türgriff habe, dass dann erst der define at Job ausgeführt wird und anschließend der notify job, was halt dazu führen würde, dass die Rollladen dennoch runterfahren. Gehe ich Recht in der Annahme, dass mein bisheriges Verständnis falsch ist, dass die Jobs ähnlich einer Batch abgearbeitet werden?
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

kossmann

at und notify sind zwei völlig unterschiedliche Schuhe.

Ein at-Job läuft zu bestimmten Uhrzeiten ab, quasi wie der Wecker, der dich morgens aus dem Schlaf reißt oder die Tagesschau, die immer um 20 Uhr kommt. Diese können zu festen Uhrzeiten definiert werden, zu bestimmten Ereignissen durch Nutzung externer Funktionen (z.B. sunset()) oder auch in bestimmten Abständen zur aktuellen Zeit, z.B. in 5 Minuten (mit + vorweg). Mittels vorangestelltem * lässt sich der Job endlos wiederholen, also z.B. jeden Tag um 20 Uhr.

Man wird sich mehr oder weniger beliebig viele at-Jobs zu unterschiedlichen Zeiten definieren können, die grundsätzlich das selbe machen, aber eventuell andere Faktoren berücksichtigen - sie müssen nur anderes heißen. Also z.B.

Beleuchtung_an1 um 6 Uhr wenn jemand zu Hause und ein Werktag ist
Beleuchtung_an2 um 18 Uhr wenn jemand zu Hause ist

Wenn du um 18 Uhr mehrere Dinge gleichzeitig machst, kannst du (musst aber nicht) dies in einen Job packen, z.B. alle Rollos schließen.

Ein notify-Job hingegen läuft nicht zu festgelegten Zeiten, sondern lauscht im Hintergrund auf eintretende Ereignisse, z.B. die Statusänderung der Tür. Hier kann man z.B. festlegen, was passieren soll, wenn sich der Status der Tür auf "closed" ändert.

Puschel74

Hallo,

vom Prinzip, und damit es funktioniert, musst du 2 Definintionen machen.

Du musst einmal bei Sonnenuntergang prüfen ob die Tür nicht offen ist, dann die Rollo
runter fahren und
Du musst beim schliessen der Tür prüfen ob nach Sonnenuntergang.

Ersteres greift, sinnigerweise, erst wenn die Sonne untergeht und das zweite greift
bei jedem schliessen der Tür.
Da aber in beiden Abfragen beide Ergebnisse geprüft werden hast du das was du wolltest ;-)

 d.h. du brauchst einmal ein

define Rollo_runter1 at *{sunset(HORIZON,'17:00','22:00')} trigger Rollo_runter_prüf zu
und du brauchst ein

define Rollo_runter2 notify EZ_Fenstergriff:.zu* trigger Rollo_runter_prüf zu #(oder was auch immer der sendet wenn die Tür geschlossen wird)

define Rollo_runter_prüfen notify Rollo_runter_prüf:.zu* {
my $now=sprintf("%%02d:%%02d",$hour,$min);
my $Griff =ReadingsVal("EZ_Fenstergriff","State","offen");
if($now >= "17:00" && $now <="22:00" && $Griff eq "zu") {
fhem ("set Rollo zufahren");
}
if($now > "22:00" && $Griff eq "zu") {
fhem ("set Rollo zufahren");
}
}

Da der Code einmal durch das at und einmal durch ein notify getriggert wird habe ich auch
eine Abfrage >22:00 Uhr eingebaut.
dür die Zeit zwischen 00:00 uhr und Sonnenaufgang kann man ja ähnlich verfahren und dir Uhrzeit
anpassen.
Da ich nicht weiß wie die Geräte wann was senden sind natürlich Stellen im Code an die Gegebenheiten
vor Ort an zu passen.

ACHTUNG!! Ungetest und ohne Gewähr auf Funktionsfähigkeit da NICHT getest und nur aus dem Kopf.
Ich bin mir sicher das man das auch eleganter lösen kann und vor allem auch richtig lösen kann.
Aber so (kompliziert) würde ich mal ran gehen.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Puschel74

Hallo,

und schon einen Fehler drinnen.

Sonnenuntergang zb 19 Uhr und Griff offen.
Beim schliessen des Griffs nach 17 Uhr wird die Rollo runter gefahren obwohl noch kein
Sunset.
Mist.
Erst nochmal nachdenken dann posten - sry.
Zwischen 17 und 22 Uhr sollte man noch prüfen ob Sunset bereits vorbei und dann erst Rollo runter.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

kossmann


Dennis D.

War ja ausm Kop und ohne Gewähr ;)

Auf jeden Fall schon mal vielen Dank an alle für die tolle Anlaufunterstützung. So langsam fügen sich ein paar Puzzle-Teile zusammen. Ich versuche mich mal weiter. Überweitere Tipps und Vorschläge bin ich natürlich dankbar.  Klasse, alle Komponenten werden heute geliefert - bis auf das HMLAN. :(
FHEM 5.5 auf RPi Rev. B 512 mit HMLAN (HM-CFG-LAN)

CUL_HM: HM-LC-Bl1PBU-FM,HM-LC-SW1-BA-PCB,HM-LC-SW4-SM,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-PB-2-WM55,HM-RC-KEY3-B,HM-SEC-KEY,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SD,HM-WDS10-TH-O,HM-WDS40-TH-I

OWDevice: DS18B20,DS2438

Puschel74

Hallo,

jep. Oder so.
Man sollte vorher den gesamten Beitrag lesen und nicht den einen oder
anderen auslassen ;-)

define Rollo_runter_prüfen notify Rollo_runter_prüf:.zu* {
my $now=sprintf("%%02d:%%02d",$hour,$min);
my $Griff =ReadingsVal("EZ_Fenstergriff","State","offen");
if($now >= "17:00" && $now <="22:00" && $Griff eq "zu") {
if !(isday()) {
fhem ("set Rollo zufahren");
}
}
if($now > "22:00" && $Griff eq "zu") {
fhem ("set Rollo zufahren");
}
}

Dann sollte das so besser passen - ob des fehlerhaften Syntax bitte nicht schlagen ;-)
Aber zum Aufbauen sollte es reichen.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.