142 lines
4.7 KiB
Python
142 lines
4.7 KiB
Python
"""The buienradar integration."""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
|
from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import entity_registry
|
|
from homeassistant.helpers.typing import ConfigType
|
|
|
|
from .const import (
|
|
CONF_COUNTRY,
|
|
CONF_DELTA,
|
|
CONF_DIMENSION,
|
|
CONF_TIMEFRAME,
|
|
DEFAULT_COUNTRY,
|
|
DEFAULT_DELTA,
|
|
DEFAULT_DIMENSION,
|
|
DEFAULT_TIMEFRAME,
|
|
DOMAIN,
|
|
)
|
|
|
|
PLATFORMS = ["camera", "sensor", "weather"]
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|
"""Set up the buienradar component."""
|
|
hass.data.setdefault(DOMAIN, {})
|
|
|
|
weather_configs = _filter_domain_configs(config, "weather", DOMAIN)
|
|
sensor_configs = _filter_domain_configs(config, "sensor", DOMAIN)
|
|
camera_configs = _filter_domain_configs(config, "camera", DOMAIN)
|
|
|
|
_import_configs(hass, weather_configs, sensor_configs, camera_configs)
|
|
|
|
return True
|
|
|
|
|
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Set up buienradar from a config entry."""
|
|
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
|
|
entry.async_on_unload(entry.add_update_listener(async_update_options))
|
|
return True
|
|
|
|
|
|
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Unload a config entry."""
|
|
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
|
|
|
return unload_ok
|
|
|
|
|
|
async def async_update_options(hass: HomeAssistant, config_entry: ConfigEntry) -> None:
|
|
"""Update options."""
|
|
await hass.config_entries.async_reload(config_entry.entry_id)
|
|
|
|
|
|
def _import_configs(
|
|
hass: HomeAssistant,
|
|
weather_configs: list[ConfigType],
|
|
sensor_configs: list[ConfigType],
|
|
camera_configs: list[ConfigType],
|
|
) -> None:
|
|
camera_config = {}
|
|
if camera_configs:
|
|
camera_config = camera_configs[0]
|
|
|
|
for config in sensor_configs:
|
|
# Remove weather configurations which share lat/lon with sensor configurations
|
|
matching_weather_config = None
|
|
latitude = config.get(CONF_LATITUDE, hass.config.latitude)
|
|
longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
|
|
for weather_config in weather_configs:
|
|
weather_latitude = config.get(CONF_LATITUDE, hass.config.latitude)
|
|
weather_longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
|
|
if latitude == weather_latitude and longitude == weather_longitude:
|
|
matching_weather_config = weather_config
|
|
break
|
|
|
|
if matching_weather_config is not None:
|
|
weather_configs.remove(matching_weather_config)
|
|
|
|
configs = weather_configs + sensor_configs
|
|
|
|
if not configs and camera_configs:
|
|
config = {
|
|
CONF_LATITUDE: hass.config.latitude,
|
|
CONF_LONGITUDE: hass.config.longitude,
|
|
}
|
|
configs.append(config)
|
|
|
|
if configs:
|
|
_try_update_unique_id(hass, configs[0], camera_config)
|
|
|
|
for config in configs:
|
|
data = {
|
|
CONF_LATITUDE: config.get(CONF_LATITUDE, hass.config.latitude),
|
|
CONF_LONGITUDE: config.get(CONF_LONGITUDE, hass.config.longitude),
|
|
CONF_TIMEFRAME: config.get(CONF_TIMEFRAME, DEFAULT_TIMEFRAME),
|
|
CONF_COUNTRY: camera_config.get(CONF_COUNTRY, DEFAULT_COUNTRY),
|
|
CONF_DELTA: camera_config.get(CONF_DELTA, DEFAULT_DELTA),
|
|
CONF_NAME: config.get(CONF_NAME, "Buienradar"),
|
|
}
|
|
|
|
hass.async_create_task(
|
|
hass.config_entries.flow.async_init(
|
|
DOMAIN,
|
|
context={"source": SOURCE_IMPORT},
|
|
data=data,
|
|
)
|
|
)
|
|
|
|
|
|
def _try_update_unique_id(
|
|
hass: HomeAssistant, config: ConfigType, camera_config: ConfigType
|
|
) -> None:
|
|
dimension = camera_config.get(CONF_DIMENSION, DEFAULT_DIMENSION)
|
|
country = camera_config.get(CONF_COUNTRY, DEFAULT_COUNTRY)
|
|
|
|
registry = entity_registry.async_get(hass)
|
|
entity_id = registry.async_get_entity_id("camera", DOMAIN, f"{dimension}_{country}")
|
|
|
|
if entity_id is not None:
|
|
latitude = config[CONF_LATITUDE]
|
|
longitude = config[CONF_LONGITUDE]
|
|
|
|
new_unique_id = f"{latitude:2.6f}{longitude:2.6f}"
|
|
registry.async_update_entity(entity_id, new_unique_id=new_unique_id)
|
|
|
|
|
|
def _filter_domain_configs(
|
|
config: ConfigType, domain: str, platform: str
|
|
) -> list[ConfigType]:
|
|
configs = []
|
|
for entry in config:
|
|
if entry.startswith(domain):
|
|
configs += [x for x in config[entry] if x["platform"] == platform]
|
|
return configs
|