#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import time import toml from upnpy import UPnP from .HueBridge import HueBridge from .HueUtils import connect, is_valid_config from .UserOrError import UserOrError class Tinge: def __init__(self): self.m_bridges: list[HueBridge] = list() self.m_discovered: list[str] = list() self.m_config = os.path.join(os.environ['HOME'], ".config/tinge/config") self.create_confdir() self.read_bridges_from_file() self.discover_new_bridges() self.write_all_bridges_to_conf() def create_confdir(self): if not os.path.exists(os.path.dirname(self.m_config)): os.makedirs(os.path.dirname(self.m_config)) def discover_new_bridges(self): upnp: UPnP = UPnP() discovered_devices = upnp.discover() if not discovered_devices: print("No devices discovered at this time") return for device in discovered_devices: if device.get_friendly_name().startswith("Philips hue") and device.host not in self.m_discovered: user_or_error: UserOrError = connect(device.host) print("Is error: {}".format(str(user_or_error.is_error()))) while user_or_error.is_error(): print("Is error: {}".format(str(user_or_error.get_error_code()))) if user_or_error.get_error_code() == 101: print("Please press the button on your Hue Bridge") time.sleep(5) user_or_error = connect(device.host) bridge: HueBridge = HueBridge(device.host, user_or_error.get_user()) self.m_bridges.append(bridge) self.m_discovered.append(device.host) return def get_bridges(self): return self.m_bridges def read_bridges_from_file(self): if is_valid_config(self.m_config): with open(self.m_config, 'r') as configfile: mbridges = toml.loads(configfile.read()) for key, value in mbridges.items(): if key not in self.m_discovered: bridge: HueBridge = HueBridge(key, value['user']) self.m_bridges.append(bridge) self.m_discovered.append(key) def write_all_bridges_to_conf(self): with open(self.m_config, 'w') as configfile: for bridge in self.m_bridges: configfile.write('["{}"]\nuser = "{}"\n'.format(bridge.get_ipaddress(), bridge.get_user()))