mirror of https://github.com/home-assistant/core
258 lines
8.1 KiB
Python
258 lines
8.1 KiB
Python
"""The tests for the Netatmo sensor platform."""
|
|
|
|
from unittest.mock import AsyncMock
|
|
|
|
import pytest
|
|
from syrupy import SnapshotAssertion
|
|
|
|
from homeassistant.components.netatmo import sensor
|
|
from homeassistant.const import Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import entity_registry as er
|
|
|
|
from .common import selected_platforms, snapshot_platform_entities
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
|
|
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
|
|
async def test_entity(
|
|
hass: HomeAssistant,
|
|
config_entry: MockConfigEntry,
|
|
netatmo_auth: AsyncMock,
|
|
snapshot: SnapshotAssertion,
|
|
entity_registry: er.EntityRegistry,
|
|
) -> None:
|
|
"""Test entities."""
|
|
await snapshot_platform_entities(
|
|
hass,
|
|
config_entry,
|
|
Platform.SENSOR,
|
|
entity_registry,
|
|
snapshot,
|
|
)
|
|
|
|
|
|
async def test_indoor_sensor(
|
|
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
|
|
) -> None:
|
|
"""Test indoor sensor setup."""
|
|
with selected_platforms([Platform.SENSOR]):
|
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
prefix = "sensor.parents_bedroom_"
|
|
|
|
assert hass.states.get(f"{prefix}temperature").state == "20.3"
|
|
assert hass.states.get(f"{prefix}humidity").state == "63"
|
|
assert hass.states.get(f"{prefix}carbon_dioxide").state == "494"
|
|
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1014.5"
|
|
|
|
|
|
async def test_weather_sensor(
|
|
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
|
|
) -> None:
|
|
"""Test weather sensor unreachable."""
|
|
with selected_platforms([Platform.SENSOR]):
|
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
prefix = "sensor.villa_outdoor_"
|
|
|
|
assert hass.states.get(f"{prefix}temperature").state == "unavailable"
|
|
|
|
|
|
async def test_public_weather_sensor(
|
|
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
|
|
) -> None:
|
|
"""Test public weather sensor setup."""
|
|
with selected_platforms([Platform.SENSOR]):
|
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
assert len(hass.states.async_all()) > 0
|
|
|
|
prefix = "sensor.home_max_"
|
|
|
|
assert hass.states.get(f"{prefix}temperature").state == "27.4"
|
|
assert hass.states.get(f"{prefix}humidity").state == "76"
|
|
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1014.4"
|
|
|
|
prefix = "sensor.home_min_"
|
|
|
|
assert hass.states.get(f"{prefix}temperature").state == "19.8"
|
|
assert hass.states.get(f"{prefix}humidity").state == "56"
|
|
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1005.4"
|
|
|
|
prefix = "sensor.home_avg_"
|
|
|
|
assert hass.states.get(f"{prefix}temperature").state == "22.7"
|
|
assert hass.states.get(f"{prefix}humidity").state == "63.2"
|
|
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1010.4"
|
|
|
|
entities_before_change = len(hass.states.async_all())
|
|
|
|
valid_option = {
|
|
"lat_ne": 32.91336,
|
|
"lon_ne": -117.187429,
|
|
"lat_sw": 32.83336,
|
|
"lon_sw": -117.26743,
|
|
"show_on_map": True,
|
|
"area_name": "Home avg",
|
|
"mode": "max",
|
|
}
|
|
|
|
result = await hass.config_entries.options.async_init(config_entry.entry_id)
|
|
result = await hass.config_entries.options.async_configure(
|
|
result["flow_id"], user_input={"new_area": "Home avg"}
|
|
)
|
|
result = await hass.config_entries.options.async_configure(
|
|
result["flow_id"], user_input=valid_option
|
|
)
|
|
result = await hass.config_entries.options.async_configure(
|
|
result["flow_id"], user_input={}
|
|
)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
assert len(hass.states.async_all()) == entities_before_change
|
|
assert hass.states.get(f"{prefix}temperature").state == "27.4"
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("strength", "expected"),
|
|
[(50, "Full"), (60, "High"), (80, "Medium"), (90, "Low")],
|
|
)
|
|
async def test_process_wifi(strength: int, expected: str) -> None:
|
|
"""Test wifi strength translation."""
|
|
assert sensor.process_wifi(strength) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("strength", "expected"),
|
|
[(50, "Full"), (70, "High"), (80, "Medium"), (90, "Low")],
|
|
)
|
|
async def test_process_rf(strength: int, expected: str) -> None:
|
|
"""Test radio strength translation."""
|
|
assert sensor.process_rf(strength) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("health", "expected"),
|
|
[(4, "unhealthy"), (3, "poor"), (2, "fair"), (1, "fine"), (0, "healthy")],
|
|
)
|
|
async def test_process_health(health: int, expected: str) -> None:
|
|
"""Test health index translation."""
|
|
assert sensor.process_health(health) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("uid", "name", "expected"),
|
|
[
|
|
("12:34:56:03:1b:e4-reachable", "villa_garden_reachable", "True"),
|
|
("12:34:56:03:1b:e4-rf_status", "villa_garden_radio", "Full"),
|
|
(
|
|
"12:34:56:80:bb:26-wifi_status",
|
|
"villa_wifi_strength",
|
|
"High",
|
|
),
|
|
(
|
|
"12:34:56:80:bb:26-temp_trend",
|
|
"villa_temperature_trend",
|
|
"stable",
|
|
),
|
|
(
|
|
"12:34:56:80:bb:26-pressure_trend",
|
|
"villa_pressure_trend",
|
|
"up",
|
|
),
|
|
("12:34:56:80:c1:ea-sum_rain_1", "villa_rain_rain_last_hour", "0"),
|
|
("12:34:56:80:c1:ea-sum_rain_24", "villa_rain_rain_today", "6.9"),
|
|
("12:34:56:03:1b:e4-windangle", "netatmoindoor_garden_direction", "sw"),
|
|
(
|
|
"12:34:56:03:1b:e4-windangle_value",
|
|
"netatmoindoor_garden_angle",
|
|
"217",
|
|
),
|
|
("12:34:56:03:1b:e4-gustangle", "mystation_garden_gust_direction", "s"),
|
|
(
|
|
"12:34:56:03:1b:e4-gustangle",
|
|
"netatmoindoor_garden_gust_direction",
|
|
"s",
|
|
),
|
|
(
|
|
"12:34:56:03:1b:e4-gustangle_value",
|
|
"netatmoindoor_garden_gust_angle",
|
|
"206",
|
|
),
|
|
(
|
|
"12:34:56:03:1b:e4-guststrength",
|
|
"netatmoindoor_garden_gust_strength",
|
|
"9",
|
|
),
|
|
(
|
|
"12:34:56:03:1b:e4-rf_status",
|
|
"netatmoindoor_garden_rf_strength",
|
|
"Full",
|
|
),
|
|
(
|
|
"12:34:56:26:68:92-health_idx",
|
|
"baby_bedroom_health",
|
|
"fine",
|
|
),
|
|
(
|
|
"12:34:56:26:68:92-wifi_status",
|
|
"baby_bedroom_wifi",
|
|
"High",
|
|
),
|
|
("Home-max-windangle_value", "home_max_wind_angle", "17"),
|
|
("Home-max-gustangle_value", "home_max_gust_angle", "217"),
|
|
("Home-max-guststrength", "home_max_gust_strength", "31"),
|
|
("Home-max-sum_rain_1", "home_max_sum_rain_1", "0.2"),
|
|
],
|
|
)
|
|
async def test_weather_sensor_enabling(
|
|
hass: HomeAssistant,
|
|
entity_registry: er.EntityRegistry,
|
|
config_entry: MockConfigEntry,
|
|
uid: str,
|
|
name: str,
|
|
expected: str,
|
|
netatmo_auth: AsyncMock,
|
|
) -> None:
|
|
"""Test enabling of by default disabled sensors."""
|
|
with selected_platforms([Platform.SENSOR]):
|
|
states_before = len(hass.states.async_all())
|
|
assert hass.states.get(f"sensor.{name}") is None
|
|
|
|
entity_registry.async_get_or_create(
|
|
"sensor",
|
|
"netatmo",
|
|
uid,
|
|
suggested_object_id=name,
|
|
disabled_by=None,
|
|
)
|
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
assert len(hass.states.async_all()) > states_before
|
|
assert hass.states.get(f"sensor.{name}").state == expected
|
|
|
|
|
|
async def test_climate_battery_sensor(
|
|
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
|
|
) -> None:
|
|
"""Test climate device battery sensor."""
|
|
with selected_platforms([Platform.CLIMATE, Platform.SENSOR]):
|
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
prefix = "sensor.livingroom_"
|
|
|
|
assert hass.states.get(f"{prefix}battery").state == "75"
|