diff --git a/homeassistant/components/blebox/__init__.py b/homeassistant/components/blebox/__init__.py index 4314412a13d..1a7c8104652 100644 --- a/homeassistant/components/blebox/__init__.py +++ b/homeassistant/components/blebox/__init__.py @@ -19,6 +19,7 @@ from .const import DEFAULT_SETUP_TIMEOUT, DOMAIN, PRODUCT _LOGGER = logging.getLogger(__name__) PLATFORMS = [ + Platform.BINARY_SENSOR, Platform.BUTTON, Platform.CLIMATE, Platform.COVER, diff --git a/homeassistant/components/blebox/binary_sensor.py b/homeassistant/components/blebox/binary_sensor.py new file mode 100644 index 00000000000..7eb6fd1e5a2 --- /dev/null +++ b/homeassistant/components/blebox/binary_sensor.py @@ -0,0 +1,55 @@ +"""BleBox binary sensor entities.""" + +from blebox_uniapi.binary_sensor import BinarySensor as BinarySensorFeature +from blebox_uniapi.box import Box + +from homeassistant.components.binary_sensor import ( + BinarySensorDeviceClass, + BinarySensorEntity, + BinarySensorEntityDescription, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from . import DOMAIN, PRODUCT, BleBoxEntity + +BINARY_SENSOR_TYPES = ( + BinarySensorEntityDescription( + key="moisture", + device_class=BinarySensorDeviceClass.MOISTURE, + ), +) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up a BleBox entry.""" + + product: Box = hass.data[DOMAIN][config_entry.entry_id][PRODUCT] + entities = [ + BleBoxBinarySensorEntity(feature, description) + for feature in product.features.get("binary_sensors", []) + for description in BINARY_SENSOR_TYPES + if description.key == feature.device_class + ] + async_add_entities(entities, True) + + +class BleBoxBinarySensorEntity(BleBoxEntity[BinarySensorFeature], BinarySensorEntity): + """Representation of a BleBox binary sensor feature.""" + + def __init__( + self, feature: BinarySensorFeature, description: BinarySensorEntityDescription + ) -> None: + """Initialize a BleBox binary sensor feature.""" + super().__init__(feature) + self.entity_description = description + + @property + def is_on(self) -> bool: + """Return the state.""" + return self._feature.state diff --git a/tests/components/blebox/test_binary_sensor.py b/tests/components/blebox/test_binary_sensor.py new file mode 100644 index 00000000000..36258198d91 --- /dev/null +++ b/tests/components/blebox/test_binary_sensor.py @@ -0,0 +1,45 @@ +"""Blebox binary_sensor entities test.""" +from unittest.mock import PropertyMock + +import blebox_uniapi +import pytest + +from homeassistant.components.binary_sensor import BinarySensorDeviceClass +from homeassistant.const import ATTR_DEVICE_CLASS, STATE_ON +from homeassistant.helpers import device_registry as dr + +from .conftest import async_setup_entity, mock_feature + + +@pytest.fixture(name="rainsensor") +def airsensor_fixture(): + """Return a default air quality fixture.""" + feature = mock_feature( + "binary_sensors", + blebox_uniapi.binary_sensor.Rain, + unique_id="BleBox-windRainSensor-ea68e74f4f49-0.rain", + full_name="windRainSensor-0.rain", + device_class="moisture", + ) + product = feature.product + type(product).name = PropertyMock(return_value="My rain sensor") + type(product).model = PropertyMock(return_value="rainSensor") + return (feature, "binary_sensor.windrainsensor_0_rain") + + +async def test_init(rainsensor, hass, config): + """Test binary_sensor initialisation.""" + _, entity_id = rainsensor + entry = await async_setup_entity(hass, config, entity_id) + assert entry.unique_id == "BleBox-windRainSensor-ea68e74f4f49-0.rain" + + state = hass.states.get(entity_id) + assert state.name == "windRainSensor-0.rain" + + assert state.attributes[ATTR_DEVICE_CLASS] == BinarySensorDeviceClass.MOISTURE + assert state.state == STATE_ON + + device_registry = dr.async_get(hass) + device = device_registry.async_get(entry.device_id) + + assert device.name == "My rain sensor"