Das Thema scheint eigentlich nicht aufwendig zu sein, da ja die meisten KNX-Elemente eine Tag/Nacht-Umschaltung mitbringen. In der Realität ist das schön, hat mich aber nicht ganz befriedigt, deshalb habe ich viel probiert. Mal mit den Rollläden, mal mit der universellen Zeitschaltuhr usw. Inzwischen bin ich aber sehr zufrieden und hoffe, dass vielleicht andere das für sich als Inspiration nutzen können.
Aus meiner Sicht, muss man erst einmal auf die Idee kommen zwischen verscheidenen Dingen zu unterscheiden. Was ist mit meiner Beleuchtung, was mit der Helligkeit der Bedienelemente. In welchem Szenario soll denn das Licht überhaupt abgedunkelt werden? Und so habe ich das gemacht:
Die Bedienelemente werden an Hand des im Raum befindlichen Präsenzmelders abgedunkelt. Ist eine Helligkeitsschwelle unterschritten werden die dunkler und entsprechend dann wieder heller, wenn es auch im Raum heller ist. Das ist der einfach Teil.
Das Licht in den Räumen ist komplizierter, denn es sollte ja mitten in der Nacht, wenn man schlafen will und mal kurz raus muss, trotzdem das Licht angehen, aber eben nicht zu hell sein. Genauso ist es spät abends unangenehm, wenn das Licht in voller Helligkeit scheint. Und so habe ich mir eine selbstlernende Logik gebastelt und das Ganze an Alexa angebunden. Ist es mir Abends schon zu dunkel, sage ich "deaktivere Nachtmodus" und ist es mir spät zu hell sage ich "aktiviere Nachtmodus". Das Gleich mache ich am Morgen mit dem Tagmodus - vorausgesetzt die Werte passen mir so nicht.
Voreingestellt ist, dass die durchschnittlichen Werte für 4 Wochen pro Wochentag gespeichert werden. Hier meine Logik:
Hier die Items:
Damit das Ganze funktioniert müssen die 2 Items (Nachtmodus_an und Tachtmodus_an) in der Logik noch getriggert werden. Außerdem der Cycle auf 60 Sekunden gesetzt werden.
Der letzte Punkt ist noch die Lichtfarbe, wenn man mehrfarbige LED-Strips oder sowas benutzt. Da benutze ich in der Tat die universelle Zeitschaltuhr, also eine fixe Zeit.
Aus meiner Sicht, muss man erst einmal auf die Idee kommen zwischen verscheidenen Dingen zu unterscheiden. Was ist mit meiner Beleuchtung, was mit der Helligkeit der Bedienelemente. In welchem Szenario soll denn das Licht überhaupt abgedunkelt werden? Und so habe ich das gemacht:
Die Bedienelemente werden an Hand des im Raum befindlichen Präsenzmelders abgedunkelt. Ist eine Helligkeitsschwelle unterschritten werden die dunkler und entsprechend dann wieder heller, wenn es auch im Raum heller ist. Das ist der einfach Teil.
Das Licht in den Räumen ist komplizierter, denn es sollte ja mitten in der Nacht, wenn man schlafen will und mal kurz raus muss, trotzdem das Licht angehen, aber eben nicht zu hell sein. Genauso ist es spät abends unangenehm, wenn das Licht in voller Helligkeit scheint. Und so habe ich mir eine selbstlernende Logik gebastelt und das Ganze an Alexa angebunden. Ist es mir Abends schon zu dunkel, sage ich "deaktivere Nachtmodus" und ist es mir spät zu hell sage ich "aktiviere Nachtmodus". Das Gleich mache ich am Morgen mit dem Tagmodus - vorausgesetzt die Werte passen mir so nicht.
Voreingestellt ist, dass die durchschnittlichen Werte für 4 Wochen pro Wochentag gespeichert werden. Hier meine Logik:
Code:
#!/usr/bin/env python3 # nachtmodus_licht.py WERTELISTE_WERT = 0 WERTELISTE_WOCHENTAG = 1 WERTELISTE_TAGESMINUTE = 2 # ca. 28 Tage WerteListe_Limit = 28 # Items laden WerteListe = [] MittelwertAnListe = [] MittelwertAusListe = [] WerteListe = sh.Zentral.Nachtmodus.Licht.Werte() MittelwertAnListe = sh.Zentral.Nachtmodus.Licht.Mittelwert_an() MittelwertAusListe = sh.Zentral.Nachtmodus.Licht.Mittelwert_aus() # wenn Liste nicht 7 Tage enhthält, dann initialisieren if len(MittelwertAnListe) != 7: # Standard = 00:00 Uhr MittelwertAnListe = [0, 0, 0, 0, 0, 0, 0] if len(MittelwertAusListe) != 7: # Standard = 9:00 Uhr MittelwertAusListe = [540, 540, 540, 540, 540, 540, 540] # Zeit ermitteln jetzt = sh.now() tagesminute = jetzt.hour * 60 + jetzt.minute tag = jetzt.isoweekday() # Tag/Nacht-Umschaltung speichern # Nachtmodus durch Alexa oder manuell if trigger['source'] == sh.Zentral.Nachtmodus.Licht.Nachtmodus_an.id() or trigger['source'] == sh.Zentral.Nachtmodus.Licht.Tagmodus_an.id(): # aktuellen Satus in Werteliste schreiben if trigger['source'] == sh.Zentral.Nachtmodus.Licht.Nachtmodus_an.id() and sh.Zentral.Nachtmodus.Licht.Nachtmodus_an() == True: WerteListe.append([True, tag, tagesminute]) elif trigger['source'] == sh.Zentral.Nachtmodus.Licht.Tagmodus_an.id() and sh.Zentral.Nachtmodus.Licht.Tagmodus_an() == True: WerteListe.append([False, tag, tagesminute]) # Werteliste kürzen, wenn nötig while len(WerteListe) > WerteListe_Limit * 2: Werteliste.pop(0) sh.Zentral.Nachtmodus.Licht.Werte(WerteListe) # Mittelwerte aus Liste ermitteln # separat pro Wochentag if len(WerteListe) > 0: for wochentag in range(1, 7): mittelwert_an = 0 mittelwert_aus = 0 anzahl_an = 0 anzahl_aus = 0 for event in WerteListe: if event[WERTELISTE_WOCHENTAG] == wochentag: if event[WERTELISTE_WERT] == True: mittelwert_an = mittelwert_an + event[WERTELISTE_TAGESMINUTE] anzahl_an = anzahl_an + 1 else: mittelwert_aus = mittelwert_aus + event[WERTELISTE_TAGESMINUTE] anzahl_aus = anzahl_aus + 1 if anzahl_an > 0: mittelwert_an = int(mittelwert_an / anzahl_an) MittelwertAnListe[wochentag-1] = mittelwert_an if anzahl_aus > 0: mittelwert_aus = int(mittelwert_aus / anzahl_aus) MittelwertAusListe[wochentag-1] = mittelwert_aus sh.Zentral.Nachtmodus.Licht.Mittelwert_an(MittelwertAnListe) sh.Zentral.Nachtmodus.Licht.Mittelwert_aus(MittelwertAusListe) # Nachtmodus automatisch setzen elif trigger['source'] == 'cycle': mittelwert_an = 0 mittelwert_aus = 0 anzahl_an = 0 anzahl_aus = 0 for wochentag in range(1, 7): if MittelwertAnListe[wochentag] > -1: mittelwert_an = mittelwert_an + MittelwertAnListe[wochentag] anzahl_an = anzahl_an + 1 if MittelwertAusListe[wochentag] > -1: mittelwert_aus = mittelwert_aus + MittelwertAusListe[wochentag] anzahl_aus = anzahl_aus + 1 if anzahl_an == 7: mittelwert_an = MittelwertAnListe[tag-1] elif anzahl_an > 0: mittelwert_an = int(mittelwert_an / anzahl_an) if anzahl_aus == 7: mittelwert_aus = MittelwertAusListe[tag-1] elif anzahl_aus > 0: mittelwert_aus = int(mittelwert_aus / anzahl_aus) Nachtmodus_Licht = sh.Zentral.Nachtmodus.Licht() if anzahl_an > 0 and tagesminute == mittelwert_an and not Nachtmodus_Licht: sh.Zentral.Nachtmodus.Licht(True) if anzahl_aus > 0 and tagesminute == mittelwert_aus and Nachtmodus_Licht: sh.Zentral.Nachtmodus.Licht(False)
Code:
Zentral: Nachtmodus: Licht: type: bool enforce_updates: yes cache: yes Nachtmodus_an: type: bool cache: yes alexa_actions: TurnOn TurnOff alexa_icon: SCENE_TRIGGER alexa_name: Nachtmodus alexa_alias: Nachtmodus zentral, Nachtmodus Licht, Nachtmodus Licht zentral alexa_device: Nachtmodus_Licht_zentral alexa_description: Nachtmodus Licht zentral alexa_proactivelyReported: 'False' alexa_retrievable: 'False' enforce_updates: yes on_change: ..self = value Tagmodus_an: type: bool cache: yes alexa_actions: TurnOn TurnOff alexa_icon: SCENE_TRIGGER alexa_name: Tagmodus alexa_alias: Tagmodus zentral, Tagmodus Licht, Tagmodus Licht zentral alexa_device: Tagmodus_Licht_zentral alexa_description: Tagmodus Licht zentral alexa_proactivelyReported: 'False' alexa_retrievable: 'False' enforce_updates: yes on_change: ..self = not value Werte: type: list cache: yes Mittelwert_an: type: list cache: yes Mittelwert_aus: type: list cache: yes
Der letzte Punkt ist noch die Lichtfarbe, wenn man mehrfarbige LED-Strips oder sowas benutzt. Da benutze ich in der Tat die universelle Zeitschaltuhr, also eine fixe Zeit.