annotate color.py @ 29:35affd4d37d4 default tip

add 1st ikea color light
author drewp@bigasterisk.com
date Sat, 14 Dec 2024 22:36:29 -0800
parents ab80e8826441
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
1 import logging
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
2 from dataclasses import dataclass
4
e8e4fd6d5619 refactor
drewp@bigasterisk.com
parents:
diff changeset
3
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
4 from dataclasses_json import DataClassJsonMixin
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
5
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
6 log = logging.getLogger('colr')
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
7
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
9 def lerp(a, b, t):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
10 return (1 - t) * a + (t) * b
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
11
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
12
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
13 @dataclass(frozen=True)
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
14 class Color(DataClassJsonMixin):
16
drewp@bigasterisk.com
parents: 9
diff changeset
15 """This is a target color that should look "the same" on all lights you send
drewp@bigasterisk.com
parents: 9
diff changeset
16 it to. We convert it somehow to a DeviceColor which has the color
drewp@bigasterisk.com
parents: 9
diff changeset
17 coordinates (maybe not RGB) that get sent to a light."""
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
18 r: float
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
19 g: float
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
20 b: float
4
e8e4fd6d5619 refactor
drewp@bigasterisk.com
parents:
diff changeset
21
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
22 def __post_init__(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
23 super().__setattr__('r', max(0, min(1, self.r)))
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
24 super().__setattr__('g', max(0, min(1, self.g)))
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
25 super().__setattr__('b', max(0, min(1, self.b)))
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
26
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
27 def __repr__(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
28 return f'(Color(r={self.r:.3f}, g={self.g:.3f}, b={self.b:.3f}))'
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
29
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
30 def avg(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
31 return (self.r + self.g + self.b) / 3
4
e8e4fd6d5619 refactor
drewp@bigasterisk.com
parents:
diff changeset
32
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
33 def mix(self, other, x):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
34 return Color(
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
35 lerp(self.r, other.r, x),
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
36 lerp(self.g, other.g, x),
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
37 lerp(self.b, other.b, x),
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
38 )
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
39
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
40 def hex(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
41 r, g, b = int(self.r * 255), int(self.g * 255), int(self.b * 255)
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
42 return '#%02x%02x%02x' % (r, g, b)
9
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
43
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
44 @classmethod
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
45 def fromHex(cls, h: str):
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
46 return cls(
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
47 r=int(h[1:3], 16) / 255,
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
48 g=int(h[3:5], 16) / 255,
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
49 b=int(h[5:7], 16) / 255,
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
50 )