mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
Add hourly forecast to met.no (#38700)
* Add hourly forecast * fix tests to assert for 2 entities created * fix test to assert for 4 calls * correct test tracking home number of calls * fox tests * fix test * Apply suggestions from code review * black Co-authored-by: Chris Talkington <chris@talkingtontech.com>
This commit is contained in:
parent
844b3f8d23
commit
8555e17eb9
@ -22,7 +22,7 @@ import homeassistant.util.dt as dt_util
|
|||||||
|
|
||||||
from .const import CONF_TRACK_HOME, DOMAIN
|
from .const import CONF_TRACK_HOME, DOMAIN
|
||||||
|
|
||||||
URL = "https://aa015h6buqvih86i1.api.met.no/weatherapi/locationforecast/1.9/"
|
URL = "https://api.met.no/weatherapi/locationforecast/2.0/classic"
|
||||||
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -116,7 +116,8 @@ class MetWeatherData:
|
|||||||
self._is_metric = is_metric
|
self._is_metric = is_metric
|
||||||
self._weather_data = None
|
self._weather_data = None
|
||||||
self.current_weather_data = {}
|
self.current_weather_data = {}
|
||||||
self.forecast_data = None
|
self.daily_forecast = None
|
||||||
|
self.hourly_forecast = None
|
||||||
|
|
||||||
def init_data(self):
|
def init_data(self):
|
||||||
"""Weather data inialization - get the coordinates."""
|
"""Weather data inialization - get the coordinates."""
|
||||||
@ -149,5 +150,6 @@ class MetWeatherData:
|
|||||||
await self._weather_data.fetching_data()
|
await self._weather_data.fetching_data()
|
||||||
self.current_weather_data = self._weather_data.get_current_weather()
|
self.current_weather_data = self._weather_data.get_current_weather()
|
||||||
time_zone = dt_util.DEFAULT_TIME_ZONE
|
time_zone = dt_util.DEFAULT_TIME_ZONE
|
||||||
self.forecast_data = self._weather_data.get_forecast(time_zone)
|
self.daily_forecast = self._weather_data.get_forecast(time_zone, False)
|
||||||
|
self.hourly_forecast = self._weather_data.get_forecast(time_zone, True)
|
||||||
return self
|
return self
|
||||||
|
@ -66,18 +66,27 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
|||||||
"""Add a weather entity from a config_entry."""
|
"""Add a weather entity from a config_entry."""
|
||||||
coordinator = hass.data[DOMAIN][config_entry.entry_id]
|
coordinator = hass.data[DOMAIN][config_entry.entry_id]
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
[MetWeather(coordinator, config_entry.data, hass.config.units.is_metric)]
|
[
|
||||||
|
MetWeather(
|
||||||
|
coordinator, config_entry.data, hass.config.units.is_metric, False
|
||||||
|
),
|
||||||
|
MetWeather(
|
||||||
|
coordinator, config_entry.data, hass.config.units.is_metric, True
|
||||||
|
),
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class MetWeather(WeatherEntity):
|
class MetWeather(WeatherEntity):
|
||||||
"""Implementation of a Met.no weather condition."""
|
"""Implementation of a Met.no weather condition."""
|
||||||
|
|
||||||
def __init__(self, coordinator, config, is_metric):
|
def __init__(self, coordinator, config, is_metric, hourly):
|
||||||
"""Initialise the platform with a data instance and site."""
|
"""Initialise the platform with a data instance and site."""
|
||||||
self._config = config
|
self._config = config
|
||||||
self._coordinator = coordinator
|
self._coordinator = coordinator
|
||||||
self._is_metric = is_metric
|
self._is_metric = is_metric
|
||||||
|
self._hourly = hourly
|
||||||
|
self._name_appendix = "-hourly" if hourly else ""
|
||||||
|
|
||||||
async def async_added_to_hass(self):
|
async def async_added_to_hass(self):
|
||||||
"""Start fetching data."""
|
"""Start fetching data."""
|
||||||
@ -103,9 +112,9 @@ class MetWeather(WeatherEntity):
|
|||||||
def unique_id(self):
|
def unique_id(self):
|
||||||
"""Return unique ID."""
|
"""Return unique ID."""
|
||||||
if self.track_home:
|
if self.track_home:
|
||||||
return "home"
|
return f"home{self._name_appendix}"
|
||||||
|
|
||||||
return f"{self._config[CONF_LATITUDE]}-{self._config[CONF_LONGITUDE]}"
|
return f"{self._config[CONF_LATITUDE]}-{self._config[CONF_LONGITUDE]}{self._name_appendix}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
@ -113,12 +122,12 @@ class MetWeather(WeatherEntity):
|
|||||||
name = self._config.get(CONF_NAME)
|
name = self._config.get(CONF_NAME)
|
||||||
|
|
||||||
if name is not None:
|
if name is not None:
|
||||||
return name
|
return f"{name}{self._name_appendix}"
|
||||||
|
|
||||||
if self.track_home:
|
if self.track_home:
|
||||||
return self.hass.config.location_name
|
return f"{self.hass.config.location_name}{self._name_appendix}"
|
||||||
|
|
||||||
return DEFAULT_NAME
|
return f"{DEFAULT_NAME}{self._name_appendix}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def condition(self):
|
def condition(self):
|
||||||
@ -173,4 +182,6 @@ class MetWeather(WeatherEntity):
|
|||||||
@property
|
@property
|
||||||
def forecast(self):
|
def forecast(self):
|
||||||
"""Return the forecast array."""
|
"""Return the forecast array."""
|
||||||
return self._coordinator.data.forecast_data
|
if self._hourly:
|
||||||
|
return self._coordinator.data.hourly_forecast
|
||||||
|
return self._coordinator.data.daily_forecast
|
||||||
|
@ -5,14 +5,14 @@ async def test_tracking_home(hass, mock_weather):
|
|||||||
"""Test we track home."""
|
"""Test we track home."""
|
||||||
await hass.config_entries.flow.async_init("met", context={"source": "onboarding"})
|
await hass.config_entries.flow.async_init("met", context={"source": "onboarding"})
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(hass.states.async_entity_ids("weather")) == 1
|
assert len(hass.states.async_entity_ids("weather")) == 2
|
||||||
assert len(mock_weather.mock_calls) == 3
|
assert len(mock_weather.mock_calls) == 4
|
||||||
|
|
||||||
# Test we track config
|
# Test we track config
|
||||||
await hass.config.async_update(latitude=10, longitude=20)
|
await hass.config.async_update(latitude=10, longitude=20)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert len(mock_weather.mock_calls) == 6
|
assert len(mock_weather.mock_calls) == 8
|
||||||
|
|
||||||
entry = hass.config_entries.async_entries()[0]
|
entry = hass.config_entries.async_entries()[0]
|
||||||
await hass.config_entries.async_remove(entry.entry_id)
|
await hass.config_entries.async_remove(entry.entry_id)
|
||||||
@ -27,14 +27,14 @@ async def test_not_tracking_home(hass, mock_weather):
|
|||||||
data={"name": "Somewhere", "latitude": 10, "longitude": 20, "elevation": 0},
|
data={"name": "Somewhere", "latitude": 10, "longitude": 20, "elevation": 0},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(hass.states.async_entity_ids("weather")) == 1
|
assert len(hass.states.async_entity_ids("weather")) == 2
|
||||||
assert len(mock_weather.mock_calls) == 3
|
assert len(mock_weather.mock_calls) == 4
|
||||||
|
|
||||||
# Test we do not track config
|
# Test we do not track config
|
||||||
await hass.config.async_update(latitude=10, longitude=20)
|
await hass.config.async_update(latitude=10, longitude=20)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert len(mock_weather.mock_calls) == 3
|
assert len(mock_weather.mock_calls) == 4
|
||||||
|
|
||||||
entry = hass.config_entries.async_entries()[0]
|
entry = hass.config_entries.async_entries()[0]
|
||||||
await hass.config_entries.async_remove(entry.entry_id)
|
await hass.config_entries.async_remove(entry.entry_id)
|
||||||
|
@ -276,4 +276,4 @@ async def test_onboarding_core_sets_up_met(hass, hass_storage, hass_client):
|
|||||||
assert resp.status == 200
|
assert resp.status == 200
|
||||||
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(hass.states.async_entity_ids("weather")) == 1
|
assert len(hass.states.async_entity_ids("weather")) == 2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user