Use NamedTuple for homekit valve type + service info (#56944)

This commit is contained in:
Marc Mueller 2021-10-04 13:35:31 +02:00 committed by GitHub
parent 80a225ca98
commit e0ab4ee842
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 22 deletions

View file

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

View file

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