73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
"""Helpers for Waze Travel Time integration."""
|
|
import re
|
|
|
|
from WazeRouteCalculator import WazeRouteCalculator, WRCError
|
|
|
|
from homeassistant.components.waze_travel_time.const import ENTITY_ID_PATTERN
|
|
from homeassistant.const import ATTR_LATITUDE, ATTR_LONGITUDE
|
|
from homeassistant.helpers import location
|
|
|
|
|
|
def is_valid_config_entry(hass, logger, origin, destination, region):
|
|
"""Return whether the config entry data is valid."""
|
|
origin = resolve_location(hass, logger, origin)
|
|
destination = resolve_location(hass, logger, destination)
|
|
try:
|
|
WazeRouteCalculator(origin, destination, region).calc_all_routes_info()
|
|
except WRCError:
|
|
return False
|
|
return True
|
|
|
|
|
|
def resolve_location(hass, logger, loc):
|
|
"""Resolve a location."""
|
|
if re.fullmatch(ENTITY_ID_PATTERN, loc):
|
|
return get_location_from_entity(hass, logger, loc)
|
|
|
|
return resolve_zone(hass, loc)
|
|
|
|
|
|
def get_location_from_entity(hass, logger, entity_id):
|
|
"""Get the location from the entity_id."""
|
|
state = hass.states.get(entity_id)
|
|
|
|
if state is None:
|
|
logger.error("Unable to find entity %s", entity_id)
|
|
return None
|
|
|
|
# Check if the entity has location attributes.
|
|
if location.has_location(state):
|
|
logger.debug("Getting %s location", entity_id)
|
|
return _get_location_from_attributes(state)
|
|
|
|
# Check if device is inside a zone.
|
|
zone_state = hass.states.get(f"zone.{state.state}")
|
|
if location.has_location(zone_state):
|
|
logger.debug(
|
|
"%s is in %s, getting zone location", entity_id, zone_state.entity_id
|
|
)
|
|
return _get_location_from_attributes(zone_state)
|
|
|
|
# If zone was not found in state then use the state as the location.
|
|
if entity_id.startswith("sensor."):
|
|
return state.state
|
|
|
|
# When everything fails just return nothing.
|
|
return None
|
|
|
|
|
|
def resolve_zone(hass, friendly_name):
|
|
"""Get a lat/long from a zones friendly_name."""
|
|
states = hass.states.all()
|
|
for state in states:
|
|
if state.domain == "zone" and state.name == friendly_name:
|
|
return _get_location_from_attributes(state)
|
|
|
|
return friendly_name
|
|
|
|
|
|
def _get_location_from_attributes(state):
|
|
"""Get the lat/long string from an states attributes."""
|
|
attr = state.attributes
|
|
return f"{attr.get(ATTR_LATITUDE)},{attr.get(ATTR_LONGITUDE)}"
|