Add leak sensor support to Homekit integration (#33171)

* Add leak sensor support to Homekit integration

* Add leak entries to binary_sensor/strings.json

* Revert changes from binary_sensor

* Fix

* Review fix
This commit is contained in:
Patryk 2020-03-24 21:49:01 +01:00 committed by GitHub
parent 0e2fa7700d
commit ad9f4db983
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import logging
from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.characteristics import CharacteristicsTypes
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
DEVICE_CLASS_MOISTURE,
DEVICE_CLASS_MOTION, DEVICE_CLASS_MOTION,
DEVICE_CLASS_OCCUPANCY, DEVICE_CLASS_OCCUPANCY,
DEVICE_CLASS_OPENING, DEVICE_CLASS_OPENING,
@ -89,11 +90,30 @@ class HomeKitOccupancySensor(HomeKitEntity, BinarySensorDevice):
return self.service.value(CharacteristicsTypes.OCCUPANCY_DETECTED) == 1 return self.service.value(CharacteristicsTypes.OCCUPANCY_DETECTED) == 1
class HomeKitLeakSensor(HomeKitEntity, BinarySensorDevice):
"""Representation of a Homekit leak sensor."""
def get_characteristic_types(self):
"""Define the homekit characteristics the entity is tracking."""
return [CharacteristicsTypes.LEAK_DETECTED]
@property
def device_class(self):
"""Define this binary_sensor as a leak sensor."""
return DEVICE_CLASS_MOISTURE
@property
def is_on(self):
"""Return true if a leak is detected from the binary sensor."""
return self.service.value(CharacteristicsTypes.LEAK_DETECTED) == 1
ENTITY_TYPES = { ENTITY_TYPES = {
"motion": HomeKitMotionSensor, "motion": HomeKitMotionSensor,
"contact": HomeKitContactSensor, "contact": HomeKitContactSensor,
"smoke": HomeKitSmokeSensor, "smoke": HomeKitSmokeSensor,
"occupancy": HomeKitOccupancySensor, "occupancy": HomeKitOccupancySensor,
"leak": HomeKitLeakSensor,
} }

View File

@ -27,6 +27,7 @@ HOMEKIT_ACCESSORY_DISPATCH = {
"temperature": "sensor", "temperature": "sensor",
"battery": "sensor", "battery": "sensor",
"smoke": "binary_sensor", "smoke": "binary_sensor",
"leak": "binary_sensor",
"fan": "fan", "fan": "fan",
"fanv2": "fan", "fanv2": "fan",
"air-quality": "air_quality", "air-quality": "air_quality",

View File

@ -3,6 +3,7 @@ from aiohomekit.model.characteristics import CharacteristicsTypes
from aiohomekit.model.services import ServicesTypes from aiohomekit.model.services import ServicesTypes
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
DEVICE_CLASS_MOISTURE,
DEVICE_CLASS_MOTION, DEVICE_CLASS_MOTION,
DEVICE_CLASS_OCCUPANCY, DEVICE_CLASS_OCCUPANCY,
DEVICE_CLASS_OPENING, DEVICE_CLASS_OPENING,
@ -15,6 +16,7 @@ MOTION_DETECTED = ("motion", "motion-detected")
CONTACT_STATE = ("contact", "contact-state") CONTACT_STATE = ("contact", "contact-state")
SMOKE_DETECTED = ("smoke", "smoke-detected") SMOKE_DETECTED = ("smoke", "smoke-detected")
OCCUPANCY_DETECTED = ("occupancy", "occupancy-detected") OCCUPANCY_DETECTED = ("occupancy", "occupancy-detected")
LEAK_DETECTED = ("leak", "leak-detected")
def create_motion_sensor_service(accessory): def create_motion_sensor_service(accessory):
@ -107,3 +109,26 @@ async def test_occupancy_sensor_read_state(hass, utcnow):
assert state.state == "on" assert state.state == "on"
assert state.attributes["device_class"] == DEVICE_CLASS_OCCUPANCY assert state.attributes["device_class"] == DEVICE_CLASS_OCCUPANCY
def create_leak_sensor_service(accessory):
"""Define leak characteristics."""
service = accessory.add_service(ServicesTypes.LEAK_SENSOR)
cur_state = service.add_char(CharacteristicsTypes.LEAK_DETECTED)
cur_state.value = 0
async def test_leak_sensor_read_state(hass, utcnow):
"""Test that we can read the state of a HomeKit leak sensor accessory."""
helper = await setup_test_component(hass, create_leak_sensor_service)
helper.characteristics[LEAK_DETECTED].value = 0
state = await helper.poll_and_get_state()
assert state.state == "off"
helper.characteristics[LEAK_DETECTED].value = 1
state = await helper.poll_and_get_state()
assert state.state == "on"
assert state.attributes["device_class"] == DEVICE_CLASS_MOISTURE