1 """Sensor platform for mobile_app."""
3 from __future__
import annotations
5 from datetime
import date, datetime
6 from typing
import TYPE_CHECKING, Any
19 ATTR_SENSOR_ATTRIBUTES,
20 ATTR_SENSOR_DEVICE_CLASS,
21 ATTR_SENSOR_ENTITY_CATEGORY,
25 ATTR_SENSOR_STATE_CLASS,
27 ATTR_SENSOR_TYPE_SENSOR
as ENTITY_TYPE,
28 ATTR_SENSOR_UNIQUE_ID,
32 from .entity
import MobileAppEntity
33 from .webhook
import _extract_sensor_unique_id
38 config_entry: ConfigEntry,
39 async_add_entities: AddEntitiesCallback,
41 """Set up mobile app sensor from a config entry."""
44 webhook_id = config_entry.data[CONF_WEBHOOK_ID]
46 entity_registry = er.async_get(hass)
47 entries = er.async_entries_for_config_entry(entity_registry, config_entry.entry_id)
49 if entry.domain != ENTITY_TYPE
or entry.disabled_by:
51 config: dict[str, Any] = {
52 ATTR_SENSOR_ATTRIBUTES: {},
53 ATTR_SENSOR_DEVICE_CLASS: entry.device_class
or entry.original_device_class,
54 ATTR_SENSOR_ICON: entry.original_icon,
55 ATTR_SENSOR_NAME: entry.original_name,
56 ATTR_SENSOR_STATE:
None,
57 ATTR_SENSOR_TYPE: entry.domain,
58 ATTR_SENSOR_UNIQUE_ID: entry.unique_id,
59 ATTR_SENSOR_UOM: entry.unit_of_measurement,
60 ATTR_SENSOR_ENTITY_CATEGORY: entry.entity_category,
62 if capabilities := entry.capabilities:
63 config[ATTR_SENSOR_STATE_CLASS] = capabilities.get(ATTR_SENSOR_STATE_CLASS)
69 def handle_sensor_registration(data):
70 if data[CONF_WEBHOOK_ID] != webhook_id:
77 f
"{DOMAIN}_{ENTITY_TYPE}_register",
78 handle_sensor_registration,
83 """Representation of a mobile app sensor."""
86 """Restore previous state."""
92 config[ATTR_SENSOR_STATE] =
None
93 webhook_id = self.
_entry_entry.data[CONF_WEBHOOK_ID]
95 assert self.
unique_idunique_id
is not None
99 and sensor_unique_id ==
"battery_temperature"
101 config[ATTR_SENSOR_UOM] = UnitOfTemperature.CELSIUS
103 config[ATTR_SENSOR_STATE] = last_sensor_data.native_value
104 config[ATTR_SENSOR_UOM] = last_sensor_data.native_unit_of_measurement
108 def _calculate_native_value(self) -> StateType | date | datetime:
109 """Return the state of the sensor."""
110 if (state := self.
_config_config[ATTR_SENSOR_STATE])
in (
None, STATE_UNKNOWN):
116 device_class
in (SensorDeviceClass.DATE, SensorDeviceClass.TIMESTAMP)
119 and isinstance(state, str)
120 and (timestamp := dt_util.parse_datetime(state))
is not None
122 if device_class == SensorDeviceClass.DATE:
123 return timestamp.date()
130 """Update the entity from the config."""
None _async_update_attr_from_config(self)
None async_restore_last_state(self, State last_state)
_attr_native_unit_of_measurement
SensorExtraStoredData|None async_get_last_sensor_data(self)
SensorDeviceClass|None device_class(self)
str|None device_class(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
str _extract_sensor_unique_id(str webhook_id, str unique_id)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)