From a9bbe755be8887cf920ef4755498bde03cba36b3 Mon Sep 17 00:00:00 2001 From: bj00rn Date: Tue, 3 Dec 2024 21:37:33 +0100 Subject: [PATCH 1/2] feat: remove integration services BREAKING CHANGE: Remove integration services, use generic enity services in automations and scripts --- custom_components/saleryd_hrv/__init__.py | 135 +-------------- custom_components/saleryd_hrv/bridge.py | 48 ++++++ custom_components/saleryd_hrv/const.py | 12 +- custom_components/saleryd_hrv/coordinator.py | 13 +- custom_components/saleryd_hrv/data.py | 5 +- custom_components/saleryd_hrv/number.py | 2 +- custom_components/saleryd_hrv/select.py | 46 +++-- custom_components/saleryd_hrv/services.yaml | 168 ------------------- custom_components/saleryd_hrv/switch.py | 61 ++----- 9 files changed, 99 insertions(+), 391 deletions(-) create mode 100644 custom_components/saleryd_hrv/bridge.py delete mode 100644 custom_components/saleryd_hrv/services.yaml diff --git a/custom_components/saleryd_hrv/__init__.py b/custom_components/saleryd_hrv/__init__.py index 62311c9..b3d4c27 100644 --- a/custom_components/saleryd_hrv/__init__.py +++ b/custom_components/saleryd_hrv/__init__.py @@ -10,19 +10,16 @@ import async_timeout from homeassistant.config_entries import ConfigEntryState -from homeassistant.const import CONF_DEVICE, CONF_NAME -from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError -from homeassistant.helpers import device_registry as dr +from homeassistant.const import CONF_NAME +from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_create_clientsession from homeassistant.loader import async_get_loaded_integration from homeassistant.util import slugify from pysaleryd.client import Client -from pysaleryd.const import DataKeyEnum from .const import ( CONF_ENABLE_INSTALLER_SETTINGS, CONF_INSTALLER_PASSWORD, - CONF_VALUE, CONF_WEBSOCKET_IP, CONF_WEBSOCKET_PORT, CONFIG_VERSION, @@ -32,14 +29,6 @@ DOMAIN, LOGGER, PLATFORMS, - SERVICE_SET_COOLING_MODE, - SERVICE_SET_FIREPLACE_MODE, - SERVICE_SET_SYSTEM_ACTIVE_MODE, - SERVICE_SET_TARGET_TEMPERATURE_COOL, - SERVICE_SET_TARGET_TEMPERATURE_ECONOMY, - SERVICE_SET_TARGET_TEMPERATURE_NORMAL, - SERVICE_SET_TEMPERATURE_MODE, - SERVICE_SET_VENTILATION_MODE, STARTUP_MESSAGE, ) @@ -47,6 +36,7 @@ from .data import SalerydLokeConfigEntry from homeassistant.core import HomeAssistant, ServiceCall +from .bridge import SalerydLokeBridge from .coordinator import SalerydLokeDataUpdateCoordinator from .data import SalerydLokeData @@ -105,108 +95,10 @@ async def async_migrate_entry( return True -def _get_entry_from_service_data( - hass: HomeAssistant, call: ServiceCall -) -> "SalerydLokeConfigEntry": - """Return coordinator for entry id.""" - device_id = call.get(CONF_DEVICE) - device_registry = dr.async_get(hass) - device = device_registry.async_get(device_id) - if device is None: - raise HomeAssistantError(f"Cannot find device {device_id} is not found") - if device.disabled: - raise HomeAssistantError(f"Device {device_id} is disabled") - - entry = hass.config_entries.async_get_entry(device.primary_config_entry) - if entry is None or entry.state is not ConfigEntryState.LOADED: - raise HomeAssistantError( - f"Config entry for device {device_id} is not found or not loaded" - ) - return entry - - -def setup_hass_services(hass: HomeAssistant) -> None: - """Register ingegration services.""" - - async def control_request(call: ServiceCall, key, installer_setting=False): - """Helper for system control calls""" - entry = _get_entry_from_service_data(hass, call.data) - value = call.data.get(CONF_VALUE) - device = call.data.get(CONF_DEVICE) - client = entry.runtime_data.client - if installer_setting: - installer_settings_enabled = entry.data.get(CONF_ENABLE_INSTALLER_SETTINGS) - if not installer_settings_enabled: - raise HomeAssistantError( - f"Installer settings not enabled for device {device}" - ) - installer_password = entry.data.get(CONF_INSTALLER_PASSWORD) - LOGGER.debug("Sending unlock installer settings control request") - await client.send_command( - DataKeyEnum.INSTALLER_PASSWORD, installer_password - ) - - LOGGER.debug("Sending control request %s with payload %s", key, value) - await client.send_command(key, value) - - async def set_fireplace_mode(call: ServiceCall): - """Set fireplace mode""" - await control_request(call, DataKeyEnum.FIREPLACE_MODE) - - async def set_ventilation_mode(call: ServiceCall): - """Set ventilation mode""" - await control_request(call, DataKeyEnum.MODE_FAN) - - async def set_temperature_mode(call: ServiceCall): - """Set temperature mode""" - await control_request(call, DataKeyEnum.MODE_TEMPERATURE) - - async def set_cooling_mode(call: ServiceCall): - """Set cooling mode""" - await control_request(call, DataKeyEnum.COOLING_MODE) - - async def set_system_active_mode(call: ServiceCall): - """Set system active mode""" - await control_request(call, DataKeyEnum.CONTROL_SYSTEM_STATE, True) - - async def set_target_temperature_cool(call: ServiceCall): - """Set target temperature for Cool temperature mode""" - await control_request(call, DataKeyEnum.TARGET_TEMPERATURE_COOL, True) - - async def set_target_temperature_normal(call: ServiceCall): - """Set target temperature for Normal temperature mode""" - await control_request(call, DataKeyEnum.TARGET_TEMPERATURE_NORMAL, True) - - async def set_target_temperature_economy(call: ServiceCall): - """Set target temperature for Economy temperature mode""" - await control_request(call, DataKeyEnum.TARGET_TEMPERATURE_ECONOMY, True) - - services = { - SERVICE_SET_FIREPLACE_MODE: set_fireplace_mode, - SERVICE_SET_COOLING_MODE: set_cooling_mode, - SERVICE_SET_VENTILATION_MODE: set_ventilation_mode, - SERVICE_SET_TEMPERATURE_MODE: set_temperature_mode, - } - - installer_services = { - SERVICE_SET_SYSTEM_ACTIVE_MODE: set_system_active_mode, - SERVICE_SET_TARGET_TEMPERATURE_COOL: set_target_temperature_cool, - SERVICE_SET_TARGET_TEMPERATURE_ECONOMY: set_target_temperature_economy, - SERVICE_SET_TARGET_TEMPERATURE_NORMAL: set_target_temperature_normal, - } - - # register services - for key, fn in (services | installer_services).items(): - if hass.services.has_service(DOMAIN, key): - continue - hass.services.async_register(DOMAIN, key, fn) - - async def async_setup_entry(hass: HomeAssistant, entry: "SalerydLokeConfigEntry"): """Set up the integration from ConfigEntry.""" integration = async_get_loaded_integration(hass, entry.domain) LOGGER.info(STARTUP_MESSAGE, integration.name, integration.version) - setup_hass_services(hass) url = entry.data.get(CONF_WEBSOCKET_IP) port = entry.data.get(CONF_WEBSOCKET_PORT) @@ -221,10 +113,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: "SalerydLokeConfigEntry" raise ConfigEntryNotReady(f"Timeout while connecting to {url}:{port}") from ex else: coordinator = SalerydLokeDataUpdateCoordinator(hass, LOGGER) + bridge = SalerydLokeBridge(client, coordinator, LOGGER) entry.runtime_data = SalerydLokeData( - client=client, coordinator=coordinator, integration=integration + client=client, + coordinator=coordinator, + integration=integration, + bridge=bridge, ) - client.add_handler(coordinator.async_set_updated_data) await coordinator.async_config_entry_first_refresh() # Setup platforms @@ -246,20 +141,6 @@ async def async_unload_entry( client: SalerydLokeDataUpdateCoordinator = entry.runtime_data.client client.disconnect() - # remove services - - loaded_entries = [ - entry - for entry in hass.config_entries.async_entries(DOMAIN) - if entry.state is ConfigEntryState.LOADED - ] - if len(loaded_entries) == 1: - # If this is the last loaded instance, deregister any services - # defined during integration setup: - - for key in hass.services.async_services().get(DOMAIN, dict()): - hass.services.async_remove(DOMAIN, key) - return unload_ok diff --git a/custom_components/saleryd_hrv/bridge.py b/custom_components/saleryd_hrv/bridge.py new file mode 100644 index 0000000..3af9466 --- /dev/null +++ b/custom_components/saleryd_hrv/bridge.py @@ -0,0 +1,48 @@ +from typing import TYPE_CHECKING + +from pysaleryd.const import DataKeyEnum + +from .const import CONF_INSTALLER_PASSWORD, KEY_CLIENT_STATE, KEY_TARGET_TEMPERATURE + +if TYPE_CHECKING: + from pysaleryd.client import Client + + from .coordinator import SalerydLokeDataUpdateCoordinator + from .data import SalerydLokeConfigEntry + + +class SalerydLokeBridge: + """Representation of bridge between client and coordinator""" + + def __init__( + self, client: "Client", coordinator: "SalerydLokeDataUpdateCoordinator", logger + ): + self.client = client + self.coordinator = coordinator + self.logger = logger + + self.client.add_handler(self.update_data_callback) + + def update_data_callback(self, data): + """Update coordindator data""" + self.logger.debug("Received data") + _data = data.copy() + self.__inject_virtual_keys(_data) + self.coordinator.async_set_updated_data(data) + + def __inject_virtual_keys(self, data): + """Inject additional keys for virtual sensors not present in the data set""" + data[KEY_CLIENT_STATE] = self.client.state.name + data[KEY_TARGET_TEMPERATURE] = None + + async def send_command(self, key: DataKeyEnum, data: str | int, auth: bool = False): + """Send command to client""" + + async def send(key, data): + self.logger.debug("Sending control request %s with payload %s", key, data) + await self.client.send_command(key, data) + + if auth: + installer_password = self._entry.data.get(CONF_INSTALLER_PASSWORD) + await send(DataKeyEnum.INSTALLER_PASSWORD, installer_password) + await send(key, data) diff --git a/custom_components/saleryd_hrv/const.py b/custom_components/saleryd_hrv/const.py index e4e9bbe..f5d80a9 100644 --- a/custom_components/saleryd_hrv/const.py +++ b/custom_components/saleryd_hrv/const.py @@ -41,7 +41,7 @@ ------------------------------------------------------------------- %s %s This is a custom integration! -If you have any issues with this you need to open an issue here: +If encounter any problems open an issue here: {ISSUE_URL} ------------------------------------------------------------------- """ @@ -85,16 +85,6 @@ class ModeEnum(IntEnum): Off = 0 -# Services -SERVICE_SET_FIREPLACE_MODE = "set_fireplace_mode" -SERVICE_SET_COOLING_MODE = "set_cooling_mode" -SERVICE_SET_VENTILATION_MODE = "set_ventilation_mode" -SERVICE_SET_TEMPERATURE_MODE = "set_temperature_mode" -SERVICE_SET_SYSTEM_ACTIVE_MODE = "set_system_active_mode" -SERVICE_SET_TARGET_TEMPERATURE_COOL = "set_target_temperature_cool" -SERVICE_SET_TARGET_TEMPERATURE_NORMAL = "set_target_temperature_normal" -SERVICE_SET_TARGET_TEMPERATURE_ECONOMY = "set_target_temperature_economy" - LOGGER: Logger = getLogger(__package__) # Deprecated constants kept for migrations diff --git a/custom_components/saleryd_hrv/coordinator.py b/custom_components/saleryd_hrv/coordinator.py index ac3d504..dafa68b 100644 --- a/custom_components/saleryd_hrv/coordinator.py +++ b/custom_components/saleryd_hrv/coordinator.py @@ -5,6 +5,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.update_coordinator import DataUpdateCoordinator +from pysaleryd.const import DataKeyEnum from .const import DOMAIN, KEY_CLIENT_STATE, KEY_TARGET_TEMPERATURE @@ -17,22 +18,10 @@ class SalerydLokeDataUpdateCoordinator(DataUpdateCoordinator): config_entry: "SalerydLokeConfigEntry" - def inject_virtual_keys(self, data): - """Inject additional keys for virtual sensors not present in the data set""" - data[KEY_CLIENT_STATE] = self.config_entry.runtime_data.client.state.name - data[KEY_TARGET_TEMPERATURE] = None - def __init__(self, hass: HomeAssistant, logger: Logger) -> None: """Initialize.""" - self.platforms = [] super().__init__(hass, logger, name=DOMAIN) async def _async_update_data(self): """Fetch the latest data from the source.""" return self.data or dict() - - def async_set_updated_data(self, data) -> None: - self.logger.debug("Received data") - _data = data.copy() - self.inject_virtual_keys(_data) - return super().async_set_updated_data(_data) diff --git a/custom_components/saleryd_hrv/data.py b/custom_components/saleryd_hrv/data.py index 6dd9d2f..1eb849b 100644 --- a/custom_components/saleryd_hrv/data.py +++ b/custom_components/saleryd_hrv/data.py @@ -5,12 +5,12 @@ from dataclasses import dataclass from typing import TYPE_CHECKING -from pysaleryd.client import Client - if TYPE_CHECKING: from homeassistant.config_entries import ConfigEntry from homeassistant.loader import Integration + from pysaleryd.client import Client + from .bridge import SalerydLokeBridge from .coordinator import SalerydLokeDataUpdateCoordinator @@ -24,3 +24,4 @@ class SalerydLokeData: client: Client coordinator: SalerydLokeDataUpdateCoordinator integration: Integration + bridge: SalerydLokeBridge diff --git a/custom_components/saleryd_hrv/number.py b/custom_components/saleryd_hrv/number.py index 69e76ca..163ad5c 100644 --- a/custom_components/saleryd_hrv/number.py +++ b/custom_components/saleryd_hrv/number.py @@ -51,7 +51,7 @@ def native_value(self): return self._get_native_value(system_property) async def async_set_native_value(self, value): - await self._entry.runtime_data.client.send_command( + await self._entry.runtime_data.bridge.send_command( self.entity_description.key, int(value) ) diff --git a/custom_components/saleryd_hrv/select.py b/custom_components/saleryd_hrv/select.py index 319d3cf..18d8c8c 100644 --- a/custom_components/saleryd_hrv/select.py +++ b/custom_components/saleryd_hrv/select.py @@ -1,34 +1,30 @@ -from abc import abstractmethod from enum import IntEnum -from typing import Any +from typing import TYPE_CHECKING from homeassistant.components.select import SelectEntity, SelectEntityDescription -from homeassistant.const import CONF_DEVICE -from homeassistant.core import HomeAssistant -from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util import slugify from pysaleryd.const import DataKeyEnum from pysaleryd.utils import SystemProperty -from .const import ( - CONF_VALUE, - DOMAIN, - SERVICE_SET_TEMPERATURE_MODE, - SERVICE_SET_VENTILATION_MODE, - TemperatureModeEnum, - VentilationModeEnum, -) +from .const import TemperatureModeEnum, VentilationModeEnum from .coordinator import SalerydLokeDataUpdateCoordinator -from .data import SalerydLokeConfigEntry from .entity import SalerydLokeEntity +if TYPE_CHECKING: + from homeassistant.core import HomeAssistant + from homeassistant.helpers.entity_platform import AddEntitiesCallback + + from .data import SalerydLokeConfigEntry + class SalerydLokeSelect(SalerydLokeEntity, SelectEntity): - SERVICE: str = None OPTION_ENUM: IntEnum = None def __init__( - self, coordinator: SalerydLokeDataUpdateCoordinator, entry, entity_description + self, + coordinator: "SalerydLokeDataUpdateCoordinator", + entry: "SalerydLokeConfigEntry", + entity_description: SelectEntityDescription, ): self._attr_current_option = None self._entry = entry @@ -42,33 +38,29 @@ def _handle_coordinator_update(self) -> None: self.entity_description.key, self.coordinator.data.get(self.entity_description.key, None), ) - self._attr_current_option = self.OPTION_ENUM(system_property.value).name + if system_property.value is not None: + self._attr_current_option = self.OPTION_ENUM(system_property.value).name super()._handle_coordinator_update() - def select_option(self, option) -> None: + async def async_select_option(self, option: str) -> None: """Change the selected option.""" - self.hass.services.call( - DOMAIN, - self.SERVICE, - {CONF_DEVICE: self.device_entry.id, CONF_VALUE: self.OPTION_ENUM[option]}, - blocking=True, + await self._entry.runtime_data.bridge.send_command( + self.entity_description.key, self.OPTION_ENUM[option] ) class SalerydLokeVentilationModeSelect(SalerydLokeSelect): - SERVICE = SERVICE_SET_VENTILATION_MODE OPTION_ENUM = VentilationModeEnum class SalerydLokeTemperatureModeSelect(SalerydLokeSelect): - SERVICE = SERVICE_SET_TEMPERATURE_MODE OPTION_ENUM = TemperatureModeEnum async def async_setup_entry( - hass: HomeAssistant, + hass: "HomeAssistant", entry: "SalerydLokeConfigEntry", - async_add_entities: AddEntitiesCallback, + async_add_entities: "AddEntitiesCallback", ): coordinator = entry.runtime_data.coordinator entites = [ diff --git a/custom_components/saleryd_hrv/services.yaml b/custom_components/saleryd_hrv/services.yaml deleted file mode 100644 index 06faaed..0000000 --- a/custom_components/saleryd_hrv/services.yaml +++ /dev/null @@ -1,168 +0,0 @@ -set_fireplace_mode: - name: Set fireplace mode - description: Set fireplace mode on or off - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: desired mode (0=Off,1=On) - example: "1" - required: true - selector: - number: - min: 0 - max: 1 - mode: slider -set_cooling_mode: - name: Set cooling mode - description: Set cooling mode on or off - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: desired mode (0=Off,1=On) - example: "1" - required: true - selector: - number: - min: 0 - max: 1 - mode: slider -set_ventilation_mode: - name: Set ventilation mode - description: Set ventilation mode - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: desired mode (0=Home,1=Away,2=Boost) - example: "1" - required: true - selector: - number: - min: 0 - max: 2 - mode: slider -set_temperature_mode: - name: Set temperature mode - description: Set temperature mode - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: desired mode (0=Normal,1=Economy,2=Cool) - example: "1" - required: true - selector: - number: - min: 0 - max: 2 - mode: slider -set_system_active_mode: - name: Set system active mode - description: Set system active mode - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: desired mode (0=Off,1=On,2=Reset) - example: "1" - required: true - selector: - number: - min: 0 - max: 2 - mode: slider -set_target_temperature_normal: - name: Set normal target temperature - description: Set target temperature for normal temperature mode - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: target temperature - example: "18" - required: true - selector: - number: - min: 10 - max: 30 - mode: slider -set_target_temperature_cool: - name: Set cool target temperature - description: Set target temperature for cool temperature mode - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: target temperature - example: "18" - required: true - selector: - number: - min: 10 - max: 30 - mode: slider -set_target_temperature_economy: - name: Set economy target temperature - description: Set target temperature for economy temperature mode - fields: - device: - name: Device - description: Target device - required: True - selector: - device: - integration: saleryd_hrv - value: - name: Value - description: target temperature - example: "18" - required: true - selector: - number: - min: 10 - max: 30 - mode: slider diff --git a/custom_components/saleryd_hrv/switch.py b/custom_components/saleryd_hrv/switch.py index 9f62cdb..6008270 100644 --- a/custom_components/saleryd_hrv/switch.py +++ b/custom_components/saleryd_hrv/switch.py @@ -7,26 +7,17 @@ SwitchEntity, SwitchEntityDescription, ) -from homeassistant.const import CONF_DEVICE -from homeassistant.core import HomeAssistant +from homeassistant.core import HassJobType from homeassistant.helpers.event import async_track_state_change_event from homeassistant.util import slugify from pysaleryd.const import DataKeyEnum from pysaleryd.utils import SystemProperty -from .const import ( - CONF_VALUE, - DOMAIN, - KEY_COOKING_MODE, - LOGGER, - SERVICE_SET_COOLING_MODE, - SERVICE_SET_FIREPLACE_MODE, - ModeEnum, -) +from .const import KEY_COOKING_MODE, LOGGER, ModeEnum from .entity import SalerydLokeEntity, SaleryLokeVirtualEntity if TYPE_CHECKING: - from homeassistant.core import Event, EventStateChangedData + from homeassistant.core import Event, EventStateChangedData, HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from .data import SalerydLokeConfigEntry @@ -60,13 +51,10 @@ def __init__( coordinator, entry: "SalerydLokeConfigEntry", entity_description, - service_turn_on, - service_turn_off, state_when_on=ModeEnum.On, state_when_off=ModeEnum.Off, ) -> None: - self._service_turn_on = service_turn_on - self._service_turn_off = service_turn_off + self._entry = entry self._state_when_on = state_when_on self._state_when_off = state_when_off self.entity_id = f"switch.{entry.unique_id}_{slugify(entity_description.name)}" @@ -82,22 +70,14 @@ def is_on(self): return system_property.value == self._state_when_on - def turn_on(self, **kwargs) -> None: - """Turn on the switch.""" - self.hass.services.call( - DOMAIN, - self._service_turn_on, - {CONF_DEVICE: self.device_entry.id, CONF_VALUE: self._state_when_on}, - blocking=True, + async def async_turn_on(self, **kwargs): + await self._entry.runtime_data.bridge.send_command( + self.entity_description.key, self._state_when_on ) - def turn_off(self, **kwargs) -> None: - """Turn on the switch.""" - self.hass.services.call( - DOMAIN, - self._service_turn_off, - {CONF_DEVICE: self.device_entry.id, CONF_VALUE: self._state_when_off}, - blocking=True, + async def async_turn_off(self, **kwargs): + await self._entry.runtime_data.bridge.send_command( + self.entity_description.key, self._state_when_off ) @@ -116,7 +96,10 @@ async def async_added_to_hass(self) -> Coroutine[Any, Any, None]: ) self._attr_is_on = False self._unsubscribe = async_track_state_change_event( - self.hass, track_entity_id, self._maybe_cancel + self.hass, + track_entity_id, + self._maybe_cancel, + HassJobType.Coroutinefunction, ) await super().async_added_to_hass() @@ -125,7 +108,7 @@ async def async_will_remove_from_hass(self) -> Coroutine[Any, Any, None]: self._unsubscribe() await super().async_will_remove_from_hass() - def _maybe_cancel(self, event: "Event[EventStateChangedData]"): + async def _maybe_cancel(self, event: "Event[EventStateChangedData]"): if self._attr_is_on: if not event.data["new_state"].state.isnumeric(): return @@ -136,17 +119,13 @@ def _maybe_cancel(self, event: "Event[EventStateChangedData]"): event.data["new_state"].state, self.THRESHOLD, ) - - self.hass.services.call( - DOMAIN, - SERVICE_SET_FIREPLACE_MODE, - {CONF_DEVICE: self.device_entry.id, CONF_VALUE: ModeEnum.Off}, - blocking=True, + await self._entry.runtime_data.bridge.send_command( + DataKeyEnum.FIREPLACE_MODE, ModeEnum.Off ) async def async_setup_entry( - hass: HomeAssistant, + hass: "HomeAssistant", entry: "SalerydLokeConfigEntry", async_add_entities: "AddEntitiesCallback", ): @@ -164,8 +143,6 @@ async def async_setup_entry( name="Fireplace mode", device_class=SwitchDeviceClass.SWITCH, ), - service_turn_on=SERVICE_SET_FIREPLACE_MODE, - service_turn_off=SERVICE_SET_FIREPLACE_MODE, ), # "cooling_mode" SalerydLokeBinarySwitch( @@ -177,8 +154,6 @@ async def async_setup_entry( name="Cooling mode", device_class=SwitchDeviceClass.SWITCH, ), - service_turn_on=SERVICE_SET_COOLING_MODE, - service_turn_off=SERVICE_SET_COOLING_MODE, ), # "cooking_mode" SalerydLokeCookingModeSwitch( From 361b75cdec17e2aa60bdc7d95dc7f6b36e967bfb Mon Sep 17 00:00:00 2001 From: bj00rn Date: Tue, 3 Dec 2024 21:38:00 +0100 Subject: [PATCH 2/2] chore(docs): update readme --- README.md | 43 +++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 34cad5b..93c6ac7 100644 --- a/README.md +++ b/README.md @@ -62,50 +62,37 @@ Name | Description | Unit | State attributes ### Switches -Switch | Description | State attributes --- | -- | -- +Name | Description +-- | -- `cooling_mode` | Turn `cooling` mode on/off `fireplace_mode` | Turn `fireplace` mode on/off ### Select -Switch | Description + +Name | Description +-- | -- `ventilation_mode` | set ventilation mode normal/away/boost `temperature_mode` | set temperature mode cool/normal/economy -## Services - -### Normal operation - -Control normal operation of the unit -Name | Description | Fields --- | -- | -- -`set_cooling_mode` | Set cooling mode | device: `str` target device, value: `integer` (0=On, 1=Off) -`set_fireplace_mode` | Set fireplace mode | device: `str` target device, value: `integer` (0=On, 1=Off) -`set_temperature_mode` | Set temperature mode | device: `str` target device, value: `integer` (0=Normal,1=Economy,2=Cool) -`set_ventilation_mode` | Set ventilation mode | device: `str` target device, value: `integer` (0=Normal,1=Away,2=Boost) - -### Installer settings - -Alter installer settings of the unit, Installer settings must be enabled. -Name | Description | Fields --- | -- | -- -`set_system_active_mode` | Set system active mode | device: `str` target device, value: `integer` (0=Off,1=On,2=Reset) -`set_target_temperature_normal` | Set target temperature for normal temperature mode | device: `str` target device, value: `number` (temperature 10-30 degrees celcius) -`set_target_temperature_cool` | Set target temperature for cool temperature mode | device: `str` target device, value: `number` (temperature 10-30 degrees celcius) -`set_target_temperature_economy` | Set target temperature for economy temperature mode | device: `str` target device, value: `number` (temperature 10-30 degrees celcius) +### Number +Name | Description +-- | -- +`cool temperature` | Cool temperature installer setting +`economy temperature` | Economy temperature installer setting +`normal temperature` | Normal temperature installer setting ## Experimental features ### Sensors -Name | Description | Unit | State attributes --- | -- | -- | -- +Name | Description | Unit +-- | -- | -- `heater_power` | Estimated auxillary heater power | `W` | ### Switches -Switch | Description | State attributes --- | -- | -- +Switch | Description +-- | -- `cooking_mode` | Turn `cooking` mode on/off. Emulates cooking mode when fireplace mode is active. When `cooking mode` is active, it automatically deactivates `fireplace mode` before its timer expires. This will reset rotary heat exchanger to normal operation as is desirable in warm weather. ## Supported devices