Add day/night markers to MetOffice daily forecast (#58679)

This commit is contained in:
avee87 2021-12-02 02:42:59 +00:00 committed by GitHub
parent d066864158
commit d0da0eef36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 2 deletions

View File

@ -24,6 +24,8 @@ DOMAIN = "metoffice"
DEFAULT_NAME = "Met Office"
ATTRIBUTION = "Data provided by the Met Office"
ATTR_FORECAST_DAYTIME = "daytime"
DEFAULT_SCAN_INTERVAL = timedelta(minutes=15)
METOFFICE_COORDINATES = "metoffice_coordinates"

View File

@ -15,6 +15,7 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import get_device_info
from .const import (
ATTR_FORECAST_DAYTIME,
ATTRIBUTION,
CONDITION_CLASSES,
DEFAULT_NAME,
@ -46,7 +47,7 @@ async def async_setup_entry(
)
def _build_forecast_data(timestep):
def _build_forecast_data(timestep, use_3hourly):
data = {}
data[ATTR_FORECAST_TIME] = timestep.date.isoformat()
if timestep.weather:
@ -59,6 +60,9 @@ def _build_forecast_data(timestep):
data[ATTR_FORECAST_WIND_BEARING] = timestep.wind_direction.value
if timestep.wind_speed:
data[ATTR_FORECAST_WIND_SPEED] = timestep.wind_speed.value
if not use_3hourly:
# if it's close to noon, mark as Day, otherwise as Night
data[ATTR_FORECAST_DAYTIME] = abs(timestep.date.hour - 12) < 6
return data
@ -82,6 +86,7 @@ class MetOfficeWeather(CoordinatorEntity, WeatherEntity):
)
self._attr_name = f"{DEFAULT_NAME} {hass_data[METOFFICE_NAME]} {mode_label}"
self._attr_unique_id = hass_data[METOFFICE_COORDINATES]
self._use_3hourly = use_3hourly
if not use_3hourly:
self._attr_unique_id = f"{self._attr_unique_id}_{MODE_DAILY}"
@ -155,7 +160,7 @@ class MetOfficeWeather(CoordinatorEntity, WeatherEntity):
if self.coordinator.data.forecast is None:
return None
return [
_build_forecast_data(timestep)
_build_forecast_data(timestep, self._use_3hourly)
for timestep in self.coordinator.data.forecast
]

View File

@ -181,6 +181,13 @@ async def test_one_weather_site_running(hass, requests_mock, legacy_patchable_ti
assert weather.attributes.get("forecast")[7]["temperature"] == 13
assert weather.attributes.get("forecast")[7]["wind_speed"] == 13
assert weather.attributes.get("forecast")[7]["wind_bearing"] == "SE"
assert weather.attributes.get("forecast")[7]["daytime"] is True
# Check that night entry is correctly marked as Night
assert (
weather.attributes.get("forecast")[6]["datetime"] == "2020-04-29T00:00:00+00:00"
)
assert weather.attributes.get("forecast")[6]["daytime"] is False
@patch(
@ -256,6 +263,7 @@ async def test_two_weather_sites_running(hass, requests_mock, legacy_patchable_t
assert weather.attributes.get("forecast")[18]["temperature"] == 9
assert weather.attributes.get("forecast")[18]["wind_speed"] == 4
assert weather.attributes.get("forecast")[18]["wind_bearing"] == "NW"
assert "daytime" not in weather.attributes.get("forecast")[18]
# Wavertree daily weather platform expected results
weather = hass.states.get("weather.met_office_wavertree_daily")
@ -279,6 +287,7 @@ async def test_two_weather_sites_running(hass, requests_mock, legacy_patchable_t
assert weather.attributes.get("forecast")[7]["temperature"] == 13
assert weather.attributes.get("forecast")[7]["wind_speed"] == 13
assert weather.attributes.get("forecast")[7]["wind_bearing"] == "SE"
assert weather.attributes.get("forecast")[7]["daytime"] is True
# King's Lynn 3-hourly weather platform expected results
weather = hass.states.get("weather.met_office_king_s_lynn_3_hourly")
@ -303,6 +312,7 @@ async def test_two_weather_sites_running(hass, requests_mock, legacy_patchable_t
assert weather.attributes.get("forecast")[18]["temperature"] == 10
assert weather.attributes.get("forecast")[18]["wind_speed"] == 7
assert weather.attributes.get("forecast")[18]["wind_bearing"] == "SE"
assert "daytime" not in weather.attributes.get("forecast")[18]
# King's Lynn daily weather platform expected results
weather = hass.states.get("weather.met_office_king_s_lynn_daily")
@ -326,3 +336,4 @@ async def test_two_weather_sites_running(hass, requests_mock, legacy_patchable_t
assert weather.attributes.get("forecast")[5]["temperature"] == 11
assert weather.attributes.get("forecast")[5]["wind_speed"] == 7
assert weather.attributes.get("forecast")[5]["wind_bearing"] == "ESE"
assert weather.attributes.get("forecast")[5]["daytime"] is True