Refactor homekit_controller to prepare for more typing information (#65329)

This commit is contained in:
Jc2k 2022-01-31 22:48:16 +00:00 committed by GitHub
parent a9af29cbe0
commit 0f88790303
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 139 additions and 179 deletions

View File

@ -51,7 +51,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if service.short_type != ServicesTypes.SECURITY_SYSTEM: if service.type != ServicesTypes.SECURITY_SYSTEM:
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([HomeKitAlarmControlPanelEntity(conn, info)], True) async_add_entities([HomeKitAlarmControlPanelEntity(conn, info)], True)

View File

@ -124,7 +124,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if not (entity_class := ENTITY_TYPES.get(service.short_type)): if not (entity_class := ENTITY_TYPES.get(service.type)):
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([entity_class(conn, info)], True) async_add_entities([entity_class(conn, info)], True)

View File

@ -31,15 +31,15 @@ class HomeKitButtonEntityDescription(ButtonEntityDescription):
BUTTON_ENTITIES: dict[str, HomeKitButtonEntityDescription] = { BUTTON_ENTITIES: dict[str, HomeKitButtonEntityDescription] = {
CharacteristicsTypes.Vendor.HAA_SETUP: HomeKitButtonEntityDescription( CharacteristicsTypes.VENDOR_HAA_SETUP: HomeKitButtonEntityDescription(
key=CharacteristicsTypes.Vendor.HAA_SETUP, key=CharacteristicsTypes.VENDOR_HAA_SETUP,
name="Setup", name="Setup",
icon="mdi:cog", icon="mdi:cog",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
write_value="#HAA@trcmd", write_value="#HAA@trcmd",
), ),
CharacteristicsTypes.Vendor.HAA_UPDATE: HomeKitButtonEntityDescription( CharacteristicsTypes.VENDOR_HAA_UPDATE: HomeKitButtonEntityDescription(
key=CharacteristicsTypes.Vendor.HAA_UPDATE, key=CharacteristicsTypes.VENDOR_HAA_UPDATE,
name="Update", name="Update",
device_class=ButtonDeviceClass.UPDATE, device_class=ButtonDeviceClass.UPDATE,
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
@ -54,16 +54,6 @@ BUTTON_ENTITIES: dict[str, HomeKitButtonEntityDescription] = {
} }
# For legacy reasons, "built-in" characteristic types are in their short form
# And vendor types don't have a short form
# This means long and short forms get mixed up in this dict, and comparisons
# don't work!
# We call get_uuid on *every* type to normalise them to the long form
# Eventually aiohomekit will use the long form exclusively amd this can be removed.
for k, v in list(BUTTON_ENTITIES.items()):
BUTTON_ENTITIES[CharacteristicsTypes.get_uuid(k)] = BUTTON_ENTITIES.pop(k)
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ConfigEntry,
@ -155,5 +145,5 @@ class HomeKitEcobeeClearHoldButton(CharacteristicEntity, ButtonEntity):
BUTTON_ENTITY_CLASSES: dict[str, type] = { BUTTON_ENTITY_CLASSES: dict[str, type] = {
CharacteristicsTypes.Vendor.ECOBEE_CLEAR_HOLD: HomeKitEcobeeClearHoldButton, CharacteristicsTypes.VENDOR_ECOBEE_CLEAR_HOLD: HomeKitEcobeeClearHoldButton,
} }

View File

@ -95,7 +95,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if not (entity_class := ENTITY_TYPES.get(service.short_type)): if not (entity_class := ENTITY_TYPES.get(service.type)):
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([entity_class(conn, info)], True) async_add_entities([entity_class(conn, info)], True)

View File

@ -11,6 +11,7 @@ from aiohomekit.exceptions import (
from aiohomekit.model import Accessories, Accessory from aiohomekit.model import Accessories, Accessory
from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.characteristics import CharacteristicsTypes
from aiohomekit.model.services import ServicesTypes from aiohomekit.model.services import ServicesTypes
from aiohomekit.uuid import normalize_uuid
from homeassistant.const import ATTR_VIA_DEVICE from homeassistant.const import ATTR_VIA_DEVICE
from homeassistant.core import callback from homeassistant.core import callback
@ -495,7 +496,7 @@ class HKDevice:
for accessory in self.accessories: for accessory in self.accessories:
for service in accessory["services"]: for service in accessory["services"]:
try: try:
stype = ServicesTypes.get_short_uuid(service["type"].upper()) stype = normalize_uuid(service["type"])
except KeyError: except KeyError:
stype = service["type"].upper() stype = service["type"].upper()

View File

@ -51,33 +51,33 @@ HOMEKIT_ACCESSORY_DISPATCH = {
} }
CHARACTERISTIC_PLATFORMS = { CHARACTERISTIC_PLATFORMS = {
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_WATT: "sensor", CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_WATT: "sensor",
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_AMPS: "sensor", CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_AMPS: "sensor",
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_AMPS_20: "sensor", CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_AMPS_20: "sensor",
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_KW_HOUR: "sensor", CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_KW_HOUR: "sensor",
CharacteristicsTypes.Vendor.AQARA_GATEWAY_VOLUME: "number", CharacteristicsTypes.VENDOR_AQARA_GATEWAY_VOLUME: "number",
CharacteristicsTypes.Vendor.AQARA_E1_GATEWAY_VOLUME: "number", CharacteristicsTypes.VENDOR_AQARA_E1_GATEWAY_VOLUME: "number",
CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE: "switch", CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE: "switch",
CharacteristicsTypes.Vendor.AQARA_E1_PAIRING_MODE: "switch", CharacteristicsTypes.VENDOR_AQARA_E1_PAIRING_MODE: "switch",
CharacteristicsTypes.Vendor.ECOBEE_HOME_TARGET_COOL: "number", CharacteristicsTypes.VENDOR_ECOBEE_HOME_TARGET_COOL: "number",
CharacteristicsTypes.Vendor.ECOBEE_HOME_TARGET_HEAT: "number", CharacteristicsTypes.VENDOR_ECOBEE_HOME_TARGET_HEAT: "number",
CharacteristicsTypes.Vendor.ECOBEE_SLEEP_TARGET_COOL: "number", CharacteristicsTypes.VENDOR_ECOBEE_SLEEP_TARGET_COOL: "number",
CharacteristicsTypes.Vendor.ECOBEE_SLEEP_TARGET_HEAT: "number", CharacteristicsTypes.VENDOR_ECOBEE_SLEEP_TARGET_HEAT: "number",
CharacteristicsTypes.Vendor.ECOBEE_AWAY_TARGET_COOL: "number", CharacteristicsTypes.VENDOR_ECOBEE_AWAY_TARGET_COOL: "number",
CharacteristicsTypes.Vendor.ECOBEE_AWAY_TARGET_HEAT: "number", CharacteristicsTypes.VENDOR_ECOBEE_AWAY_TARGET_HEAT: "number",
CharacteristicsTypes.Vendor.ECOBEE_CURRENT_MODE: "select", CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE: "select",
CharacteristicsTypes.Vendor.EVE_ENERGY_WATT: "sensor", CharacteristicsTypes.VENDOR_EVE_ENERGY_WATT: "sensor",
CharacteristicsTypes.Vendor.EVE_DEGREE_AIR_PRESSURE: "sensor", CharacteristicsTypes.VENDOR_EVE_DEGREE_AIR_PRESSURE: "sensor",
CharacteristicsTypes.Vendor.EVE_DEGREE_ELEVATION: "number", CharacteristicsTypes.VENDOR_EVE_DEGREE_ELEVATION: "number",
CharacteristicsTypes.Vendor.HAA_SETUP: "button", CharacteristicsTypes.VENDOR_HAA_SETUP: "button",
CharacteristicsTypes.Vendor.HAA_UPDATE: "button", CharacteristicsTypes.VENDOR_HAA_UPDATE: "button",
CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY: "sensor", CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY: "sensor",
CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY_2: "sensor", CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY_2: "sensor",
CharacteristicsTypes.Vendor.VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: "number", CharacteristicsTypes.VENDOR_VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: "number",
CharacteristicsTypes.Vendor.VOCOLINC_OUTLET_ENERGY: "sensor", CharacteristicsTypes.VENDOR_VOCOLINC_OUTLET_ENERGY: "sensor",
CharacteristicsTypes.Vendor.ECOBEE_CLEAR_HOLD: "button", CharacteristicsTypes.VENDOR_ECOBEE_CLEAR_HOLD: "button",
CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED: "number", CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED: "number",
CharacteristicsTypes.Vendor.ECOBEE_SET_HOLD_SCHEDULE: "number", CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: "number",
CharacteristicsTypes.TEMPERATURE_CURRENT: "sensor", CharacteristicsTypes.TEMPERATURE_CURRENT: "sensor",
CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT: "sensor", CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT: "sensor",
CharacteristicsTypes.AIR_QUALITY: "sensor", CharacteristicsTypes.AIR_QUALITY: "sensor",
@ -90,16 +90,6 @@ CHARACTERISTIC_PLATFORMS = {
CharacteristicsTypes.IDENTIFY: "button", CharacteristicsTypes.IDENTIFY: "button",
} }
# For legacy reasons, "built-in" characteristic types are in their short form
# And vendor types don't have a short form
# This means long and short forms get mixed up in this dict, and comparisons
# don't work!
# We call get_uuid on *every* type to normalise them to the long form
# Eventually aiohomekit will use the long form exclusively amd this can be removed.
for k, v in list(CHARACTERISTIC_PLATFORMS.items()):
value = CHARACTERISTIC_PLATFORMS.pop(k)
CHARACTERISTIC_PLATFORMS[CharacteristicsTypes.get_uuid(k)] = value
# Device classes # Device classes
DEVICE_CLASS_ECOBEE_MODE: Final = "homekit_controller__ecobee_mode" DEVICE_CLASS_ECOBEE_MODE: Final = "homekit_controller__ecobee_mode"

View File

@ -47,7 +47,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if not (entity_class := ENTITY_TYPES.get(service.short_type)): if not (entity_class := ENTITY_TYPES.get(service.type)):
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([entity_class(conn, info)], True) async_add_entities([entity_class(conn, info)], True)

View File

@ -197,7 +197,7 @@ async def async_setup_triggers_for_entry(hass: HomeAssistant, config_entry):
@callback @callback
def async_add_service(service): def async_add_service(service):
aid = service.accessory.aid aid = service.accessory.aid
service_type = service.short_type service_type = service.type
# If not a known service type then we can't handle any stateless events for it # If not a known service type then we can't handle any stateless events for it
if service_type not in TRIGGER_FINDERS: if service_type not in TRIGGER_FINDERS:

View File

@ -15,7 +15,7 @@ from .connection import HKDevice
from .const import KNOWN_DEVICES from .const import KNOWN_DEVICES
REDACTED_CHARACTERISTICS = [ REDACTED_CHARACTERISTICS = [
CharacteristicsTypes.get_uuid(CharacteristicsTypes.SERIAL_NUMBER), CharacteristicsTypes.SERIAL_NUMBER,
] ]
REDACTED_CONFIG_ENTRY_KEYS = [ REDACTED_CONFIG_ENTRY_KEYS = [
@ -112,12 +112,7 @@ def _async_get_diagnostics(
for accessory in accessories: for accessory in accessories:
for service in accessory.get("services", []): for service in accessory.get("services", []):
for char in service.get("characteristics", []): for char in service.get("characteristics", []):
try: if char["type"] in REDACTED_CHARACTERISTICS:
normalized = CharacteristicsTypes.get_uuid(char["type"])
except KeyError:
normalized = char["type"]
if normalized in REDACTED_CHARACTERISTICS:
char["value"] = REDACTED char["value"] = REDACTED
if device: if device:

View File

@ -160,7 +160,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if not (entity_class := ENTITY_TYPES.get(service.short_type)): if not (entity_class := ENTITY_TYPES.get(service.type)):
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([entity_class(conn, info)], True) async_add_entities([entity_class(conn, info)], True)

View File

@ -252,7 +252,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if service.short_type != ServicesTypes.HUMIDIFIER_DEHUMIDIFIER: if service.type != ServicesTypes.HUMIDIFIER_DEHUMIDIFIER:
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}

View File

@ -29,7 +29,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if service.short_type != ServicesTypes.LIGHTBULB: if service.type != ServicesTypes.LIGHTBULB:
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([HomeKitLight(conn, info)], True) async_add_entities([HomeKitLight(conn, info)], True)

View File

@ -38,7 +38,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if service.short_type != ServicesTypes.LOCK_MECHANISM: if service.type != ServicesTypes.LOCK_MECHANISM:
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([HomeKitLock(conn, info)], True) async_add_entities([HomeKitLock(conn, info)], True)

View File

@ -3,7 +3,7 @@
"name": "HomeKit Controller", "name": "HomeKit Controller",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/homekit_controller", "documentation": "https://www.home-assistant.io/integrations/homekit_controller",
"requirements": ["aiohomekit==0.6.11"], "requirements": ["aiohomekit==0.7.0"],
"zeroconf": ["_hap._tcp.local."], "zeroconf": ["_hap._tcp.local."],
"after_dependencies": ["zeroconf"], "after_dependencies": ["zeroconf"],
"codeowners": ["@Jc2k", "@bdraco"], "codeowners": ["@Jc2k", "@bdraco"],

View File

@ -54,7 +54,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if service.short_type != ServicesTypes.TELEVISION: if service.type != ServicesTypes.TELEVISION:
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([HomeKitTelevision(conn, info)], True) async_add_entities([HomeKitTelevision(conn, info)], True)

View File

@ -17,62 +17,62 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import KNOWN_DEVICES, CharacteristicEntity from . import KNOWN_DEVICES, CharacteristicEntity
NUMBER_ENTITIES: dict[str, NumberEntityDescription] = { NUMBER_ENTITIES: dict[str, NumberEntityDescription] = {
CharacteristicsTypes.Vendor.VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: NumberEntityDescription( CharacteristicsTypes.VENDOR_VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.VOCOLINC_HUMIDIFIER_SPRAY_LEVEL, key=CharacteristicsTypes.VENDOR_VOCOLINC_HUMIDIFIER_SPRAY_LEVEL,
name="Spray Quantity", name="Spray Quantity",
icon="mdi:water", icon="mdi:water",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.EVE_DEGREE_ELEVATION: NumberEntityDescription( CharacteristicsTypes.VENDOR_EVE_DEGREE_ELEVATION: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.EVE_DEGREE_ELEVATION, key=CharacteristicsTypes.VENDOR_EVE_DEGREE_ELEVATION,
name="Elevation", name="Elevation",
icon="mdi:elevation-rise", icon="mdi:elevation-rise",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.AQARA_GATEWAY_VOLUME: NumberEntityDescription( CharacteristicsTypes.VENDOR_AQARA_GATEWAY_VOLUME: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.AQARA_GATEWAY_VOLUME, key=CharacteristicsTypes.VENDOR_AQARA_GATEWAY_VOLUME,
name="Volume", name="Volume",
icon="mdi:volume-high", icon="mdi:volume-high",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.AQARA_E1_GATEWAY_VOLUME: NumberEntityDescription( CharacteristicsTypes.VENDOR_AQARA_E1_GATEWAY_VOLUME: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.AQARA_E1_GATEWAY_VOLUME, key=CharacteristicsTypes.VENDOR_AQARA_E1_GATEWAY_VOLUME,
name="Volume", name="Volume",
icon="mdi:volume-high", icon="mdi:volume-high",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.ECOBEE_HOME_TARGET_COOL: NumberEntityDescription( CharacteristicsTypes.VENDOR_ECOBEE_HOME_TARGET_COOL: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.ECOBEE_HOME_TARGET_COOL, key=CharacteristicsTypes.VENDOR_ECOBEE_HOME_TARGET_COOL,
name="Home Cool Target", name="Home Cool Target",
icon="mdi:thermometer-minus", icon="mdi:thermometer-minus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.ECOBEE_HOME_TARGET_HEAT: NumberEntityDescription( CharacteristicsTypes.VENDOR_ECOBEE_HOME_TARGET_HEAT: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.ECOBEE_HOME_TARGET_HEAT, key=CharacteristicsTypes.VENDOR_ECOBEE_HOME_TARGET_HEAT,
name="Home Heat Target", name="Home Heat Target",
icon="mdi:thermometer-plus", icon="mdi:thermometer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.ECOBEE_SLEEP_TARGET_COOL: NumberEntityDescription( CharacteristicsTypes.VENDOR_ECOBEE_SLEEP_TARGET_COOL: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.ECOBEE_SLEEP_TARGET_COOL, key=CharacteristicsTypes.VENDOR_ECOBEE_SLEEP_TARGET_COOL,
name="Sleep Cool Target", name="Sleep Cool Target",
icon="mdi:thermometer-minus", icon="mdi:thermometer-minus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.ECOBEE_SLEEP_TARGET_HEAT: NumberEntityDescription( CharacteristicsTypes.VENDOR_ECOBEE_SLEEP_TARGET_HEAT: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.ECOBEE_SLEEP_TARGET_HEAT, key=CharacteristicsTypes.VENDOR_ECOBEE_SLEEP_TARGET_HEAT,
name="Sleep Heat Target", name="Sleep Heat Target",
icon="mdi:thermometer-plus", icon="mdi:thermometer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.ECOBEE_AWAY_TARGET_COOL: NumberEntityDescription( CharacteristicsTypes.VENDOR_ECOBEE_AWAY_TARGET_COOL: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.ECOBEE_AWAY_TARGET_COOL, key=CharacteristicsTypes.VENDOR_ECOBEE_AWAY_TARGET_COOL,
name="Away Cool Target", name="Away Cool Target",
icon="mdi:thermometer-minus", icon="mdi:thermometer-minus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.ECOBEE_AWAY_TARGET_HEAT: NumberEntityDescription( CharacteristicsTypes.VENDOR_ECOBEE_AWAY_TARGET_HEAT: NumberEntityDescription(
key=CharacteristicsTypes.Vendor.ECOBEE_AWAY_TARGET_HEAT, key=CharacteristicsTypes.VENDOR_ECOBEE_AWAY_TARGET_HEAT,
name="Away Heat Target", name="Away Heat Target",
icon="mdi:thermometer-plus", icon="mdi:thermometer-plus",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
@ -226,5 +226,5 @@ class HomeKitEcobeeFanModeNumber(CharacteristicEntity, NumberEntity):
NUMBER_ENTITY_CLASSES: dict[str, type] = { NUMBER_ENTITY_CLASSES: dict[str, type] = {
CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED: HomeKitEcobeeFanModeNumber, CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED: HomeKitEcobeeFanModeNumber,
} }

View File

@ -35,7 +35,7 @@ class EcobeeModeSelect(CharacteristicEntity, SelectEntity):
def get_characteristic_types(self): def get_characteristic_types(self):
"""Define the homekit characteristics the entity cares about.""" """Define the homekit characteristics the entity cares about."""
return [ return [
CharacteristicsTypes.Vendor.ECOBEE_CURRENT_MODE, CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE,
] ]
@property @property
@ -47,7 +47,7 @@ class EcobeeModeSelect(CharacteristicEntity, SelectEntity):
"""Set the current mode.""" """Set the current mode."""
option_int = _ECOBEE_MODE_TO_NUMBERS[option] option_int = _ECOBEE_MODE_TO_NUMBERS[option]
await self.async_put_characteristics( await self.async_put_characteristics(
{CharacteristicsTypes.Vendor.ECOBEE_SET_HOLD_SCHEDULE: option_int} {CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: option_int}
) )
@ -62,7 +62,7 @@ async def async_setup_entry(
@callback @callback
def async_add_characteristic(char: Characteristic): def async_add_characteristic(char: Characteristic):
if char.type == CharacteristicsTypes.Vendor.ECOBEE_CURRENT_MODE: if char.type == CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE:
info = {"aid": char.service.accessory.aid, "iid": char.service.iid} info = {"aid": char.service.accessory.aid, "iid": char.service.iid}
async_add_entities([EcobeeModeSelect(conn, info, char)]) async_add_entities([EcobeeModeSelect(conn, info, char)])
return True return True

View File

@ -42,85 +42,85 @@ class HomeKitSensorEntityDescription(SensorEntityDescription):
SIMPLE_SENSOR: dict[str, HomeKitSensorEntityDescription] = { SIMPLE_SENSOR: dict[str, HomeKitSensorEntityDescription] = {
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_WATT: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_WATT: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_WATT, key=CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_WATT,
name="Power", name="Power",
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=POWER_WATT, native_unit_of_measurement=POWER_WATT,
), ),
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_AMPS: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_AMPS: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_AMPS, key=CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_AMPS,
name="Current", name="Current",
device_class=SensorDeviceClass.CURRENT, device_class=SensorDeviceClass.CURRENT,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
), ),
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_AMPS_20: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_AMPS_20: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_AMPS_20, key=CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_AMPS_20,
name="Current", name="Current",
device_class=SensorDeviceClass.CURRENT, device_class=SensorDeviceClass.CURRENT,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
), ),
CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_KW_HOUR: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_KW_HOUR: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.CONNECTSENSE_ENERGY_KW_HOUR, key=CharacteristicsTypes.VENDOR_CONNECTSENSE_ENERGY_KW_HOUR,
name="Energy kWh", name="Energy kWh",
device_class=SensorDeviceClass.ENERGY, device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
), ),
CharacteristicsTypes.Vendor.EVE_ENERGY_WATT: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_EVE_ENERGY_WATT: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.EVE_ENERGY_WATT, key=CharacteristicsTypes.VENDOR_EVE_ENERGY_WATT,
name="Power", name="Power",
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=POWER_WATT, native_unit_of_measurement=POWER_WATT,
), ),
CharacteristicsTypes.Vendor.EVE_ENERGY_KW_HOUR: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_EVE_ENERGY_KW_HOUR: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.EVE_ENERGY_KW_HOUR, key=CharacteristicsTypes.VENDOR_EVE_ENERGY_KW_HOUR,
name="Energy kWh", name="Energy kWh",
device_class=SensorDeviceClass.ENERGY, device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
), ),
CharacteristicsTypes.Vendor.EVE_ENERGY_VOLTAGE: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_EVE_ENERGY_VOLTAGE: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.EVE_ENERGY_VOLTAGE, key=CharacteristicsTypes.VENDOR_EVE_ENERGY_VOLTAGE,
name="Volts", name="Volts",
device_class=SensorDeviceClass.VOLTAGE, device_class=SensorDeviceClass.VOLTAGE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
), ),
CharacteristicsTypes.Vendor.EVE_ENERGY_AMPERE: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_EVE_ENERGY_AMPERE: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.EVE_ENERGY_AMPERE, key=CharacteristicsTypes.VENDOR_EVE_ENERGY_AMPERE,
name="Amps", name="Amps",
device_class=SensorDeviceClass.CURRENT, device_class=SensorDeviceClass.CURRENT,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
), ),
CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY, key=CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY,
name="Power", name="Power",
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=POWER_WATT, native_unit_of_measurement=POWER_WATT,
), ),
CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY_2: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY_2: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY_2, key=CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY_2,
name="Power", name="Power",
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=POWER_WATT, native_unit_of_measurement=POWER_WATT,
), ),
CharacteristicsTypes.Vendor.EVE_DEGREE_AIR_PRESSURE: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_EVE_DEGREE_AIR_PRESSURE: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.EVE_DEGREE_AIR_PRESSURE, key=CharacteristicsTypes.VENDOR_EVE_DEGREE_AIR_PRESSURE,
name="Air Pressure", name="Air Pressure",
device_class=SensorDeviceClass.PRESSURE, device_class=SensorDeviceClass.PRESSURE,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=PRESSURE_HPA, native_unit_of_measurement=PRESSURE_HPA,
), ),
CharacteristicsTypes.Vendor.VOCOLINC_OUTLET_ENERGY: HomeKitSensorEntityDescription( CharacteristicsTypes.VENDOR_VOCOLINC_OUTLET_ENERGY: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.Vendor.VOCOLINC_OUTLET_ENERGY, key=CharacteristicsTypes.VENDOR_VOCOLINC_OUTLET_ENERGY,
name="Power", name="Power",
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
@ -134,10 +134,7 @@ SIMPLE_SENSOR: dict[str, HomeKitSensorEntityDescription] = {
native_unit_of_measurement=TEMP_CELSIUS, native_unit_of_measurement=TEMP_CELSIUS,
# This sensor is only for temperature characteristics that are not part # This sensor is only for temperature characteristics that are not part
# of a temperature sensor service. # of a temperature sensor service.
probe=( probe=(lambda char: char.service.type != ServicesTypes.TEMPERATURE_SENSOR),
lambda char: char.service.type
!= ServicesTypes.get_uuid(ServicesTypes.TEMPERATURE_SENSOR)
),
), ),
CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT: HomeKitSensorEntityDescription( CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT, key=CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT,
@ -147,10 +144,7 @@ SIMPLE_SENSOR: dict[str, HomeKitSensorEntityDescription] = {
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
# This sensor is only for humidity characteristics that are not part # This sensor is only for humidity characteristics that are not part
# of a humidity sensor service. # of a humidity sensor service.
probe=( probe=(lambda char: char.service.type != ServicesTypes.HUMIDITY_SENSOR),
lambda char: char.service.type
!= ServicesTypes.get_uuid(ServicesTypes.HUMIDITY_SENSOR)
),
), ),
CharacteristicsTypes.AIR_QUALITY: HomeKitSensorEntityDescription( CharacteristicsTypes.AIR_QUALITY: HomeKitSensorEntityDescription(
key=CharacteristicsTypes.AIR_QUALITY, key=CharacteristicsTypes.AIR_QUALITY,
@ -202,15 +196,6 @@ SIMPLE_SENSOR: dict[str, HomeKitSensorEntityDescription] = {
), ),
} }
# For legacy reasons, "built-in" characteristic types are in their short form
# And vendor types don't have a short form
# This means long and short forms get mixed up in this dict, and comparisons
# don't work!
# We call get_uuid on *every* type to normalise them to the long form
# Eventually aiohomekit will use the long form exclusively amd this can be removed.
for k, v in list(SIMPLE_SENSOR.items()):
SIMPLE_SENSOR[CharacteristicsTypes.get_uuid(k)] = SIMPLE_SENSOR.pop(k)
class HomeKitHumiditySensor(HomeKitEntity, SensorEntity): class HomeKitHumiditySensor(HomeKitEntity, SensorEntity):
"""Representation of a Homekit humidity sensor.""" """Representation of a Homekit humidity sensor."""
@ -415,7 +400,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if not (entity_class := ENTITY_TYPES.get(service.short_type)): if not (entity_class := ENTITY_TYPES.get(service.type)):
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([entity_class(conn, info)], True) async_add_entities([entity_class(conn, info)], True)

View File

@ -35,14 +35,14 @@ class DeclarativeSwitchEntityDescription(SwitchEntityDescription):
SWITCH_ENTITIES: dict[str, DeclarativeSwitchEntityDescription] = { SWITCH_ENTITIES: dict[str, DeclarativeSwitchEntityDescription] = {
CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE: DeclarativeSwitchEntityDescription( CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE: DeclarativeSwitchEntityDescription(
key=CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE, key=CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE,
name="Pairing Mode", name="Pairing Mode",
icon="mdi:lock-open", icon="mdi:lock-open",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
), ),
CharacteristicsTypes.Vendor.AQARA_E1_PAIRING_MODE: DeclarativeSwitchEntityDescription( CharacteristicsTypes.VENDOR_AQARA_E1_PAIRING_MODE: DeclarativeSwitchEntityDescription(
key=CharacteristicsTypes.Vendor.AQARA_E1_PAIRING_MODE, key=CharacteristicsTypes.VENDOR_AQARA_E1_PAIRING_MODE,
name="Pairing Mode", name="Pairing Mode",
icon="mdi:lock-open", icon="mdi:lock-open",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
@ -189,7 +189,7 @@ async def async_setup_entry(
@callback @callback
def async_add_service(service): def async_add_service(service):
if not (entity_class := ENTITY_TYPES.get(service.short_type)): if not (entity_class := ENTITY_TYPES.get(service.type)):
return False return False
info = {"aid": service.accessory.aid, "iid": service.iid} info = {"aid": service.accessory.aid, "iid": service.iid}
async_add_entities([entity_class(conn, info)], True) async_add_entities([entity_class(conn, info)], True)

View File

@ -184,7 +184,7 @@ aioguardian==2021.11.0
aioharmony==0.2.9 aioharmony==0.2.9
# homeassistant.components.homekit_controller # homeassistant.components.homekit_controller
aiohomekit==0.6.11 aiohomekit==0.7.0
# homeassistant.components.emulated_hue # homeassistant.components.emulated_hue
# homeassistant.components.http # homeassistant.components.http

View File

@ -134,7 +134,7 @@ aioguardian==2021.11.0
aioharmony==0.2.9 aioharmony==0.2.9
# homeassistant.components.homekit_controller # homeassistant.components.homekit_controller
aiohomekit==0.6.11 aiohomekit==0.7.0
# homeassistant.components.emulated_hue # homeassistant.components.emulated_hue
# homeassistant.components.http # homeassistant.components.http

View File

@ -10,7 +10,6 @@ from typing import Any, Final
from unittest import mock from unittest import mock
from aiohomekit.model import Accessories, Accessory from aiohomekit.model import Accessories, Accessory
from aiohomekit.model.services import ServicesTypes
from aiohomekit.testing import FakeController, FakePairing from aiohomekit.testing import FakeController, FakePairing
from homeassistant.components import zeroconf from homeassistant.components import zeroconf
@ -261,7 +260,7 @@ async def setup_test_component(hass, setup_accessory, capitalize=False, suffix=N
domain = None domain = None
for service in accessory.services: for service in accessory.services:
service_name = ServicesTypes.get_short_uuid(service.type) service_name = service.type
if service_name in HOMEKIT_ACCESSORY_DISPATCH: if service_name in HOMEKIT_ACCESSORY_DISPATCH:
domain = HOMEKIT_ACCESSORY_DISPATCH[service_name] domain = HOMEKIT_ACCESSORY_DISPATCH[service_name]
break break

View File

@ -9,7 +9,7 @@ def create_switch_with_setup_button(accessory):
"""Define setup button characteristics.""" """Define setup button characteristics."""
service = accessory.add_service(ServicesTypes.OUTLET) service = accessory.add_service(ServicesTypes.OUTLET)
setup = service.add_char(CharacteristicsTypes.Vendor.HAA_SETUP) setup = service.add_char(CharacteristicsTypes.VENDOR_HAA_SETUP)
setup.value = "" setup.value = ""
setup.format = "string" setup.format = "string"
@ -24,7 +24,7 @@ def create_switch_with_ecobee_clear_hold_button(accessory):
"""Define setup button characteristics.""" """Define setup button characteristics."""
service = accessory.add_service(ServicesTypes.OUTLET) service = accessory.add_service(ServicesTypes.OUTLET)
setup = service.add_char(CharacteristicsTypes.Vendor.ECOBEE_CLEAR_HOLD) setup = service.add_char(CharacteristicsTypes.VENDOR_ECOBEE_CLEAR_HOLD)
setup.value = "" setup.value = ""
setup.format = "string" setup.format = "string"
@ -57,7 +57,7 @@ async def test_press_button(hass):
button.async_assert_service_values( button.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{ {
CharacteristicsTypes.Vendor.HAA_SETUP: "#HAA@trcmd", CharacteristicsTypes.VENDOR_HAA_SETUP: "#HAA@trcmd",
}, },
) )
@ -86,6 +86,6 @@ async def test_ecobee_clear_hold_press_button(hass):
clear_hold.async_assert_service_values( clear_hold.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{ {
CharacteristicsTypes.Vendor.ECOBEE_CLEAR_HOLD: True, CharacteristicsTypes.VENDOR_ECOBEE_CLEAR_HOLD: True,
}, },
) )

View File

@ -151,7 +151,7 @@ async def test_config_entry(hass: HomeAssistant, hass_client: ClientSession, utc
}, },
{ {
"iid": 13, "iid": 13,
"type": "4aaaf940-0dec-11e5-b939-0800200c9a66", "type": "4AAAF940-0DEC-11E5-B939-0800200C9A66",
"characteristics": [ "characteristics": [
{ {
"type": "4AAAF942-0DEC-11E5-B939-0800200C9A66", "type": "4AAAF942-0DEC-11E5-B939-0800200C9A66",
@ -422,7 +422,7 @@ async def test_device(hass: HomeAssistant, hass_client: ClientSession, utcnow):
}, },
{ {
"iid": 13, "iid": 13,
"type": "4aaaf940-0dec-11e5-b939-0800200c9a66", "type": "4AAAF940-0DEC-11E5-B939-0800200C9A66",
"characteristics": [ "characteristics": [
{ {
"type": "4AAAF942-0DEC-11E5-B939-0800200C9A66", "type": "4AAAF942-0DEC-11E5-B939-0800200C9A66",

View File

@ -10,7 +10,7 @@ def create_switch_with_spray_level(accessory):
service = accessory.add_service(ServicesTypes.OUTLET) service = accessory.add_service(ServicesTypes.OUTLET)
spray_level = service.add_char( spray_level = service.add_char(
CharacteristicsTypes.Vendor.VOCOLINC_HUMIDIFIER_SPRAY_LEVEL CharacteristicsTypes.VENDOR_VOCOLINC_HUMIDIFIER_SPRAY_LEVEL
) )
spray_level.perms.append("ev") spray_level.perms.append("ev")
@ -31,7 +31,7 @@ def create_switch_with_ecobee_fan_mode(accessory):
service = accessory.add_service(ServicesTypes.OUTLET) service = accessory.add_service(ServicesTypes.OUTLET)
ecobee_fan_mode = service.add_char( ecobee_fan_mode = service.add_char(
CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED
) )
ecobee_fan_mode.value = 0 ecobee_fan_mode.value = 0
@ -67,7 +67,7 @@ async def test_read_number(hass, utcnow):
state = await spray_level.async_update( state = await spray_level.async_update(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: 5}, {CharacteristicsTypes.VENDOR_VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: 5},
) )
assert state.state == "5" assert state.state == "5"
@ -93,7 +93,7 @@ async def test_write_number(hass, utcnow):
) )
spray_level.async_assert_service_values( spray_level.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: 5}, {CharacteristicsTypes.VENDOR_VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: 5},
) )
await hass.services.async_call( await hass.services.async_call(
@ -104,7 +104,7 @@ async def test_write_number(hass, utcnow):
) )
spray_level.async_assert_service_values( spray_level.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: 3}, {CharacteristicsTypes.VENDOR_VOCOLINC_HUMIDIFIER_SPRAY_LEVEL: 3},
) )
@ -129,7 +129,7 @@ async def test_write_ecobee_fan_mode_number(hass, utcnow):
) )
fan_mode.async_assert_service_values( fan_mode.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED: 1}, {CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED: 1},
) )
await hass.services.async_call( await hass.services.async_call(
@ -140,7 +140,7 @@ async def test_write_ecobee_fan_mode_number(hass, utcnow):
) )
fan_mode.async_assert_service_values( fan_mode.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED: 2}, {CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED: 2},
) )
await hass.services.async_call( await hass.services.async_call(
@ -151,7 +151,7 @@ async def test_write_ecobee_fan_mode_number(hass, utcnow):
) )
fan_mode.async_assert_service_values( fan_mode.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED: 99}, {CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED: 99},
) )
await hass.services.async_call( await hass.services.async_call(
@ -162,7 +162,7 @@ async def test_write_ecobee_fan_mode_number(hass, utcnow):
) )
fan_mode.async_assert_service_values( fan_mode.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED: 100}, {CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED: 100},
) )
await hass.services.async_call( await hass.services.async_call(
@ -173,5 +173,5 @@ async def test_write_ecobee_fan_mode_number(hass, utcnow):
) )
fan_mode.async_assert_service_values( fan_mode.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.ECOBEE_FAN_WRITE_SPEED: 0}, {CharacteristicsTypes.VENDOR_ECOBEE_FAN_WRITE_SPEED: 0},
) )

View File

@ -10,11 +10,11 @@ def create_service_with_ecobee_mode(accessory: Accessory):
"""Define a thermostat with ecobee mode characteristics.""" """Define a thermostat with ecobee mode characteristics."""
service = accessory.add_service(ServicesTypes.THERMOSTAT, add_required=True) service = accessory.add_service(ServicesTypes.THERMOSTAT, add_required=True)
current_mode = service.add_char(CharacteristicsTypes.Vendor.ECOBEE_CURRENT_MODE) current_mode = service.add_char(CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE)
current_mode.value = 0 current_mode.value = 0
current_mode.perms.append("ev") current_mode.perms.append("ev")
service.add_char(CharacteristicsTypes.Vendor.ECOBEE_SET_HOLD_SCHEDULE) service.add_char(CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE)
return service return service
@ -35,7 +35,7 @@ async def test_read_current_mode(hass, utcnow):
state = await ecobee_mode.async_update( state = await ecobee_mode.async_update(
ServicesTypes.THERMOSTAT, ServicesTypes.THERMOSTAT,
{ {
CharacteristicsTypes.Vendor.ECOBEE_CURRENT_MODE: 0, CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE: 0,
}, },
) )
assert state.state == "home" assert state.state == "home"
@ -43,7 +43,7 @@ async def test_read_current_mode(hass, utcnow):
state = await ecobee_mode.async_update( state = await ecobee_mode.async_update(
ServicesTypes.THERMOSTAT, ServicesTypes.THERMOSTAT,
{ {
CharacteristicsTypes.Vendor.ECOBEE_CURRENT_MODE: 1, CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE: 1,
}, },
) )
assert state.state == "sleep" assert state.state == "sleep"
@ -51,7 +51,7 @@ async def test_read_current_mode(hass, utcnow):
state = await ecobee_mode.async_update( state = await ecobee_mode.async_update(
ServicesTypes.THERMOSTAT, ServicesTypes.THERMOSTAT,
{ {
CharacteristicsTypes.Vendor.ECOBEE_CURRENT_MODE: 2, CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE: 2,
}, },
) )
assert state.state == "away" assert state.state == "away"
@ -79,7 +79,7 @@ async def test_write_current_mode(hass, utcnow):
) )
current_mode.async_assert_service_values( current_mode.async_assert_service_values(
ServicesTypes.THERMOSTAT, ServicesTypes.THERMOSTAT,
{CharacteristicsTypes.Vendor.ECOBEE_SET_HOLD_SCHEDULE: 0}, {CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: 0},
) )
await hass.services.async_call( await hass.services.async_call(
@ -90,7 +90,7 @@ async def test_write_current_mode(hass, utcnow):
) )
current_mode.async_assert_service_values( current_mode.async_assert_service_values(
ServicesTypes.THERMOSTAT, ServicesTypes.THERMOSTAT,
{CharacteristicsTypes.Vendor.ECOBEE_SET_HOLD_SCHEDULE: 1}, {CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: 1},
) )
await hass.services.async_call( await hass.services.async_call(
@ -101,5 +101,5 @@ async def test_write_current_mode(hass, utcnow):
) )
current_mode.async_assert_service_values( current_mode.async_assert_service_values(
ServicesTypes.THERMOSTAT, ServicesTypes.THERMOSTAT,
{CharacteristicsTypes.Vendor.ECOBEE_SET_HOLD_SCHEDULE: 2}, {CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: 2},
) )

View File

@ -247,7 +247,7 @@ def create_switch_with_sensor(accessory):
service = accessory.add_service(ServicesTypes.OUTLET) service = accessory.add_service(ServicesTypes.OUTLET)
realtime_energy = service.add_char( realtime_energy = service.add_char(
CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY
) )
realtime_energy.value = 0 realtime_energy.value = 0
realtime_energy.format = "float" realtime_energy.format = "float"
@ -275,7 +275,7 @@ async def test_switch_with_sensor(hass, utcnow):
state = await energy_helper.async_update( state = await energy_helper.async_update(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{ {
CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY: 1, CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY: 1,
}, },
) )
assert state.state == "1" assert state.state == "1"
@ -283,7 +283,7 @@ async def test_switch_with_sensor(hass, utcnow):
state = await energy_helper.async_update( state = await energy_helper.async_update(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{ {
CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY: 50, CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY: 50,
}, },
) )
assert state.state == "50" assert state.state == "50"
@ -295,7 +295,7 @@ async def test_sensor_unavailable(hass, utcnow):
# Find the energy sensor and mark it as offline # Find the energy sensor and mark it as offline
outlet = helper.accessory.services.first(service_type=ServicesTypes.OUTLET) outlet = helper.accessory.services.first(service_type=ServicesTypes.OUTLET)
realtime_energy = outlet[CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY] realtime_energy = outlet[CharacteristicsTypes.VENDOR_KOOGEEK_REALTIME_ENERGY]
realtime_energy.status = HapStatusCode.UNABLE_TO_COMMUNICATE realtime_energy.status = HapStatusCode.UNABLE_TO_COMMUNICATE
# Helper will be for the primary entity, which is the outlet. Make a helper for the sensor. # Helper will be for the primary entity, which is the outlet. Make a helper for the sensor.

View File

@ -42,7 +42,7 @@ def create_char_switch_service(accessory):
"""Define swtch characteristics.""" """Define swtch characteristics."""
service = accessory.add_service(ServicesTypes.OUTLET) service = accessory.add_service(ServicesTypes.OUTLET)
on_char = service.add_char(CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE) on_char = service.add_char(CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE)
on_char.perms.append("ev") on_char.perms.append("ev")
on_char.value = False on_char.value = False
@ -178,7 +178,7 @@ async def test_char_switch_change_state(hass, utcnow):
helper.async_assert_service_values( helper.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{ {
CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE: True, CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE: True,
}, },
) )
@ -191,7 +191,7 @@ async def test_char_switch_change_state(hass, utcnow):
helper.async_assert_service_values( helper.async_assert_service_values(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{ {
CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE: False, CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE: False,
}, },
) )
@ -205,13 +205,13 @@ async def test_char_switch_read_state(hass, utcnow):
# Simulate that someone switched on the device in the real world not via HA # Simulate that someone switched on the device in the real world not via HA
switch_1 = await helper.async_update( switch_1 = await helper.async_update(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE: True}, {CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE: True},
) )
assert switch_1.state == "on" assert switch_1.state == "on"
# Simulate that device switched off in the real world not via HA # Simulate that device switched off in the real world not via HA
switch_1 = await helper.async_update( switch_1 = await helper.async_update(
ServicesTypes.OUTLET, ServicesTypes.OUTLET,
{CharacteristicsTypes.Vendor.AQARA_PAIRING_MODE: False}, {CharacteristicsTypes.VENDOR_AQARA_PAIRING_MODE: False},
) )
assert switch_1.state == "off" assert switch_1.state == "off"