Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for currencylayer.com exchange rates service."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 
8 import requests
9 import voluptuous as vol
10 
12  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
13  SensorEntity,
14 )
15 from homeassistant.const import CONF_API_KEY, CONF_BASE, CONF_NAME, CONF_QUOTE
16 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
20 
21 _LOGGER = logging.getLogger(__name__)
22 _RESOURCE = "http://apilayer.net/api/live"
23 
24 DEFAULT_BASE = "USD"
25 DEFAULT_NAME = "CurrencyLayer Sensor"
26 
27 
28 SCAN_INTERVAL = timedelta(hours=4)
29 
30 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
31  {
32  vol.Required(CONF_API_KEY): cv.string,
33  vol.Required(CONF_QUOTE): vol.All(cv.ensure_list, [cv.string]),
34  vol.Optional(CONF_BASE, default=DEFAULT_BASE): cv.string,
35  vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
36  }
37 )
38 
39 
41  hass: HomeAssistant,
42  config: ConfigType,
43  add_entities: AddEntitiesCallback,
44  discovery_info: DiscoveryInfoType | None = None,
45 ) -> None:
46  """Set up the Currencylayer sensor."""
47  base = config[CONF_BASE]
48  api_key = config[CONF_API_KEY]
49  parameters = {"source": base, "access_key": api_key, "format": 1}
50 
51  rest = CurrencylayerData(_RESOURCE, parameters)
52 
53  response = requests.get(_RESOURCE, params=parameters, timeout=10)
54  if "error" in response.json():
55  return
57  (CurrencylayerSensor(rest, base, variable) for variable in config[CONF_QUOTE]),
58  True,
59  )
60 
61 
63  """Implementing the Currencylayer sensor."""
64 
65  _attr_attribution = "Data provided by currencylayer.com"
66  _attr_icon = "mdi:currency"
67 
68  def __init__(self, rest, base, quote):
69  """Initialize the sensor."""
70  self.restrest = rest
71  self._quote_quote = quote
72  self._base_base = base
73  self._state_state = None
74 
75  @property
77  """Return the unit of measurement of this entity, if any."""
78  return self._quote_quote
79 
80  @property
81  def name(self):
82  """Return the name of the sensor."""
83  return self._base_base
84 
85  @property
86  def native_value(self):
87  """Return the state of the sensor."""
88  return self._state_state
89 
90  def update(self) -> None:
91  """Update current date."""
92  self.restrest.update()
93  if (value := self.restrest.data) is not None:
94  self._state_state = round(value[f"{self._base}{self._quote}"], 4)
95 
96 
98  """Get data from Currencylayer.org."""
99 
100  def __init__(self, resource, parameters):
101  """Initialize the data object."""
102  self._resource_resource = resource
103  self._parameters_parameters = parameters
104  self.datadata = None
105 
106  def update(self):
107  """Get the latest data from Currencylayer."""
108  try:
109  result = requests.get(self._resource_resource, params=self._parameters_parameters, timeout=10)
110  if "error" in result.json():
111  raise ValueError(result.json()["error"]["info"]) # noqa: TRY301
112  self.datadata = result.json()["quotes"]
113  _LOGGER.debug("Currencylayer data updated: %s", result.json()["timestamp"])
114  except ValueError as err:
115  _LOGGER.error("Check Currencylayer API %s", err.args)
116  self.datadata = None
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:45
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40