mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Add water level
and water tank detached
sensors for Xiaomi Miio humidifiers (#54625)
* Add water level and water tank detached sensors * Use elif * Use DEVICE_CLASS_CONNECTIVITY for water tank sensor * Improve docstring * Change the water tank sensor icon * Fix typo
This commit is contained in:
parent
416668c289
commit
8c4a2dc6d2
@ -1,7 +1,12 @@
|
|||||||
"""Support for Xiaomi Miio binary sensors."""
|
"""Support for Xiaomi Miio binary sensors."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
|
DEVICE_CLASS_CONNECTIVITY,
|
||||||
BinarySensorEntity,
|
BinarySensorEntity,
|
||||||
BinarySensorEntityDescription,
|
BinarySensorEntityDescription,
|
||||||
)
|
)
|
||||||
@ -13,6 +18,8 @@ from .const import (
|
|||||||
DOMAIN,
|
DOMAIN,
|
||||||
KEY_COORDINATOR,
|
KEY_COORDINATOR,
|
||||||
KEY_DEVICE,
|
KEY_DEVICE,
|
||||||
|
MODELS_HUMIDIFIER_MIIO,
|
||||||
|
MODELS_HUMIDIFIER_MIOT,
|
||||||
MODELS_HUMIDIFIER_MJJSQ,
|
MODELS_HUMIDIFIER_MJJSQ,
|
||||||
)
|
)
|
||||||
from .device import XiaomiCoordinatedMiioEntity
|
from .device import XiaomiCoordinatedMiioEntity
|
||||||
@ -20,19 +27,31 @@ from .device import XiaomiCoordinatedMiioEntity
|
|||||||
ATTR_NO_WATER = "no_water"
|
ATTR_NO_WATER = "no_water"
|
||||||
ATTR_WATER_TANK_DETACHED = "water_tank_detached"
|
ATTR_WATER_TANK_DETACHED = "water_tank_detached"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class XiaomiMiioBinarySensorDescription(BinarySensorEntityDescription):
|
||||||
|
"""A class that describes binary sensor entities."""
|
||||||
|
|
||||||
|
value: Callable | None = None
|
||||||
|
|
||||||
|
|
||||||
BINARY_SENSOR_TYPES = (
|
BINARY_SENSOR_TYPES = (
|
||||||
BinarySensorEntityDescription(
|
XiaomiMiioBinarySensorDescription(
|
||||||
key=ATTR_NO_WATER,
|
key=ATTR_NO_WATER,
|
||||||
name="Water Tank Empty",
|
name="Water Tank Empty",
|
||||||
icon="mdi:water-off-outline",
|
icon="mdi:water-off-outline",
|
||||||
),
|
),
|
||||||
BinarySensorEntityDescription(
|
XiaomiMiioBinarySensorDescription(
|
||||||
key=ATTR_WATER_TANK_DETACHED,
|
key=ATTR_WATER_TANK_DETACHED,
|
||||||
name="Water Tank Detached",
|
name="Water Tank",
|
||||||
icon="mdi:flask-empty-off-outline",
|
icon="mdi:car-coolant-level",
|
||||||
|
device_class=DEVICE_CLASS_CONNECTIVITY,
|
||||||
|
value=lambda value: not value,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
HUMIDIFIER_MIIO_BINARY_SENSORS = (ATTR_WATER_TANK_DETACHED,)
|
||||||
|
HUMIDIFIER_MIOT_BINARY_SENSORS = (ATTR_WATER_TANK_DETACHED,)
|
||||||
HUMIDIFIER_MJJSQ_BINARY_SENSORS = (ATTR_NO_WATER, ATTR_WATER_TANK_DETACHED)
|
HUMIDIFIER_MJJSQ_BINARY_SENSORS = (ATTR_NO_WATER, ATTR_WATER_TANK_DETACHED)
|
||||||
|
|
||||||
|
|
||||||
@ -43,7 +62,11 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
|||||||
if config_entry.data[CONF_FLOW_TYPE] == CONF_DEVICE:
|
if config_entry.data[CONF_FLOW_TYPE] == CONF_DEVICE:
|
||||||
model = config_entry.data[CONF_MODEL]
|
model = config_entry.data[CONF_MODEL]
|
||||||
sensors = []
|
sensors = []
|
||||||
if model in MODELS_HUMIDIFIER_MJJSQ:
|
if model in MODELS_HUMIDIFIER_MIIO:
|
||||||
|
sensors = HUMIDIFIER_MIIO_BINARY_SENSORS
|
||||||
|
elif model in MODELS_HUMIDIFIER_MIOT:
|
||||||
|
sensors = HUMIDIFIER_MIOT_BINARY_SENSORS
|
||||||
|
elif model in MODELS_HUMIDIFIER_MJJSQ:
|
||||||
sensors = HUMIDIFIER_MJJSQ_BINARY_SENSORS
|
sensors = HUMIDIFIER_MJJSQ_BINARY_SENSORS
|
||||||
for description in BINARY_SENSOR_TYPES:
|
for description in BINARY_SENSOR_TYPES:
|
||||||
if description.key not in sensors:
|
if description.key not in sensors:
|
||||||
@ -74,9 +97,13 @@ class XiaomiGenericBinarySensor(XiaomiCoordinatedMiioEntity, BinarySensorEntity)
|
|||||||
@property
|
@property
|
||||||
def is_on(self):
|
def is_on(self):
|
||||||
"""Return true if the binary sensor is on."""
|
"""Return true if the binary sensor is on."""
|
||||||
return self._extract_value_from_attribute(
|
state = self._extract_value_from_attribute(
|
||||||
self.coordinator.data, self.entity_description.key
|
self.coordinator.data, self.entity_description.key
|
||||||
)
|
)
|
||||||
|
if self.entity_description.value is not None and state is not None:
|
||||||
|
return self.entity_description.value(state)
|
||||||
|
|
||||||
|
return state
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _extract_value_from_attribute(state, attribute):
|
def _extract_value_from_attribute(state, attribute):
|
||||||
|
@ -234,8 +234,13 @@ SENSOR_TYPES = {
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
HUMIDIFIER_MIIO_SENSORS = (ATTR_HUMIDITY, ATTR_TEMPERATURE)
|
HUMIDIFIER_MIIO_SENSORS = (ATTR_HUMIDITY, ATTR_TEMPERATURE, ATTR_WATER_LEVEL)
|
||||||
HUMIDIFIER_CA1_CB1_SENSORS = (ATTR_HUMIDITY, ATTR_TEMPERATURE, ATTR_MOTOR_SPEED)
|
HUMIDIFIER_CA1_CB1_SENSORS = (
|
||||||
|
ATTR_HUMIDITY,
|
||||||
|
ATTR_TEMPERATURE,
|
||||||
|
ATTR_MOTOR_SPEED,
|
||||||
|
ATTR_WATER_LEVEL,
|
||||||
|
)
|
||||||
HUMIDIFIER_MIOT_SENSORS = (
|
HUMIDIFIER_MIOT_SENSORS = (
|
||||||
ATTR_ACTUAL_SPEED,
|
ATTR_ACTUAL_SPEED,
|
||||||
ATTR_HUMIDITY,
|
ATTR_HUMIDITY,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user