diff --git a/.strict-typing b/.strict-typing index 76190758e5d..a565e04e3e5 100644 --- a/.strict-typing +++ b/.strict-typing @@ -52,7 +52,6 @@ homeassistant.components.airzone.* homeassistant.components.aladdin_connect.* homeassistant.components.alarm_control_panel.* homeassistant.components.amazon_polly.* -homeassistant.components.ambee.* homeassistant.components.ambient_station.* homeassistant.components.amcrest.* homeassistant.components.ampio.* diff --git a/CODEOWNERS b/CODEOWNERS index c8e4de87818..d5d3e597f70 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -61,8 +61,6 @@ build.json @home-assistant/supervisor /tests/components/alexa/ @home-assistant/cloud @ochlocracy /homeassistant/components/almond/ @gcampax @balloob /tests/components/almond/ @gcampax @balloob -/homeassistant/components/ambee/ @frenck -/tests/components/ambee/ @frenck /homeassistant/components/amberelectric/ @madpilot /tests/components/amberelectric/ @madpilot /homeassistant/components/ambiclimate/ @danielhiversen diff --git a/homeassistant/components/ambee/__init__.py b/homeassistant/components/ambee/__init__.py deleted file mode 100644 index 547b8720fef..00000000000 --- a/homeassistant/components/ambee/__init__.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Support for Ambee.""" -from __future__ import annotations - -from ambee import AirQuality, Ambee, AmbeeAuthenticationError, Pollen - -from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, Platform -from homeassistant.core import HomeAssistant -from homeassistant.exceptions import ConfigEntryAuthFailed -from homeassistant.helpers.issue_registry import ( - IssueSeverity, - async_create_issue, - async_delete_issue, -) -from homeassistant.helpers.typing import ConfigType -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator - -from .const import DOMAIN, LOGGER, SCAN_INTERVAL, SERVICE_AIR_QUALITY, SERVICE_POLLEN - -PLATFORMS = [Platform.SENSOR] - - -async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: - """Set up the Ambee integration.""" - async_create_issue( - hass, - DOMAIN, - "pending_removal", - breaks_in_ha_version="2022.10.0", - is_fixable=False, - severity=IssueSeverity.WARNING, - translation_key="pending_removal", - ) - return True - - -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: - """Set up Ambee from a config entry.""" - hass.data.setdefault(DOMAIN, {}).setdefault(entry.entry_id, {}) - - client = Ambee( - api_key=entry.data[CONF_API_KEY], - latitude=entry.data[CONF_LATITUDE], - longitude=entry.data[CONF_LONGITUDE], - ) - - async def update_air_quality() -> AirQuality: - """Update method for updating Ambee Air Quality data.""" - try: - return await client.air_quality() - except AmbeeAuthenticationError as err: - raise ConfigEntryAuthFailed from err - - air_quality: DataUpdateCoordinator[AirQuality] = DataUpdateCoordinator( - hass, - LOGGER, - name=f"{DOMAIN}_{SERVICE_AIR_QUALITY}", - update_interval=SCAN_INTERVAL, - update_method=update_air_quality, - ) - await air_quality.async_config_entry_first_refresh() - hass.data[DOMAIN][entry.entry_id][SERVICE_AIR_QUALITY] = air_quality - - async def update_pollen() -> Pollen: - """Update method for updating Ambee Pollen data.""" - try: - return await client.pollen() - except AmbeeAuthenticationError as err: - raise ConfigEntryAuthFailed from err - - pollen: DataUpdateCoordinator[Pollen] = DataUpdateCoordinator( - hass, - LOGGER, - name=f"{DOMAIN}_{SERVICE_POLLEN}", - update_interval=SCAN_INTERVAL, - update_method=update_pollen, - ) - await pollen.async_config_entry_first_refresh() - hass.data[DOMAIN][entry.entry_id][SERVICE_POLLEN] = pollen - - await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) - return True - - -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: - """Unload Ambee config entry.""" - unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - if unload_ok: - del hass.data[DOMAIN][entry.entry_id] - if not hass.data[DOMAIN]: - async_delete_issue(hass, DOMAIN, "pending_removal") - return unload_ok diff --git a/homeassistant/components/ambee/config_flow.py b/homeassistant/components/ambee/config_flow.py deleted file mode 100644 index 7bfc1fa11af..00000000000 --- a/homeassistant/components/ambee/config_flow.py +++ /dev/null @@ -1,116 +0,0 @@ -"""Config flow to configure the Ambee integration.""" -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any - -from ambee import Ambee, AmbeeAuthenticationError, AmbeeError -import voluptuous as vol - -from homeassistant.config_entries import ConfigEntry, ConfigFlow -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME -from homeassistant.data_entry_flow import FlowResult -from homeassistant.helpers.aiohttp_client import async_get_clientsession -import homeassistant.helpers.config_validation as cv - -from .const import DOMAIN - - -class AmbeeFlowHandler(ConfigFlow, domain=DOMAIN): - """Config flow for Ambee.""" - - VERSION = 1 - - entry: ConfigEntry | None = None - - async def async_step_user( - self, user_input: dict[str, Any] | None = None - ) -> FlowResult: - """Handle a flow initialized by the user.""" - errors = {} - - if user_input is not None: - session = async_get_clientsession(self.hass) - try: - client = Ambee( - api_key=user_input[CONF_API_KEY], - latitude=user_input[CONF_LATITUDE], - longitude=user_input[CONF_LONGITUDE], - session=session, - ) - await client.air_quality() - except AmbeeAuthenticationError: - errors["base"] = "invalid_api_key" - except AmbeeError: - errors["base"] = "cannot_connect" - else: - return self.async_create_entry( - title=user_input[CONF_NAME], - data={ - CONF_API_KEY: user_input[CONF_API_KEY], - CONF_LATITUDE: user_input[CONF_LATITUDE], - CONF_LONGITUDE: user_input[CONF_LONGITUDE], - }, - ) - - return self.async_show_form( - step_id="user", - data_schema=vol.Schema( - { - vol.Required(CONF_API_KEY): str, - vol.Optional( - CONF_NAME, default=self.hass.config.location_name - ): str, - vol.Optional( - CONF_LATITUDE, default=self.hass.config.latitude - ): cv.latitude, - vol.Optional( - CONF_LONGITUDE, default=self.hass.config.longitude - ): cv.longitude, - } - ), - errors=errors, - ) - - async def async_step_reauth(self, entry_data: Mapping[str, Any]) -> FlowResult: - """Handle initiation of re-authentication with Ambee.""" - self.entry = self.hass.config_entries.async_get_entry(self.context["entry_id"]) - return await self.async_step_reauth_confirm() - - async def async_step_reauth_confirm( - self, user_input: dict[str, Any] | None = None - ) -> FlowResult: - """Handle re-authentication with Ambee.""" - errors = {} - if user_input is not None and self.entry: - session = async_get_clientsession(self.hass) - client = Ambee( - api_key=user_input[CONF_API_KEY], - latitude=self.entry.data[CONF_LATITUDE], - longitude=self.entry.data[CONF_LONGITUDE], - session=session, - ) - try: - await client.air_quality() - except AmbeeAuthenticationError: - errors["base"] = "invalid_api_key" - except AmbeeError: - errors["base"] = "cannot_connect" - else: - self.hass.config_entries.async_update_entry( - self.entry, - data={ - **self.entry.data, - CONF_API_KEY: user_input[CONF_API_KEY], - }, - ) - self.hass.async_create_task( - self.hass.config_entries.async_reload(self.entry.entry_id) - ) - return self.async_abort(reason="reauth_successful") - - return self.async_show_form( - step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), - errors=errors, - ) diff --git a/homeassistant/components/ambee/const.py b/homeassistant/components/ambee/const.py deleted file mode 100644 index 83abb841629..00000000000 --- a/homeassistant/components/ambee/const.py +++ /dev/null @@ -1,232 +0,0 @@ -"""Constants for the Ambee integration.""" -from __future__ import annotations - -from datetime import timedelta -import logging -from typing import Final - -from homeassistant.components.sensor import ( - SensorDeviceClass, - SensorEntityDescription, - SensorStateClass, -) -from homeassistant.const import ( - CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - CONCENTRATION_PARTS_PER_BILLION, - CONCENTRATION_PARTS_PER_CUBIC_METER, - CONCENTRATION_PARTS_PER_MILLION, -) - -DOMAIN: Final = "ambee" -LOGGER = logging.getLogger(__package__) -SCAN_INTERVAL = timedelta(hours=1) - -DEVICE_CLASS_AMBEE_RISK: Final = "ambee__risk" - -SERVICE_AIR_QUALITY: Final = "air_quality" -SERVICE_POLLEN: Final = "pollen" - -SERVICES: dict[str, str] = { - SERVICE_AIR_QUALITY: "Air quality", - SERVICE_POLLEN: "Pollen", -} - -SENSORS: dict[str, list[SensorEntityDescription]] = { - SERVICE_AIR_QUALITY: [ - SensorEntityDescription( - key="particulate_matter_2_5", - name="Particulate matter < 2.5 μm", - native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - state_class=SensorStateClass.MEASUREMENT, - ), - SensorEntityDescription( - key="particulate_matter_10", - name="Particulate matter < 10 μm", - native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - state_class=SensorStateClass.MEASUREMENT, - ), - SensorEntityDescription( - key="sulphur_dioxide", - name="Sulphur dioxide (SO2)", - native_unit_of_measurement=CONCENTRATION_PARTS_PER_BILLION, - state_class=SensorStateClass.MEASUREMENT, - ), - SensorEntityDescription( - key="nitrogen_dioxide", - name="Nitrogen dioxide (NO2)", - native_unit_of_measurement=CONCENTRATION_PARTS_PER_BILLION, - state_class=SensorStateClass.MEASUREMENT, - ), - SensorEntityDescription( - key="ozone", - name="Ozone", - native_unit_of_measurement=CONCENTRATION_PARTS_PER_BILLION, - state_class=SensorStateClass.MEASUREMENT, - ), - SensorEntityDescription( - key="carbon_monoxide", - name="Carbon monoxide (CO)", - device_class=SensorDeviceClass.CO, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION, - state_class=SensorStateClass.MEASUREMENT, - ), - SensorEntityDescription( - key="air_quality_index", - name="Air quality index (AQI)", - state_class=SensorStateClass.MEASUREMENT, - ), - ], - SERVICE_POLLEN: [ - SensorEntityDescription( - key="grass", - name="Grass", - icon="mdi:grass", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - ), - SensorEntityDescription( - key="tree", - name="Tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - ), - SensorEntityDescription( - key="weed", - name="Weed", - icon="mdi:sprout", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - ), - SensorEntityDescription( - key="grass_risk", - name="Grass risk", - icon="mdi:grass", - device_class=DEVICE_CLASS_AMBEE_RISK, - ), - SensorEntityDescription( - key="tree_risk", - name="Tree risk", - icon="mdi:tree", - device_class=DEVICE_CLASS_AMBEE_RISK, - ), - SensorEntityDescription( - key="weed_risk", - name="Weed risk", - icon="mdi:sprout", - device_class=DEVICE_CLASS_AMBEE_RISK, - ), - SensorEntityDescription( - key="grass_poaceae", - name="Poaceae grass", - icon="mdi:grass", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_alder", - name="Alder tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_birch", - name="Birch tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_cypress", - name="Cypress tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_elm", - name="Elm tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_hazel", - name="Hazel tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_oak", - name="Oak tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_pine", - name="Pine tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_plane", - name="Plane tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="tree_poplar", - name="Poplar tree", - icon="mdi:tree", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="weed_chenopod", - name="Chenopod weed", - icon="mdi:sprout", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="weed_mugwort", - name="Mugwort weed", - icon="mdi:sprout", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="weed_nettle", - name="Nettle weed", - icon="mdi:sprout", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - SensorEntityDescription( - key="weed_ragweed", - name="Ragweed weed", - icon="mdi:sprout", - state_class=SensorStateClass.MEASUREMENT, - native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER, - entity_registry_enabled_default=False, - ), - ], -} diff --git a/homeassistant/components/ambee/manifest.json b/homeassistant/components/ambee/manifest.json deleted file mode 100644 index 3226e9de3a3..00000000000 --- a/homeassistant/components/ambee/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "domain": "ambee", - "name": "Ambee", - "config_flow": true, - "documentation": "https://www.home-assistant.io/integrations/ambee", - "requirements": ["ambee==0.4.0"], - "codeowners": ["@frenck"], - "quality_scale": "platinum", - "iot_class": "cloud_polling" -} diff --git a/homeassistant/components/ambee/sensor.py b/homeassistant/components/ambee/sensor.py deleted file mode 100644 index 8fb6c9f2a61..00000000000 --- a/homeassistant/components/ambee/sensor.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Support for Ambee sensors.""" -from __future__ import annotations - -from homeassistant.components.sensor import ( - DOMAIN as SENSOR_DOMAIN, - SensorEntity, - SensorEntityDescription, -) -from homeassistant.config_entries import ConfigEntry -from homeassistant.core import HomeAssistant -from homeassistant.helpers.device_registry import DeviceEntryType -from homeassistant.helpers.entity import DeviceInfo -from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.typing import StateType -from homeassistant.helpers.update_coordinator import ( - CoordinatorEntity, - DataUpdateCoordinator, -) - -from .const import DOMAIN, SENSORS, SERVICES - - -async def async_setup_entry( - hass: HomeAssistant, - entry: ConfigEntry, - async_add_entities: AddEntitiesCallback, -) -> None: - """Set up Ambee sensors based on a config entry.""" - async_add_entities( - AmbeeSensorEntity( - coordinator=hass.data[DOMAIN][entry.entry_id][service_key], - entry_id=entry.entry_id, - description=description, - service_key=service_key, - service=SERVICES[service_key], - ) - for service_key, service_sensors in SENSORS.items() - for description in service_sensors - ) - - -class AmbeeSensorEntity(CoordinatorEntity, SensorEntity): - """Defines an Ambee sensor.""" - - _attr_has_entity_name = True - - def __init__( - self, - *, - coordinator: DataUpdateCoordinator, - entry_id: str, - description: SensorEntityDescription, - service_key: str, - service: str, - ) -> None: - """Initialize Ambee sensor.""" - super().__init__(coordinator=coordinator) - self._service_key = service_key - - self.entity_id = f"{SENSOR_DOMAIN}.{service_key}_{description.key}" - self.entity_description = description - self._attr_unique_id = f"{entry_id}_{service_key}_{description.key}" - - self._attr_device_info = DeviceInfo( - entry_type=DeviceEntryType.SERVICE, - identifiers={(DOMAIN, f"{entry_id}_{service_key}")}, - manufacturer="Ambee", - name=service, - ) - - @property - def native_value(self) -> StateType: - """Return the state of the sensor.""" - value = getattr(self.coordinator.data, self.entity_description.key) - if isinstance(value, str): - return value.lower() - return value # type: ignore[no-any-return] diff --git a/homeassistant/components/ambee/strings.json b/homeassistant/components/ambee/strings.json deleted file mode 100644 index 7d0e75877c9..00000000000 --- a/homeassistant/components/ambee/strings.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "step": { - "user": { - "description": "Set up Ambee to integrate with Home Assistant.", - "data": { - "api_key": "[%key:common::config_flow::data::api_key%]", - "latitude": "[%key:common::config_flow::data::latitude%]", - "longitude": "[%key:common::config_flow::data::longitude%]", - "name": "[%key:common::config_flow::data::name%]" - } - }, - "reauth_confirm": { - "data": { - "description": "Re-authenticate with your Ambee account.", - "api_key": "[%key:common::config_flow::data::api_key%]" - } - } - }, - "error": { - "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", - "invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]" - }, - "abort": { - "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" - } - }, - "issues": { - "pending_removal": { - "title": "The Ambee integration is being removed", - "description": "The Ambee integration is pending removal from Home Assistant and will no longer be available as of Home Assistant 2022.10.\n\nThe integration is being removed, because Ambee removed their free (limited) accounts and doesn't provide a way for regular users to sign up for a paid plan anymore.\n\nRemove the Ambee integration entry from your instance to fix this issue." - } - } -} diff --git a/homeassistant/components/ambee/strings.sensor.json b/homeassistant/components/ambee/strings.sensor.json deleted file mode 100644 index 83eb3b3fd73..00000000000 --- a/homeassistant/components/ambee/strings.sensor.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "low": "Low", - "moderate": "Moderate", - "high": "High", - "very high": "Very High" - } - } -} diff --git a/homeassistant/components/ambee/translations/bg.json b/homeassistant/components/ambee/translations/bg.json deleted file mode 100644 index c72dc5227ca..00000000000 --- a/homeassistant/components/ambee/translations/bg.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0442\u043e \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0432\u0430\u043d\u0435 \u0431\u0435\u0448\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e" - }, - "error": { - "cannot_connect": "\u041d\u0435\u0443\u0441\u043f\u0435\u0445 \u043f\u0440\u0438 \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435", - "invalid_api_key": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d API \u043a\u043b\u044e\u0447" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API \u043a\u043b\u044e\u0447" - } - }, - "user": { - "data": { - "api_key": "API \u043a\u043b\u044e\u0447", - "latitude": "\u0413\u0435\u043e\u0433\u0440\u0430\u0444\u0441\u043a\u0430 \u0448\u0438\u0440\u0438\u043d\u0430", - "longitude": "\u0413\u0435\u043e\u0433\u0440\u0430\u0444\u0441\u043a\u0430 \u0434\u044a\u043b\u0436\u0438\u043d\u0430", - "name": "\u0418\u043c\u0435" - } - } - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/ca.json b/homeassistant/components/ambee/translations/ca.json deleted file mode 100644 index bb4d49642b5..00000000000 --- a/homeassistant/components/ambee/translations/ca.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" - }, - "error": { - "cannot_connect": "Ha fallat la connexi\u00f3", - "invalid_api_key": "Clau API inv\u00e0lida" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "Clau API", - "description": "Torna a autenticar-te amb el compte d'Ambee." - } - }, - "user": { - "data": { - "api_key": "Clau API", - "latitude": "Latitud", - "longitude": "Longitud", - "name": "Nom" - }, - "description": "Configura la integraci\u00f3 d'Ambee amb Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "La integraci\u00f3 d'Ambee s'eliminar\u00e0 de Home Assistant i deixar\u00e0 d'estar disponible a la versi\u00f3 de Home Assistant 2022.10.\n\nLa integraci\u00f3 s'eliminar\u00e0 perqu\u00e8 Ambee ha eliminat els seus comptes gratu\u00efts (limitats) i no ha donat cap manera per als usuaris normals de registrar-se a un pla de pagament.\n\nElimina la integraci\u00f3 d'Ambee del Home Assistant per solucionar aquest problema.", - "title": "La integraci\u00f3 Ambee est\u00e0 sent eliminada" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/cs.json b/homeassistant/components/ambee/translations/cs.json deleted file mode 100644 index 88a6b354852..00000000000 --- a/homeassistant/components/ambee/translations/cs.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Op\u011btovn\u00e9 ov\u011b\u0159en\u00ed bylo \u00fasp\u011b\u0161n\u00e9" - }, - "error": { - "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit", - "invalid_api_key": "Neplatn\u00fd kl\u00ed\u010d API" - }, - "step": { - "user": { - "data": { - "longitude": "Zem\u011bpisn\u00e1 d\u00e9lka", - "name": "Jm\u00e9no" - } - } - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/de.json b/homeassistant/components/ambee/translations/de.json deleted file mode 100644 index 8055ef5210f..00000000000 --- a/homeassistant/components/ambee/translations/de.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Die erneute Authentifizierung war erfolgreich" - }, - "error": { - "cannot_connect": "Verbindung fehlgeschlagen", - "invalid_api_key": "Ung\u00fcltiger API-Schl\u00fcssel" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API-Schl\u00fcssel", - "description": "Authentifiziere dich erneut mit deinem Ambee-Konto." - } - }, - "user": { - "data": { - "api_key": "API-Schl\u00fcssel", - "latitude": "Breitengrad", - "longitude": "L\u00e4ngengrad", - "name": "Name" - }, - "description": "Richte Ambee f\u00fcr die Integration mit Home Assistant ein." - } - } - }, - "issues": { - "pending_removal": { - "description": "Die Ambee-Integration ist dabei, aus Home Assistant entfernt zu werden und wird ab Home Assistant 2022.10 nicht mehr verf\u00fcgbar sein.\n\nDie Integration wird entfernt, weil Ambee seine kostenlosen (begrenzten) Konten entfernt hat und keine M\u00f6glichkeit mehr f\u00fcr regul\u00e4re Nutzer bietet, sich f\u00fcr einen kostenpflichtigen Plan anzumelden.\n\nEntferne den Ambee-Integrationseintrag aus deiner Instanz, um dieses Problem zu beheben.", - "title": "Die Ambee-Integration wird entfernt" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/el.json b/homeassistant/components/ambee/translations/el.json deleted file mode 100644 index 99198a39817..00000000000 --- a/homeassistant/components/ambee/translations/el.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "\u039f \u03b5\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2" - }, - "error": { - "cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2", - "invalid_api_key": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API", - "description": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c3\u03b1\u03c2 Ambee." - } - }, - "user": { - "data": { - "api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API", - "latitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03c0\u03bb\u03ac\u03c4\u03bf\u03c2", - "longitude": "\u0393\u03b5\u03c9\u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03cc \u03bc\u03ae\u03ba\u03bf\u03c2", - "name": "\u038c\u03bd\u03bf\u03bc\u03b1" - }, - "description": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03c4\u03b5 \u03c4\u03bf Ambee \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03b8\u03b5\u03af \u03bc\u03b5 \u03c4\u03bf Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "\u0397 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 Ambee \u03b5\u03ba\u03ba\u03c1\u03b5\u03bc\u03b5\u03af \u03ba\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf Home Assistant \u03ba\u03b1\u03b9 \u03b4\u03b5\u03bd \u03b8\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03bb\u03ad\u03bf\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf Home Assistant 2022.10. \n\n \u0397 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03ba\u03b1\u03c4\u03b1\u03c1\u03b3\u03b5\u03af\u03c4\u03b1\u03b9, \u03b5\u03c0\u03b5\u03b9\u03b4\u03ae \u03b7 Ambee \u03b1\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b5 \u03c4\u03bf\u03c5\u03c2 \u03b4\u03c9\u03c1\u03b5\u03ac\u03bd (\u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2) \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd\u03c2 \u03c4\u03bf\u03c5\u03c2 \u03ba\u03b1\u03b9 \u03b4\u03b5\u03bd \u03c0\u03b1\u03c1\u03ad\u03c7\u03b5\u03b9 \u03c0\u03bb\u03ad\u03bf\u03bd \u03c4\u03c1\u03cc\u03c0\u03bf \u03c3\u03c4\u03bf\u03c5\u03c2 \u03c4\u03b1\u03ba\u03c4\u03b9\u03ba\u03bf\u03cd\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03bd\u03b1 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03bf\u03cd\u03bd \u03c3\u03b5 \u03ad\u03bd\u03b1 \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03b5\u03c0\u03af \u03c0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ae. \n\n \u039a\u03b1\u03c4\u03b1\u03c1\u03b3\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2 Ambee \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1 \u03c3\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03bf\u03c1\u03b8\u03ce\u03c3\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03b6\u03ae\u03c4\u03b7\u03bc\u03b1.", - "title": "\u0397 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 Ambee \u03ba\u03b1\u03c4\u03b1\u03c1\u03b3\u03b5\u03af\u03c4\u03b1\u03b9" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/en.json b/homeassistant/components/ambee/translations/en.json deleted file mode 100644 index 03f4c3241b6..00000000000 --- a/homeassistant/components/ambee/translations/en.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Re-authentication was successful" - }, - "error": { - "cannot_connect": "Failed to connect", - "invalid_api_key": "Invalid API key" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API Key", - "description": "Re-authenticate with your Ambee account." - } - }, - "user": { - "data": { - "api_key": "API Key", - "latitude": "Latitude", - "longitude": "Longitude", - "name": "Name" - }, - "description": "Set up Ambee to integrate with Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "The Ambee integration is pending removal from Home Assistant and will no longer be available as of Home Assistant 2022.10.\n\nThe integration is being removed, because Ambee removed their free (limited) accounts and doesn't provide a way for regular users to sign up for a paid plan anymore.\n\nRemove the Ambee integration entry from your instance to fix this issue.", - "title": "The Ambee integration is being removed" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/es-419.json b/homeassistant/components/ambee/translations/es-419.json deleted file mode 100644 index de5ce971fa0..00000000000 --- a/homeassistant/components/ambee/translations/es-419.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "config": { - "step": { - "reauth_confirm": { - "data": { - "description": "Vuelva a autenticarse con su cuenta de Ambee." - } - }, - "user": { - "description": "Configure Ambee para que se integre con Home Assistant." - } - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/es.json b/homeassistant/components/ambee/translations/es.json deleted file mode 100644 index 205b9adaf3a..00000000000 --- a/homeassistant/components/ambee/translations/es.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "La autenticaci\u00f3n se volvi\u00f3 a realizar correctamente" - }, - "error": { - "cannot_connect": "No se pudo conectar", - "invalid_api_key": "Clave API no v\u00e1lida" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "Clave API", - "description": "Vuelve a autenticarte con tu cuenta Ambee." - } - }, - "user": { - "data": { - "api_key": "Clave API", - "latitude": "Latitud", - "longitude": "Longitud", - "name": "Nombre" - }, - "description": "Configura Ambee para que se integre con Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "La integraci\u00f3n Ambee est\u00e1 pendiente de eliminaci\u00f3n de Home Assistant y ya no estar\u00e1 disponible a partir de Home Assistant 2022.10. \n\nSe va a eliminar la integraci\u00f3n porque Ambee elimin\u00f3 sus cuentas gratuitas (limitadas) y ya no proporciona una forma para que los usuarios regulares se registren en un plan pago. \n\nElimina la entrada de la integraci\u00f3n Ambee de tu instancia para solucionar este problema.", - "title": "Se va a eliminar la integraci\u00f3n Ambee" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/et.json b/homeassistant/components/ambee/translations/et.json deleted file mode 100644 index abb41497581..00000000000 --- a/homeassistant/components/ambee/translations/et.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Taastuvastamine \u00f5nnestus" - }, - "error": { - "cannot_connect": "\u00dchendumine nurjus", - "invalid_api_key": "Vale API v\u00f5ti" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API v\u00f5ti", - "description": "Taastuvasta Ambee konto" - } - }, - "user": { - "data": { - "api_key": "API v\u00f5ti", - "latitude": "Laiuskraad", - "longitude": "Pikkuskraad", - "name": "Nimi" - }, - "description": "Seadista Ambee sidumine Home Assistantiga." - } - } - }, - "issues": { - "pending_removal": { - "description": "Ambee integratsioon on Home Assistantist eemaldamisel ja ei ole enam saadaval alates Home Assistant 2022.10.\n\nIntegratsioon eemaldatakse, sest Ambee eemaldas oma tasuta (piiratud) kontod ja ei paku tavakasutajatele enam v\u00f5imalust tasulisele plaanile registreeruda.\n\nSelle probleemi lahendamiseks eemaldage Ambee integratsiooni kirje oma instantsist.", - "title": "Ambee integratsioon eemaldatakse" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/fr.json b/homeassistant/components/ambee/translations/fr.json deleted file mode 100644 index da3932962a6..00000000000 --- a/homeassistant/components/ambee/translations/fr.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "La r\u00e9-authentification a r\u00e9ussi" - }, - "error": { - "cannot_connect": "\u00c9chec de connexion", - "invalid_api_key": "Cl\u00e9 d'API non valide" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "Cl\u00e9 d'API", - "description": "R\u00e9-authentifiez-vous avec votre compte Ambee." - } - }, - "user": { - "data": { - "api_key": "Cl\u00e9 d'API", - "latitude": "Latitude", - "longitude": "Longitude", - "name": "Nom" - }, - "description": "Configurer Ambee pour l'int\u00e9grer \u00e0 Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "title": "L'int\u00e9gration Ambee est en cours de suppression" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/he.json b/homeassistant/components/ambee/translations/he.json deleted file mode 100644 index 7b7882cd4df..00000000000 --- a/homeassistant/components/ambee/translations/he.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "\u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05de\u05d7\u05d3\u05e9 \u05d4\u05e6\u05dc\u05d9\u05d7" - }, - "error": { - "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", - "invalid_api_key": "\u05de\u05e4\u05ea\u05d7 API \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "\u05de\u05e4\u05ea\u05d7 API" - } - }, - "user": { - "data": { - "api_key": "\u05de\u05e4\u05ea\u05d7 API", - "latitude": "\u05e7\u05d5 \u05e8\u05d5\u05d7\u05d1", - "longitude": "\u05e7\u05d5 \u05d0\u05d5\u05e8\u05da", - "name": "\u05e9\u05dd" - } - } - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/hu.json b/homeassistant/components/ambee/translations/hu.json deleted file mode 100644 index 98e9fbdabea..00000000000 --- a/homeassistant/components/ambee/translations/hu.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt." - }, - "error": { - "cannot_connect": "Sikertelen csatlakoz\u00e1s", - "invalid_api_key": "\u00c9rv\u00e9nytelen API kulcs" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API kulcs", - "description": "Hiteles\u00edtse mag\u00e1t \u00fajra az Ambee-fi\u00f3kj\u00e1val." - } - }, - "user": { - "data": { - "api_key": "API kulcs", - "latitude": "Sz\u00e9less\u00e9g", - "longitude": "Hossz\u00fas\u00e1g", - "name": "Elnevez\u00e9s" - }, - "description": "Integr\u00e1lja \u00f6ssze Ambeet Home Assistanttal." - } - } - }, - "issues": { - "pending_removal": { - "description": "Az Ambee integr\u00e1ci\u00f3 elt\u00e1vol\u00edt\u00e1sra v\u00e1r a Home Assistantb\u00f3l, \u00e9s a 2022.10-es Home Assistant-t\u00f3l m\u00e1r nem lesz el\u00e9rhet\u0151.\n\nAz integr\u00e1ci\u00f3 elt\u00e1vol\u00edt\u00e1sa az\u00e9rt t\u00f6rt\u00e9nik, mert az Ambee elt\u00e1vol\u00edtotta az ingyenes (korl\u00e1tozott) fi\u00f3kjait, \u00e9s a rendszeres felhaszn\u00e1l\u00f3k sz\u00e1m\u00e1ra m\u00e1r nem biztos\u00edt lehet\u0151s\u00e9get arra, hogy fizet\u0151s csomagra regisztr\u00e1ljanak.\n\nA hiba\u00fczenet elrejt\u00e9s\u00e9hez t\u00e1vol\u00edtsa el az Ambee integr\u00e1ci\u00f3s bejegyz\u00e9st a rendszerb\u0151l.", - "title": "Az Ambee integr\u00e1ci\u00f3 elt\u00e1vol\u00edt\u00e1sra ker\u00fcl" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/id.json b/homeassistant/components/ambee/translations/id.json deleted file mode 100644 index 686e36fd17b..00000000000 --- a/homeassistant/components/ambee/translations/id.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Autentikasi ulang berhasil" - }, - "error": { - "cannot_connect": "Gagal terhubung", - "invalid_api_key": "Kunci API tidak valid" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "Kunci API", - "description": "Autentikasi ulang dengan akun Ambee Anda." - } - }, - "user": { - "data": { - "api_key": "Kunci API", - "latitude": "Lintang", - "longitude": "Bujur", - "name": "Nama" - }, - "description": "Siapkan Ambee Anda untuk diintegrasikan dengan Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "Integrasi Ambee sedang menunggu penghapusan dari Home Assistant dan tidak akan lagi tersedia pada Home Assistant 2022.10.\n\nIntegrasi ini dalam proses penghapusan, karena Ambee telah menghapus akun versi gratis (terbatas) mereka dan tidak menyediakan cara bagi pengguna biasa untuk mendaftar paket berbayar lagi.\n\nHapus entri integrasi Ambee dari instans Anda untuk memperbaiki masalah ini.", - "title": "Integrasi Ambee dalam proses penghapusan" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/it.json b/homeassistant/components/ambee/translations/it.json deleted file mode 100644 index f2054c8a6ff..00000000000 --- a/homeassistant/components/ambee/translations/it.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "La nuova autenticazione \u00e8 stata eseguita correttamente" - }, - "error": { - "cannot_connect": "Impossibile connettersi", - "invalid_api_key": "Chiave API non valida" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "Chiave API", - "description": "Autenticati nuovamente con il tuo account Ambee." - } - }, - "user": { - "data": { - "api_key": "Chiave API", - "latitude": "Latitudine", - "longitude": "Logitudine", - "name": "Nome" - }, - "description": "Configura Ambee per l'integrazione con Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "L'integrazione Ambee \u00e8 in attesa di rimozione da Home Assistant e non sar\u00e0 pi\u00f9 disponibile a partire da Home Assistant 2022.10. \n\nL'integrazione \u00e8 stata rimossa, perch\u00e9 Ambee ha rimosso i loro account gratuiti (limitati) e non offre pi\u00f9 agli utenti regolari un modo per iscriversi a un piano a pagamento. \n\nRimuovi la voce di integrazione Ambee dalla tua istanza per risolvere questo problema.", - "title": "L'integrazione Ambee sar\u00e0 rimossa" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/ja.json b/homeassistant/components/ambee/translations/ja.json deleted file mode 100644 index 2d6bf3b2466..00000000000 --- a/homeassistant/components/ambee/translations/ja.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "\u518d\u8a8d\u8a3c\u306b\u6210\u529f\u3057\u307e\u3057\u305f" - }, - "error": { - "cannot_connect": "\u63a5\u7d9a\u306b\u5931\u6557\u3057\u307e\u3057\u305f", - "invalid_api_key": "\u7121\u52b9\u306aAPI\u30ad\u30fc" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API\u30ad\u30fc", - "description": "Ambee\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u518d\u8a8d\u8a3c\u3057\u307e\u3059\u3002" - } - }, - "user": { - "data": { - "api_key": "API\u30ad\u30fc", - "latitude": "\u7def\u5ea6", - "longitude": "\u7d4c\u5ea6", - "name": "\u540d\u524d" - }, - "description": "Ambee \u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u3066\u3001Home Assistant\u3068\u9023\u643a\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002" - } - } - }, - "issues": { - "pending_removal": { - "description": "Ambee\u306e\u7d71\u5408\u306fHome Assistant\u304b\u3089\u306e\u524a\u9664\u306f\u4fdd\u7559\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001Home Assistant 2022.10\u4ee5\u964d\u306f\u5229\u7528\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002 \n\nAmbee\u304c\u7121\u6599(\u9650\u5b9a)\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u524a\u9664\u3057\u3001\u4e00\u822c\u30e6\u30fc\u30b6\u30fc\u304c\u6709\u6599\u30d7\u30e9\u30f3\u306b\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u3059\u308b\u65b9\u6cd5\u3092\u63d0\u4f9b\u3057\u306a\u304f\u306a\u3063\u305f\u305f\u3081\u3001\u7d71\u5408\u304c\u524a\u9664\u3055\u308c\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3057\u305f\u3002\n\n\u3053\u306e\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u306b\u306f\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304b\u3089Ambee\u306e\u7d71\u5408\u306e\u30a8\u30f3\u30c8\u30ea\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044\u3002", - "title": "Ambee\u306e\u7d71\u5408\u306f\u524a\u9664\u3055\u308c\u3066\u3044\u307e\u3059" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/ko.json b/homeassistant/components/ambee/translations/ko.json deleted file mode 100644 index 574b7cd0976..00000000000 --- a/homeassistant/components/ambee/translations/ko.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "config": { - "error": { - "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4", - "invalid_api_key": "API \ud0a4\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4" - }, - "step": { - "user": { - "data": { - "api_key": "API \ud0a4", - "latitude": "\uc704\ub3c4", - "longitude": "\uacbd\ub3c4", - "name": "\uc774\ub984" - } - } - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/nl.json b/homeassistant/components/ambee/translations/nl.json deleted file mode 100644 index 957c3547be2..00000000000 --- a/homeassistant/components/ambee/translations/nl.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Herauthenticatie geslaagd" - }, - "error": { - "cannot_connect": "Kan geen verbinding maken", - "invalid_api_key": "Ongeldige API-sleutel" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API-sleutel", - "description": "Verifieer opnieuw met uw Ambee-account." - } - }, - "user": { - "data": { - "api_key": "API-sleutel", - "latitude": "Breedtegraad", - "longitude": "Lengtegraad", - "name": "Naam" - }, - "description": "Stel Ambee in om te integreren met Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "title": "De Ambee-integratie wordt verwijderd" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/no.json b/homeassistant/components/ambee/translations/no.json deleted file mode 100644 index 2c10f596722..00000000000 --- a/homeassistant/components/ambee/translations/no.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Godkjenning p\u00e5 nytt var vellykket" - }, - "error": { - "cannot_connect": "Tilkobling mislyktes", - "invalid_api_key": "Ugyldig API-n\u00f8kkel" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API-n\u00f8kkel", - "description": "Autentiser p\u00e5 nytt med Ambee-kontoen din." - } - }, - "user": { - "data": { - "api_key": "API-n\u00f8kkel", - "latitude": "Breddegrad", - "longitude": "Lengdegrad", - "name": "Navn" - }, - "description": "Sett opp Ambee for \u00e5 integrere med Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "Ambee-integrasjonen venter p\u00e5 fjerning fra Home Assistant og vil ikke lenger v\u00e6re tilgjengelig fra Home Assistant 2022.10. \n\n Integrasjonen blir fjernet, fordi Ambee fjernet deres gratis (begrensede) kontoer og ikke gir vanlige brukere mulighet til \u00e5 registrere seg for en betalt plan lenger. \n\n Fjern Ambee-integrasjonsoppf\u00f8ringen fra forekomsten din for \u00e5 fikse dette problemet.", - "title": "Ambee-integrasjonen blir fjernet" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/pl.json b/homeassistant/components/ambee/translations/pl.json deleted file mode 100644 index 255d402175d..00000000000 --- a/homeassistant/components/ambee/translations/pl.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Ponowne uwierzytelnienie powiod\u0142o si\u0119" - }, - "error": { - "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia", - "invalid_api_key": "Nieprawid\u0142owy klucz API" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "Klucz API", - "description": "Ponownie uwierzytelnij za pomoc\u0105 konta Ambee." - } - }, - "user": { - "data": { - "api_key": "Klucz API", - "latitude": "Szeroko\u015b\u0107 geograficzna", - "longitude": "D\u0142ugo\u015b\u0107 geograficzna", - "name": "Nazwa" - }, - "description": "Skonfiguruj Ambee, aby zintegrowa\u0107 go z Home Assistantem." - } - } - }, - "issues": { - "pending_removal": { - "description": "Integracja Ambee oczekuje na usuni\u0119cie z Home Assistanta i nie b\u0119dzie ju\u017c dost\u0119pna od Home Assistant 2022.10. \n\nIntegracja jest usuwana, poniewa\u017c Ambee usun\u0105\u0142 ich bezp\u0142atne (ograniczone) konta i nie zapewnia ju\u017c zwyk\u0142ym u\u017cytkownikom mo\u017cliwo\u015bci zarejestrowania si\u0119 w p\u0142atnym planie. \n\nUsu\u0144 integracj\u0119 Ambee z Home Assistanta, aby rozwi\u0105za\u0107 ten problem.", - "title": "Integracja Ambee zostanie usuni\u0119ta" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/pt-BR.json b/homeassistant/components/ambee/translations/pt-BR.json deleted file mode 100644 index 3220de5104e..00000000000 --- a/homeassistant/components/ambee/translations/pt-BR.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "A reautentica\u00e7\u00e3o foi bem-sucedida" - }, - "error": { - "cannot_connect": "Falha ao conectar", - "invalid_api_key": "Chave de API inv\u00e1lida" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "Chave da API", - "description": "Re-autentique com sua conta Ambee." - } - }, - "user": { - "data": { - "api_key": "Chave da API", - "latitude": "Latitude", - "longitude": "Longitude", - "name": "Nome" - }, - "description": "Configure o Ambee para integrar com o Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "A integra\u00e7\u00e3o do Ambee est\u00e1 com remo\u00e7\u00e3o pendente do Home Assistant e n\u00e3o estar\u00e1 mais dispon\u00edvel a partir do Home Assistant 2022.10. \n\n A integra\u00e7\u00e3o est\u00e1 sendo removida, porque a Ambee removeu suas contas gratuitas (limitadas) e n\u00e3o oferece mais uma maneira de usu\u00e1rios regulares se inscreverem em um plano pago. \n\n Remova a entrada de integra\u00e7\u00e3o Ambee de sua inst\u00e2ncia para corrigir esse problema.", - "title": "A integra\u00e7\u00e3o Ambee est\u00e1 sendo removida" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/pt.json b/homeassistant/components/ambee/translations/pt.json deleted file mode 100644 index 4a6d267473b..00000000000 --- a/homeassistant/components/ambee/translations/pt.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "config": { - "step": { - "reauth_confirm": { - "data": { - "api_key": "Chave da API" - } - }, - "user": { - "data": { - "latitude": "Latitude", - "name": "Nome" - } - } - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/ru.json b/homeassistant/components/ambee/translations/ru.json deleted file mode 100644 index 11b3cbbf9d2..00000000000 --- a/homeassistant/components/ambee/translations/ru.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e." - }, - "error": { - "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", - "invalid_api_key": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API." - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "\u041a\u043b\u044e\u0447 API", - "description": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Ambee" - } - }, - "user": { - "data": { - "api_key": "\u041a\u043b\u044e\u0447 API", - "latitude": "\u0428\u0438\u0440\u043e\u0442\u0430", - "longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430", - "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435" - }, - "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Home Assistant \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Ambee." - } - } - }, - "issues": { - "pending_removal": { - "description": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Ambee \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u0437 Home Assistant \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0441 Home Assistant \u0432\u0435\u0440\u0441\u0438\u0438 2022.10. \n\n\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Ambee \u0443\u0434\u0430\u043b\u0438\u043b\u0430 \u0441\u0432\u043e\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435) \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0442\u0430\u0440\u0438\u0444\u043d\u044b\u0439 \u043f\u043b\u0430\u043d.\n\n\u0423\u0434\u0430\u043b\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.", - "title": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Ambee \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0430" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.bg.json b/homeassistant/components/ambee/translations/sensor.bg.json deleted file mode 100644 index 07977ca4abf..00000000000 --- a/homeassistant/components/ambee/translations/sensor.bg.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "\u0412\u0438\u0441\u043e\u043a\u043e", - "low": "\u041d\u0438\u0441\u043a\u043e", - "moderate": "\u0423\u043c\u0435\u0440\u0435\u043d\u043e", - "very high": "\u041c\u043d\u043e\u0433\u043e \u0432\u0438\u0441\u043e\u043a\u043e" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.ca.json b/homeassistant/components/ambee/translations/sensor.ca.json deleted file mode 100644 index b85d6bdc8e2..00000000000 --- a/homeassistant/components/ambee/translations/sensor.ca.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Alt", - "low": "Baix", - "moderate": "Moderat", - "very high": "Molt alt" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.de.json b/homeassistant/components/ambee/translations/sensor.de.json deleted file mode 100644 index c96a2c50eb7..00000000000 --- a/homeassistant/components/ambee/translations/sensor.de.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Hoch", - "low": "Niedrig", - "moderate": "M\u00e4\u00dfig", - "very high": "Sehr hoch" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.el.json b/homeassistant/components/ambee/translations/sensor.el.json deleted file mode 100644 index 8e9af2dac05..00000000000 --- a/homeassistant/components/ambee/translations/sensor.el.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "\u03a5\u03c8\u03b7\u03bb\u03cc", - "low": "\u03a7\u03b1\u03bc\u03b7\u03bb\u03cc", - "moderate": "\u039c\u03ad\u03c4\u03c1\u03b9\u03bf", - "very high": "\u03a0\u03bf\u03bb\u03cd \u03c5\u03c8\u03b7\u03bb\u03cc" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.en.json b/homeassistant/components/ambee/translations/sensor.en.json deleted file mode 100644 index a4b198eadf5..00000000000 --- a/homeassistant/components/ambee/translations/sensor.en.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "High", - "low": "Low", - "moderate": "Moderate", - "very high": "Very High" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.es-419.json b/homeassistant/components/ambee/translations/sensor.es-419.json deleted file mode 100644 index a676ca7aa5e..00000000000 --- a/homeassistant/components/ambee/translations/sensor.es-419.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Alto", - "low": "Bajo", - "moderate": "Moderado", - "very high": "Muy alto" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.es.json b/homeassistant/components/ambee/translations/sensor.es.json deleted file mode 100644 index a676ca7aa5e..00000000000 --- a/homeassistant/components/ambee/translations/sensor.es.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Alto", - "low": "Bajo", - "moderate": "Moderado", - "very high": "Muy alto" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.et.json b/homeassistant/components/ambee/translations/sensor.et.json deleted file mode 100644 index 7599f2fd2c3..00000000000 --- a/homeassistant/components/ambee/translations/sensor.et.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "K\u00f5rge", - "low": "Madal", - "moderate": "M\u00f5\u00f5dukas", - "very high": "V\u00e4ga k\u00f5rge" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.fr.json b/homeassistant/components/ambee/translations/sensor.fr.json deleted file mode 100644 index 76dc3fe6301..00000000000 --- a/homeassistant/components/ambee/translations/sensor.fr.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Haute", - "low": "Faible", - "moderate": "Mod\u00e9rer", - "very high": "Tr\u00e8s \u00e9lev\u00e9" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.he.json b/homeassistant/components/ambee/translations/sensor.he.json deleted file mode 100644 index 14ae06f2bc9..00000000000 --- a/homeassistant/components/ambee/translations/sensor.he.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "\u05d2\u05d1\u05d5\u05d4", - "low": "\u05e0\u05de\u05d5\u05da", - "very high": "\u05d2\u05d1\u05d5\u05d4 \u05de\u05d0\u05d5\u05d3" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.hu.json b/homeassistant/components/ambee/translations/sensor.hu.json deleted file mode 100644 index 975d200a507..00000000000 --- a/homeassistant/components/ambee/translations/sensor.hu.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Magas", - "low": "Alacsony", - "moderate": "M\u00e9rs\u00e9kelt", - "very high": "Nagyon magas" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.id.json b/homeassistant/components/ambee/translations/sensor.id.json deleted file mode 100644 index 5cb74694da5..00000000000 --- a/homeassistant/components/ambee/translations/sensor.id.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Tinggi", - "low": "Rendah", - "moderate": "Sedang", - "very high": "Sangat Tinggi" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.it.json b/homeassistant/components/ambee/translations/sensor.it.json deleted file mode 100644 index 1c265a6ca53..00000000000 --- a/homeassistant/components/ambee/translations/sensor.it.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Alto", - "low": "Basso", - "moderate": "Moderato", - "very high": "Molto alto" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.ja.json b/homeassistant/components/ambee/translations/sensor.ja.json deleted file mode 100644 index a750a257864..00000000000 --- a/homeassistant/components/ambee/translations/sensor.ja.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "\u9ad8\u3044", - "low": "\u4f4e\u3044", - "moderate": "\u9069\u5ea6", - "very high": "\u975e\u5e38\u306b\u9ad8\u3044" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.nl.json b/homeassistant/components/ambee/translations/sensor.nl.json deleted file mode 100644 index e9ba0c76a34..00000000000 --- a/homeassistant/components/ambee/translations/sensor.nl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Hoog", - "low": "Laag", - "moderate": "Matig", - "very high": "Zeer hoog" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.no.json b/homeassistant/components/ambee/translations/sensor.no.json deleted file mode 100644 index cf4e4bed6ed..00000000000 --- a/homeassistant/components/ambee/translations/sensor.no.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "H\u00f8y", - "low": "Lav", - "moderate": "Moderat", - "very high": "Veldig h\u00f8y" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.pl.json b/homeassistant/components/ambee/translations/sensor.pl.json deleted file mode 100644 index d67bdec0879..00000000000 --- a/homeassistant/components/ambee/translations/sensor.pl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "wysoki", - "low": "niski", - "moderate": "umiarkowany", - "very high": "bardzo wysoki" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.pt-BR.json b/homeassistant/components/ambee/translations/sensor.pt-BR.json deleted file mode 100644 index 2e0dc187368..00000000000 --- a/homeassistant/components/ambee/translations/sensor.pt-BR.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Alto", - "low": "Baixo", - "moderate": "Moderado", - "very high": "Muito alto" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.ru.json b/homeassistant/components/ambee/translations/sensor.ru.json deleted file mode 100644 index c0dbe8cecd6..00000000000 --- a/homeassistant/components/ambee/translations/sensor.ru.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "\u0412\u044b\u0441\u043e\u043a\u0438\u0439", - "low": "\u041d\u0438\u0437\u043a\u0438\u0439", - "moderate": "\u0423\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0439", - "very high": "\u041e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u0438\u0439" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.sv.json b/homeassistant/components/ambee/translations/sensor.sv.json deleted file mode 100644 index d3280d4ebf4..00000000000 --- a/homeassistant/components/ambee/translations/sensor.sv.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "H\u00f6g", - "low": "L\u00e5g", - "moderate": "M\u00e5ttlig", - "very high": "V\u00e4ldigt h\u00f6gt" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.tr.json b/homeassistant/components/ambee/translations/sensor.tr.json deleted file mode 100644 index 087bea4ed99..00000000000 --- a/homeassistant/components/ambee/translations/sensor.tr.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "Y\u00fcksek", - "low": "D\u00fc\u015f\u00fck", - "moderate": "Moderate", - "very high": "\u00c7ok y\u00fcksek" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sensor.zh-Hant.json b/homeassistant/components/ambee/translations/sensor.zh-Hant.json deleted file mode 100644 index 1e3c5bbe58d..00000000000 --- a/homeassistant/components/ambee/translations/sensor.zh-Hant.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "state": { - "ambee__risk": { - "high": "\u9ad8", - "low": "\u4f4e", - "moderate": "\u4e2d", - "very high": "\u6975\u9ad8" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sk.json b/homeassistant/components/ambee/translations/sk.json deleted file mode 100644 index a474631a7f8..00000000000 --- a/homeassistant/components/ambee/translations/sk.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Op\u00e4tovn\u00e9 overenie bolo \u00faspe\u0161n\u00e9" - }, - "error": { - "invalid_api_key": "Neplatn\u00fd API k\u013e\u00fa\u010d" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API k\u013e\u00fa\u010d" - } - }, - "user": { - "data": { - "api_key": "API k\u013e\u00fa\u010d", - "latitude": "Zemepisn\u00e1 \u0161\u00edrka", - "longitude": "Zemepisn\u00e1 d\u013a\u017eka", - "name": "N\u00e1zov" - } - } - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/sv.json b/homeassistant/components/ambee/translations/sv.json deleted file mode 100644 index e31205118b9..00000000000 --- a/homeassistant/components/ambee/translations/sv.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "\u00c5terautentisering lyckades" - }, - "error": { - "cannot_connect": "Det gick inte att ansluta.", - "invalid_api_key": "Ogiltig API-nyckel" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API-nyckel", - "description": "Autentisera p\u00e5 nytt med ditt Ambee-konto." - } - }, - "user": { - "data": { - "api_key": "API-nyckel", - "latitude": "Latitud", - "longitude": "Longitud", - "name": "Namn" - }, - "description": "Konfigurera Ambee f\u00f6r att integrera med Home Assistant." - } - } - }, - "issues": { - "pending_removal": { - "description": "Ambee-integrationen v\u00e4ntar p\u00e5 borttagning fr\u00e5n Home Assistant och kommer inte l\u00e4ngre att vara tillg\u00e4nglig fr\u00e5n och med Home Assistant 2022.10. \n\n Integrationen tas bort eftersom Ambee tog bort sina gratis (begr\u00e4nsade) konton och inte l\u00e4ngre ger vanliga anv\u00e4ndare m\u00f6jlighet att registrera sig f\u00f6r en betalplan. \n\n Ta bort Ambee-integreringsposten fr\u00e5n din instans f\u00f6r att \u00e5tg\u00e4rda problemet.", - "title": "Ambee-integrationen tas bort" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/tr.json b/homeassistant/components/ambee/translations/tr.json deleted file mode 100644 index 0163ea40bae..00000000000 --- a/homeassistant/components/ambee/translations/tr.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "Yeniden kimlik do\u011frulama ba\u015far\u0131l\u0131 oldu" - }, - "error": { - "cannot_connect": "Ba\u011flanma hatas\u0131", - "invalid_api_key": "Ge\u00e7ersiz API anahtar\u0131" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API Anahtar\u0131", - "description": "Ambee hesab\u0131n\u0131zla yeniden kimlik do\u011frulamas\u0131 yap\u0131n." - } - }, - "user": { - "data": { - "api_key": "API Anahtar\u0131", - "latitude": "Enlem", - "longitude": "Boylam", - "name": "Ad" - }, - "description": "Ambee'yi Home Assistant ile entegre olacak \u015fekilde ayarlay\u0131n." - } - } - }, - "issues": { - "pending_removal": { - "description": "Ambee entegrasyonu Home Assistant'tan kald\u0131r\u0131lmay\u0131 beklemektedir ve Home Assistant 2022.10'dan itibaren art\u0131k kullan\u0131lamayacakt\u0131r.\n\nEntegrasyon kald\u0131r\u0131l\u0131yor \u00e7\u00fcnk\u00fc Ambee \u00fccretsiz (s\u0131n\u0131rl\u0131) hesaplar\u0131n\u0131 kald\u0131rd\u0131 ve art\u0131k normal kullan\u0131c\u0131lar\u0131n \u00fccretli bir plana kaydolmas\u0131 i\u00e7in bir yol sa\u011flam\u0131yor.\n\nBu sorunu gidermek i\u00e7in Ambee entegrasyon giri\u015fini \u00f6rne\u011finizden kald\u0131r\u0131n.", - "title": "Ambee entegrasyonu kald\u0131r\u0131l\u0131yor" - } - } -} \ No newline at end of file diff --git a/homeassistant/components/ambee/translations/zh-Hant.json b/homeassistant/components/ambee/translations/zh-Hant.json deleted file mode 100644 index ccebea49c6f..00000000000 --- a/homeassistant/components/ambee/translations/zh-Hant.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "config": { - "abort": { - "reauth_successful": "\u91cd\u65b0\u8a8d\u8b49\u6210\u529f" - }, - "error": { - "cannot_connect": "\u9023\u7dda\u5931\u6557", - "invalid_api_key": "API \u91d1\u9470\u7121\u6548" - }, - "step": { - "reauth_confirm": { - "data": { - "api_key": "API \u91d1\u9470", - "description": "\u91cd\u65b0\u8a8d\u8b49 Ambee \u5e33\u865f\u3002" - } - }, - "user": { - "data": { - "api_key": "API \u91d1\u9470", - "latitude": "\u7def\u5ea6", - "longitude": "\u7d93\u5ea6", - "name": "\u540d\u7a31" - }, - "description": "\u8a2d\u5b9a Ambee \u4ee5\u6574\u5408\u81f3 Home Assistant\u3002" - } - } - }, - "issues": { - "pending_removal": { - "description": "Ambee \u6574\u5408\u5373\u5c07\u7531 Home Assistant \u4e2d\u79fb\u9664\u3001\u4e26\u65bc Home Assistant 2022.10 \u7248\u5f8c\u7121\u6cd5\u518d\u4f7f\u7528\u3002\n\n\u7531\u65bc Ambee \u79fb\u9664\u4e86\u5176\u514d\u8cbb\uff08\u6709\u9650\uff09\u5e33\u865f\u3001\u4e26\u4e14\u4e0d\u518d\u63d0\u4f9b\u4e00\u822c\u4f7f\u7528\u8005\u8a3b\u518a\u4ed8\u8cbb\u670d\u52d9\u3001\u6574\u5408\u5373\u5c07\u79fb\u9664\u3002\n\n\u7531 configuration.yaml \u6a94\u6848\u4e2d\u79fb\u9664 YAML \u8a2d\u5b9a\u4e26\u91cd\u555f Home Assistant to \u4ee5\u4fee\u6b63\u6b64\u554f\u984c\u3002", - "title": "Ambee \u6574\u5408\u5373\u5c07\u79fb\u9664" - } - } -} \ No newline at end of file diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 22425231288..60ac2e8d511 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -24,7 +24,6 @@ FLOWS = { "aladdin_connect", "alarmdecoder", "almond", - "ambee", "amberelectric", "ambiclimate", "ambient_station", diff --git a/mypy.ini b/mypy.ini index 466f61814ba..3c886bdc1c2 100644 --- a/mypy.ini +++ b/mypy.ini @@ -279,16 +279,6 @@ disallow_untyped_defs = true warn_return_any = true warn_unreachable = true -[mypy-homeassistant.components.ambee.*] -check_untyped_defs = true -disallow_incomplete_defs = true -disallow_subclassing_any = true -disallow_untyped_calls = true -disallow_untyped_decorators = true -disallow_untyped_defs = true -warn_return_any = true -warn_unreachable = true - [mypy-homeassistant.components.ambient_station.*] check_untyped_defs = true disallow_incomplete_defs = true diff --git a/requirements_all.txt b/requirements_all.txt index 672f81ec72d..d2bf8734c2b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -297,9 +297,6 @@ airtouch4pyapi==1.0.5 # homeassistant.components.alpha_vantage alpha_vantage==2.3.1 -# homeassistant.components.ambee -ambee==0.4.0 - # homeassistant.components.amberelectric amberelectric==1.0.4 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 638d2fa5a56..8376456cb53 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -269,9 +269,6 @@ airthings_cloud==0.1.0 # homeassistant.components.airtouch4 airtouch4pyapi==1.0.5 -# homeassistant.components.ambee -ambee==0.4.0 - # homeassistant.components.amberelectric amberelectric==1.0.4 diff --git a/tests/components/ambee/__init__.py b/tests/components/ambee/__init__.py deleted file mode 100644 index 94c88557803..00000000000 --- a/tests/components/ambee/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests for the Ambee integration.""" diff --git a/tests/components/ambee/conftest.py b/tests/components/ambee/conftest.py deleted file mode 100644 index d6dd53a9711..00000000000 --- a/tests/components/ambee/conftest.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Fixtures for Ambee integration tests.""" -import json -from unittest.mock import AsyncMock, MagicMock, patch - -from ambee import AirQuality, Pollen -import pytest - -from homeassistant.components.ambee.const import DOMAIN -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE -from homeassistant.core import HomeAssistant - -from tests.common import MockConfigEntry, load_fixture -from tests.test_util.aiohttp import AiohttpClientMocker - - -@pytest.fixture -def mock_config_entry() -> MockConfigEntry: - """Return the default mocked config entry.""" - return MockConfigEntry( - title="Home Sweet Home", - domain=DOMAIN, - data={CONF_LATITUDE: 52.42, CONF_LONGITUDE: 4.44, CONF_API_KEY: "example"}, - unique_id="unique_thingy", - ) - - -@pytest.fixture -def mock_ambee(aioclient_mock: AiohttpClientMocker): - """Return a mocked Ambee client.""" - with patch("homeassistant.components.ambee.Ambee") as ambee_mock: - client = ambee_mock.return_value - client.air_quality = AsyncMock( - return_value=AirQuality.from_dict( - json.loads(load_fixture("ambee/air_quality.json")) - ) - ) - client.pollen = AsyncMock( - return_value=Pollen.from_dict(json.loads(load_fixture("ambee/pollen.json"))) - ) - yield ambee_mock - - -@pytest.fixture -async def init_integration( - hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_ambee: MagicMock -) -> MockConfigEntry: - """Set up the Ambee integration for testing.""" - mock_config_entry.add_to_hass(hass) - - await hass.config_entries.async_setup(mock_config_entry.entry_id) - await hass.async_block_till_done() - - return mock_config_entry diff --git a/tests/components/ambee/fixtures/air_quality.json b/tests/components/ambee/fixtures/air_quality.json deleted file mode 100644 index be75c832949..00000000000 --- a/tests/components/ambee/fixtures/air_quality.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "message": "success", - "stations": [ - { - "CO": 0.105, - "NO2": 0.66, - "OZONE": 17.067, - "PM10": 5.24, - "PM25": 3.14, - "SO2": 0.031, - "city": "Hellendoorn", - "countryCode": "NL", - "division": "", - "lat": 52.3981, - "lng": 6.4493, - "placeName": "Hellendoorn", - "postalCode": "7447", - "state": "Overijssel", - "updatedAt": "2021-05-29T14:00:00.000Z", - "AQI": 13, - "aqiInfo": { - "pollutant": "PM2.5", - "concentration": 3.14, - "category": "Good" - } - } - ] -} diff --git a/tests/components/ambee/fixtures/pollen.json b/tests/components/ambee/fixtures/pollen.json deleted file mode 100644 index 79d581ff3e2..00000000000 --- a/tests/components/ambee/fixtures/pollen.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "message": "Success", - "lat": 52.42, - "lng": 6.42, - "data": [ - { - "Count": { - "grass_pollen": 190, - "tree_pollen": 127, - "weed_pollen": 95 - }, - "Risk": { - "grass_pollen": "High", - "tree_pollen": "Moderate", - "weed_pollen": "High" - }, - "Species": { - "Grass": { - "Grass / Poaceae": 190 - }, - "Others": 5, - "Tree": { - "Alder": 0, - "Birch": 35, - "Cypress": 0, - "Elm": 0, - "Hazel": 0, - "Oak": 55, - "Pine": 30, - "Plane": 5, - "Poplar / Cottonwood": 0 - }, - "Weed": { - "Chenopod": 0, - "Mugwort": 1, - "Nettle": 88, - "Ragweed": 3 - } - }, - "updatedAt": "2021-06-09T16:24:27.000Z" - } - ] -} diff --git a/tests/components/ambee/test_config_flow.py b/tests/components/ambee/test_config_flow.py deleted file mode 100644 index 233bbaf232b..00000000000 --- a/tests/components/ambee/test_config_flow.py +++ /dev/null @@ -1,268 +0,0 @@ -"""Tests for the Ambee config flow.""" - -from unittest.mock import patch - -from ambee import AmbeeAuthenticationError, AmbeeError - -from homeassistant.components.ambee.const import DOMAIN -from homeassistant.config_entries import SOURCE_REAUTH, SOURCE_USER -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME -from homeassistant.core import HomeAssistant -from homeassistant.data_entry_flow import FlowResultType - -from tests.common import MockConfigEntry - - -async def test_full_user_flow(hass: HomeAssistant) -> None: - """Test the full user configuration flow.""" - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_USER} - ) - - assert result.get("type") == FlowResultType.FORM - assert result.get("step_id") == SOURCE_USER - assert "flow_id" in result - - with patch( - "homeassistant.components.ambee.config_flow.Ambee.air_quality" - ) as mock_ambee, patch( - "homeassistant.components.ambee.async_setup_entry", return_value=True - ) as mock_setup_entry: - result2 = await hass.config_entries.flow.async_configure( - result["flow_id"], - user_input={ - CONF_NAME: "Name", - CONF_API_KEY: "example", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - }, - ) - - assert result2.get("type") == FlowResultType.CREATE_ENTRY - assert result2.get("title") == "Name" - assert result2.get("data") == { - CONF_API_KEY: "example", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - } - - assert len(mock_setup_entry.mock_calls) == 1 - assert len(mock_ambee.mock_calls) == 1 - - -async def test_full_flow_with_authentication_error(hass: HomeAssistant) -> None: - """Test the full user configuration flow with an authentication error. - - This tests tests a full config flow, with a case the user enters an invalid - API token, but recover by entering the correct one. - """ - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_USER} - ) - - assert result.get("type") == FlowResultType.FORM - assert result.get("step_id") == SOURCE_USER - assert "flow_id" in result - - with patch( - "homeassistant.components.ambee.config_flow.Ambee.air_quality", - side_effect=AmbeeAuthenticationError, - ): - result2 = await hass.config_entries.flow.async_configure( - result["flow_id"], - user_input={ - CONF_NAME: "Name", - CONF_API_KEY: "invalid", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - }, - ) - - assert result2.get("type") == FlowResultType.FORM - assert result2.get("step_id") == SOURCE_USER - assert result2.get("errors") == {"base": "invalid_api_key"} - assert "flow_id" in result2 - - with patch( - "homeassistant.components.ambee.config_flow.Ambee.air_quality" - ) as mock_ambee, patch( - "homeassistant.components.ambee.async_setup_entry", return_value=True - ) as mock_setup_entry: - result3 = await hass.config_entries.flow.async_configure( - result2["flow_id"], - user_input={ - CONF_NAME: "Name", - CONF_API_KEY: "example", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - }, - ) - - assert result3.get("type") == FlowResultType.CREATE_ENTRY - assert result3.get("title") == "Name" - assert result3.get("data") == { - CONF_API_KEY: "example", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - } - - assert len(mock_setup_entry.mock_calls) == 1 - assert len(mock_ambee.mock_calls) == 1 - - -async def test_api_error(hass: HomeAssistant) -> None: - """Test API error.""" - with patch( - "homeassistant.components.ambee.Ambee.air_quality", - side_effect=AmbeeError, - ): - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_USER}, - data={ - CONF_NAME: "Name", - CONF_API_KEY: "example", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - }, - ) - - assert result.get("type") == FlowResultType.FORM - assert result.get("errors") == {"base": "cannot_connect"} - - -async def test_reauth_flow( - hass: HomeAssistant, mock_config_entry: MockConfigEntry -) -> None: - """Test the reauthentication configuration flow.""" - mock_config_entry.add_to_hass(hass) - - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={ - "source": SOURCE_REAUTH, - "unique_id": mock_config_entry.unique_id, - "entry_id": mock_config_entry.entry_id, - }, - data=mock_config_entry.data, - ) - assert result.get("type") == FlowResultType.FORM - assert result.get("step_id") == "reauth_confirm" - assert "flow_id" in result - - with patch( - "homeassistant.components.ambee.config_flow.Ambee.air_quality" - ) as mock_ambee, patch( - "homeassistant.components.ambee.async_setup_entry", return_value=True - ) as mock_setup_entry: - result2 = await hass.config_entries.flow.async_configure( - result["flow_id"], - {CONF_API_KEY: "other_key"}, - ) - await hass.async_block_till_done() - - assert result2.get("type") == FlowResultType.ABORT - assert result2.get("reason") == "reauth_successful" - assert mock_config_entry.data == { - CONF_API_KEY: "other_key", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - } - - assert len(mock_ambee.mock_calls) == 1 - assert len(mock_setup_entry.mock_calls) == 1 - - -async def test_reauth_with_authentication_error( - hass: HomeAssistant, mock_config_entry: MockConfigEntry -) -> None: - """Test the reauthentication configuration flow with an authentication error. - - This tests tests a reauth flow, with a case the user enters an invalid - API token, but recover by entering the correct one. - """ - mock_config_entry.add_to_hass(hass) - - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={ - "source": SOURCE_REAUTH, - "unique_id": mock_config_entry.unique_id, - "entry_id": mock_config_entry.entry_id, - }, - data=mock_config_entry.data, - ) - assert result.get("type") == FlowResultType.FORM - assert result.get("step_id") == "reauth_confirm" - assert "flow_id" in result - - with patch( - "homeassistant.components.ambee.config_flow.Ambee.air_quality", - side_effect=AmbeeAuthenticationError, - ): - result2 = await hass.config_entries.flow.async_configure( - result["flow_id"], - user_input={ - CONF_API_KEY: "invalid", - }, - ) - - assert result2.get("type") == FlowResultType.FORM - assert result2.get("step_id") == "reauth_confirm" - assert result2.get("errors") == {"base": "invalid_api_key"} - assert "flow_id" in result2 - - with patch( - "homeassistant.components.ambee.config_flow.Ambee.air_quality" - ) as mock_ambee, patch( - "homeassistant.components.ambee.async_setup_entry", return_value=True - ) as mock_setup_entry: - result3 = await hass.config_entries.flow.async_configure( - result["flow_id"], - {CONF_API_KEY: "other_key"}, - ) - await hass.async_block_till_done() - - assert result3.get("type") == FlowResultType.ABORT - assert result3.get("reason") == "reauth_successful" - assert mock_config_entry.data == { - CONF_API_KEY: "other_key", - CONF_LATITUDE: 52.42, - CONF_LONGITUDE: 4.44, - } - - assert len(mock_ambee.mock_calls) == 1 - assert len(mock_setup_entry.mock_calls) == 1 - - -async def test_reauth_api_error( - hass: HomeAssistant, mock_config_entry: MockConfigEntry -) -> None: - """Test API error during reauthentication.""" - mock_config_entry.add_to_hass(hass) - - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={ - "source": SOURCE_REAUTH, - "unique_id": mock_config_entry.unique_id, - "entry_id": mock_config_entry.entry_id, - }, - data=mock_config_entry.data, - ) - assert "flow_id" in result - - with patch( - "homeassistant.components.ambee.config_flow.Ambee.air_quality", - side_effect=AmbeeError, - ): - result2 = await hass.config_entries.flow.async_configure( - result["flow_id"], - user_input={ - CONF_API_KEY: "invalid", - }, - ) - - assert result2.get("type") == FlowResultType.FORM - assert result2.get("step_id") == "reauth_confirm" - assert result2.get("errors") == {"base": "cannot_connect"} diff --git a/tests/components/ambee/test_init.py b/tests/components/ambee/test_init.py deleted file mode 100644 index 059c58da803..00000000000 --- a/tests/components/ambee/test_init.py +++ /dev/null @@ -1,89 +0,0 @@ -"""Tests for the Ambee integration.""" -from collections.abc import Awaitable, Callable -from unittest.mock import AsyncMock, MagicMock, patch - -from aiohttp import ClientWebSocketResponse -from ambee import AmbeeConnectionError -from ambee.exceptions import AmbeeAuthenticationError -import pytest - -from homeassistant.components.ambee.const import DOMAIN -from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntryState -from homeassistant.core import HomeAssistant - -from tests.common import MockConfigEntry -from tests.components.repairs import get_repairs - - -async def test_load_unload_config_entry( - hass: HomeAssistant, - mock_config_entry: MockConfigEntry, - mock_ambee: AsyncMock, - hass_ws_client: Callable[[HomeAssistant], Awaitable[ClientWebSocketResponse]], -) -> None: - """Test the Ambee configuration entry loading/unloading.""" - mock_config_entry.add_to_hass(hass) - await hass.config_entries.async_setup(mock_config_entry.entry_id) - await hass.async_block_till_done() - - assert mock_config_entry.state is ConfigEntryState.LOADED - - issues = await get_repairs(hass, hass_ws_client) - assert len(issues) == 1 - assert issues[0]["issue_id"] == "pending_removal" - - await hass.config_entries.async_unload(mock_config_entry.entry_id) - await hass.async_block_till_done() - - issues = await get_repairs(hass, hass_ws_client) - assert len(issues) == 0 - - assert not hass.data.get(DOMAIN) - - -@patch( - "homeassistant.components.ambee.Ambee.request", - side_effect=AmbeeConnectionError, -) -async def test_config_entry_not_ready( - mock_request: MagicMock, - hass: HomeAssistant, - mock_config_entry: MockConfigEntry, -) -> None: - """Test the Ambee configuration entry not ready.""" - mock_config_entry.add_to_hass(hass) - await hass.config_entries.async_setup(mock_config_entry.entry_id) - await hass.async_block_till_done() - - assert mock_request.call_count == 1 - assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY - - -@pytest.mark.parametrize("service_name", ["air_quality", "pollen"]) -async def test_config_entry_authentication_failed( - hass: HomeAssistant, - mock_config_entry: MockConfigEntry, - mock_ambee: MagicMock, - service_name: str, -) -> None: - """Test the Ambee configuration entry not ready.""" - mock_config_entry.add_to_hass(hass) - - service = getattr(mock_ambee.return_value, service_name) - service.side_effect = AmbeeAuthenticationError - - await hass.config_entries.async_setup(mock_config_entry.entry_id) - await hass.async_block_till_done() - - assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR - - flows = hass.config_entries.flow.async_progress() - assert len(flows) == 1 - - flow = flows[0] - assert flow.get("step_id") == "reauth_confirm" - assert flow.get("handler") == DOMAIN - - assert "context" in flow - assert flow["context"].get("source") == SOURCE_REAUTH - assert flow["context"].get("entry_id") == mock_config_entry.entry_id diff --git a/tests/components/ambee/test_sensor.py b/tests/components/ambee/test_sensor.py deleted file mode 100644 index d143aea8f7c..00000000000 --- a/tests/components/ambee/test_sensor.py +++ /dev/null @@ -1,360 +0,0 @@ -"""Tests for the sensors provided by the Ambee integration.""" -from unittest.mock import AsyncMock - -import pytest - -from homeassistant.components.ambee.const import DEVICE_CLASS_AMBEE_RISK, DOMAIN -from homeassistant.components.sensor import ( - ATTR_STATE_CLASS, - DOMAIN as SENSOR_DOMAIN, - SensorDeviceClass, - SensorStateClass, -) -from homeassistant.const import ( - ATTR_DEVICE_CLASS, - ATTR_FRIENDLY_NAME, - ATTR_ICON, - ATTR_UNIT_OF_MEASUREMENT, - CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - CONCENTRATION_PARTS_PER_BILLION, - CONCENTRATION_PARTS_PER_CUBIC_METER, - CONCENTRATION_PARTS_PER_MILLION, -) -from homeassistant.core import HomeAssistant -from homeassistant.helpers import device_registry as dr, entity_registry as er - -from tests.common import MockConfigEntry - - -async def test_air_quality( - hass: HomeAssistant, - init_integration: MockConfigEntry, -) -> None: - """Test the Ambee Air Quality sensors.""" - entry_id = init_integration.entry_id - entity_registry = er.async_get(hass) - device_registry = dr.async_get(hass) - - state = hass.states.get("sensor.air_quality_particulate_matter_2_5") - entry = entity_registry.async_get("sensor.air_quality_particulate_matter_2_5") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_air_quality_particulate_matter_2_5" - assert state.state == "3.14" - assert ( - state.attributes.get(ATTR_FRIENDLY_NAME) - == "Air quality Particulate matter < 2.5 μm" - ) - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - assert ATTR_DEVICE_CLASS not in state.attributes - assert ATTR_ICON not in state.attributes - - state = hass.states.get("sensor.air_quality_particulate_matter_10") - entry = entity_registry.async_get("sensor.air_quality_particulate_matter_10") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_air_quality_particulate_matter_10" - assert state.state == "5.24" - assert ( - state.attributes.get(ATTR_FRIENDLY_NAME) - == "Air quality Particulate matter < 10 μm" - ) - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_MICROGRAMS_PER_CUBIC_METER - ) - assert ATTR_DEVICE_CLASS not in state.attributes - assert ATTR_ICON not in state.attributes - - state = hass.states.get("sensor.air_quality_sulphur_dioxide") - entry = entity_registry.async_get("sensor.air_quality_sulphur_dioxide") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_air_quality_sulphur_dioxide" - assert state.state == "0.031" - assert ( - state.attributes.get(ATTR_FRIENDLY_NAME) == "Air quality Sulphur dioxide (SO2)" - ) - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_BILLION - ) - assert ATTR_DEVICE_CLASS not in state.attributes - assert ATTR_ICON not in state.attributes - - state = hass.states.get("sensor.air_quality_nitrogen_dioxide") - entry = entity_registry.async_get("sensor.air_quality_nitrogen_dioxide") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_air_quality_nitrogen_dioxide" - assert state.state == "0.66" - assert ( - state.attributes.get(ATTR_FRIENDLY_NAME) == "Air quality Nitrogen dioxide (NO2)" - ) - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_BILLION - ) - assert ATTR_DEVICE_CLASS not in state.attributes - assert ATTR_ICON not in state.attributes - - state = hass.states.get("sensor.air_quality_ozone") - entry = entity_registry.async_get("sensor.air_quality_ozone") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_air_quality_ozone" - assert state.state == "17.067" - assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Air quality Ozone" - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_BILLION - ) - assert ATTR_DEVICE_CLASS not in state.attributes - assert ATTR_ICON not in state.attributes - - state = hass.states.get("sensor.air_quality_carbon_monoxide") - entry = entity_registry.async_get("sensor.air_quality_carbon_monoxide") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_air_quality_carbon_monoxide" - assert state.state == "0.105" - assert state.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.CO - assert ( - state.attributes.get(ATTR_FRIENDLY_NAME) == "Air quality Carbon monoxide (CO)" - ) - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_MILLION - ) - assert ATTR_ICON not in state.attributes - - state = hass.states.get("sensor.air_quality_air_quality_index") - entry = entity_registry.async_get("sensor.air_quality_air_quality_index") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_air_quality_air_quality_index" - assert state.state == "13" - assert ( - state.attributes.get(ATTR_FRIENDLY_NAME) - == "Air quality Air quality index (AQI)" - ) - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ATTR_DEVICE_CLASS not in state.attributes - assert ATTR_UNIT_OF_MEASUREMENT not in state.attributes - assert ATTR_ICON not in state.attributes - - assert entry.device_id - device_entry = device_registry.async_get(entry.device_id) - assert device_entry - assert device_entry.identifiers == {(DOMAIN, f"{entry_id}_air_quality")} - assert device_entry.manufacturer == "Ambee" - assert device_entry.name == "Air quality" - assert device_entry.entry_type is dr.DeviceEntryType.SERVICE - assert not device_entry.model - assert not device_entry.sw_version - - -async def test_pollen( - hass: HomeAssistant, - init_integration: MockConfigEntry, -) -> None: - """Test the Ambee Pollen sensors.""" - entry_id = init_integration.entry_id - entity_registry = er.async_get(hass) - device_registry = dr.async_get(hass) - - state = hass.states.get("sensor.pollen_grass") - entry = entity_registry.async_get("sensor.pollen_grass") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_pollen_grass" - assert state.state == "190" - assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Pollen Grass" - assert state.attributes.get(ATTR_ICON) == "mdi:grass" - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_CUBIC_METER - ) - assert ATTR_DEVICE_CLASS not in state.attributes - - state = hass.states.get("sensor.pollen_tree") - entry = entity_registry.async_get("sensor.pollen_tree") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_pollen_tree" - assert state.state == "127" - assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Pollen Tree" - assert state.attributes.get(ATTR_ICON) == "mdi:tree" - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_CUBIC_METER - ) - assert ATTR_DEVICE_CLASS not in state.attributes - - state = hass.states.get("sensor.pollen_weed") - entry = entity_registry.async_get("sensor.pollen_weed") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_pollen_weed" - assert state.state == "95" - assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Pollen Weed" - assert state.attributes.get(ATTR_ICON) == "mdi:sprout" - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_CUBIC_METER - ) - assert ATTR_DEVICE_CLASS not in state.attributes - - state = hass.states.get("sensor.pollen_grass_risk") - entry = entity_registry.async_get("sensor.pollen_grass_risk") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_pollen_grass_risk" - assert state.state == "high" - assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_AMBEE_RISK - assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Pollen Grass risk" - assert state.attributes.get(ATTR_ICON) == "mdi:grass" - assert ATTR_STATE_CLASS not in state.attributes - assert ATTR_UNIT_OF_MEASUREMENT not in state.attributes - - state = hass.states.get("sensor.pollen_tree_risk") - entry = entity_registry.async_get("sensor.pollen_tree_risk") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_pollen_tree_risk" - assert state.state == "moderate" - assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_AMBEE_RISK - assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Pollen Tree risk" - assert state.attributes.get(ATTR_ICON) == "mdi:tree" - assert ATTR_STATE_CLASS not in state.attributes - assert ATTR_UNIT_OF_MEASUREMENT not in state.attributes - - state = hass.states.get("sensor.pollen_weed_risk") - entry = entity_registry.async_get("sensor.pollen_weed_risk") - assert entry - assert state - assert entry.unique_id == f"{entry_id}_pollen_weed_risk" - assert state.state == "high" - assert state.attributes.get(ATTR_DEVICE_CLASS) == DEVICE_CLASS_AMBEE_RISK - assert state.attributes.get(ATTR_FRIENDLY_NAME) == "Pollen Weed risk" - assert state.attributes.get(ATTR_ICON) == "mdi:sprout" - assert ATTR_STATE_CLASS not in state.attributes - assert ATTR_UNIT_OF_MEASUREMENT not in state.attributes - - assert entry.device_id - device_entry = device_registry.async_get(entry.device_id) - assert device_entry - assert device_entry.identifiers == {(DOMAIN, f"{entry_id}_pollen")} - assert device_entry.manufacturer == "Ambee" - assert device_entry.name == "Pollen" - assert device_entry.entry_type is dr.DeviceEntryType.SERVICE - assert not device_entry.model - assert not device_entry.sw_version - - -@pytest.mark.parametrize( - "entity_id", - ( - "sensor.pollen_grass_poaceae", - "sensor.pollen_tree_alder", - "sensor.pollen_tree_birch", - "sensor.pollen_tree_cypress", - "sensor.pollen_tree_elm", - "sensor.pollen_tree_hazel", - "sensor.pollen_tree_oak", - "sensor.pollen_tree_pine", - "sensor.pollen_tree_plane", - "sensor.pollen_tree_poplar", - "sensor.pollen_weed_chenopod", - "sensor.pollen_weed_mugwort", - "sensor.pollen_weed_nettle", - "sensor.pollen_weed_ragweed", - ), -) -async def test_pollen_disabled_by_default( - hass: HomeAssistant, init_integration: MockConfigEntry, entity_id: str -) -> None: - """Test the Ambee Pollen sensors that are disabled by default.""" - entity_registry = er.async_get(hass) - - state = hass.states.get(entity_id) - assert state is None - - entry = entity_registry.async_get(entity_id) - assert entry - assert entry.disabled - assert entry.disabled_by is er.RegistryEntryDisabler.INTEGRATION - - -@pytest.mark.parametrize( - "key,icon,name,value", - [ - ("grass_poaceae", "mdi:grass", "Poaceae grass", "190"), - ("tree_alder", "mdi:tree", "Alder tree", "0"), - ("tree_birch", "mdi:tree", "Birch tree", "35"), - ("tree_cypress", "mdi:tree", "Cypress tree", "0"), - ("tree_elm", "mdi:tree", "Elm tree", "0"), - ("tree_hazel", "mdi:tree", "Hazel tree", "0"), - ("tree_oak", "mdi:tree", "Oak tree", "55"), - ("tree_pine", "mdi:tree", "Pine tree", "30"), - ("tree_plane", "mdi:tree", "Plane tree", "5"), - ("tree_poplar", "mdi:tree", "Poplar tree", "0"), - ("weed_chenopod", "mdi:sprout", "Chenopod weed", "0"), - ("weed_mugwort", "mdi:sprout", "Mugwort weed", "1"), - ("weed_nettle", "mdi:sprout", "Nettle weed", "88"), - ("weed_ragweed", "mdi:sprout", "Ragweed weed", "3"), - ], -) -async def test_pollen_enable_disable_by_defaults( - hass: HomeAssistant, - mock_config_entry: MockConfigEntry, - mock_ambee: AsyncMock, - key: str, - icon: str, - name: str, - value: str, -) -> None: - """Test the Ambee Pollen sensors that are disabled by default.""" - entry_id = mock_config_entry.entry_id - entity_id = f"{SENSOR_DOMAIN}.pollen_{key}" - entity_registry = er.async_get(hass) - - # Pre-create registry entry for disabled by default sensor - entity_registry.async_get_or_create( - SENSOR_DOMAIN, - DOMAIN, - f"{entry_id}_pollen_{key}", - suggested_object_id=f"pollen_{key}", - disabled_by=None, - ) - - mock_config_entry.add_to_hass(hass) - await hass.config_entries.async_setup(mock_config_entry.entry_id) - await hass.async_block_till_done() - - state = hass.states.get(entity_id) - entry = entity_registry.async_get(entity_id) - assert entry - assert state - assert entry.unique_id == f"{entry_id}_pollen_{key}" - assert state.state == value - assert state.attributes.get(ATTR_FRIENDLY_NAME) == f"Pollen {name}" - assert state.attributes.get(ATTR_ICON) == icon - assert state.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert ( - state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - == CONCENTRATION_PARTS_PER_CUBIC_METER - ) - assert ATTR_DEVICE_CLASS not in state.attributes