1
0
mirror of https://github.com/home-assistant/core.git synced 2026-06-01 13:14:35 +01:00

Add binary sensors to electrolux (#171698)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
This commit is contained in:
ferenc-fustos-electrolux
2026-05-28 20:03:58 +03:00
committed by GitHub
parent 675969e36b
commit bfcbfb8725
25 changed files with 8034 additions and 15 deletions
@@ -39,6 +39,7 @@ from .coordinator import (
_LOGGER: logging.Logger = logging.getLogger(__name__)
PLATFORMS = [
Platform.BINARY_SENSOR,
Platform.SENSOR,
]
@@ -0,0 +1,443 @@
"""Binary sensor entity for Electrolux Integration."""
from collections.abc import Callable
from dataclasses import dataclass
import logging
from typing import TYPE_CHECKING, Any, TypeVar
from electrolux_group_developer_sdk.client.appliances.ac_appliance import ACAppliance
from electrolux_group_developer_sdk.client.appliances.ap_appliance import APAppliance
from electrolux_group_developer_sdk.client.appliances.appliance_data import (
ApplianceData,
)
from electrolux_group_developer_sdk.client.appliances.cr_appliance import CRAppliance
from electrolux_group_developer_sdk.client.appliances.dam_ac_appliance import (
DAMACAppliance,
)
from electrolux_group_developer_sdk.client.appliances.dh_appliance import DHAppliance
from electrolux_group_developer_sdk.client.appliances.dw_appliance import DWAppliance
from electrolux_group_developer_sdk.client.appliances.hb_appliance import HBAppliance
from electrolux_group_developer_sdk.client.appliances.hd_appliance import HDAppliance
from electrolux_group_developer_sdk.client.appliances.ov_appliance import OVAppliance
from electrolux_group_developer_sdk.client.appliances.rvc_appliance import RVCAppliance
from electrolux_group_developer_sdk.client.appliances.so_appliance import SOAppliance
from electrolux_group_developer_sdk.client.appliances.td_appliance import TDAppliance
from electrolux_group_developer_sdk.client.appliances.wd_appliance import WDAppliance
from electrolux_group_developer_sdk.client.appliances.wm_appliance import WMAppliance
from electrolux_group_developer_sdk.feature_constants import (
DOOR_STATE,
DRAWER_STATUS,
HOOD_AUTO_SWITCH_OFF_EVENT,
HOOD_FILTER_CHARC_ENABLE,
UI_LOCK_MODE,
ZONE_HOB_POT_DETECTED,
)
from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass,
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import ElectroluxConfigEntry, ElectroluxDataUpdateCoordinator
from .entity import ElectroluxBaseEntity
from .entity_helper import async_setup_entities_helper
from .util import convert_to_snake_case
_LOGGER = logging.getLogger(__name__)
T = TypeVar("T", bound=ApplianceData)
@dataclass(frozen=True, kw_only=True)
class ElectroluxBinarySensorDescription[T = ApplianceData](
BinarySensorEntityDescription
):
"""Custom binary sensor description for Electrolux sensors."""
exists_fn: Callable[[T], bool] = lambda appliance: True
value_fn: Callable[[T], Any]
mapping: dict[Any, bool] | None = None
@dataclass(frozen=True, kw_only=True)
class ElectroluxSubmoduleBinarySensorDescription[T = ApplianceData](
BinarySensorEntityDescription
):
"""Custom binary sensor description for Electrolux appliance submodule sensors."""
exists_fn: Callable[[T, str], bool] = lambda appliance, submodule: True
value_fn: Callable[[T, str], Any]
mapping: dict[Any, bool] | None = None
def _connection_state_value_fn(appliance: ApplianceData):
if TYPE_CHECKING:
assert appliance.state
return appliance.state.connectionState
GENERAL_ELECTROLUX_SENSORS: tuple[ElectroluxBinarySensorDescription, ...] = (
ElectroluxBinarySensorDescription(
key="connection_state",
translation_key="connection_state",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
value_fn=_connection_state_value_fn,
mapping={"connected": True, "disconnected": False},
),
)
HOB_ELECTROLUX_SENSORS: tuple[ElectroluxBinarySensorDescription[HBAppliance], ...] = (
ElectroluxBinarySensorDescription(
key="ui_lock_mode",
translation_key="ui_lock_mode",
exists_fn=lambda appliance: appliance.is_feature_supported(UI_LOCK_MODE),
value_fn=lambda appliance: appliance.get_current_ui_lock_mode(),
mapping={True: False, False: True},
),
)
HOB_ZONE_ELECTROLUX_SENSORS: tuple[
ElectroluxSubmoduleBinarySensorDescription[HBAppliance], ...
] = (
ElectroluxSubmoduleBinarySensorDescription[HBAppliance](
key="pot_detected",
translation_key="pot_detected",
value_fn=lambda appliance, hob_zone: (
appliance.get_current_zone_hob_pot_detected(hob_zone)
),
exists_fn=lambda appliance, hob_zone: appliance.is_hob_zone_feature_supported(
hob_zone, ZONE_HOB_POT_DETECTED
),
),
)
HOOD_ELECTROLUX_SENSORS: tuple[ElectroluxBinarySensorDescription[HDAppliance], ...] = (
ElectroluxBinarySensorDescription(
key="drawer_status",
translation_key="drawer_status",
exists_fn=lambda appliance: appliance.is_feature_supported(DRAWER_STATUS),
value_fn=lambda appliance: appliance.get_current_drawer_status(),
),
ElectroluxBinarySensorDescription(
key="hood_auto_switch_off_event",
translation_key="hood_auto_switch_off_event",
exists_fn=lambda appliance: appliance.is_feature_supported(
HOOD_AUTO_SWITCH_OFF_EVENT
),
value_fn=lambda appliance: appliance.get_current_hood_auto_switch_off_event(),
),
ElectroluxBinarySensorDescription(
key="hood_filter_charcoal_enabled",
translation_key="hood_filter_charcoal_enabled",
exists_fn=lambda appliance: appliance.is_feature_supported(
HOOD_FILTER_CHARC_ENABLE
),
value_fn=lambda appliance: appliance.get_current_hood_filter_charc_enable(),
mapping={"on": True, "off": False},
),
)
CARE_ELECTROLUX_SENSORS: tuple[
ElectroluxBinarySensorDescription[
DWAppliance | TDAppliance | WDAppliance | WMAppliance
],
...,
] = (
ElectroluxBinarySensorDescription(
key="door_state",
translation_key="door_state",
device_class=BinarySensorDeviceClass.DOOR,
exists_fn=lambda appliance: appliance.is_feature_supported(DOOR_STATE),
value_fn=lambda appliance: appliance.get_current_door_state(),
mapping={"closed": False, "open": True},
),
ElectroluxBinarySensorDescription(
key="ui_lock_mode",
translation_key="ui_lock_mode",
exists_fn=lambda appliance: appliance.is_feature_supported(UI_LOCK_MODE),
value_fn=lambda appliance: appliance.get_current_ui_lock_mode(),
mapping={True: False, False: True},
),
)
OVEN_ELECTROLUX_SENSORS: tuple[ElectroluxBinarySensorDescription[OVAppliance], ...] = (
ElectroluxBinarySensorDescription(
key="door_state",
translation_key="door_state",
device_class=BinarySensorDeviceClass.DOOR,
exists_fn=lambda appliance: appliance.is_feature_supported(DOOR_STATE),
value_fn=lambda appliance: appliance.get_current_door_state(),
mapping={"closed": False, "open": True},
),
)
STRUCTURED_OVEN_CAVITY_ELECTROLUX_SENSORS: tuple[
ElectroluxSubmoduleBinarySensorDescription[SOAppliance], ...
] = (
ElectroluxSubmoduleBinarySensorDescription[SOAppliance](
key="door_state",
translation_key="door_state",
device_class=BinarySensorDeviceClass.DOOR,
exists_fn=lambda appliance, cavity: appliance.is_cavity_feature_supported(
cavity, DOOR_STATE
),
value_fn=lambda appliance, cavity: appliance.get_current_cavity_door_state(
cavity
),
mapping={"closed": False, "open": True},
),
)
REFRIGERATOR_GENERIC_ELECTROLUX_SENSORS: tuple[
ElectroluxBinarySensorDescription[CRAppliance], ...
] = (
ElectroluxBinarySensorDescription(
key="ui_lock_mode",
translation_key="ui_lock_mode",
exists_fn=lambda appliance: appliance.is_feature_supported(UI_LOCK_MODE),
value_fn=lambda appliance: appliance.get_current_ui_lock_mode(),
mapping={True: False, False: True},
),
)
FREEZER_FRIDGE_ICE_MAKER_EXTRA_CAVITY_ELECTROLUX_SENSORS: tuple[
ElectroluxSubmoduleBinarySensorDescription[CRAppliance], ...
] = (
ElectroluxSubmoduleBinarySensorDescription(
key="door_state",
translation_key="door_state",
device_class=BinarySensorDeviceClass.DOOR,
exists_fn=lambda appliance, cavity: appliance.is_cavity_feature_supported(
cavity, DOOR_STATE
),
value_fn=lambda appliance, cavity: appliance.get_current_cavity_door_state(
cavity
),
mapping={"closed": False, "open": True},
),
)
def build_entities_for_appliance(
appliance_data: ApplianceData,
coordinators: dict[str, ElectroluxDataUpdateCoordinator],
) -> list[ElectroluxBaseEntity]:
"""Return all entities for a single appliance."""
appliance = appliance_data.appliance
coordinator = coordinators[appliance.applianceId]
entities: list[ElectroluxBaseEntity] = []
if isinstance(
appliance_data,
(
ACAppliance,
APAppliance,
CRAppliance,
DAMACAppliance,
DHAppliance,
DWAppliance,
HBAppliance,
HDAppliance,
OVAppliance,
RVCAppliance,
SOAppliance,
TDAppliance,
WDAppliance,
WMAppliance,
),
):
entities.extend(
ElectroluxSensor(appliance_data, coordinator, description)
for description in GENERAL_ELECTROLUX_SENSORS
)
if isinstance(appliance_data, HBAppliance):
entities.extend(
ElectroluxSensor(appliance_data, coordinator, description)
for description in HOB_ELECTROLUX_SENSORS
if description.exists_fn(appliance_data)
)
entities.extend(
ElectroluxSubmoduleSensor(
appliance_data, coordinator, hob_zone, description
)
for hob_zone in appliance_data.get_available_hob_zone()
for description in HOB_ZONE_ELECTROLUX_SENSORS
if description.exists_fn(appliance_data, hob_zone)
)
if isinstance(appliance_data, HDAppliance):
entities.extend(
ElectroluxSensor(appliance_data, coordinator, description)
for description in HOOD_ELECTROLUX_SENSORS
if description.exists_fn(appliance_data)
)
if isinstance(appliance_data, (DWAppliance, TDAppliance, WDAppliance, WMAppliance)):
entities.extend(
ElectroluxSensor(appliance_data, coordinator, description)
for description in CARE_ELECTROLUX_SENSORS
if description.exists_fn(appliance_data)
)
if isinstance(appliance_data, OVAppliance):
entities.extend(
ElectroluxSensor(appliance_data, coordinator, description)
for description in OVEN_ELECTROLUX_SENSORS
if description.exists_fn(appliance_data)
)
if isinstance(appliance_data, SOAppliance):
entities.extend(
ElectroluxSubmoduleSensor(appliance_data, coordinator, cavity, description)
for description in STRUCTURED_OVEN_CAVITY_ELECTROLUX_SENSORS
for cavity in appliance_data.get_supported_cavities()
if description.exists_fn(appliance_data, cavity)
)
if isinstance(appliance_data, CRAppliance):
entities.extend(
ElectroluxSensor(appliance_data, coordinator, description)
for description in REFRIGERATOR_GENERIC_ELECTROLUX_SENSORS
if description.exists_fn(appliance_data)
)
entities.extend(
ElectroluxSubmoduleSensor(appliance_data, coordinator, cavity, description)
for description in FREEZER_FRIDGE_ICE_MAKER_EXTRA_CAVITY_ELECTROLUX_SENSORS
for cavity in appliance_data.get_supported_cavities()
if description.exists_fn(appliance_data, cavity)
)
return entities
async def async_setup_entry(
hass: HomeAssistant,
entry: ElectroluxConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set binary sensor for Electrolux Integration."""
await async_setup_entities_helper(
hass, entry, async_add_entities, build_entities_for_appliance
)
class ElectroluxSensor(ElectroluxBaseEntity[T], BinarySensorEntity):
"""Representation of a generic binary sensor for Electrolux appliances."""
entity_description: ElectroluxBinarySensorDescription[T]
def __init__(
self,
appliance_data: T,
coordinator: ElectroluxDataUpdateCoordinator,
description: ElectroluxBinarySensorDescription[T],
) -> None:
"""Initialize the binary sensor."""
super().__init__(appliance_data, coordinator, description.key)
self.entity_description = description
def _update_attr_state(self) -> bool:
new_value = self._get_value()
if self._attr_is_on != new_value:
self._attr_is_on = new_value
return True
return False
def _get_value(self) -> bool | None:
description = self.entity_description
entity_key = description.key
value = description.value_fn(self._appliance_data)
if isinstance(value, str):
value = convert_to_snake_case(value)
if description.mapping is not None:
return _map_to_known_value(description.mapping, entity_key, value)
if not isinstance(value, bool):
_LOGGER.warning(
"A non-bool value was detected for a binary sensor of the Electrolux integration. "
"Please report it for the integration, and include the following information: "
'entity key="%s", reported value="%s"',
entity_key,
value,
)
return None
return value
class ElectroluxSubmoduleSensor(ElectroluxBaseEntity[T], BinarySensorEntity):
"""Representation of a generic binary sensor for appliance submodules."""
entity_description: ElectroluxSubmoduleBinarySensorDescription[T]
def __init__(
self,
appliance_data: T,
coordinator: ElectroluxDataUpdateCoordinator,
cavity: str,
description: ElectroluxSubmoduleBinarySensorDescription[T],
) -> None:
"""Initialize the sensor."""
entity_key = f"{convert_to_snake_case(cavity)}_{description.key}"
translation_key = (
f"{convert_to_snake_case(cavity)}_{description.translation_key}"
)
super().__init__(appliance_data, coordinator, entity_key)
self._cavity = cavity
self.entity_description = description
self._attr_translation_key = translation_key
def _update_attr_state(self) -> bool:
new_value = self._get_value()
if self._attr_is_on != new_value:
self._attr_is_on = new_value
return True
return False
def _get_value(self) -> Any:
description = self.entity_description
entity_key = f"{convert_to_snake_case(self._cavity)}_{description.key}"
value = description.value_fn(self._appliance_data, self._cavity)
if isinstance(value, str):
value = convert_to_snake_case(value)
if description.mapping is not None:
return _map_to_known_value(description.mapping, entity_key, value)
if not isinstance(value, bool):
_LOGGER.warning(
"A non-bool value was detected for a binary sensor of the Electrolux integration. "
"Please report it for the integration, and include the following information: "
'entity key="%s", reported value="%s"',
entity_key,
value,
)
return None
return value
_valid_type = str | float | int
def _map_to_known_value(
mapping: dict[_valid_type, bool], entity_key: str, value: _valid_type
) -> bool | None:
"""Map to boolean based on mapping; log warn message if value is not found in mapping."""
if value not in mapping:
_LOGGER.warning(
"An unknown value %s was reported for a binary sensor of the Electrolux integration. "
"Please report it for the integration, and include the following information: "
'entity key="%s", reported value="%s"',
value,
entity_key,
value,
)
return mapping.get(value)
@@ -1,5 +1,13 @@
{
"entity": {
"binary_sensor": {
"drawer_status": {
"default": "mdi:file-cabinet"
},
"hood_auto_switch_off_event": {
"default": "mdi:power-sleep"
}
},
"sensor": {
"appliance_state": {
"default": "mdi:information-outline"
+3 -14
View File
@@ -35,6 +35,7 @@ from homeassistant.util.unit_conversion import TemperatureConverter
from .coordinator import ElectroluxConfigEntry, ElectroluxDataUpdateCoordinator
from .entity import ElectroluxBaseEntity
from .entity_helper import async_setup_entities_helper
from .util import convert_to_snake_case
_LOGGER = logging.getLogger(__name__)
@@ -193,7 +194,7 @@ class ElectroluxSensor(ElectroluxBaseEntity[ApplianceData], SensorEntity):
snake_case_options = [
snake_case_option
for option in options
if (snake_case_option := _convert_to_snake_case(option))
if (snake_case_option := convert_to_snake_case(option))
in description.known_values
]
@@ -205,7 +206,7 @@ class ElectroluxSensor(ElectroluxBaseEntity[ApplianceData], SensorEntity):
def _update_attr_state(self) -> bool:
new_value = self._get_value()
if isinstance(new_value, str):
new_value = _convert_to_snake_case(new_value)
new_value = convert_to_snake_case(new_value)
if self.entity_description.known_values:
new_value = _map_to_known_value(
@@ -261,18 +262,6 @@ class ElectroluxTemperatureSensor(ElectroluxSensor):
)
def _convert_to_snake_case(x: str) -> str:
"""Converts a string to snake case."""
lower_case = x.lower()
return "".join([_convert_char_to_snake_case(char) for char in lower_case])
def _convert_char_to_snake_case(char: str) -> str:
if char.isspace():
return "_"
return char
def _map_to_known_value(
known_values: set[str], entity_key: str, value: str
) -> str | None:
@@ -25,6 +25,65 @@
}
},
"entity": {
"binary_sensor": {
"bottomoven_door_state": {
"name": "Lower door state"
},
"connection_state": {
"name": "Connection state"
},
"door_state": {
"name": "Door state"
},
"drawer_status": {
"name": "Drawer status"
},
"extracavity_door_state": {
"name": "Extra cavity door"
},
"freezer_door_state": {
"name": "Freezer door"
},
"fridge_door_state": {
"name": "Fridge door"
},
"hobzone1_pot_detected": {
"name": "Zone 1 pot detected"
},
"hobzone2_pot_detected": {
"name": "Zone 2 pot detected"
},
"hobzone3_pot_detected": {
"name": "Zone 3 pot detected"
},
"hobzone4_pot_detected": {
"name": "Zone 4 pot detected"
},
"hobzone5_pot_detected": {
"name": "Zone 5 pot detected"
},
"hobzone6_pot_detected": {
"name": "Zone 6 pot detected"
},
"hobzone7_pot_detected": {
"name": "Zone 7 pot detected"
},
"hobzone8_pot_detected": {
"name": "Zone 8 pot detected"
},
"hood_auto_switch_off_event": {
"name": "Auto switch off event"
},
"hood_filter_charcoal_enabled": {
"name": "Charcoal filter"
},
"ui_lock_mode": {
"name": "UI lock mode"
},
"upperoven_door_state": {
"name": "Upper door state"
}
},
"sensor": {
"appliance_state": {
"name": "Appliance state",
@@ -0,0 +1,13 @@
"""Utility functions used by the Electrolux integration."""
def convert_to_snake_case(x: str) -> str:
"""Converts a string to snake case."""
lower_case = x.lower()
return "".join([_convert_char_to_snake_case(char) for char in lower_case])
def _convert_char_to_snake_case(char: str) -> str:
if char.isspace():
return "_"
return char
+9 -1
View File
@@ -11,7 +11,15 @@ from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry, load_fixture
APPLIANCE_FIXTURES = ["fenix_oven", "pux_oven"]
APPLIANCE_FIXTURES = [
"fenix_oven",
"pux_oven",
"peacock_hob",
"tumble_dryer",
"supex_structured_oven",
"ayran_fridge",
"hood",
]
async def setup_integration(
@@ -0,0 +1,331 @@
{
"applianceInfo": {
"serialNumber": "20220412",
"pnc": "999011403",
"brand": "AEG",
"deviceType": "FREESTANDING_BOTTOM_FREEZER",
"model": "RCB732E9MX",
"variant": "UNDEFINED",
"colour": "GREY"
},
"capabilities": {
"alerts": {
"access": "read",
"type": "alert",
"values": {
"AIR_SENSOR_BROKEN": {},
"AIR_SENSOR_OPEN_CIRCUIT": {},
"AIR_SENSOR_SHORT_CIRCUIT": {},
"COMMUNICATION_ALARM": {},
"DRINK_CHILL_EXPIRED": {},
"HUMIDITY_SENSOR_BROKEN": {},
"HUMIDITY_SENSOR_OPEN_CIRCUIT": {},
"HUMIDITY_SENSOR_SHORT_CIRCUIT": {},
"POWER_FAILURE_ALARM": {}
}
},
"applianceMainBoardSwVersion": {
"access": "read",
"type": "string"
},
"applianceMode": {
"access": "read",
"type": "string",
"values": {
"DEMO": {},
"DIAGNOSTIC": {},
"NORMAL": {},
"SERVICE": {}
}
},
"applianceUiSwVersion": {
"access": "read",
"type": "string"
},
"compressorState": {
"access": "read",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"coolingValveState": {
"access": "read",
"type": "string"
},
"defrostRoutineState": {
"access": "read",
"type": "string",
"values": {
"DRIP": {},
"HEATER_ON": {},
"POST_COOLING": {},
"PRE_COOLING": {},
"PRE_SOFT": {},
"PULL_DOWN": {},
"WAIT": {}
}
},
"energySavingMode": {
"access": "readwrite",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"fSPN_CRConnectionLost": {
"access": "constant",
"default": 1,
"type": "int"
},
"freezer": {
"alerts": {
"access": "read",
"type": "alert",
"values": {
"AIR_SENSOR_BROKEN": {},
"AIR_SENSOR_OPEN_CIRCUIT": {},
"AIR_SENSOR_SHORT_CIRCUIT": {},
"DEFROST_SENSOR_BROKEN": {},
"DEFROST_SENSOR_OPEN_CIRCUIT": {},
"DEFROST_SENSOR_SHORT_CIRCUIT": {},
"DOOR_ALARM": {},
"TEMPERATURE_ALARM": {}
}
},
"applianceState": {
"access": "read",
"type": "string",
"values": {
"ALARM": {},
"DELAYED_START": {},
"END_OF_CYCLE": {},
"IDLE": {},
"OFF": {},
"PAUSED": {},
"READY_TO_START": {},
"RUNNING": {}
}
},
"doorState": {
"access": "read",
"type": "string",
"values": {
"CLOSED": {},
"OPEN": {}
}
},
"fanState": {
"access": "read",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"fastMode": {
"access": "readwrite",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"fastModeTimeToEnd": {
"access": "readwrite",
"type": "number"
},
"sensorTemperatureC": {
"access": "read",
"type": "temperature"
},
"sensorTemperatureF": {
"access": "read",
"type": "temperature"
},
"targetTemperatureC": {
"access": "readwrite",
"default": -18,
"max": -16,
"min": -24,
"step": 2,
"type": "temperature"
}
},
"fridge": {
"alerts": {
"access": "read",
"type": "alert",
"values": {
"AIR_SENSOR_BROKEN": {},
"AIR_SENSOR_OPEN_CIRCUIT": {},
"AIR_SENSOR_SHORT_CIRCUIT": {},
"DEFROST_SENSOR_BROKEN": {},
"DEFROST_SENSOR_OPEN_CIRCUIT": {},
"DEFROST_SENSOR_SHORT_CIRCUIT": {},
"DOOR_ALARM": {},
"TEMPERATURE_ALARM": {}
}
},
"applianceState": {
"access": "read",
"type": "string",
"values": {
"ALARM": {},
"DELAYED_START": {},
"END_OF_CYCLE": {},
"IDLE": {},
"OFF": {},
"PAUSED": {},
"READY_TO_START": {},
"RUNNING": {}
}
},
"doorState": {
"access": "read",
"type": "string",
"values": {
"CLOSED": {},
"OPEN": {}
}
},
"fanState": {
"access": "read",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"fastMode": {
"access": "readwrite",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"fastModeTimeToEnd": {
"access": "readwrite",
"type": "number"
},
"sensorTemperatureC": {
"access": "read",
"type": "temperature"
},
"sensorTemperatureF": {
"access": "read",
"type": "temperature"
},
"targetTemperatureC": {
"access": "readwrite",
"default": 4,
"max": 8,
"min": 1,
"step": 1,
"type": "temperature"
}
},
"networkInterface": {
"command": {
"access": "write",
"type": "string",
"values": {
"APPLIANCE_AUTHORIZE": {},
"START": {},
"USER_AUTHORIZE": {},
"USER_NOT_AUTHORIZE": {}
}
},
"linkQualityIndicator": {
"access": "read",
"type": "string",
"values": {
"EXCELLENT": {},
"GOOD": {},
"POOR": {},
"UNDEFINED": {},
"VERY_GOOD": {},
"VERY_POOR": {}
}
},
"niuSwUpdateCurrentDescription": {
"access": "read",
"type": "string"
},
"otaState": {
"access": "read",
"type": "string",
"values": {
"DESCRIPTION_AVAILABLE": {},
"DESCRIPTION_DOWNLOADING": {},
"DESCRIPTION_READY": {},
"FW_DOWNLOADING": {},
"FW_DOWNLOAD_START": {},
"FW_SIGNATURE_CHECK": {},
"FW_UPDATE_IN_PROGRESS": {},
"IDLE": {},
"READY_TO_UPDATE": {},
"UPDATE_ABORT": {},
"UPDATE_CHECK": {},
"UPDATE_ERROR": {},
"UPDATE_OK": {},
"WAITINGFORAUTHORIZATION": {}
}
},
"startUpCommand": {
"access": "write",
"type": "string",
"values": {
"UNINSTALL": {}
}
},
"swAncAndRevision": {
"access": "read",
"type": "string"
},
"swVersion": {
"access": "read",
"type": "string"
}
},
"reminderTime": {
"access": "readwrite",
"default": 1800,
"max": 1800,
"min": 300,
"step": 300,
"type": "number",
"values": {
"0": {},
"-1": {}
}
},
"sabbathMode": {
"access": "readwrite",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"uiLockMode": {
"access": "readwrite",
"type": "boolean",
"values": {
"OFF": {},
"ON": {}
}
},
"vacationHolidayMode": {
"access": "readwrite",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
}
}
}
@@ -0,0 +1,389 @@
{
"applianceInfo": {
"serialNumber": "99010299",
"pnc": "999008105",
"brand": "AEG",
"deviceType": "CEILING HOODS",
"model": "DDC8271W",
"variant": "SLIMWHGLASS8000",
"colour": "WHITE"
},
"capabilities": {
"alerts": {
"access": "read",
"type": "alert",
"values": {
"ABNORMAL_TEMPERATURE_FAIL_H253": {},
"BRUSHLESS_MOTOR_CONTROL_BOARD_ALARMS_H103": {},
"CHUI_BOARD_NTC_OUT_OF_RANGE_ALARM_H210": {},
"COMM_ALARM_CHC_CHUI_H125": {},
"COMM_ALARM_CHPE_CHUI_H348": {},
"COMM_ALARM_CHUI_CHC_H201": {},
"COMM_ALARM_CHUI_CPE_H202": {},
"COMM_FAIL_CHC_HOOD_MOTOR_CONTROL_H101": {},
"COOLING_DOWN_WARNING_H252": {},
"HUMIDITY_TEMPERATURE_SENSOR_OUT_OF_RANGE_ALARM_H351": {},
"MISSING_CONFIGURATION_ALARM_CHPE_H354": {},
"MISSING_CONFIG_ALARM_H135": {},
"STUCK_KEY_ALARM_H218": {},
"SW_COMPAT_ALARM_H127": {},
"TVOC_ALARM_H346": {},
"TVOC_HUMIDITY_TEMPERATURE_I2C_ALARM_H350": {},
"TVOC_R_MOX_OUT_OF_RANGE_ALARM_H349": {},
"WRONG_CONFIG_CHECKSUM_PHE_ALARM_H341": {},
"WRONG_CONFIG_CRC_ALARM_H133": {},
"WRONG_CRC_ON_CONFIG_ALARM_CHPE_H347": {},
"WRONG_CRC_ON_CONFIG_ALARM_CHUI_H204": {},
"WRONG_SW_COMPAT_ALARM_CHUI_H205": {}
}
},
"applianceLocalTimeOffset": {
"access": "read",
"type": "number"
},
"applianceMode": {
"access": "read",
"type": "string",
"values": {
"DEMO": {},
"DIAGNOSTIC": {},
"NORMAL": {}
}
},
"applianceState": {
"access": "read",
"triggers": [
{
"action": {
"hoodFilterCharcEnable": {
"access": "readwrite"
}
},
"condition": {
"operand_1": {
"operand_1": "value",
"operand_2": "OFF",
"operator": "eq"
},
"operand_2": {
"operand_1": "value",
"operand_2": "IDLE",
"operator": "eq"
},
"operator": "or"
}
},
{
"action": {
"hoodFilterCharcEnable": {
"access": "read"
}
},
"condition": {
"operand_1": "value",
"operand_2": "RUNNING",
"operator": "eq"
}
},
{
"action": {
"humanCentricLightEventSettings": {
"access": "readwrite"
}
},
"condition": {
"operand_1": {
"operand_1": "value",
"operand_2": "OFF",
"operator": "eq"
},
"operand_2": {
"operand_1": "value",
"operand_2": "IDLE",
"operator": "eq"
},
"operator": "or"
}
},
{
"action": {
"humanCentricLightEventSettings": {
"access": "read"
}
},
"condition": {
"operand_1": "value",
"operand_2": "RUNNING",
"operator": "eq"
}
}
],
"type": "string",
"values": {
"IDLE": {},
"OFF": {},
"RUNNING": {}
}
},
"autosenseEnabledDisable": {
"access": "readwrite",
"type": "boolean"
},
"charcoalFilterReminderThreshold": {
"access": "constant",
"default": 9600,
"type": "int"
},
"greaseFilterReminderThreshold": {
"access": "constant",
"default": 2400,
"type": "int"
},
"hoodAutoSwitchOffEvent": {
"access": "read",
"type": "boolean"
},
"hoodAutosenseControl": {
"access": "readwrite",
"type": "boolean"
},
"hoodCharcFilterTimer": {
"access": "read",
"type": "number"
},
"hoodFanLevel": {
"access": "readwrite",
"triggers": [
{
"action": {
"targetDuration": {
"access": "readwrite"
}
},
"condition": {
"operand_1": {
"operand_1": "value",
"operand_2": "BREEZE",
"operator": "ge"
},
"operand_2": {
"operand_1": "value",
"operand_2": "STEP_3",
"operator": "le"
},
"operator": "and"
}
},
{
"action": {
"targetDuration": {
"access": "read"
}
},
"condition": {
"operand_1": {
"operand_1": "value",
"operand_2": "BREEZE",
"operator": "lt"
},
"operand_2": {
"operand_1": "value",
"operand_2": "STEP_3",
"operator": "gt"
},
"operator": "or"
}
}
],
"type": "string",
"values": {
"BOOST": {},
"BREEZE": {},
"OFF": {},
"STEP_1": {},
"STEP_2": {},
"STEP_3": {}
}
},
"hoodFilterCharcEnable": {
"access": "readwrite",
"type": "string",
"values": {
"OFF": {},
"ON": {}
}
},
"hoodFilterCharcIndication": {
"access": "readwrite",
"type": "boolean",
"values": {
"FALSE": {},
"TRUE": {}
}
},
"hoodFilterGreaseIndication": {
"access": "readwrite",
"type": "string",
"values": {
"FALSE": {},
"TRUE": {}
}
},
"hoodGreaseFilterTimer": {
"access": "read",
"type": "number"
},
"humanCentricLightEventSettings": {
"access": "readwrite",
"type": "humanCentLightEnableSettings"
},
"humanCentricLightEventSettings/event": {
"access": "readwrite",
"type": "complex",
"values": {}
},
"humanCentricLightEventSettings/number": {
"access": "read",
"type": "int",
"values": {}
},
"lightColorTemperature": {
"access": "readwrite",
"max": 100,
"min": 0,
"step": 1,
"type": "number",
"values": {
"NOT_AVAILABLE": {}
}
},
"lightIntensity": {
"access": "readwrite",
"max": 100,
"min": 0,
"step": 1,
"type": "number",
"values": {
"NOT_AVAILABLE": {}
}
},
"localTimeAutomaticMode": {
"access": "read",
"default": "AUTOMATIC",
"type": "string",
"values": {
"AUTOMATIC": {}
}
},
"maxTimerDuration": {
"access": "constant",
"default": 60,
"type": "number"
},
"networkInterface": {
"autoLocalTimeOffset": {
"access": "read",
"max": 50400,
"min": -43200,
"step": 60,
"type": "number"
},
"command": {
"access": "write",
"type": "string",
"values": {
"ABORT": {},
"APPLIANCE_AUTHORIZE": {},
"DOWNLOAD": {},
"START": {},
"USER_AUTHORIZE": {},
"USER_NOT_AUTHORIZE": {}
}
},
"linkQualityIndicator": {
"access": "read",
"type": "string",
"values": {
"EXCELLENT": {},
"GOOD": {},
"POOR": {},
"UNDEFINED": {},
"VERY_GOOD": {},
"VERY_POOR": {}
}
},
"niuSwUpdateCurrentDescription": {
"access": "read",
"type": "string"
},
"otaState": {
"access": "read",
"type": "string",
"values": {
"DESCRIPTION_AVAILABLE": {},
"DESCRIPTION_DOWNLOADING": {},
"DESCRIPTION_READY": {},
"FW_DOWNLOADING": {},
"FW_DOWNLOAD_START": {},
"FW_SIGNATURE_CHECK": {},
"FW_UPDATE_IN_PROGRESS": {},
"IDLE": {},
"READY_TO_UPDATE": {},
"UPDATE_ABORT": {},
"UPDATE_CHECK": {},
"UPDATE_ERROR": {},
"UPDATE_OK": {},
"WAITINGFORAUTHORIZATION": {}
}
},
"startUpCommand": {
"access": "write",
"type": "string",
"values": {
"UNINSTALL": {}
}
},
"swAncAndRevision": {
"access": "read",
"type": "string"
},
"swVersion": {
"access": "read",
"type": "string"
},
"timeZoneDatabaseName": {
"access": "readwrite",
"type": "string"
}
},
"remoteControl": {
"access": "read",
"type": "string",
"values": {
"DISABLED": {},
"ENABLED": {},
"NOT_SAFETY_RELEVANT_ENABLED": {},
"TEMPORARY_LOCKED": {}
}
},
"soundVolume": {
"access": "readwrite",
"type": "number",
"values": {
"0": {},
"1": {}
}
},
"targetDuration": {
"access": "readwrite",
"max": 36000,
"min": 0,
"step": 60,
"type": "number"
},
"timeToEnd": {
"access": "read",
"type": "number"
}
}
}
@@ -0,0 +1,672 @@
{
"applianceInfo": {
"serialNumber": "99907833",
"pnc": "999008120",
"brand": "AEG",
"deviceType": "BUILT IN HOB",
"model": "TU84CF43CB",
"variant": "N/A",
"colour": "BLACK"
},
"capabilities": {
"alerts": {
"access": "read",
"type": "alert",
"values": {
"CKG_ZONE_FAIL_E601": {},
"CKG_ZONE_FAIL_E602": {},
"CKG_ZONE_FAIL_E603": {},
"CKG_ZONE_FAIL_E604": {},
"CKG_ZONE_FAIL_E605": {},
"CKG_ZONE_FAIL_E606": {},
"CKG_ZONE_FAIL_E611": {},
"CKG_ZONE_FAIL_E612": {},
"CKG_ZONE_FAIL_E613": {},
"CKG_ZONE_FAIL_E614": {},
"CKG_ZONE_FAIL_E615": {},
"CKG_ZONE_FAIL_E616": {},
"CKG_ZONE_FAIL_E621": {},
"CKG_ZONE_FAIL_E622": {},
"CKG_ZONE_FAIL_E623": {},
"CKG_ZONE_FAIL_E624": {},
"CKG_ZONE_FAIL_E625": {},
"CKG_ZONE_FAIL_E626": {},
"CKG_ZONE_FAIL_E651": {},
"CKG_ZONE_FAIL_E652": {},
"CKG_ZONE_FAIL_E653": {},
"CKG_ZONE_FAIL_E654": {},
"CKG_ZONE_FAIL_E655": {},
"CKG_ZONE_FAIL_E656": {},
"CKG_ZONE_FAN_FAIL_E701": {},
"CKG_ZONE_FAN_FAIL_E702": {},
"CKG_ZONE_FAN_FAIL_E703": {},
"CKG_ZONE_FAN_FAIL_E704": {},
"CKG_ZONE_FAN_FAIL_E705": {},
"CKG_ZONE_FAN_FAIL_E706": {},
"CKG_ZONE_FAN_FAIL_E711": {},
"CKG_ZONE_FAN_FAIL_E712": {},
"CKG_ZONE_FAN_FAIL_E713": {},
"CKG_ZONE_FAN_FAIL_E714": {},
"CKG_ZONE_FAN_FAIL_E715": {},
"CKG_ZONE_FAN_FAIL_E716": {},
"CKG_ZONE_SW_ERROR_E011": {},
"CKG_ZONE_SW_ERROR_E012": {},
"CKG_ZONE_SW_ERROR_E013": {},
"CKG_ZONE_SW_ERROR_E014": {},
"CKG_ZONE_SW_ERROR_E015": {},
"CKG_ZONE_SW_ERROR_E016": {},
"CKG_ZONE_TEMP_SENS_FAIL_E401": {},
"CKG_ZONE_TEMP_SENS_FAIL_E402": {},
"CKG_ZONE_TEMP_SENS_FAIL_E403": {},
"CKG_ZONE_TEMP_SENS_FAIL_E404": {},
"CKG_ZONE_TEMP_SENS_FAIL_E405": {},
"CKG_ZONE_TEMP_SENS_FAIL_E406": {},
"CKG_ZONE_TEMP_SENS_FAIL_E411": {},
"CKG_ZONE_TEMP_SENS_FAIL_E412": {},
"CKG_ZONE_TEMP_SENS_FAIL_E413": {},
"CKG_ZONE_TEMP_SENS_FAIL_E414": {},
"CKG_ZONE_TEMP_SENS_FAIL_E415": {},
"CKG_ZONE_TEMP_SENS_FAIL_E416": {},
"CKG_ZONE_TEMP_SENS_FAIL_E431": {},
"CKG_ZONE_TEMP_SENS_FAIL_E432": {},
"CKG_ZONE_TEMP_SENS_FAIL_E433": {},
"CKG_ZONE_TEMP_SENS_FAIL_E434": {},
"CKG_ZONE_TEMP_SENS_FAIL_E435": {},
"CKG_ZONE_TEMP_SENS_FAIL_E436": {},
"CKG_ZONE_TEMP_SENS_FAIL_E441": {},
"CKG_ZONE_TEMP_SENS_FAIL_E442": {},
"CKG_ZONE_TEMP_SENS_FAIL_E443": {},
"CKG_ZONE_TEMP_SENS_FAIL_E444": {},
"CKG_ZONE_TEMP_SENS_FAIL_E445": {},
"CKG_ZONE_TEMP_SENS_FAIL_E446": {},
"CKG_ZONE_TEMP_TOO_HIGH_E421": {},
"CKG_ZONE_TEMP_TOO_HIGH_E422": {},
"CKG_ZONE_TEMP_TOO_HIGH_E423": {},
"CKG_ZONE_TEMP_TOO_HIGH_E424": {},
"CKG_ZONE_TEMP_TOO_HIGH_E425": {},
"CKG_ZONE_TEMP_TOO_HIGH_E426": {},
"DATA_CRC_ERROR_E661": {},
"DATA_CRC_ERROR_E662": {},
"DATA_CRC_ERROR_E663": {},
"DISPLAY_ELECTRONIC_FAIL_E061": {},
"DISPLAY_ELECTRONIC_FAIL_E081": {},
"DISPLAY_ELECTRONIC_FAIL_E091": {},
"DISPLAY_ELECTRONIC_FAIL_E0C1": {},
"DISPLAY_NOT_PROPER_WORK_E9F1": {},
"DISPLAY_TEMP_TOO_HIGH_E0A1": {},
"HOOD_FAIL_E518": {},
"HOOD_FAIL_E527": {},
"HOOD_FAIL_E528": {},
"HOOD_FAIL_E8B1": {},
"HOOD_MC_BOARD_ALARM_E537": {},
"HOOD_SW_FAIL_E517": {},
"HUI_PIXIE_COMM_ALARM_E8B7": {},
"INTERNAL_COMM_FAIL_E821": {},
"INTERNAL_COMM_FAIL_E822": {},
"INTERNAL_COMM_FAIL_E823": {},
"INTERNAL_COMM_FAIL_E824": {},
"INTERNAL_COMM_FAIL_E825": {},
"INTERNAL_COMM_FAIL_E826": {},
"INTERNAL_COMM_FAIL_E831": {},
"INTERNAL_COMM_FAIL_E841": {},
"INTERNAL_COMM_FAIL_E851": {},
"INTERNAL_COMM_FAIL_E861": {},
"INTERNAL_COMM_FAIL_E871": {},
"KEY_ERROR_FMEA_E9D1": {},
"KNOB_ERROR_E951": {},
"MAINS_CONNECTION_ERROR_E311": {},
"MAINS_CONNECTION_ERROR_E312": {},
"MAINS_CONNECTION_ERROR_E313": {},
"MAINS_CONNECTION_ERROR_E314": {},
"MAINS_CONNECTION_ERROR_E315": {},
"MAINS_CONNECTION_ERROR_E316": {},
"MAINS_RELAY_FAIL_E641": {},
"MAINS_RELAY_FAIL_E642": {},
"MAINS_RELAY_FAIL_E643": {},
"MAINS_RELAY_FAIL_E644": {},
"MAINS_RELAY_FAIL_E645": {},
"MAINS_RELAY_FAIL_E646": {},
"MAINS_VOLTAGE_TOO_LOW_E321": {},
"MAINS_VOLTAGE_TOO_LOW_E322": {},
"MAINS_VOLTAGE_TOO_LOW_E323": {},
"MAINS_VOLTAGE_TOO_LOW_E324": {},
"MAINS_VOLTAGE_TOO_LOW_E325": {},
"MAINS_VOLTAGE_TOO_LOW_E326": {},
"SENSEBOIL_FAIL_E272": {},
"SENSEBOIL_FAIL_E282": {},
"SENSEBOIL_FAIL_E8A2": {},
"SW_ERROR_E021": {},
"SW_ERROR_E031": {},
"SW_ERROR_E041": {},
"SW_ERROR_E051": {},
"TOUCH_NOT_PROPER_WORK_E911": {},
"TOUCH_NOT_PROPER_WORK_E921": {},
"TOUCH_NOT_PROPER_WORK_E931": {},
"TOUCH_NOT_PROPER_WORK_E941": {},
"TOUCH_NOT_PROPER_WORK_E961": {},
"TOUCH_NOT_PROPER_WORK_E971": {},
"TOUCH_NOT_PROPER_WORK_E981": {},
"TOUCH_NOT_PROPER_WORK_E991": {},
"TOUCH_NOT_PROPER_WORK_E9A1": {},
"TOUCH_NOT_PROPER_WORK_E9B1": {},
"TOUCH_NOT_PROPER_WORK_E9C1": {},
"WI-FI_FAIL_E141": {},
"WI-FI_FAIL_E181": {},
"ZONE_ILLUMINATION_FAIL_E201": {},
"ZONE_ILLUMINATION_FAIL_E211": {},
"ZONE_ILLUMINATION_FAIL_E221": {},
"ZONE_ILLUMINATION_FAIL_E231": {},
"ZONE_ILLUMINATION_FAIL_E241": {}
}
},
"applianceMode": {
"access": "read",
"type": "string",
"values": {
"DEMO": {},
"DIAGNOSTIC": {},
"NORMAL": {},
"SERVICE": {}
}
},
"applianceState": {
"access": "read",
"type": "string",
"values": {
"ALARM": {},
"IDLE": {},
"OFF": {},
"PAUSED": {},
"RUNNING": {}
}
},
"childLock": {
"access": "readwrite",
"triggers": [
{
"action": {
"$self": {
"access": "read"
}
},
"condition": {
"operand_1": "value",
"operand_2": "ENABLED",
"operator": "eq"
}
},
{
"action": {
"$self": {
"access": "readwrite"
}
},
"condition": {
"operand_1": "value",
"operand_2": "DISABLED",
"operator": "eq"
}
}
],
"type": "boolean",
"values": {
"DISABLED": {},
"ENABLED": {}
}
},
"cpv": {
"access": "read",
"type": "string"
},
"hobHood": {
"hobToHoodFanSpeed": {
"access": "readwrite",
"type": "string",
"values": {
"BOOST": {},
"BREEZE": {},
"DRYING_CYCLE": {},
"OFF": {},
"STEP_1": {},
"STEP_2": {},
"STEP_3": {}
}
},
"hobToHoodMode": {
"access": "readwrite",
"type": "string",
"values": {
"H1": {},
"H2": {},
"H3": {},
"H4": {}
}
},
"hobToHoodState": {
"access": "readwrite",
"type": "string",
"values": {
"AUTOMATIC": {},
"AUTO_SUSPEND": {
"disabled": true
},
"MANUAL": {}
}
},
"hoodDryingCycle": {
"access": "readwrite",
"type": "string",
"values": {
"KEY_ERROR": {
"disabled": true
}
}
},
"hoodFilterCharcIndication": {
"access": "readwrite",
"type": "boolean",
"values": {
"FALSE": {},
"TRUE": {}
}
},
"hoodFilterGreaseIndication": {
"access": "readwrite",
"type": "boolean",
"values": {
"FALSE": {},
"TRUE": {}
}
},
"targetDuration": {
"access": "readwrite",
"default": 0,
"max": 5940,
"min": 0,
"step": 60,
"type": "number"
},
"timeToEnd": {
"access": "read",
"type": "number"
},
"windowNotification": {
"access": "read",
"type": "string",
"values": {
"NONE": {},
"OPENING_REQUIRED": {}
}
}
},
"hobZone1": {
"heatingQualitativeLevel": {
"access": "read",
"default": 0,
"max": 9,
"min": 0,
"step": 1,
"type": "number",
"values": {
"POWER_LEVEL_P": {}
}
},
"hobCoil": {
"access": "read",
"type": "number"
},
"hobMaxPowerLevel": {
"access": "read",
"type": "number"
},
"hobPotDetected": {
"access": "read",
"type": "string",
"values": {
"NO_POT_IDLE": {},
"NO_POT_RUNNING": {},
"POT_IDLE": {},
"POT_RUNNING": {}
}
},
"residualHeatState": {
"access": "read",
"type": "string",
"values": {
"HIGH": {},
"LOW": {},
"MIDDLE": {},
"NO": {}
}
},
"runningTime": {
"access": "read",
"default": 0,
"type": "number"
}
},
"hobZone2": {
"heatingQualitativeLevel": {
"access": "read",
"default": 0,
"max": 9,
"min": 0,
"step": 1,
"type": "number",
"values": {
"POWER_LEVEL_P": {}
}
},
"hobCoil": {
"access": "read",
"type": "number"
},
"hobMaxPowerLevel": {
"access": "read",
"type": "number"
},
"hobPotDetected": {
"access": "read",
"type": "string",
"values": {
"NO_POT_IDLE": {},
"NO_POT_RUNNING": {},
"POT_IDLE": {},
"POT_RUNNING": {}
}
},
"residualHeatState": {
"access": "read",
"type": "string",
"values": {
"HIGH": {},
"LOW": {},
"MIDDLE": {},
"NO": {}
}
},
"runningTime": {
"access": "read",
"default": 0,
"type": "number"
}
},
"hobZone3": {
"heatingQualitativeLevel": {
"access": "read",
"default": 0,
"max": 9,
"min": 0,
"step": 1,
"type": "number",
"values": {
"POWER_LEVEL_P": {}
}
},
"hobCoil": {
"access": "read",
"type": "number"
},
"hobMaxPowerLevel": {
"access": "read",
"type": "number"
},
"hobPotDetected": {
"access": "read",
"type": "string",
"values": {
"NO_POT_IDLE": {},
"NO_POT_RUNNING": {},
"POT_IDLE": {},
"POT_RUNNING": {}
}
},
"residualHeatState": {
"access": "read",
"type": "string",
"values": {
"HIGH": {},
"LOW": {},
"MIDDLE": {},
"NO": {}
}
},
"runningTime": {
"access": "read",
"default": 0,
"type": "number"
}
},
"hobZone4": {
"heatingQualitativeLevel": {
"access": "read",
"default": 0,
"max": 9,
"min": 0,
"step": 1,
"type": "number",
"values": {
"POWER_LEVEL_P": {}
}
},
"hobCoil": {
"access": "read",
"type": "number"
},
"hobMaxPowerLevel": {
"access": "read",
"type": "number"
},
"hobPotDetected": {
"access": "read",
"type": "string",
"values": {
"NO_POT_IDLE": {},
"NO_POT_RUNNING": {},
"POT_IDLE": {},
"POT_RUNNING": {}
}
},
"residualHeatState": {
"access": "read",
"type": "string",
"values": {
"HIGH": {},
"LOW": {},
"MIDDLE": {},
"NO": {}
}
},
"runningTime": {
"access": "read",
"default": 0,
"type": "number"
}
},
"hobZone7": {
"heatingQualitativeLevel": {
"access": "read",
"default": 0,
"max": 9,
"min": 0,
"step": 1,
"type": "number",
"values": {
"POWER_LEVEL_ASSISTED": {},
"POWER_LEVEL_MELTING": {},
"POWER_LEVEL_P": {}
}
},
"hobCoil": {
"access": "read",
"type": "number"
},
"hobMaxPowerLevel": {
"access": "read",
"type": "number"
},
"hobPotDetected": {
"access": "read",
"type": "string",
"values": {
"NO_POT_IDLE": {},
"NO_POT_RUNNING": {},
"POT_IDLE": {},
"POT_RUNNING": {}
}
},
"residualHeatState": {
"access": "read",
"type": "string",
"values": {
"HIGH": {},
"LOW": {},
"MIDDLE": {},
"NO": {}
}
},
"runningTime": {
"access": "read",
"default": 0,
"type": "number"
}
},
"keyModel": {
"access": "constant",
"default": "285_145_030",
"type": "string"
},
"networkInterface": {
"command": {
"access": "write",
"type": "string",
"values": {
"APPLIANCE_AUTHORIZE": {},
"START": {},
"USER_AUTHORIZE": {},
"USER_NOT_AUTHORIZE": {}
}
},
"linkQualityIndicator": {
"access": "read",
"type": "string",
"values": {
"EXCELLENT": {},
"GOOD": {},
"POOR": {},
"UNDEFINED": {},
"VERY_GOOD": {},
"VERY_POOR": {}
}
},
"niuSwUpdateCurrentDescription": {
"access": "read",
"type": "string"
},
"oTA3CurrentVersion": {
"access": "read",
"type": "string"
},
"oTA3LastResult": {
"access": "read",
"type": "string",
"values": {
"BKP_BUNDLE_CRC_ERROR": {},
"BKP_BUNDLE_INCOMPATIBLE": {},
"BKP_BUNDLE_MALFORMED": {},
"BKP_BUNDLE_MISSING": {},
"BKP_BUNDLE_PROG_ATTEMPS_OVERRUN": {},
"ERROR_APPLIANCE_ABORTED": {},
"ERROR_BACKUP_RESTORED": {},
"ERROR_TIMEOUT_FINALIZATION": {},
"ERROR_TIMEOUT_GENERIC": {},
"ERROR_TIMEOUT_MACHINE_READY_WAIT": {},
"ERROR_TIMEOUT_PROGRAMMING": {},
"ERROR_TIMEOUT_SYSTEM_READY_WAIT": {},
"NEW_BUNDLE_CRC_ERROR": {},
"NEW_BUNDLE_INCOMPATIBLE": {},
"NEW_BUNDLE_MALFORMED": {},
"NEW_BUNDLE_MISSING": {},
"NEW_BUNDLE_PROG_ATTEMPS_OVERRUN": {},
"NONE": {},
"PROGRAMMING_EB_NOT_IN_BOOT": {},
"PROGRAMMING_EXECUTION": {},
"SUCCESS": {}
}
},
"oTA3State": {
"access": "read",
"type": "string",
"values": {
"DOWNLOAD": {},
"FINALIZATION": {},
"IDLE": {},
"PROGRAMMING": {},
"SYSTEM_READY": {},
"UNKNOWN": {},
"UNSUPPORTED": {},
"UPDATE_CHECK": {},
"WAIT_MACHINE_READY": {},
"WAIT_USER_AUTH": {}
}
},
"oTA3TargetVersion": {
"access": "read",
"type": "string"
},
"otaState": {
"access": "read",
"type": "string",
"values": {
"DESCRIPTION_AVAILABLE": {},
"DESCRIPTION_DOWNLOADING": {},
"DESCRIPTION_READY": {},
"FW_DOWNLOADING": {},
"FW_DOWNLOAD_START": {},
"FW_SIGNATURE_CHECK": {},
"FW_UPDATE_IN_PROGRESS": {},
"IDLE": {},
"READY_TO_UPDATE": {},
"UPDATE_ABORT": {},
"UPDATE_CHECK": {},
"UPDATE_ERROR": {},
"UPDATE_OK": {},
"WAITINGFORAUTHORIZATION": {}
}
},
"startUpCommand": {
"access": "write",
"type": "string",
"values": {
"UNINSTALL": {}
}
},
"swAncAndRevision": {
"access": "read",
"type": "string"
},
"swVersion": {
"access": "read",
"type": "string"
}
},
"remoteControl": {
"access": "read",
"type": "string",
"values": {
"DISABLED": {},
"ENABLED": {},
"NOT_SAFETY_RELEVANT_ENABLED": {},
"TEMPORARY_LOCKED": {}
}
},
"uiLockMode": {
"access": "read",
"type": "boolean",
"values": {
"OFF": {},
"ON": {}
}
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,56 @@
{
"applianceId": "999011403_00:20220412-443E07022463",
"connectionState": "disconnected",
"status": "enabled",
"properties": {
"reported": {
"applianceInfo": {
"applianceType": "CR",
"capabilityHash": "bf87e5b776236bf693664d892f1eeebef672df3ab1d0a56e7479ec1ece8932c4"
},
"fridge": {
"applianceState": "RUNNING",
"fanState": "ON",
"doorState": "CLOSED",
"targetTemperatureF": 39.2,
"targetTemperatureC": 4,
"fastMode": "OFF",
"alerts": []
},
"applianceUiSwVersion": "v4.0.4",
"uiLockMode": false,
"cpv": "00",
"vacationHolidayMode": "OFF",
"applianceMode": "NORMAL",
"applianceMainBoardSwVersion": "v39.00.00",
"coolingValveState": "1",
"alerts": [
{
"severity": "WARNING",
"acknowledgeStatus": "NOT_NEEDED",
"code": "AIR_SENSOR_BROKEN",
"applianceCode": "6"
}
],
"networkInterface": {
"linkQualityIndicator": "VERY_GOOD",
"otaState": "IDLE",
"swVersion": "v1.9.2_hacl",
"niuSwUpdateCurrentDescription": "A16323312A-S00006975A",
"swAncAndRevision": "S00006975A"
},
"freezer": {
"fastMode": "OFF",
"applianceState": "RUNNING",
"fanState": "OFF",
"doorState": "CLOSED",
"targetTemperatureF": -0.3999999999999986,
"targetTemperatureC": -18,
"alerts": []
},
"reminderTime": -1,
"connectivityState": "disconnected",
"energySavingMode": "OFF"
}
}
}
@@ -0,0 +1,88 @@
{
"applianceId": "999008105_00:99010299-443E074B7A6E",
"connectionState": "connected",
"status": "enabled",
"properties": {
"reported": {
"applianceInfo": {
"applianceType": "HD",
"capabilityHash": "5ac0f7e099cfaa217c694cb69edd604d94c31892c11f183049e10d1eebc91a1f"
},
"hoodCharcFilterTimer": 457200,
"hoodFilterCharcEnable": "ON",
"humanCentricLightEventState": "OFF",
"hoodFanLevel": "OFF",
"tvocFilterTime": 918000,
"remoteControl": "ENABLED",
"cpv": "00",
"humanCentricLightEventSettings": {
"0": {
"lightIntensityPrc": 62,
"startTimeMinutes": 5,
"lightColorPrc": 100,
"startTimeHour": 10
},
"1": {
"lightIntensityPrc": 100,
"startTimeMinutes": 20,
"lightColorPrc": 40,
"startTimeHour": 10
},
"2": {
"lightIntensityPrc": 100,
"startTimeMinutes": 35,
"lightColorPrc": 100,
"startTimeHour": 10
},
"3": {
"lightIntensityPrc": 50,
"startTimeMinutes": 0,
"lightColorPrc": 30,
"startTimeHour": 11
},
"4": {
"lightIntensityPrc": 70,
"startTimeMinutes": 0,
"lightColorPrc": 70,
"startTimeHour": 13
},
"5": {
"lightIntensityPrc": 69,
"startTimeMinutes": 30,
"lightColorPrc": 40,
"startTimeHour": 13
},
"6": {
"lightIntensityPrc": 50,
"startTimeMinutes": 0,
"lightColorPrc": 69,
"startTimeHour": 14
}
},
"applianceState": "IDLE",
"applianceMode": "NORMAL",
"applianceLocalTimeOffset": 7200,
"hoodGreaseFilterTimer": 424800,
"lightIntensity": 0,
"localTimeAutomaticMode": "AUTOMATIC",
"alerts": [],
"lightColorTemperature": 0,
"soundVolume": 0,
"hoodFilterCharcIndication": false,
"networkInterface": {
"swVersion": "v4.0.0S_argo",
"otaState": "IDLE",
"autoLocalTimeOffset": 7200,
"niuSwUpdateCurrentDescription": "A23642205A-S00008458A",
"timeZoneDatabaseName": "Europe/Stockholm",
"swAncAndRevision": "S00008458A",
"linkQualityIndicator": "EXCELLENT"
},
"targetDuration": 0,
"hoodFilterGreaseIndication": "TRUE",
"connectivityState": "connected",
"hoodAutoSwitchOffEvent": false,
"timeToEnd": 0
}
}
}
@@ -0,0 +1,65 @@
{
"applianceId": "999008120_00:99907833-443E073D986E",
"connectionState": "connected",
"status": "enabled",
"properties": {
"reported": {
"oTA3TargetVersion": "S000412012A\u0000",
"applianceInfo": {
"capabilityHash": "6e7da5a7b8b39c99b9b08dd5b2e0f834885fc473832414e05ef3d31da0a5440d",
"applianceType": "HB"
},
"oTA3CurrentVersion": "S0004120121\u0000",
"remoteControl": "NOT_SAFETY_RELEVANT_ENABLED",
"oTA3State": "IDLE",
"cpv": "00",
"applianceState": "OFF",
"hobHood": {
"hoodDryingCycle": "OFF",
"hobToHoodState": "MANUAL",
"hoodFilterCharcIndication": false,
"hobToHoodFanSpeed": "OFF",
"windowNotification": "OPENING_REQUIRED",
"hobToHoodMode": "H3",
"hoodFilterGreaseIndication": false
},
"alerts": [],
"oTA3LastResult": "NONE",
"networkInterface": {
"swVersion": "v4.8.06rc2_argo",
"otaState": "IDLE",
"autoLocalTimeOffset": 7200,
"niuSwUpdateCurrentDescription": "A24559615A-S00031110B",
"timeZoneDatabaseName": "Europe/Stockholm",
"swAncAndRevision": "S00031110B",
"linkQualityIndicator": "VERY_GOOD",
"oTA3TargetVersion": "S000412012A\u0000",
"oTA3LastResult": "NONE",
"oTA3CurrentVersion": "S0004120121\u0000",
"oTA3State": "IDLE"
},
"childLock": false,
"hobZone2": {
"residualHeatState": "NO",
"heatingQualitativeLevel": 0,
"hobPotDetected": "NO_POT_IDLE"
},
"hobZone1": {
"residualHeatState": "NO",
"heatingQualitativeLevel": 0,
"hobPotDetected": "NO_POT_IDLE"
},
"hobZone4": {
"residualHeatState": "NO",
"heatingQualitativeLevel": 0,
"hobPotDetected": "NO_POT_IDLE"
},
"hobZone3": {
"residualHeatState": "NO",
"heatingQualitativeLevel": 0,
"hobPotDetected": "NO_POT_IDLE"
},
"connectivityState": "connected"
}
}
}
@@ -0,0 +1,87 @@
{
"applianceId": "944035064_00:27032025-443E073D97B2",
"connectionState": "connected",
"status": "enabled",
"properties": {
"reported": {
"cleaningReminder": true,
"displayLight": "DISPLAY_LIGHT_3",
"temperatureRepresentation": "CELSIUS",
"remoteControl": "ENABLED",
"language": "ENGLISH",
"clockStyle": "NOT_SELECTED",
"localTimeAutomaticMode": "MANUAL",
"soundVolume": 2,
"keySoundTone": "CLICK",
"upperOven": {
"applianceState": "READY_TO_START",
"doorState": "CLOSED",
"targetTemperatureF": 356,
"targetTemperatureC": 180,
"runningTime": -2147483648,
"program": "STEAMIFY",
"executeCommand": "STOPRESET",
"targetMicrowavePower": 0,
"waterTankLevel": "OK",
"foodProbeInsertionState": "NOT_INSERTED",
"cavityLight": false,
"targetDuration": 0,
"startTime": -2147483648,
"waterTrayInsertionState": "INSERTED",
"reminderTime": -2147483648,
"fastHeatUpFeature": "DISABLED",
"messageQueueSync": {
"activeMessageIndex": 0,
"messageBehaviour": "INVALID",
"messageQueueId": 0,
"messageQueueType": "INVALID"
},
"favoriteSelect": "255",
"processPhase": "NONE",
"displayTemperatureC": 30,
"displayTemperatureF": 86,
"displayFoodProbeTemperatureC": null,
"displayFoodProbeTemperatureF": null,
"timeToEnd": 3599
},
"waterHardness": "STEP_4",
"oTA3TargetVersion": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"applianceInfo": {
"applianceType": "SO",
"capabilityHash": "4d0d5929a62cb8772f346348875e59bd758a3a88e247f39fc1c607e258cbbc00"
},
"oTA3CurrentVersion": "S0005330604\u0000",
"applianceUiConfigVersion": "Oven_C000000062_0.0.31",
"cpv": "03",
"oTA3State": "IDLE",
"applianceState": "OFF",
"applianceLocalTimeOffset": -417172230,
"favoriteSelect": "255",
"alerts": [],
"oTA3LastResult": "NONE",
"fastHeatUpFeature": "DISABLED",
"networkInterface": {
"swVersion": "v4.6.06_argo",
"otaState": "IDLE",
"autoLocalTimeOffset": 7200,
"niuSwUpdateCurrentDescription": "A24559613B-S00031107A",
"timeZoneDatabaseName": "Europe/Stockholm",
"swAncAndRevision": "S00031107A",
"linkQualityIndicator": "VERY_GOOD",
"oTA3TargetVersion": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"oTA3LastResult": "NONE",
"oTA3CurrentVersion": "S0005330604\u0000",
"oTA3State": "IDLE"
},
"childLock": false,
"descalingReminderState": false,
"connectivityState": "connected",
"messageQueueSync": {
"activeMessageIndex": 0,
"messageBehaviour": "INVALID",
"messageQueueId": 0,
"messageQueueType": "INVALID"
}
}
}
}
@@ -0,0 +1,54 @@
{
"applianceId": "999120000_00:74852244-443E0704101F",
"connectionState": "disconnected",
"status": "enabled",
"properties": {
"reported": {
"waterHardness": "MEDIUM",
"applianceInfo": {
"applianceType": "TD",
"capabilityHash": "e3f20b48d86da2cc3f492406af903a7597349e7d5777c09612efadfcac84ab9d"
},
"timeToEnd": 2040,
"doorState": "OPEN",
"miscellaneous": {},
"applianceUiSwVersion": "UDA1MC07",
"uiLockMode": false,
"applianceTotalWorkingTime": 0,
"remoteControl": "NOT_SAFETY_RELEVANT_ENABLED",
"cpv": "00",
"language": "ENGLISH",
"applianceState": "OFF",
"dryingNominalLoadWeight": 65535,
"applianceMode": "NORMAL",
"applianceMainBoardSwVersion": "TRB40034",
"totalCycleCounter": 0,
"measuredLoadWeight": 65535,
"alerts": [],
"cyclePhase": "UNAVAILABLE",
"networkInterface": {
"otaState": "IDLE",
"swVersion": "v5.4.0",
"linkQualityIndicator": "VERY_GOOD",
"niuSwUpdateCurrentDescription": "A07491702B-S00006963A",
"swAncAndRevision": "S00006963A"
},
"endOfCycleSound": "NO_SOUND",
"startTime": -1,
"userSelections": {
"reversePlus": false,
"tDEconomy_Eco": true,
"humidityTarget": "CUPBOARD",
"refresh": false,
"drynessValue": "MINIMUM",
"programUID": "SILK_DRY_PR_SILK",
"antiCreaseValue": 120,
"tDEconomy_Night": false,
"dryingTime": 0,
"tDEconomy_Quick": false,
"steamValue": "STEAM_OFF"
},
"connectivityState": "disconnected"
}
}
}
@@ -0,0 +1,6 @@
{
"applianceId": "999011403_00:20220412-443E07022463",
"applianceName": "Ayran",
"applianceType": "CR",
"created": "2025-03-06T10:00:57.477+00:00"
}
@@ -0,0 +1,6 @@
{
"applianceId": "999008105_00:99010299-443E074B7A6E",
"applianceName": "Ceiling Hood",
"applianceType": "HD",
"created": "2024-11-14T03:27:20.672+00:00"
}
@@ -0,0 +1,6 @@
{
"applianceId": "999008120_00:99907833-443E073D986E",
"applianceName": "Peacock hob",
"applianceType": "HB",
"created": "2025-08-12T07:29:55.249+00:00"
}
@@ -0,0 +1,6 @@
{
"applianceId": "944035064_00:27032025-443E073D97B2",
"applianceName": "Supex oven",
"applianceType": "SO",
"created": "2026-03-23T08:14:42.975+00:00"
}
@@ -0,0 +1,6 @@
{
"applianceId": "999120000_00:74852244-443E0704101F",
"applianceName": "Dryer",
"applianceType": "TD",
"created": "2025-12-10T15:14:32.043+00:00"
}
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,35 @@
# serializer version: 1
# name: test_all_appliances[ayran_fridge]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'electrolux',
'999011403_00:20220412-443E07022463',
),
}),
'labels': set({
}),
'manufacturer': 'AEG',
'model': 'RCB732E9MX',
'model_id': None,
'name': 'Ayran',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': '20220412',
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_all_appliances[fenix_oven]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -30,6 +61,68 @@
'via_device_id': None,
})
# ---
# name: test_all_appliances[hood]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'electrolux',
'999008105_00:99010299-443E074B7A6E',
),
}),
'labels': set({
}),
'manufacturer': 'AEG',
'model': 'DDC8271W',
'model_id': None,
'name': 'Ceiling Hood',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': '99010299',
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_all_appliances[peacock_hob]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'electrolux',
'999008120_00:99907833-443E073D986E',
),
}),
'labels': set({
}),
'manufacturer': 'AEG',
'model': 'TU84CF43CB',
'model_id': None,
'name': 'Peacock hob',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': '99907833',
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_all_appliances[pux_oven]
DeviceRegistryEntrySnapshot({
'area_id': None,
@@ -61,3 +154,65 @@
'via_device_id': None,
})
# ---
# name: test_all_appliances[supex_structured_oven]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'electrolux',
'944035064_00:27032025-443E073D97B2',
),
}),
'labels': set({
}),
'manufacturer': 'AEG',
'model': 'NBP9S831AB',
'model_id': None,
'name': 'Supex oven',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': '27032025',
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_all_appliances[tumble_dryer]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'electrolux',
'999120000_00:74852244-443E0704101F',
),
}),
'labels': set({
}),
'manufacturer': 'ELECTROLUX',
'model': 'EW9H778P9',
'model_id': None,
'name': 'Dryer',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': '74852244',
'sw_version': None,
'via_device_id': None,
})
# ---
@@ -0,0 +1,36 @@
"""Binary sensor tests of Electrolux integration."""
from collections.abc import Generator
from unittest.mock import patch
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import setup_integration
from tests.common import MockConfigEntry, snapshot_platform
@pytest.fixture(autouse=True)
def override_platforms() -> Generator[None]:
"""Override PLATFORMS."""
with patch(
"homeassistant.components.electrolux.PLATFORMS", [Platform.BINARY_SENSOR]
):
yield
@pytest.mark.usefixtures("appliances")
async def test_binary_sensor(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
snapshot: SnapshotAssertion,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test states of the sensor."""
await setup_integration(hass, mock_config_entry)
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)