Ankündigung

Einklappen
Keine Ankündigung bisher.

RGB Fader

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

    #31
    Kein Thema, ist aber kein schöner Code.

    Startwerte:
    Code:
        if mode() == 1:    # cool colours
                sh.og.colour_master.cycler.mode.r_up_limit(sh.og.colour_master.cycler.level()/2)
                sh.og.colour_master.cycler.mode.g_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.b_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.r_lo_limit(0)
                sh.og.colour_master.cycler.mode.g_lo_limit(0)
                sh.og.colour_master.cycler.mode.b_lo_limit(0)
        if mode() == 2:    # full colour
                sh.og.colour_master.cycler.mode.r_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.g_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.b_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.r_lo_limit(0)
                sh.og.colour_master.cycler.mode.g_lo_limit(0)
                sh.og.colour_master.cycler.mode.b_lo_limit(0)
        if mode() == 3: # Sifi
                sh.og.colour_master.cycler.mode.r_up_limit(0)
                sh.og.colour_master.cycler.mode.g_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.b_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.r_lo_limit(0)
                sh.og.colour_master.cycler.mode.g_lo_limit(sh.og.colour_master.cycler.level()/2)
                sh.og.colour_master.cycler.mode.b_lo_limit(sh.og.colour_master.cycler.level()/2)
        if mode() == 4: # warm colours
                sh.og.colour_master.cycler.mode.r_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.g_up_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.b_up_limit(sh.og.colour_master.cycler.level()/2)
                sh.og.colour_master.cycler.mode.r_lo_limit(sh.og.colour_master.cycler.level())
                sh.og.colour_master.cycler.mode.g_lo_limit(0)
                sh.og.colour_master.cycler.mode.b_lo_limit(0)

    Die Schleife sieht vereinfacht so aus (Initialisierung und das Aufräumen nach Abbruch habe ich für die Übersicht weg gelassen):

    Code:
            while sh.og.colour_master.cycler():
                while sh.og.colour_master.cycler() and mode() == 1:   # cool colours             
                    while green < g_up_limit() and sh.og.colour_master.cycler() and mode() == 1:        
                        green = green + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                    while blue > b_lo_limit() and sh.og.colour_master.cycler() and mode() == 1:
                        blue = blue - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)                                
                    while red < r_up_limit() and sh.og.colour_master.cycler() and mode() == 1:
                        red = red + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)                
                    while blue < b_up_limit() and sh.og.colour_master.cycler() and mode() == 1:
                        blue = blue + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                    while red > r_lo_limit() and sh.og.colour_master.cycler() and mode() == 1:
                        red = red - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)                    
                        time.sleep(sh.og.colour_master.cycler.speed()/100)                    
                    while green > g_lo_limit() and sh.og.colour_master.cycler() and mode() == 1:
                        green = green - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
    
                while sh.og.colour_master.cycler() and mode() == 2:        # full colour        
                    while green < g_up_limit() and sh.og.colour_master.cycler() and mode() == 2:        
                        green = green + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                    while red > r_lo_limit() and sh.og.colour_master.cycler() and mode() == 2:
                        red = red - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)                                    
                    while blue < b_up_limit() and sh.og.colour_master.cycler() and mode() == 2:
                        blue = blue + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)                
                    while green > g_lo_limit() and sh.og.colour_master.cycler() and mode() == 2:
                        green = green - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)                
                    while red < r_up_limit() and sh.og.colour_master.cycler() and mode() == 2:
                        red = red + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)                
                    while blue > b_lo_limit() and sh.og.colour_master.cycler() and mode() == 2:
                        blue = blue - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
    
                while sh.og.colour_master.cycler() and mode() == 3:     # Sifi
                    while red > r_lo_limit() and sh.og.colour_master.cycler() and mode() == 3:
                        red = red - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)        
                    while sh.og.colour_master.cycler() and mode() == 3:
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                        if blue < b_up_limit():
                            blue = blue + 1
                            white = getwhite(red,green,blue)
                            write2dmx(sh, red, green, blue, white)
                        if green > g_lo_limit():
                            green = green - 1
                            white = getwhite(red,green,blue)
                            write2dmx(sh, red, green, blue, white)
                        if blue >= b_up_limit() and green <= g_lo_limit():
                            break
                    while sh.og.colour_master.cycler() and mode() == 3:
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                        if blue > b_lo_limit():
                            blue = blue - 1
                            white = getwhite(red,green,blue)
                            write2dmx(sh, red, green, blue, white)
                        if green < g_up_limit():
                            green = green + 1
                            white = getwhite(red,green,blue)
                            write2dmx(sh, red, green, blue, white)
                        if blue <= b_lo_limit() and green >= g_up_limit():
                            break
    
                while sh.og.colour_master.cycler() and mode() == 4:    # warm colours
                    while red < r_up_limit() and sh.og.colour_master.cycler() and mode() == 4:
                        red = red + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                    while blue < b_up_limit() and sh.og.colour_master.cycler() and mode() == 4:
                        blue = blue + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)            
                    while green < g_up_limit() and sh.og.colour_master.cycler() and mode() == 4:        
                        green = green + 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                    while red > r_lo_limit() and sh.og.colour_master.cycler() and mode() == 4:
                        red = red - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
                    while blue > b_lo_limit() and sh.og.colour_master.cycler() and mode() == 4:
                        blue = blue - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)            
                    while green > g_lo_limit() and sh.og.colour_master.cycler() and mode() == 4:
                        green = green - 1
                        white = getwhite(red,green,blue)
                        write2dmx(sh, red, green, blue, white)
                        time.sleep(sh.og.colour_master.cycler.speed()/100)
    hth

    Kommentar


      #32
      Zitat von Onkelandy Beitrag anzeigen
      Jup, das mit dem +1 hatte ich auch bemerkt.. Jetzt funktioniert soweit mal alles wie es soll. Am Code kann man sicher viel optimieren, vermutlich sind auch übertrieben viele try drin mit viel Debugcode, aber kann ja jeder säubern wie er will

      Hier die Items:
      Code:
      ['wohnen']
      [['led_vorhang']]
      type = foo
      [[['R']]]
      # nehm ich zum Schalten
      [[[['dimmen']]]]
      knx_send = 3/6/27
      knx_dpt = 5
      visu_acl = rw
      type = num
      #knx_init = 3/6/28
      cache = True
      enforce_updates = yes
      [[['G']]]
      # nehm ich zum Schalten
      [[[['dimmen']]]]
      knx_send = 3/6/31
      knx_dpt = 5
      visu_acl = rw
      type = num
      #knx_init = 3/6/32
      cache = True
      enforce_updates = yes
      [[['B']]]
      # nehm ich zum Schalten
      [[[['dimmen']]]]
      knx_send = 3/6/35
      knx_dpt = 5
      visu_acl = rw
      type = num
      #knx_init = 3/6/36
      cache = True
      enforce_updates = yes
      
      [[['sequencer']]]
      knx_listen = 3/6/94
      knx_dpt = 1
      visu_acl = rw
      type = bool
      cache = True
      enforce_updates = yes
      [[[['uzsu']]]]
      type = dict
      uzsu_item = wohnen.led_vorhang.sequencer
      cache = True
      visu_acl = rw
      Hier die logic.conf:
      Code:
      ​[Sequencer_Wohnen]
      filename = sequencer.py
      watch_item = wohnen.led_vorhang.sequencer
      stepping = 2 # OPTIONAL. Ohne Angabe nimmt die Logik 5 als Standardwert
      timedelta = 10 # OPTIONAL. Ohne Angabe nimmt die Logik 1 als Standardwert
      randomchanger = 35 # OPTIONAL. On und Off-Wert werden um diesen Wert randomisiert. Rand(off, off+randomchanger)
      randomstart = 150 # OPTIONAL. G und B werden auf random +-50 diesen Wert gesetzt, um nicht immer mit nem dunklen Rot zu starten.
      off_value = 0 # OPTIONAL. Standardwert 0
      on_value = 255 # OPTIONAL. Standardwert 255
      off_fade = 10 # OPTIONAL. Sanftes deaktivieren des Faders/Sequencers in Sekunden. Sonst wird direkt ausgeschaltet.
      R = R.dimmen # Child-Item, das gefadet werden soll. Kann auch in der Logik angepasst werden.
      G = G.dimmen
      B = B.dimmen
      Und hier die Logik. Optimierungshinweise herzlich willkommen
      Code:
      #!/usr/bin/env python
      #
      logger.info(trigger)
      
      source_item = sh.return_item(trigger['source'])
      logger.debug("Source Item for Sequencer Logic: {0}".format(source_item))
      
      
      if sh.return_item(logic.watch_item[0])() : # Variablen werden nur gesetzt/gecheckt, wenn Sequencer eingeschaltet wird
      
      step = trigger['value']
      logger.debug("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.debug("Off via Config = {0}".format(off))
      except:
      off = 0
      logger.debug("Off via Standard = 0")
      
      # Ein-Wert wird entweder als off in logic.conf definiert oder automatisch auf 255 gesetzt
      try:
      on = int(logic.on_value)
      logger.debug("On via Config = {0}".format(on))
      except:
      on = 255
      logger.debug("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.debug("Werte in Config verdreht. Off nach Korrektur = {0}, On nach Korrektur = {1}".format(off, on))
      
      # 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.debug("Random via Config = {0}".format(rand))
      except:
      rand = 'no'
      
      # 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.debug("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.debug("Keine Zufallswerte gewuenscht. Off = {0}, On = {1}".format(off,on))
      else:
      rand = int(rand)
      
      # 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.debug("Randomspanne = {0}, Obergrenze fuer off = {4}, Untergrenze fuer on = {3}, Sequencer Werte: off {1}, on {2}".format(rand,off,on, upper, lower))
      
      # Ist Stepping nicht in der logic.conf definiert, wird der Wert auf 5 gesetzt.
      try:
      stepping = int(logic.stepping)
      logger.debug("Stepping = {0}".format(stepping))
      except:
      stepping = 5
      
      # Ist Timedelta nicht in der logic.conf definiert, wird der Wert auf 1 gesetzt.
      try:
      timedelta = int(logic.timedelta)
      logger.debug("Timedelta = {0}".format(timedelta))
      except:
      timedelta = 1
      
      # Randomstart ermoeglicht es, mit einer zufaelligen Farbe anstatt dunklem Rot zu starten.
      try:
      randomstart = logic.randomstart
      except:
      randomstart = False
      
      # Wird Randomstart ohne Wert in der logic.conf aktiviert, wird 150 als Standardwert gesetzt.
      try:
      if randomstart.lower() in ['true', 'yes', 'on']:
      randomstart = 150
      elif randomstart.lower() in ['0', 'false', 'no', 'off']:
      randomstart = 0
      else:
      randomstart = int(randomstart)
      logger.debug("Random Start = {0}".format(randomstart))
      
      except:
      if not isinstance(randomstart, int):
      logger.debug("Randomstart nicht oder falsch definiert")
      else:
      logger.debug("Randomstart wird berechnet...")
      
      # Berechnen des zufaelligen Startwerts fuer Gruen und Blau.
      if isinstance(randomstart, int) and randomstart > 0:
      random.seed()
      randomstartG = random.randint(randomstart-50, randomstart+50)
      randomstartB = random.randint(randomstart-50, randomstart+50)
      logger.debug("Random Start fuer gruen = {0}, fuer blau = {1}".format(randomstartG, randomstartB))
      else:
      logger.debug("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.debug("Next Step via Config = {0}".format(next_step))
      except:
      next_step = int(on*timedelta/stepping)
      logger.debug("Next Step via Calculation = {0}".format(next_step))
      
      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 = str(parent_item) + "." + str(logic.R)
      G = str(parent_item) + "." + str(logic.G)
      B = str(parent_item) + "." + str(logic.B)
      logger.debug("Items via Config: Rot = {0}, Gruen = {1}, Blau = {2}".format(R,G,B))
      except:
      R = str(parent_item) + ".R.dimmen"
      G = str(parent_item) + ".G.dimmen"
      B = str(parent_item) + ".B.dimmen"
      logger.debug("Items via Standard: Rot = {0}, Gruen = {1}, Blau = {2}".format(R,G,B))
      
      id = logic.name
      items = R, G, B
      
      
      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-.....)
      if step == 1:
      logger.debug("Sequencer Stufe 1")
      if randomstart:
      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.debug("Sequencer Stufe 2")
      aktuellR = sh.return_item(items[0])()
      aktuellG = sh.return_item(items[1])()
      logger.debug("R = {0}, G = {1}".format(aktuellR,aktuellG))
      sh.return_item(items[0])(aktuellR+1)
      sh.return_item(items[1])(aktuellG+1)
      sh.return_item(items[1]).fade(on,stepping,timedelta)
      sh.return_item(items[0]).fade(off,stepping,timedelta)
      step = 3
      elif step == 3:
      logger.debug("Sequencer Stufe 3")
      aktuellG = sh.return_item(items[1])()
      aktuellB = sh.return_item(items[2])()
      logger.debug("G = {0}, B = {1}".format(aktuellG,aktuellB))
      sh.return_item(items[1])(aktuellG+1)
      sh.return_item(items[2])(aktuellB+1)
      sh.return_item(items[2]).fade(on,stepping,timedelta)
      sh.return_item(items[1]).fade(off,stepping,timedelta)
      step = 4
      elif step == 4:
      logger.debug("Sequencer Stufe 4")
      aktuellR = sh.return_item(items[0])()
      aktuellB = sh.return_item(items[2])()
      logger.debug("R = {0}, B = {1}".format(aktuellR,aktuellB))
      sh.return_item(items[0])(aktuellR+1)
      sh.return_item(items[2])(aktuellB+1)
      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")
      exit()
      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.debug("Ausschalten mit Fade")
      except:
      off_fade = 'no'
      logger.debug("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.debug("Ausschaltfade in Sekunden via Config = {0}".format(off_fade))
      except:
      if not isinstance(off_fade, int):
      logger.debug("Ausschaltfade nicht oder falsch definiert")
      else:
      logger.debug("Ausschaltfade wird berechnet...{0}".format(off_fade))
      
      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 # Waere ueber timedelta wohl nobler zu loesen, aber egal...
      logger.debug("Offstep fuer {1} = {0}".format(off_step,sh.return_item(i)))
      aktuell = sh.return_item(i)()
      sh.return_item(i)(aktuell+1)
      sh.return_item(i).fade(0,off_step,off_delta)
      else:
      sh.return_item(i)(0)
      logger.debug("Sequencer deaktiviert fuer {0}".format(sh.return_item(i)))
      exit()
      Hallo

      ich habe das mal getestet...funktioniert auch soweit. Wollte aber gern folgende kleine Änderung: Wenn ich wieder deaktiviere, soll nicht abgeschalten werden...sondern der aktuelle Stand beibehalten. Dafür habe ich folgende Änderung gemacht:

      statt

      else: sh.return_item(i)(0)


      else: aktuell = sh.return_item(i)()
      sh.return_item(i)(aktuell)
      logger.debug("Sequencer deaktiviert fuer {0}".format(sh.return_item(i)))


      Sollte doch funktionieren oder? tut es jedoch nicht...es läuft dann einfach weiter..

      Gruss, Micha

      Kommentar


        #33
        Mach mal ein +1 dazu.
        aktuell = sh.return_item(i)()+1
        und lösch die Zeile am Ende
        sh.return_item(i).fade(0,off_step,off_delta)
        Zuletzt geändert von Onkelandy; 09.01.2018, 07:37.

        Kommentar

        Lädt...
        X