|
|
@@ -1,141 +1,121 @@
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
from homeassistant.helpers.entity import Entity
|
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
-from homeassistant.components.sensor import SensorDeviceClass
|
|
|
-import datetime
|
|
|
+from homeassistant.components.sensor import SensorEntity, SensorDeviceClass
|
|
|
+import datetime, re
|
|
|
|
|
|
from . import ZiBConfigEntry
|
|
|
-from .const import DOMAIN
|
|
|
+from .entity import ZiBEntityBase
|
|
|
+from .room import Reservation
|
|
|
+from .const import DOMAIN, RESERVATION_FIELDS
|
|
|
|
|
|
async def async_setup_entry(
|
|
|
hass: HomeAssistant,
|
|
|
config_entry: ZiBConfigEntry,
|
|
|
async_add_entities: AddEntitiesCallback,
|
|
|
) -> None:
|
|
|
- reservation = config_entry.runtime_data
|
|
|
- entities = []
|
|
|
- entities.append(Guest_Name(reservation))
|
|
|
- entities.append(Door_Code(reservation))
|
|
|
- entities.append(Arrival(reservation))
|
|
|
- entities.append(Departure(reservation))
|
|
|
- entities.append(Check_In(reservation))
|
|
|
- entities.append(Check_Out(reservation))
|
|
|
- entities.append(WiFi_SSID(reservation))
|
|
|
- entities.append(WiFi_Key(reservation))
|
|
|
- async_add_entities(entities)
|
|
|
-
|
|
|
-class ZiBBase(Entity):
|
|
|
- should_poll = False
|
|
|
- _attr_has_entity_name = True
|
|
|
-
|
|
|
- def __init__(self, reservation: Reservation, name: str, icon: str = None):
|
|
|
- self._reservation = reservation
|
|
|
- self._name = name
|
|
|
- self._icon = icon
|
|
|
- self._id = name.lower().replace(' ', '_')
|
|
|
- self._attr_unique_id = f"{self._reservation.id}_{self._id}"
|
|
|
- self._attr_name = self._name
|
|
|
-
|
|
|
+ for reservation in config_entry.runtime_data.reservations:
|
|
|
+ async_add_entities([
|
|
|
+ Guest_Name(reservation),
|
|
|
+ Door_Code(reservation),
|
|
|
+ Arrival(reservation),
|
|
|
+ Departure(reservation),
|
|
|
+ Check_In(reservation),
|
|
|
+ Check_Out(reservation),
|
|
|
+ WiFi_SSID(reservation),
|
|
|
+ WiFi_Key(reservation),
|
|
|
+ ])
|
|
|
+
|
|
|
+def date_parts(dt: datetime) -> dict:
|
|
|
+ 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 ZiBSensorBase(ZiBEntityBase, SensorEntity):
|
|
|
+ def __init__(self, entity: Entity, name: str, icon: str = None):
|
|
|
+ self._field = name.lower().replace(' ', '_')
|
|
|
+ if self._field not in RESERVATION_FIELDS:
|
|
|
+ raise KeyError(self._field)
|
|
|
+ super().__init__(entity, name, f"{entity.id}_{self._field}", icon)
|
|
|
# Fake in some values for testing
|
|
|
- self._reservation.set('guest_name', 'Veronica')
|
|
|
- self._reservation.set('door_code', '0217')
|
|
|
- self._reservation.set('arrival', '2026-05-29')
|
|
|
- self._reservation.set('departure', '2026-05-30')
|
|
|
- self._reservation.set('check_in', '14:00:00')
|
|
|
- self._reservation.set('check_out', '12:00:00')
|
|
|
- self._reservation.set('wifi_ssid', '4114')
|
|
|
- self._reservation.set('wifi_key', 'pioneer-plato-carmen')
|
|
|
-
|
|
|
- async def async_added_to_hass(self):
|
|
|
- self._reservation.register_callback(self.async_write_ha_state)
|
|
|
- async def async_will_remove_from_hass(self):
|
|
|
- self._reservation.remove_callback(self.async_write_ha_state)
|
|
|
-
|
|
|
- def date_parts(self, dt: datetime) -> dict:
|
|
|
- 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': dt.strftime('%-I %p'),
|
|
|
- 'weekday': dt.strftime('%A'),
|
|
|
- 'weekday_abbr': dt.strftime('%a'),
|
|
|
- 'month': dt.strftime('%B'),
|
|
|
- 'month_abbr': dt.strftime('%b'),
|
|
|
- }
|
|
|
-
|
|
|
- @property
|
|
|
- def device_info(self):
|
|
|
- return {"identifiers": {(DOMAIN, self._reservation.id)}}
|
|
|
- @property
|
|
|
- def available(self) -> bool:
|
|
|
- return self._reservation.online
|
|
|
+ self._entity.set('guest_name', 'Veronica')
|
|
|
+ self._entity.set('door_code', '0217')
|
|
|
+ self._entity.set('arrival', '2026-05-29')
|
|
|
+ self._entity.set('departure', '2026-05-30')
|
|
|
+ self._entity.set('check_in', '14:00:00')
|
|
|
+ self._entity.set('check_out', '12:00:00')
|
|
|
+ self._entity.set('wifi_ssid', '4114')
|
|
|
+ self._entity.set('wifi_key', 'pioneer-plato-carmen')
|
|
|
@property
|
|
|
def state(self):
|
|
|
- return self._reservation._data[self._id]
|
|
|
- @property
|
|
|
- def icon(self):
|
|
|
- return self._icon
|
|
|
+ return self._entity._data[self._field]
|
|
|
|
|
|
-class Guest_Name(ZiBBase):
|
|
|
+class Guest_Name(ZiBSensorBase):
|
|
|
def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'Guest Name', 'mdi:account-convert')
|
|
|
- self._attr_name = None # Make Guest_Name the eponymous attribute
|
|
|
- # Add device-level info (i.e. name) to Guest_Name
|
|
|
+ # Add device-level info (i.e. name)
|
|
|
@property
|
|
|
def device_info(self) -> DeviceInfo:
|
|
|
return super().device_info | {
|
|
|
- "name": self._reservation.name,
|
|
|
+ "name": self._entity.name,
|
|
|
}
|
|
|
|
|
|
-class Door_Code(ZiBBase):
|
|
|
- def __init__(self, reservation):
|
|
|
+class Door_Code(ZiBSensorBase):
|
|
|
+ def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'Door Code', 'mdi:door-closed-lock')
|
|
|
|
|
|
-class Arrival(ZiBBase):
|
|
|
- def __init__(self, reservation):
|
|
|
+class Arrival(ZiBSensorBase):
|
|
|
+ def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'Arrival', 'mdi:calendar-start')
|
|
|
self._attr_device_class = SensorDeviceClass.DATE
|
|
|
@property
|
|
|
def extra_state_attributes(self):
|
|
|
dt = datetime.datetime.fromisoformat(
|
|
|
- self._reservation.arrival +
|
|
|
- ' ' + self._reservation.check_in
|
|
|
+ self._entity.arrival +
|
|
|
+ ' ' + self._entity.check_in
|
|
|
)
|
|
|
- return self.date_parts(dt)
|
|
|
+ return date_parts(dt)
|
|
|
|
|
|
-class Departure(ZiBBase):
|
|
|
- def __init__(self, reservation):
|
|
|
+class Departure(ZiBSensorBase):
|
|
|
+ def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'Departure', 'mdi:calendar-end')
|
|
|
self._attr_device_class = SensorDeviceClass.DATE
|
|
|
@property
|
|
|
def extra_state_attributes(self):
|
|
|
dt = datetime.datetime.fromisoformat(
|
|
|
- self._reservation.departure +
|
|
|
- ' ' + self._reservation.check_out
|
|
|
+ self._entity.departure +
|
|
|
+ ' ' + self._entity.check_out
|
|
|
)
|
|
|
- return self.date_parts(dt)
|
|
|
+ return date_parts(dt)
|
|
|
|
|
|
-class Check_In(ZiBBase):
|
|
|
- def __init__(self, reservation):
|
|
|
+class Check_In(ZiBSensorBase):
|
|
|
+ def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'Check In', 'mdi:timer-check-outline')
|
|
|
|
|
|
-class Check_Out(ZiBBase):
|
|
|
- def __init__(self, reservation):
|
|
|
+class Check_Out(ZiBSensorBase):
|
|
|
+ def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'Check Out', 'mdi:timer-cancel-outline')
|
|
|
|
|
|
-class WiFi_SSID(ZiBBase):
|
|
|
- def __init__(self, reservation):
|
|
|
+class WiFi_SSID(ZiBSensorBase):
|
|
|
+ def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'WiFi SSID', 'mdi:wifi')
|
|
|
|
|
|
-class WiFi_Key(ZiBBase):
|
|
|
- def __init__(self, reservation):
|
|
|
+class WiFi_Key(ZiBSensorBase):
|
|
|
+ def __init__(self, reservation: Reservation):
|
|
|
super().__init__(reservation, 'WiFi Key', 'mdi:wifi-lock')
|
|
|
@property
|
|
|
def extra_state_attributes(self):
|
|
|
return {
|
|
|
- 'qr': 'WIFI:S:' + self._reservation.wifi_ssid + ';T:WPA;P:' + self._reservation.wifi_key + ';;'
|
|
|
+ 'qr': 'WIFI:S:' + self._entity.wifi_ssid + ';T:WPA;P:' + self._entity.wifi_key + ';;'
|
|
|
}
|