mirror of
https://github.com/home-assistant/core.git
synced 2026-08-24 10:13:52 -05:00
Fix missing delay and repeat support in LG Netcast remote (#170324)
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user