Reolink conserve battery (#145452)

This commit is contained in:
starkillerOG
2025-06-10 18:05:55 +02:00
committed by GitHub
parent 3af2746fea
commit d71ddcf69e
5 changed files with 178 additions and 30 deletions

View File

@@ -19,7 +19,12 @@ from homeassistant.components.reolink import (
FIRMWARE_UPDATE_INTERVAL,
NUM_CRED_ERRORS,
)
from homeassistant.components.reolink.const import CONF_BC_PORT, DOMAIN
from homeassistant.components.reolink.const import (
BATTERY_ALL_WAKE_UPDATE_INTERVAL,
BATTERY_PASSIVE_WAKE_UPDATE_INTERVAL,
CONF_BC_PORT,
DOMAIN,
)
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import (
CONF_HOST,
@@ -1111,6 +1116,76 @@ async def test_privacy_mode_change_callback(
assert config_entry.state is ConfigEntryState.NOT_LOADED
async def test_camera_wake_callback(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
config_entry: MockConfigEntry,
reolink_connect: MagicMock,
) -> None:
"""Test camera wake callback."""
class callback_mock_class:
callback_func = None
def register_callback(
self, callback_id: str, callback: Callable[[], None], *args, **key_args
) -> None:
if callback_id == "camera_0_wake":
self.callback_func = callback
callback_mock = callback_mock_class()
reolink_connect.model = TEST_HOST_MODEL
reolink_connect.baichuan.events_active = True
reolink_connect.baichuan.subscribe_events.reset_mock(side_effect=True)
reolink_connect.baichuan.register_callback = callback_mock.register_callback
reolink_connect.sleeping.return_value = True
reolink_connect.audio_record.return_value = True
reolink_connect.get_states = AsyncMock()
with (
patch("homeassistant.components.reolink.PLATFORMS", [Platform.SWITCH]),
patch(
"homeassistant.components.reolink.host.time",
return_value=BATTERY_ALL_WAKE_UPDATE_INTERVAL,
),
):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert config_entry.state is ConfigEntryState.LOADED
entity_id = f"{Platform.SWITCH}.{TEST_NVR_NAME}_record_audio"
assert hass.states.get(entity_id).state == STATE_ON
reolink_connect.sleeping.return_value = False
reolink_connect.get_states.reset_mock()
assert reolink_connect.get_states.call_count == 0
# simulate a TCP push callback signaling the battery camera woke up
reolink_connect.audio_record.return_value = False
assert callback_mock.callback_func is not None
with (
patch(
"homeassistant.components.reolink.host.time",
return_value=BATTERY_ALL_WAKE_UPDATE_INTERVAL
+ BATTERY_PASSIVE_WAKE_UPDATE_INTERVAL
+ 5,
),
patch(
"homeassistant.components.reolink.time",
return_value=BATTERY_ALL_WAKE_UPDATE_INTERVAL
+ BATTERY_PASSIVE_WAKE_UPDATE_INTERVAL
+ 5,
),
):
callback_mock.callback_func()
await hass.async_block_till_done()
# check that a coordinator update was scheduled.
assert reolink_connect.get_states.call_count >= 1
assert hass.states.get(entity_id).state == STATE_OFF
async def test_remove(
hass: HomeAssistant,
reolink_connect: MagicMock,