|
|
@@ -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"
|