#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json from datetime import datetime import requests from ..HueUtils import make_request class HueLight: class State: def __init__(self, data_slice: dict): keys = data_slice.keys() self.m_on: bool = data_slice['on'] if 'bri' in keys: self.m_bri: int = data_slice['bri'] else: self.m_bri: int = 0 if 'ct' in keys: self.m_ct: int = data_slice['ct'] else: self.m_ct: int = 0 self.m_alert: str = data_slice['alert'] if 'colormode' in keys: self.m_colormode: str = data_slice['colormode'] else: self.m_colormode: str = "" self.m_mode: str = data_slice['mode'] self.m_reachable: bool = data_slice['reachable'] def is_on(self) -> bool: return self.m_on def is_reachable(self) -> bool: return self.m_reachable class SwUpdate: def __init__(self, data_slice: dict): self.m_state: str = data_slice['state'] self.m_lastinstall: datetime = datetime.strptime(data_slice['lastinstall'], "%Y-%m-%dT%H:%M:%S") class Capabilites: class Control: class ColorTemp: def __init__(self, data_slice: dict): keys = data_slice.keys() if 'min' in keys: self.m_min: int = data_slice['min'] else: self.m_min: int = 0 if 'max' in keys: self.m_max: int = data_slice['max'] else: self.m_max: int = 0 def __init__(self, data_slice: dict): keys = data_slice.keys() if 'mindimlevel' in keys: self.m_mindimlevel: int = data_slice['mindimlevel'] else: self.m_mindimlevel: int = 0 if 'maxlumen' in keys: self.m_maxlumen: int = data_slice['maxlumen'] else: self.m_maxlumen: int = 0 if 'ct' in data_slice.keys(): self.m_ct = HueLight.Capabilites.Control.ColorTemp(data_slice['ct']) else: self.m_ct = HueLight.Capabilites.Control.ColorTemp({}) class Streaming: def __init__(self, data_slice: dict): self.m_renderer: bool = data_slice['renderer'] self.m_proxy: bool = data_slice['proxy'] def __init__(self, data_slice: dict): self.m_certified: bool = data_slice['certified'] self.m_control = HueLight.Capabilites.Control(data_slice['control']) self.m_streaming = HueLight.Capabilites.Streaming(data_slice['streaming']) class Config: class Startup: def __init__(self, data_slice: dict): self.m_mode: str = data_slice['mode'] self.m_configured: bool = data_slice['configured'] def __init__(self, data_slice: dict): self.m_archetype: str = data_slice['archetype'] self.m_function: str = data_slice['function'] self.m_direction: str = data_slice['direction'] self.m_startup = HueLight.Config.Startup(data_slice['startup']) def __init__(self, id: int, data: dict, parent_bridge_ip: str, parent_bridge_user: str): self.m_id: int = id self.m_parent_bridge_ip = parent_bridge_ip self.m_parent_bridge_user = parent_bridge_user self.m_state = HueLight.State(data['state']) self.m_swupdate = HueLight.SwUpdate(data['swupdate']) self.m_type: str = data['type'] self.m_name: str = data['name'] self.m_modelid: str = data['modelid'] self.m_manufacturername: str = data['manufacturername'] self.m_productname: str = data['productname'] self.m_capabilites = HueLight.Capabilites(data['capabilities']) self.m_config = HueLight.Config(data['config']) self.m_uniqueid: str = data['uniqueid'] self.m_swconfigid: str = data['swconfigid'] self.m_productid: str = data['productid'] def __str__(self) -> str: return self.m_name def get_state(self): return self.m_state def get_id(self): return self.m_id def is_on(self) -> bool: return self.get_state().is_on() def is_reachable(self) -> bool: return self.get_state().is_reachable() def set_state(self, state: str) -> requests.Response: path: str = "{}/lights/{}/state".format(self.m_parent_bridge_user, self.m_id) method: str = "PUT" response = make_request(self.m_parent_bridge_ip, path, method, state) self.update_state() return response def toggle(self): if self.is_reachable(): state: str = '{"on":true}' if self.is_on(): state = '{"on":false}' self.set_state(state) def update_state(self): path: str = "{}/lights/{}".format(self.m_parent_bridge_user, self.m_id) response = make_request(self.m_parent_bridge_ip, path) self.m_state = HueLight.State(json.loads(response.text)['state'])