1 """Support for the worldtides.info API."""
3 from __future__
import annotations
5 from datetime
import timedelta
10 import voluptuous
as vol
13 PLATFORM_SCHEMA
as SENSOR_PLATFORM_SCHEMA,
22 _LOGGER = logging.getLogger(__name__)
24 ATTRIBUTION =
"Data provided by WorldTides"
26 DEFAULT_NAME =
"WorldTidesInfo"
30 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
32 vol.Required(CONF_API_KEY): cv.string,
33 vol.Optional(CONF_LATITUDE): cv.latitude,
34 vol.Optional(CONF_LONGITUDE): cv.longitude,
35 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
43 add_entities: AddEntitiesCallback,
44 discovery_info: DiscoveryInfoType |
None =
None,
46 """Set up the WorldTidesInfo sensor."""
47 name = config.get(CONF_NAME)
49 lat = config.get(CONF_LATITUDE, hass.config.latitude)
50 lon = config.get(CONF_LONGITUDE, hass.config.longitude)
51 key = config.get(CONF_API_KEY)
53 if None in (lat, lon):
54 _LOGGER.error(
"Latitude or longitude not set in Home Assistant config")
58 if tides.data.get(
"error") ==
"No location found":
59 _LOGGER.error(
"Location not available")
66 """Representation of a WorldTidesInfo sensor."""
68 _attr_attribution = ATTRIBUTION
71 """Initialize the sensor."""
80 """Return the name of the sensor."""
81 return self.
_name_name
85 """Return the state attributes of this device."""
88 if "High" in str(self.
datadata[
"extremes"][0][
"type"]):
89 attr[
"high_tide_time_utc"] = self.
datadata[
"extremes"][0][
"date"]
90 attr[
"high_tide_height"] = self.
datadata[
"extremes"][0][
"height"]
91 attr[
"low_tide_time_utc"] = self.
datadata[
"extremes"][1][
"date"]
92 attr[
"low_tide_height"] = self.
datadata[
"extremes"][1][
"height"]
93 elif "Low" in str(self.
datadata[
"extremes"][0][
"type"]):
94 attr[
"high_tide_time_utc"] = self.
datadata[
"extremes"][1][
"date"]
95 attr[
"high_tide_height"] = self.
datadata[
"extremes"][1][
"height"]
96 attr[
"low_tide_time_utc"] = self.
datadata[
"extremes"][0][
"date"]
97 attr[
"low_tide_height"] = self.
datadata[
"extremes"][0][
"height"]
102 """Return the state of the device."""
104 if "High" in str(self.
datadata[
"extremes"][0][
"type"]):
105 tidetime = time.strftime(
106 "%I:%M %p", time.localtime(self.
datadata[
"extremes"][0][
"dt"])
108 return f
"High tide at {tidetime}"
109 if "Low" in str(self.
datadata[
"extremes"][0][
"type"]):
110 tidetime = time.strftime(
111 "%I:%M %p", time.localtime(self.
datadata[
"extremes"][0][
"dt"])
113 return f
"Low tide at {tidetime}"
118 """Get the latest data from WorldTidesInfo API."""
119 start =
int(time.time())
121 "https://www.worldtides.info/api?extremes&length=86400"
122 f
"&key={self._key}&lat={self._lat}&lon={self._lon}&start={start}"
126 self.
datadata = requests.get(resource, timeout=10).
json()
127 _LOGGER.debug(
"Data: %s", self.
datadata)
128 _LOGGER.debug(
"Tide data queried with start time set to: %s", start)
129 except ValueError
as err:
130 _LOGGER.error(
"Error retrieving data from WorldTidesInfo: %s", err.args)
def __init__(self, name, lat, lon, key)
def extra_state_attributes(self)
def add_entities(account, async_add_entities, tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)