Use NamedTuple for homekit valve type + service info (#56944)
This commit is contained in:
parent
80a225ca98
commit
e0ab4ee842
2 changed files with 49 additions and 22 deletions
|
@ -1,5 +1,8 @@
|
|||
"""Class to hold all sensor accessories."""
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from typing import Callable, NamedTuple
|
||||
|
||||
from pyhap.const import CATEGORY_SENSOR
|
||||
|
||||
|
@ -60,18 +63,31 @@ from .util import convert_to_float, density_to_air_quality, temperature_to_homek
|
|||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
BINARY_SENSOR_SERVICE_MAP = {
|
||||
DEVICE_CLASS_CO: (SERV_CARBON_MONOXIDE_SENSOR, CHAR_CARBON_MONOXIDE_DETECTED, int),
|
||||
DEVICE_CLASS_CO2: (SERV_CARBON_DIOXIDE_SENSOR, CHAR_CARBON_DIOXIDE_DETECTED, int),
|
||||
DEVICE_CLASS_DOOR: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
DEVICE_CLASS_GARAGE_DOOR: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
DEVICE_CLASS_GAS: (SERV_CARBON_MONOXIDE_SENSOR, CHAR_CARBON_MONOXIDE_DETECTED, int),
|
||||
DEVICE_CLASS_MOISTURE: (SERV_LEAK_SENSOR, CHAR_LEAK_DETECTED, int),
|
||||
DEVICE_CLASS_MOTION: (SERV_MOTION_SENSOR, CHAR_MOTION_DETECTED, bool),
|
||||
DEVICE_CLASS_OCCUPANCY: (SERV_OCCUPANCY_SENSOR, CHAR_OCCUPANCY_DETECTED, int),
|
||||
DEVICE_CLASS_OPENING: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
DEVICE_CLASS_SMOKE: (SERV_SMOKE_SENSOR, CHAR_SMOKE_DETECTED, int),
|
||||
DEVICE_CLASS_WINDOW: (SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
|
||||
class SI(NamedTuple):
|
||||
"""Service info."""
|
||||
|
||||
service: str
|
||||
char: str
|
||||
format: Callable[[bool], int | bool]
|
||||
|
||||
|
||||
BINARY_SENSOR_SERVICE_MAP: dict[str, SI] = {
|
||||
DEVICE_CLASS_CO: SI(
|
||||
SERV_CARBON_MONOXIDE_SENSOR, CHAR_CARBON_MONOXIDE_DETECTED, int
|
||||
),
|
||||
DEVICE_CLASS_CO2: SI(SERV_CARBON_DIOXIDE_SENSOR, CHAR_CARBON_DIOXIDE_DETECTED, int),
|
||||
DEVICE_CLASS_DOOR: SI(SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
DEVICE_CLASS_GARAGE_DOOR: SI(SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
DEVICE_CLASS_GAS: SI(
|
||||
SERV_CARBON_MONOXIDE_SENSOR, CHAR_CARBON_MONOXIDE_DETECTED, int
|
||||
),
|
||||
DEVICE_CLASS_MOISTURE: SI(SERV_LEAK_SENSOR, CHAR_LEAK_DETECTED, int),
|
||||
DEVICE_CLASS_MOTION: SI(SERV_MOTION_SENSOR, CHAR_MOTION_DETECTED, bool),
|
||||
DEVICE_CLASS_OCCUPANCY: SI(SERV_OCCUPANCY_SENSOR, CHAR_OCCUPANCY_DETECTED, int),
|
||||
DEVICE_CLASS_OPENING: SI(SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
DEVICE_CLASS_SMOKE: SI(SERV_SMOKE_SENSOR, CHAR_SMOKE_DETECTED, int),
|
||||
DEVICE_CLASS_WINDOW: SI(SERV_CONTACT_SENSOR, CHAR_CONTACT_SENSOR_STATE, int),
|
||||
}
|
||||
|
||||
|
||||
|
@ -276,11 +292,11 @@ class BinarySensor(HomeAccessory):
|
|||
else BINARY_SENSOR_SERVICE_MAP[DEVICE_CLASS_OCCUPANCY]
|
||||
)
|
||||
|
||||
self.format = service_char[2]
|
||||
service = self.add_preload_service(service_char[0])
|
||||
self.format = service_char.format
|
||||
service = self.add_preload_service(service_char.service)
|
||||
initial_value = False if self.format is bool else 0
|
||||
self.char_detected = service.configure_char(
|
||||
service_char[1], value=initial_value
|
||||
service_char.char, value=initial_value
|
||||
)
|
||||
# Set the state so it is in sync on initial
|
||||
# GET to avoid an event storm after homekit startup
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
"""Class to hold all switch accessories."""
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from typing import NamedTuple
|
||||
|
||||
from pyhap.const import (
|
||||
CATEGORY_FAUCET,
|
||||
|
@ -50,11 +53,19 @@ from .const import (
|
|||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
VALVE_TYPE = {
|
||||
TYPE_FAUCET: (CATEGORY_FAUCET, 3),
|
||||
TYPE_SHOWER: (CATEGORY_SHOWER_HEAD, 2),
|
||||
TYPE_SPRINKLER: (CATEGORY_SPRINKLER, 1),
|
||||
TYPE_VALVE: (CATEGORY_FAUCET, 0),
|
||||
|
||||
class ValveInfo(NamedTuple):
|
||||
"""Category and type information for valve."""
|
||||
|
||||
category: int
|
||||
valve_type: int
|
||||
|
||||
|
||||
VALVE_TYPE: dict[str, ValveInfo] = {
|
||||
TYPE_FAUCET: ValveInfo(CATEGORY_FAUCET, 3),
|
||||
TYPE_SHOWER: ValveInfo(CATEGORY_SHOWER_HEAD, 2),
|
||||
TYPE_SPRINKLER: ValveInfo(CATEGORY_SPRINKLER, 1),
|
||||
TYPE_VALVE: ValveInfo(CATEGORY_FAUCET, 0),
|
||||
}
|
||||
|
||||
|
||||
|
@ -199,7 +210,7 @@ class Valve(HomeAccessory):
|
|||
super().__init__(*args)
|
||||
state = self.hass.states.get(self.entity_id)
|
||||
valve_type = self.config[CONF_TYPE]
|
||||
self.category = VALVE_TYPE[valve_type][0]
|
||||
self.category = VALVE_TYPE[valve_type].category
|
||||
|
||||
serv_valve = self.add_preload_service(SERV_VALVE)
|
||||
self.char_active = serv_valve.configure_char(
|
||||
|
@ -207,7 +218,7 @@ class Valve(HomeAccessory):
|
|||
)
|
||||
self.char_in_use = serv_valve.configure_char(CHAR_IN_USE, value=False)
|
||||
self.char_valve_type = serv_valve.configure_char(
|
||||
CHAR_VALVE_TYPE, value=VALVE_TYPE[valve_type][1]
|
||||
CHAR_VALVE_TYPE, value=VALVE_TYPE[valve_type].valve_type
|
||||
)
|
||||
# Set the state so it is in sync on initial
|
||||
# GET to avoid an event storm after homekit startup
|
||||
|
|
Loading…
Add table
Reference in a new issue