mirror of
https://github.com/home-assistant/core.git
synced 2026-08-28 02:24:46 -05:00
215 lines
7.0 KiB
Python
215 lines
7.0 KiB
Python
"""Test KNX weather."""
|
|
|
|
import pytest
|
|
|
|
from homeassistant.components.knx.schema import WeatherSchema
|
|
from homeassistant.components.weather import (
|
|
ATTR_CONDITION_CLEAR_NIGHT,
|
|
ATTR_CONDITION_EXCEPTIONAL,
|
|
ATTR_CONDITION_RAINY,
|
|
ATTR_CONDITION_SUNNY,
|
|
ATTR_CONDITION_WINDY,
|
|
)
|
|
from homeassistant.const import CONF_NAME, Platform
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from . import KnxEntityGenerator
|
|
from .conftest import KNXTestKit
|
|
|
|
|
|
async def test_weather(hass: HomeAssistant, knx: KNXTestKit) -> None:
|
|
"""Test KNX weather."""
|
|
|
|
await knx.setup_integration(
|
|
{
|
|
WeatherSchema.PLATFORM: {
|
|
CONF_NAME: "test",
|
|
WeatherSchema.CONF_KNX_WIND_ALARM_ADDRESS: "1/1/1",
|
|
WeatherSchema.CONF_KNX_RAIN_ALARM_ADDRESS: "1/1/2",
|
|
WeatherSchema.CONF_KNX_FROST_ALARM_ADDRESS: "1/1/3",
|
|
WeatherSchema.CONF_KNX_HUMIDITY_ADDRESS: "1/1/4",
|
|
WeatherSchema.CONF_KNX_BRIGHTNESS_EAST_ADDRESS: "1/1/5",
|
|
WeatherSchema.CONF_KNX_BRIGHTNESS_SOUTH_ADDRESS: "1/1/6",
|
|
WeatherSchema.CONF_KNX_BRIGHTNESS_WEST_ADDRESS: "1/1/7",
|
|
WeatherSchema.CONF_KNX_BRIGHTNESS_NORTH_ADDRESS: "1/1/8",
|
|
WeatherSchema.CONF_KNX_WIND_SPEED_ADDRESS: "1/1/9",
|
|
WeatherSchema.CONF_KNX_WIND_BEARING_ADDRESS: "1/1/10",
|
|
WeatherSchema.CONF_KNX_TEMPERATURE_ADDRESS: "1/1/11",
|
|
WeatherSchema.CONF_KNX_DAY_NIGHT_ADDRESS: "1/1/12",
|
|
WeatherSchema.CONF_KNX_AIR_PRESSURE_ADDRESS: "1/1/13",
|
|
}
|
|
}
|
|
)
|
|
state = hass.states.get("weather.test")
|
|
assert state.state is ATTR_CONDITION_EXCEPTIONAL
|
|
|
|
# StateUpdater initialize states
|
|
await knx.assert_read("1/1/11")
|
|
await knx.receive_response("1/1/11", (0, 40))
|
|
|
|
# brightness
|
|
await knx.assert_read("1/1/6")
|
|
await knx.assert_read("1/1/8")
|
|
await knx.receive_response("1/1/6", (0x7C, 0x5E))
|
|
await knx.receive_response("1/1/8", (0x7C, 0x5E))
|
|
await knx.assert_read("1/1/5")
|
|
await knx.assert_read("1/1/7")
|
|
await knx.receive_response("1/1/7", (0x7C, 0x5E))
|
|
await knx.receive_response("1/1/5", (0x7C, 0x5E))
|
|
|
|
# wind speed
|
|
await knx.assert_read("1/1/9")
|
|
await knx.receive_response("1/1/9", (0, 40))
|
|
|
|
# wind bearing
|
|
await knx.assert_read("1/1/10")
|
|
await knx.receive_response("1/1/10", (0xBF,))
|
|
|
|
# alarms
|
|
await knx.assert_read("1/1/2")
|
|
await knx.receive_response("1/1/2", False)
|
|
await knx.assert_read("1/1/1")
|
|
await knx.assert_read("1/1/3")
|
|
await knx.receive_response("1/1/1", False)
|
|
await knx.receive_response("1/1/3", False)
|
|
|
|
# day night
|
|
await knx.assert_read("1/1/12")
|
|
await knx.receive_response("1/1/12", False)
|
|
|
|
# air pressure
|
|
await knx.assert_read("1/1/13")
|
|
await knx.receive_response("1/1/13", (0x6C, 0xAD))
|
|
|
|
# humidity
|
|
await knx.assert_read("1/1/4")
|
|
await knx.receive_response("1/1/4", (0, 40))
|
|
|
|
# verify state
|
|
state = hass.states.get("weather.test")
|
|
assert state.attributes["temperature"] == 0.4
|
|
assert state.attributes["wind_bearing"] == 270
|
|
assert state.attributes["wind_speed"] == 1.44
|
|
assert state.attributes["pressure"] == 980.58
|
|
assert state.state is ATTR_CONDITION_SUNNY
|
|
|
|
# update from KNX - set rain alarm
|
|
await knx.receive_write("1/1/2", True)
|
|
state = hass.states.get("weather.test")
|
|
assert state.state is ATTR_CONDITION_RAINY
|
|
|
|
# update from KNX - set wind alarm
|
|
await knx.receive_write("1/1/2", False)
|
|
await knx.receive_write("1/1/1", True)
|
|
state = hass.states.get("weather.test")
|
|
assert state.state is ATTR_CONDITION_WINDY
|
|
|
|
|
|
async def test_weather_ui_create(
|
|
hass: HomeAssistant,
|
|
knx: KNXTestKit,
|
|
create_ui_entity: KnxEntityGenerator,
|
|
) -> None:
|
|
"""Test creating a weather station from UI."""
|
|
await knx.setup_integration()
|
|
await create_ui_entity(
|
|
platform=Platform.WEATHER,
|
|
entity_data={"name": "test"},
|
|
knx_data={
|
|
"ga_temperature": {"state": "1/1/11"},
|
|
"ga_rain_alarm": {"state": "1/1/2"},
|
|
"ga_wind_alarm": {"state": "1/1/1"},
|
|
"sync_state": True,
|
|
},
|
|
)
|
|
state = hass.states.get("weather.test")
|
|
assert state.state is ATTR_CONDITION_EXCEPTIONAL
|
|
|
|
await knx.assert_read("1/1/11")
|
|
await knx.receive_response("1/1/11", (0, 40))
|
|
|
|
await knx.assert_read("1/1/2")
|
|
await knx.receive_response("1/1/2", True)
|
|
await knx.assert_read("1/1/1")
|
|
await knx.receive_response("1/1/1", False)
|
|
|
|
state = hass.states.get("weather.test")
|
|
assert state.attributes["temperature"] == 0.4
|
|
assert state.state is ATTR_CONDITION_RAINY
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("invert_day_night", "day_night_payload"),
|
|
[
|
|
# DPT 1.024: `1` is night - yields a clear-night condition
|
|
pytest.param(False, True, id="dpt_1_024"),
|
|
# inverted: `0` is night
|
|
pytest.param(True, False, id="inverted"),
|
|
],
|
|
)
|
|
async def test_weather_ui_invert_day_night(
|
|
hass: HomeAssistant,
|
|
knx: KNXTestKit,
|
|
create_ui_entity: KnxEntityGenerator,
|
|
invert_day_night: bool,
|
|
day_night_payload: bool,
|
|
) -> None:
|
|
"""Test UI weather day/night follows DPT 1.024 and can be inverted."""
|
|
await knx.setup_integration()
|
|
await create_ui_entity(
|
|
platform=Platform.WEATHER,
|
|
entity_data={"name": "test"},
|
|
knx_data={
|
|
"ga_temperature": {"state": "1/1/11"},
|
|
"ga_day_night": {"state": "1/1/12"},
|
|
"invert_day_night": invert_day_night,
|
|
"sync_state": True,
|
|
},
|
|
)
|
|
await knx.assert_read("1/1/11", response=(0, 40))
|
|
await knx.assert_read("1/1/12", response=day_night_payload)
|
|
knx.assert_state("weather.test", ATTR_CONDITION_CLEAR_NIGHT)
|
|
|
|
|
|
async def test_weather_ui_load(knx: KNXTestKit) -> None:
|
|
"""Test loading a weather station from storage."""
|
|
await knx.setup_integration(config_store_fixture="config_store_weather.json")
|
|
|
|
await knx.assert_read("1/1/11", response=(0, 40))
|
|
|
|
# brightness
|
|
await knx.assert_read("1/1/6")
|
|
await knx.assert_read("1/1/8")
|
|
await knx.receive_response("1/1/6", (0x7C, 0x5E))
|
|
await knx.receive_response("1/1/8", (0x7C, 0x5E))
|
|
await knx.assert_read("1/1/5")
|
|
await knx.assert_read("1/1/7")
|
|
await knx.receive_response("1/1/7", (0x7C, 0x5E))
|
|
await knx.receive_response("1/1/5", (0x7C, 0x5E))
|
|
|
|
# wind speed
|
|
await knx.assert_read("1/1/9", response=(0, 40))
|
|
# wind bearing
|
|
await knx.assert_read("1/1/10", response=(0xBF,))
|
|
|
|
# alarms
|
|
await knx.assert_read("1/1/2", response=False)
|
|
await knx.assert_read("1/1/1")
|
|
await knx.assert_read("1/1/3")
|
|
await knx.receive_response("1/1/1", False)
|
|
await knx.receive_response("1/1/3", False)
|
|
|
|
# day night
|
|
await knx.assert_read("1/1/12", response=False)
|
|
# air pressure
|
|
await knx.assert_read("1/1/13", response=(0x6C, 0xAD))
|
|
# humidity
|
|
await knx.assert_read("1/1/4", response=(0, 40))
|
|
|
|
knx.assert_state(
|
|
"weather.test",
|
|
ATTR_CONDITION_SUNNY,
|
|
temperature=0.4,
|
|
wind_bearing=270,
|
|
)
|