11from dataclasses import dataclass
22
33ColourDict = dict [str , int ]
4- ColourTuple = tuple [int , int , int ] | tuple [int , int , int , int ]
5- TwinklyColourTuple = tuple [int , int , int ] | tuple [int , int , int , int ]
4+ ColourTuple = tuple [int , int , int ] | tuple [int , int , int , int ] | tuple [ int , int , int , int , int ]
5+ TwinklyColourTuple = tuple [int , int , int ] | tuple [int , int , int , int ] | tuple [ int , int , int , int , int ]
66
77
88@dataclass (frozen = True )
@@ -11,17 +11,26 @@ class TwinklyColour:
1111 green : int
1212 blue : int
1313 white : int | None = None
14+ cold_white : int | None = None
15+
16+ def __post_init__ (self ):
17+ if self .cold_white is not None and self .white is None :
18+ raise ValueError ("cold_white requires white to be set" )
1419
1520 def as_twinkly_tuple (self ) -> TwinklyColourTuple :
16- """Convert TwinklyColour to a tuple as used by Twinkly: (R,G,B) or (W,R,G,B)"""
17- if self .white is not None :
21+ """Convert TwinklyColour to a tuple as used by Twinkly: (R,G,B), (W,R,G,B) or (CW,W,R,G,B)"""
22+ if self .cold_white is not None and self .white is not None :
23+ return (self .cold_white , self .white , self .red , self .green , self .blue )
24+ elif self .white is not None :
1825 return (self .white , self .red , self .green , self .blue )
1926 else :
2027 return (self .red , self .green , self .blue )
2128
2229 def as_tuple (self ) -> ColourTuple :
23- """Convert TwinklyColour to a tuple: (R,G,B) or (R,G,B,W)"""
24- if self .white is not None :
30+ """Convert TwinklyColour to a tuple: (R,G,B), (R,G,B,W) or (R,G,B,W,CW)"""
31+ if self .cold_white is not None and self .white is not None :
32+ return (self .red , self .green , self .blue , self .white , self .cold_white )
33+ elif self .white is not None :
2534 return (self .red , self .green , self .blue , self .white )
2635 else :
2736 return (self .red , self .green , self .blue )
@@ -31,20 +40,22 @@ def __iter__(self):
3140
3241 def as_dict (self ) -> ColourDict :
3342 """Convert TwinklyColour to a dict wth color names used by set-led functions."""
34- if self .white is not None :
35- return {
36- "red" : self .red ,
37- "green" : self .green ,
38- "blue" : self .blue ,
39- "white" : self .white ,
40- }
41- else :
42- return {"red" : self .red , "green" : self .green , "blue" : self .blue }
43+ return {
44+ "red" : self .red ,
45+ "green" : self .green ,
46+ "blue" : self .blue ,
47+ ** ({"white" : self .white } if self .white is not None else {}),
48+ ** ({"cold_white" : self .cold_white } if self .cold_white is not None else {}),
49+ }
4350
4451 @classmethod
4552 def from_twinkly_tuple (cls , t ):
46- if len (t ) == 4 :
47- return cls (red = t [1 ], green = t [2 ], blue = t [3 ], white = t [0 ])
48- elif len (t ) == 3 :
49- return cls (red = t [0 ], green = t [1 ], blue = t [2 ])
50- raise TypeError ("Unknown colour format" )
53+ match len (t ):
54+ case 5 :
55+ return cls (red = t [2 ], green = t [3 ], blue = t [4 ], white = t [1 ], cold_white = t [0 ])
56+ case 4 :
57+ return cls (red = t [1 ], green = t [2 ], blue = t [3 ], white = t [0 ])
58+ case 3 :
59+ return cls (red = t [0 ], green = t [1 ], blue = t [2 ])
60+ case _:
61+ raise TypeError ("Unknown colour format" )
0 commit comments