diff --git a/homeassistant/components/samsungtv/entity.py b/homeassistant/components/samsungtv/entity.py index 407aa896813b..80ce0e10013d 100644 --- a/homeassistant/components/samsungtv/entity.py +++ b/homeassistant/components/samsungtv/entity.py @@ -2,8 +2,6 @@ from typing import Any, override -from wakeonlan import send_magic_packet - from homeassistant.const import ( ATTR_CONNECTIONS, ATTR_IDENTIFIERS, @@ -12,7 +10,7 @@ from homeassistant.const import ( CONF_MODEL, ) from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers import device_registry as dr, issue_registry as ir +from homeassistant.helpers import device_registry as dr from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity import Entity from homeassistant.helpers.trigger import PluggableAction @@ -22,8 +20,6 @@ from .const import CONF_MANUFACTURER, DOMAIN, LOGGER from .coordinator import SamsungTVDataUpdateCoordinator from .triggers.turn_on import async_get_turn_on_trigger -DEPRECATED_IMPLICIT_WAKE_ON_LAN = "deprecated_implicit_wake_on_lan_{}" - class SamsungTVEntity(CoordinatorEntity[SamsungTVDataUpdateCoordinator], Entity): """Defines a base SamsungTV entity.""" @@ -77,13 +73,6 @@ class SamsungTVEntity(CoordinatorEntity[SamsungTVDataUpdateCoordinator], Entity) ) ) - def _wake_on_lan(self) -> None: - """Wake the device via wake on lan.""" - send_magic_packet(self._mac, ip_address=self._host) # type: ignore[arg-type] - # If the ip address changed since we last saw the device - # broadcast a packet as well - send_magic_packet(self._mac) # type: ignore[arg-type] - async def async_turn_off(self, **kwargs: Any) -> None: """Turn the device off.""" await self._bridge.async_power_off() @@ -94,28 +83,13 @@ class SamsungTVEntity(CoordinatorEntity[SamsungTVDataUpdateCoordinator], Entity) if self._turn_on_action: LOGGER.debug("Attempting to turn on %s via automation", self.entity_id) await self._turn_on_action.async_run(self.hass, self._context) - elif self._mac: - ir.async_create_issue( - self.hass, - DOMAIN, - DEPRECATED_IMPLICIT_WAKE_ON_LAN.format(self._mac), - is_fixable=False, - breaks_in_ha_version="2026.8.0", - severity=ir.IssueSeverity.WARNING, - translation_key="deprecated_implicit_wake_on_lan", - translation_placeholders={ - "mac_address": self._mac, - "wol_documentation_url": "https://www.home-assistant.io/integrations/wake_on_lan/", - }, - ) - await self.hass.async_add_executor_job(self._wake_on_lan) - else: - LOGGER.error( - "Unable to turn on %s, as it does not have an automation configured", - self.entity_id, - ) - raise HomeAssistantError( - translation_domain=DOMAIN, - translation_key="service_unsupported", - translation_placeholders={"entity": self.entity_id}, - ) + return + LOGGER.error( + "Unable to turn on %s, as it does not have an automation configured", + self.entity_id, + ) + raise HomeAssistantError( + translation_domain=DOMAIN, + translation_key="service_unsupported", + translation_placeholders={"entity": self.entity_id}, + ) diff --git a/homeassistant/components/samsungtv/manifest.json b/homeassistant/components/samsungtv/manifest.json index ff0ade0945de..11163e02992a 100644 --- a/homeassistant/components/samsungtv/manifest.json +++ b/homeassistant/components/samsungtv/manifest.json @@ -39,7 +39,6 @@ "getmac==0.9.5", "samsungctl[websocket]==0.7.1", "samsungtvws[async,encrypted]==3.0.6", - "wakeonlan==3.3.0", "async-upnp-client==0.48.2" ], "ssdp": [ diff --git a/homeassistant/components/samsungtv/media_player.py b/homeassistant/components/samsungtv/media_player.py index 26d6925ad3b6..24febb770fd4 100644 --- a/homeassistant/components/samsungtv/media_player.py +++ b/homeassistant/components/samsungtv/media_player.py @@ -94,10 +94,6 @@ class SamsungTVDevice(SamsungTVEntity, MediaPlayerEntity): self._app_list_event: asyncio.Event = asyncio.Event() self._attr_supported_features = SUPPORT_SAMSUNGTV - if self._mac: - # Deprecated: Implicit Wake-On-LAN, will be removed in 2026.8.0 - # Triggers have not yet been registered so this is adjusted in the property - self._attr_supported_features |= MediaPlayerEntityFeature.TURN_ON if self._ssdp_rendering_control_location: self._attr_supported_features |= MediaPlayerEntityFeature.VOLUME_SET diff --git a/homeassistant/components/samsungtv/strings.json b/homeassistant/components/samsungtv/strings.json index 51a7fbd290f1..25bf032b1024 100644 --- a/homeassistant/components/samsungtv/strings.json +++ b/homeassistant/components/samsungtv/strings.json @@ -94,11 +94,5 @@ "unhandled_trigger_type": { "message": "Unhandled trigger type {trigger_type}." } - }, - "issues": { - "deprecated_implicit_wake_on_lan": { - "description": "Implicit Wake-On-LAN is deprecated and will be removed in a future version of Home Assistant. Please create an explicit Wake-On-LAN automation to turn on your TV, targeting MAC address `{mac_address}`.\n\nFor more information, see the [Wake-On-LAN documentation]({wol_documentation_url}).", - "title": "Implicit Wake-On-LAN is deprecated" - } } } diff --git a/requirements_all.txt b/requirements_all.txt index eb4cc7928e6b..5f2ffe2b2a82 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -3426,7 +3426,6 @@ vsure==2.10.0 # homeassistant.components.vasttrafik vtjp==0.2.1 -# homeassistant.components.samsungtv # homeassistant.components.wake_on_lan wakeonlan==3.3.0 diff --git a/tests/components/samsungtv/test_media_player.py b/tests/components/samsungtv/test_media_player.py index e30c50eafb7c..530f0d94ddf0 100644 --- a/tests/components/samsungtv/test_media_player.py +++ b/tests/components/samsungtv/test_media_player.py @@ -1023,8 +1023,9 @@ async def test_media_previous_track(hass: HomeAssistant, remote_legacy: Mock) -> @pytest.mark.usefixtures("remote_websocket", "rest_api") -async def test_turn_on_wol(hass: HomeAssistant) -> None: - """Test turn on.""" +async def test_turn_on_without_turnon_with_mac(hass: HomeAssistant) -> None: + """Test turn on is not supported even when a MAC address is configured.""" + await async_setup_component(hass, "homeassistant", {}) entry = MockConfigEntry( domain=DOMAIN, data=ENTRYDATA_WEBSOCKET, @@ -1033,14 +1034,10 @@ async def test_turn_on_wol(hass: HomeAssistant) -> None: entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() - with patch( - "homeassistant.components.samsungtv.entity.send_magic_packet" - ) as mock_send_magic_packet: + with pytest.raises(ServiceNotSupported, match="does not support action"): await hass.services.async_call( MP_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ENTITY_ID}, True ) - await hass.async_block_till_done() - assert mock_send_magic_packet.called async def test_turn_on_without_turnon(hass: HomeAssistant, remote_legacy: Mock) -> None: diff --git a/tests/components/samsungtv/test_remote.py b/tests/components/samsungtv/test_remote.py index ec161773c1ec..e42493b56a00 100644 --- a/tests/components/samsungtv/test_remote.py +++ b/tests/components/samsungtv/test_remote.py @@ -1,6 +1,6 @@ """The tests for the SamsungTV remote platform.""" -from unittest.mock import Mock, patch +from unittest.mock import Mock import pytest from samsungtvws.encrypted.remote import SamsungTVEncryptedCommand @@ -103,8 +103,8 @@ async def test_send_command_service( @pytest.mark.usefixtures("remote_websocket", "rest_api") -async def test_turn_on_wol(hass: HomeAssistant) -> None: - """Test turn on.""" +async def test_turn_on_without_turnon_with_mac(hass: HomeAssistant) -> None: + """Test turn on fails even when a MAC address is configured.""" entry = MockConfigEntry( domain=DOMAIN, data=ENTRYDATA_WEBSOCKET, @@ -113,14 +113,12 @@ async def test_turn_on_wol(hass: HomeAssistant) -> None: entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done() - with patch( - "homeassistant.components.samsungtv.entity.send_magic_packet" - ) as mock_send_magic_packet: + with pytest.raises(HomeAssistantError) as exc_info: await hass.services.async_call( REMOTE_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ENTITY_ID}, True ) - await hass.async_block_till_done() - assert mock_send_magic_packet.called + assert exc_info.value.translation_domain == DOMAIN + assert exc_info.value.translation_key == "service_unsupported" async def test_turn_on_without_turnon(hass: HomeAssistant, remote_legacy: Mock) -> None: diff --git a/tests/components/samsungtv/test_trigger.py b/tests/components/samsungtv/test_trigger.py index ba2355160285..ca76aa546ce2 100644 --- a/tests/components/samsungtv/test_trigger.py +++ b/tests/components/samsungtv/test_trigger.py @@ -8,6 +8,7 @@ from homeassistant.components import automation from homeassistant.components.samsungtv.const import DOMAIN from homeassistant.const import SERVICE_RELOAD, SERVICE_TURN_ON from homeassistant.core import HomeAssistant, ServiceCall +from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import device_registry as dr from homeassistant.setup import async_setup_component @@ -71,17 +72,15 @@ async def test_turn_on_trigger_device_id( service_calls.clear() - # Ensure WOL backup is called when trigger not present - with patch( - "homeassistant.components.samsungtv.entity.send_magic_packet" - ) as mock_send_magic_packet: + # Turn on fails when trigger not present + with pytest.raises(HomeAssistantError): await hass.services.async_call( entity_domain, SERVICE_TURN_ON, {"entity_id": entity_id}, blocking=True ) - await hass.async_block_till_done() + await hass.async_block_till_done() + # Only the turn_on call itself was recorded, the automation did not fire assert len(service_calls) == 1 - mock_send_magic_packet.assert_called() @pytest.mark.usefixtures("remote_encrypted_websocket", "rest_api")