Home Assistant Unofficial Reference 2024.12.1
datetime.py
Go to the documentation of this file.
1 """Support for KNX/IP datetime."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime
6 
7 from xknx import XKNX
8 from xknx.devices import DateTimeDevice as XknxDateTimeDevice
9 from xknx.dpt.dpt_19 import KNXDateTime as XKNXDateTime
10 
11 from homeassistant import config_entries
12 from homeassistant.components.datetime import DateTimeEntity
13 from homeassistant.const import (
14  CONF_ENTITY_CATEGORY,
15  CONF_NAME,
16  STATE_UNAVAILABLE,
17  STATE_UNKNOWN,
18  Platform,
19 )
20 from homeassistant.core import HomeAssistant
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 from homeassistant.helpers.restore_state import RestoreEntity
23 from homeassistant.helpers.typing import ConfigType
24 import homeassistant.util.dt as dt_util
25 
26 from . import KNXModule
27 from .const import (
28  CONF_RESPOND_TO_READ,
29  CONF_STATE_ADDRESS,
30  CONF_SYNC_STATE,
31  KNX_ADDRESS,
32  KNX_MODULE_KEY,
33 )
34 from .entity import KnxYamlEntity
35 
36 
38  hass: HomeAssistant,
39  config_entry: config_entries.ConfigEntry,
40  async_add_entities: AddEntitiesCallback,
41 ) -> None:
42  """Set up entities for KNX platform."""
43  knx_module = hass.data[KNX_MODULE_KEY]
44  config: list[ConfigType] = knx_module.config_yaml[Platform.DATETIME]
45 
47  KNXDateTimeEntity(knx_module, entity_config) for entity_config in config
48  )
49 
50 
51 def _create_xknx_device(xknx: XKNX, config: ConfigType) -> XknxDateTimeDevice:
52  """Return a XKNX DateTime object to be used within XKNX."""
53  return XknxDateTimeDevice(
54  xknx,
55  name=config[CONF_NAME],
56  localtime=False,
57  group_address=config[KNX_ADDRESS],
58  group_address_state=config.get(CONF_STATE_ADDRESS),
59  respond_to_read=config[CONF_RESPOND_TO_READ],
60  sync_state=config[CONF_SYNC_STATE],
61  )
62 
63 
65  """Representation of a KNX datetime."""
66 
67  _device: XknxDateTimeDevice
68 
69  def __init__(self, knx_module: KNXModule, config: ConfigType) -> None:
70  """Initialize a KNX time."""
71  super().__init__(
72  knx_module=knx_module,
73  device=_create_xknx_device(knx_module.xknx, config),
74  )
75  self._attr_entity_category_attr_entity_category = config.get(CONF_ENTITY_CATEGORY)
76  self._attr_unique_id_attr_unique_id = str(self._device_device.remote_value.group_address)
77 
78  async def async_added_to_hass(self) -> None:
79  """Restore last state."""
80  await super().async_added_to_hass()
81  if (
82  not self._device_device.remote_value.readable
83  and (last_state := await self.async_get_last_stateasync_get_last_state()) is not None
84  and last_state.state not in (STATE_UNKNOWN, STATE_UNAVAILABLE)
85  ):
86  self._device_device.remote_value.value = XKNXDateTime.from_datetime(
87  datetime.fromisoformat(last_state.state).astimezone(
88  dt_util.get_default_time_zone()
89  )
90  )
91 
92  @property
93  def native_value(self) -> datetime | None:
94  """Return the latest value."""
95  if (naive_dt := self._device_device.value) is None:
96  return None
97  return naive_dt.replace(tzinfo=dt_util.get_default_time_zone())
98 
99  async def async_set_value(self, value: datetime) -> None:
100  """Change the value."""
101  await self._device_device.set(value.astimezone(dt_util.get_default_time_zone()))
None __init__(self, KNXModule knx_module, ConfigType config)
Definition: datetime.py:69
XknxDateTimeDevice _create_xknx_device(XKNX xknx, ConfigType config)
Definition: datetime.py:51
None async_setup_entry(HomeAssistant hass, config_entries.ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: datetime.py:41