1 """The kraken integration."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
11 SensorEntityDescription,
22 DataUpdateCoordinator,
25 from .
import KrakenData
27 CONF_TRACKED_ASSET_PAIRS,
28 DISPATCH_CONFIG_UPDATED,
33 _LOGGER = logging.getLogger(__name__)
36 @dataclass(frozen=True, kw_only=True)
38 """Describes Kraken sensor entity."""
40 value_fn: Callable[[DataUpdateCoordinator[KrakenResponse], str], float | int]
43 SENSOR_TYPES: tuple[KrakenSensorEntityDescription, ...] = (
46 translation_key=
"ask",
47 value_fn=
lambda x, y: x.data[y][
"ask"][0],
51 translation_key=
"ask_volume",
52 value_fn=
lambda x, y: x.data[y][
"ask"][1],
53 entity_registry_enabled_default=
False,
57 translation_key=
"bid",
58 value_fn=
lambda x, y: x.data[y][
"bid"][0],
62 translation_key=
"bid_volume",
63 value_fn=
lambda x, y: x.data[y][
"bid"][1],
64 entity_registry_enabled_default=
False,
68 translation_key=
"volume_today",
69 value_fn=
lambda x, y: x.data[y][
"volume"][0],
70 entity_registry_enabled_default=
False,
73 key=
"volume_last_24h",
74 translation_key=
"volume_last_24h",
75 value_fn=
lambda x, y: x.data[y][
"volume"][1],
76 entity_registry_enabled_default=
False,
79 key=
"volume_weighted_average_today",
80 translation_key=
"volume_weighted_average_today",
81 value_fn=
lambda x, y: x.data[y][
"volume_weighted_average"][0],
82 entity_registry_enabled_default=
False,
85 key=
"volume_weighted_average_last_24h",
86 translation_key=
"volume_weighted_average_last_24h",
87 value_fn=
lambda x, y: x.data[y][
"volume_weighted_average"][1],
88 entity_registry_enabled_default=
False,
91 key=
"number_of_trades_today",
92 translation_key=
"number_of_trades_today",
93 value_fn=
lambda x, y: x.data[y][
"number_of_trades"][0],
94 entity_registry_enabled_default=
False,
97 key=
"number_of_trades_last_24h",
98 translation_key=
"number_of_trades_last_24h",
99 value_fn=
lambda x, y: x.data[y][
"number_of_trades"][1],
100 entity_registry_enabled_default=
False,
103 key=
"last_trade_closed",
104 translation_key=
"last_trade_closed",
105 value_fn=
lambda x, y: x.data[y][
"last_trade_closed"][0],
106 entity_registry_enabled_default=
False,
110 translation_key=
"low_today",
111 value_fn=
lambda x, y: x.data[y][
"low"][0],
115 translation_key=
"low_last_24h",
116 value_fn=
lambda x, y: x.data[y][
"low"][1],
117 entity_registry_enabled_default=
False,
121 translation_key=
"high_today",
122 value_fn=
lambda x, y: x.data[y][
"high"][0],
126 translation_key=
"high_last_24h",
127 value_fn=
lambda x, y: x.data[y][
"high"][1],
128 entity_registry_enabled_default=
False,
131 key=
"opening_price_today",
132 translation_key=
"opening_price_today",
133 value_fn=
lambda x, y: x.data[y][
"opening_price"],
134 entity_registry_enabled_default=
False,
141 config_entry: ConfigEntry,
142 async_add_entities: AddEntitiesCallback,
144 """Add kraken entities from a config_entry."""
146 def _async_add_kraken_sensors(tracked_asset_pairs: list[str]) ->
None:
148 for tracked_asset_pair
in tracked_asset_pairs:
156 for description
in SENSOR_TYPES
161 _async_add_kraken_sensors(config_entry.options[CONF_TRACKED_ASSET_PAIRS])
164 def async_update_sensors(hass: HomeAssistant, config_entry: ConfigEntry) ->
None:
165 """Add or remove sensors for configured tracked asset pairs."""
166 dev_reg = dr.async_get(hass)
169 device.name: device.id
170 for device
in dr.async_entries_for_config_entry(
171 dev_reg, config_entry.entry_id
175 asset_pairs_to_add = []
176 for tracked_asset_pair
in config_entry.options[CONF_TRACKED_ASSET_PAIRS]:
180 )
in existing_devices:
181 existing_devices.pop(device_name)
183 asset_pairs_to_add.append(tracked_asset_pair)
184 _async_add_kraken_sensors(asset_pairs_to_add)
187 for device_id
in existing_devices.values():
188 dev_reg.async_remove_device(device_id)
190 config_entry.async_on_unload(
193 DISPATCH_CONFIG_UPDATED,
194 async_update_sensors,
200 CoordinatorEntity[DataUpdateCoordinator[KrakenResponse |
None]], SensorEntity
202 """Define a Kraken sensor."""
204 entity_description: KrakenSensorEntityDescription
206 _attr_state_class = SensorStateClass.MEASUREMENT
207 _attr_has_entity_name =
True
211 kraken_data: KrakenData,
212 tracked_asset_pair: str,
213 description: KrakenSensorEntityDescription,
216 assert kraken_data.coordinator
is not None
217 super().
__init__(kraken_data.coordinator)
223 if "number_of" not in description.key:
228 tracked_asset_pair.split(
"/")[0],
229 tracked_asset_pair.split(
"/")[1],
237 configuration_url=
"https://www.kraken.com/",
238 entry_type=dr.DeviceEntryType.SERVICE,
239 identifiers={(DOMAIN,
"_".join(self.
_device_name_device_name.split(
" ")))},
240 manufacturer=
"Kraken.com",
245 """Handle entity which will be added."""
254 if not self.coordinator.data:
266 "Asset Pair %s is no longer available",
273 """Return the icon."""
275 return "mdi:currency-eur"
277 return "mdi:currency-gbp"
279 return "mdi:currency-usd"
281 return "mdi:currency-jpy"
283 return "mdi:currency-btc"
288 """Could the api be accessed during the last update call."""
289 return self.
_available_available
and self.coordinator.last_update_success
293 """Create the device name for a given tracked asset pair."""
294 return f
"{tracked_asset_pair.split('/')[0]} {tracked_asset_pair.split('/')[1]}"
None async_added_to_hass(self)
None __init__(self, KrakenData kraken_data, str tracked_asset_pair, KrakenSensorEntityDescription description)
None _handle_coordinator_update(self)
_received_data_at_least_once
tracked_asset_pair_wsname
None _update_internal_state(self)
_attr_native_unit_of_measurement
str create_device_name(str tracked_asset_pair)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)