Hallo,
ich habe eine Homematic Rolladensteuerung sowie Bewegungsmelder in meiner Wohnung.
Nun möchte ich gerne, dass die Rolladen automatisch auf und zu gehen.
Dazu habe ich schon erfolgreich die "sunset" und "sunrise" Funktion genutzt, bspw. "sunset(0,"21:00","23:30")"
Das funktioniert soweit auch.
Folgenden Problem bzw. Szenario möchte ich nun ich lösen.
Die Bewegungsmelder schreiben in eine Datei "motion_wohnung" eine "1" immer wenn eine Bewegung erkannt wurde.
Wird 2 Stunden lang keine Bewegung registriert schreibt eine anderes Script eine "0" in diese Datei. Somit ist scheinbar niemand zu Hause.
Nun möchte ich das die Rolladen runter gehen wenn die Sonne unter geht (im Winter also bspw. gegen 17Uhr oder so), aber NUR wenn niemand zu Hause ist.
Wenn jemand zu Hause ist ("1" in der Datei), dann soll die Rollade erst um 21h runter gehen (Wie oben also angegeben).
Ich weiß nicht so richtig wie ich diese überprüfen machen soll.
Für Tipps wäre ich dankbar!
Danke
Also erstmal würde ich Weg gehen von dieser Datei schreibe rei. Erst aus FHEM in Datei dann von Datei wieder in FHEM von hinten durch die Brust ins Auge. So ein Unsinn.
Es gibt Funktionen um das Alter eines Timestamps zu ermitteln und dann kann man diesen vergleiche. ReadingsAge ist hier ein Suchbegriff für Dich.
Alles was Du brauchst ist ein Event. Das kann zur Not auch ein at sein, aber vielleicht siehst Du da noch eine andere Möglichkeit. Vielleicht beim BW Sensor selber.
Hmm ja, dass mit der Datei ist vll. suboptimal...
Habe mir nun was überlegt.
Mit "at" baue ich einen Hilfsdummy, der "hell" unter "dunkel" als State hat und durch "sunset" und "sunrise" getriggert wird.
Anschließend baue ich mir folgende "at" Befehl, welcher bspw. alle 5 Minuten aufgerufen wird:
IF('keinerZuhause' UND 'dunkel') { Rollos runter }
IF('einerZuahuse' UND 'dunkel') { Dann Rollos erst um 21:00h runter)
Mach das Sinn? Geht es auch anders also regelmäßig alle paar Minuten auf einen Wert zu prüfen?
Also wenn es dunkel ist soll das Rollo runter, aber nur wenn niemand zu Hause ist?
Hier wäre also ein Trigger da. Dunkel. Alles was hier geprüft werden muss ist ob jemand zu Hause ist. Hierzu wird geschaut ob die letzte Bewegung älter wie x ist. Erledigt
Schwieriger ist es wenn jemand zu Hause ist, naja oder auch nicht. Hier kann man auf Bewegung triggern also Bewegungsmelder und kann abfragen ist es 21 Uhr oder später und ist es dunkel draussen. Schlecht ist Natürlich wenn sich eine Stunde keiner bewegt. Eingepennt
Zitat von: CoolTux am 04 September 2017, 21:21:18
Also wenn es dunkel ist soll das Rollo runter, aber nur wenn niemand zu Hause ist?
Hier wäre also ein Trigger da. Dunkel. Alles was hier geprüft werden muss ist ob jemand zu Hause ist. Hierzu wird geschaut ob die letzte Bewegung älter wie x ist. Erledigt
Heist also mit DOIF regeln?
define rollo1 DOIF (([Tageslicht:"dunkel"]) and ([MotionWohnung:"0"]) (set Wz.Rollo off)
Zitat von: CoolTux am 04 September 2017, 21:21:18
Schwieriger ist es wenn jemand zu Hause ist, naja oder auch nicht. Hier kann man auf Bewegung triggern also Bewegungsmelder und kann abfragen ist es 21 Uhr oder später und ist es dunkel draussen. Schlecht ist Natürlich wenn sich eine Stunde keiner bewegt. Eingepennt
Also müsste ich bei jeder Bewegung prüfen ob es hell/dunkel ist?
Also ob nun DOIF oder notify das überlasse ich Dir. Aber wolltest Du nicht eine Abfrage machen ob der BW Sensor schon x Minuten keine Bewegung mehr registriert hast?
Zitat von: CoolTux am 04 September 2017, 21:36:12
Also ob nun DOIF oder notify das überlasse ich Dir. Aber wolltest Du nicht eine Abfrage machen ob der BW Sensor schon x Minuten keine Bewegung mehr registriert hast?
Was wäre denn besser/sinnvoler? DOIF oder NOTIFY?
Ja, diese "X Min keine Bewegung mehr" muss auch noch untergebracht werden...
Das ist Geschmackssache und da rede ich auch keinen rein. Persönlich nehme ich mehr Notify, DOIF nur da wo es mir Sinnvoll erscheint. Ist selten bei mir.
Zitat von: CoolTux am 04 September 2017, 21:49:35
Das ist Geschmackssache und da rede ich auch keinen rein. Persönlich nehme ich mehr Notify, DOIF nur da wo es mir Sinnvoll erscheint. Ist selten bei mir.
Ok :-)
Hmm, möchte jetzt erstmal das Rollo-Hoch Thema machen.
Im Flur habe ich bspw. einen Bewegungsmelder, welche bei Bewegung die Flur-Lampe einschaltet.
Mit einem DOIF "([RPIPin8:"on"]) (set HUEDevice8 on-for-timer 300)"
Wie bekomme ich da ein <UND wenn "hell" DANN Rollo hoch> rein?
Das funktioniert irgendwie nicht... Rollo geht jetzt bei jeder Beewegung hoch auf wenn es "dunkel" ist:
([RPIPin8:"on"]) (set HUEDevice8 on-for-timer 300)
([Tageslicht:"dunkel"]) (set Wz.Rollo_Neben.Tuer on)
In dem du and zweite Bedingung machst und im Ausführungsteil das set Rollo hoch.
Aber du willst ja das wenn es dunkel ist dennoch Licht an geht. DOIF Abfragen werden immer von links nach rechts abgearbeitet. Wenn Du also als erstes Deine jetzige Bedingung machst und als zweites DOELSEIF deine jetzige Bedingung plus and hell wird immer die erste genommen weil sie ja immer war ist.
Also nimmst du als erste Abfrage deine jetzige plus and hell und die 2 Befehle und als nächsten DOELSEIF nur deine jetzige. Das and hell machst Du als nur Abfrage also mit ? davor. Und ganz wichtig do always als Attribut. So wird ein Zustand immer ausgelöst auch wenn er schon aktiv ist.
Zitat von: CoolTux am 04 September 2017, 22:10:43
In dem du and zweite Bedingung machst und im Ausführungsteil das set Rollo hoch.
Aber du willst ja das wenn es dunkel ist dennoch Licht an geht. DOIF Abfragen werden immer von links nach rechts abgearbeitet. Wenn Du also als erstes Deine jetzige Bedingung machst und als zweites DOELSEIF deine jetzige Bedingung plus and hell wird immer die erste genommen weil sie ja immer war ist.
Also nimmst du als erste Abfrage deine jetzige plus and hell und die 2 Befehle und als nächsten DOELSEIF nur deine jetzige. Das and hell machst Du als nur Abfrage also mit ? davor. Und ganz wichtig do always als Attribut. So wird ein Zustand immer ausgelöst auch wenn er schon aktiv ist.
Hmm, denke mir so müsste richtig sein:
([RPIPin8:"on"] and [Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300;set Wz.Rollo_Neben.Tuer on) DOELSEIF([RPIPin8:"on"]) (HUEDevice8 on-for-timer 300)
Aber irgendwie funktioniert das nicht...
EDIT: Hatte das "do always" vergessen, glaube jetzt funzt es! Danke!
Morgen dann Teil2 ;-) Rollos hoch...
Tausche mal ; gegen ,
([RPIPin8:"on"] and [Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300;set Wz.Rollo_Neben.Tuer on) DOELSEIF([RPIPin8:"on"]) (HUEDevice8 on-for-timer 300)
Wenn Du es so machst dann reagiert er auf Tageslicht und auf das Event hell. Aber eigentlich möchtest Du doch Tageslicht nur abfragen, oder?
([RPIPin8:"on"] and [?Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300;set Wz.Rollo_Neben.Tuer on) DOELSEIF([RPIPin8:"on"]) (HUEDevice8 on-for-timer 300)
So sollte es dann besser passen. Ausserdem viel mir die Nacht noch was ein. Dadurch das wir ja nur einen einzigen Trigger haben, Event RPIPin8 on können wir auch mit DOELSE arbeiten
([RPIPin8:"on"] and [?Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300; set Wz.Rollo_Neben.Tuer on) DOELSE (HUEDevice8 on-for-timer 300)
Und als letztes machen wir die Rollos hoch nur wenn es auch vorher nicht oben war
([RPIPin8:"on"] and [?Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300; set Wz.Rollo_Neben.Tuer:FILTER=STATE!=on on) DOELSE (HUEDevice8 on-for-timer 300)
Achtung!!! Voraussetzung das es so geht ist das Du kein eigenes stateFormat verwendest und on oder off auch wirklich im INTERNAL STATE zu finden ist.
So sollte es eigentlich nun gehen. Und natürlich do always!!!
Nun noch eine Anmerkung bezüglich Deiner Rolläden. Du kommst schnell an einen Punkt wo Du Deine Rolläden sehr flexibel bewegen möchtest. Sei es wegen Beschattung oder bei Sturm und Hagel. Bedeutet Du solltest Dir vielleicht doch Gedanken machen ob Du Dir entweder eine flexible myUtils baust oder eines der Rollädenmodule verwendest.
Viel mir so die Nacht ein.
Nun zum runter lassen. Hier brauche ich mal ein paar Infos. Du möchtest die Anwesenheit über Bewegung erkennen. Sollte man erstmal drüber nachdenken ob Du das generell so haben willst, dann bauen wir da erstmal auf oder nur für Deinen Rollofall? Über wie viele BW willst Du die Erkennung feststellen?
Zitat von: Rolfg am 04 September 2017, 23:05:03
Tausche mal ; gegen ,
Sorry, es geht wohl beides wie ich gerade ausprobiert habe. In der Commandref steht Komma als Befehlstrennzeichen. Deswegen dachte ich es könnte daran liegen. Aber ich glaube das ELSE muß DOELSE heißen.
Sorry fürs dazwischen schreiben.
Gruß Rolf
Zitat von: CoolTux am 05 September 2017, 08:31:28
([RPIPin8:"on"] and [Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300;set Wz.Rollo_Neben.Tuer on) DOELSEIF([RPIPin8:"on"]) (HUEDevice8 on-for-timer 300)
Wenn Du es so machst dann reagiert er auf Tageslicht und auf das Event hell. Aber eigentlich möchtest Du doch Tageslicht nur abfragen, oder?
([RPIPin8:"on"] and [?Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300;set Wz.Rollo_Neben.Tuer on) DOELSEIF([RPIPin8:"on"]) (HUEDevice8 on-for-timer 300)
So sollte es dann besser passen. Ausserdem viel mir die Nacht noch was ein. Dadurch das wir ja nur einen einzigen Trigger haben, Event RPIPin8 on können wir auch mit DOELSE arbeiten
([RPIPin8:"on"] and [?Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300; set Wz.Rollo_Neben.Tuer on) DOELSE (HUEDevice8 on-for-timer 300)
Und als letztes machen wir die Rollos hoch nur wenn es auch vorher nicht oben war
([RPIPin8:"on"] and [?Tageslicht] eq "hell") (set HUEDevice8 on-for-timer 300; set Wz.Rollo_Neben.Tuer:FILTER=STATE!=on on) DOELSE (HUEDevice8 on-for-timer 300)
Achtung!!! Voraussetzung das es so geht ist das Du kein eigenes stateFormat verwendest und on oder off auch wirklich im INTERNAL STATE zu finden ist.
So sollte es eigentlich nun gehen. Und natürlich do always!!!
Nun noch eine Anmerkung bezüglich Deiner Rolläden. Du kommst schnell an einen Punkt wo Du Deine Rolläden sehr flexibel bewegen möchtest. Sei es wegen Beschattung oder bei Sturm und Hagel. Bedeutet Du solltest Dir vielleicht doch Gedanken machen ob Du Dir entweder eine flexible myUtils baust oder eines der Rollädenmodule verwendest.
Viel mir so die Nacht ein.
Nun zum runter lassen. Hier brauche ich mal ein paar Infos. Du möchtest die Anwesenheit über Bewegung erkennen. Sollte man erstmal drüber nachdenken ob Du das generell so haben willst, dann bauen wir da erstmal auf oder nur für Deinen Rollofall? Über wie viele BW willst Du die Erkennung feststellen?
Hi, danke für die ausführlichen Tipps. Habe ich soweit auch umgesetzt. Funktioniert nun einwandfrei! :)
Zum runterfahren der Rollos:Ich habe derzeit 2 Bewegungsmelder (Flur und Wohnzimmer). Ich habe mir einen Dummy "LetzteBewegung" angelegt, welche immer die Uhrzeit enthält, in welcher einer der BW eine Bewegung erkannt hat. Dazu mache ich bei jeder Bewegung folgendes:
set LetzteBewegung ".strftime('%Y-%m-%d %H:%M:%S', localtime).
Wenn dieser Wert (also die letzte Bewegung) älter als 2 Stunden ist UND der Status von Tageslicht "dunkel" ist, DANN sollen die Rollos runtergehen.
Hmm, meine Idee wäre jetzt diesen Wert, bspw. alle 5 Minuten, mit der aktuellen Uhrzeit zu vergleichen und dann schauen ob die Differenz größer als 2 Stunden ist. Aber eigentlich muss diese Prüfung ja erst passieren wenn Tageslicht auf "dunkel" gesetzt ist. Wenn es hell ist, wäre die Überprüfung überflüssig, da die dann immer "false" wäre. Gibt es hier eine schönere Lösung? Fällt dir (euch) da was ein?
DANKE
Schaue ich mir morgen an. Schreibe nur damit ich es morgen wiederfinde ;D
Moin
Ich moechte mich ganz kurz einmischen. Ich wuerde Dir vorschlagen, dass Du fuer jeden Aktor ein eigenes DOIF machst. Das explodiert Dir sonst ganz schnell! Und ein weiterer Vorteil ist, dass Du immer nur an einer Stelle suchen musst!
Gruss Christoph
Zitat von: mlrtimbf am 14 September 2017, 19:08:08
Hi, danke für die ausführlichen Tipps. Habe ich soweit auch umgesetzt. Funktioniert nun einwandfrei! :)
Zum runterfahren der Rollos:
Ich habe derzeit 2 Bewegungsmelder (Flur und Wohnzimmer). Ich habe mir einen Dummy "LetzteBewegung" angelegt, welche immer die Uhrzeit enthält, in welcher einer der BW eine Bewegung erkannt hat. Dazu mache ich bei jeder Bewegung folgendes:
set LetzteBewegung ".strftime('%Y-%m-%d %H:%M:%S', localtime).
Wenn dieser Wert (also die letzte Bewegung) älter als 2 Stunden ist UND der Status von Tageslicht "dunkel" ist, DANN sollen die Rollos runtergehen.
Hmm, meine Idee wäre jetzt diesen Wert, bspw. alle 5 Minuten, mit der aktuellen Uhrzeit zu vergleichen und dann schauen ob die Differenz größer als 2 Stunden ist. Aber eigentlich muss diese Prüfung ja erst passieren wenn Tageslicht auf "dunkel" gesetzt ist. Wenn es hell ist, wäre die Überprüfung überflüssig, da die dann immer "false" wäre. Gibt es hier eine schönere Lösung? Fällt dir (euch) da was ein?
DANKE
Ich würde hier lieber mit dem Timestamp vom Reading arbeiten. Daher ist es egal was Du in den Dummy schreibst. Kannst auch motion reinschreiben lassen. Also Bewegung erkannt.
define di_lamp DOIF ([Tageslicht] eq "dunkel" and [?LetzteBewegung:state:sec] < 7200) (set Wz.Rollo_Neben.Tuer:FILTER=STATE!=off off)
Das soll noch nicht alles sein. Will aber den Gedanken nicht verlieren daher schreibe ich das hier schon mal
Zitat von: CoolTux am 15 September 2017, 08:40:33
define di_lamp DOIF ([Tageslicht] eq "dunkel" and [?LetzteBewegung:state:sec] < 7200) (set Wz.Rollo_Neben.Tuer:FILTER=STATE!=off off)
Wenn ich direkt die Readings auslese habe ich aber das "Problem" dass ich mehrere auslesen müsste (pro BW), daher dachte ich mir ein Dummy, welcher von allen BW beschrieben werden kann, würde mehr Sinn machen.
Wann würde dein DOIF ausgeführt werden bzw. wie oft wird dann auf
[?LetzteBewegung:state:sec] < 7200 geprüft?
Hallo,
Ich meinte den Timestamp vom state Reading Deines Dummys. Da er ja von allen anderen BW beschrieben wird.
Im Moment wird das ganze nur einmal ausgelöst wenn Tageslicht auf dunkel geht. Irgendwie fehlt noch ein vernünftiger Event. Im ungünstigsten Fall muss man wohl mit Zeiten arbeiten. Also zwischen 16-23 Uhr.
Die BWs lösen doch sicherlich nicht bei jeder Sekündliche. Bewegung aus, oder? Da gibt es doch Einstellungen das er nach einer Motion Erkennung x min warten soll bis eine neue Bewegung gemeldet wird.
Man könnte nun noch auf Bewegung triggern lassen und Tageslicht abfragen. Wäre auch noch ein Weg.