Ankündigung

Einklappen
Keine Ankündigung bisher.

Sequenzer für Farbbeleuchtung

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

    Sequenzer für Farbbeleuchtung

    Moin,

    ich suche nach einem Sequenzer, um die Farben meiner RGB-Beleuchtung wechseln lässt. Dabei sollen die Farben innerhalb einer gewissen Zeit (Größenordnung: Minuten) auf eine andere Helligkeit faden.
    Hat jemand von euch das schon gemacht?

    Gruß,
    Hendrik

    #2
    Siehe hier: https://knx-user-forum.de/forum/supp...gb-fader/page3

    Ich hab darauf aufbauend eine Logik gebastelt. Funktioniert ganz gut, hätte ich aber irgendwie gerne noch schöner verpackt bzw. gibt es derzeit keine Möglichkeit, mehrere Items mit dem gleichen Sequencer laufen zu lassen. Außer halt mit Hilfsitems, on_update, etc.

    Code:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    logger.info(trigger)
    
    trigger_item = sh.return_item(trigger['source'])
    source_item = sh.return_item(logic.watch_item[0])
    logger.info("trigger item for sequencer logic: {0}, source item: {1}".format(trigger_item,source_item))
    
    #schauen ob es ein lokales sperritem gibt
    has_sperren = False
    has_running = False
    has_modus = False
    has_random = False
    has_stepping = False
    has_startvariation = False
    has_randomstart = False
    has_timedelta = False
    
    search_id = source_item.id()+".running"
    for child in source_item.return_children():
         if child.id() == search_id:
                has_running = True
    
    if has_running:
        if source_item.running() == 1:
           running = 1
           logger.info("sequencer laeuft.")
        else:
           running = 0
           logger.info("sequencer laeuft nicht.")
    
    search_id = source_item.id()+".sperren"
    for child in source_item.return_children():
         if child.id() == search_id:
                has_sperren = True
    
    if has_sperren:
        if source_item.sperren() == 1:
           sperren = 1
           logger.info("sequencer gesperrt, daher wird item ausgeschaltet.")
           source_item(0)
        else:
            sperren = 0
            logger.info("sequencer nicht gesperrt, daher gehts los.")
    else:
      sperren = 0
    search_id = source_item.id()+".modus"
    for child in source_item.return_children():
         if child.id() == search_id:
                has_modus = True
    
    if has_modus:
         modus = source_item.modus()
         logger.info("modus auf {0}".format(modus))
    else:
        modus = 0
        logger.info("modus auf 0, da attribut nicht vorhanden")
    
    if sperren == 0:
      if sh.return_item(logic.watch_item[0])(): # variablen werden nur gesetzt/gecheckt, wenn sequencer eingeschaltet wird
        step = trigger['value']
        if step == 0:
            step = 1
            logger.info("step war auf 0, warum auch immer.")
        if source_item.modus.age() < 5:
             step = 1
             logger.info("modus gerade erst geaendert, daher step 1")
        logger.info("step: {0}".format(step))
    
        # aus-wert wird entweder als off in logic.conf definiert oder automatisch auf 0 gesetzt
        try:
            off = int(logic.off_value)
            logger.info("off via config = {0}".format(off))
        except:
            off = 0
            logger.info("off via standard = 0")
    
        # max. ein-wert wird entweder als on in logic.conf definiert oder automatisch auf 255 gesetzt
        try:
            on = int(logic.on_value)
            logger.info("on via config = {0}".format(on))
        except:
            on = 255
            logger.info("on via standard = 255")
    
        # sollte off groesser als on sein, werden die beiden werte getauscht.
        if off >= on:
            realoff = on
            realon = off
            on = int(realon)
            off = int(realoff)
            logger.info("werte in config verdreht. off nach korrektur = {0}, on nach korrektur = {1}".format(off, on))
    
    
        search_id = source_item.id()+".randomchanger"
        for child in source_item.return_children():
             if child.id() == search_id:
                    has_random = True
    
        if has_random:
            # wird randomchanger ohne wert deklariert, wird standardwert 30 gesetzt.
            if not isinstance(rand, int):
                if rand.lower() in ['1', 'True', 'yes', 'on']:
                    rand = 30
                    logger.info("random ist aktiviert, aber kein wert gesetzt. off = zwischen {0} und {1}, on = zwischen {2} und {3}".format(off,off+30,on,on-30))
                elif rand.lower() in ['0', 'False', 'no', 'off']:
                    logger.info("keine zufallswerte gewuenscht. off = {0}, on = {1}".format(off,on))
                else:
                    rand = int(source_item.randomchanger())
        else:
            # ist randomchanger in der logic.conf angegeben, wird der dort angegebene wert benutzt, um on und off mit dem angegebenen wert zufaellig abzuaendern.
            try:
                rand = logic.randomchanger
                logger.info("random via config = {0}".format(rand))
            except:
                rand = 'no'
    
    
        # on und off werden anhand des randomchanger-wertes zufaellig abgeaendert.
        if isinstance(rand, int):
            random.seed()
            upper = int(on-rand)
            lower = int(off+rand)
            on = random.randint(upper, on)
            off = random.randint(off, lower)
            logger.info("randomspanne = {0}, obergrenze fuer off = {4}, untergrenze fuer on = {3}, sequencer werte: off {1}, on {2}".format(rand,off,on, upper, lower))
    
        search_id = source_item.id()+".stepping"
        for child in source_item.return_children():
             if child.id() == search_id:
                    has_stepping = True
    
        if has_stepping:
            stepping = int(source_item.stepping())
        else:
    
            # ist stepping nicht in der logic.conf definiert, wird der wert auf 5 gesetzt.
            try:
                stepping = int(logic.stepping)
                logger.info("stepping = {0}".format(stepping))
            except:
                stepping = 5
    
        search_id = source_item.id()+".timedelta"
        for child in source_item.return_children():
             if child.id() == search_id:
                    has_timedelta = True
    
        if has_timedelta:
            timedelta = int(source_item.timedelta())
        else:
            # ist timedelta nicht in der logic.conf definiert, wird der wert auf 1 gesetzt.
            try:
                timedelta = int(logic.timedelta)
                logger.info("timedelta = {0}".format(timedelta))
            except:
                timedelta = 1
    
        search_id = source_item.id()+".randomstart"
        for child in source_item.return_children():
             if child.id() == search_id:
                    has_randomstart = True
    
        if has_randomstart:
            randomstart = source_item.randomstart()
            logger.info("random start aus item = {0}".format(randomstart))
        else:
            # randomstart ermoeglicht es, mit einer zufaelligen farbe anstatt dunklem rot zu starten.
            try:
                randomstart = logic.randomstart
                logger.info("random start aus logic config = {0}".format(randomstart))
            except:
                randomstart = False
                logger.info("random start False = {0}".format(randomstart))
                try:
                    randomstart_r = int(logic.randomstart_r)
                    randomstart = 1
                except:
                    randomstart_r = 0
                try:
                    randomstart_g = int(logic.randomstart_g)
                    randomstart = 1
                except:
                    randomstart_g = 0
                try:
                    randomstart_b = int(logic.randomstart_b)
                    randomstart = 1
                except:
                    randomstart_b = 0
                try:
                    randomstart_ww = int(logic.randomstart_ww)
                    randomstart = 1
                except:
                    randomstart_ww = 0
    
        search_id = source_item.id()+".startvariation"
        for child in source_item.return_children():
             if child.id() == search_id:
                    has_startvariation = True
    
        if has_startvariation:
            startvariation = int(source_item.startvariation())
        else:
            try:
                startvariation = int(logic.startvariation)
            except:
                startvariation = 50
    
    
            # wird randomstart ohne wert in der logic.conf aktiviert, wird 150 als standardwert gesetzt.
        if isinstance(randomstart, bool):
            try:
                if randomstart == True:
                    randomstart = randomstart_r = randomstart_g = randomstart_b = randomstart_ww = 150
                    logger.info("alle farben random start = {0}".format(randomstart))
                elif randomstart == False:
                    randomstart = 0
                    logger.info("random start ist aus = {0}".format(randomstart))
            except:
                logger.info("randomstart ist aktiviert, wird berechnet...")
        else:
            try:
                if randomstart.lower() in ['True', 'yes', 'on']:
                    randomstart = randomstart_r = randomstart_g = randomstart_b = randomstart_ww = 150
                    logger.info("alle farben random start = {0}".format(randomstart))
                elif randomstart.lower() in ['0', 'False', 'no', 'off']:
                    randomstart = 0
                    logger.info("random start ist aus = {0}".format(randomstart))
                else:
                    randomstart = int(randomstart)
                    logger.info("random start = {0}".format(randomstart))
            except:
                if not isinstance(randomstart, int):
                    logger.info("randomstart nicht oder falsch definiert")
                else:
                    logger.info("randomstart wird berechnet...")
    
        # berechnen des zufaelligen startwerts fuer gruen und blau.
        if isinstance(randomstart, int) and randomstart > 0:
            logger.info("setze farben random start = {0}".format(randomstart))
            random.seed()
            randomstartr = random.randint(randomstart_r-startvariation, randomstart_r+startvariation)
            randomstartg = random.randint(randomstart_g-startvariation, randomstart_g+startvariation)
            randomstartb = random.randint(randomstart_b-startvariation, randomstart_b+startvariation)
            randomstartww = random.randint(randomstart_ww-startvariation, randomstart_ww+startvariation)
            logger.info("random start fuer rot = {0}, fuer gruen = {1}, fuer blau = {2}, fuer ww = {3} (variation: {4}),".format(randomstartr, randomstartg, randomstartb, randomstartww, startvariation))
        else:
            logger.info("random start ist ausgeschaltet. wert = {0}".format(randomstart))
    
        # next_step wird entweder in sekunden in logic.conf definiert oder automatisch errechnet.
        try:
            next_step = int(logic.next_step)
            logger.info("next step via config = {0}".format(next_step))
        except:
            next_step = int(on*timedelta/stepping)
            logger.info("next step via calculation = {0}".format(next_step))
    
        if modus == 2:
            next_step = next_step/2
    
        next_time = sh.now() + dateutil.relativedelta.relativedelta(seconds=next_step)
    
      # sind die anzusteuernden children in logic.conf nicht definiert, wird der standardname farbe.dimmen angenommen. sollte angepasst werden!
    
      parent_item = sh.return_item(logic.watch_item[0]).return_parent()
    
      try:
        r = "{0}.{1}".format(parent_item, r_value)
        g = "{0}.{1}".format(parent_item, g_value)
        b = "{0}.{1}".format(parent_item, b_value)
        ww = "{0}.{1}".format(parent_item, ww_value)
        logger.info("items via config: rot = {0}, gruen = {1}, blau = {2}, ww = {3}".format(r,g,b,ww))
      except:
        r = "{0}.r.fading".format(parent_item)
        g = "{0}.g.fading".format(parent_item)
        b = "{0}.b.fading".format(parent_item)
        ww = "{0}.ww.fading".format(parent_item)
        logger.info("items via standard: rot = {0}, gruen = {1}, blau = {2}, ww = {3}".format(r,g,b,ww))
    
    
      id = 'logics.{}'.format(logic.name)
      items = r, g, b, ww
    
    
      if sh.return_item(logic.watch_item[0])() :    #wenn watch_item gesetzt ist startet ablauf (1-2-3-4-2-3-4-2-3-4-.....)
    
        # modus 0, standard
        if modus == 0:
            aktuellww = sh.return_item(items[3])() - 1
            aktuellww *= (aktuellww>0)
            sh.return_item(items[3])(abs(aktuellww))
            off_step = int(sh.return_item(items[3])()/10)
            sh.return_item(items[3]).fade(0,off_step,1)
            if step == 1:
                source_item.running(1)
                logger.info("sequencer stufe 1")
                aktuellr = sh.return_item(items[0])() - 1
                aktuellg = sh.return_item(items[1])() - 1
                aktuellb = sh.return_item(items[2])() - 1
                aktuellr *= (aktuellr>0)
                aktuellg *= (aktuellg>0)
                aktuellb *= (aktuellb>0)
                logger.info("r = {0}, g = {1}, b = {2}, ww = {3}".format(aktuellr,aktuellg,aktuellb,aktuellww))
                sh.return_item(items[0])(abs(aktuellr))
                sh.return_item(items[1])(abs(aktuellg))
                sh.return_item(items[2])(abs(aktuellb))
                if randomstart:
                    logger.info("item to fade: {0}".format(sh.return_item(items[0])))
                    sh.return_item(items[0]).fade(on,stepping*2,timedelta)
                    sh.return_item(items[1]).fade(randomstartg,25,1)
                    sh.return_item(items[2]).fade(randomstartb,33,1)
                else:
                    sh.return_item(items[0]).fade(on,stepping,timedelta)
                step = 2
            elif step == 2:
                logger.info("sequencer stufe 2")
                aktuellr = sh.return_item(items[0])() - 1
                aktuellg = sh.return_item(items[1])() - 1
                aktuellr *= (aktuellr>0)
                aktuellg *= (aktuellg>0)
                logger.info("r = {0}, g = {1}".format(aktuellr,aktuellg))
                sh.return_item(items[0])(abs(aktuellr))
                sh.return_item(items[1])(abs(aktuellg))
                sh.return_item(items[1]).fade(on,stepping,timedelta)
                sh.return_item(items[0]).fade(off,stepping,timedelta)
                step = 3
            elif step == 3:
                logger.info("sequencer stufe 3")
                aktuellg = sh.return_item(items[1])() - 1
                aktuellb = sh.return_item(items[2])() - 1
                aktuellg *= (aktuellg>0)
                aktuellb *= (aktuellb>0)
                logger.info("g = {0}, b = {1}".format(aktuellg,aktuellb))
                sh.return_item(items[1])(abs(aktuellg))
                sh.return_item(items[2])(abs(aktuellb))
                sh.return_item(items[2]).fade(on,stepping,timedelta)
                sh.return_item(items[1]).fade(off,stepping,timedelta)
                step = 4
            elif step == 4:
                logger.info("sequencer stufe 4")
                aktuellr = sh.return_item(items[0])() - 1
                aktuellb = sh.return_item(items[2])() - 1
                aktuellr *= (aktuellr>0)
                aktuellb *= (aktuellb>0)
                logger.info("r = {0}, b = {1}".format(aktuellr,aktuellb))
                sh.return_item(items[0])(abs(aktuellr))
                sh.return_item(items[2])(abs(aktuellb))
                sh.return_item(items[0]).fade(on,stepping,timedelta)
                sh.return_item(items[2]).fade(off,stepping,timedelta)
                step = 2
            else:
                logger.warning("kein sequenzwert gesetzt")
    
    
        # modus 2, advent
        if modus == 2:
            off_stepr = int(sh.return_item(items[1])()/10)
            off_stepg = int(sh.return_item(items[2])()/10)
            aktuellg = sh.return_item(items[1])() - 1
            aktuellb = sh.return_item(items[2])() - 1
            aktuellg *= (aktuellg>0)
            aktuellb *= (aktuellb>0)
            sh.return_item(items[1])(abs(aktuellg))
            sh.return_item(items[2])(abs(aktuellb))
            sh.return_item(items[1]).fade(0,off_stepr,timedelta*2)
            sh.return_item(items[2]).fade(0,off_stepg,timedelta*2)
            if step == 1:
                source_item.running(1)
                logger.info("sequencer stufe 1, modus 2")
                aktuellr = sh.return_item(items[0])() - 1
                aktuellww = sh.return_item(items[3])() - 1
                aktuellr *= (aktuellr>0)
                aktuellww *= (aktuellww>0)
                logger.info("r = {0}, ww = {1}".format(aktuellr,aktuellww))
                sh.return_item(items[0])(abs(aktuellr))
                sh.return_item(items[3])(abs(aktuellww))
                if randomstart:
                    logger.info("item to fade: {0}".format(sh.return_item(items[0])))
                    sh.return_item(items[0]).fade(on,stepping*2,timedelta)
                    sh.return_item(items[3]).fade(randomstartww,25,1)
                else:
                    sh.return_item(items[0]).fade(on,stepping,timedelta)
                step = 2
            elif step == 2:
                logger.info("sequencer stufe 2, modus 2")
                aktuellr = sh.return_item(items[0])() - 1
                aktuellww = sh.return_item(items[3])() - 1
                aktuellr *= (aktuellr>0)
                aktuellww *= (aktuellww>0)
                logger.info("r = {0}, ww = {1}".format(aktuellr,aktuellww))
                sh.return_item(items[0])(abs(aktuellr))
                sh.return_item(items[3])(abs(aktuellww))
                sh.return_item(items[3]).fade(on,stepping*2,timedelta)
                sh.return_item(items[0]).fade(off,stepping*2,timedelta)
    
                step = 3
            elif step == 3:
                logger.info("sequencer stufe 3, modus 2")
                aktuellr = sh.return_item(items[0])() - 1
                aktuellww = sh.return_item(items[3])() - 1
                aktuellr *= (aktuellr>0)
                aktuellww *= (aktuellww>0)
                logger.info("r = {0}, ww = {1}".format(aktuellr,aktuellww))
                sh.return_item(items[0])(abs(aktuellr))
                sh.return_item(items[3])(abs(aktuellww))
                sh.return_item(items[0]).fade(on,stepping*2,timedelta)
                sh.return_item(items[3]).fade(off,stepping*2,timedelta)
    
                step = 2
    
            else:
                logger.warning("kein sequenzwert gesetzt")
    
    
        sh.scheduler.change(id, next=next_time, value=step)     #nächsten aufruf setzen
    
    
    
      else:
        # ist off_fade nicht in der logic.conf definiert, wird sofort ausgeschaltet statt in 10 sekunden ausgefadet.
        try:
            off_fade = logic.off_fade
            logger.info("ausschalten mit fade")
        except:
            off_fade = 'no'
            logger.info("ausschalten ohne fade")
    
        try:
            if off_fade.lower() in ['1', 'True', 'yes', 'on']:
                off_fade = 10
            elif off_fade.lower() in ['0', 'False', 'no', 'off']:
                off_fade = False
            else:
                off_fade = int(off_fade)
                logger.info("ausschaltfade in sekunden via config = {0}".format(off_fade))
        except:
            if not isinstance(off_fade, int):
                logger.info("ausschaltfade nicht oder falsch definiert")
            else:
                logger.info("ausschaltfade wird berechnet...{0}".format(off_fade))
    
        step = 1
        for i in items:
    
            if off_fade:
                off_step = int(sh.return_item(i)()/off_fade)
                off_delta = 1
                if off_step == 0:
                    off_step = 1
                logger.info("offstep fuer {1} = {0}".format(off_step,sh.return_item(i)))
                aktuell = sh.return_item(i)() - 1
                aktuell *= (aktuell>0)
                sh.return_item(i)(aktuell)
                sh.return_item(i).fade(0,off_step,off_delta)
            else:
                sh.return_item(i)(0)
            logger.info("sequencer deaktiviert fuer {0}".format(sh.return_item(i)))
    
        source_item.running(0)
    Ein Item sieht dann wie folgt aus:
    Code:
                sequencer:
                    knx_listen:
                      - 3/6/93
                      - 3/6/91
                    knx_cache: 3/6/93
                    knx_dpt: 1
                    visu_acl: rw
                    type: bool
                    cache: 'False'
                    enforce_updates: 'no'
    
                    modus:
                        visu_acl: rw
                        type: num
                        cache: 'True'
                        enforce_updates: 'no'
    
                    stepping:
                        visu_acl: rw
                        type: num
                        cache: 'True'
                        enforce_updates: 'no'
    
                    randomstart:
                        visu_acl: rw
                        type: bool
                        cache: 'True'
                        enforce_updates: 'no'
    
                    startvariation:
                        visu_acl: rw
                        type: num
                        cache: 'True'
                        enforce_updates: 'no'
    
                    timedelta:
                        visu_acl: rw
                        type: num
                        cache: 'True'
                        enforce_updates: 'no'
    
                    sperren:
                        knx_dpt: 1
                        visu_acl: rw
                        type: bool
                        cache: 'True'
                        enforce_updates: 'no'
    
                    running:
                        knx_dpt: 1
                        visu_acl: rw
                        type: bool
                        enforce_updates: 'yes'
    Falls du Lust hast, kannst du ja im Gegenzug ein nettes smartvisu widget basteln bzw. den Code oben ausbauen

    Kommentar


      #3
      henfri Hast du's schon getestet?

      Kommentar


        #4
        Hallo,

        Erstmal danke und sorry für die fehlende Rückmeldung.
        Ich bin leider noch nicht dazu gekommen.

        Melde mich aber dann.

        Gruß,
        Hendrik

        Kommentar


          #5
          P.s.:

          Hast du mal überlegt, einfach im HSL Farbraum zu arbeiten?
          wenn ich deine Logik richtig sehe und verstehe kommt es dabei zu deutlichen Schwankungen in der Helligkeit.
          Im im HSL Raum könnte man einfach den Hinweis und ggf S wert kontinuierlich variieren.
          Dabei dabei könnte man den Wert konstant lassen und gegebenenfalls in der Visualisierung über einen Slider einstellbar machen.

          Gruß,
          ​​​​​​​Hendrik

          Kommentar


            #6
            Ich fürchte, Helligkeitsschwankungen hast du generell, da ein reines Rot und reines Blau schon per se unterschiedlich wirken. Aber generell ist der Ansatz sicher gut. Wüsste nur grad nicht, wie das sinnvoll zu implementieren wäre. Sowas in die Richtung? https://stackoverflow.com/questions/...lor-conversion
            bzw. colorsys Modul? http://docs.w3cub.com/python~3.6/library/colorsys/

            Kommentar


              #7
              Genau.

              Kommentar


                #8
                Hallo,

                Ich schaue mir den Code gerade an...
                Was macht denn das hier?
                Code:
                    r = "{0}.{1}".format(parent_item, r_value)
                    g = "{0}.{1}".format(parent_item, g_value)
                    b = "{0}.{1}".format(parent_item, b_value)
                    ww = "{0}.{1}".format(parent_item, ww_value)
                r_value &co sind doch nirgends als Variable definiert?

                Und weiter:
                Code:
                        if step == 1:
                            source_item.running(1)
                            logger.info("sequencer stufe 1")
                            aktuellr = sh.return_item(items[0])() - 1
                            aktuellg = sh.return_item(items[1])() - 1
                            aktuellb = sh.return_item(items[2])() - 1
                            aktuellr *= (aktuellr>0)
                            aktuellg *= (aktuellg>0)
                            aktuellb *= (aktuellb>0)
                            logger.info("r = {0}, g = {1}, b = {2}, ww = {3}".format(aktuellr,aktuellg,aktuellb,aktuellww))
                            sh.return_item(items[0])(abs(aktuellr))
                            sh.return_item(items[1])(abs(aktuellg))
                            sh.return_item(items[2])(abs(aktuellb))
                ...
                            sh.return_item(items[0]).fade(on,stepping,timedelta)

                Das
                -quadriert die aktuellen werte für r, g, b
                -setzt die Werte (ohne fade) auf die quadrierten Werte
                -fadet danach noch den r-Wert auf den Wert, der in 'on' gespeichert ist.

                richtig?
                Ich verstehe aber nicht, warum.

                Ich überlege gerade, ob es sinn macht, die Logik auf HSV zu erweitern, oder ob dies eine eigne Logik werden sollte.
                Was meinst du?

                Gruß,
                Hendrik

                Kommentar


                  #9
                  Ich denke, du brauchst die komplette Itemstruktur und nicht nur den Sequencer:
                  Code:
                  sequencer_barfach:
                              r:
                                  type: bool
                                  knx_send: 3/6/1
                                  knx_cache: 3/6/2
                                  knx_dpt: 1
                  
                                  dimmen:
                                      knx_send: 3/6/3
                                      knx_cache: 3/6/4
                                      knx_dpt: 5
                                      type: num
                  
                                  fading:
                                      knx_send: 3/6/3
                                      knx_dpt: 5
                                      visu_acl: rw
                                      type: num
                                      enforce_updates: 'yes'
                  
                              g:
                                  knx_send: 3/6/11
                                  knx_cache: 3/6/65
                                  type: bool
                  
                                  dimmen:
                                      knx_send: 3/6/63
                                      knx_dpt: 5
                                      visu_acl: rw
                                      type: num
                                      knx_cache: 3/6/64
                  
                                  fading:
                                      knx_send: 3/6/63
                                      knx_dpt: 5
                                      visu_acl: rw
                                      type: num
                                      enforce_updates: 'yes'
                  
                              b:
                                  knx_send: 3/6/12
                                  knx_cache: 3/6/69
                                  knx_dpt: 1
                                  visu_acl: rw
                                  type: bool
                  
                                  dimmen:
                                      knx_send: 3/6/67
                                      knx_dpt: 5
                                      visu_acl: rw
                                      type: num
                                      knx_cache: 3/6/68
                  
                                  fading:
                                      knx_send: 3/6/67
                                      knx_dpt: 5
                                      visu_acl: rw
                                      type: num
                                      enforce_updates: 'yes'
                  
                              ww:
                                  knx_send: 3/6/13
                                  knx_cache: 3/6/73
                                  knx_dpt: 1
                                  visu_acl: rw
                                  type: bool
                  
                                  dimmen:
                                      knx_send: 3/6/71
                                      knx_dpt: 5
                                      visu_acl: rw
                                      type: num
                                      knx_cache: 3/6/72
                  
                                  fading:
                                      knx_send: 3/6/71
                                      knx_dpt: 5
                                      visu_acl: rw
                                      type: num
                                      enforce_updates: 'yes'
                  
                              sequencer:
                                  knx_dpt: 1
                                  visu_acl: rw
                  
                                  modus:
                                      visu_acl: rw
                                      type: num
                                      cache: 'True'
                                      enforce_updates: 'no'
                  
                                  stepping:
                                      visu_acl: rw
                                      type: num
                                      cache: 'True'
                                      enforce_updates: 'no'
                  
                                  randomstart:
                                      visu_acl: rw
                                      type: bool
                                      cache: 'True'
                                      enforce_updates: 'no'
                  
                                  startvariation:
                                      visu_acl: rw
                                      type: num
                                      cache: 'True'
                                      enforce_updates: 'no'
                  
                                  timedelta:
                                      visu_acl: rw
                                      type: num
                                      cache: 'True'
                                      enforce_updates: 'no'
                  
                                  sperren:
                                      knx_dpt: 1
                                      visu_acl: rw
                                      type: bool
                                      cache: 'True'
                                      enforce_updates: 'no'
                  
                                  running:
                                      knx_dpt: 1
                                      visu_acl: rw
                                      type: bool
                                      enforce_updates: 'yes'
                  Und natürlich die Config für die Logik im logic.yaml:
                  Code:
                  sequencer_barfach:
                      filename: sequencer.py
                      watch_item:
                          -   licht.og.led_barfach.sequencer
                          -   licht.og.led_barfach.sequencer.modus
                      stepping: 2
                      timedelta: 10
                      randomchanger: 35
                      randomstart_r: 220
                      randomstart_g: 100
                      randomstart_b: 80
                      randomstart_ww: 200
                      startvariation: 30
                      off_value: 0
                      on_value: 255
                      off_fade: 10
                      r_value: r.fading #nicht nötig, wenn Itemstruktur wie oben ist
                      g_value: g.fading
                      b_value: b.fading
                      ww_value: ww.fading
                  Das Fading Item ist im Prinzip das "dimmen" Item ohne knx_listen. Das deshalb, weil sonst item.fader immer abbricht, sobald ein Wert erhalten wird (sollte man imho mal im core anpassen, aber das ist was anderes..)

                  Das r_value blieb lediglich aus Kompatibilitätsgründen zur ursprünglichen Logik drin. Dort wurden im logic.yaml die Werte für r, g, b nämlich dort drin definiert. Ist nicht nötig, wenn die Hierarchie wie oben "stimmt". Selbes gilt wohl für startvariation und stepping. Doppelt gemoppelt. Ich find es generell vernünftiger, die Config als Items zu erfassen, da sie dann in Laufzeit geändert werden können, anstatt sie fix im logic.yaml zu definieren. Möglicherweise hab ich das nicht komplett durchgezogen oder es sind noch unnötige Attribute in der logic.yaml drin.

                  Quadriert wird übrigens nichts. Es geht nur drum, ob der Wert aktuell_r auf den tatsächlichen Wert oder auf 0 gesetzt wird. Also (aktuell_r>0) gibt entweder 1 oder 0 zurück, je nachdem eben, ob der Wert größer 0 ist. Das hätte man vermutlich auch mit einem min/max machen können, jedenfalls geht's nur drum, dass der Wert nicht negativ sein darf.

                  Das SETZEN des Werts ohne Fade ist ganz wichtig, um den Fader zu stoppen. Relevant dabei ist das -1 in den Zeilen davor. Der Wert darf also nicht auf den gleichen Wert gesetzt werden, wo er grad ist, denn dann wird nicht gestoppt. Man kann den Fader auch nicht einfach so "ersetzen"/ändern. Sondern eben stoppen und neu setzen (auch das könnte man mal im core ändern.. schau ich mir vielleicht mal im Detail an..z.B. könnte im core definiert sein, dass zuerst ein Wert -1 gesetzt wird, wenn schon ein entsprechender fader existiert...).

                  Bezüglich HSV-RGB gibt es übrigens hier noch Info bezüglich Ressourcenproblem:
                  https://knx-user-forum.de/forum/supp...56#post1023556
                  Zuletzt geändert von Onkelandy; 07.10.2018, 08:11.

                  Kommentar


                    #10
                    Hallo,

                    danke, das hilft.
                    Die Syntax (value>0) hatte ich mit ("multipliziere mit dem wert wenn wert>0 ist") übersetzt.
                    Dass die in der logic.yaml definierten Parameter als Variablen in der Logik zur Verfügung stehen war mir nicht bekannt. Wieder was gelernt, danke.

                    Ich habe jetzt versucht, die Logik einzusetzen, bekomme aber einen Fehler
                    Code:
                    2018-10-08  22:00:49 ERROR    logics.sequencer_wohnzimmer Logic: logics.sequencer_wohnzimmer, File: /usr/local/smarthome/logics/sequencer.py, Line: 20, Method: <module>, Exception: 'NoneType' object has no attribute 'id'
                      File "/usr/local/smarthome/logics/sequencer.py", line 20, in <module>
                    Die codezeile ist:
                    Code:
                    search_id = source_item.id()+".running"
                    Ein Item id sehe ich aber auch bei dir nicht. Hast du eine Idee?
                    Zum hsv-Resourcenproblem: Das wundert mich!


                    Gruß,
                    Hendrik

                    Kommentar


                      #11
                      Jedes Item hat die Funktion id(). Der Fehler weist darauf hin, dass das source_item kein Item ist. Entweder wird hier nichts übergeben oder ein Vertipper oder so?

                      Kommentar


                        #12
                        Hallo,

                        danke, das funktioniert erstmal. Allerdings funktioniert der Fader noch nicht.
                        Code:
                        2018-10-09  21:29:09 INFO     logics.sequencer_wohnzimmer [Sequencer] items via standard: rot = eg.Wohnzimmer.Voute.r.fading, gruen = eg.Wohnzimmer.Voute.g.fading, blau = eg.Wohnzimmer.Voute.b.fading, ww = eg.Wohnzimmer.Voute.ww.fading
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] watch item for sequencer logic: {'dest': None, 'value': True, 'by': 'Scheduler', 'source': None}
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] watch item for sequencer logic: eg.Wohnzimmer.Voute.sequencer
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] trigger item for sequencer logic: None, source item: eg.Wohnzimmer.Voute.sequencer
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] sequencer laeuft nicht.
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] sequencer nicht gesperrt, daher gehts los.
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] modus auf 1
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] step: True
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] off via config = 0
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] on via config = 255
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] random via config = 35
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] random start aus item = True
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] alle farben random start = 150
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] setze farben random start = 150
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] random start fuer rot = 150, fuer gruen = 150, fuer blau = 150, fuer ww = 150 (variation: 0),
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] next step via calculation = 765
                        2018-10-09  21:41:55 INFO     logics.sequencer_wohnzimmer [Sequencer] items via standard: rot = eg.Wohnzimmer.Voute.r.fading, gruen = eg.Wohnzimmer.Voute.g.fading, blau = eg.Wohnzimmer.Voute.b.fading, ww = eg.Wohnzimmer.Voute.ww.fading
                        Hast du mal meinen HSV-Dimmer ausprobiert?
                        Läuft hier gerade. Gefällt mir gut. V.a. weil man auch ganz leicht die Sättigung und die Helligkeit in der Visu ändern kann.

                        Gruß,
                        Hendrik

                        Kommentar


                          #13
                          HSV hab ich noch nicht getestet, du meinst den vom import in logic Thread? Vielleicht magst ja doch noch kombinieren ?

                          Ich weiß jetzt nicht genau, was mit dem obigen Log anzufangen ist. Nach dem letzten INFO passiert einfach nichts? Hast du darauf geachtet, dass das Item, das gefadet wird, kein knx_listen oder sonst irgendeine Änderung von Außen bekommt? Was sagt's debug log vom lib.item bzw. scheduler?

                          Kommentar


                            #14
                            Hallo,

                            ja, die aus dem Logic-Thread.
                            Kombinieren war von Anfang an mein Ziel. Aber ich bin nicht sicher, ob das Sinn macht:
                            - Die Items sollten unterschiedlich heißen.
                            - Die Steps sind nicht nötig
                            - Ein Faden ist auch nicht unbedingt nötig. Momentan rufe ich die Logik alle 10s auf. Das Dimmen macht das Dali-Gerät und sorgt damit für einen sanften Übergang.

                            Was meinst du? Probier doch mal aus. Dann hast du den Vergleich.

                            Zu meinem Log: Ja, nach dem letzten Info passiert nix mehr.
                            Zum Wert von Außen:
                            Ich denke ja:
                            Code:
                                        b:
                                            type: bool
                                            knx_cache: 1/1/174
                                            knx_send: 1/1/173
                                            knx_dpt: 1
                            
                                            Dimmwert:
                                                type: num
                                                knx_cache: 1/1/176
                                                knx_send: 1/1/175
                                                knx_dpt: '5.001'
                            
                                            RelativDimmen:
                                                type: num
                                                knx_dpt: 3
                            
                                            fading:
                                                knx_send: 1/1/175
                                                knx_dpt: 5
                                                visu_acl: rw
                                                type: num
                                                enforce_updates: 'yes'
                            Gruß,
                            Hendrik

                            Kommentar


                              #15
                              Mach doch ein paar Log-Einträge an den relevanten Stellen um zu gucken, woran es liegen kann.
                              Code:
                               if sh.return_item(logic.watch_item[0])() :    #wenn watch_item gesetzt ist startet ablauf (1-2-3-4-2-3-4-2-3-4-.....)
                                  logger.info(modus)
                                  # modus 0, standard
                                  if modus == 0:
                              Den hsv Dimmer schau ich mir mal an. Ich hab bei der Logik die ganzen random, startup, etc Features eingebaut, weil es sonst nicht so prickelnd ausgesehen hat. Wenn dann würd ich mir hier also noch ein paar Optionen einbauen. Aber mal checken, wie es funzt, thx.

                              Kommentar

                              Lädt...
                              X