From 9a98dcf432ae55d000c58729760a195d010b1943 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Fri, 12 Mar 2021 20:03:47 +0100 Subject: [PATCH] Add HomeKit support for new CO / CO2 device class (#47737) --- homeassistant/components/demo/sensor.py | 19 +++++++++++++++++++ .../components/homekit/accessories.py | 6 +++--- homeassistant/components/homekit/const.py | 2 -- .../components/homekit/type_sensors.py | 4 +++- .../homekit/test_get_accessories.py | 16 ++++++++++++++-- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/demo/sensor.py b/homeassistant/components/demo/sensor.py index 49930a35377..9c005d2d7f5 100644 --- a/homeassistant/components/demo/sensor.py +++ b/homeassistant/components/demo/sensor.py @@ -1,6 +1,9 @@ """Demo platform that has a couple of fake sensors.""" from homeassistant.const import ( ATTR_BATTERY_LEVEL, + CONCENTRATION_PARTS_PER_MILLION, + DEVICE_CLASS_CO, + DEVICE_CLASS_CO2, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_TEMPERATURE, PERCENTAGE, @@ -31,6 +34,22 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= PERCENTAGE, None, ), + DemoSensor( + "sensor_3", + "Carbon monoxide", + 54, + DEVICE_CLASS_CO, + CONCENTRATION_PARTS_PER_MILLION, + None, + ), + DemoSensor( + "sensor_4", + "Carbon dioxide", + 54, + DEVICE_CLASS_CO2, + CONCENTRATION_PARTS_PER_MILLION, + 14, + ), ] ) diff --git a/homeassistant/components/homekit/accessories.py b/homeassistant/components/homekit/accessories.py index 7e68daf4b62..b6ff11aa26d 100644 --- a/homeassistant/components/homekit/accessories.py +++ b/homeassistant/components/homekit/accessories.py @@ -22,6 +22,8 @@ from homeassistant.const import ( ATTR_UNIT_OF_MEASUREMENT, CONF_NAME, CONF_TYPE, + DEVICE_CLASS_CO, + DEVICE_CLASS_CO2, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_TEMPERATURE, @@ -54,8 +56,6 @@ from .const import ( CONF_LINKED_BATTERY_SENSOR, CONF_LOW_BATTERY_THRESHOLD, DEFAULT_LOW_BATTERY_THRESHOLD, - DEVICE_CLASS_CO, - DEVICE_CLASS_CO2, DEVICE_CLASS_PM25, EVENT_HOMEKIT_CHANGED, HK_CHARGING, @@ -167,7 +167,7 @@ def get_accessory(hass, driver, state, aid, config): a_type = "AirQualitySensor" elif device_class == DEVICE_CLASS_CO: a_type = "CarbonMonoxideSensor" - elif device_class == DEVICE_CLASS_CO2 or DEVICE_CLASS_CO2 in state.entity_id: + elif device_class == DEVICE_CLASS_CO2 or "co2" in state.entity_id: a_type = "CarbonDioxideSensor" elif device_class == DEVICE_CLASS_ILLUMINANCE or unit in ("lm", LIGHT_LUX): a_type = "LightSensor" diff --git a/homeassistant/components/homekit/const.py b/homeassistant/components/homekit/const.py index ff45306b351..abfc6a2aa38 100644 --- a/homeassistant/components/homekit/const.py +++ b/homeassistant/components/homekit/const.py @@ -237,8 +237,6 @@ PROP_CELSIUS = {"minValue": -273, "maxValue": 999} PROP_VALID_VALUES = "ValidValues" # #### Device Classes #### -DEVICE_CLASS_CO = "co" -DEVICE_CLASS_CO2 = "co2" DEVICE_CLASS_DOOR = "door" DEVICE_CLASS_GARAGE_DOOR = "garage_door" DEVICE_CLASS_GAS = "gas" diff --git a/homeassistant/components/homekit/type_sensors.py b/homeassistant/components/homekit/type_sensors.py index 28c7ea26009..b6cc4b05125 100644 --- a/homeassistant/components/homekit/type_sensors.py +++ b/homeassistant/components/homekit/type_sensors.py @@ -6,6 +6,8 @@ from pyhap.const import CATEGORY_SENSOR from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_UNIT_OF_MEASUREMENT, + DEVICE_CLASS_CO, + DEVICE_CLASS_CO2, STATE_HOME, STATE_ON, TEMP_CELSIUS, @@ -30,7 +32,6 @@ from .const import ( CHAR_MOTION_DETECTED, CHAR_OCCUPANCY_DETECTED, CHAR_SMOKE_DETECTED, - DEVICE_CLASS_CO2, DEVICE_CLASS_DOOR, DEVICE_CLASS_GARAGE_DOOR, DEVICE_CLASS_GAS, @@ -60,6 +61,7 @@ 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), diff --git a/tests/components/homekit/test_get_accessories.py b/tests/components/homekit/test_get_accessories.py index 70d59408011..1c68ae7d001 100644 --- a/tests/components/homekit/test_get_accessories.py +++ b/tests/components/homekit/test_get_accessories.py @@ -26,6 +26,8 @@ from homeassistant.const import ( ATTR_UNIT_OF_MEASUREMENT, CONF_NAME, CONF_TYPE, + DEVICE_CLASS_CO, + DEVICE_CLASS_CO2, LIGHT_LUX, PERCENTAGE, TEMP_CELSIUS, @@ -186,9 +188,19 @@ def test_type_media_player(type_name, entity_id, state, attrs, config): ("BinarySensor", "person.someone", "home", {}), ("AirQualitySensor", "sensor.air_quality_pm25", "40", {}), ("AirQualitySensor", "sensor.air_quality", "40", {ATTR_DEVICE_CLASS: "pm25"}), - ("CarbonMonoxideSensor", "sensor.airmeter", "2", {ATTR_DEVICE_CLASS: "co"}), + ( + "CarbonMonoxideSensor", + "sensor.co", + "2", + {ATTR_DEVICE_CLASS: DEVICE_CLASS_CO}, + ), ("CarbonDioxideSensor", "sensor.airmeter_co2", "500", {}), - ("CarbonDioxideSensor", "sensor.airmeter", "500", {ATTR_DEVICE_CLASS: "co2"}), + ( + "CarbonDioxideSensor", + "sensor.co2", + "500", + {ATTR_DEVICE_CLASS: DEVICE_CLASS_CO2}, + ), ( "HumiditySensor", "sensor.humidity",