You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tinge/main.py

170 lines
5.7 KiB

from logging import disable
import kivy
kivy.require('2.2.1')
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.stacklayout import StackLayout
from tinge import HueBridge, HueGroup, HueUtils, Tinge
class HueApp(App):
def build(self):
self.tinge = Tinge()
sm = ScreenManager()
sm.add_widget(BridgeScreen(sm, self.tinge, name='bridge_screen'))
return sm
class GroupScreen(Screen):
def __init__(self, sm, tinge, id: int, bridge: HueBridge, **kwargs):
super(GroupScreen, self).__init__(**kwargs)
self.sm = sm
self.tinge = tinge
self.id = id
self.group = bridge.get_group_by_id(id)
self.bridge = bridge
self.layout = StackLayout()
self.add_widget(self.layout)
for button in self.get_light_buttons():
self.layout.add_widget(button)
def get_light_buttons(self):
buttons = []
for light in self.group.get_lights():
button = Button(text=str(light),
size_hint=(1, 0.1),
on_press=lambda _: self.press_button(light))
buttons.append(button)
backbutton = Button(text="Back",
size_hint=(1, 0.1),
on_press=lambda _: self.press_back_button())
buttons.append(backbutton)
return buttons
def press_back_button(self):
self.sm.current = "bridge_" + str(self.bridge.id)
def press_button(self, light):
print(button, light)
class SingleBridgeScreen(Screen):
def __init__(self, sm, tinge, bridge: HueBridge, **kwargs):
super(SingleBridgeScreen, self).__init__(**kwargs)
self.sm = sm
self.tinge = tinge
self.bridge = bridge
self.layout = StackLayout()
self.add_widget(self.layout)
self.groups = []
for group in self.bridge.get_groups():
self.layout.add_widget(self.get_group_button(group))
self.layout.add_widget(
Button(text="Back",
size_hint=(1, 0.1),
on_press=lambda _: self.press_back_button()))
def get_group_button(self, group):
button = Button(text=str(group), size_hint=(1, 0.1))
button.bind(on_press=lambda _: self.press_button(group.get_id()))
return button
def press_back_button(self):
self.sm.current = "bridge_screen"
def press_button(self, group: int):
print(group)
group_name: str = 'group_' + str(group)
group_screen = GroupScreen(self.sm,
self.tinge,
group,
self.bridge,
name=group_name)
if not self.sm.has_screen(group_name):
self.sm.add_widget(group_screen)
self.sm.current = group_name
class BridgeScreen(Screen):
bridges = []
layout = BoxLayout()
def __init__(self, sm, tinge, **kwargs):
super(BridgeScreen, self).__init__(**kwargs)
self.sm = sm
self.tinge = tinge
for bridge_button in self.get_bridge_buttons():
self.layout.add_widget(bridge_button)
def press_button(self, bridge):
bridge_name = "bridge_" + str(bridge.id)
if not self.sm.has_screen(bridge_name):
self.sm.add_widget(
SingleBridgeScreen(self.sm,
self.tinge,
bridge,
name=bridge_name))
self.sm.current = bridge_name
def discover_bridge(self):
bridges = self.tinge.discover_new_bridges()
if bridges:
for bridge in bridges:
print(bridge)
if not self.tinge.bridge_discovered(bridge['ipaddress']):
# Display popup lable to add bridge and get username
popup = Popup(title='Connect Bridge',
size_hint=(None, None),
size=(400, 400))
new_bridge_button = Button(
text='Press button on Bridge',
size_hint=(1, 0.1),
on_press=lambda _: self.wait_for_button_press(
popup, bridge['ipaddress']))
popup.add_widget(new_bridge_button)
popup.open()
def wait_for_button_press(self, popup, ipaddress):
bridge_id = len(self.tinge.get_bridges())
user_or_error = HueUtils.connect(ipaddress)
while user_or_error.is_error():
user_or_error = HueUtils.connect(ipaddress)
self.tinge.append_bridge(
HueBridge(bridge_id, ipaddress, user_or_error.get_user(),
ipaddress))
self.tinge.write_all_bridges_to_conf()
popup.dismiss()
def get_bridge_buttons(self):
buttons = []
bridges = self.tinge.get_bridges()
for bridge in bridges:
bridge_button = Button(
text=str(bridge.get_ipaddress()),
size_hint=(1, 0.1),
on_press=lambda _: self.press_button(bridge))
buttons.append(bridge_button)
bridge_button = Button(text='Discover Bridges',
size_hint=(1, 0.1),
on_press=lambda _: self.discover_bridge())
buttons.append(bridge_button)
sizer = Label(disabled=True)
buttons.append(sizer)
return buttons
if __name__ == '__main__':
HueApp().run()