Fix missing delay and repeat support in LG Netcast remote (#170324)

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
mithomas
2026-05-19 20:49:43 +02:00
committed by GitHub
co-authored by Copilot
parent 29e2184163
commit da4263b95c
2 changed files with 125 additions and 4 deletions
+14 -3
View File
@@ -1,12 +1,18 @@
"""Remote control support for LG Netcast TV."""
from collections.abc import Iterable
import time
from typing import TYPE_CHECKING, Any
from pylgnetcast import LG_COMMAND, LgNetCastClient, LgNetCastError
from requests import RequestException
from homeassistant.components.remote import ATTR_NUM_REPEATS, RemoteEntity
from homeassistant.components.remote import (
ATTR_DELAY_SECS,
ATTR_NUM_REPEATS,
DEFAULT_DELAY_SECS,
RemoteEntity,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers.device_registry import DeviceInfo
@@ -54,16 +60,21 @@ class LgNetCastRemote(RemoteEntity):
def send_command(self, command: Iterable[str], **kwargs: Any) -> None:
"""Send commands to the TV."""
num_repeats = kwargs[ATTR_NUM_REPEATS]
delay_secs = kwargs.get(ATTR_DELAY_SECS, DEFAULT_DELAY_SECS)
commands: list[int] = []
for cmd in command:
if cmd not in VALID_COMMANDS:
raise ServiceValidationError(f"Unknown command: {cmd!r}")
commands.append(getattr(LG_COMMAND, cmd))
for _ in range(num_repeats):
for i in range(num_repeats):
try:
with self._client as client:
for lg_command in commands:
if i > 0:
time.sleep(delay_secs)
for j, lg_command in enumerate(commands):
if j > 0:
time.sleep(delay_secs)
client.send_command(lg_command)
except LgNetCastError, RequestException:
self._attr_is_on = False
+111 -1
View File
@@ -1,13 +1,15 @@
"""Tests for LG Netcast remote platform."""
from collections.abc import Generator
from unittest.mock import MagicMock, patch
from unittest.mock import MagicMock, call, patch
from pylgnetcast import LG_COMMAND
import pytest
from homeassistant.components.remote import (
ATTR_COMMAND,
ATTR_DELAY_SECS,
ATTR_NUM_REPEATS,
DOMAIN as REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
)
@@ -57,3 +59,111 @@ async def test_send_command_invalid(
{ATTR_ENTITY_ID: REMOTE_ENTITY_ID, ATTR_COMMAND: ["NOT_A_REAL_COMMAND"]},
blocking=True,
)
async def test_send_multiple_commands(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command calls the client for each command in the list."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{ATTR_ENTITY_ID: REMOTE_ENTITY_ID, ATTR_COMMAND: ["POWER", "NUMBER_0"]},
blocking=True,
)
assert context_client.send_command.call_count == 2
context_client.send_command.assert_has_calls(
[
call(LG_COMMAND.POWER),
call(LG_COMMAND.NUMBER_0),
]
)
async def test_send_multiple_commands_with_delay(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command sleeps between commands when delay_secs is set."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
with patch("homeassistant.components.lg_netcast.remote.time.sleep") as mock_sleep:
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{
ATTR_ENTITY_ID: REMOTE_ENTITY_ID,
ATTR_COMMAND: ["POWER", "NUMBER_0", "NUMBER_1"],
ATTR_DELAY_SECS: 0.5,
},
blocking=True,
)
assert context_client.send_command.call_count == 3
context_client.send_command.assert_has_calls(
[
call(LG_COMMAND.POWER),
call(LG_COMMAND.NUMBER_0),
call(LG_COMMAND.NUMBER_1),
]
)
assert mock_sleep.call_count == 2
mock_sleep.assert_called_with(0.5)
async def test_send_command_repeats_with_delay(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command sleeps between repeats when delay_secs is set."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
with patch("homeassistant.components.lg_netcast.remote.time.sleep") as mock_sleep:
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{
ATTR_ENTITY_ID: REMOTE_ENTITY_ID,
ATTR_COMMAND: ["POWER"],
ATTR_NUM_REPEATS: 3,
ATTR_DELAY_SECS: 0.5,
},
blocking=True,
)
assert context_client.send_command.call_count == 3
# sleep once before each repeat after the first (2 times), no sleep between commands since there's only one
assert mock_sleep.call_count == 2
mock_sleep.assert_called_with(0.5)
async def test_send_multiple_commands_repeats_with_delay(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command sleeps between commands and between repeats."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
with patch("homeassistant.components.lg_netcast.remote.time.sleep") as mock_sleep:
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{
ATTR_ENTITY_ID: REMOTE_ENTITY_ID,
ATTR_COMMAND: ["POWER", "NUMBER_0"],
ATTR_NUM_REPEATS: 3,
ATTR_DELAY_SECS: 0.5,
},
blocking=True,
)
# 2 commands × 3 repeats = 6 total sends
assert context_client.send_command.call_count == 6
# 1 sleep between the 2 commands per repeat (3 repeats) + 1 sleep before each repeat after the first (2)
# = 3 + 2 = 5 sleeps total
assert mock_sleep.call_count == 5
mock_sleep.assert_called_with(0.5)