def open_decks() -> Dict[str, Dict[str, Union[str, Tuple[int, int]]]]: """Opens and then returns all known stream deck devices""" for deck in DeviceManager.DeviceManager().enumerate(): deck.open() deck.reset() deck_id = deck.get_serial_number() decks[deck_id] = deck deck.set_key_callback(partial(_key_change_callback, deck_id)) return { deck_id: {"type": deck.deck_type(), "layout": deck.key_layout()} for deck_id, deck in decks.items() }
def __init__(self): print("Starting manager...") self._devices = [] for d in DeviceManager.DeviceManager().enumerate(): device = Device(self, d) self._devices.append(device) self._stop = False self._lock = Lock() self._msg_queue = Queue() self._backend = Backend(self) print("Started manager.")
def ensure_decks_connected() -> None: """Reconnects to any decks that lost connection. If they did, re-renders them.""" for deck_serial, deck in decks.copy().items(): if not deck.connected(): for new_deck in DeviceManager.DeviceManager().enumerate(): try: new_deck.open() new_deck_serial = new_deck.get_serial_number() except Exception as error: warn(f"A {error} error occurred when trying to reconnect to {deck_serial}") new_deck_serial = None if new_deck_serial == deck_serial: deck.close() new_deck.reset() new_deck.set_key_callback(partial(_key_change_callback, new_deck_serial)) decks[new_deck_serial] = new_deck render()
async def main(loop, config): conf_deck_brightness = config.get('streamdeck/brightness', 20) conf_deck_screensaver = config.get('streamdeck/screensaver', 0) conf_hass_host = config.get('home_assistant/host', 'localhost') conf_hass_ssl = config.get('home_assistant/ssl', False) conf_hass_port = config.get('home_assistant/port', 8123) conf_hass_pw = config.get('home_assistant/api_password') conf_hass_token = config.get('home_assistant/api_token') decks = StreamDeck.DeviceManager().enumerate() if not decks: logging.error("No StreamDeck found.") return False deck = decks[0] hass = HomeAssistantWS(ssl=conf_hass_ssl, host=conf_hass_host, port=conf_hass_port) tiles = dict() pages = dict() tile_classes = getattr(__import__("Tile"), "Tile") # Build dictionary for the tile class templates given in the config file conf_tiles = config.get('tiles', []) for conf_tile in conf_tiles: conf_tile_type = conf_tile.get('type') conf_tile_class = conf_tile.get('class') conf_tile_action = conf_tile.get('action') conf_tile_states = conf_tile.get('states') tile_states = dict() for conf_tile_state in conf_tile_states: state = conf_tile_state.get('state') tile_states[state] = conf_tile_state tiles[conf_tile_type] = { 'class': getattr(tile_classes, conf_tile_class), 'states': tile_states, 'action': conf_tile_action, } # Build dictionary of tile pages conf_screens = config.get('screens', []) for conf_screen in conf_screens: conf_screen_name = conf_screen.get('name') conf_screen_tiles = conf_screen.get('tiles') page_tiles = dict() for conf_screen_tile in conf_screen_tiles: conf_screen_tile_pos = conf_screen_tile.get('position') conf_screen_tile_type = conf_screen_tile.get('type') conf_tile_class_info = tiles.get(conf_screen_tile_type) page_tiles[tuple( conf_screen_tile_pos)] = conf_tile_class_info['class']( deck=deck, hass=hass, tile_class=conf_tile_class_info, tile_info=conf_screen_tile) pages[conf_screen_name] = page_tiles tile_manager = TileManager(deck, pages) async def hass_state_changed(data): await tile_manager.update_page(force_redraw=False) async def steamdeck_key_state_changed(deck, key, state): await tile_manager.button_state_changed(key, state) logging.info("Connecting to %s:%s...", conf_hass_host, conf_hass_port) await hass.connect(api_password=conf_hass_pw, api_token=conf_hass_token) deck.open() deck.reset() if conf_deck_screensaver == 0: deck.set_brightness(conf_deck_brightness) deck.set_key_callback_async(steamdeck_key_state_changed) else: ss = ScreenSaver(loop, deck, conf_deck_brightness, steamdeck_key_state_changed, conf_deck_screensaver) deck.set_key_callback_async(ss.buttonpress) await tile_manager.set_deck_page(None) await hass.subscribe_to_event('state_changed', hass_state_changed) return True