1 """Support for Tractive sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
12 SensorEntityDescription,
25 from .
import Trackables, TractiveClient, TractiveConfigEntry
31 ATTR_MINUTES_DAY_SLEEP,
32 ATTR_MINUTES_NIGHT_SLEEP,
36 TRACKER_HARDWARE_STATUS_UPDATED,
37 TRACKER_WELLNESS_STATUS_UPDATED,
39 from .entity
import TractiveEntity
42 @dataclass(frozen=True, kw_only=True)
44 """Class describing Tractive sensor entities."""
48 hardware_sensor: bool =
False
49 value_fn: Callable[[StateType], StateType] =
lambda state: state
53 """Tractive sensor."""
55 entity_description: TractiveSensorEntityDescription
59 client: TractiveClient,
61 description: TractiveSensorEntityDescription,
63 """Initialize sensor entity."""
64 if description.hardware_sensor:
66 f
"{description.signal_prefix}-{item.tracker_details['_id']}"
69 dispatcher_signal = f
"{description.signal_prefix}-{item.trackable['_id']}"
71 client, item.trackable, item.tracker_details, dispatcher_signal
74 self.
_attr_unique_id_attr_unique_id = f
"{item.trackable['_id']}_{description.key}"
80 """Handle status update."""
88 SENSOR_TYPES: tuple[TractiveSensorEntityDescription, ...] = (
90 key=ATTR_BATTERY_LEVEL,
91 translation_key=
"tracker_battery_level",
92 native_unit_of_measurement=PERCENTAGE,
93 device_class=SensorDeviceClass.BATTERY,
94 signal_prefix=TRACKER_HARDWARE_STATUS_UPDATED,
96 entity_category=EntityCategory.DIAGNOSTIC,
99 key=ATTR_TRACKER_STATE,
100 translation_key=
"tracker_state",
101 signal_prefix=TRACKER_HARDWARE_STATUS_UPDATED,
102 hardware_sensor=
True,
103 entity_category=EntityCategory.DIAGNOSTIC,
104 device_class=SensorDeviceClass.ENUM,
106 "inaccurate_position",
109 "system_shutdown_user",
114 key=ATTR_MINUTES_ACTIVE,
115 translation_key=
"activity_time",
116 native_unit_of_measurement=UnitOfTime.MINUTES,
117 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
118 state_class=SensorStateClass.TOTAL,
121 key=ATTR_MINUTES_REST,
122 translation_key=
"rest_time",
123 native_unit_of_measurement=UnitOfTime.MINUTES,
124 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
125 state_class=SensorStateClass.TOTAL,
129 translation_key=
"calories",
130 native_unit_of_measurement=
"kcal",
131 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
132 state_class=SensorStateClass.TOTAL,
136 translation_key=
"daily_goal",
137 native_unit_of_measurement=UnitOfTime.MINUTES,
138 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
141 key=ATTR_MINUTES_DAY_SLEEP,
142 translation_key=
"minutes_day_sleep",
143 native_unit_of_measurement=UnitOfTime.MINUTES,
144 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
145 state_class=SensorStateClass.TOTAL,
148 key=ATTR_MINUTES_NIGHT_SLEEP,
149 translation_key=
"minutes_night_sleep",
150 native_unit_of_measurement=UnitOfTime.MINUTES,
151 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
152 state_class=SensorStateClass.TOTAL,
155 key=ATTR_SLEEP_LABEL,
156 translation_key=
"sleep",
157 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
158 value_fn=
lambda state: state.lower()
if isinstance(state, str)
else state,
159 device_class=SensorDeviceClass.ENUM,
167 key=ATTR_ACTIVITY_LABEL,
168 translation_key=
"activity",
169 signal_prefix=TRACKER_WELLNESS_STATUS_UPDATED,
170 value_fn=
lambda state: state.lower()
if isinstance(state, str)
else state,
171 device_class=SensorDeviceClass.ENUM,
183 entry: TractiveConfigEntry,
184 async_add_entities: AddEntitiesCallback,
186 """Set up Tractive device trackers."""
187 client = entry.runtime_data.client
188 trackables = entry.runtime_data.trackables
192 for description
in SENSOR_TYPES
193 for item
in trackables
None __init__(self, TractiveClient client, Trackables item, TractiveSensorEntityDescription description)
None handle_status_update(self, dict[str, Any] event)
None async_setup_entry(HomeAssistant hass, TractiveConfigEntry entry, AddEntitiesCallback async_add_entities)