From f210bb35ed9a829d930b80ff2a821f872ffea3b4 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 16 Oct 2025 00:21:15 -0500 Subject: [PATCH 01/10] Bump aioesphomeapi to 42.0.0 (#154577) --- homeassistant/components/esphome/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/esphome/manifest.json b/homeassistant/components/esphome/manifest.json index 48e98303dfdc2d..232b8615457cbd 100644 --- a/homeassistant/components/esphome/manifest.json +++ b/homeassistant/components/esphome/manifest.json @@ -17,7 +17,7 @@ "mqtt": ["esphome/discover/#"], "quality_scale": "platinum", "requirements": [ - "aioesphomeapi==41.16.0", + "aioesphomeapi==42.0.0", "esphome-dashboard-api==1.3.0", "bleak-esphome==3.4.0" ], diff --git a/requirements_all.txt b/requirements_all.txt index 215aa00b4adeef..9cc52ce890f003 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -256,7 +256,7 @@ aioelectricitymaps==1.1.1 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==41.16.0 +aioesphomeapi==42.0.0 # homeassistant.components.flo aioflo==2021.11.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index fef4675fbff431..ee65eeb0ed651e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -244,7 +244,7 @@ aioelectricitymaps==1.1.1 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==41.16.0 +aioesphomeapi==42.0.0 # homeassistant.components.flo aioflo==2021.11.0 From 9efbcb2f82cf6e65b56672a90fdab48bdcbc35f3 Mon Sep 17 00:00:00 2001 From: Jordan Harvey Date: Thu, 16 Oct 2025 07:46:29 +0100 Subject: [PATCH 02/10] Add model information for probe_plus devices (#154262) --- homeassistant/components/probe_plus/__init__.py | 8 +++++++- homeassistant/components/probe_plus/config_flow.py | 5 +++-- homeassistant/components/probe_plus/entity.py | 2 ++ tests/components/probe_plus/test_config_flow.py | 8 +++----- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/probe_plus/__init__.py b/homeassistant/components/probe_plus/__init__.py index be1faf4a297df9..0d29fb86b59dbf 100644 --- a/homeassistant/components/probe_plus/__init__.py +++ b/homeassistant/components/probe_plus/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations -from homeassistant.const import Platform +from homeassistant.const import CONF_MODEL, Platform from homeassistant.core import HomeAssistant from .coordinator import ProbePlusConfigEntry, ProbePlusDataUpdateCoordinator @@ -12,6 +12,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ProbePlusConfigEntry) -> bool: """Set up Probe Plus from a config entry.""" + # Perform a migration to ensure the model is added to the config entry schema. + if CONF_MODEL not in entry.data: + # The config entry adds the model number of the device to the start of its title + hass.config_entries.async_update_entry( + entry, data={**entry.data, CONF_MODEL: entry.title.split(" ")[0]} + ) coordinator = ProbePlusDataUpdateCoordinator(hass, entry) await coordinator.async_config_entry_first_refresh() entry.runtime_data = coordinator diff --git a/homeassistant/components/probe_plus/config_flow.py b/homeassistant/components/probe_plus/config_flow.py index 1e9a858e9fca40..cb87c348cd4483 100644 --- a/homeassistant/components/probe_plus/config_flow.py +++ b/homeassistant/components/probe_plus/config_flow.py @@ -13,7 +13,7 @@ async_discovered_service_info, ) from homeassistant.config_entries import ConfigFlow, ConfigFlowResult -from homeassistant.const import CONF_ADDRESS +from homeassistant.const import CONF_ADDRESS, CONF_MODEL from .const import DOMAIN @@ -73,6 +73,7 @@ async def async_step_bluetooth_confirm( title=discovery.title, data={ CONF_ADDRESS: discovery.discovery_info.address, + CONF_MODEL: discovery.discovery_info.name, }, ) self._set_confirm_only() @@ -95,7 +96,7 @@ async def async_step_user( discovery = self._discovered_devices[address] return self.async_create_entry( title=discovery.title, - data=user_input, + data={**user_input, CONF_MODEL: discovery.discovery_info.name}, ) current_addresses = self._async_current_ids() diff --git a/homeassistant/components/probe_plus/entity.py b/homeassistant/components/probe_plus/entity.py index c2c53f5bca4df1..a2c3c543d4720e 100644 --- a/homeassistant/components/probe_plus/entity.py +++ b/homeassistant/components/probe_plus/entity.py @@ -4,6 +4,7 @@ from pyprobeplus import ProbePlusDevice +from homeassistant.const import CONF_MODEL from homeassistant.helpers.device_registry import ( CONNECTION_BLUETOOTH, DeviceInfo, @@ -40,6 +41,7 @@ def __init__( name=coordinator.device.name, manufacturer="Probe Plus", suggested_area="Kitchen", + model=coordinator.config_entry.data.get(CONF_MODEL), connections={(CONNECTION_BLUETOOTH, coordinator.device.mac)}, ) diff --git a/tests/components/probe_plus/test_config_flow.py b/tests/components/probe_plus/test_config_flow.py index 1d2481443116f7..cae87f4b9e5ad7 100644 --- a/tests/components/probe_plus/test_config_flow.py +++ b/tests/components/probe_plus/test_config_flow.py @@ -7,7 +7,7 @@ from homeassistant.components.probe_plus.const import DOMAIN from homeassistant.config_entries import SOURCE_BLUETOOTH, SOURCE_USER -from homeassistant.const import CONF_ADDRESS +from homeassistant.const import CONF_ADDRESS, CONF_MODEL from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResultType from homeassistant.helpers.service_info.bluetooth import BluetoothServiceInfo @@ -57,7 +57,7 @@ async def test_user_config_flow_creates_entry( assert result["type"] is FlowResultType.CREATE_ENTRY assert result["result"].unique_id == "aa:bb:cc:dd:ee:ff" assert result["title"] == "FM210 aa:bb:cc:dd:ee:ff" - assert result["data"] == {CONF_ADDRESS: "aa:bb:cc:dd:ee:ff"} + assert result["data"] == {CONF_ADDRESS: "aa:bb:cc:dd:ee:ff", CONF_MODEL: "FM210"} async def test_user_flow_already_configured( @@ -97,9 +97,7 @@ async def test_bluetooth_discovery( assert result["type"] is FlowResultType.CREATE_ENTRY assert result["title"] == "FM210 aa:bb:cc:dd:ee:ff" assert result["result"].unique_id == "aa:bb:cc:dd:ee:ff" - assert result["data"] == { - CONF_ADDRESS: service_info.address, - } + assert result["data"] == {CONF_ADDRESS: service_info.address, CONF_MODEL: "FM210"} async def test_already_configured_bluetooth_discovery( From 0d2558c0308a4c1087887f020f4b82263da298cb Mon Sep 17 00:00:00 2001 From: Kinachi249 <69488840+Kinachi249@users.noreply.github.com> Date: Thu, 16 Oct 2025 01:48:31 -0500 Subject: [PATCH 03/10] Implement cync reauth flow (#154257) --- homeassistant/components/cync/config_flow.py | 113 +++++++++++----- .../components/cync/quality_scale.yaml | 2 +- homeassistant/components/cync/strings.json | 16 ++- tests/components/cync/const.py | 7 + tests/components/cync/test_config_flow.py | 127 +++++++++++++++++- 5 files changed, 227 insertions(+), 38 deletions(-) diff --git a/homeassistant/components/cync/config_flow.py b/homeassistant/components/cync/config_flow.py index b10f1c03cc384d..23359697ff6196 100644 --- a/homeassistant/components/cync/config_flow.py +++ b/homeassistant/components/cync/config_flow.py @@ -2,6 +2,7 @@ from __future__ import annotations +from collections.abc import Mapping import logging from typing import Any @@ -9,7 +10,7 @@ from pycync.exceptions import AuthFailedError, CyncError, TwoFactorRequiredError import voluptuous as vol -from homeassistant.config_entries import ConfigFlow, ConfigFlowResult +from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_EMAIL, CONF_PASSWORD from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -39,7 +40,7 @@ class CyncConfigFlow(ConfigFlow, domain=DOMAIN): VERSION = 1 - cync_auth: Auth + cync_auth: Auth = None async def async_step_user( self, user_input: dict[str, Any] | None = None @@ -47,29 +48,14 @@ async def async_step_user( """Attempt login with user credentials.""" errors: dict[str, str] = {} - if user_input is None: - return self.async_show_form( - step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors - ) + if user_input: + try: + errors = await self._validate_credentials(user_input) + except TwoFactorRequiredError: + return await self.async_step_two_factor() - self.cync_auth = Auth( - async_get_clientsession(self.hass), - username=user_input[CONF_EMAIL], - password=user_input[CONF_PASSWORD], - ) - try: - await self.cync_auth.login() - except AuthFailedError: - errors["base"] = "invalid_auth" - except TwoFactorRequiredError: - return await self.async_step_two_factor() - except CyncError: - errors["base"] = "cannot_connect" - except Exception: - _LOGGER.exception("Unexpected exception") - errors["base"] = "unknown" - else: - return await self._create_config_entry(self.cync_auth.username) + if not errors: + return await self._create_config_entry(self.cync_auth.username) return self.async_show_form( step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors @@ -81,12 +67,65 @@ async def async_step_two_factor( """Attempt login with the two factor auth code sent to the user.""" errors: dict[str, str] = {} - if user_input is None: + if user_input: + errors = await self._validate_credentials(user_input) + + if not errors: + return await self._create_config_entry(self.cync_auth.username) + return self.async_show_form( - step_id="two_factor", data_schema=STEP_TWO_FACTOR_SCHEMA, errors=errors + step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors + ) + + return self.async_show_form( + step_id="two_factor", data_schema=STEP_TWO_FACTOR_SCHEMA, errors=errors + ) + + async def async_step_reauth( + self, entry_data: Mapping[str, Any] + ) -> ConfigFlowResult: + """Perform reauth upon an API authentication error.""" + return await self.async_step_reauth_confirm() + + async def async_step_reauth_confirm( + self, user_input: dict[str, Any] | None = None + ) -> ConfigFlowResult: + """Dialog that informs the user that reauth is required and prompts for their Cync credentials.""" + errors: dict[str, str] = {} + + reauth_entry = self._get_reauth_entry() + + if user_input: + try: + errors = await self._validate_credentials(user_input) + except TwoFactorRequiredError: + return await self.async_step_two_factor() + + if not errors: + return await self._create_config_entry(self.cync_auth.username) + + return self.async_show_form( + step_id="reauth_confirm", + data_schema=STEP_USER_DATA_SCHEMA, + errors=errors, + description_placeholders={CONF_EMAIL: reauth_entry.title}, + ) + + async def _validate_credentials(self, user_input: dict[str, Any]) -> dict[str, str]: + """Attempt to log in with user email and password, and return the error dict.""" + errors: dict[str, str] = {} + + if not self.cync_auth: + self.cync_auth = Auth( + async_get_clientsession(self.hass), + username=user_input[CONF_EMAIL], + password=user_input[CONF_PASSWORD], ) + try: - await self.cync_auth.login(user_input[CONF_TWO_FACTOR_CODE]) + await self.cync_auth.login(user_input.get(CONF_TWO_FACTOR_CODE)) + except TwoFactorRequiredError: + raise except AuthFailedError: errors["base"] = "invalid_auth" except CyncError: @@ -94,25 +133,29 @@ async def async_step_two_factor( except Exception: _LOGGER.exception("Unexpected exception") errors["base"] = "unknown" - else: - return await self._create_config_entry(self.cync_auth.username) - return self.async_show_form( - step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors - ) + return errors async def _create_config_entry(self, user_email: str) -> ConfigFlowResult: """Create the Cync config entry using input user data.""" cync_user = self.cync_auth.user await self.async_set_unique_id(str(cync_user.user_id)) - self._abort_if_unique_id_configured() - config = { + config_data = { CONF_USER_ID: cync_user.user_id, CONF_AUTHORIZE_STRING: cync_user.authorize, CONF_EXPIRES_AT: cync_user.expires_at, CONF_ACCESS_TOKEN: cync_user.access_token, CONF_REFRESH_TOKEN: cync_user.refresh_token, } - return self.async_create_entry(title=user_email, data=config) + + if self.source == SOURCE_REAUTH: + self._abort_if_unique_id_mismatch() + return self.async_update_reload_and_abort( + entry=self._get_reauth_entry(), title=user_email, data=config_data + ) + + self._abort_if_unique_id_configured() + + return self.async_create_entry(title=user_email, data=config_data) diff --git a/homeassistant/components/cync/quality_scale.yaml b/homeassistant/components/cync/quality_scale.yaml index 7e106cdd49e616..50bb413deb003a 100644 --- a/homeassistant/components/cync/quality_scale.yaml +++ b/homeassistant/components/cync/quality_scale.yaml @@ -37,7 +37,7 @@ rules: integration-owner: done log-when-unavailable: todo parallel-updates: todo - reauthentication-flow: todo + reauthentication-flow: done test-coverage: todo # Gold diff --git a/homeassistant/components/cync/strings.json b/homeassistant/components/cync/strings.json index 0515c053cfcaa5..b5dc72500c3d71 100644 --- a/homeassistant/components/cync/strings.json +++ b/homeassistant/components/cync/strings.json @@ -18,6 +18,18 @@ "data_description": { "two_factor_code": "The two-factor code sent to your Cync account's email" } + }, + "reauth_confirm": { + "title": "[%key:common::config_flow::title::reauth%]", + "description": "The Cync integration needs to re-authenticate for {email}", + "data": { + "email": "[%key:common::config_flow::data::email%]", + "password": "[%key:common::config_flow::data::password%]" + }, + "data_description": { + "email": "[%key:component::cync::config::step::user::data_description::email%]", + "password": "[%key:component::cync::config::step::user::data_description::password%]" + } } }, "error": { @@ -26,7 +38,9 @@ "unknown": "[%key:common::config_flow::error::unknown%]" }, "abort": { - "already_configured": "[%key:common::config_flow::abort::already_configured_account%]" + "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", + "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", + "unique_id_mismatch": "An incorrect user was provided by Cync for your email address, please consult your Cync app" } } } diff --git a/tests/components/cync/const.py b/tests/components/cync/const.py index 79f7e8b8b21531..b35eb9a75028a9 100644 --- a/tests/components/cync/const.py +++ b/tests/components/cync/const.py @@ -11,4 +11,11 @@ 123456789, expires_at=(time.time() * 1000) + 3600000, ) +SECOND_MOCKED_USER = pycync.User( + "test_token_2", + "test_refresh_token_2", + "test_authorize_string_2", + 987654321, + expires_at=(time.time() * 1000) + 3600000, +) MOCKED_EMAIL = "test@testuser.com" diff --git a/tests/components/cync/test_config_flow.py b/tests/components/cync/test_config_flow.py index 28f0aee09daccf..25c94c303f5765 100644 --- a/tests/components/cync/test_config_flow.py +++ b/tests/components/cync/test_config_flow.py @@ -18,7 +18,7 @@ from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResultType -from .const import MOCKED_EMAIL, MOCKED_USER +from .const import MOCKED_EMAIL, MOCKED_USER, SECOND_MOCKED_USER from tests.common import MockConfigEntry @@ -98,6 +98,74 @@ async def test_form_two_factor_success( assert len(mock_setup_entry.mock_calls) == 1 +async def test_form_reauth_success( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_setup_entry: AsyncMock, + auth_client: MagicMock, +) -> None: + """Test we handle re-authentication with two-factor.""" + mock_config_entry.add_to_hass(hass) + result = await mock_config_entry.start_reauth_flow(hass) + assert result["step_id"] == "reauth_confirm" + + auth_client.login.side_effect = TwoFactorRequiredError + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + CONF_EMAIL: MOCKED_EMAIL, + CONF_PASSWORD: "test-password", + }, + ) + + assert result["type"] is FlowResultType.FORM + assert result["errors"] == {} + assert result["step_id"] == "two_factor" + + # Enter two factor code + auth_client.login.side_effect = None + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + CONF_TWO_FACTOR_CODE: "123456", + }, + ) + + assert result["type"] is FlowResultType.ABORT + assert result["reason"] == "reauth_successful" + assert mock_config_entry.data == { + CONF_USER_ID: MOCKED_USER.user_id, + CONF_AUTHORIZE_STRING: "test_authorize_string", + CONF_EXPIRES_AT: ANY, + CONF_ACCESS_TOKEN: "test_token", + CONF_REFRESH_TOKEN: "test_refresh_token", + } + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_reauth_unique_id_mismatch( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + auth_client: MagicMock, +) -> None: + """Test we handle a unique ID mismatch when re-authenticating.""" + mock_config_entry.add_to_hass(hass) + result = await mock_config_entry.start_reauth_flow(hass) + assert result["step_id"] == "reauth_confirm" + + auth_client.user = SECOND_MOCKED_USER + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + CONF_EMAIL: MOCKED_EMAIL, + CONF_PASSWORD: "test-password", + }, + ) + + assert result["type"] is FlowResultType.ABORT + assert result["reason"] == "unique_id_mismatch" + + async def test_form_unique_id_already_exists( hass: HomeAssistant, mock_config_entry: MockConfigEntry ) -> None: @@ -258,3 +326,60 @@ async def test_form_errors( } assert result["result"].unique_id == str(MOCKED_USER.user_id) assert len(mock_setup_entry.mock_calls) == 1 + + +@pytest.mark.parametrize( + ("error_type", "error_string"), + [ + (AuthFailedError, "invalid_auth"), + (CyncError, "cannot_connect"), + (Exception, "unknown"), + ], +) +async def test_form_reauth_errors( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_setup_entry: AsyncMock, + auth_client: MagicMock, + error_type: Exception, + error_string: str, +) -> None: + """Test we handle errors in the reauth flow.""" + mock_config_entry.add_to_hass(hass) + result = await mock_config_entry.start_reauth_flow(hass) + assert result["step_id"] == "reauth_confirm" + + auth_client.login.side_effect = error_type + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + CONF_EMAIL: MOCKED_EMAIL, + CONF_PASSWORD: "test-password", + }, + ) + + assert result["type"] is FlowResultType.FORM + assert result["errors"] == {"base": error_string} + assert result["step_id"] == "reauth_confirm" + + # Make sure the config flow tests finish with FlowResultType.ABORT so + # we can show the config flow is able to recover from an error. + auth_client.login.side_effect = None + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + CONF_EMAIL: MOCKED_EMAIL, + CONF_PASSWORD: "test-password", + }, + ) + + assert result["type"] is FlowResultType.ABORT + assert result["reason"] == "reauth_successful" + assert mock_config_entry.data == { + CONF_USER_ID: MOCKED_USER.user_id, + CONF_AUTHORIZE_STRING: "test_authorize_string", + CONF_EXPIRES_AT: ANY, + CONF_ACCESS_TOKEN: "test_token", + CONF_REFRESH_TOKEN: "test_refresh_token", + } + assert len(mock_setup_entry.mock_calls) == 1 From 3de62b2b4c2269e688753cbdb1ccd9c21d31880f Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 16 Oct 2025 09:15:35 +0200 Subject: [PATCH 04/10] Improve mobile_app device_tracker tests (#154584) Co-authored-by: Martin Hjelmare --- .../mobile_app/test_device_tracker.py | 146 +++++++++++++++--- 1 file changed, 124 insertions(+), 22 deletions(-) diff --git a/tests/components/mobile_app/test_device_tracker.py b/tests/components/mobile_app/test_device_tracker.py index bc744e05f4328e..6272b0ea8935fd 100644 --- a/tests/components/mobile_app/test_device_tracker.py +++ b/tests/components/mobile_app/test_device_tracker.py @@ -4,15 +4,111 @@ from typing import Any from aiohttp.test_utils import TestClient +import pytest +from homeassistant.components import zone from homeassistant.const import Platform from homeassistant.core import HomeAssistant +from homeassistant.setup import async_setup_component +@pytest.fixture +async def setup_zone(hass: HomeAssistant) -> None: + """Set up a zone for testing.""" + await async_setup_component( + hass, + zone.DOMAIN, + { + "zone": [ + { + "name": "Home", + "latitude": 10.0, + "longitude": 20.0, + "radius": 250, + }, + { + "name": "Office", + "latitude": 20.0, + "longitude": 30.0, + "radius": 250, + }, + { + "name": "School", + "latitude": 30.0, + "longitude": 40.0, + "radius": 250, + }, + ] + }, + ) + await hass.async_block_till_done() + + +@pytest.mark.usefixtures("setup_zone") +@pytest.mark.parametrize( + ("extra_webhook_data", "expected_attributes", "expected_state"), + [ + # Send coordinates + location_name: Location name has precedence + ( + {"gps": [10, 20], "location_name": "home"}, + {"latitude": 10, "longitude": 20, "gps_accuracy": 30}, + "home", + ), + ( + {"gps": [20, 30], "location_name": "office"}, + {"latitude": 20, "longitude": 30, "gps_accuracy": 30}, + "office", + ), + ( + {"gps": [30, 40], "location_name": "school"}, + {"latitude": 30, "longitude": 40, "gps_accuracy": 30}, + "school", + ), + # Send wrong coordinates + location_name: Location name has precedence + ( + {"gps": [10, 10], "location_name": "home"}, + {"latitude": 10, "longitude": 10, "gps_accuracy": 30}, + "home", + ), + ( + {"gps": [10, 10], "location_name": "office"}, + {"latitude": 10, "longitude": 10, "gps_accuracy": 30}, + "office", + ), + ( + {"gps": [10, 10], "location_name": "school"}, + {"latitude": 10, "longitude": 10, "gps_accuracy": 30}, + "school", + ), + # Send location_name only + ({"location_name": "home"}, {}, "home"), + ({"location_name": "office"}, {}, "office"), + ({"location_name": "school"}, {}, "school"), + # Send coordinates only - location is determined by coordinates + ( + {"gps": [10, 20]}, + {"latitude": 10, "longitude": 20, "gps_accuracy": 30}, + "home", + ), + ( + {"gps": [20, 30]}, + {"latitude": 20, "longitude": 30, "gps_accuracy": 30}, + "Office", + ), + ( + {"gps": [30, 40]}, + {"latitude": 30, "longitude": 40, "gps_accuracy": 30}, + "School", + ), + ], +) async def test_sending_location( hass: HomeAssistant, create_registrations: tuple[dict[str, Any], dict[str, Any]], webhook_client: TestClient, + extra_webhook_data: dict[str, Any], + expected_attributes: dict[str, Any], + expected_state: str, ) -> None: """Test sending a location via a webhook.""" resp = await webhook_client.post( @@ -20,15 +116,14 @@ async def test_sending_location( json={ "type": "update_location", "data": { - "gps": [10, 20], "gps_accuracy": 30, "battery": 40, "altitude": 50, "course": 60, "speed": 70, "vertical_accuracy": 80, - "location_name": "bar", - }, + } + | extra_webhook_data, }, ) @@ -37,16 +132,20 @@ async def test_sending_location( state = hass.states.get("device_tracker.test_1_2") assert state is not None assert state.name == "Test 1" - assert state.state == "bar" - assert state.attributes["source_type"] == "gps" - assert state.attributes["latitude"] == 10 - assert state.attributes["longitude"] == 20 - assert state.attributes["gps_accuracy"] == 30 - assert state.attributes["battery_level"] == 40 - assert state.attributes["altitude"] == 50 - assert state.attributes["course"] == 60 - assert state.attributes["speed"] == 70 - assert state.attributes["vertical_accuracy"] == 80 + assert state.state == expected_state + assert ( + state.attributes + == { + "friendly_name": "Test 1", + "source_type": "gps", + "battery_level": 40, + "altitude": 50.0, + "course": 60, + "speed": 70, + "vertical_accuracy": 80, + } + | expected_attributes + ) resp = await webhook_client.post( f"/api/webhook/{create_registrations[1]['webhook_id']}", @@ -70,15 +169,18 @@ async def test_sending_location( state = hass.states.get("device_tracker.test_1_2") assert state is not None assert state.state == "not_home" - assert state.attributes["source_type"] == "gps" - assert state.attributes["latitude"] == 1 - assert state.attributes["longitude"] == 2 - assert state.attributes["gps_accuracy"] == 3 - assert state.attributes["battery_level"] == 4 - assert state.attributes["altitude"] == 5 - assert state.attributes["course"] == 6 - assert state.attributes["speed"] == 7 - assert state.attributes["vertical_accuracy"] == 8 + assert state.attributes == { + "friendly_name": "Test 1", + "source_type": "gps", + "latitude": 1.0, + "longitude": 2.0, + "gps_accuracy": 3, + "battery_level": 4, + "altitude": 5.0, + "course": 6, + "speed": 7, + "vertical_accuracy": 8, + } async def test_restoring_location( From 6bf7a4278e9e8003318363b1b3d9fdf5348c5b46 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 16 Oct 2025 09:35:53 +0200 Subject: [PATCH 05/10] Fix flaky playstation_network test (#154559) Co-authored-by: Joakim Plate --- .../playstation_network/test_init.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/components/playstation_network/test_init.py b/tests/components/playstation_network/test_init.py index 571808d17ff02f..8afea992ce79c0 100644 --- a/tests/components/playstation_network/test_init.py +++ b/tests/components/playstation_network/test_init.py @@ -130,7 +130,7 @@ async def test_trophy_title_coordinator( assert config_entry.state is ConfigEntryState.LOADED assert len(mock_psnawpapi.user.return_value.trophy_titles.mock_calls) == 1 - freezer.tick(timedelta(days=1, seconds=1)) + freezer.tick(timedelta(days=1)) async_fire_time_changed(hass) await hass.async_block_till_done() @@ -155,7 +155,7 @@ async def test_trophy_title_coordinator_auth_failed( PSNAWPAuthenticationError ) - freezer.tick(timedelta(days=1, seconds=1)) + freezer.tick(timedelta(days=1)) async_fire_time_changed(hass) await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True) @@ -192,7 +192,7 @@ async def test_trophy_title_coordinator_update_data_failed( mock_psnawpapi.user.return_value.trophy_titles.side_effect = exception - freezer.tick(timedelta(days=1, seconds=1)) + freezer.tick(timedelta(days=1)) async_fire_time_changed(hass) await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True) @@ -223,7 +223,7 @@ async def test_trophy_title_coordinator_doesnt_update( assert config_entry.state is ConfigEntryState.LOADED assert len(mock_psnawpapi.user.return_value.trophy_titles.mock_calls) == 1 - freezer.tick(timedelta(days=1, seconds=1)) + freezer.tick(timedelta(days=1)) async_fire_time_changed(hass) await hass.async_block_till_done() @@ -247,14 +247,23 @@ async def test_trophy_title_coordinator_play_new_game( assert config_entry.state is ConfigEntryState.LOADED + assert len(mock_psnawpapi.user.return_value.trophy_titles.mock_calls) == 1 + assert (state := hass.states.get("media_player.playstation_vita")) assert state.attributes.get("entity_picture") is None mock_psnawpapi.user.return_value.trophy_titles.return_value = _tmp - freezer.tick(timedelta(days=1, seconds=1)) + # Wait one day to trigger PlaystationNetworkTrophyTitlesCoordinator refresh + freezer.tick(timedelta(days=1)) async_fire_time_changed(hass) await hass.async_block_till_done(wait_background_tasks=True) + + # Wait another 30 seconds in case the PlaystationNetworkUserDataCoordinator, + # which has a 30 second update interval, updated before the + # PlaystationNetworkTrophyTitlesCoordinator. + freezer.tick(timedelta(seconds=30)) + async_fire_time_changed(hass) await hass.async_block_till_done(wait_background_tasks=True) assert len(mock_psnawpapi.user.return_value.trophy_titles.mock_calls) == 2 From 8402bead4f73a4e4842b846dc4984435c1927837 Mon Sep 17 00:00:00 2001 From: Magnus Date: Thu, 16 Oct 2025 09:38:09 +0200 Subject: [PATCH 06/10] Component asuswrt: import of ConnectionState corrected (#154518) --- homeassistant/components/asuswrt/bridge.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/asuswrt/bridge.py b/homeassistant/components/asuswrt/bridge.py index 965f88ed5038ae..9c27a49e25d308 100644 --- a/homeassistant/components/asuswrt/bridge.py +++ b/homeassistant/components/asuswrt/bridge.py @@ -12,7 +12,8 @@ from aiohttp import ClientSession from asusrouter import AsusRouter, AsusRouterError from asusrouter.config import ARConfigKey -from asusrouter.modules.client import AsusClient, ConnectionState +from asusrouter.modules.client import AsusClient +from asusrouter.modules.connection import ConnectionState from asusrouter.modules.data import AsusData from asusrouter.modules.homeassistant import convert_to_ha_data, convert_to_ha_sensors from asusrouter.tools.connection import get_cookie_jar From 14b270a2dbb19f39d4e7ead18216a7fce1c69afe Mon Sep 17 00:00:00 2001 From: Magnus Date: Thu, 16 Oct 2025 09:48:21 +0200 Subject: [PATCH 07/10] Component asuswrt: handle_errors_and_zip._wrapper returns dict[str, str] (#154544) --- homeassistant/components/asuswrt/bridge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/asuswrt/bridge.py b/homeassistant/components/asuswrt/bridge.py index 9c27a49e25d308..924c69532f805b 100644 --- a/homeassistant/components/asuswrt/bridge.py +++ b/homeassistant/components/asuswrt/bridge.py @@ -87,7 +87,7 @@ def _handle_errors_and_zip( """Run library methods and zip results or manage exceptions.""" @functools.wraps(func) - async def _wrapper(self: _AsusWrtBridgeT) -> dict[str, Any]: + async def _wrapper(self: _AsusWrtBridgeT) -> dict[str, str]: try: data = await func(self) except exceptions as exc: From e0faa36157d0421ef16c154a83b9df4a897562c6 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Thu, 16 Oct 2025 10:07:52 +0200 Subject: [PATCH 08/10] Bump pymonoprice to 0.5 (#146936) --- homeassistant/components/monoprice/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- script/hassfest/requirements.py | 5 ----- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/monoprice/manifest.json b/homeassistant/components/monoprice/manifest.json index cfa112f7857bd7..398c8c48bb59cb 100644 --- a/homeassistant/components/monoprice/manifest.json +++ b/homeassistant/components/monoprice/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://www.home-assistant.io/integrations/monoprice", "iot_class": "local_polling", "loggers": ["pymonoprice"], - "requirements": ["pymonoprice==0.4"] + "requirements": ["pymonoprice==0.5"] } diff --git a/requirements_all.txt b/requirements_all.txt index 9cc52ce890f003..ecb1fd19979ea6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2201,7 +2201,7 @@ pymochad==0.2.0 pymodbus==3.11.2 # homeassistant.components.monoprice -pymonoprice==0.4 +pymonoprice==0.5 # homeassistant.components.msteams pymsteams==0.1.12 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index ee65eeb0ed651e..2b5b89dafc09df 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1843,7 +1843,7 @@ pymochad==0.2.0 pymodbus==3.11.2 # homeassistant.components.monoprice -pymonoprice==0.4 +pymonoprice==0.5 # homeassistant.components.mysensors pymysensors==0.26.0 diff --git a/script/hassfest/requirements.py b/script/hassfest/requirements.py index d741fe98e24e52..e725b9f334bb8f 100644 --- a/script/hassfest/requirements.py +++ b/script/hassfest/requirements.py @@ -229,11 +229,6 @@ # pymochad > pbr > setuptools "pbr": {"setuptools"} }, - "monoprice": { - # https://github.com/etsinko/pymonoprice/issues/9 - # pymonoprice > pyserial-asyncio - "pymonoprice": {"pyserial-asyncio"} - }, "nibe_heatpump": {"nibe": {"async-timeout"}}, "norway_air": {"pymetno": {"async-timeout"}}, "opengarage": {"open-garage": {"async-timeout"}}, From 872b33a088b70776392967f160f7eed19507a2f3 Mon Sep 17 00:00:00 2001 From: tstabrawa <59430211+tstabrawa@users.noreply.github.com> Date: Thu, 16 Oct 2025 03:14:22 -0500 Subject: [PATCH 09/10] Move URL out of Nuheat strings.json (#154580) --- homeassistant/components/nuheat/config_flow.py | 5 ++++- homeassistant/components/nuheat/strings.json | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/nuheat/config_flow.py b/homeassistant/components/nuheat/config_flow.py index 0e090eeab3ed15..6ea8ea9d12ae5f 100644 --- a/homeassistant/components/nuheat/config_flow.py +++ b/homeassistant/components/nuheat/config_flow.py @@ -89,7 +89,10 @@ async def async_step_user( return self.async_create_entry(title=info["title"], data=user_input) return self.async_show_form( - step_id="user", data_schema=DATA_SCHEMA, errors=errors + step_id="user", + data_schema=DATA_SCHEMA, + errors=errors, + description_placeholders={"nuheat_url": "https://MyNuHeat.com"}, ) diff --git a/homeassistant/components/nuheat/strings.json b/homeassistant/components/nuheat/strings.json index aebad40e6a998c..c6e7d24921ee18 100644 --- a/homeassistant/components/nuheat/strings.json +++ b/homeassistant/components/nuheat/strings.json @@ -12,7 +12,7 @@ "step": { "user": { "title": "Connect to the NuHeat", - "description": "You will need to obtain your thermostat\u2019s numeric serial number or ID by logging into https://MyNuHeat.com and selecting your thermostat(s).", + "description": "You will need to obtain your thermostat\u2019s numeric serial number or ID by logging into {nuheat_url} and selecting your thermostat(s).", "data": { "username": "[%key:common::config_flow::data::username%]", "password": "[%key:common::config_flow::data::password%]", From 2da1878f60da0dc8a5751075cd4ede4df3337b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Thu, 16 Oct 2025 11:20:29 +0200 Subject: [PATCH 10/10] Add Matter Inovelli VTM30 fixture (#154601) --- tests/components/matter/conftest.py | 1 + .../matter/fixtures/nodes/inovelli_vtm30.json | 2254 +++++++++++++++++ .../matter/snapshots/test_button.ambr | 49 + .../matter/snapshots/test_event.ambr | 207 ++ .../matter/snapshots/test_light.ambr | 75 + .../matter/snapshots/test_number.ambr | 460 ++++ .../matter/snapshots/test_select.ambr | 672 +++++ .../matter/snapshots/test_sensor.ambr | 498 ++++ .../matter/snapshots/test_switch.ambr | 49 + 9 files changed, 4265 insertions(+) create mode 100644 tests/components/matter/fixtures/nodes/inovelli_vtm30.json diff --git a/tests/components/matter/conftest.py b/tests/components/matter/conftest.py index b378779278f3c4..2e789e441dca3a 100644 --- a/tests/components/matter/conftest.py +++ b/tests/components/matter/conftest.py @@ -97,6 +97,7 @@ async def integration_fixture( "generic_switch", "generic_switch_multi", "humidity_sensor", + "inovelli_vtm30", "laundry_dryer", "leak_sensor", "light_sensor", diff --git a/tests/components/matter/fixtures/nodes/inovelli_vtm30.json b/tests/components/matter/fixtures/nodes/inovelli_vtm30.json new file mode 100644 index 00000000000000..d26c6666e0697b --- /dev/null +++ b/tests/components/matter/fixtures/nodes/inovelli_vtm30.json @@ -0,0 +1,2254 @@ +{ + "node_id": 256, + "date_commissioned": "2025-08-29T18:07:39.898055", + "last_interview": "2025-08-29T18:07:39.898060", + "interview_version": 6, + "available": true, + "is_bridge": false, + "attributes": { + "0/29/0": [ + { + "0": 18, + "1": 1 + }, + { + "0": 22, + "1": 1 + } + ], + "0/29/1": [29, 31, 40, 42, 48, 49, 51, 53, 60, 62, 63, 64], + "0/29/2": [41], + "0/29/3": [1, 2, 3, 4, 5, 6, 7, 8, 9], + "0/29/65532": 0, + "0/29/65533": 2, + "0/29/65528": [], + "0/29/65529": [], + "0/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "0/31/0": [ + { + "1": 5, + "2": 2, + "3": [112233], + "4": null, + "254": 2 + } + ], + "0/31/2": 4, + "0/31/3": 3, + "0/31/4": 4, + "0/31/65532": 0, + "0/31/65533": 2, + "0/31/65528": [], + "0/31/65529": [], + "0/31/65531": [0, 2, 3, 4, 65528, 65529, 65531, 65532, 65533], + "0/40/0": 18, + "0/40/1": "Inovelli", + "0/40/2": 4961, + "0/40/3": "VTM30-SN", + "0/40/4": 16, + "0/40/5": "", + "0/40/6": "**REDACTED**", + "0/40/7": 1, + "0/40/8": "2.1", + "0/40/9": 100, + "0/40/10": "1.0.0", + "0/40/11": "20250306", + "0/40/12": "850007431228", + "0/40/13": "https://inovelli.com/collections/inovelli-white-series/products/thread-matter-white-series-smart-fan-light-canopy-module", + "0/40/14": "White Series OnOff Switch", + "0/40/15": "BAD362F0AF59825D", + "0/40/16": false, + "0/40/18": "FB696AC64CACC2A0", + "0/40/19": { + "0": 3, + "1": 5 + }, + "0/40/21": 17039360, + "0/40/22": 1, + "0/40/65532": 0, + "0/40/65533": 4, + "0/40/65528": [], + "0/40/65529": [], + "0/40/65531": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 21, 22, + 65528, 65529, 65531, 65532, 65533 + ], + "0/42/0": [], + "0/42/1": true, + "0/42/2": 1, + "0/42/3": null, + "0/42/65532": 0, + "0/42/65533": 1, + "0/42/65528": [], + "0/42/65529": [0], + "0/42/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "0/48/0": 0, + "0/48/1": { + "0": 60, + "1": 900 + }, + "0/48/2": 0, + "0/48/3": 0, + "0/48/4": true, + "0/48/65532": 0, + "0/48/65533": 2, + "0/48/65528": [1, 3, 5], + "0/48/65529": [0, 2, 4], + "0/48/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533], + "0/49/0": 1, + "0/49/1": [ + { + "0": "78ZT6vbYSG4=", + "1": true + } + ], + "0/49/2": 10, + "0/49/3": 20, + "0/49/4": true, + "0/49/5": 0, + "0/49/6": "78ZT6vbYSG4=", + "0/49/7": null, + "0/49/9": 10, + "0/49/10": 5, + "0/49/65532": 2, + "0/49/65533": 2, + "0/49/65528": [1, 5, 7], + "0/49/65529": [0, 3, 4, 6, 8], + "0/49/65531": [ + 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 65528, 65529, 65531, 65532, 65533 + ], + "0/51/0": [ + { + "0": "MyHome*****", + "1": true, + "2": null, + "3": null, + "4": "uuN5Rj+YXcc=", + "5": [], + "6": [ + "/RSewj1oAAAAAAD//gCMAA==", + "/SzZ5ehaAAGfDsiY1hhuCw==", + "/RSewj1oAABuwqIy8+UcIA==", + "/oAAAAAAAAC443lGP5hdxw==" + ], + "7": 4 + } + ], + "0/51/1": 3, + "0/51/2": 1788280, + "0/51/3": 1098, + "0/51/4": 1, + "0/51/8": true, + "0/51/65532": 0, + "0/51/65533": 2, + "0/51/65528": [2], + "0/51/65529": [0, 1], + "0/51/65531": [0, 1, 2, 3, 4, 8, 65528, 65529, 65531, 65532, 65533], + "0/53/0": 25, + "0/53/1": 5, + "0/53/2": "MyHome*****", + "0/53/3": 4551, + "0/53/4": 17277589289082308718, + "0/53/5": "QP0UnsI9aAAA", + "0/53/6": 0, + "0/53/7": [ + { + "0": 17168058813456713685, + "1": 159, + "2": 35963, + "3": 948, + "4": 63, + "5": 3, + "6": -28, + "7": -28, + "8": 8, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": true + }, + { + "0": 3370097187750507862, + "1": 1, + "2": 35960, + "3": 2481, + "4": 39, + "5": 3, + "6": -75, + "7": -76, + "8": 48, + "9": 8, + "10": false, + "11": false, + "12": false, + "13": true + }, + { + "0": 16907832828814426218, + "1": 75, + "2": 35965, + "3": 2717, + "4": 810, + "5": 3, + "6": -75, + "7": -75, + "8": 3, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": true + }, + { + "0": 8267388690149757137, + "1": 212, + "2": 35962, + "3": 964, + "4": 102, + "5": 3, + "6": -63, + "7": -64, + "8": 21, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": true + }, + { + "0": 6810857833789159738, + "1": 4, + "2": 1024, + "3": 1780, + "4": 159, + "5": 1, + "6": -92, + "7": -92, + "8": 0, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 5086511412530643128, + "1": 31, + "2": 5120, + "3": 37131, + "4": 2080, + "5": 3, + "6": -69, + "7": -69, + "8": 75, + "9": 13, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 6205900145031232602, + "1": 1, + "2": 7168, + "3": 22143, + "4": 906, + "5": 3, + "6": -72, + "7": -73, + "8": 32, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 15163764054334418108, + "1": 0, + "2": 10240, + "3": 45585, + "4": 1260, + "5": 1, + "6": -91, + "7": -89, + "8": 38, + "9": 3, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 1340769904295378540, + "1": 64, + "2": 13312, + "3": 137708, + "4": 15280, + "5": 2, + "6": -81, + "7": -81, + "8": 3, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 3660710669259704217, + "1": 35, + "2": 22528, + "3": 45196, + "4": 9552, + "5": 3, + "6": -77, + "7": -78, + "8": 52, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 1943517749273230026, + "1": 1, + "2": 25600, + "3": 8218, + "4": 239, + "5": 1, + "6": -88, + "7": -88, + "8": 0, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 7644425855413427041, + "1": 17, + "2": 30720, + "3": 394, + "4": 202, + "5": 3, + "6": -71, + "7": -72, + "8": 3, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 7945356094709477760, + "1": 11, + "2": 40960, + "3": 265, + "4": 109, + "5": 2, + "6": -87, + "7": -86, + "8": 0, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 8517119984751758255, + "1": 2, + "2": 46080, + "3": 3823, + "4": 594, + "5": 2, + "6": -81, + "7": -82, + "8": 0, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + }, + { + "0": 5675293278040621383, + "1": 31, + "2": 61440, + "3": 2359, + "4": 796, + "5": 3, + "6": -74, + "7": -74, + "8": 0, + "9": 0, + "10": true, + "11": true, + "12": true, + "13": false + } + ], + "0/53/8": [ + { + "0": 6810857833789159738, + "1": 1024, + "2": 1, + "3": 22, + "4": 2, + "5": 1, + "6": 2, + "7": 4, + "8": true, + "9": true + }, + { + "0": 5086511412530643128, + "1": 5120, + "2": 5, + "3": 7, + "4": 1, + "5": 3, + "6": 3, + "7": 31, + "8": true, + "9": true + }, + { + "0": 0, + "1": 6144, + "2": 6, + "3": 5, + "4": 2, + "5": 0, + "6": 0, + "7": 52, + "8": true, + "9": false + }, + { + "0": 6205900145031232602, + "1": 7168, + "2": 7, + "3": 5, + "4": 1, + "5": 3, + "6": 3, + "7": 1, + "8": true, + "9": true + }, + { + "0": 15163764054334418108, + "1": 10240, + "2": 10, + "3": 7, + "4": 1, + "5": 1, + "6": 0, + "7": 0, + "8": true, + "9": true + }, + { + "0": 1340769904295378540, + "1": 13312, + "2": 13, + "3": 7, + "4": 1, + "5": 2, + "6": 3, + "7": 64, + "8": true, + "9": true + }, + { + "0": 0, + "1": 14336, + "2": 14, + "3": 7, + "4": 1, + "5": 0, + "6": 0, + "7": 208, + "8": true, + "9": false + }, + { + "0": 13472614297978576343, + "1": 15360, + "2": 15, + "3": 22, + "4": 4, + "5": 0, + "6": 0, + "7": 47, + "8": true, + "9": false + }, + { + "0": 16613034820515111354, + "1": 17408, + "2": 17, + "3": 5, + "4": 1, + "5": 0, + "6": 0, + "7": 41, + "8": true, + "9": false + }, + { + "0": 18041435040751378297, + "1": 20480, + "2": 20, + "3": 22, + "4": 2, + "5": 1, + "6": 2, + "7": 25, + "8": true, + "9": false + }, + { + "0": 3660710669259704217, + "1": 22528, + "2": 22, + "3": 5, + "4": 2, + "5": 3, + "6": 3, + "7": 36, + "8": true, + "9": true + }, + { + "0": 0, + "1": 24576, + "2": 24, + "3": 7, + "4": 1, + "5": 0, + "6": 0, + "7": 1, + "8": true, + "9": false + }, + { + "0": 1943517749273230026, + "1": 25600, + "2": 25, + "3": 7, + "4": 1, + "5": 1, + "6": 3, + "7": 2, + "8": true, + "9": true + }, + { + "0": 7644425855413427041, + "1": 30720, + "2": 30, + "3": 5, + "4": 1, + "5": 3, + "6": 3, + "7": 18, + "8": true, + "9": true + }, + { + "0": 0, + "1": 32768, + "2": 32, + "3": 5, + "4": 2, + "5": 0, + "6": 0, + "7": 172, + "8": true, + "9": false + }, + { + "0": 13466740653389536711, + "1": 35840, + "2": 35, + "3": 63, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": true, + "9": false + }, + { + "0": 0, + "1": 37888, + "2": 37, + "3": 5, + "4": 1, + "5": 0, + "6": 0, + "7": 122, + "8": true, + "9": false + }, + { + "0": 0, + "1": 38912, + "2": 38, + "3": 45, + "4": 1, + "5": 0, + "6": 0, + "7": 23, + "8": true, + "9": false + }, + { + "0": 7945356094709477760, + "1": 40960, + "2": 40, + "3": 7, + "4": 1, + "5": 2, + "6": 2, + "7": 0, + "8": true, + "9": true + }, + { + "0": 0, + "1": 41984, + "2": 41, + "3": 7, + "4": 3, + "5": 0, + "6": 0, + "7": 205, + "8": true, + "9": false + }, + { + "0": 0, + "1": 43008, + "2": 42, + "3": 7, + "4": 3, + "5": 0, + "6": 0, + "7": 205, + "8": true, + "9": false + }, + { + "0": 0, + "1": 44032, + "2": 43, + "3": 5, + "4": 2, + "5": 0, + "6": 0, + "7": 89, + "8": true, + "9": false + }, + { + "0": 8517119984751758255, + "1": 46080, + "2": 45, + "3": 7, + "4": 2, + "5": 2, + "6": 3, + "7": 0, + "8": true, + "9": true + }, + { + "0": 3334473873188586205, + "1": 47104, + "2": 46, + "3": 45, + "4": 2, + "5": 0, + "6": 0, + "7": 77, + "8": true, + "9": false + }, + { + "0": 0, + "1": 49152, + "2": 48, + "3": 7, + "4": 2, + "5": 0, + "6": 0, + "7": 205, + "8": true, + "9": false + }, + { + "0": 0, + "1": 52224, + "2": 51, + "3": 5, + "4": 5, + "5": 0, + "6": 0, + "7": 122, + "8": true, + "9": false + }, + { + "0": 0, + "1": 54272, + "2": 53, + "3": 5, + "4": 7, + "5": 0, + "6": 0, + "7": 122, + "8": true, + "9": false + }, + { + "0": 0, + "1": 57344, + "2": 56, + "3": 5, + "4": 3, + "5": 0, + "6": 0, + "7": 205, + "8": true, + "9": false + }, + { + "0": 0, + "1": 58368, + "2": 57, + "3": 7, + "4": 3, + "5": 0, + "6": 0, + "7": 205, + "8": true, + "9": false + }, + { + "0": 0, + "1": 59392, + "2": 58, + "3": 7, + "4": 2, + "5": 0, + "6": 0, + "7": 208, + "8": true, + "9": false + }, + { + "0": 5675293278040621383, + "1": 61440, + "2": 60, + "3": 5, + "4": 1, + "5": 3, + "6": 3, + "7": 32, + "8": true, + "9": true + }, + { + "0": 0, + "1": 62464, + "2": 61, + "3": 7, + "4": 1, + "5": 0, + "6": 0, + "7": 122, + "8": true, + "9": false + } + ], + "0/53/9": 1615974939, + "0/53/10": 64, + "0/53/11": 168, + "0/53/12": 232, + "0/53/13": 43, + "0/53/14": 33, + "0/53/15": 33, + "0/53/16": 19, + "0/53/17": 2, + "0/53/18": 12, + "0/53/19": 18, + "0/53/20": 25, + "0/53/21": 24, + "0/53/22": 393029, + "0/53/23": 352977, + "0/53/24": 40052, + "0/53/25": 352977, + "0/53/26": 344416, + "0/53/27": 40052, + "0/53/28": 393035, + "0/53/29": 0, + "0/53/30": 0, + "0/53/31": 0, + "0/53/32": 0, + "0/53/33": 417201, + "0/53/34": 5712, + "0/53/35": 2855, + "0/53/36": 136608, + "0/53/37": 0, + "0/53/38": 2534, + "0/53/39": 2630422, + "0/53/40": 333915, + "0/53/41": 2086944, + "0/53/42": 2337200, + "0/53/43": 40300, + "0/53/44": 0, + "0/53/45": 0, + "0/53/46": 0, + "0/53/47": 0, + "0/53/48": 1, + "0/53/49": 18090, + "0/53/50": 0, + "0/53/51": 209562, + "0/53/52": 0, + "0/53/53": 25269, + "0/53/54": 0, + "0/53/55": 0, + "0/53/56": 113356184158208, + "0/53/57": 0, + "0/53/58": 0, + "0/53/59": { + "0": 672, + "1": 143 + }, + "0/53/60": "AB//wA==", + "0/53/61": { + "0": true, + "1": false, + "2": true, + "3": true, + "4": true, + "5": true, + "6": false, + "7": true, + "8": true, + "9": true, + "10": true, + "11": true + }, + "0/53/62": [], + "0/53/65532": 15, + "0/53/65533": 3, + "0/53/65528": [], + "0/53/65529": [0], + "0/53/65531": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 65528, 65529, 65531, 65532, 65533 + ], + "0/60/0": 0, + "0/60/1": null, + "0/60/2": null, + "0/60/65532": 0, + "0/60/65533": 1, + "0/60/65528": [], + "0/60/65529": [0, 2], + "0/60/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533], + "0/62/0": [ + { + "1": "FTABAQEkAgE3AyQTAhgmBIAigScmBYAlTTo3BiQVAiURAAEYJAcBJAgBMAlBBKvJarg2fkXtTsolNvnz0ZDhdR3DguKoLKAC9E4GmXqoIixFKzx6Y/KgF1kFI4qusmgrfcLGWFEr2uNPlFRVH4g3CjUBKAEYJAIBNgMEAgQBGDAEFGKXBaQ0WF6nySerh3YrV0iJ8cEUMAUU/yRuWz0RxapKyRPfA+WUlTo+RFsYMAtAskEN8YNX0bfcL7kkadvwyPsz13FUIfcDeRK2KaXGvf7CJbEpKpbr4uOiE4onxdysfQyqyMOg8mgy54jSYRMshxg=", + "2": "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQTAhgkBwEkCAEwCUEEUKENPQRtOhZDKlRflp0Cxu1DKOlL6bvw7pA7H6bHiJCnphRQKcU6D5yaa2KYkWhynF8bYUqBlUT2v0KmrRyrLzcKNQEpARgkAmAwBBT/JG5bPRHFqkrJE98D5ZSVOj5EWzAFFNvb2flPzyP8U2er1dDqBaHHwy8aGDALQPB/fkQ2Yh7PzFIf4NAa+6gxMR3BrIjxX1dqxCMmT7+B4fKaZAMsuDbxGgt7PPD1i/ctKuQsDgFA9PmkHjUob9sY", + "254": 2 + } + ], + "0/62/1": [ + { + "1": "BFX0o1x76dBsQSmQaeacYfEg2XTtXTA/HUvQXsScrTTIDRR2sgrSnRkQyNUmFpk33JTEUtJ9uQDX70FJAxWM+Is=", + "2": 4939, + "3": 2, + "4": 256, + "5": "USCSS Nostromo", + "254": 2 + } + ], + "0/62/2": 5, + "0/62/3": 3, + "0/62/4": [ + "FTABAQAkAgE3AycUxxt9sfxycj8mFZkiBagYJgQNz0YtJAUANwYnFMcbfbH8cnI/JhWZIgWoGCQHASQIATAJQQTGlfTQVqZk2GnxHCh364hEd0J4+rUEblxiWQDmYIienGmHY50RviHxI+875LHFTo9rcntChj+TPxP00yUIw3yoNwo1ASkBGCQCYDAEFK5Ln3+cjAgPxBcWXXzMO1MEyW6oMAUUrkuff5yMCA/EFxZdfMw7UwTJbqgYMAtAleRSrdtPawWmPJ2A0t6EFlYTVKtqseAiuHxSwE+U4sEeL+QCO9OCT6f1bsTzD5KDjqTBlWPSjeUDfd5u61o30Bg=", + "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQUARgkBwEkCAEwCUEEVfSjXHvp0GxBKZBp5pxh8SDZdO1dMD8dS9BexJytNMgNFHayCtKdGRDI1SYWmTfclMRS0n25ANfvQUkDFYz4izcKNQEpARgkAmAwBBTb29n5T88j/FNnq9XQ6gWhx8MvGjAFFNvb2flPzyP8U2er1dDqBaHHwy8aGDALQPT1qrwqgZgdH6jmHxvKQDVkzItZOjsIGrSHQTcGenPnIJ5ulcDnzSDAkardY9P1SN+lnJQkfL1QHPgLsRNYqvgY", + "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQUARgkBwEkCAEwCUEEBnH+cL01MPCuWvU4k4koXYt+1hkj5g/U4fAh8UNlRizetXtHmrL2PqftEE29qfcid3Sxq0Es++l1TWi8cE0u2DcKNQEpARgkAmAwBBRZqF7Hw3KTo6v1NDzsGwfckQwiJTAFFFmoXsfDcpOjq/U0POwbB9yRDCIlGDALQHuza1TckXIHaVwUMK8+UHSSiy/5JFMgHRKl7Y8jXesCVLcBI+y6DhrTLOKPf2IVSK7XZzhcSXrKyt+CYHqbXzEY" + ], + "0/62/5": 2, + "0/62/65532": 0, + "0/62/65533": 1, + "0/62/65528": [1, 3, 5, 8], + "0/62/65529": [0, 2, 4, 6, 7, 9, 10, 11], + "0/62/65531": [0, 1, 2, 3, 4, 5, 65528, 65529, 65531, 65532, 65533], + "0/63/0": [], + "0/63/1": [], + "0/63/2": 8, + "0/63/3": 3, + "0/63/65532": 0, + "0/63/65533": 2, + "0/63/65528": [2, 5], + "0/63/65529": [0, 1, 3, 4], + "0/63/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "0/64/0": [ + { + "0": "Vendor", + "1": "Inovelli" + }, + { + "0": "Product", + "1": "VTM30-SN" + } + ], + "0/64/65532": 0, + "0/64/65533": 1, + "0/64/65528": [], + "0/64/65529": [], + "0/64/65531": [0, 65528, 65529, 65531, 65532, 65533], + "1/3/0": 0, + "1/3/1": 2, + "1/3/65532": 0, + "1/3/65533": 5, + "1/3/65528": [], + "1/3/65529": [0, 64], + "1/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "1/4/0": 128, + "1/4/65532": 1, + "1/4/65533": 4, + "1/4/65528": [0, 1, 2, 3], + "1/4/65529": [0, 1, 2, 3, 4, 5], + "1/4/65531": [0, 65528, 65529, 65531, 65532, 65533], + "1/6/0": false, + "1/6/16384": true, + "1/6/16385": 0, + "1/6/16386": 0, + "1/6/16387": null, + "1/6/65532": 1, + "1/6/65533": 6, + "1/6/65528": [], + "1/6/65529": [0, 1, 2, 64, 65, 66], + "1/6/65531": [ + 0, 16384, 16385, 16386, 16387, 65528, 65529, 65531, 65532, 65533 + ], + "1/8/0": 254, + "1/8/1": 0, + "1/8/2": 1, + "1/8/3": 254, + "1/8/15": 0, + "1/8/16": 0, + "1/8/17": null, + "1/8/18": null, + "1/8/19": null, + "1/8/20": 50, + "1/8/16384": null, + "1/8/65532": 3, + "1/8/65533": 6, + "1/8/65528": [], + "1/8/65529": [0, 1, 2, 3, 4, 5, 6, 7], + "1/8/65531": [ + 0, 1, 2, 3, 15, 16, 17, 18, 19, 20, 16384, 65528, 65529, 65531, 65532, + 65533 + ], + "1/29/0": [ + { + "0": 266, + "1": 1 + } + ], + "1/29/1": [3, 4, 6, 8, 29, 64, 65, 80, 305134641], + "1/29/2": [], + "1/29/3": [], + "1/29/65532": 0, + "1/29/65533": 2, + "1/29/65528": [], + "1/29/65529": [], + "1/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "1/64/0": [ + { + "0": "Label", + "1": "Load Control" + } + ], + "1/64/65532": 0, + "1/64/65533": 1, + "1/64/65528": [], + "1/64/65529": [], + "1/64/65531": [0, 65528, 65529, 65531, 65532, 65533], + "1/65/0": [], + "1/65/65532": 0, + "1/65/65533": 1, + "1/65/65528": [], + "1/65/65529": [], + "1/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "1/80/0": "Switch Mode", + "1/80/1": 0, + "1/80/2": [ + { + "0": "On/Off+Single", + "1": 0, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "On/Off+AUX", + "1": 1, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Dimmer+Single", + "1": 2, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Dimmer+AUX", + "1": 3, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "1/80/3": 0, + "1/80/65532": 0, + "1/80/65533": 2, + "1/80/65528": [], + "1/80/65529": [0], + "1/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "1/305134641/305070080": 254, + "1/305134641/305070081": 0, + "1/305134641/305070082": 127, + "1/305134641/305070083": 0, + "1/305134641/305070084": 127, + "1/305134641/305070085": 127, + "1/305134641/305070086": 127, + "1/305134641/305070087": 127, + "1/305134641/305070088": 127, + "1/305134641/305070091": false, + "1/305134641/305070092": 0, + "1/305134641/305070093": 255, + "1/305134641/305070094": 255, + "1/305134641/305070095": 2, + "1/305134641/305070097": 11, + "1/305134641/305070102": 0, + "1/305134641/305070112": 31, + "1/305134641/305070113": false, + "1/305134641/305070175": 85, + "1/305134641/305070176": 85, + "1/305134641/305070177": 33, + "1/305134641/305070178": 1, + "1/305134641/305070340": true, + "1/305134641/305070342": true, + "1/305134641/65532": 0, + "1/305134641/65533": 1, + "1/305134641/65528": [], + "1/305134641/65529": [305070276], + "1/305134641/65531": [ + 65528, 65529, 65531, 305070080, 305070081, 305070082, 305070083, + 305070084, 305070085, 305070086, 305070087, 305070088, 305070091, + 305070092, 305070093, 305070094, 305070095, 305070097, 305070102, + 305070112, 305070113, 305070175, 305070176, 305070177, 305070178, + 305070340, 305070342, 65532, 65533 + ], + "2/3/0": 0, + "2/3/1": 0, + "2/3/65532": 0, + "2/3/65533": 5, + "2/3/65528": [], + "2/3/65529": [0], + "2/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "2/29/0": [ + { + "0": 260, + "1": 1 + } + ], + "2/29/1": [3, 29, 30, 64, 65, 80], + "2/29/2": [3, 6, 8], + "2/29/3": [], + "2/29/65532": 0, + "2/29/65533": 2, + "2/29/65528": [], + "2/29/65529": [], + "2/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "2/30/0": [], + "2/30/65532": 0, + "2/30/65533": 1, + "2/30/65528": [], + "2/30/65529": [], + "2/30/65531": [0, 65528, 65529, 65531, 65532, 65533], + "2/64/0": [ + { + "0": "Label", + "1": "Dimmable Switch" + } + ], + "2/64/65532": 0, + "2/64/65533": 1, + "2/64/65528": [], + "2/64/65529": [], + "2/64/65531": [0, 65528, 65529, 65531, 65532, 65533], + "2/65/0": [], + "2/65/65532": 0, + "2/65/65533": 1, + "2/65/65528": [], + "2/65/65529": [], + "2/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "2/80/0": "Smart Bulb Mode", + "2/80/1": 0, + "2/80/2": [ + { + "0": "Smart Bulb Disable", + "1": 0, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Smart Bulb Enable", + "1": 1, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "2/80/3": 0, + "2/80/65532": 0, + "2/80/65533": 2, + "2/80/65528": [], + "2/80/65529": [0], + "2/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "3/3/0": 0, + "3/3/1": 0, + "3/3/65532": 0, + "3/3/65533": 5, + "3/3/65528": [], + "3/3/65529": [0], + "3/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "3/29/0": [ + { + "0": 15, + "1": 1 + } + ], + "3/29/1": [3, 29, 59, 64, 65, 80], + "3/29/2": [], + "3/29/3": [], + "3/29/4": [ + { + "0": null, + "1": 67, + "2": 0 + }, + { + "0": null, + "1": 67, + "2": 3 + }, + { + "0": null, + "1": 7, + "2": 1 + } + ], + "3/29/65532": 1, + "3/29/65533": 2, + "3/29/65528": [], + "3/29/65529": [], + "3/29/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533], + "3/59/0": 2, + "3/59/1": 0, + "3/59/2": 5, + "3/59/65532": 30, + "3/59/65533": 2, + "3/59/65528": [], + "3/59/65529": [], + "3/59/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533], + "3/64/0": [ + { + "0": "Label", + "1": "Up" + } + ], + "3/64/65532": 0, + "3/64/65533": 1, + "3/64/65528": [], + "3/64/65529": [], + "3/64/65531": [0, 65528, 65529, 65531, 65532, 65533], + "3/65/0": [], + "3/65/65532": 0, + "3/65/65533": 1, + "3/65/65528": [], + "3/65/65529": [], + "3/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "3/80/0": "Local Timer", + "3/80/1": 0, + "3/80/2": [ + { + "0": "Local Timer Disable", + "1": 0, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Local Timer Enable", + "1": 1, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "3/80/3": 0, + "3/80/65532": 0, + "3/80/65533": 2, + "3/80/65528": [], + "3/80/65529": [0], + "3/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "4/3/0": 0, + "4/3/1": 0, + "4/3/65532": 0, + "4/3/65533": 5, + "4/3/65528": [], + "4/3/65529": [0], + "4/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "4/29/0": [ + { + "0": 15, + "1": 1 + } + ], + "4/29/1": [3, 29, 59, 64, 65, 80], + "4/29/2": [], + "4/29/3": [], + "4/29/4": [ + { + "0": null, + "1": 67, + "2": 1 + }, + { + "0": null, + "1": 67, + "2": 4 + }, + { + "0": null, + "1": 7, + "2": 2 + } + ], + "4/29/65532": 1, + "4/29/65533": 2, + "4/29/65528": [], + "4/29/65529": [], + "4/29/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533], + "4/59/0": 2, + "4/59/1": 0, + "4/59/2": 5, + "4/59/65532": 30, + "4/59/65533": 2, + "4/59/65528": [], + "4/59/65529": [], + "4/59/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533], + "4/64/0": [ + { + "0": "Label", + "1": "Down" + } + ], + "4/64/65532": 0, + "4/64/65533": 1, + "4/64/65528": [], + "4/64/65529": [], + "4/64/65531": [0, 65528, 65529, 65531, 65532, 65533], + "4/65/0": [], + "4/65/65532": 0, + "4/65/65533": 1, + "4/65/65528": [], + "4/65/65529": [], + "4/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "4/80/0": "Dimming Speed", + "4/80/1": 0, + "4/80/2": [ + { + "0": "Instant", + "1": 0, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "500ms", + "1": 5, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "800ms", + "1": 8, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "1s", + "1": 10, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "1.5s", + "1": 15, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "2s", + "1": 20, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "2.5s", + "1": 25, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "3s", + "1": 30, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "3.5s", + "1": 35, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "4s", + "1": 40, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "5s", + "1": 50, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "6s", + "1": 60, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "7s", + "1": 70, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "8s", + "1": 80, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "10s", + "1": 100, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "4/80/3": 0, + "4/80/65532": 0, + "4/80/65533": 2, + "4/80/65528": [], + "4/80/65529": [0], + "4/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "5/3/0": 0, + "5/3/1": 0, + "5/3/65532": 0, + "5/3/65533": 5, + "5/3/65528": [], + "5/3/65529": [0], + "5/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "5/29/0": [ + { + "0": 15, + "1": 1 + } + ], + "5/29/1": [3, 29, 59, 64, 65, 80], + "5/29/2": [], + "5/29/3": [], + "5/29/4": [ + { + "0": null, + "1": 67, + "2": 7 + }, + { + "0": null, + "1": 7, + "2": 3 + } + ], + "5/29/65532": 1, + "5/29/65533": 2, + "5/29/65528": [], + "5/29/65529": [], + "5/29/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533], + "5/59/0": 2, + "5/59/1": 0, + "5/59/2": 5, + "5/59/65532": 30, + "5/59/65533": 2, + "5/59/65528": [], + "5/59/65529": [], + "5/59/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533], + "5/64/0": [ + { + "0": "Label", + "1": "Config" + } + ], + "5/64/65532": 0, + "5/64/65533": 1, + "5/64/65528": [], + "5/64/65529": [], + "5/64/65531": [0, 65528, 65529, 65531, 65532, 65533], + "5/65/0": [], + "5/65/65532": 0, + "5/65/65533": 1, + "5/65/65528": [], + "5/65/65529": [], + "5/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "5/80/0": "Button Press Delay", + "5/80/1": 0, + "5/80/2": [ + { + "0": "No Delay", + "1": 0, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "300ms", + "1": 3, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "400ms", + "1": 4, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "500ms", + "1": 5, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "600ms", + "1": 6, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "700ms", + "1": 7, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "800ms", + "1": 8, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "900ms", + "1": 9, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "5/80/3": 3, + "5/80/65532": 0, + "5/80/65533": 2, + "5/80/65528": [], + "5/80/65529": [0], + "5/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "6/3/0": 0, + "6/3/1": 0, + "6/3/65532": 0, + "6/3/65533": 5, + "6/3/65528": [], + "6/3/65529": [0, 64], + "6/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "6/4/0": 128, + "6/4/65532": 1, + "6/4/65533": 4, + "6/4/65528": [0, 1, 2, 3], + "6/4/65529": [0, 1, 2, 3, 4, 5], + "6/4/65531": [0, 65528, 65529, 65531, 65532, 65533], + "6/6/0": false, + "6/6/16384": true, + "6/6/16385": 0, + "6/6/16386": 0, + "6/6/16387": null, + "6/6/65532": 1, + "6/6/65533": 6, + "6/6/65528": [], + "6/6/65529": [0, 1, 2, 64, 65, 66], + "6/6/65531": [ + 0, 16384, 16385, 16386, 16387, 65528, 65529, 65531, 65532, 65533 + ], + "6/8/0": 254, + "6/8/1": 0, + "6/8/2": 1, + "6/8/3": 254, + "6/8/15": 0, + "6/8/16": 0, + "6/8/17": null, + "6/8/16384": null, + "6/8/65532": 3, + "6/8/65533": 6, + "6/8/65528": [], + "6/8/65529": [0, 1, 2, 3, 4, 5, 6, 7], + "6/8/65531": [ + 0, 1, 2, 3, 15, 16, 17, 16384, 65528, 65529, 65531, 65532, 65533 + ], + "6/29/0": [ + { + "0": 269, + "1": 1 + } + ], + "6/29/1": [3, 4, 6, 8, 29, 64, 65, 80, 768], + "6/29/2": [], + "6/29/3": [], + "6/29/65532": 0, + "6/29/65533": 2, + "6/29/65528": [], + "6/29/65529": [], + "6/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "6/64/0": [ + { + "0": "Label", + "1": "RGB Indicator" + } + ], + "6/64/65532": 0, + "6/64/65533": 1, + "6/64/65528": [], + "6/64/65529": [], + "6/64/65531": [0, 65528, 65529, 65531, 65532, 65533], + "6/65/0": [], + "6/65/65532": 0, + "6/65/65533": 1, + "6/65/65528": [], + "6/65/65529": [], + "6/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "6/80/0": "LED Color", + "6/80/1": 0, + "6/80/2": [ + { + "0": "Red", + "1": 0, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Orange", + "1": 14, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Lemon", + "1": 35, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Lime", + "1": 64, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Green", + "1": 85, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Teal", + "1": 106, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Cyan", + "1": 127, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Aqua", + "1": 149, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Blue", + "1": 170, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Violet", + "1": 191, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Magenta", + "1": 212, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Pink", + "1": 234, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "White", + "1": 255, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "6/80/3": 85, + "6/80/65532": 0, + "6/80/65533": 2, + "6/80/65528": [], + "6/80/65529": [0], + "6/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "6/768/0": 0, + "6/768/1": 0, + "6/768/2": 0, + "6/768/3": 24939, + "6/768/4": 24701, + "6/768/7": 250, + "6/768/8": 1, + "6/768/15": 0, + "6/768/16": 0, + "6/768/16385": 0, + "6/768/16394": 25, + "6/768/16395": 1, + "6/768/16396": 65279, + "6/768/16397": 0, + "6/768/16400": null, + "6/768/65532": 25, + "6/768/65533": 7, + "6/768/65528": [], + "6/768/65529": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 71, 75, 76], + "6/768/65531": [ + 0, 1, 2, 3, 4, 7, 8, 15, 16, 16385, 16394, 16395, 16396, 16397, 16400, + 65528, 65529, 65531, 65532, 65533 + ], + "7/29/0": [ + { + "0": 1296, + "1": 1 + } + ], + "7/29/1": [29, 65, 80, 144, 145, 156], + "7/29/2": [], + "7/29/3": [], + "7/29/65532": 0, + "7/29/65533": 2, + "7/29/65528": [], + "7/29/65529": [], + "7/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "7/65/0": [], + "7/65/65532": 0, + "7/65/65533": 1, + "7/65/65528": [], + "7/65/65529": [], + "7/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "7/80/0": "LED Effect", + "7/80/1": 0, + "7/80/2": [ + { + "0": "Solid", + "1": 1, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Fast Blink", + "1": 2, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Slow Blink", + "1": 3, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Middle Chase", + "1": 5, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Open Close", + "1": 6, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Small To Big", + "1": 7, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Slow Falling", + "1": 9, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Middle Falling", + "1": 10, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Fast Falling", + "1": 11, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Slow Rising", + "1": 12, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Middle Rising", + "1": 13, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Fast Rising", + "1": 14, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Middle Blink", + "1": 15, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Slow Chase", + "1": 16, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Fast Chase", + "1": 17, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Slow Siren", + "1": 18, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Fast Siren", + "1": 19, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "7/80/3": 1, + "7/80/65532": 0, + "7/80/65533": 2, + "7/80/65528": [], + "7/80/65529": [0], + "7/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "7/144/0": 2, + "7/144/1": 3, + "7/144/2": [ + { + "0": 5, + "1": true, + "2": 0, + "3": 2000000, + "4": [ + { + "0": 0, + "1": 2000000, + "2": 1000, + "3": 100, + "4": 500 + } + ] + }, + { + "0": 2, + "1": true, + "2": 0, + "3": 16000, + "4": [ + { + "0": 0, + "1": 16000, + "2": 1000, + "3": 100, + "4": 500 + } + ] + }, + { + "0": 1, + "1": true, + "2": 0, + "3": 300000, + "4": [ + { + "0": 0, + "1": 300000, + "2": 1000, + "3": 100, + "4": 500 + } + ] + } + ], + "7/144/4": 124643, + "7/144/5": 0, + "7/144/8": 0, + "7/144/65532": 2, + "7/144/65533": 1, + "7/144/65528": [], + "7/144/65529": [], + "7/144/65531": [0, 1, 2, 4, 5, 8, 65528, 65529, 65531, 65532, 65533], + "7/145/0": { + "0": 14, + "1": true, + "2": 0, + "3": 1000000000000000, + "4": [ + { + "0": 0, + "1": 1000000000000000, + "2": 500, + "3": 50 + } + ] + }, + "7/145/1": { + "0": 13139190 + }, + "7/145/65532": 5, + "7/145/65533": 1, + "7/145/65528": [], + "7/145/65529": [], + "7/145/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "7/156/65532": 1, + "7/156/65533": 1, + "7/156/65528": [], + "7/156/65529": [], + "7/156/65531": [65528, 65529, 65531, 65532, 65533], + "8/3/0": 0, + "8/3/1": 0, + "8/3/65532": 0, + "8/3/65533": 5, + "8/3/65528": [], + "8/3/65529": [0], + "8/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "8/29/0": [ + { + "0": 775, + "1": 1 + } + ], + "8/29/1": [3, 29, 65, 80, 1029], + "8/29/2": [], + "8/29/3": [], + "8/29/65532": 0, + "8/29/65533": 2, + "8/29/65528": [], + "8/29/65529": [], + "8/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "8/65/0": [], + "8/65/65532": 0, + "8/65/65533": 1, + "8/65/65528": [], + "8/65/65529": [], + "8/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "8/80/0": "Local Protection", + "8/80/1": 0, + "8/80/2": [ + { + "0": "Local Protection Disable", + "1": 0, + "2": [ + { + "0": 0, + "1": 0 + } + ] + }, + { + "0": "Local Protection Enable", + "1": 1, + "2": [ + { + "0": 0, + "1": 0 + } + ] + } + ], + "8/80/3": 0, + "8/80/65532": 0, + "8/80/65533": 2, + "8/80/65528": [], + "8/80/65529": [0], + "8/80/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533], + "8/1029/0": 6292, + "8/1029/1": 0, + "8/1029/2": 10000, + "8/1029/65532": 0, + "8/1029/65533": 3, + "8/1029/65528": [], + "8/1029/65529": [], + "8/1029/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533], + "9/3/0": 0, + "9/3/1": 0, + "9/3/65532": 0, + "9/3/65533": 5, + "9/3/65528": [], + "9/3/65529": [0], + "9/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533], + "9/29/0": [ + { + "0": 770, + "1": 1 + } + ], + "9/29/1": [3, 29, 65, 1026], + "9/29/2": [], + "9/29/3": [], + "9/29/4": [ + { + "0": null, + "1": 6, + "2": 8 + }, + { + "0": null, + "1": 6, + "2": 3 + } + ], + "9/29/65532": 1, + "9/29/65533": 2, + "9/29/65528": [], + "9/29/65529": [], + "9/29/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533], + "9/65/0": [], + "9/65/65532": 0, + "9/65/65533": 1, + "9/65/65528": [], + "9/65/65529": [], + "9/65/65531": [0, 65528, 65529, 65531, 65532, 65533], + "9/1026/0": 2183, + "9/1026/1": null, + "9/1026/2": null, + "9/1026/65532": 0, + "9/1026/65533": 4, + "9/1026/65528": [], + "9/1026/65529": [], + "9/1026/65531": [0, 1, 2, 65528, 65529, 65531, 65532, 65533] + }, + "attribute_subscriptions": [] +} diff --git a/tests/components/matter/snapshots/test_button.ambr b/tests/components/matter/snapshots/test_button.ambr index c16f66a5e88bfe..4f2541054c7bbf 100644 --- a/tests/components/matter/snapshots/test_button.ambr +++ b/tests/components/matter/snapshots/test_button.ambr @@ -828,6 +828,55 @@ 'state': 'unknown', }) # --- +# name: test_buttons[inovelli_vtm30][button.white_series_onoff_switch_load_control-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'button', + 'entity_category': , + 'entity_id': 'button.white_series_onoff_switch_load_control', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-IdentifyButton-3-1', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[inovelli_vtm30][button.white_series_onoff_switch_load_control-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'identify', + 'friendly_name': 'White Series OnOff Switch Load Control', + }), + 'context': , + 'entity_id': 'button.white_series_onoff_switch_load_control', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_buttons[laundry_dryer][button.mock_laundrydryer_pause-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ diff --git a/tests/components/matter/snapshots/test_event.ambr b/tests/components/matter/snapshots/test_event.ambr index aa4fb483248e0b..38edc3137a2d58 100644 --- a/tests/components/matter/snapshots/test_event.ambr +++ b/tests/components/matter/snapshots/test_event.ambr @@ -192,6 +192,213 @@ 'state': 'unknown', }) # --- +# name: test_events[inovelli_vtm30][event.white_series_onoff_switch_config-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'event_types': list([ + 'multi_press_1', + 'multi_press_2', + 'multi_press_3', + 'multi_press_4', + 'multi_press_5', + 'long_press', + 'long_release', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'event', + 'entity_category': None, + 'entity_id': 'event.white_series_onoff_switch_config', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Config', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'button', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-5-GenericSwitch-59-1', + 'unit_of_measurement': None, + }) +# --- +# name: test_events[inovelli_vtm30][event.white_series_onoff_switch_config-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'button', + 'event_type': None, + 'event_types': list([ + 'multi_press_1', + 'multi_press_2', + 'multi_press_3', + 'multi_press_4', + 'multi_press_5', + 'long_press', + 'long_release', + ]), + 'friendly_name': 'White Series OnOff Switch Config', + }), + 'context': , + 'entity_id': 'event.white_series_onoff_switch_config', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_events[inovelli_vtm30][event.white_series_onoff_switch_down-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'event_types': list([ + 'multi_press_1', + 'multi_press_2', + 'multi_press_3', + 'multi_press_4', + 'multi_press_5', + 'long_press', + 'long_release', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'event', + 'entity_category': None, + 'entity_id': 'event.white_series_onoff_switch_down', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Down', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'button', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-4-GenericSwitch-59-1', + 'unit_of_measurement': None, + }) +# --- +# name: test_events[inovelli_vtm30][event.white_series_onoff_switch_down-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'button', + 'event_type': None, + 'event_types': list([ + 'multi_press_1', + 'multi_press_2', + 'multi_press_3', + 'multi_press_4', + 'multi_press_5', + 'long_press', + 'long_release', + ]), + 'friendly_name': 'White Series OnOff Switch Down', + }), + 'context': , + 'entity_id': 'event.white_series_onoff_switch_down', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_events[inovelli_vtm30][event.white_series_onoff_switch_up-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'event_types': list([ + 'multi_press_1', + 'multi_press_2', + 'multi_press_3', + 'multi_press_4', + 'multi_press_5', + 'long_press', + 'long_release', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'event', + 'entity_category': None, + 'entity_id': 'event.white_series_onoff_switch_up', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Up', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'button', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-3-GenericSwitch-59-1', + 'unit_of_measurement': None, + }) +# --- +# name: test_events[inovelli_vtm30][event.white_series_onoff_switch_up-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'button', + 'event_type': None, + 'event_types': list([ + 'multi_press_1', + 'multi_press_2', + 'multi_press_3', + 'multi_press_4', + 'multi_press_5', + 'long_press', + 'long_release', + ]), + 'friendly_name': 'White Series OnOff Switch Up', + }), + 'context': , + 'entity_id': 'event.white_series_onoff_switch_up', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_events[multi_endpoint_light][event.inovelli_config-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ diff --git a/tests/components/matter/snapshots/test_light.ambr b/tests/components/matter/snapshots/test_light.ambr index e62c6696c1c637..9a403722e5c588 100644 --- a/tests/components/matter/snapshots/test_light.ambr +++ b/tests/components/matter/snapshots/test_light.ambr @@ -281,6 +281,81 @@ 'state': 'on', }) # --- +# name: test_lights[inovelli_vtm30][light.white_series_onoff_switch_rgb_indicator-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max_color_temp_kelvin': 1000000, + 'max_mireds': 66666, + 'min_color_temp_kelvin': 15, + 'min_mireds': 1, + 'supported_color_modes': list([ + , + , + , + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'light', + 'entity_category': None, + 'entity_id': 'light.white_series_onoff_switch_rgb_indicator', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'RGB Indicator', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': , + 'translation_key': 'light', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-6-MatterLight-6-0', + 'unit_of_measurement': None, + }) +# --- +# name: test_lights[inovelli_vtm30][light.white_series_onoff_switch_rgb_indicator-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'brightness': None, + 'color_mode': None, + 'color_temp': None, + 'color_temp_kelvin': None, + 'friendly_name': 'White Series OnOff Switch RGB Indicator', + 'hs_color': None, + 'max_color_temp_kelvin': 1000000, + 'max_mireds': 66666, + 'min_color_temp_kelvin': 15, + 'min_mireds': 1, + 'rgb_color': None, + 'supported_color_modes': list([ + , + , + , + ]), + 'supported_features': , + 'xy_color': None, + }), + 'context': , + 'entity_id': 'light.white_series_onoff_switch_rgb_indicator', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'off', + }) +# --- # name: test_lights[mounted_dimmable_load_control_fixture][light.mock_mounted_dimmable_load_control-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ diff --git a/tests/components/matter/snapshots/test_number.ambr b/tests/components/matter/snapshots/test_number.ambr index bceec9def46559..da92410c055f10 100644 --- a/tests/components/matter/snapshots/test_number.ambr +++ b/tests/components/matter/snapshots/test_number.ambr @@ -981,6 +981,466 @@ 'state': '255', }) # --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 255, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_load_control', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'on_level', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-on_level-8-17', + 'unit_of_measurement': None, + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Load Control', + 'max': 255, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_load_control', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '255', + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_2-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_load_control_2', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'on_transition_time', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-on_transition_time-8-18', + 'unit_of_measurement': , + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_2-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Load Control', + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_load_control_2', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_3-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_load_control_3', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'off_transition_time', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-off_transition_time-8-19', + 'unit_of_measurement': , + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_3-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Load Control', + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_load_control_3', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_4-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_load_control_4', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'on_off_transition_time', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-on_off_transition_time-8-16', + 'unit_of_measurement': , + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_4-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Load Control', + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_load_control_4', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.0', + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_5-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 75, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_load_control_5', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'led_indicator_intensity_off', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-InovelliLEDIndicatorIntensityOff-305134641-305070178', + 'unit_of_measurement': None, + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_5-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Load Control', + 'max': 75, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_load_control_5', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '1', + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_6-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 75, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_load_control_6', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'led_indicator_intensity_on', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-InovelliLEDIndicatorIntensityOn-305134641-305070177', + 'unit_of_measurement': None, + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_load_control_6-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Load Control', + 'max': 75, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_load_control_6', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '33', + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_rgb_indicator-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 255, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_rgb_indicator', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'RGB Indicator', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'on_level', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-6-on_level-8-17', + 'unit_of_measurement': None, + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_rgb_indicator-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch RGB Indicator', + 'max': 255, + 'min': 0, + 'mode': , + 'step': 1, + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_rgb_indicator', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '255', + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_rgb_indicator_2-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.white_series_onoff_switch_rgb_indicator_2', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'RGB Indicator', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'on_off_transition_time', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-6-on_off_transition_time-8-16', + 'unit_of_measurement': , + }) +# --- +# name: test_numbers[inovelli_vtm30][number.white_series_onoff_switch_rgb_indicator_2-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch RGB Indicator', + 'max': 65534, + 'min': 0, + 'mode': , + 'step': 0.1, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.white_series_onoff_switch_rgb_indicator_2', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.0', + }) +# --- # name: test_numbers[microwave_oven][number.microwave_oven_cooking_time-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ diff --git a/tests/components/matter/snapshots/test_select.ambr b/tests/components/matter/snapshots/test_select.ambr index aab3d5f7ccec35..e7283f5bdef612 100644 --- a/tests/components/matter/snapshots/test_select.ambr +++ b/tests/components/matter/snapshots/test_select.ambr @@ -981,6 +981,678 @@ 'state': 'previous', }) # --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_button_press_delay-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'No Delay', + '300ms', + '400ms', + '500ms', + '600ms', + '700ms', + '800ms', + '900ms', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_button_press_delay', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Button Press Delay', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-5-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_button_press_delay-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Button Press Delay', + 'options': list([ + 'No Delay', + '300ms', + '400ms', + '500ms', + '600ms', + '700ms', + '800ms', + '900ms', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_button_press_delay', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '300ms', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_dimming_speed-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Instant', + '500ms', + '800ms', + '1s', + '1.5s', + '2s', + '2.5s', + '3s', + '3.5s', + '4s', + '5s', + '6s', + '7s', + '8s', + '10s', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_dimming_speed', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Dimming Speed', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-4-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_dimming_speed-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Dimming Speed', + 'options': list([ + 'Instant', + '500ms', + '800ms', + '1s', + '1.5s', + '2s', + '2.5s', + '3s', + '3.5s', + '4s', + '5s', + '6s', + '7s', + '8s', + '10s', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_dimming_speed', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Instant', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_led_color-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Red', + 'Orange', + 'Lemon', + 'Lime', + 'Green', + 'Teal', + 'Cyan', + 'Aqua', + 'Blue', + 'Violet', + 'Magenta', + 'Pink', + 'White', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_led_color', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'LED Color', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-6-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_led_color-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch LED Color', + 'options': list([ + 'Red', + 'Orange', + 'Lemon', + 'Lime', + 'Green', + 'Teal', + 'Cyan', + 'Aqua', + 'Blue', + 'Violet', + 'Magenta', + 'Pink', + 'White', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_led_color', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Green', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_led_effect-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Solid', + 'Fast Blink', + 'Slow Blink', + 'Middle Chase', + 'Open Close', + 'Small To Big', + 'Slow Falling', + 'Middle Falling', + 'Fast Falling', + 'Slow Rising', + 'Middle Rising', + 'Fast Rising', + 'Middle Blink', + 'Slow Chase', + 'Fast Chase', + 'Slow Siren', + 'Fast Siren', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_led_effect', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'LED Effect', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-7-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_led_effect-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch LED Effect', + 'options': list([ + 'Solid', + 'Fast Blink', + 'Slow Blink', + 'Middle Chase', + 'Open Close', + 'Small To Big', + 'Slow Falling', + 'Middle Falling', + 'Fast Falling', + 'Slow Rising', + 'Middle Rising', + 'Fast Rising', + 'Middle Blink', + 'Slow Chase', + 'Fast Chase', + 'Slow Siren', + 'Fast Siren', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_led_effect', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Solid', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_load_control-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'on', + 'off', + 'toggle', + 'previous', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_load_control', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'startup_on_off', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-MatterStartUpOnOff-6-16387', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_load_control-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Load Control', + 'options': list([ + 'on', + 'off', + 'toggle', + 'previous', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_load_control', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'previous', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_local_protection-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Local Protection Disable', + 'Local Protection Enable', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_local_protection', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Local Protection', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-8-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_local_protection-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Local Protection', + 'options': list([ + 'Local Protection Disable', + 'Local Protection Enable', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_local_protection', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Local Protection Disable', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_local_timer-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Local Timer Disable', + 'Local Timer Enable', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_local_timer', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Local Timer', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-3-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_local_timer-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Local Timer', + 'options': list([ + 'Local Timer Disable', + 'Local Timer Enable', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_local_timer', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Local Timer Disable', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_rgb_indicator-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'on', + 'off', + 'toggle', + 'previous', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_rgb_indicator', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'RGB Indicator', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'startup_on_off', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-6-MatterStartUpOnOff-6-16387', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_rgb_indicator-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch RGB Indicator', + 'options': list([ + 'on', + 'off', + 'toggle', + 'previous', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_rgb_indicator', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'previous', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_smart_bulb_mode-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Smart Bulb Disable', + 'Smart Bulb Enable', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_smart_bulb_mode', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Smart Bulb Mode', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-2-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_smart_bulb_mode-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Smart Bulb Mode', + 'options': list([ + 'Smart Bulb Disable', + 'Smart Bulb Enable', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_smart_bulb_mode', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Smart Bulb Disable', + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_switch_mode-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'On/Off+Single', + 'On/Off+AUX', + 'Dimmer+Single', + 'Dimmer+AUX', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.white_series_onoff_switch_switch_mode', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Switch Mode', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'mode', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-MatterModeSelect-80-3', + 'unit_of_measurement': None, + }) +# --- +# name: test_selects[inovelli_vtm30][select.white_series_onoff_switch_switch_mode-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Switch Mode', + 'options': list([ + 'On/Off+Single', + 'On/Off+AUX', + 'Dimmer+Single', + 'Dimmer+AUX', + ]), + }), + 'context': , + 'entity_id': 'select.white_series_onoff_switch_switch_mode', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'On/Off+Single', + }) +# --- # name: test_selects[laundry_dryer][select.mock_laundrydryer_temperature_level-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ diff --git a/tests/components/matter/snapshots/test_sensor.ambr b/tests/components/matter/snapshots/test_sensor.ambr index 9f01def19f2fe1..41cf65d8ed3f42 100644 --- a/tests/components/matter/snapshots/test_sensor.ambr +++ b/tests/components/matter/snapshots/test_sensor.ambr @@ -3701,6 +3701,504 @@ 'state': '0.0', }) # --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_active_current-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.white_series_onoff_switch_active_current', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Active current', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'active_current', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-7-ElectricalPowerMeasurementActiveCurrent-144-5', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_active_current-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'current', + 'friendly_name': 'White Series OnOff Switch Active current', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_active_current', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.0', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_config-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.white_series_onoff_switch_config', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Config', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'switch_current_position', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-5-SwitchCurrentPosition-59-1', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_config-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Config', + 'state_class': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_config', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_down-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.white_series_onoff_switch_down', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Down', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'switch_current_position', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-4-SwitchCurrentPosition-59-1', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_down-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Down', + 'state_class': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_down', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.white_series_onoff_switch_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 3, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Energy', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-7-ElectricalEnergyMeasurementCumulativeEnergyImported-145-1', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'White Series OnOff Switch Energy', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '13.13919', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_humidity-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.white_series_onoff_switch_humidity', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Humidity', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-8-HumiditySensor-1029-0', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_humidity-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'humidity', + 'friendly_name': 'White Series OnOff Switch Humidity', + 'state_class': , + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_humidity', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '62.92', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_power-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.white_series_onoff_switch_power', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Power', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-7-ElectricalPowerMeasurementWatt-144-8', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_power-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'White Series OnOff Switch Power', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_power', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.0', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.white_series_onoff_switch_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 1, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Temperature', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-9-TemperatureSensor-1026-0', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'White Series OnOff Switch Temperature', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '21.83', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_up-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.white_series_onoff_switch_up', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Up', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'switch_current_position', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-3-SwitchCurrentPosition-59-1', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_up-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'White Series OnOff Switch Up', + 'state_class': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_up', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0', + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_voltage-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.white_series_onoff_switch_voltage', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Voltage', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'voltage', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-7-ElectricalPowerMeasurementVoltage-144-4', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[inovelli_vtm30][sensor.white_series_onoff_switch_voltage-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'voltage', + 'friendly_name': 'White Series OnOff Switch Voltage', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.white_series_onoff_switch_voltage', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '124.643', + }) +# --- # name: test_sensors[laundry_dryer][sensor.mock_laundrydryer_current_phase-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ diff --git a/tests/components/matter/snapshots/test_switch.ambr b/tests/components/matter/snapshots/test_switch.ambr index 50542fcdddc0e5..eb5c97501a193b 100644 --- a/tests/components/matter/snapshots/test_switch.ambr +++ b/tests/components/matter/snapshots/test_switch.ambr @@ -437,6 +437,55 @@ 'state': 'off', }) # --- +# name: test_switches[inovelli_vtm30][switch.white_series_onoff_switch_load_control-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'switch', + 'entity_category': None, + 'entity_id': 'switch.white_series_onoff_switch_load_control', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Load Control', + 'platform': 'matter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'switch', + 'unique_id': '00000000000004D2-0000000000000100-MatterNodeDevice-1-MatterPlug-6-0', + 'unit_of_measurement': None, + }) +# --- +# name: test_switches[inovelli_vtm30][switch.white_series_onoff_switch_load_control-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'outlet', + 'friendly_name': 'White Series OnOff Switch Load Control', + }), + 'context': , + 'entity_id': 'switch.white_series_onoff_switch_load_control', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'off', + }) +# --- # name: test_switches[laundry_dryer][switch.mock_laundrydryer_power-entry] EntityRegistryEntrySnapshot({ 'aliases': set({