diff --git a/homeassistant/components/ezviz/manifest.json b/homeassistant/components/ezviz/manifest.json index bef054eac273..54d72c70f361 100644 --- a/homeassistant/components/ezviz/manifest.json +++ b/homeassistant/components/ezviz/manifest.json @@ -7,5 +7,5 @@ "documentation": "https://www.home-assistant.io/integrations/ezviz", "iot_class": "cloud_polling", "loggers": ["paho_mqtt", "pyezvizapi"], - "requirements": ["pyezvizapi==1.0.0.7"] + "requirements": ["pyezvizapi==1.0.5.0"] } diff --git a/homeassistant/components/ezviz/select.py b/homeassistant/components/ezviz/select.py index d330ba0fdeae..5b5986be4abe 100644 --- a/homeassistant/components/ezviz/select.py +++ b/homeassistant/components/ezviz/select.py @@ -66,15 +66,18 @@ ALARM_SOUND_MODE_SELECT_TYPE = EzvizSelectEntityDescription( def battery_work_mode_current_option(ezvizSelect: EzvizSelect) -> str | None: """Return the selected entity option to represent the entity state.""" - battery_work_mode = getattr( - BatteryCameraWorkMode, - ezvizSelect.data[ezvizSelect.entity_description.key], - BatteryCameraWorkMode.UNKNOWN, - ) - if battery_work_mode == BatteryCameraWorkMode.UNKNOWN: + value = ezvizSelect.data[ezvizSelect.entity_description.key] + # pyezvizapi >= 1.0.4 reports the raw mode number instead of its name. + try: + battery_work_mode = ( + BatteryCameraWorkMode(value) + if isinstance(value, int) + else BatteryCameraWorkMode[value] + ) + except KeyError, ValueError: return None - - return battery_work_mode.name.lower() + option = battery_work_mode.name.lower() + return option if option in (ezvizSelect.entity_description.options or ()) else None def battery_work_mode_select_option( diff --git a/homeassistant/components/ezviz/switch.py b/homeassistant/components/ezviz/switch.py index 87e7a06fc363..656645928877 100644 --- a/homeassistant/components/ezviz/switch.py +++ b/homeassistant/components/ezviz/switch.py @@ -67,7 +67,7 @@ SWITCH_TYPES: dict[int, EzvizSwitchEntityDescription] = { key="29", translation_key="all_day_video_recording", device_class=SwitchDeviceClass.SWITCH, - supported_ext=str(SupportExt.SupportFulldayRecord.value), + supported_ext=str(SupportExt.SupportFullDayRecord.value), ), 32: EzvizSwitchEntityDescription( key="32", diff --git a/requirements_all.txt b/requirements_all.txt index 6be065d8a78a..5b26b37eedd6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2238,7 +2238,7 @@ pyeverlights==0.1.0 pyevilgenius==2.0.0 # homeassistant.components.ezviz -pyezvizapi==1.0.0.7 +pyezvizapi==1.0.5.0 # homeassistant.components.fibaro pyfibaro==0.8.3 diff --git a/tests/components/ezviz/test_select.py b/tests/components/ezviz/test_select.py new file mode 100644 index 000000000000..0874b26511b2 --- /dev/null +++ b/tests/components/ezviz/test_select.py @@ -0,0 +1,84 @@ +"""Tests for EZVIZ select entities.""" + +from unittest.mock import AsyncMock + +from pyezvizapi.constants import BatteryCameraWorkMode, DeviceCatagories, SupportExt +import pytest + +from homeassistant.components.select import ( + ATTR_OPTION, + DOMAIN as SELECT_DOMAIN, + SERVICE_SELECT_OPTION, +) +from homeassistant.const import ATTR_ENTITY_ID, STATE_UNKNOWN +from homeassistant.core import HomeAssistant + +from . import setup_integration +from .test_init import _mock_camera_data + +from tests.common import MockConfigEntry + +ENTITY_ID = "select.camera_1_battery_work_mode" + + +def _mock_battery_camera_data(work_mode: object) -> dict[str, object]: + """Return a battery camera payload with the given work mode.""" + return _mock_camera_data( + device_category=DeviceCatagories.BATTERY_CAMERA_DEVICE_CATEGORY.value, + supportExt={str(SupportExt.SupportBatteryManage.value): "1"}, + battery_camera_work_mode=work_mode, + ) + + +@pytest.mark.parametrize( + ("work_mode", "expected_state"), + [ + (BatteryCameraWorkMode.HIGH_PERFORMANCE.value, "high_performance"), + (BatteryCameraWorkMode.POWER_SAVE.value, "power_save"), + ("PLUGGED_IN", "plugged_in"), + (BatteryCameraWorkMode.ALWAYS_ON_VIDEO.value, STATE_UNKNOWN), + (BatteryCameraWorkMode.UNKNOWN.value, STATE_UNKNOWN), + (99, STATE_UNKNOWN), + ], +) +async def test_battery_work_mode_state( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_ezviz_client: AsyncMock, + work_mode: object, + expected_state: str, +) -> None: + """Test the battery work mode from numeric and legacy name payloads.""" + mock_ezviz_client.load_cameras.return_value = { + "C123456789": _mock_battery_camera_data(work_mode) + } + + await setup_integration(hass, mock_config_entry) + + state = hass.states.get(ENTITY_ID) + assert state is not None + assert state.state == expected_state + + +async def test_battery_work_mode_select_option( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_ezviz_client: AsyncMock, +) -> None: + """Test selecting a battery work mode sends its numeric value.""" + mock_ezviz_client.load_cameras.return_value = { + "C123456789": _mock_battery_camera_data(BatteryCameraWorkMode.POWER_SAVE.value) + } + + await setup_integration(hass, mock_config_entry) + + await hass.services.async_call( + SELECT_DOMAIN, + SERVICE_SELECT_OPTION, + {ATTR_ENTITY_ID: ENTITY_ID, ATTR_OPTION: "high_performance"}, + blocking=True, + ) + + mock_ezviz_client.set_battery_camera_work_mode.assert_called_once_with( + "C123456789", BatteryCameraWorkMode.HIGH_PERFORMANCE.value + )