mirror of
https://github.com/home-assistant/core.git
synced 2025-07-17 10:17:09 +00:00
Do not activate Met.no without setting a Home coordinates (#48741)
This commit is contained in:
parent
5f8fcca5ad
commit
6ec8e17e7b
@ -19,7 +19,12 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda
|
|||||||
from homeassistant.util.distance import convert as convert_distance
|
from homeassistant.util.distance import convert as convert_distance
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
from .const import CONF_TRACK_HOME, DOMAIN
|
from .const import (
|
||||||
|
CONF_TRACK_HOME,
|
||||||
|
DEFAULT_HOME_LATITUDE,
|
||||||
|
DEFAULT_HOME_LONGITUDE,
|
||||||
|
DOMAIN,
|
||||||
|
)
|
||||||
|
|
||||||
URL = "https://aa015h6buqvih86i1.api.met.no/weatherapi/locationforecast/2.0/complete"
|
URL = "https://aa015h6buqvih86i1.api.met.no/weatherapi/locationforecast/2.0/complete"
|
||||||
|
|
||||||
@ -35,6 +40,20 @@ async def async_setup(hass: HomeAssistant, config: Config) -> bool:
|
|||||||
|
|
||||||
async def async_setup_entry(hass, config_entry):
|
async def async_setup_entry(hass, config_entry):
|
||||||
"""Set up Met as config entry."""
|
"""Set up Met as config entry."""
|
||||||
|
# Don't setup if tracking home location and latitude or longitude isn't set.
|
||||||
|
# Also, filters out our onboarding default location.
|
||||||
|
if config_entry.data.get(CONF_TRACK_HOME, False) and (
|
||||||
|
(not hass.config.latitude and not hass.config.longitude)
|
||||||
|
or (
|
||||||
|
hass.config.latitude == DEFAULT_HOME_LATITUDE
|
||||||
|
and hass.config.longitude == DEFAULT_HOME_LONGITUDE
|
||||||
|
)
|
||||||
|
):
|
||||||
|
_LOGGER.warning(
|
||||||
|
"Skip setting up met.no integration; No Home location has been set"
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
coordinator = MetDataUpdateCoordinator(hass, config_entry)
|
coordinator = MetDataUpdateCoordinator(hass, config_entry)
|
||||||
await coordinator.async_config_entry_first_refresh()
|
await coordinator.async_config_entry_first_refresh()
|
||||||
|
|
||||||
|
@ -10,7 +10,13 @@ from homeassistant.const import CONF_ELEVATION, CONF_LATITUDE, CONF_LONGITUDE, C
|
|||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
|
||||||
from .const import CONF_TRACK_HOME, DOMAIN, HOME_LOCATION_NAME
|
from .const import (
|
||||||
|
CONF_TRACK_HOME,
|
||||||
|
DEFAULT_HOME_LATITUDE,
|
||||||
|
DEFAULT_HOME_LONGITUDE,
|
||||||
|
DOMAIN,
|
||||||
|
HOME_LOCATION_NAME,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
@ -81,6 +87,14 @@ class MetFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
|
|
||||||
async def async_step_onboarding(self, data=None):
|
async def async_step_onboarding(self, data=None):
|
||||||
"""Handle a flow initialized by onboarding."""
|
"""Handle a flow initialized by onboarding."""
|
||||||
|
# Don't create entry if latitude or longitude isn't set.
|
||||||
|
# Also, filters out our onboarding default location.
|
||||||
|
if (not self.hass.config.latitude and not self.hass.config.longitude) or (
|
||||||
|
self.hass.config.latitude == DEFAULT_HOME_LATITUDE
|
||||||
|
and self.hass.config.longitude == DEFAULT_HOME_LONGITUDE
|
||||||
|
):
|
||||||
|
return self.async_abort(reason="no_home")
|
||||||
|
|
||||||
return self.async_create_entry(
|
return self.async_create_entry(
|
||||||
title=HOME_LOCATION_NAME, data={CONF_TRACK_HOME: True}
|
title=HOME_LOCATION_NAME, data={CONF_TRACK_HOME: True}
|
||||||
)
|
)
|
||||||
|
@ -34,6 +34,9 @@ HOME_LOCATION_NAME = "Home"
|
|||||||
|
|
||||||
CONF_TRACK_HOME = "track_home"
|
CONF_TRACK_HOME = "track_home"
|
||||||
|
|
||||||
|
DEFAULT_HOME_LATITUDE = 52.3731339
|
||||||
|
DEFAULT_HOME_LONGITUDE = 4.8903147
|
||||||
|
|
||||||
ENTITY_ID_SENSOR_FORMAT_HOME = f"{WEATHER_DOMAIN}.met_{HOME_LOCATION_NAME}"
|
ENTITY_ID_SENSOR_FORMAT_HOME = f"{WEATHER_DOMAIN}.met_{HOME_LOCATION_NAME}"
|
||||||
|
|
||||||
CONDITIONS_MAP = {
|
CONDITIONS_MAP = {
|
||||||
|
@ -12,6 +12,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": { "already_configured": "[%key:common::config_flow::abort::already_configured_service%]" }
|
"error": {
|
||||||
|
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
|
||||||
|
},
|
||||||
|
"abort": {
|
||||||
|
"no_home": "No home coordinates are set in the Home Assistant configuration"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,24 @@
|
|||||||
"""Tests for Met.no."""
|
"""Tests for Met.no."""
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from homeassistant.components.met.const import DOMAIN
|
from homeassistant.components.met.const import CONF_TRACK_HOME, DOMAIN
|
||||||
from homeassistant.const import CONF_ELEVATION, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
|
from homeassistant.const import CONF_ELEVATION, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
|
|
||||||
async def init_integration(hass) -> MockConfigEntry:
|
async def init_integration(hass, track_home=False) -> MockConfigEntry:
|
||||||
"""Set up the Met integration in Home Assistant."""
|
"""Set up the Met integration in Home Assistant."""
|
||||||
entry_data = {
|
entry_data = {
|
||||||
CONF_NAME: "test",
|
CONF_NAME: "test",
|
||||||
CONF_LATITUDE: 0,
|
CONF_LATITUDE: 0,
|
||||||
CONF_LONGITUDE: 0,
|
CONF_LONGITUDE: 1.0,
|
||||||
CONF_ELEVATION: 0,
|
CONF_ELEVATION: 1.0,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if track_home:
|
||||||
|
entry_data = {CONF_TRACK_HOME: True}
|
||||||
|
|
||||||
entry = MockConfigEntry(domain=DOMAIN, data=entry_data)
|
entry = MockConfigEntry(domain=DOMAIN, data=entry_data)
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.met.metno.MetWeatherData.fetching_data",
|
"homeassistant.components.met.metno.MetWeatherData.fetching_data",
|
||||||
|
@ -4,6 +4,7 @@ from unittest.mock import patch
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.met.const import DOMAIN, HOME_LOCATION_NAME
|
from homeassistant.components.met.const import DOMAIN, HOME_LOCATION_NAME
|
||||||
|
from homeassistant.config import async_process_ha_core_config
|
||||||
from homeassistant.const import CONF_ELEVATION, CONF_LATITUDE, CONF_LONGITUDE
|
from homeassistant.const import CONF_ELEVATION, CONF_LATITUDE, CONF_LONGITUDE
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
@ -106,6 +107,25 @@ async def test_onboarding_step(hass):
|
|||||||
assert result["data"] == {"track_home": True}
|
assert result["data"] == {"track_home": True}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("latitude,longitude", [(52.3731339, 4.8903147), (0.0, 0.0)])
|
||||||
|
async def test_onboarding_step_abort_no_home(hass, latitude, longitude):
|
||||||
|
"""Test entry not created when default step fails."""
|
||||||
|
await async_process_ha_core_config(
|
||||||
|
hass,
|
||||||
|
{"latitude": latitude, "longitude": longitude},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert hass.config.latitude == latitude
|
||||||
|
assert hass.config.longitude == longitude
|
||||||
|
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN, context={"source": "onboarding"}, data={}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] == "abort"
|
||||||
|
assert result["reason"] == "no_home"
|
||||||
|
|
||||||
|
|
||||||
async def test_import_step(hass):
|
async def test_import_step(hass):
|
||||||
"""Test initializing via import step."""
|
"""Test initializing via import step."""
|
||||||
test_data = {
|
test_data = {
|
||||||
|
@ -1,6 +1,15 @@
|
|||||||
"""Test the Met integration init."""
|
"""Test the Met integration init."""
|
||||||
from homeassistant.components.met.const import DOMAIN
|
from homeassistant.components.met.const import (
|
||||||
from homeassistant.config_entries import ENTRY_STATE_LOADED, ENTRY_STATE_NOT_LOADED
|
DEFAULT_HOME_LATITUDE,
|
||||||
|
DEFAULT_HOME_LONGITUDE,
|
||||||
|
DOMAIN,
|
||||||
|
)
|
||||||
|
from homeassistant.config import async_process_ha_core_config
|
||||||
|
from homeassistant.config_entries import (
|
||||||
|
ENTRY_STATE_LOADED,
|
||||||
|
ENTRY_STATE_NOT_LOADED,
|
||||||
|
ENTRY_STATE_SETUP_ERROR,
|
||||||
|
)
|
||||||
|
|
||||||
from . import init_integration
|
from . import init_integration
|
||||||
|
|
||||||
@ -17,3 +26,24 @@ async def test_unload_entry(hass):
|
|||||||
|
|
||||||
assert entry.state == ENTRY_STATE_NOT_LOADED
|
assert entry.state == ENTRY_STATE_NOT_LOADED
|
||||||
assert not hass.data.get(DOMAIN)
|
assert not hass.data.get(DOMAIN)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_fail_default_home_entry(hass, caplog):
|
||||||
|
"""Test abort setup of default home location."""
|
||||||
|
await async_process_ha_core_config(
|
||||||
|
hass,
|
||||||
|
{"latitude": 52.3731339, "longitude": 4.8903147},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert hass.config.latitude == DEFAULT_HOME_LATITUDE
|
||||||
|
assert hass.config.longitude == DEFAULT_HOME_LONGITUDE
|
||||||
|
|
||||||
|
entry = await init_integration(hass, track_home=True)
|
||||||
|
|
||||||
|
assert len(hass.config_entries.async_entries(DOMAIN)) == 1
|
||||||
|
assert entry.state == ENTRY_STATE_SETUP_ERROR
|
||||||
|
|
||||||
|
assert (
|
||||||
|
"Skip setting up met.no integration; No Home location has been set"
|
||||||
|
in caplog.text
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user