Просмотр исходного кода

Add datetime attributes to date sensors and default check-in/out times

Check-In/Out Date sensors now expose combined datetime attributes (formatted
strings for weekday, hour, etc.) via extra_state_attributes. Default check-in
time is 14:00 and check-out is 12:00 on ReservationData.
ZiB 4 месяцев назад
Родитель
Сommit
2772be6e9d
2 измененных файлов с 54 добавлено и 13 удалено
  1. 2 2
      custom_components/room_cal_ha/models.py
  2. 52 11
      custom_components/room_cal_ha/sensor.py

+ 2 - 2
custom_components/room_cal_ha/models.py

@@ -9,9 +9,9 @@ from typing import Any
 class ReservationData:
   guest_name: str | None = None
   check_in_date: date | None = None
-  check_in_time: time | None = None
+  check_in_time: time | None = time(14, 0)
   check_out_date: date | None = None
-  check_out_time: time | None = None
+  check_out_time: time | None = time(12, 0)
   wifi_ssid: str | None = None
   wifi_key: str | None = None
   door_code: str | None = None

+ 52 - 11
custom_components/room_cal_ha/sensor.py

@@ -1,7 +1,7 @@
 from __future__ import annotations
 
+import re
 from datetime import date, datetime, time
-from typing import Any
 
 from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
 from homeassistant.config_entries import ConfigEntry
@@ -43,9 +43,9 @@ async def async_setup_entry(
     )
     entities += [
       ReservationStrSensor(coordinator, entry, slot, device_info, "Guest Name", "guest_name"),
-      ReservationDateSensor(coordinator, entry, slot, device_info, "Check-In Date", "check_in_date"),
+      ReservationDateTimeSensor(coordinator, entry, slot, device_info, "Check-In Date", "check_in_date", "check_in_time"),
       ReservationTimeSensor(coordinator, entry, slot, device_info, "Check-In Time", "check_in_time"),
-      ReservationDateSensor(coordinator, entry, slot, device_info, "Check-Out Date", "check_out_date"),
+      ReservationDateTimeSensor(coordinator, entry, slot, device_info, "Check-Out Date", "check_out_date", "check_out_time"),
       ReservationTimeSensor(coordinator, entry, slot, device_info, "Check-Out Time", "check_out_time"),
       ReservationStrSensor(coordinator, entry, slot, device_info, "WiFi SSID", "wifi_ssid"),
       ReservationStrSensor(coordinator, entry, slot, device_info, "WiFi Key", "wifi_key"),
@@ -86,14 +86,6 @@ class ReservationStrSensor(_ReservationSensor):
     return getattr(self._reservation(), self._field)
 
 
-class ReservationDateSensor(_ReservationSensor):
-  _attr_device_class = SensorDeviceClass.DATE
-
-  @property
-  def native_value(self) -> date | None:
-    return getattr(self._reservation(), self._field)
-
-
 class ReservationTimeSensor(_ReservationSensor):
   """Time sensor. HA has no TIME device class for sensors; we expose as string ISO."""
 
@@ -103,6 +95,55 @@ class ReservationTimeSensor(_ReservationSensor):
     return val.isoformat() if val is not None else None
 
 
+def _dt_attrs(dt: datetime) -> dict[str, str]:
+  return {
+    "datetime": dt.isoformat(),
+    "datetime_abbr": dt.strftime("%Y-%m-%d @ %-I %p"),
+    "date": dt.strftime("%Y-%m-%d"),
+    "date_weekday": dt.strftime("%a, %b %-d"),
+    "datetime_weekday": dt.strftime("%a, %b %-d @ %-I %p"),
+    "time": dt.strftime("%H:%M:%S"),
+    "time_abbr": dt.strftime("%H:%M"),
+    "hour": re.sub("^0", " ", dt.strftime("%I %p")),
+    "weekday": dt.strftime("%A"),
+    "weekday_abbr": dt.strftime("%a"),
+    "month": dt.strftime("%B"),
+    "month_abbr": dt.strftime("%b"),
+  }
+
+
+class ReservationDateTimeSensor(_ReservationSensor):
+  """Date sensor that also exposes combined datetime attributes."""
+
+  _attr_device_class = SensorDeviceClass.DATE
+
+  def __init__(
+    self,
+    coordinator: RoomCalCoordinator,
+    entry: ConfigEntry,
+    slot: str,
+    device_info: DeviceInfo,
+    name: str,
+    field: str,
+    time_field: str,
+  ) -> None:
+    super().__init__(coordinator, entry, slot, device_info, name, field)
+    self._time_field = time_field
+
+  @property
+  def native_value(self) -> date | None:
+    return getattr(self._reservation(), self._field)
+
+  @property
+  def extra_state_attributes(self) -> dict[str, str] | None:
+    res = self._reservation()
+    d: date | None = getattr(res, self._field)
+    t: time | None = getattr(res, self._time_field)
+    if d is None or t is None:
+      return None
+    return _dt_attrs(datetime.combine(d, t))
+
+
 class LastRefreshSensor(CoordinatorEntity[RoomCalCoordinator], SensorEntity):
   _attr_has_entity_name = True
   _attr_name = "Last Refresh"