sensor.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. from __future__ import annotations
  2. from homeassistant.components.sensor import SensorEntity
  3. from homeassistant.config_entries import ConfigEntry
  4. from homeassistant.core import HomeAssistant, callback
  5. from homeassistant.helpers.entity_platform import AddEntitiesCallback
  6. from homeassistant.helpers.update_coordinator import CoordinatorEntity
  7. from .const import DOMAIN, CONF_LOCK_ENTITY_IDS, CONF_GROUPS, CONF_GROUP_NAME
  8. from .coordinator import ZLockCoordinator
  9. async def async_setup_entry(
  10. hass: HomeAssistant,
  11. entry: ConfigEntry,
  12. async_add_entities: AddEntitiesCallback,
  13. ) -> None:
  14. coordinator: ZLockCoordinator = hass.data[DOMAIN][entry.entry_id]
  15. entities = []
  16. for lock_entity_id in entry.data[CONF_LOCK_ENTITY_IDS]:
  17. entities.append(ZLockLastActionSensor(coordinator, entry, lock_entity_id))
  18. entities.append(ZLockLastUserSensor(coordinator, entry, lock_entity_id))
  19. entities.append(ZLockSlotsSensor(coordinator, entry, lock_entity_id))
  20. for group in entry.options.get(CONF_GROUPS, []):
  21. group_name = group[CONF_GROUP_NAME]
  22. entities.append(ZLockGroupLastActionSensor(coordinator, entry, group_name))
  23. entities.append(ZLockGroupLastUserSensor(coordinator, entry, group_name))
  24. async_add_entities(entities)
  25. def _lock_object_id(lock_entity_id: str) -> str:
  26. return lock_entity_id.split(".")[-1]
  27. class _ZLockBaseSensor(CoordinatorEntity[ZLockCoordinator], SensorEntity):
  28. _attr_has_entity_name = True
  29. def __init__(
  30. self,
  31. coordinator: ZLockCoordinator,
  32. entry: ConfigEntry,
  33. lock_entity_id: str,
  34. ) -> None:
  35. super().__init__(coordinator)
  36. self._lock_entity_id = lock_entity_id
  37. self._entry = entry
  38. @property
  39. def _lock_state(self):
  40. return self.coordinator.data.get(self._lock_entity_id)
  41. class ZLockLastActionSensor(_ZLockBaseSensor):
  42. _attr_translation_key = "last_action"
  43. def __init__(self, coordinator, entry, lock_entity_id):
  44. super().__init__(coordinator, entry, lock_entity_id)
  45. self._attr_unique_id = f"{entry.entry_id}_{lock_entity_id}_last_action"
  46. @property
  47. def name(self) -> str:
  48. return f"{_lock_object_id(self._lock_entity_id)} last action"
  49. @property
  50. def native_value(self) -> str | None:
  51. state = self._lock_state
  52. return state.last_action if state else None
  53. class ZLockLastUserSensor(_ZLockBaseSensor):
  54. _attr_translation_key = "last_user"
  55. def __init__(self, coordinator, entry, lock_entity_id):
  56. super().__init__(coordinator, entry, lock_entity_id)
  57. self._attr_unique_id = f"{entry.entry_id}_{lock_entity_id}_last_user"
  58. @property
  59. def name(self) -> str:
  60. return f"{_lock_object_id(self._lock_entity_id)} last user"
  61. @property
  62. def native_value(self) -> str | None:
  63. state = self._lock_state
  64. return state.last_user if state else None
  65. class ZLockSlotsSensor(_ZLockBaseSensor):
  66. _attr_translation_key = "slots"
  67. def __init__(self, coordinator, entry, lock_entity_id):
  68. super().__init__(coordinator, entry, lock_entity_id)
  69. self._attr_unique_id = f"{entry.entry_id}_{lock_entity_id}_slots"
  70. @property
  71. def name(self) -> str:
  72. return f"{_lock_object_id(self._lock_entity_id)} slots"
  73. @property
  74. def native_value(self) -> int:
  75. state = self._lock_state
  76. return len(state.slots) if state else 0
  77. @property
  78. def extra_state_attributes(self) -> dict:
  79. state = self._lock_state
  80. if not state:
  81. return {"slots": []}
  82. return {
  83. "slots": [
  84. {
  85. "slot_num": num,
  86. "status": info.status,
  87. "name": info.name,
  88. }
  89. for num, info in sorted(state.slots.items())
  90. ]
  91. }
  92. class _ZLockGroupBaseSensor(CoordinatorEntity[ZLockCoordinator], SensorEntity):
  93. _attr_has_entity_name = True
  94. def __init__(
  95. self,
  96. coordinator: ZLockCoordinator,
  97. entry: ConfigEntry,
  98. group_name: str,
  99. ) -> None:
  100. super().__init__(coordinator)
  101. self._group_name = group_name
  102. self._entry = entry
  103. @property
  104. def _group_state(self):
  105. return self.coordinator.group_data.get(self._group_name)
  106. class ZLockGroupLastActionSensor(_ZLockGroupBaseSensor):
  107. _attr_translation_key = "last_action"
  108. def __init__(self, coordinator, entry, group_name):
  109. super().__init__(coordinator, entry, group_name)
  110. self._attr_unique_id = f"{entry.entry_id}_group_{group_name}_last_action"
  111. @property
  112. def name(self) -> str:
  113. return f"{self._group_name} last action"
  114. @property
  115. def native_value(self) -> str | None:
  116. state = self._group_state
  117. return state.last_action if state else None
  118. class ZLockGroupLastUserSensor(_ZLockGroupBaseSensor):
  119. _attr_translation_key = "last_user"
  120. def __init__(self, coordinator, entry, group_name):
  121. super().__init__(coordinator, entry, group_name)
  122. self._attr_unique_id = f"{entry.entry_id}_group_{group_name}_last_user"
  123. @property
  124. def name(self) -> str:
  125. return f"{self._group_name} last user"
  126. @property
  127. def native_value(self) -> str | None:
  128. state = self._group_state
  129. return state.last_user if state else None