From be966f1196bbf304a4d323f5cf9ad394432719e5 Mon Sep 17 00:00:00 2001 From: melo Date: Thu, 25 Dec 2025 18:53:56 +0800 Subject: [PATCH 1/8] Bump tuya-device-sharing-sdk to 0.2.7 (#159734) --- homeassistant/components/tuya/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/tuya/manifest.json b/homeassistant/components/tuya/manifest.json index 6566f0881214d1..b0bc6bc45fd87c 100644 --- a/homeassistant/components/tuya/manifest.json +++ b/homeassistant/components/tuya/manifest.json @@ -43,5 +43,5 @@ "integration_type": "hub", "iot_class": "cloud_push", "loggers": ["tuya_sharing"], - "requirements": ["tuya-device-sharing-sdk==0.2.6"] + "requirements": ["tuya-device-sharing-sdk==0.2.7"] } diff --git a/requirements_all.txt b/requirements_all.txt index 3439f41c1d4e26..bc04c53feeb65f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -3050,7 +3050,7 @@ ttls==1.8.3 ttn_client==1.2.3 # homeassistant.components.tuya -tuya-device-sharing-sdk==0.2.6 +tuya-device-sharing-sdk==0.2.7 # homeassistant.components.twentemilieu twentemilieu==2.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e2cfce6bc377e5..cf781bbc20d08d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -2541,7 +2541,7 @@ ttls==1.8.3 ttn_client==1.2.3 # homeassistant.components.tuya -tuya-device-sharing-sdk==0.2.6 +tuya-device-sharing-sdk==0.2.7 # homeassistant.components.twentemilieu twentemilieu==2.2.1 From 5359a8bf26dcf2ad7fc85d1d02f3900e56f90cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Thu, 25 Dec 2025 14:15:06 +0200 Subject: [PATCH 2/8] Tidy up various Huawei LTE sensor values for display (#159728) --- homeassistant/components/huawei_lte/sensor.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/homeassistant/components/huawei_lte/sensor.py b/homeassistant/components/huawei_lte/sensor.py index 8f31ffd593b309..ae63b67596c116 100644 --- a/homeassistant/components/huawei_lte/sensor.py +++ b/homeassistant/components/huawei_lte/sensor.py @@ -6,6 +6,7 @@ from collections.abc import Callable, Sequence from dataclasses import dataclass from datetime import datetime, timedelta +import ipaddress import logging import re @@ -85,6 +86,17 @@ def format_last_reset_elapsed_seconds(value: str | None) -> datetime | None: return last_reset +def format_ipv6(value: StateType) -> tuple[StateType, str | None]: + """Format an IPv6 address for tidy display. + + Raw values from the device may contain uppercase and redundant segments. + """ + try: + return str(ipaddress.IPv6Address(str(value))), None + except ValueError: + return value, None + + def signal_icon(limits: Sequence[int], value: StateType) -> str: """Get signal icon.""" return ( @@ -139,6 +151,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): key="uptime", translation_key="uptime", native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_display_precision=0, device_class=SensorDeviceClass.DURATION, entity_category=EntityCategory.DIAGNOSTIC, ), @@ -151,6 +164,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): "WanIPv6Address": HuaweiSensorEntityDescription( key="WanIPv6Address", translation_key="wan_ipv6_address", + format_fn=format_ipv6, entity_category=EntityCategory.DIAGNOSTIC, ), }, @@ -200,11 +214,13 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): translation_key="downlink_bandwidth", # https://en.wikipedia.org/wiki/LTE_frequency_bands, arbitrary icon_fn=lambda x: bandwidth_icon((8, 15), x), + suggested_display_precision=0, entity_category=EntityCategory.DIAGNOSTIC, ), "dlfrequency": HuaweiSensorEntityDescription( key="dlfrequency", translation_key="downlink_frequency", + suggested_display_precision=0, device_class=SensorDeviceClass.FREQUENCY, entity_category=EntityCategory.DIAGNOSTIC, ), @@ -317,6 +333,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/RSRP_and_RSRQ icon_fn=lambda x: signal_icon((-100, -90, -80), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -337,6 +354,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/SINR icon_fn=lambda x: signal_icon((0, 13, 20), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -360,6 +378,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): translation_key="nrulbandwidth", # https://en.wikipedia.org/wiki/5G_NR_frequency_bands, arbitrary icon_fn=lambda x: bandwidth_icon((33, 66), x), + suggested_display_precision=0, entity_category=EntityCategory.DIAGNOSTIC, ), "nrulmcs": HuaweiSensorEntityDescription( @@ -402,6 +421,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/RSRP_and_RSRQ icon_fn=lambda x: signal_icon((-100, -90, -80), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -422,6 +442,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/RSSI icon_fn=lambda x: signal_icon((-95, -85, -75), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -443,6 +464,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/SINR icon_fn=lambda x: signal_icon((0, 13, 20), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -486,17 +508,20 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): translation_key="uplink_bandwidth", # https://en.wikipedia.org/wiki/LTE_frequency_bands, arbitrary icon_fn=lambda x: bandwidth_icon((8, 15), x), + suggested_display_precision=0, entity_category=EntityCategory.DIAGNOSTIC, ), "ulfrequency": HuaweiSensorEntityDescription( key="ulfrequency", translation_key="uplink_frequency", + suggested_display_precision=0, device_class=SensorDeviceClass.FREQUENCY, entity_category=EntityCategory.DIAGNOSTIC, ), "wdlfreq": HuaweiSensorEntityDescription( key="wdlfreq", translation_key="wdlfreq", + suggested_display_precision=0, device_class=SensorDeviceClass.FREQUENCY, entity_category=EntityCategory.DIAGNOSTIC, ), @@ -583,6 +608,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): "PrimaryIPv6Dns": HuaweiSensorEntityDescription( key="PrimaryIPv6Dns", translation_key="primary_ipv6_dns_server", + format_fn=format_ipv6, entity_category=EntityCategory.DIAGNOSTIC, ), "SecondaryDns": HuaweiSensorEntityDescription( @@ -593,6 +619,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): "SecondaryIPv6Dns": HuaweiSensorEntityDescription( key="SecondaryIPv6Dns", translation_key="secondary_ipv6_dns_server", + format_fn=format_ipv6, entity_category=EntityCategory.DIAGNOSTIC, ), }, @@ -604,6 +631,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): key="CurrentConnectTime", translation_key="current_connection_duration", native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_display_precision=0, device_class=SensorDeviceClass.DURATION, ), "CurrentDownload": HuaweiSensorEntityDescription( @@ -652,6 +680,7 @@ class HuaweiSensorEntityDescription(SensorEntityDescription): key="TotalConnectTime", translation_key="total_connected_duration", native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_display_precision=0, device_class=SensorDeviceClass.DURATION, state_class=SensorStateClass.TOTAL_INCREASING, ), From 8d2b9251314da6f47cb33579ed6a0e3f2377abd1 Mon Sep 17 00:00:00 2001 From: Retha Runolfsson <137745329+zerzhang@users.noreply.github.com> Date: Thu, 25 Dec 2025 20:50:46 +0800 Subject: [PATCH 3/8] Add support for switchbot art frame (#159710) --- .../components/switchbot/__init__.py | 6 ++ .../components/switchbot/binary_sensor.py | 6 ++ homeassistant/components/switchbot/button.py | 66 +++++++++++++++++++ homeassistant/components/switchbot/const.py | 4 ++ .../components/switchbot/strings.json | 8 +++ tests/components/switchbot/__init__.py | 24 +++++++ tests/components/switchbot/test_button.py | 62 +++++++++++++++++ 7 files changed, 176 insertions(+) create mode 100644 homeassistant/components/switchbot/button.py create mode 100644 tests/components/switchbot/test_button.py diff --git a/homeassistant/components/switchbot/__init__.py b/homeassistant/components/switchbot/__init__.py index c0f076c5f4d989..7ba3cb84e971bc 100644 --- a/homeassistant/components/switchbot/__init__.py +++ b/homeassistant/components/switchbot/__init__.py @@ -108,6 +108,11 @@ Platform.CLIMATE, Platform.SENSOR, ], + SupportedModels.ART_FRAME.value: [ + Platform.SENSOR, + Platform.BINARY_SENSOR, + Platform.BUTTON, + ], } CLASS_BY_DEVICE = { SupportedModels.CEILING_LIGHT.value: switchbot.SwitchbotCeilingLight, @@ -144,6 +149,7 @@ SupportedModels.RELAY_SWITCH_2PM.value: switchbot.SwitchbotRelaySwitch2PM, SupportedModels.GARAGE_DOOR_OPENER.value: switchbot.SwitchbotGarageDoorOpener, SupportedModels.SMART_THERMOSTAT_RADIATOR.value: switchbot.SwitchbotSmartThermostatRadiator, + SupportedModels.ART_FRAME.value: switchbot.SwitchbotArtFrame, } diff --git a/homeassistant/components/switchbot/binary_sensor.py b/homeassistant/components/switchbot/binary_sensor.py index 144089ab7778b9..f98b356924729a 100644 --- a/homeassistant/components/switchbot/binary_sensor.py +++ b/homeassistant/components/switchbot/binary_sensor.py @@ -83,6 +83,12 @@ class SwitchbotBinarySensorEntityDescription(BinarySensorEntityDescription): name=None, device_class=BinarySensorDeviceClass.MOISTURE, ), + "battery_charging": SwitchbotBinarySensorEntityDescription( + key="battery_charging", + translation_key="battery_charging", + entity_category=EntityCategory.DIAGNOSTIC, + device_class=BinarySensorDeviceClass.BATTERY_CHARGING, + ), } diff --git a/homeassistant/components/switchbot/button.py b/homeassistant/components/switchbot/button.py new file mode 100644 index 00000000000000..a5a32f96f50f64 --- /dev/null +++ b/homeassistant/components/switchbot/button.py @@ -0,0 +1,66 @@ +"""Button support for SwitchBot devices.""" + +import logging + +import switchbot + +from homeassistant.components.button import ButtonEntity +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback + +from .coordinator import SwitchbotConfigEntry, SwitchbotDataUpdateCoordinator +from .entity import SwitchbotEntity, exception_handler + +_LOGGER = logging.getLogger(__name__) +PARALLEL_UPDATES = 0 + + +async def async_setup_entry( + hass: HomeAssistant, + entry: SwitchbotConfigEntry, + async_add_entities: AddConfigEntryEntitiesCallback, +) -> None: + """Set up Switchbot button platform.""" + coordinator = entry.runtime_data + + if isinstance(coordinator.device, switchbot.SwitchbotArtFrame): + async_add_entities( + [ + SwitchBotArtFrameNextButton(coordinator, "next_image"), + SwitchBotArtFramePrevButton(coordinator, "previous_image"), + ] + ) + + +class SwitchBotArtFrameButtonBase(SwitchbotEntity, ButtonEntity): + """Base class for Art Frame buttons.""" + + _device: switchbot.SwitchbotArtFrame + + def __init__( + self, coordinator: SwitchbotDataUpdateCoordinator, translation_key: str + ) -> None: + """Initialize the button base.""" + super().__init__(coordinator) + self._attr_unique_id = f"{coordinator.base_unique_id}_{translation_key}" + self._attr_translation_key = translation_key + + +class SwitchBotArtFrameNextButton(SwitchBotArtFrameButtonBase): + """Representation of a next image button.""" + + @exception_handler + async def async_press(self) -> None: + """Handle the button press.""" + _LOGGER.debug("Pressing next image button %s", self._address) + await self._device.next_image() + + +class SwitchBotArtFramePrevButton(SwitchBotArtFrameButtonBase): + """Representation of a previous image button.""" + + @exception_handler + async def async_press(self) -> None: + """Handle the button press.""" + _LOGGER.debug("Pressing previous image button %s", self._address) + await self._device.prev_image() diff --git a/homeassistant/components/switchbot/const.py b/homeassistant/components/switchbot/const.py index 0bc49ebad7bb3d..0b31de28db1bbc 100644 --- a/homeassistant/components/switchbot/const.py +++ b/homeassistant/components/switchbot/const.py @@ -61,6 +61,7 @@ class SupportedModels(StrEnum): CLIMATE_PANEL = "climate_panel" SMART_THERMOSTAT_RADIATOR = "smart_thermostat_radiator" S20_VACUUM = "s20_vacuum" + ART_FRAME = "art_frame" CONNECTABLE_SUPPORTED_MODEL_TYPES = { @@ -100,6 +101,7 @@ class SupportedModels(StrEnum): SwitchbotModel.GARAGE_DOOR_OPENER: SupportedModels.GARAGE_DOOR_OPENER, SwitchbotModel.CLIMATE_PANEL: SupportedModels.CLIMATE_PANEL, SwitchbotModel.SMART_THERMOSTAT_RADIATOR: SupportedModels.SMART_THERMOSTAT_RADIATOR, + SwitchbotModel.ART_FRAME: SupportedModels.ART_FRAME, } NON_CONNECTABLE_SUPPORTED_MODEL_TYPES = { @@ -139,6 +141,7 @@ class SupportedModels(StrEnum): SwitchbotModel.RELAY_SWITCH_2PM, SwitchbotModel.GARAGE_DOOR_OPENER, SwitchbotModel.SMART_THERMOSTAT_RADIATOR, + SwitchbotModel.ART_FRAME, } ENCRYPTED_SWITCHBOT_MODEL_TO_CLASS: dict[ @@ -161,6 +164,7 @@ class SupportedModels(StrEnum): SwitchbotModel.RELAY_SWITCH_2PM: switchbot.SwitchbotRelaySwitch2PM, SwitchbotModel.GARAGE_DOOR_OPENER: switchbot.SwitchbotRelaySwitch, SwitchbotModel.SMART_THERMOSTAT_RADIATOR: switchbot.SwitchbotSmartThermostatRadiator, + SwitchbotModel.ART_FRAME: switchbot.SwitchbotArtFrame, } HASS_SENSOR_TYPE_TO_SWITCHBOT_MODEL = { diff --git a/homeassistant/components/switchbot/strings.json b/homeassistant/components/switchbot/strings.json index 06b8732f9ccd3d..022dc9a04bc7ad 100644 --- a/homeassistant/components/switchbot/strings.json +++ b/homeassistant/components/switchbot/strings.json @@ -100,6 +100,14 @@ "name": "Unlocked alarm" } }, + "button": { + "next_image": { + "name": "Next image" + }, + "previous_image": { + "name": "Previous image" + } + }, "climate": { "climate": { "state_attributes": { diff --git a/tests/components/switchbot/__init__.py b/tests/components/switchbot/__init__.py index f229f961452f20..fb3e04cc09c9c8 100644 --- a/tests/components/switchbot/__init__.py +++ b/tests/components/switchbot/__init__.py @@ -1273,3 +1273,27 @@ def make_advertisement( connectable=False, tx_power=-127, ) + +ART_FRAME_INFO = BluetoothServiceInfoBleak( + name="Art Frame", + manufacturer_data={2409: b"\xb0\xe9\xfe\xe2\xfa8\x157\x03\x08"}, + service_data={ + "0000fd3d-0000-1000-8000-00805f9b34fb": b"\x00\x007\x01\x11>\x10", + }, + service_uuids=["cba20d00-224d-11e6-9fb8-0002a5d5c51b"], + address="AA:BB:CC:DD:EE:FF", + rssi=-60, + source="local", + advertisement=generate_advertisement_data( + local_name="Art Frame", + manufacturer_data={2409: b"\xb0\xe9\xfe\xe2\xfa8\x157\x03\x08"}, + service_data={ + "0000fd3d-0000-1000-8000-00805f9b34fb": b"\x00\x007\x01\x11>\x10" + }, + service_uuids=["cba20d00-224d-11e6-9fb8-0002a5d5c51b"], + ), + device=generate_ble_device("AA:BB:CC:DD:EE:FF", "Art Frame"), + time=0, + connectable=True, + tx_power=-127, +) diff --git a/tests/components/switchbot/test_button.py b/tests/components/switchbot/test_button.py new file mode 100644 index 00000000000000..bce9c5f5d5aa9c --- /dev/null +++ b/tests/components/switchbot/test_button.py @@ -0,0 +1,62 @@ +"""Tests for the switchbot button platform.""" + +from collections.abc import Callable +from unittest.mock import AsyncMock, patch + +import pytest + +from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN, SERVICE_PRESS +from homeassistant.const import ATTR_ENTITY_ID +from homeassistant.core import HomeAssistant + +from . import ART_FRAME_INFO + +from tests.common import MockConfigEntry +from tests.components.bluetooth import inject_bluetooth_service_info + + +@pytest.mark.parametrize( + ("service", "mock_method", "entity_id"), + [ + (SERVICE_PRESS, "next_image", "button.test_name_next_image"), + (SERVICE_PRESS, "prev_image", "button.test_name_previous_image"), + ], +) +async def test_art_frame_button_press( + hass: HomeAssistant, + mock_entry_encrypted_factory: Callable[[str], MockConfigEntry], + service: str, + mock_method: str, + entity_id: str, +) -> None: + """Test pressing the button on the art frame device.""" + inject_bluetooth_service_info(hass, ART_FRAME_INFO) + + entry = mock_entry_encrypted_factory("art_frame") + entry.add_to_hass(hass) + + mock_basic_info = AsyncMock( + return_value=b"\x016\x07\x01\x00\x00\x04\x00\xde\x18\xa5\x00\x00\x00\x00\x00\x00" + ) + mocked_instance = AsyncMock(return_value=True) + with patch.multiple( + "homeassistant.components.switchbot.button.switchbot.SwitchbotArtFrame", + _get_basic_info=mock_basic_info, + **{mock_method: mocked_instance}, + ): + assert await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + entity_ids = [ + entity.entity_id for entity in hass.states.async_all(BUTTON_DOMAIN) + ] + assert entity_ids, "No button entities found" + + await hass.services.async_call( + BUTTON_DOMAIN, + service, + {ATTR_ENTITY_ID: entity_id}, + blocking=True, + ) + + mocked_instance.assert_awaited_once() From fb6380157adefd28b462ea17905c671e472619ef Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Thu, 25 Dec 2025 13:51:19 +0100 Subject: [PATCH 4/8] Add integration_type hub to neato (#159705) --- homeassistant/components/neato/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/neato/manifest.json b/homeassistant/components/neato/manifest.json index c91de53662e658..577a515bf4df6f 100644 --- a/homeassistant/components/neato/manifest.json +++ b/homeassistant/components/neato/manifest.json @@ -5,6 +5,7 @@ "config_flow": true, "dependencies": ["application_credentials"], "documentation": "https://www.home-assistant.io/integrations/neato", + "integration_type": "hub", "iot_class": "cloud_polling", "loggers": ["pybotvac"], "requirements": ["pybotvac==0.0.28"] From 0a4c75951a52105b9577964c682cf78da0917a54 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Thu, 25 Dec 2025 13:51:48 +0100 Subject: [PATCH 5/8] Add integration_type device to nanoleaf (#159704) --- homeassistant/components/nanoleaf/manifest.json | 1 + homeassistant/generated/integrations.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/nanoleaf/manifest.json b/homeassistant/components/nanoleaf/manifest.json index 7af7465bbd07df..b1a2b4d3c8921d 100644 --- a/homeassistant/components/nanoleaf/manifest.json +++ b/homeassistant/components/nanoleaf/manifest.json @@ -7,6 +7,7 @@ "homekit": { "models": ["NL29", "NL42", "NL47", "NL48", "NL52", "NL59", "NL69", "NL81"] }, + "integration_type": "device", "iot_class": "local_push", "loggers": ["aionanoleaf"], "requirements": ["aionanoleaf==0.2.1"], diff --git a/homeassistant/generated/integrations.json b/homeassistant/generated/integrations.json index f8c4db10c772b8..7e151204539591 100644 --- a/homeassistant/generated/integrations.json +++ b/homeassistant/generated/integrations.json @@ -4337,7 +4337,7 @@ }, "nanoleaf": { "name": "Nanoleaf", - "integration_type": "hub", + "integration_type": "device", "config_flow": true, "iot_class": "local_push" }, From bfe1e70e06bfcec09b28246847cc1828f5b72ea1 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Thu, 25 Dec 2025 13:52:33 +0100 Subject: [PATCH 6/8] Add integration_type device to mystrom (#159703) --- homeassistant/components/mystrom/manifest.json | 1 + homeassistant/generated/integrations.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/mystrom/manifest.json b/homeassistant/components/mystrom/manifest.json index fa033700043032..2cab6ec12f617d 100644 --- a/homeassistant/components/mystrom/manifest.json +++ b/homeassistant/components/mystrom/manifest.json @@ -5,6 +5,7 @@ "config_flow": true, "dependencies": ["http"], "documentation": "https://www.home-assistant.io/integrations/mystrom", + "integration_type": "device", "iot_class": "local_polling", "loggers": ["pymystrom"], "requirements": ["python-mystrom==2.5.0"] diff --git a/homeassistant/generated/integrations.json b/homeassistant/generated/integrations.json index 7e151204539591..cdb8c07d29e17e 100644 --- a/homeassistant/generated/integrations.json +++ b/homeassistant/generated/integrations.json @@ -4301,7 +4301,7 @@ }, "mystrom": { "name": "myStrom", - "integration_type": "hub", + "integration_type": "device", "config_flow": true, "iot_class": "local_polling" }, From 3175c149c67c377c5438f9f7c8b5b263f7c446d1 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Thu, 25 Dec 2025 13:53:20 +0100 Subject: [PATCH 7/8] Add integration_type device to mpd (#159699) --- homeassistant/components/mpd/manifest.json | 1 + homeassistant/generated/integrations.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/mpd/manifest.json b/homeassistant/components/mpd/manifest.json index a361152670a91a..857c6d101cbe40 100644 --- a/homeassistant/components/mpd/manifest.json +++ b/homeassistant/components/mpd/manifest.json @@ -4,6 +4,7 @@ "codeowners": [], "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/mpd", + "integration_type": "device", "iot_class": "local_polling", "loggers": ["mpd"], "requirements": ["python-mpd2==3.1.1"] diff --git a/homeassistant/generated/integrations.json b/homeassistant/generated/integrations.json index cdb8c07d29e17e..2184d56d0ec3c0 100644 --- a/homeassistant/generated/integrations.json +++ b/homeassistant/generated/integrations.json @@ -4217,7 +4217,7 @@ }, "mpd": { "name": "Music Player Daemon (MPD)", - "integration_type": "hub", + "integration_type": "device", "config_flow": true, "iot_class": "local_polling" }, From cd6bb861a88a96a7cbdd591ee631cd4c64b002bc Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Thu, 25 Dec 2025 13:53:33 +0100 Subject: [PATCH 8/8] Add integration_type service to mutesync (#159701) --- homeassistant/components/mutesync/manifest.json | 1 + homeassistant/generated/integrations.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/mutesync/manifest.json b/homeassistant/components/mutesync/manifest.json index a3266d876b1122..a73427bb85c78d 100644 --- a/homeassistant/components/mutesync/manifest.json +++ b/homeassistant/components/mutesync/manifest.json @@ -4,6 +4,7 @@ "codeowners": ["@currentoor"], "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/mutesync", + "integration_type": "service", "iot_class": "local_polling", "loggers": ["mutesync"], "requirements": ["mutesync==0.0.1"] diff --git a/homeassistant/generated/integrations.json b/homeassistant/generated/integrations.json index 2184d56d0ec3c0..c925b3609f6cec 100644 --- a/homeassistant/generated/integrations.json +++ b/homeassistant/generated/integrations.json @@ -4277,7 +4277,7 @@ }, "mutesync": { "name": "mutesync", - "integration_type": "hub", + "integration_type": "service", "config_flow": true, "iot_class": "local_polling" },