async def handle_manifest_list(hass, connection, msg): """Handle integrations command.""" loaded_integrations = async_get_loaded_integrations(hass) integrations = await asyncio.gather(*[ async_get_integration(hass, domain) for domain in loaded_integrations ]) connection.send_result( msg["id"], [integration.manifest for integration in integrations])
async def handle_manifest_list(hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]) -> None: """Handle integrations command.""" loaded_integrations = async_get_loaded_integrations(hass) integrations = await asyncio.gather(*(async_get_integration(hass, domain) for domain in loaded_integrations)) connection.send_result( msg["id"], [integration.manifest for integration in integrations])
async def test_async_get_loaded_integrations(hass): """Test we can enumerate loaded integations.""" hass.config.components.add("notbase") hass.config.components.add("switch") hass.config.components.add("notbase.switch") hass.config.components.add("myintegration") hass.config.components.add("device_tracker") hass.config.components.add("device_tracker.other") hass.config.components.add("myintegration.light") assert setup.async_get_loaded_integrations(hass) == { "other", "switch", "notbase", "myintegration", "device_tracker", }
async def handle_manifest_list(hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]) -> None: """Handle integrations command.""" wanted_integrations = msg.get("integrations") if wanted_integrations is None: wanted_integrations = async_get_loaded_integrations(hass) ints_or_excs = await async_get_integrations(hass, wanted_integrations) integrations: list[Integration] = [] for int_or_exc in ints_or_excs.values(): if isinstance(int_or_exc, Exception): raise int_or_exc integrations.append(int_or_exc) connection.send_result( msg["id"], [integration.manifest for integration in integrations])
async def get_custom_integrations(hass: HomeAssistant): """Return a list with custom integration info.""" custom_integrations = [] configured_integrations: List[Integration | IntegrationNotFound | BaseException] = await asyncio.gather( *[ async_get_integration(hass, domain) for domain in async_get_loaded_integrations(hass) ], return_exceptions=True, ) for integration in configured_integrations: if isinstance(integration, IntegrationNotFound): continue if isinstance(integration, BaseException): raise integration if integration.disabled or integration.is_built_in: continue custom_integrations.append({ "domain": integration.domain, "name": integration.name, "documentation": integration.documentation, "version": integration.version, "codeowners": integration.manifest.get("codeowners"), }) return custom_integrations
async def send_analytics(self, _=None) -> None: """Send analytics.""" supervisor_info = None operating_system_info = {} if not self.onboarded or not self.preferences.get(ATTR_BASE, False): LOGGER.debug("Nothing to submit") return if self._data.get(ATTR_UUID) is None: self._data[ATTR_UUID] = uuid.uuid4().hex await self._store.async_save(self._data) if self.supervisor: supervisor_info = hassio.get_supervisor_info(self.hass) operating_system_info = hassio.get_os_info(self.hass) system_info = await async_get_system_info(self.hass) integrations = [] custom_integrations = [] addons = [] payload: dict = { ATTR_UUID: self.uuid, ATTR_VERSION: HA_VERSION, ATTR_INSTALLATION_TYPE: system_info[ATTR_INSTALLATION_TYPE], } if supervisor_info is not None: payload[ATTR_SUPERVISOR] = { ATTR_HEALTHY: supervisor_info[ATTR_HEALTHY], ATTR_SUPPORTED: supervisor_info[ATTR_SUPPORTED], ATTR_ARCH: supervisor_info[ATTR_ARCH], } if operating_system_info.get(ATTR_BOARD) is not None: payload[ATTR_OPERATING_SYSTEM] = { ATTR_BOARD: operating_system_info[ATTR_BOARD], ATTR_VERSION: operating_system_info[ATTR_VERSION], } if self.preferences.get(ATTR_USAGE, False) or self.preferences.get( ATTR_STATISTICS, False ): configured_integrations = await asyncio.gather( *( async_get_integration(self.hass, domain) for domain in async_get_loaded_integrations(self.hass) ), return_exceptions=True, ) for integration in configured_integrations: if isinstance(integration, IntegrationNotFound): continue if isinstance(integration, BaseException): raise integration if integration.disabled: continue if not integration.is_built_in: custom_integrations.append( { ATTR_DOMAIN: integration.domain, ATTR_VERSION: integration.version, } ) continue integrations.append(integration.domain) if supervisor_info is not None: installed_addons = await asyncio.gather( *( hassio.async_get_addon_info(self.hass, addon[ATTR_SLUG]) for addon in supervisor_info[ATTR_ADDONS] ) ) for addon in installed_addons: addons.append( { ATTR_SLUG: addon[ATTR_SLUG], ATTR_PROTECTED: addon[ATTR_PROTECTED], ATTR_VERSION: addon[ATTR_VERSION], ATTR_AUTO_UPDATE: addon[ATTR_AUTO_UPDATE], } ) if self.preferences.get(ATTR_USAGE, False): payload[ATTR_INTEGRATIONS] = integrations payload[ATTR_CUSTOM_INTEGRATIONS] = custom_integrations if supervisor_info is not None: payload[ATTR_ADDONS] = addons if self.preferences.get(ATTR_STATISTICS, False): payload[ATTR_STATE_COUNT] = len(self.hass.states.async_all()) payload[ATTR_AUTOMATION_COUNT] = len( self.hass.states.async_all(AUTOMATION_DOMAIN) ) payload[ATTR_INTEGRATION_COUNT] = len(integrations) if supervisor_info is not None: payload[ATTR_ADDON_COUNT] = len(addons) payload[ATTR_USER_COUNT] = len( [ user for user in await self.hass.auth.async_get_users() if not user.system_generated ] ) try: with async_timeout.timeout(30): response = await self.session.post(self.endpoint, json=payload) if response.status == 200: LOGGER.info( ( "Submitted analytics to Home Assistant servers. " "Information submitted includes %s" ), payload, ) else: LOGGER.warning( "Sending analytics failed with statuscode %s from %s", response.status, self.endpoint, ) except asyncio.TimeoutError: LOGGER.error("Timeout sending analytics to %s", ANALYTICS_ENDPOINT_URL) except aiohttp.ClientError as err: LOGGER.error( "Error sending analytics to %s: %r", ANALYTICS_ENDPOINT_URL, err )