import logging import voluptuous as vol from homeassistant.components.websocket_api import ( websocket_command, result_message, event_message, async_register_command, ) from .const import WS_CONNECT, WS_UPDATE from .helpers import get_devices, create_entity, get_config, is_setup_complete _LOGGER = logging.getLogger(__name__) async def setup_connection(hass, config): @websocket_command( { vol.Required("type"): WS_CONNECT, vol.Required("deviceID"): str, } ) def handle_connect(hass, connection, msg): deviceID = msg["deviceID"] device = get_devices(hass).get(deviceID, BrowserModConnection(hass, deviceID)) device.connect(connection, msg["id"]) get_devices(hass)[deviceID] = device connection.send_message(result_message(msg["id"])) @websocket_command( { vol.Required("type"): WS_UPDATE, vol.Required("deviceID"): str, vol.Optional("data"): dict, } ) def handle_update(hass, connection, msg): devices = get_devices(hass) deviceID = msg["deviceID"] if deviceID in devices: devices[deviceID].update(msg.get("data", None)) async_register_command(hass, handle_connect) async_register_command(hass, handle_update) class BrowserModConnection: def __init__(self, hass, deviceID): self.hass = hass self.deviceID = deviceID self.connection = [] self.media_player = None self.screen = None self.sensor = None self.fully = None self.camera = None def connect(self, connection, cid): self.connection.append((connection, cid)) self.trigger_update() def disconnect(): self.connection.remove((connection, cid)) connection.subscriptions[cid] = disconnect def send(self, command, **kwargs): if self.connection: connection, cid = self.connection[-1] connection.send_message( event_message( cid, { "command": command, **kwargs, }, ) ) def trigger_update(self): if is_setup_complete(self.hass): self.send("update", **get_config(self.hass, self.deviceID)) def update(self, data): if data.get("browser"): self.sensor = self.sensor or create_entity( self.hass, "sensor", self.deviceID, self ) if self.sensor: self.sensor.data = data.get("browser") if data.get("player"): self.media_player = self.media_player or create_entity( self.hass, "media_player", self.deviceID, self ) if self.media_player: self.media_player.data = data.get("player") if data.get("screen"): self.screen = self.screen or create_entity( self.hass, "light", self.deviceID, self ) if self.screen: self.screen.data = data.get("screen") if data.get("fully"): self.fully = self.fully or create_entity( self.hass, "binary_sensor", self.deviceID, self ) if self.fully: self.fully.data = data.get("fully") if data.get("camera"): self.camera = self.camera or create_entity( self.hass, "camera", self.deviceID, self ) if self.camera: self.camera.data = data.get("camera")