mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Remove Ambee integration (#78427)
This commit is contained in:
parent
9382f4be23
commit
393f1487a5
@ -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.*
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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,
|
||||
)
|
@ -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,
|
||||
),
|
||||
],
|
||||
}
|
@ -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"
|
||||
}
|
@ -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]
|
@ -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."
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"low": "Low",
|
||||
"moderate": "Moderate",
|
||||
"high": "High",
|
||||
"very high": "Very High"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"config": {
|
||||
"step": {
|
||||
"reauth_confirm": {
|
||||
"data": {
|
||||
"api_key": "Chave da API"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"data": {
|
||||
"latitude": "Latitude",
|
||||
"name": "Nome"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Alt",
|
||||
"low": "Baix",
|
||||
"moderate": "Moderat",
|
||||
"very high": "Molt alt"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Hoch",
|
||||
"low": "Niedrig",
|
||||
"moderate": "M\u00e4\u00dfig",
|
||||
"very high": "Sehr hoch"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "High",
|
||||
"low": "Low",
|
||||
"moderate": "Moderate",
|
||||
"very high": "Very High"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Alto",
|
||||
"low": "Bajo",
|
||||
"moderate": "Moderado",
|
||||
"very high": "Muy alto"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Alto",
|
||||
"low": "Bajo",
|
||||
"moderate": "Moderado",
|
||||
"very high": "Muy alto"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "K\u00f5rge",
|
||||
"low": "Madal",
|
||||
"moderate": "M\u00f5\u00f5dukas",
|
||||
"very high": "V\u00e4ga k\u00f5rge"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Haute",
|
||||
"low": "Faible",
|
||||
"moderate": "Mod\u00e9rer",
|
||||
"very high": "Tr\u00e8s \u00e9lev\u00e9"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Magas",
|
||||
"low": "Alacsony",
|
||||
"moderate": "M\u00e9rs\u00e9kelt",
|
||||
"very high": "Nagyon magas"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Tinggi",
|
||||
"low": "Rendah",
|
||||
"moderate": "Sedang",
|
||||
"very high": "Sangat Tinggi"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Alto",
|
||||
"low": "Basso",
|
||||
"moderate": "Moderato",
|
||||
"very high": "Molto alto"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "\u9ad8\u3044",
|
||||
"low": "\u4f4e\u3044",
|
||||
"moderate": "\u9069\u5ea6",
|
||||
"very high": "\u975e\u5e38\u306b\u9ad8\u3044"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Hoog",
|
||||
"low": "Laag",
|
||||
"moderate": "Matig",
|
||||
"very high": "Zeer hoog"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "H\u00f8y",
|
||||
"low": "Lav",
|
||||
"moderate": "Moderat",
|
||||
"very high": "Veldig h\u00f8y"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "wysoki",
|
||||
"low": "niski",
|
||||
"moderate": "umiarkowany",
|
||||
"very high": "bardzo wysoki"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Alto",
|
||||
"low": "Baixo",
|
||||
"moderate": "Moderado",
|
||||
"very high": "Muito alto"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "H\u00f6g",
|
||||
"low": "L\u00e5g",
|
||||
"moderate": "M\u00e5ttlig",
|
||||
"very high": "V\u00e4ldigt h\u00f6gt"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "Y\u00fcksek",
|
||||
"low": "D\u00fc\u015f\u00fck",
|
||||
"moderate": "Moderate",
|
||||
"very high": "\u00c7ok y\u00fcksek"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"state": {
|
||||
"ambee__risk": {
|
||||
"high": "\u9ad8",
|
||||
"low": "\u4f4e",
|
||||
"moderate": "\u4e2d",
|
||||
"very high": "\u6975\u9ad8"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -24,7 +24,6 @@ FLOWS = {
|
||||
"aladdin_connect",
|
||||
"alarmdecoder",
|
||||
"almond",
|
||||
"ambee",
|
||||
"amberelectric",
|
||||
"ambiclimate",
|
||||
"ambient_station",
|
||||
|
10
mypy.ini
10
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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -1 +0,0 @@
|
||||
"""Tests for the Ambee integration."""
|
@ -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
|
@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
@ -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"}
|
@ -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
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user