mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 06:07:17 +00:00
Fix stale options in here_travel_time (#145911)
This commit is contained in:
parent
5076c10959
commit
0e71ef3861
@ -5,26 +5,13 @@ from __future__ import annotations
|
|||||||
from homeassistant.const import CONF_API_KEY, CONF_MODE, Platform
|
from homeassistant.const import CONF_API_KEY, CONF_MODE, Platform
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.start import async_at_started
|
from homeassistant.helpers.start import async_at_started
|
||||||
from homeassistant.util import dt as dt_util
|
|
||||||
|
|
||||||
from .const import (
|
from .const import TRAVEL_MODE_PUBLIC
|
||||||
CONF_ARRIVAL_TIME,
|
|
||||||
CONF_DEPARTURE_TIME,
|
|
||||||
CONF_DESTINATION_ENTITY_ID,
|
|
||||||
CONF_DESTINATION_LATITUDE,
|
|
||||||
CONF_DESTINATION_LONGITUDE,
|
|
||||||
CONF_ORIGIN_ENTITY_ID,
|
|
||||||
CONF_ORIGIN_LATITUDE,
|
|
||||||
CONF_ORIGIN_LONGITUDE,
|
|
||||||
CONF_ROUTE_MODE,
|
|
||||||
TRAVEL_MODE_PUBLIC,
|
|
||||||
)
|
|
||||||
from .coordinator import (
|
from .coordinator import (
|
||||||
HereConfigEntry,
|
HereConfigEntry,
|
||||||
HERERoutingDataUpdateCoordinator,
|
HERERoutingDataUpdateCoordinator,
|
||||||
HERETransitDataUpdateCoordinator,
|
HERETransitDataUpdateCoordinator,
|
||||||
)
|
)
|
||||||
from .model import HERETravelTimeConfig
|
|
||||||
|
|
||||||
PLATFORMS = [Platform.SENSOR]
|
PLATFORMS = [Platform.SENSOR]
|
||||||
|
|
||||||
@ -33,29 +20,13 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: HereConfigEntry)
|
|||||||
"""Set up HERE Travel Time from a config entry."""
|
"""Set up HERE Travel Time from a config entry."""
|
||||||
api_key = config_entry.data[CONF_API_KEY]
|
api_key = config_entry.data[CONF_API_KEY]
|
||||||
|
|
||||||
arrival = dt_util.parse_time(config_entry.options.get(CONF_ARRIVAL_TIME, ""))
|
|
||||||
departure = dt_util.parse_time(config_entry.options.get(CONF_DEPARTURE_TIME, ""))
|
|
||||||
|
|
||||||
here_travel_time_config = HERETravelTimeConfig(
|
|
||||||
destination_latitude=config_entry.data.get(CONF_DESTINATION_LATITUDE),
|
|
||||||
destination_longitude=config_entry.data.get(CONF_DESTINATION_LONGITUDE),
|
|
||||||
destination_entity_id=config_entry.data.get(CONF_DESTINATION_ENTITY_ID),
|
|
||||||
origin_latitude=config_entry.data.get(CONF_ORIGIN_LATITUDE),
|
|
||||||
origin_longitude=config_entry.data.get(CONF_ORIGIN_LONGITUDE),
|
|
||||||
origin_entity_id=config_entry.data.get(CONF_ORIGIN_ENTITY_ID),
|
|
||||||
travel_mode=config_entry.data[CONF_MODE],
|
|
||||||
route_mode=config_entry.options[CONF_ROUTE_MODE],
|
|
||||||
arrival=arrival,
|
|
||||||
departure=departure,
|
|
||||||
)
|
|
||||||
|
|
||||||
cls: type[HERETransitDataUpdateCoordinator | HERERoutingDataUpdateCoordinator]
|
cls: type[HERETransitDataUpdateCoordinator | HERERoutingDataUpdateCoordinator]
|
||||||
if config_entry.data[CONF_MODE] in {TRAVEL_MODE_PUBLIC, "publicTransportTimeTable"}:
|
if config_entry.data[CONF_MODE] in {TRAVEL_MODE_PUBLIC, "publicTransportTimeTable"}:
|
||||||
cls = HERETransitDataUpdateCoordinator
|
cls = HERETransitDataUpdateCoordinator
|
||||||
else:
|
else:
|
||||||
cls = HERERoutingDataUpdateCoordinator
|
cls = HERERoutingDataUpdateCoordinator
|
||||||
|
|
||||||
data_coordinator = cls(hass, config_entry, api_key, here_travel_time_config)
|
data_coordinator = cls(hass, config_entry, api_key)
|
||||||
config_entry.runtime_data = data_coordinator
|
config_entry.runtime_data = data_coordinator
|
||||||
|
|
||||||
async def _async_update_at_start(_: HomeAssistant) -> None:
|
async def _async_update_at_start(_: HomeAssistant) -> None:
|
||||||
|
@ -26,7 +26,7 @@ from here_transit import (
|
|||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import UnitOfLength
|
from homeassistant.const import CONF_MODE, UnitOfLength
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers import config_validation as cv
|
from homeassistant.helpers import config_validation as cv
|
||||||
from homeassistant.helpers.location import find_coordinates
|
from homeassistant.helpers.location import find_coordinates
|
||||||
@ -34,8 +34,21 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda
|
|||||||
from homeassistant.util import dt as dt_util
|
from homeassistant.util import dt as dt_util
|
||||||
from homeassistant.util.unit_conversion import DistanceConverter
|
from homeassistant.util.unit_conversion import DistanceConverter
|
||||||
|
|
||||||
from .const import DEFAULT_SCAN_INTERVAL, DOMAIN, ROUTE_MODE_FASTEST
|
from .const import (
|
||||||
from .model import HERETravelTimeConfig, HERETravelTimeData
|
CONF_ARRIVAL_TIME,
|
||||||
|
CONF_DEPARTURE_TIME,
|
||||||
|
CONF_DESTINATION_ENTITY_ID,
|
||||||
|
CONF_DESTINATION_LATITUDE,
|
||||||
|
CONF_DESTINATION_LONGITUDE,
|
||||||
|
CONF_ORIGIN_ENTITY_ID,
|
||||||
|
CONF_ORIGIN_LATITUDE,
|
||||||
|
CONF_ORIGIN_LONGITUDE,
|
||||||
|
CONF_ROUTE_MODE,
|
||||||
|
DEFAULT_SCAN_INTERVAL,
|
||||||
|
DOMAIN,
|
||||||
|
ROUTE_MODE_FASTEST,
|
||||||
|
)
|
||||||
|
from .model import HERETravelTimeAPIParams, HERETravelTimeData
|
||||||
|
|
||||||
BACKOFF_MULTIPLIER = 1.1
|
BACKOFF_MULTIPLIER = 1.1
|
||||||
|
|
||||||
@ -47,7 +60,7 @@ type HereConfigEntry = ConfigEntry[
|
|||||||
|
|
||||||
|
|
||||||
class HERERoutingDataUpdateCoordinator(DataUpdateCoordinator[HERETravelTimeData]):
|
class HERERoutingDataUpdateCoordinator(DataUpdateCoordinator[HERETravelTimeData]):
|
||||||
"""here_routing DataUpdateCoordinator."""
|
"""HERETravelTime DataUpdateCoordinator for the routing API."""
|
||||||
|
|
||||||
config_entry: HereConfigEntry
|
config_entry: HereConfigEntry
|
||||||
|
|
||||||
@ -56,7 +69,6 @@ class HERERoutingDataUpdateCoordinator(DataUpdateCoordinator[HERETravelTimeData]
|
|||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
config_entry: HereConfigEntry,
|
config_entry: HereConfigEntry,
|
||||||
api_key: str,
|
api_key: str,
|
||||||
config: HERETravelTimeConfig,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@ -67,41 +79,34 @@ class HERERoutingDataUpdateCoordinator(DataUpdateCoordinator[HERETravelTimeData]
|
|||||||
update_interval=timedelta(seconds=DEFAULT_SCAN_INTERVAL),
|
update_interval=timedelta(seconds=DEFAULT_SCAN_INTERVAL),
|
||||||
)
|
)
|
||||||
self._api = HERERoutingApi(api_key)
|
self._api = HERERoutingApi(api_key)
|
||||||
self.config = config
|
|
||||||
|
|
||||||
async def _async_update_data(self) -> HERETravelTimeData:
|
async def _async_update_data(self) -> HERETravelTimeData:
|
||||||
"""Get the latest data from the HERE Routing API."""
|
"""Get the latest data from the HERE Routing API."""
|
||||||
origin, destination, arrival, departure = prepare_parameters(
|
params = prepare_parameters(self.hass, self.config_entry)
|
||||||
self.hass, self.config
|
|
||||||
)
|
|
||||||
|
|
||||||
route_mode = (
|
|
||||||
RoutingMode.FAST
|
|
||||||
if self.config.route_mode == ROUTE_MODE_FASTEST
|
|
||||||
else RoutingMode.SHORT
|
|
||||||
)
|
|
||||||
|
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
(
|
(
|
||||||
"Requesting route for origin: %s, destination: %s, route_mode: %s,"
|
"Requesting route for origin: %s, destination: %s, route_mode: %s,"
|
||||||
" mode: %s, arrival: %s, departure: %s"
|
" mode: %s, arrival: %s, departure: %s"
|
||||||
),
|
),
|
||||||
origin,
|
params.origin,
|
||||||
destination,
|
params.destination,
|
||||||
route_mode,
|
params.route_mode,
|
||||||
TransportMode(self.config.travel_mode),
|
TransportMode(params.travel_mode),
|
||||||
arrival,
|
params.arrival,
|
||||||
departure,
|
params.departure,
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = await self._api.route(
|
response = await self._api.route(
|
||||||
transport_mode=TransportMode(self.config.travel_mode),
|
transport_mode=TransportMode(params.travel_mode),
|
||||||
origin=here_routing.Place(origin[0], origin[1]),
|
origin=here_routing.Place(params.origin[0], params.origin[1]),
|
||||||
destination=here_routing.Place(destination[0], destination[1]),
|
destination=here_routing.Place(
|
||||||
routing_mode=route_mode,
|
params.destination[0], params.destination[1]
|
||||||
arrival_time=arrival,
|
),
|
||||||
departure_time=departure,
|
routing_mode=params.route_mode,
|
||||||
|
arrival_time=params.arrival,
|
||||||
|
departure_time=params.departure,
|
||||||
return_values=[Return.POLYINE, Return.SUMMARY],
|
return_values=[Return.POLYINE, Return.SUMMARY],
|
||||||
spans=[Spans.NAMES],
|
spans=[Spans.NAMES],
|
||||||
)
|
)
|
||||||
@ -175,7 +180,7 @@ class HERERoutingDataUpdateCoordinator(DataUpdateCoordinator[HERETravelTimeData]
|
|||||||
class HERETransitDataUpdateCoordinator(
|
class HERETransitDataUpdateCoordinator(
|
||||||
DataUpdateCoordinator[HERETravelTimeData | None]
|
DataUpdateCoordinator[HERETravelTimeData | None]
|
||||||
):
|
):
|
||||||
"""HERETravelTime DataUpdateCoordinator."""
|
"""HERETravelTime DataUpdateCoordinator for the transit API."""
|
||||||
|
|
||||||
config_entry: HereConfigEntry
|
config_entry: HereConfigEntry
|
||||||
|
|
||||||
@ -184,7 +189,6 @@ class HERETransitDataUpdateCoordinator(
|
|||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
config_entry: HereConfigEntry,
|
config_entry: HereConfigEntry,
|
||||||
api_key: str,
|
api_key: str,
|
||||||
config: HERETravelTimeConfig,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@ -195,32 +199,31 @@ class HERETransitDataUpdateCoordinator(
|
|||||||
update_interval=timedelta(seconds=DEFAULT_SCAN_INTERVAL),
|
update_interval=timedelta(seconds=DEFAULT_SCAN_INTERVAL),
|
||||||
)
|
)
|
||||||
self._api = HERETransitApi(api_key)
|
self._api = HERETransitApi(api_key)
|
||||||
self.config = config
|
|
||||||
|
|
||||||
async def _async_update_data(self) -> HERETravelTimeData | None:
|
async def _async_update_data(self) -> HERETravelTimeData | None:
|
||||||
"""Get the latest data from the HERE Routing API."""
|
"""Get the latest data from the HERE Routing API."""
|
||||||
origin, destination, arrival, departure = prepare_parameters(
|
params = prepare_parameters(self.hass, self.config_entry)
|
||||||
self.hass, self.config
|
|
||||||
)
|
|
||||||
|
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
(
|
(
|
||||||
"Requesting transit route for origin: %s, destination: %s, arrival: %s,"
|
"Requesting transit route for origin: %s, destination: %s, arrival: %s,"
|
||||||
" departure: %s"
|
" departure: %s"
|
||||||
),
|
),
|
||||||
origin,
|
params.origin,
|
||||||
destination,
|
params.destination,
|
||||||
arrival,
|
params.arrival,
|
||||||
departure,
|
params.departure,
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
response = await self._api.route(
|
response = await self._api.route(
|
||||||
origin=here_transit.Place(latitude=origin[0], longitude=origin[1]),
|
origin=here_transit.Place(
|
||||||
destination=here_transit.Place(
|
latitude=params.origin[0], longitude=params.origin[1]
|
||||||
latitude=destination[0], longitude=destination[1]
|
|
||||||
),
|
),
|
||||||
arrival_time=arrival,
|
destination=here_transit.Place(
|
||||||
departure_time=departure,
|
latitude=params.destination[0], longitude=params.destination[1]
|
||||||
|
),
|
||||||
|
arrival_time=params.arrival,
|
||||||
|
departure_time=params.departure,
|
||||||
return_values=[
|
return_values=[
|
||||||
here_transit.Return.POLYLINE,
|
here_transit.Return.POLYLINE,
|
||||||
here_transit.Return.TRAVEL_SUMMARY,
|
here_transit.Return.TRAVEL_SUMMARY,
|
||||||
@ -285,8 +288,8 @@ class HERETransitDataUpdateCoordinator(
|
|||||||
|
|
||||||
def prepare_parameters(
|
def prepare_parameters(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
config: HERETravelTimeConfig,
|
config_entry: HereConfigEntry,
|
||||||
) -> tuple[list[str], list[str], str | None, str | None]:
|
) -> HERETravelTimeAPIParams:
|
||||||
"""Prepare parameters for the HERE api."""
|
"""Prepare parameters for the HERE api."""
|
||||||
|
|
||||||
def _from_entity_id(entity_id: str) -> list[str]:
|
def _from_entity_id(entity_id: str) -> list[str]:
|
||||||
@ -305,32 +308,55 @@ def prepare_parameters(
|
|||||||
return formatted_coordinates
|
return formatted_coordinates
|
||||||
|
|
||||||
# Destination
|
# Destination
|
||||||
if config.destination_entity_id is not None:
|
if (
|
||||||
destination = _from_entity_id(config.destination_entity_id)
|
destination_entity_id := config_entry.data.get(CONF_DESTINATION_ENTITY_ID)
|
||||||
|
) is not None:
|
||||||
|
destination = _from_entity_id(str(destination_entity_id))
|
||||||
else:
|
else:
|
||||||
destination = [
|
destination = [
|
||||||
str(config.destination_latitude),
|
str(config_entry.data[CONF_DESTINATION_LATITUDE]),
|
||||||
str(config.destination_longitude),
|
str(config_entry.data[CONF_DESTINATION_LONGITUDE]),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Origin
|
# Origin
|
||||||
if config.origin_entity_id is not None:
|
if (origin_entity_id := config_entry.data.get(CONF_ORIGIN_ENTITY_ID)) is not None:
|
||||||
origin = _from_entity_id(config.origin_entity_id)
|
origin = _from_entity_id(str(origin_entity_id))
|
||||||
else:
|
else:
|
||||||
origin = [
|
origin = [
|
||||||
str(config.origin_latitude),
|
str(config_entry.data[CONF_ORIGIN_LATITUDE]),
|
||||||
str(config.origin_longitude),
|
str(config_entry.data[CONF_ORIGIN_LONGITUDE]),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Arrival/Departure
|
# Arrival/Departure
|
||||||
arrival: str | None = None
|
arrival: datetime | None = None
|
||||||
departure: str | None = None
|
if (
|
||||||
if config.arrival is not None:
|
conf_arrival := dt_util.parse_time(
|
||||||
arrival = next_datetime(config.arrival).isoformat()
|
config_entry.options.get(CONF_ARRIVAL_TIME, "")
|
||||||
if config.departure is not None:
|
)
|
||||||
departure = next_datetime(config.departure).isoformat()
|
) is not None:
|
||||||
|
arrival = next_datetime(conf_arrival)
|
||||||
|
departure: datetime | None = None
|
||||||
|
if (
|
||||||
|
conf_departure := dt_util.parse_time(
|
||||||
|
config_entry.options.get(CONF_DEPARTURE_TIME, "")
|
||||||
|
)
|
||||||
|
) is not None:
|
||||||
|
departure = next_datetime(conf_departure)
|
||||||
|
|
||||||
return (origin, destination, arrival, departure)
|
route_mode = (
|
||||||
|
RoutingMode.FAST
|
||||||
|
if config_entry.options[CONF_ROUTE_MODE] == ROUTE_MODE_FASTEST
|
||||||
|
else RoutingMode.SHORT
|
||||||
|
)
|
||||||
|
|
||||||
|
return HERETravelTimeAPIParams(
|
||||||
|
destination=destination,
|
||||||
|
origin=origin,
|
||||||
|
travel_mode=config_entry.data[CONF_MODE],
|
||||||
|
route_mode=route_mode,
|
||||||
|
arrival=arrival,
|
||||||
|
departure=departure,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def build_hass_attribution(sections: list[dict[str, Any]]) -> str | None:
|
def build_hass_attribution(sections: list[dict[str, Any]]) -> str | None:
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import time
|
from datetime import datetime
|
||||||
from typing import TypedDict
|
from typing import TypedDict
|
||||||
|
|
||||||
|
|
||||||
@ -21,16 +21,12 @@ class HERETravelTimeData(TypedDict):
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class HERETravelTimeConfig:
|
class HERETravelTimeAPIParams:
|
||||||
"""Configuration for HereTravelTimeDataUpdateCoordinator."""
|
"""Configuration for polling the HERE API."""
|
||||||
|
|
||||||
destination_latitude: float | None
|
destination: list[str]
|
||||||
destination_longitude: float | None
|
origin: list[str]
|
||||||
destination_entity_id: str | None
|
|
||||||
origin_latitude: float | None
|
|
||||||
origin_longitude: float | None
|
|
||||||
origin_entity_id: str | None
|
|
||||||
travel_mode: str
|
travel_mode: str
|
||||||
route_mode: str
|
route_mode: str
|
||||||
arrival: time | None
|
arrival: datetime | None
|
||||||
departure: time | None
|
departure: datetime | None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user