Passed
Push — smart_home ( 9fecf3...8adc8c )
by Matt
01:26
created

PyDMXControl.smart.HomeKitLight.get_hue()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
import signal
2
from colorsys import hsv_to_rgb, rgb_to_hsv
3
from threading import Thread
4
5
from pyhap.accessory import Accessory, Bridge
6
from pyhap.accessory_driver import AccessoryDriver
7
from pyhap.const import CATEGORY_LIGHTBULB
8
9
10
class HomeKitLight(Accessory):
11
    category = CATEGORY_LIGHTBULB
12
13
    def __init__(self, fixture, *args, **kwargs):
14
15
        super().__init__(*args, **kwargs)
16
17
        serv_light = self.add_preload_service(
18
            'Lightbulb', chars=['On', 'Hue', 'Saturation', 'Brightness'])
19
20
        # Set our instance variables
21
        self.fixture = fixture
22
        self.accessory_state = self.get_state()  # State of On/Off
23
        self.hue = self.get_hue()  # Hue Value 0 - 360 Homekit API
24
        self.saturation = self.get_saturation()  # Saturation Values 0 - 100 Homekit API
25
        self.brightness = self.get_brightness()  # Brightness value 0 - 100 Homekit API
26
27
        # Configure our callbacks
28
        self.char_on = serv_light.configure_char(
29
            'On', setter_callback=self.set_state, getter_callback=self.get_state)
30
        self.char_hue = serv_light.configure_char(
31
            'Hue', setter_callback=self.set_hue, getter_callback=self.get_hue)
32
        self.char_saturation = serv_light.configure_char(
33
            'Saturation', setter_callback=self.set_saturation, getter_callback=self.get_saturation)
34
        self.char_on = serv_light.configure_char(
35
            'Brightness', setter_callback=self.set_brightness, getter_callback=self.get_brightness)
36
37
    def set_state(self, value):
38
        self.accessory_state = value
39
        if value == 1:  # On
40
            self.set_brightness(100)
41
        else:  # Off
42
            self.set_brightness(0)
43
44
    def get_state(self):
45
        self.accessory_state = 1 if self.get_brightness() > 0 else 0
46
        return self.accessory_state
47
48
    def set_color(self):
49
        h = self.hue / 360
50
        s = self.saturation / 100
51
        r, g, b = hsv_to_rgb(h, s, 1)
52
        self.fixture.color([r * 255, g * 255, b * 255])
53
54
    def get_color(self):
55
        return self.fixture.get_color()[:3]
56
57
    def set_brightness(self, value):
58
        self.accessory_state = 1 if value > 0 else 0
59
        self.brightness = value
60
        self.fixture.dim(self.brightness * 255 / 100)
61
62
    def get_brightness(self):
63
        return self.fixture.get_channel_value(self.fixture.get_channel_id("dimmer"))[0] * 100 / 255
64
65
    def set_hue(self, value):
66
        self.hue = value
67
        self.set_color()
68
69
    def get_hue(self):
70
        h, s, v = rgb_to_hsv(*self.get_color())
71
        return h * 360
72
73
    def set_saturation(self, value):
74
        self.saturation = value
75
        self.set_color()
76
77
    def get_saturation(self):
78
        h, s, v = rgb_to_hsv(*self.get_color())
79
        return s * 100
80
81
82
def run(controller):
83
    start_port = 51826
84
    driver = AccessoryDriver(port=start_port)
85
    bridge = Bridge(driver, 'PyDMXControl')
86
87
    for i, fixture in enumerate(controller.get_all_fixtures()):
88
        print(fixture.name)
89
        bridge.add_accessory(HomeKitLight(fixture, driver, fixture.name))
90
91
    signal.signal(signal.SIGTERM, driver.signal_handler)
92
    driver.add_accessory(accessory=bridge)
93
94
    thread = Thread(target=driver.start)
95
    thread.daemon = True
96
    thread.start()
97