diff --git a/.coveragerc b/.coveragerc index 66f7185ee5534b..5b046a7249d011 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1020,6 +1020,7 @@ omit = homeassistant/components/renson/coordinator.py homeassistant/components/renson/entity.py homeassistant/components/renson/sensor.py + homeassistant/components/renson/button.py homeassistant/components/renson/fan.py homeassistant/components/renson/binary_sensor.py homeassistant/components/renson/number.py diff --git a/homeassistant/components/renson/__init__.py b/homeassistant/components/renson/__init__.py index 231e63bfc25491..2a9c13be543636 100644 --- a/homeassistant/components/renson/__init__.py +++ b/homeassistant/components/renson/__init__.py @@ -15,6 +15,7 @@ PLATFORMS = [ Platform.BINARY_SENSOR, + Platform.BUTTON, Platform.FAN, Platform.NUMBER, Platform.SENSOR, diff --git a/homeassistant/components/renson/button.py b/homeassistant/components/renson/button.py new file mode 100644 index 00000000000000..53d995ba792864 --- /dev/null +++ b/homeassistant/components/renson/button.py @@ -0,0 +1,90 @@ +"""Renson ventilation unit buttons.""" +from __future__ import annotations + +from dataclasses import dataclass + +from _collections_abc import Callable +from renson_endura_delta.renson import RensonVentilation + +from homeassistant.components.button import ( + ButtonDeviceClass, + ButtonEntity, + ButtonEntityDescription, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import EntityCategory +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from . import RensonCoordinator, RensonData +from .const import DOMAIN +from .entity import RensonEntity + + +@dataclass +class RensonButtonEntityDescriptionMixin: + """Action function called on press.""" + + action_fn: Callable[[RensonVentilation], None] + + +@dataclass +class RensonButtonEntityDescription( + ButtonEntityDescription, RensonButtonEntityDescriptionMixin +): + """Class describing Renson button entity.""" + + +ENTITY_DESCRIPTIONS: tuple[RensonButtonEntityDescription, ...] = ( + RensonButtonEntityDescription( + key="sync_time", + entity_category=EntityCategory.CONFIG, + translation_key="sync_time", + action_fn=lambda api: api.sync_time(), + ), + RensonButtonEntityDescription( + key="restart", + device_class=ButtonDeviceClass.RESTART, + entity_category=EntityCategory.CONFIG, + action_fn=lambda api: api.restart_device(), + ), +) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up the Renson button platform.""" + + data: RensonData = hass.data[DOMAIN][config_entry.entry_id] + + entities = [ + RensonButton(description, data.api, data.coordinator) + for description in ENTITY_DESCRIPTIONS + ] + + async_add_entities(entities) + + +class RensonButton(RensonEntity, ButtonEntity): + """Representation of a Renson actions.""" + + _attr_has_entity_name = True + entity_description: RensonButtonEntityDescription + + def __init__( + self, + description: RensonButtonEntityDescription, + api: RensonVentilation, + coordinator: RensonCoordinator, + ) -> None: + """Initialize class.""" + super().__init__(description.key, api, coordinator) + + self.entity_description = description + + def press(self) -> None: + """Triggers the action.""" + self.entity_description.action_fn(self.api) diff --git a/homeassistant/components/renson/manifest.json b/homeassistant/components/renson/manifest.json index 5ff219cc26c880..1a7f367a9464db 100644 --- a/homeassistant/components/renson/manifest.json +++ b/homeassistant/components/renson/manifest.json @@ -5,5 +5,5 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/renson", "iot_class": "local_polling", - "requirements": ["renson-endura-delta==1.5.0"] + "requirements": ["renson-endura-delta==1.6.0"] } diff --git a/homeassistant/components/renson/strings.json b/homeassistant/components/renson/strings.json index 1a4829c2da9dbe..7099cdf2c4587e 100644 --- a/homeassistant/components/renson/strings.json +++ b/homeassistant/components/renson/strings.json @@ -13,6 +13,11 @@ } }, "entity": { + "button": { + "sync_time": { + "name": "Sync time with device" + } + }, "number": { "filter_change": { "name": "Filter clean/replacement" diff --git a/requirements_all.txt b/requirements_all.txt index 1367844c41831b..545e05a7e8431f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2301,7 +2301,7 @@ regenmaschine==2023.06.0 renault-api==0.2.0 # homeassistant.components.renson -renson-endura-delta==1.5.0 +renson-endura-delta==1.6.0 # homeassistant.components.reolink reolink-aio==0.7.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index cf76db0b1b6e51..e04213f0c8e528 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1703,7 +1703,7 @@ regenmaschine==2023.06.0 renault-api==0.2.0 # homeassistant.components.renson -renson-endura-delta==1.5.0 +renson-endura-delta==1.6.0 # homeassistant.components.reolink reolink-aio==0.7.10