Ankündigung

Einklappen
Keine Ankündigung bisher.

Tag/Nacht-Umschaltung in bequem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Tag/Nacht-Umschaltung in bequem

    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:

    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)
    Hier die Items:

    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
    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.
Lädt...
X