mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 22:27:07 +00:00
Merge pull request #70155 from home-assistant/rc
This commit is contained in:
commit
098c6d446e
@ -917,7 +917,6 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator):
|
||||
|
||||
async def force_data_refresh(self) -> None:
|
||||
"""Force update of the addon info."""
|
||||
await self.hassio.refresh_updates()
|
||||
(
|
||||
self.hass.data[DATA_INFO],
|
||||
self.hass.data[DATA_CORE_INFO],
|
||||
@ -976,3 +975,18 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator):
|
||||
except HassioAPIError as err:
|
||||
_LOGGER.warning("Could not fetch info for %s: %s", slug, err)
|
||||
return (slug, None)
|
||||
|
||||
async def _async_refresh(
|
||||
self,
|
||||
log_failures: bool = True,
|
||||
raise_on_auth_failed: bool = False,
|
||||
scheduled: bool = False,
|
||||
) -> None:
|
||||
"""Refresh data."""
|
||||
if not scheduled:
|
||||
# Force refreshing updates for non-scheduled updates
|
||||
try:
|
||||
await self.hassio.refresh_updates()
|
||||
except HassioAPIError as err:
|
||||
_LOGGER.warning("Error on Supervisor API: %s", err)
|
||||
await super()._async_refresh(log_failures, raise_on_auth_failed, scheduled)
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "KNX",
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/knx",
|
||||
"requirements": ["xknx==0.20.2"],
|
||||
"requirements": ["xknx==0.20.3"],
|
||||
"codeowners": ["@Julius2342", "@farmio", "@marvin-w"],
|
||||
"quality_scale": "silver",
|
||||
"iot_class": "local_push",
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "Mazda Connected Services",
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/mazda",
|
||||
"requirements": ["pymazda==0.3.2"],
|
||||
"requirements": ["pymazda==0.3.3"],
|
||||
"codeowners": ["@bdr99"],
|
||||
"quality_scale": "platinum",
|
||||
"iot_class": "cloud_polling",
|
||||
|
@ -83,18 +83,7 @@ async def _async_reproduce_states(
|
||||
cur_state = hass.states.get(state.entity_id)
|
||||
features = cur_state.attributes[ATTR_SUPPORTED_FEATURES] if cur_state else 0
|
||||
|
||||
if (
|
||||
ATTR_MEDIA_VOLUME_LEVEL in state.attributes
|
||||
and features & MediaPlayerEntityFeature.VOLUME_SET
|
||||
):
|
||||
await call_service(SERVICE_VOLUME_SET, [ATTR_MEDIA_VOLUME_LEVEL])
|
||||
|
||||
if (
|
||||
ATTR_MEDIA_VOLUME_MUTED in state.attributes
|
||||
and features & MediaPlayerEntityFeature.VOLUME_MUTE
|
||||
):
|
||||
await call_service(SERVICE_VOLUME_MUTE, [ATTR_MEDIA_VOLUME_MUTED])
|
||||
|
||||
# First set source & sound mode to match the saved supported features
|
||||
if (
|
||||
ATTR_INPUT_SOURCE in state.attributes
|
||||
and features & MediaPlayerEntityFeature.SELECT_SOURCE
|
||||
@ -107,6 +96,18 @@ async def _async_reproduce_states(
|
||||
):
|
||||
await call_service(SERVICE_SELECT_SOUND_MODE, [ATTR_SOUND_MODE])
|
||||
|
||||
if (
|
||||
ATTR_MEDIA_VOLUME_LEVEL in state.attributes
|
||||
and features & MediaPlayerEntityFeature.VOLUME_SET
|
||||
):
|
||||
await call_service(SERVICE_VOLUME_SET, [ATTR_MEDIA_VOLUME_LEVEL])
|
||||
|
||||
if (
|
||||
ATTR_MEDIA_VOLUME_MUTED in state.attributes
|
||||
and features & MediaPlayerEntityFeature.VOLUME_MUTE
|
||||
):
|
||||
await call_service(SERVICE_VOLUME_MUTE, [ATTR_MEDIA_VOLUME_MUTED])
|
||||
|
||||
already_playing = False
|
||||
|
||||
if (ATTR_MEDIA_CONTENT_TYPE in state.attributes) and (
|
||||
|
@ -21,6 +21,7 @@ from homeassistant.const import (
|
||||
Platform,
|
||||
)
|
||||
from homeassistant.core import Event, HomeAssistant
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||
from homeassistant.util.distance import convert as convert_distance
|
||||
@ -33,6 +34,7 @@ from .const import (
|
||||
DOMAIN,
|
||||
)
|
||||
|
||||
# Dedicated Home Assistant endpoint - do not change!
|
||||
URL = "https://aa015h6buqvih86i1.api.met.no/weatherapi/locationforecast/2.0/complete"
|
||||
|
||||
PLATFORMS = [Platform.WEATHER]
|
||||
@ -82,6 +84,10 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
|
||||
return unload_ok
|
||||
|
||||
|
||||
class CannotConnect(HomeAssistantError):
|
||||
"""Unable to connect to the web site."""
|
||||
|
||||
|
||||
class MetDataUpdateCoordinator(DataUpdateCoordinator["MetWeatherData"]):
|
||||
"""Class to manage fetching Met data."""
|
||||
|
||||
@ -173,7 +179,9 @@ class MetWeatherData:
|
||||
|
||||
async def fetch_data(self) -> MetWeatherData:
|
||||
"""Fetch data from API - (current weather and forecast)."""
|
||||
await self._weather_data.fetching_data()
|
||||
resp = await self._weather_data.fetching_data()
|
||||
if not resp:
|
||||
raise CannotConnect()
|
||||
self.current_weather_data = self._weather_data.get_current_weather()
|
||||
time_zone = dt_util.DEFAULT_TIME_ZONE
|
||||
self.daily_forecast = self._weather_data.get_forecast(time_zone, False)
|
||||
|
@ -162,6 +162,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
_LOGGER.debug("Authentication failed", exc_info=err)
|
||||
http_session.close()
|
||||
raise ConfigEntryAuthFailed from err
|
||||
except APIError as err:
|
||||
http_session.close()
|
||||
raise ConfigEntryNotReady from err
|
||||
|
||||
gateway_din = base_info.gateway_din
|
||||
if gateway_din and entry.unique_id is not None and is_ip_address(entry.unique_id):
|
||||
|
@ -20,11 +20,11 @@ from homeassistant.components.weather import (
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import (
|
||||
CONF_NAME,
|
||||
LENGTH_INCHES,
|
||||
LENGTH_MILES,
|
||||
PRESSURE_INHG,
|
||||
SPEED_MILES_PER_HOUR,
|
||||
TEMP_FAHRENHEIT,
|
||||
LENGTH_KILOMETERS,
|
||||
LENGTH_MILLIMETERS,
|
||||
PRESSURE_HPA,
|
||||
SPEED_METERS_PER_SECOND,
|
||||
TEMP_CELSIUS,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
@ -73,11 +73,11 @@ async def async_setup_entry(
|
||||
class TomorrowioWeatherEntity(TomorrowioEntity, WeatherEntity):
|
||||
"""Entity that talks to Tomorrow.io v4 API to retrieve weather data."""
|
||||
|
||||
_attr_temperature_unit = TEMP_FAHRENHEIT
|
||||
_attr_pressure_unit = PRESSURE_INHG
|
||||
_attr_wind_speed_unit = SPEED_MILES_PER_HOUR
|
||||
_attr_visibility_unit = LENGTH_MILES
|
||||
_attr_precipitation_unit = LENGTH_INCHES
|
||||
_attr_temperature_unit = TEMP_CELSIUS
|
||||
_attr_pressure_unit = PRESSURE_HPA
|
||||
_attr_wind_speed_unit = SPEED_METERS_PER_SECOND
|
||||
_attr_visibility_unit = LENGTH_KILOMETERS
|
||||
_attr_precipitation_unit = LENGTH_MILLIMETERS
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
|
@ -6,7 +6,7 @@ import logging
|
||||
from typing import Any
|
||||
|
||||
from pytrafikverket import TrafikverketTrain
|
||||
from pytrafikverket.trafikverket_train import TrainStop
|
||||
from pytrafikverket.trafikverket_train import StationInfo, TrainStop
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.sensor import (
|
||||
@ -166,8 +166,8 @@ class TrainSensor(SensorEntity):
|
||||
self,
|
||||
train_api: TrafikverketTrain,
|
||||
name: str,
|
||||
from_station: str,
|
||||
to_station: str,
|
||||
from_station: StationInfo,
|
||||
to_station: StationInfo,
|
||||
weekday: list,
|
||||
departuretime: time | None,
|
||||
entry_id: str,
|
||||
@ -188,7 +188,7 @@ class TrainSensor(SensorEntity):
|
||||
configuration_url="https://api.trafikinfo.trafikverket.se/",
|
||||
)
|
||||
self._attr_unique_id = create_unique_id(
|
||||
from_station, to_station, departuretime, weekday
|
||||
from_station.name, to_station.name, departuretime, weekday
|
||||
)
|
||||
|
||||
async def async_update(self) -> None:
|
||||
|
@ -7,7 +7,7 @@ from .backports.enum import StrEnum
|
||||
|
||||
MAJOR_VERSION: Final = 2022
|
||||
MINOR_VERSION: Final = 4
|
||||
PATCH_VERSION: Final = "4"
|
||||
PATCH_VERSION: Final = "5"
|
||||
__short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}"
|
||||
__version__: Final = f"{__short_version__}.{PATCH_VERSION}"
|
||||
REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 9, 0)
|
||||
|
@ -1619,7 +1619,7 @@ pymailgunner==1.4
|
||||
pymata-express==1.19
|
||||
|
||||
# homeassistant.components.mazda
|
||||
pymazda==0.3.2
|
||||
pymazda==0.3.3
|
||||
|
||||
# homeassistant.components.mediaroom
|
||||
pymediaroom==0.6.5.4
|
||||
@ -2435,7 +2435,7 @@ xbox-webapi==2.0.11
|
||||
xboxapi==2.0.1
|
||||
|
||||
# homeassistant.components.knx
|
||||
xknx==0.20.2
|
||||
xknx==0.20.3
|
||||
|
||||
# homeassistant.components.bluesound
|
||||
# homeassistant.components.fritz
|
||||
|
@ -1077,7 +1077,7 @@ pymailgunner==1.4
|
||||
pymata-express==1.19
|
||||
|
||||
# homeassistant.components.mazda
|
||||
pymazda==0.3.2
|
||||
pymazda==0.3.3
|
||||
|
||||
# homeassistant.components.melcloud
|
||||
pymelcloud==2.5.6
|
||||
@ -1575,7 +1575,7 @@ wolf_smartset==0.1.11
|
||||
xbox-webapi==2.0.11
|
||||
|
||||
# homeassistant.components.knx
|
||||
xknx==0.20.2
|
||||
xknx==0.20.3
|
||||
|
||||
# homeassistant.components.bluesound
|
||||
# homeassistant.components.fritz
|
||||
|
@ -1,6 +1,6 @@
|
||||
[metadata]
|
||||
name = homeassistant
|
||||
version = 2022.4.4
|
||||
version = 2022.4.5
|
||||
author = The Home Assistant Authors
|
||||
author_email = hello@home-assistant.io
|
||||
license = Apache-2.0
|
||||
|
@ -646,7 +646,8 @@ async def test_device_registry_calls(hass):
|
||||
|
||||
|
||||
async def test_coordinator_updates(hass, caplog):
|
||||
"""Test coordinator."""
|
||||
"""Test coordinator updates."""
|
||||
await async_setup_component(hass, "homeassistant", {})
|
||||
with patch.dict(os.environ, MOCK_ENVIRON), patch(
|
||||
"homeassistant.components.hassio.HassIO.refresh_updates"
|
||||
) as refresh_updates_mock:
|
||||
@ -656,14 +657,47 @@ async def test_coordinator_updates(hass, caplog):
|
||||
await hass.async_block_till_done()
|
||||
assert refresh_updates_mock.call_count == 1
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.hassio.HassIO.refresh_updates",
|
||||
) as refresh_updates_mock:
|
||||
async_fire_time_changed(hass, dt_util.now() + timedelta(minutes=20))
|
||||
await hass.async_block_till_done()
|
||||
assert refresh_updates_mock.call_count == 0
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.hassio.HassIO.refresh_updates",
|
||||
) as refresh_updates_mock:
|
||||
await hass.services.async_call(
|
||||
"homeassistant",
|
||||
"update_entity",
|
||||
{
|
||||
"entity_id": [
|
||||
"update.home_assistant_core_update",
|
||||
"update.home_assistant_supervisor_update",
|
||||
]
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
assert refresh_updates_mock.call_count == 1
|
||||
|
||||
# There is a 10s cooldown on the debouncer
|
||||
async_fire_time_changed(hass, dt_util.now() + timedelta(seconds=10))
|
||||
await hass.async_block_till_done()
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.hassio.HassIO.refresh_updates",
|
||||
side_effect=HassioAPIError("Unknown"),
|
||||
) as refresh_updates_mock:
|
||||
async_fire_time_changed(hass, dt_util.now() + timedelta(minutes=5))
|
||||
await hass.async_block_till_done()
|
||||
assert refresh_updates_mock.call_count == 1
|
||||
assert (
|
||||
"Error fetching hassio data: Error on Supervisor API: Unknown"
|
||||
in caplog.text
|
||||
await hass.services.async_call(
|
||||
"homeassistant",
|
||||
"update_entity",
|
||||
{
|
||||
"entity_id": [
|
||||
"update.home_assistant_core_update",
|
||||
"update.home_assistant_supervisor_update",
|
||||
]
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
assert refresh_updates_mock.call_count == 1
|
||||
assert "Error on Supervisor API: Unknown" in caplog.text
|
||||
|
@ -17,9 +17,6 @@ from homeassistant.components.tomorrowio.const import (
|
||||
DOMAIN,
|
||||
)
|
||||
from homeassistant.components.weather import (
|
||||
ATTR_CONDITION_CLOUDY,
|
||||
ATTR_CONDITION_RAINY,
|
||||
ATTR_CONDITION_SNOWY,
|
||||
ATTR_CONDITION_SUNNY,
|
||||
ATTR_FORECAST,
|
||||
ATTR_FORECAST_CONDITION,
|
||||
@ -93,153 +90,22 @@ async def test_v4_weather(hass: HomeAssistant) -> None:
|
||||
weather_state = await _setup(hass, API_V4_ENTRY_DATA)
|
||||
assert weather_state.state == ATTR_CONDITION_SUNNY
|
||||
assert weather_state.attributes[ATTR_ATTRIBUTION] == ATTRIBUTION
|
||||
assert weather_state.attributes[ATTR_FORECAST] == [
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY,
|
||||
ATTR_FORECAST_TIME: "2021-03-07T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 7.7,
|
||||
ATTR_FORECAST_TEMP_LOW: -3.3,
|
||||
ATTR_FORECAST_WIND_BEARING: 239.6,
|
||||
ATTR_FORECAST_WIND_SPEED: 4.24,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-08T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 9.7,
|
||||
ATTR_FORECAST_TEMP_LOW: -3.2,
|
||||
ATTR_FORECAST_WIND_BEARING: 262.82,
|
||||
ATTR_FORECAST_WIND_SPEED: 3.24,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-09T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 19.4,
|
||||
ATTR_FORECAST_TEMP_LOW: -0.3,
|
||||
ATTR_FORECAST_WIND_BEARING: 229.3,
|
||||
ATTR_FORECAST_WIND_SPEED: 3.15,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-10T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 18.5,
|
||||
ATTR_FORECAST_TEMP_LOW: 3.0,
|
||||
ATTR_FORECAST_WIND_BEARING: 149.91,
|
||||
ATTR_FORECAST_WIND_SPEED: 4.76,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-11T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 19.0,
|
||||
ATTR_FORECAST_TEMP_LOW: 9.0,
|
||||
ATTR_FORECAST_WIND_BEARING: 210.45,
|
||||
ATTR_FORECAST_WIND_SPEED: 7.01,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY,
|
||||
ATTR_FORECAST_TIME: "2021-03-12T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0.12,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25,
|
||||
ATTR_FORECAST_TEMP: 19.9,
|
||||
ATTR_FORECAST_TEMP_LOW: 12.1,
|
||||
ATTR_FORECAST_WIND_BEARING: 217.98,
|
||||
ATTR_FORECAST_WIND_SPEED: 5.5,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-13T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25,
|
||||
ATTR_FORECAST_TEMP: 12.5,
|
||||
ATTR_FORECAST_TEMP_LOW: 6.1,
|
||||
ATTR_FORECAST_WIND_BEARING: 58.79,
|
||||
ATTR_FORECAST_WIND_SPEED: 4.35,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_SNOWY,
|
||||
ATTR_FORECAST_TIME: "2021-03-14T10:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 23.96,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 95,
|
||||
ATTR_FORECAST_TEMP: 6.1,
|
||||
ATTR_FORECAST_TEMP_LOW: 0.8,
|
||||
ATTR_FORECAST_WIND_BEARING: 70.25,
|
||||
ATTR_FORECAST_WIND_SPEED: 7.26,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_SNOWY,
|
||||
ATTR_FORECAST_TIME: "2021-03-15T10:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 1.46,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55,
|
||||
ATTR_FORECAST_TEMP: 6.5,
|
||||
ATTR_FORECAST_TEMP_LOW: -1.5,
|
||||
ATTR_FORECAST_WIND_BEARING: 84.47,
|
||||
ATTR_FORECAST_WIND_SPEED: 7.1,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-16T10:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 6.1,
|
||||
ATTR_FORECAST_TEMP_LOW: -1.6,
|
||||
ATTR_FORECAST_WIND_BEARING: 103.85,
|
||||
ATTR_FORECAST_WIND_SPEED: 3.0,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-17T10:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 11.3,
|
||||
ATTR_FORECAST_TEMP_LOW: 1.3,
|
||||
ATTR_FORECAST_WIND_BEARING: 145.41,
|
||||
ATTR_FORECAST_WIND_SPEED: 3.25,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY,
|
||||
ATTR_FORECAST_TIME: "2021-03-18T10:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 10,
|
||||
ATTR_FORECAST_TEMP: 12.3,
|
||||
ATTR_FORECAST_TEMP_LOW: 5.2,
|
||||
ATTR_FORECAST_WIND_BEARING: 62.99,
|
||||
ATTR_FORECAST_WIND_SPEED: 2.94,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY,
|
||||
ATTR_FORECAST_TIME: "2021-03-19T10:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 2.93,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55,
|
||||
ATTR_FORECAST_TEMP: 9.4,
|
||||
ATTR_FORECAST_TEMP_LOW: 4.1,
|
||||
ATTR_FORECAST_WIND_BEARING: 68.54,
|
||||
ATTR_FORECAST_WIND_SPEED: 6.22,
|
||||
},
|
||||
{
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_SNOWY,
|
||||
ATTR_FORECAST_TIME: "2021-03-20T10:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 1.22,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 33.3,
|
||||
ATTR_FORECAST_TEMP: 4.5,
|
||||
ATTR_FORECAST_TEMP_LOW: 1.7,
|
||||
ATTR_FORECAST_WIND_BEARING: 56.98,
|
||||
ATTR_FORECAST_WIND_SPEED: 7.76,
|
||||
},
|
||||
]
|
||||
assert len(weather_state.attributes[ATTR_FORECAST]) == 14
|
||||
assert weather_state.attributes[ATTR_FORECAST][0] == {
|
||||
ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY,
|
||||
ATTR_FORECAST_TIME: "2021-03-07T11:00:00+00:00",
|
||||
ATTR_FORECAST_PRECIPITATION: 0,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0,
|
||||
ATTR_FORECAST_TEMP: 45.9,
|
||||
ATTR_FORECAST_TEMP_LOW: 26.1,
|
||||
ATTR_FORECAST_WIND_BEARING: 239.6,
|
||||
ATTR_FORECAST_WIND_SPEED: 9.49,
|
||||
}
|
||||
assert weather_state.attributes[ATTR_FRIENDLY_NAME] == "Tomorrow.io - Daily"
|
||||
assert weather_state.attributes[ATTR_WEATHER_HUMIDITY] == 23
|
||||
assert weather_state.attributes[ATTR_WEATHER_OZONE] == 46.53
|
||||
assert weather_state.attributes[ATTR_WEATHER_PRESSURE] == 102776.91
|
||||
assert weather_state.attributes[ATTR_WEATHER_TEMPERATURE] == 6.7
|
||||
assert weather_state.attributes[ATTR_WEATHER_VISIBILITY] == 13.12
|
||||
assert weather_state.attributes[ATTR_WEATHER_PRESSURE] == 3035.0
|
||||
assert weather_state.attributes[ATTR_WEATHER_TEMPERATURE] == 44.1
|
||||
assert weather_state.attributes[ATTR_WEATHER_VISIBILITY] == 8.15
|
||||
assert weather_state.attributes[ATTR_WEATHER_WIND_BEARING] == 315.14
|
||||
assert weather_state.attributes[ATTR_WEATHER_WIND_SPEED] == 4.17
|
||||
assert weather_state.attributes[ATTR_WEATHER_WIND_SPEED] == 9.33
|
||||
|
Loading…
x
Reference in New Issue
Block a user