Ankündigung

Einklappen
Keine Ankündigung bisher.

User-Funktion Color Converter

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

    User-Funktion Color Converter

    Seit Ewigkeiten nervt es mich, dass die RGBW-Stripes wenig Unnterstützung finden, weil man die Farben nicht so mischen kann, wie man will. Das W bleibt in der Regel außen vor. Und so habe ich das in Logiken umgesetzt gehabt, war aber auch nicht so happy damit. Nun habe ich versucht das Ganze in User-Funktionen zu packen. Die sind wesentlich flexibler einsetzbar. Wer will kann gerne mal testen. ich plane das noch zu erweitern. Es gibt auch Umwandlunsgmöglichkeiten von RGBtoHSV usw.

    /functions/cc.py

    Code:
    #
    # Author: Ronny Schulz
    #
    import colorsys
    import logging
    _logger = logging.getLogger(__name__)
    
    _VERSION     = '0.0.1'
    _DESCRIPTION = 'Color Converter'
    
    # RGB to HSV color converter
    def RGBtoHSV(r, g, b):
        myHSV = colorsys.rgb_to_hsv(r/255, b/255, g/255)
        return [round(myHSB[0]*255), round(myHSB[1]*255), round(myHSB[2]*255)]
    
    def RGBtoHSV_H(r, g, b):
        myHSV = colorsys.rgb_to_hsv(r/255, b/255, g/255)
        return round(myHSB[0]*255)
    
    def RGBtoHSV_S(r, g, b):
        myHSV = colorsys.rgb_to_hsv(r/255, b/255, g/255)
        return round(myHSB[1]*255)
    
    def RGBtoHSV_V(r, g, b):
        myHSV = colorsys.rgb_to_hsv(r/255, b/255, g/255)
        return round(myHSB[2]*255)
    
    # HSV to RGB color converter
    def HSVtoRGB(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        return [round(myRGB[0]*255), round(myRGB[1]*255), round(myRGB[2]*255)]
    
    def HSVtoRGB_R(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        return round(myRGB[0]*255)
    
    def HSVtoRGB_G(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        return round(myRGB[1]*255)
    
    def HSVtoRGB_B(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        return round(myRGB[2]*255)
    
    # HSV to RGBW color converter
    def HSVtoRGBW(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        myRGBr = myRGB[0]
        myRGBg = myRGB[1]
        myRGBb = myRGB[2]
        myRGBw = abs(s-100)/100*v/100
        mincol = min(myRGBr, myRGBg, myRGBb)
        minwhite = min(mincol, myRGBw)
        myRGBr -= minwhite
        myRGBg -= minwhite
        myRGBb -= minwhite
        return [round(myRGBr*255), round(myRGBg*255), round(myRGBb*255), round(myRGBw*255)]
    
    def HSVtoRGBW_R(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        myRGBr = myRGB[0]
        myRGBg = myRGB[1]
        myRGBb = myRGB[2]
        myRGBw = abs(s-100)/100*v/100
        mincol = min(myRGBr, myRGBg, myRGBb)
        minwhite = min(mincol, myRGBw)
        myRGBr -= minwhite
        myRGBg -= minwhite
        myRGBb -= minwhite
        return round(myRGBr*255)
    
    def HSVtoRGBW_G(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        myRGBr = myRGB[0]
        myRGBg = myRGB[1]
        myRGBb = myRGB[2]
        myRGBw = abs(s-100)/100*v/100
        mincol = min(myRGBr, myRGBg, myRGBb)
        minwhite = min(mincol, myRGBw)
        myRGBr -= minwhite
        myRGBg -= minwhite
        myRGBb -= minwhite
        return round(myRGBg*255)
    
    def HSVtoRGBW_B(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        myRGBr = myRGB[0]
        myRGBg = myRGB[1]
        myRGBb = myRGB[2]
        myRGBw = abs(s-100)/100*v/100
        mincol = min(myRGBr, myRGBg, myRGBb)
        minwhite = min(mincol, myRGBw)
        myRGBr -= minwhite
        myRGBg -= minwhite
        myRGBb -= minwhite
        return round(myRGBb*255)
    
    def HSVtoRGBW_W(h, s, v):
        myRGB = colorsys.hsv_to_rgb(h/360, s/100, v/100)
        myRGBr = myRGB[0]
        myRGBg = myRGB[1]
        myRGBb = myRGB[2]
        myRGBw = abs(s-100)/100*v/100
        mincol = min(myRGBr, myRGBg, myRGBb)
        minwhite = min(mincol, myRGBw)
        myRGBr -= minwhite
        myRGBg -= minwhite
        myRGBb -= minwhite
        return round(myRGBw*255)
    Umsetzung in den Items:

    Anmerkung: Der Listenwert (HSV oder RGB) ist natürlich für die Funktion nicht notwendig. Es ist aber eine Ausgabe als Liste oder als Einzelwerte möglich. Und auch das on_change ist natürlich nicht zwingend notwendig, wenn man das direkt ins richtige Item einbaut. Das war hier nur zu Testzwecken so gemacht.

    Code:
        Farbtest_HSVtoRGBW:
            HSV:
                type: list
                eval: "[sh..H(), sh..S(), sh..V()]"
                eval_trigger:
                    - .H
                    - .S
                    - .V
                H:
                    type: num
                    initial_value: 0
                    visu_acl: rw
                S:
                    type: num
                    initial_value: 0
                    visu_acl: rw
                V:
                    type: num
                    initial_value: 0
                    visu_acl: rw
                RGBW:
                    type: list
                    eval: uf.cc.HSVtoRGBW(sh...H(), sh...S(), sh...V())
                    eval_trigger:
                        - ..H
                        - ..S
                        - ..V
                    R:
                        type: num
                        initial_value: 0
                        eval: uf.cc.HSVtoRGBW_R(sh....H(), sh....S(), sh....V())
                        eval_trigger:
                            - ...H
                            - ...S
                            - ...V
                        on_change: EG.Diele.DALI.Decke.R.Dimmwert = value
                    G:
                        type: num
                        initial_value: 0
                        eval: uf.cc.HSVtoRGBW_G(sh....H(), sh....S(), sh....V())
                        eval_trigger:
                            - ...H
                            - ...S
                            - ...V
                        on_change: EG.Diele.DALI.Decke.G.Dimmwert = value
                    B:
                        type: num
                        initial_value: 0
                        eval: uf.cc.HSVtoRGBW_B(sh....H(), sh....S(), sh....V())
                        eval_trigger:
                            - ...H
                            - ...S
                            - ...V
                        on_change: EG.Diele.DALI.Decke.B.Dimmwert = value
                    WW:
                        type: num
                        initial_value: 0
                        eval: uf.cc.HSVtoRGBW_W(sh....H(), sh....S(), sh....V())
                        eval_trigger:
                            - ...H
                            - ...S
                            - ...V
                        on_change: EG.Diele.DALI.Decke.WW.Dimmwert = value

    #2
    Gute Idee.. hast du versucht, das in die smartVISU einzubinden? Geht das dort einfach mit den HSV Slidern dann..?

    Kommentar


      #3
      Zitat von Onkelandy Beitrag anzeigen
      Gute Idee.. hast du versucht, das in die smartVISU einzubinden? Geht das dort einfach mit den HSV Slidern dann..?
      Genau, geht so, wie du sagst. Ich stelle in der VISU mit HSV ein und er gibt das in RGBW zurück. Vor allem mit dem ColorWheel ist es sehr schön. Das hellste blau ist dann kaltweiß und weiß ist warmweiß.

      Code:
      LED-Beleuchtung{{ basic.color('', 'Allgemein.Farbtest_HSVtoRGBW.HSV.H', 'Allgemein.Farbtest_HSVtoRGBW.HSV.S', 'Allgemein.Farbtest_HSVtoRGBW.HSV.V', '', '', '', '', '', 'hsv') }}<
      Wenn man allerdings das Colorwheel sieht ist der weiße bereich viel größer. Man könnte das eigentlich so umbauen, dass man dann direkt warm und kaltweiß auswählen kann. Ich werde mich späte rmal mitd em Kram noch mal beschäftigen...
      Zuletzt geändert von Cannon; 03.03.2022, 17:46.

      Kommentar


        #4
        Wenn man allerdings das Colorwheel sieht ist der weiße bereich viel größer. Man könnte das eigentlich so umbauen, dass man dann direkt warm und kaltweiß auswählen kann. Ich werde mich späte rmal mitd em Kram noch mal beschäftigen...

        Kommentar


          #5
          Gute Idee!

          Kommentar

          Lädt...
          X