Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion homeassistant/components/met/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@
from homeassistant.util.distance import convert as convert_distance
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"

Expand All @@ -35,6 +40,20 @@ async def async_setup(hass: HomeAssistant, config: Config) -> bool:

async def async_setup_entry(hass, 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)
await coordinator.async_config_entry_first_refresh()

Expand Down
16 changes: 15 additions & 1 deletion homeassistant/components/met/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@
from homeassistant.core import callback
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
Expand Down Expand Up @@ -81,6 +87,14 @@ async def async_step_import(self, user_input: dict | None = None) -> dict[str, A

async def async_step_onboarding(self, data=None):
"""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")
Comment thread
MartinHjelmare marked this conversation as resolved.

return self.async_create_entry(
title=HOME_LOCATION_NAME, data={CONF_TRACK_HOME: True}
)
3 changes: 3 additions & 0 deletions homeassistant/components/met/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@

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}"

CONDITIONS_MAP = {
Expand Down
7 changes: 6 additions & 1 deletion homeassistant/components/met/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
}
}
12 changes: 8 additions & 4 deletions tests/components/met/__init__.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
"""Tests for Met.no."""
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 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."""
entry_data = {
CONF_NAME: "test",
CONF_LATITUDE: 0,
CONF_LONGITUDE: 0,
CONF_ELEVATION: 0,
CONF_LONGITUDE: 1.0,
CONF_ELEVATION: 1.0,
}

if track_home:
entry_data = {CONF_TRACK_HOME: True}

entry = MockConfigEntry(domain=DOMAIN, data=entry_data)
with patch(
"homeassistant.components.met.metno.MetWeatherData.fetching_data",
Expand Down
20 changes: 20 additions & 0 deletions tests/components/met/test_config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import pytest

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 tests.common import MockConfigEntry
Expand Down Expand Up @@ -106,6 +107,25 @@ async def test_onboarding_step(hass):
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):
"""Test initializing via import step."""
test_data = {
Expand Down
34 changes: 32 additions & 2 deletions tests/components/met/test_init.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
"""Test the Met integration init."""
from homeassistant.components.met.const import DOMAIN
from homeassistant.config_entries import ENTRY_STATE_LOADED, ENTRY_STATE_NOT_LOADED
from homeassistant.components.met.const import (
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

Expand All @@ -17,3 +26,24 @@ async def test_unload_entry(hass):

assert entry.state == ENTRY_STATE_NOT_LOADED
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
)