def _init_ctx(ctx: Configuration) -> None: """Initialize ctx.""" # ctx is incomplete thus need to 'hack' around it # see bug https://github.com/pallets/click/issues/942 if not hasattr(ctx, 'server'): ctx.server = os.environ.get('HASS_SERVER', const.AUTO_SERVER) if not hasattr(ctx, 'token'): ctx.token = os.environ.get('HASS_TOKEN', None) if not hasattr(ctx, 'password'): ctx.password = os.environ.get('HASS_PASSWORD', None) if not hasattr(ctx, 'timeout'): ctx.timeout = int( os.environ.get('HASS_TIMEOUT', str(const.DEFAULT_TIMEOUT)) ) if not hasattr(ctx, 'insecure'): ctx.insecure = False if not hasattr(ctx, 'session'): ctx.session = None if not hasattr(ctx, 'cert'): ctx.cert = None if not hasattr(ctx, 'resolved_server'): ctx.resolved_server = resolve_server(ctx)
async def fetcher() -> Optional[Dict]: async with aiohttp.ClientSession() as session: async with session.ws_connect( resolve_server(ctx) + "/api/websocket" ) as wsconn: await wsconn.send_str( json.dumps({'type': 'auth', 'access_token': ctx.token}) ) frame['id'] = 1 await wsconn.send_str(json.dumps(frame)) while True: msg = await wsconn.receive() if msg.type == aiohttp.WSMsgType.ERROR: break elif msg.type == aiohttp.WSMsgType.CLOSED: break elif msg.type == aiohttp.WSMsgType.TEXT: mydata = json.loads(msg.data) # type: Dict if callback: callback(mydata) elif mydata['type'] == 'result': return mydata return None
async def fetcher() -> Optional[Dict]: async with aiohttp.ClientSession() as session: async with session.ws_connect( resolve_server(ctx) + "/api/websocket" ) as wsconn: await wsconn.send_str( json.dumps({'type': 'auth', 'access_token': ctx.token}) ) frame['id'] = 1 await wsconn.send_str(json.dumps(frame)) while True: msg = await wsconn.receive() if msg.type == aiohttp.WSMsgType.ERROR: break elif msg.type == aiohttp.WSMsgType.CLOSED: break elif msg.type == aiohttp.WSMsgType.TEXT: mydata = json.loads(msg.data) # type: Dict if callback: callback(mydata) elif mydata['type'] == 'result': return mydata elif mydata['type'] == 'auth_invalid': raise HomeAssistantCliError(mydata.get('message')) return None
def _init_ctx(ctx: Configuration) -> None: """Initialize ctx.""" # ctx is incomplete thus need to 'hack' around it # see bug https://github.com/pallets/click/issues/942 if not hasattr(ctx, 'server'): ctx.server = os.environ.get('HASS_SERVER', const.AUTO_SERVER) if not hasattr(ctx, 'token'): ctx.token = os.environ.get('HASS_TOKEN', None) if not hasattr(ctx, 'password'): ctx.password = os.environ.get('HASS_PASSWORD', None) if not hasattr(ctx, 'timeout'): ctx.timeout = int( os.environ.get('HASS_TIMEOUT', str(const.DEFAULT_TIMEOUT))) if not hasattr(ctx, 'insecure'): ctx.insecure = False if not hasattr(ctx, 'session'): ctx.session = None if not hasattr(ctx, 'cert'): ctx.cert = None if not hasattr(ctx, 'resolved_server'): ctx.resolved_server = resolve_server(ctx)
def restapi(ctx: Configuration, method: str, path: str, data: Optional[Dict] = None) -> requests.Response: """Make a call to the Home Assistant REST API.""" if data is None: data_str = None else: data_str = json.dumps(data, cls=JSONEncoder) if not ctx.session: ctx.session = requests.Session() ctx.session.verify = not ctx.insecure if ctx.cert: ctx.session.cert = ctx.cert _LOGGER.debug( "Session: verify(%s), cert(%s)", ctx.session.verify, ctx.session.cert, ) headers = {CONTENT_TYPE: hass.CONTENT_TYPE_JSON} # type: Dict[str, Any] if ctx.token: headers["Authorization"] = "Bearer {}".format(ctx.token) if ctx.password: headers["x-ha-access"] = ctx.password url = urllib.parse.urljoin(resolve_server(ctx) + path, "") try: if method == METH_GET: return requests.get(url, params=data_str, headers=headers) return requests.request(method, url, data=data_str, headers=headers) except requests.exceptions.ConnectionError: raise HomeAssistantCliError("Error connecting to {}".format(url)) except requests.exceptions.Timeout: error = "Timeout when talking to {}".format(url) _LOGGER.exception(error) raise HomeAssistantCliError(error)
def restapi( ctx: Configuration, method: str, path: str, data: Optional[Dict] = None ) -> requests.Response: """Make a call to the Home Assistant REST API.""" if data is None: data_str = None else: data_str = json.dumps(data, cls=JSONEncoder) if not ctx.session: ctx.session = requests.Session() ctx.session.verify = not ctx.insecure if ctx.cert: ctx.session.cert = ctx.cert _LOGGER.debug( "Session: verify(%s), cert(%s)", ctx.session.verify, ctx.session.cert, ) headers = {CONTENT_TYPE: hass.CONTENT_TYPE_JSON} # type: Dict[str, Any] if ctx.token: headers["Authorization"] = "Bearer {}".format(ctx.token) if ctx.password: headers["x-ha-access"] = ctx.password url = urllib.parse.urljoin(resolve_server(ctx) + path, "") try: if method == METH_GET: return requests.get(url, params=data_str, headers=headers) return requests.request(method, url, data=data_str, headers=headers) except requests.exceptions.ConnectionError: raise HomeAssistantCliError("Error connecting to {}".format(url)) except requests.exceptions.Timeout: error = "Timeout when talking to {}".format(url) _LOGGER.exception(error) raise HomeAssistantCliError(error)