Ankündigung

Einklappen
Keine Ankündigung bisher.

logic/plugin - Nachts nachdimmen

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

  • Robert
    antwortet
    Hi!

    Mein Quick-Hack gestern (nachdem ich per ETS das manuelle vom automatischen Licht anschalten per GA getrennt hatte):

    item.conf
    Code:
    [Nachtmodus]
      type = bool
      visu = yes
      knx_dpt = 1
      knx_cache = 0/4/3 
    
    [Wohnzimmer]
      [[Essbereich]]
        [[[Haengelampe]]]
          type = bool
          visu = yes
          knx_dpt = 1
          knx_send = 2/1/204
          knx_cache = 2/1/204
          [[[[Automatikschalter]]]]
            type = bool
            enforce_updates = true
            knx_dpt = 1
            knx_listen = 5/1/206
            nacht_helligkeitswert = 40
          [[[[Helligkeitswert]]]]
            type = num
            visu = yes
            knx_dpt = 5001
            knx_send = 2/1/206
            knx_cache = 2/1/206
    logic.conf
    Code:
    [nachtbeleuchtung]
        filename = 'nachtbeleuchtung.py'
        watch_item = *.Automatikschalter
    Selektiert ALLE Items die auf 'Automatikschalter' enden - hier wäre nun ein Filter auf Basis von Attributen gut, siehe:

    nachtbeleuchtung.conf
    Code:
    #!/usr/bin/env python
    
    if not sh.Nachtmodus:
        exit()
    
    source_item = sh.return_item(trigger['source'])
    # check if switching off (0)
    if not source_item:
        exit()
    
    # check for attribute
    if 'nacht_helligkeitswert' not in source_item.conf:
        logger.warning('LOGIC---{0}---: {1} lacks attribute \'nacht_helligkeitswert\''.format(logic.name, source_item))
        exit()
        
    parent_item = source_item.return_parent()
    #if '{0}.Helligkeitswert'.format(parent_item) not in parent_item.return_children():
    #    logger.warning('LOGIC---{0}---: {1} lacks sibling {2}.Helligkeitswert'.format(logic.name, source_item, parent_item))
    #    exit()
        
    parent_item.Helligkeitswert(source_item.conf['nacht_helligkeitswert'])
    - Das prüfen, ob das Attribut 'Helligkeit' existiert, könnte man sich sparen wenn man watch_item filtern könnte.
    - Etwas seltsam ist, dass man die Attribute von "logic" und "plugin" mit 'hasattr' checken kann, während "item" ein dictionary '.conf' verwendet. Vielleicht kann man das vereinheitlichen?
    - Gibt es eine elegante Methode, ob ein Item ein Schwester-Item x hat? Also Umweg über 'return_parent()', dann aber nicht über 'return_children()' iterieren?
    - Aufgrund der 'exit()' habe ich noch fiese Probleme mit der Zuverlässigkeit. Ich gehe stark davon aus, dass das mit https://knx-user-forum.de/smarthome-...telegramm.html zusammenhängt und mittlerweile im git bzw. Release 0.9 behoben ist (prüfe ich heute Abend)

    Generell:
    + Das logic.py und die logic.conf sind schön kompakt (da kommt logischweise noch mehr hinzu).
    + Die Dimmwerte usw. sind unmittelbar dem Item zugeordnet (in der item.conf)
    - Die Dimmwerte usw. sind unmittelbar dem Item zugeordnet (in der item.conf)
    (ich bin mir gar nicht mehr so sicher ob das übersichtlicher ist...)

    Grüße
    Robert

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Danke.

    Habs beim zweiten lesen auch gerade überblickt und wollte zurückrudern ... ich dachte es müsste ein logic.trigger['source'] sein ...

    Einen Kommentar schreiben:


  • Robert
    antwortet
    trigger['source']

    SmartHome.py - Logic Configuration

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Wie komme ich denn an das item welches die logic ausgelöst hat?

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Ich dachte daran, das die Logiken einfach im SmartHome.py Wiki gesammelt werden. Darin darf jeder git-Benutzer editieren.

    Man könnte dadurch eine die Logik und eine kleine Beschreibung aktuell halten.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Also Logiken zentral zu sammeln sollte schon irgendwo machbar sein.
    Dass die Logiken und Plugins sich i.S.v. "WireGate-Plugins" unterscheiden ist auch klar. Aber gerade deswegen...warum sollte eine logic nicht so ausgereift sein dass sie möglichst viele Anwendungsfälle abdeckt? Den Vergleich Binding=Plugin finde ich sehr passend.

    Ich werde mir das erstmal so einbauen wie von Niko vorgeschlagen oder arbeitet Robert parallel daran? Unterschiedliche Logiken für die Anwendungsfälle bedarf es imho nicht. Im jetzigen Stand wird ja sowohl ein Objekt als auch die Uhrzeit unabhängig überwacht. Dann fügen wir eben die Helligkeit noch mit ein oder der Spezialfall nutzt noch ein weitere Logik.

    Was mir garnicht gefällt ist die Tatsache dass jeder seine eigenen Logiken zusammenstricken soll weil sie einfach nirgends gesammelt sind. Ein "kapern" des Threads sehe ich nicht ... die (hoffentlich nicht ergebnisoffene) Diskussion fördert das Verständnis und lässt was anständiges entstehen.

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Also nur wenn "schlafen" aktiviert ist? Und wenn du am WE länger schläfst und es draußen schon hell ist, aber die Rollläden noch unten wird höher gedimmt als wenn du nachts Pipi musst?

    Einen Kommentar schreiben:


  • Robert
    antwortet
    Hi!

    Sorry, ich wollte nicht den Thread kapern. Intention war, alles was in Richtung "nachts nachdimmen" geht zusammenzuhalten. Klar gibt es da mehrere Wege.

    Ja, ein Plugin könnte die von mir gewünschten Funktionen abdecken, aber in der Tat würde ich "Plugins" hier wirklich eher in Richtung "Bindings" verstehen. Evtl. wäre das auch langfristig ein passenderer Name?

    Das auswählen der Items per Wildcard ist schon mal gut. Allerdings würden dann auch etliche Lampen ausgewählt, die kein Attribut "night_brightness" o.Ä. haben. Eine Frage die hier weiter verfolgt werden sollte: https://knx-user-forum.de/smarthome-...tml#post320803

    Zudem: Lauffähige, halbwegs dokumentierte Logiken könnten doch schon unter "examples". Dort könnte es eine Logik geben, die es abhängig von der Zeit machen, eine die es abh. vom Status ("Nachtmodus") macht und halt auch eine abh. von der (Außen?)Helligkeit.

    Grüße
    Robert

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Naja, die Szene "schlafen" wird natürlich noch ausgewertet

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Daran sieht man, dass so etwas als Plugin für alle in einem Repo wohl ungeeignet ist. Mit der Helligkeit könnte ich z.B. nicht arbeiten. Beispiel: Unser Flur EG wird nach 22 Uhr auf nur noch 30% gedimmt. Das reicht zum auf die Toilette gehen. Im Winter wird es früh dunkel. Wenn wir also um 20 Uhr vom Einkaufen kommen, dann will ich im Flur Licht haben. Gesteuert über die Helligkeit würde das z.B. nicht funktionieren.

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Ich nehme da Helligkeit als Trigger und nicht feste Zeiten...

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Sollte nur eine Anregung sein, wie man es umsetzen kann. Bei mir funktioniert es so wie es ist, für mich also nicht notwendig. Man kann das auch als Plugin lösen, nur gehört das dann IMHO nicht ins Repo.

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Will man sich auf einen Weg einigen?
    Wer baut es entsprechend um? Ich hätte keine Not damit.

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Ich würde dafür kein Plugin verwenden, da es eigentlich keins ist. Aber du kannst ja erstmal beliebige Attribute je Item definieren. Man könnte also ohne Probleme ein Item so definieren:

    Code:
    [eg]
        [[kitchen]]
            [[[light]]]
                [[[[switch]]]]
                    ...
                [[[[value]]]]
                    type = num
                    night_brightness = 50
                    night_start = 22:00
                    night_end = 7:00
    Nun macht man eine Logik, bei der man die watch items über Wildcards definiert (siehe https://knx-user-forum.de/smarthome-...ogic-conf.html):

    Code:
    [nachdimmen]
        filename = 'nachdimmen.py'
        watch_item = *.*.light.switch
    In der Logik holt man sich dann das parent des auslösenden watch_items, schaut ob das ein child namens "value" hat und anschließend noch ob das die "nigth_xxx" Attribute besitzt, wenn ja werden diese eben ausgesteuert.

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Hallo Robert, das sollte doch möglich sein. Zur Not als Plugin.
    Ich hab jetzt erstmal mehrere Logikblöcke definiert die alle auf die gleiche logic zugreifen (nachdimmen.py). Für mich ist es wichtig unterschiedliche Zeiten (wenigstens halbstündlich) zu definieren da ich im Flur OG eher eine Dimmung haben möchte als im Flur EG (Schlafenszeit Eltern vs. Schlafenszeit Kinder). Wenn das jemand noch anders umsetzt dann bitte auch unter Angabe der Uhrzeit die es betrifft .
    DPT 5001 funktioniert übrigens dann wie erwartet.

    Hier meine aktuelle Lösung:

    logic.conf
    Code:
    [nachdimmen_og_flur]
        filename = 'nachdimmen.py'
        watch_item = og.flur.licht_decke.switch
        set_item = og.flur.licht_decke.dim
        #set_value = 100
        night_value = 20
        start_time = '21:30'
        end_time = '07:00'
        #cond_item = example.item
        #cond_value = 0815
    nachdimmen.py
    Code:
    #!/usr/bin/env python
    val = 30 #set default
    now = sh.now()
    
    # look for a value to set
    if hasattr(logic, 'set_value'):
        val = logic.set_value
    if hasattr(logic, 'start_time'):
        start_time = logic.start_time
    if hasattr(logic, 'end_time'):
        end_time = logic.end_time
    
    # in the night there is maybe another value to set
    if hasattr(logic, 'night_value'):
        unix = now.strftime('%s')
        starthour,startminute = start_time.split(':')
        endhour,endminute = end_time.split(':')
        starthour = int(starthour)
        startminute = int(startminute)
        endhour = int(endhour)
        endminute = int(endminute)
        start = datetime.datetime(now.year, now.month, now.day, starthour, startminute, 0, 0)
        unix_start = int(start.strftime('%s'))
        end = datetime.datetime(now.year, now.month, now.day, endhour, endminute, 0, 0)
        unix_end = int(end.strftime('%s'))
    
        ###starthour before endhour: i.e. 14-18 Uhr
        if starthour <= endhour:
    	#case 1:
    	if int(unix) < int(unix_end) and int(unix) > int(unix_start):
    	    val = logic.night_value
    	    #logger.info('LOGIC---{0}---: dimming case 1'.format(logic.name))
    	# case 2 - seem to be obsolete
    	if startminute > endminute and starthour == endhour:
    	    val = logic.night_value
    	    #logger.info('LOGIC---{0}---: dimming case 2'.format(logic.name))
    
        ### starthour after endhour: i.e. 18-7 Uhr
        if starthour > endhour:
    	#case 3
    	if int(unix) > int(unix_start):
    	    val = logic.night_value
    	    #logger.info('LOGIC---{0}---: dimming case 3'.format(logic.name))
    	#case 4:
    	if int(unix) < int(unix_end):
    	    val = logic.night_value
    	    #logger.info('LOGIC---{0}---: dimming case 4'.format(logic.name))
    	    
    # and on a condition we can also use another value
    if hasattr(logic, 'cond_item') and hasattr(logic, 'cond_value'):
        if sh.return_item(logic.cond_item)():
            val = logic.cond_value
    	#logger.info('LOGIC---{0}---: dimming at condition'.format(logic.name))
    
    # and now set the value to the specified item
    # if the watch item is set
    if hasattr(logic, 'watch_item'):
        if sh.return_item(logic.watch_item[0])():
            sh.return_item(logic.set_item)(val)

    Einen Kommentar schreiben:

Lädt...
X