1 """Support for switch entities."""
3 from __future__
import annotations
5 from dataclasses
import dataclass, field
6 from datetime
import UTC, datetime, timedelta
8 from gardena_bluetooth.const
import Battery, Sensor, Valve
9 from gardena_bluetooth.parse
import Characteristic
14 SensorEntityDescription,
22 from .
import GardenaBluetoothConfigEntry
23 from .coordinator
import GardenaBluetoothCoordinator
24 from .entity
import GardenaBluetoothDescriptorEntity, GardenaBluetoothEntity
27 @dataclass(frozen=True)
29 """Description of entity."""
32 connected_state: Characteristic |
None =
None
36 """Context needed for update coordinator."""
37 data = {self.char.uuid}
38 if self.connected_state:
39 data.add(self.connected_state.uuid)
45 key=Valve.activation_reason.uuid,
46 translation_key=
"activation_reason",
47 state_class=SensorStateClass.MEASUREMENT,
48 entity_category=EntityCategory.DIAGNOSTIC,
49 entity_registry_enabled_default=
False,
50 char=Valve.activation_reason,
53 key=Battery.battery_level.uuid,
54 state_class=SensorStateClass.MEASUREMENT,
55 device_class=SensorDeviceClass.BATTERY,
56 entity_category=EntityCategory.DIAGNOSTIC,
57 native_unit_of_measurement=PERCENTAGE,
58 char=Battery.battery_level,
61 key=Sensor.battery_level.uuid,
62 translation_key=
"sensor_battery_level",
63 state_class=SensorStateClass.MEASUREMENT,
64 device_class=SensorDeviceClass.BATTERY,
65 entity_category=EntityCategory.DIAGNOSTIC,
66 native_unit_of_measurement=PERCENTAGE,
67 char=Sensor.battery_level,
68 connected_state=Sensor.connected_state,
71 key=Sensor.value.uuid,
72 state_class=SensorStateClass.MEASUREMENT,
73 device_class=SensorDeviceClass.MOISTURE,
74 native_unit_of_measurement=PERCENTAGE,
76 connected_state=Sensor.connected_state,
80 translation_key=
"sensor_type",
81 entity_category=EntityCategory.DIAGNOSTIC,
83 connected_state=Sensor.connected_state,
86 key=Sensor.measurement_timestamp.uuid,
87 translation_key=
"sensor_measurement_timestamp",
88 device_class=SensorDeviceClass.TIMESTAMP,
89 entity_category=EntityCategory.DIAGNOSTIC,
90 char=Sensor.measurement_timestamp,
91 connected_state=Sensor.connected_state,
98 entry: GardenaBluetoothConfigEntry,
99 async_add_entities: AddEntitiesCallback,
101 """Set up Gardena Bluetooth sensor based on a config entry."""
102 coordinator = entry.runtime_data
103 entities: list[GardenaBluetoothEntity] = [
105 for description
in DESCRIPTIONS
106 if description.key
in coordinator.characteristics
108 if Valve.remaining_open_time.uuid
in coordinator.characteristics:
114 """Representation of a sensor."""
116 entity_description: GardenaBluetoothSensorEntityDescription
120 if isinstance(value, datetime):
121 value = value.replace(tzinfo=dt_util.get_default_time_zone())
133 """Representation of a sensor."""
135 _attr_device_class = SensorDeviceClass.TIMESTAMP
136 _attr_native_value: datetime |
None =
None
137 _attr_translation_key =
"remaining_open_timestamp"
141 coordinator: GardenaBluetoothCoordinator,
143 """Initialize the sensor."""
144 super().
__init__(coordinator, {Valve.remaining_open_time.uuid})
145 self.
_attr_unique_id_attr_unique_id = f
"{coordinator.address}-remaining_open_timestamp"
148 value = self.coordinator.
get_cached(Valve.remaining_open_time)
154 time = datetime.now(UTC) +
timedelta(seconds=value)
161 if abs(error.total_seconds()) > 10:
168 """Sensor only available when open."""
CharacteristicType|None get_cached(self, Characteristic[CharacteristicType] char)
None __init__(self, GardenaBluetoothCoordinator coordinator)
None _handle_coordinator_update(self)
None _handle_coordinator_update(self)
None async_setup_entry(HomeAssistant hass, GardenaBluetoothConfigEntry entry, AddEntitiesCallback async_add_entities)