Change camera state to an enum (#126558)

* Change camera state to an enum

* copy/paste mistake

* Add test deprecated constants
This commit is contained in:
G Johansson 2024-09-24 12:12:01 +02:00 committed by GitHub
parent 4ac9b339a1
commit 711e0ee503
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 110 additions and 79 deletions

View File

@ -77,6 +77,7 @@ from .const import ( # noqa: F401
PREF_ORIENTATION,
PREF_PRELOAD_STREAM,
SERVICE_RECORD,
CameraState,
StreamType,
)
from .img_util import scale_jpeg_camera_image
@ -98,9 +99,11 @@ ATTR_FILENAME: Final = "filename"
ATTR_MEDIA_PLAYER: Final = "media_player"
ATTR_FORMAT: Final = "format"
STATE_RECORDING: Final = "recording"
STATE_STREAMING: Final = "streaming"
STATE_IDLE: Final = "idle"
# These constants are deprecated as of Home Assistant 2024.10
# Please use the StreamType enum instead.
_DEPRECATED_STATE_RECORDING = DeprecatedConstantEnum(CameraState.RECORDING, "2025.10")
_DEPRECATED_STATE_STREAMING = DeprecatedConstantEnum(CameraState.STREAMING, "2025.10")
_DEPRECATED_STATE_IDLE = DeprecatedConstantEnum(CameraState.IDLE, "2025.10")
class CameraEntityFeature(IntFlag):
@ -674,10 +677,10 @@ class Camera(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
def state(self) -> str:
"""Return the camera state."""
if self.is_recording:
return STATE_RECORDING
return CameraState.RECORDING
if self.is_streaming:
return STATE_STREAMING
return STATE_IDLE
return CameraState.STREAMING
return CameraState.IDLE
@cached_property
def is_on(self) -> bool:

View File

@ -40,6 +40,14 @@ CAMERA_STREAM_SOURCE_TIMEOUT: Final = 10
CAMERA_IMAGE_TIMEOUT: Final = 10
class CameraState(StrEnum):
"""Camera entity states."""
RECORDING = "recording"
STREAMING = "streaming"
IDLE = "idle"
class StreamType(StrEnum):
"""Camera stream type.

View File

@ -15,8 +15,8 @@ from homeassistant.components import webhook
from homeassistant.components.camera import (
DOMAIN as CAMERA_DOMAIN,
PLATFORM_SCHEMA as CAMERA_PLATFORM_SCHEMA,
STATE_IDLE,
Camera,
CameraState,
)
from homeassistant.const import CONF_NAME, CONF_TIMEOUT, CONF_WEBHOOK_ID
from homeassistant.core import HomeAssistant, callback
@ -135,7 +135,7 @@ class PushCamera(Camera):
async def update_image(self, image, filename):
"""Update the camera image."""
if self.state == STATE_IDLE:
if self.state == CameraState.IDLE:
self._attr_is_recording = True
self._last_trip = dt_util.utcnow()
self.queue.clear()
@ -165,7 +165,7 @@ class PushCamera(Camera):
) -> bytes | None:
"""Return a still image response."""
if self.queue:
if self.state == STATE_IDLE:
if self.state == CameraState.IDLE:
self.queue.rotate(1)
self._current_image = self.queue[0]

View File

@ -3,8 +3,8 @@
from unittest.mock import patch
from homeassistant.components.abode.const import DOMAIN as ABODE_DOMAIN
from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN
from homeassistant.const import ATTR_ENTITY_ID, STATE_IDLE
from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN, CameraState
from homeassistant.const import ATTR_ENTITY_ID
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
@ -26,7 +26,7 @@ async def test_attributes(hass: HomeAssistant) -> None:
await setup_platform(hass, CAMERA_DOMAIN)
state = hass.states.get("camera.test_cam")
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
async def test_capture_image(hass: HomeAssistant) -> None:

View File

@ -6,7 +6,7 @@ from unittest.mock import patch
from yalexs.const import Brand
from yalexs.doorbell import ContentTokenExpired
from homeassistant.const import STATE_IDLE
from homeassistant.components.camera import CameraState
from homeassistant.core import HomeAssistant
from .mocks import _create_august_with_devices, _mock_doorbell_from_fixture
@ -26,7 +26,7 @@ async def test_create_doorbell(
await _create_august_with_devices(hass, [doorbell_one], brand=Brand.AUGUST)
camera_state = hass.states.get("camera.k98gidt45gul_name_camera")
assert camera_state.state == STATE_IDLE
assert camera_state.state == CameraState.IDLE
url = camera_state.attributes["entity_picture"]

View File

@ -766,7 +766,7 @@ async def test_state_streaming(hass: HomeAssistant) -> None:
"""Camera state."""
demo_camera = hass.states.get("camera.demo_camera")
assert demo_camera is not None
assert demo_camera.state == camera.STATE_STREAMING
assert demo_camera.state == camera.CameraState.STREAMING
@pytest.mark.usefixtures("mock_camera", "mock_stream")
@ -819,7 +819,7 @@ async def test_stream_unavailable(
demo_camera = hass.states.get("camera.demo_camera")
assert demo_camera is not None
assert demo_camera.state == camera.STATE_STREAMING
assert demo_camera.state == camera.CameraState.STREAMING
@pytest.mark.usefixtures("mock_camera", "mock_stream_source")
@ -1043,6 +1043,23 @@ def test_deprecated_stream_type_constants(
)
@pytest.mark.parametrize(
"enum",
list(camera.const.CameraState),
)
@pytest.mark.parametrize(
"module",
[camera],
)
def test_deprecated_state_constants(
caplog: pytest.LogCaptureFixture,
enum: camera.const.StreamType,
module: ModuleType,
) -> None:
"""Test deprecated stream type constants."""
import_and_test_deprecated_constant_enum(caplog, module, enum, "STATE_", "2025.10")
@pytest.mark.parametrize(
"entity_feature",
list(camera.CameraEntityFeature),

View File

@ -1,6 +1,6 @@
"""Test the Camera significant change platform."""
from homeassistant.components.camera import STATE_IDLE, STATE_RECORDING
from homeassistant.components.camera import CameraState
from homeassistant.components.camera.significant_change import (
async_check_significant_change,
)
@ -10,11 +10,11 @@ async def test_significant_change() -> None:
"""Detect Camera significant changes."""
attrs = {}
assert not async_check_significant_change(
None, STATE_IDLE, attrs, STATE_IDLE, attrs
None, CameraState.IDLE, attrs, CameraState.IDLE, attrs
)
assert not async_check_significant_change(
None, STATE_IDLE, attrs, STATE_IDLE, {"dummy": "dummy"}
None, CameraState.IDLE, attrs, CameraState.IDLE, {"dummy": "dummy"}
)
assert async_check_significant_change(
None, STATE_IDLE, attrs, STATE_RECORDING, attrs
None, CameraState.IDLE, attrs, CameraState.RECORDING, attrs
)

View File

@ -11,8 +11,7 @@ from homeassistant.components.camera import (
SERVICE_ENABLE_MOTION,
SERVICE_TURN_OFF,
SERVICE_TURN_ON,
STATE_IDLE,
STATE_STREAMING,
CameraState,
async_get_image,
)
from homeassistant.components.demo import DOMAIN
@ -46,7 +45,7 @@ async def demo_camera(hass: HomeAssistant, camera_only: None) -> None:
async def test_init_state_is_streaming(hass: HomeAssistant) -> None:
"""Demo camera initialize as streaming."""
state = hass.states.get(ENTITY_CAMERA)
assert state.state == STATE_STREAMING
assert state.state == CameraState.STREAMING
with patch(
"homeassistant.components.demo.camera.Path.read_bytes", return_value=b"ON"
@ -59,21 +58,21 @@ async def test_init_state_is_streaming(hass: HomeAssistant) -> None:
async def test_turn_on_state_back_to_streaming(hass: HomeAssistant) -> None:
"""After turn on state back to streaming."""
state = hass.states.get(ENTITY_CAMERA)
assert state.state == STATE_STREAMING
assert state.state == CameraState.STREAMING
await hass.services.async_call(
CAMERA_DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True
)
state = hass.states.get(ENTITY_CAMERA)
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
await hass.services.async_call(
CAMERA_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True
)
state = hass.states.get(ENTITY_CAMERA)
assert state.state == STATE_STREAMING
assert state.state == CameraState.STREAMING
async def test_turn_off_image(hass: HomeAssistant) -> None:
@ -90,7 +89,7 @@ async def test_turn_off_image(hass: HomeAssistant) -> None:
async def test_turn_off_invalid_camera(hass: HomeAssistant) -> None:
"""Turn off non-exist camera should quietly fail."""
state = hass.states.get(ENTITY_CAMERA)
assert state.state == STATE_STREAMING
assert state.state == CameraState.STREAMING
await hass.services.async_call(
CAMERA_DOMAIN,
@ -100,7 +99,7 @@ async def test_turn_off_invalid_camera(hass: HomeAssistant) -> None:
)
state = hass.states.get(ENTITY_CAMERA)
assert state.state == STATE_STREAMING
assert state.state == CameraState.STREAMING
async def test_motion_detection(hass: HomeAssistant) -> None:

View File

@ -4,7 +4,7 @@ from freezegun.api import FrozenDateTimeFactory
import pytest
from homeassistant.components.camera import (
STATE_IDLE,
CameraState,
async_get_image,
async_get_stream_source,
)
@ -23,11 +23,11 @@ async def test_doorbird_cameras(
"""Test the doorbird cameras."""
doorbird_entry = await doorbird_mocker()
live_camera_entity_id = "camera.mydoorbird_live"
assert hass.states.get(live_camera_entity_id).state == STATE_IDLE
assert hass.states.get(live_camera_entity_id).state == CameraState.IDLE
last_motion_camera_entity_id = "camera.mydoorbird_last_motion"
assert hass.states.get(last_motion_camera_entity_id).state == STATE_IDLE
assert hass.states.get(last_motion_camera_entity_id).state == CameraState.IDLE
last_ring_camera_entity_id = "camera.mydoorbird_last_ring"
assert hass.states.get(last_ring_camera_entity_id).state == STATE_IDLE
assert hass.states.get(last_ring_camera_entity_id).state == CameraState.IDLE
assert await async_get_stream_source(hass, live_camera_entity_id) is not None
api = doorbird_entry.api
api.get_image.side_effect = mock_not_found_exception()

View File

@ -5,13 +5,13 @@ from collections.abc import Awaitable, Callable
from aioesphomeapi import (
APIClient,
CameraInfo,
CameraState,
CameraState as ESPHomeCameraState,
EntityInfo,
EntityState,
UserService,
)
from homeassistant.components.camera import STATE_IDLE
from homeassistant.components.camera import CameraState
from homeassistant.const import STATE_UNAVAILABLE
from homeassistant.core import HomeAssistant
@ -55,10 +55,10 @@ async def test_camera_single_image(
)
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
def _mock_camera_image():
mock_device.set_state(CameraState(key=1, data=SMALLEST_VALID_JPEG_BYTES))
mock_device.set_state(ESPHomeCameraState(key=1, data=SMALLEST_VALID_JPEG_BYTES))
mock_client.request_single_image = _mock_camera_image
@ -67,7 +67,7 @@ async def test_camera_single_image(
await hass.async_block_till_done()
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
assert resp.status == 200
assert resp.content_type == "image/jpeg"
@ -103,7 +103,7 @@ async def test_camera_single_image_unavailable_before_requested(
)
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
await mock_device.mock_disconnect(False)
client = await hass_client()
@ -144,7 +144,7 @@ async def test_camera_single_image_unavailable_during_request(
)
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
def _mock_camera_image():
hass.async_create_task(mock_device.mock_disconnect(False))
@ -189,7 +189,7 @@ async def test_camera_stream(
)
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
remaining_responses = 3
def _mock_camera_image():
@ -197,7 +197,7 @@ async def test_camera_stream(
if remaining_responses == 0:
return
remaining_responses -= 1
mock_device.set_state(CameraState(key=1, data=SMALLEST_VALID_JPEG_BYTES))
mock_device.set_state(ESPHomeCameraState(key=1, data=SMALLEST_VALID_JPEG_BYTES))
mock_client.request_image_stream = _mock_camera_image
mock_client.request_single_image = _mock_camera_image
@ -207,7 +207,7 @@ async def test_camera_stream(
await hass.async_block_till_done()
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
assert resp.status == 200
assert resp.content_type == "multipart/x-mixed-replace"
@ -249,7 +249,7 @@ async def test_camera_stream_unavailable(
)
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
await mock_device.mock_disconnect(False)
@ -289,7 +289,7 @@ async def test_camera_stream_with_disconnection(
)
state = hass.states.get("camera.test_mycamera")
assert state is not None
assert state.state == STATE_IDLE
assert state.state == CameraState.IDLE
remaining_responses = 3
def _mock_camera_image():
@ -299,7 +299,7 @@ async def test_camera_stream_with_disconnection(
if remaining_responses == 2:
hass.async_create_task(mock_device.mock_disconnect(False))
remaining_responses -= 1
mock_device.set_state(CameraState(key=1, data=SMALLEST_VALID_JPEG_BYTES))
mock_device.set_state(ESPHomeCameraState(key=1, data=SMALLEST_VALID_JPEG_BYTES))
mock_client.request_image_stream = _mock_camera_image
mock_client.request_single_image = _mock_camera_image

View File

@ -15,7 +15,7 @@ from google_nest_sdm.event import EventMessage
import pytest
from homeassistant.components import camera
from homeassistant.components.camera import STATE_IDLE, STATE_STREAMING, StreamType
from homeassistant.components.camera import CameraState, StreamType
from homeassistant.components.nest.const import DOMAIN
from homeassistant.components.websocket_api import TYPE_RESULT
from homeassistant.const import ATTR_FRIENDLY_NAME
@ -218,7 +218,7 @@ async def test_camera_device(
assert len(hass.states.async_all()) == 1
camera = hass.states.get("camera.my_camera")
assert camera is not None
assert camera.state == STATE_STREAMING
assert camera.state == CameraState.STREAMING
assert camera.attributes.get(ATTR_FRIENDLY_NAME) == "My Camera"
entry = entity_registry.async_get("camera.my_camera")
@ -245,7 +245,7 @@ async def test_camera_stream(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
assert cam.attributes["frontend_stream_type"] == StreamType.HLS
stream_source = await camera.async_get_stream_source(hass, "camera.my_camera")
@ -267,7 +267,7 @@ async def test_camera_ws_stream(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
assert cam.attributes["frontend_stream_type"] == StreamType.HLS
client = await hass_ws_client(hass)
@ -300,7 +300,7 @@ async def test_camera_ws_stream_failure(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
client = await hass_ws_client(hass)
await client.send_json(
@ -341,7 +341,7 @@ async def test_camera_stream_missing_trait(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_IDLE
assert cam.state == CameraState.IDLE
stream_source = await camera.async_get_stream_source(hass, "camera.my_camera")
assert stream_source is None
@ -375,7 +375,7 @@ async def test_refresh_expired_stream_token(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
# Request a stream for the camera entity to exercise nest cam + camera interaction
# and shutdown on url expiration
@ -446,7 +446,7 @@ async def test_stream_response_already_expired(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
# The stream is expired, but we return it anyway
stream_source = await camera.async_get_stream_source(hass, "camera.my_camera")
@ -474,7 +474,7 @@ async def test_camera_removed(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
# Start a stream, exercising cleanup on remove
auth.responses = [
@ -502,7 +502,7 @@ async def test_camera_remove_failure(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
# Start a stream, exercising cleanup on remove
auth.responses = [
@ -543,7 +543,7 @@ async def test_refresh_expired_stream_failure(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
# Request an HLS stream
with patch("homeassistant.components.camera.create_stream") as create_stream:
@ -602,7 +602,7 @@ async def test_camera_web_rtc(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
assert cam.attributes["frontend_stream_type"] == StreamType.WEB_RTC
client = await hass_ws_client(hass)
@ -639,7 +639,7 @@ async def test_camera_web_rtc_unsupported(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
assert cam.attributes["frontend_stream_type"] == StreamType.HLS
client = await hass_ws_client(hass)
@ -676,7 +676,7 @@ async def test_camera_web_rtc_offer_failure(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
client = await hass_ws_client(hass)
await client.send_json(
@ -741,7 +741,7 @@ async def test_camera_multiple_streams(
assert len(hass.states.async_all()) == 1
cam = hass.states.get("camera.my_camera")
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
# Prefer WebRTC over RTSP/HLS
assert cam.attributes["frontend_stream_type"] == StreamType.WEB_RTC

View File

@ -9,7 +9,7 @@ import pytest
from syrupy import SnapshotAssertion
from homeassistant.components import camera
from homeassistant.components.camera import STATE_STREAMING
from homeassistant.components.camera import CameraState
from homeassistant.components.netatmo.const import (
NETATMO_EVENT,
SERVICE_SET_CAMERA_LIGHT,
@ -176,7 +176,7 @@ async def test_camera_image_local(
cam = hass.states.get(camera_entity_indoor)
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
assert cam.name == "Hall"
stream_source = await camera.async_get_stream_source(hass, camera_entity_indoor)
@ -204,7 +204,7 @@ async def test_camera_image_vpn(
cam = hass.states.get(camera_entity_indoor)
assert cam is not None
assert cam.state == STATE_STREAMING
assert cam.state == CameraState.STREAMING
stream_source = await camera.async_get_stream_source(hass, camera_entity_indoor)
assert stream_source == stream_uri

View File

@ -5,9 +5,13 @@ from unittest.mock import MagicMock, patch
import pytest
from reolink_aio.exceptions import ReolinkError
from homeassistant.components.camera import async_get_image, async_get_stream_source
from homeassistant.components.camera import (
CameraState,
async_get_image,
async_get_stream_source,
)
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import STATE_IDLE, Platform
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
@ -30,7 +34,7 @@ async def test_camera(
assert config_entry.state is ConfigEntryState.LOADED
entity_id = f"{Platform.CAMERA}.{TEST_NVR_NAME}_fluent"
assert hass.states.get(entity_id).state == STATE_IDLE
assert hass.states.get(entity_id).state == CameraState.IDLE
# check getting a image from the camera
reolink_connect.get_snapshot.return_value = b"image"
@ -62,4 +66,4 @@ async def test_camera_no_stream_source(
assert config_entry.state is ConfigEntryState.LOADED
entity_id = f"{Platform.CAMERA}.{TEST_NVR_NAME}_snapshots_fluent_lens_0"
assert hass.states.get(entity_id).state == STATE_IDLE
assert hass.states.get(entity_id).state == CameraState.IDLE

View File

@ -10,8 +10,8 @@ from uiprotect.exceptions import NvrError
from uiprotect.websocket import WebsocketState
from homeassistant.components.camera import (
STATE_IDLE,
CameraEntityFeature,
CameraState,
async_get_image,
async_get_stream_source,
)
@ -431,7 +431,7 @@ async def test_camera_websocket_disconnected(
entity_id = "camera.test_camera_high_resolution_channel"
state = hass.states.get(entity_id)
assert state and state.state == STATE_IDLE
assert state and state.state == CameraState.IDLE
# websocket disconnects
ufp.ws_state_subscription(WebsocketState.DISCONNECTED)
@ -445,7 +445,7 @@ async def test_camera_websocket_disconnected(
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state and state.state == STATE_IDLE
assert state and state.state == CameraState.IDLE
async def test_camera_ws_update(

View File

@ -10,8 +10,8 @@ from homeassistant.components.camera import (
DEFAULT_CONTENT_TYPE,
SERVICE_DISABLE_MOTION,
SERVICE_ENABLE_MOTION,
STATE_RECORDING,
CameraEntityFeature,
CameraState,
async_get_image,
async_get_stream_source,
)
@ -336,7 +336,7 @@ async def test_properties(hass: HomeAssistant, mock_remote) -> None:
assert state
assert state.name == "Front"
assert state.state == STATE_RECORDING
assert state.state == CameraState.RECORDING
assert state.attributes["brand"] == "Ubiquiti"
assert state.attributes["model_name"] == "UVC"
assert state.attributes["supported_features"] == CameraEntityFeature.STREAM
@ -354,7 +354,7 @@ async def test_motion_recording_mode_properties(
state = hass.states.get("camera.front")
assert state
assert state.state == STATE_RECORDING
assert state.state == CameraState.RECORDING
mock_remote.return_value.get_camera.return_value["recordingSettings"][
"fullTimeRecordEnabled"
@ -369,7 +369,7 @@ async def test_motion_recording_mode_properties(
state = hass.states.get("camera.front")
assert state
assert state.state != STATE_RECORDING
assert state.state != CameraState.RECORDING
assert state.attributes["last_recording_start_time"] == datetime(
2021, 1, 8, 1, 56, 32, 367000, tzinfo=UTC
)
@ -382,7 +382,7 @@ async def test_motion_recording_mode_properties(
state = hass.states.get("camera.front")
assert state
assert state.state != STATE_RECORDING
assert state.state != CameraState.RECORDING
mock_remote.return_value.get_camera.return_value["recordingIndicator"] = (
"MOTION_INPROGRESS"
@ -394,7 +394,7 @@ async def test_motion_recording_mode_properties(
state = hass.states.get("camera.front")
assert state
assert state.state == STATE_RECORDING
assert state.state == CameraState.RECORDING
mock_remote.return_value.get_camera.return_value["recordingIndicator"] = (
"MOTION_FINISHED"
@ -406,7 +406,7 @@ async def test_motion_recording_mode_properties(
state = hass.states.get("camera.front")
assert state
assert state.state == STATE_RECORDING
assert state.state == CameraState.RECORDING
async def test_stream(hass: HomeAssistant, mock_remote) -> None:

View File

@ -6,7 +6,7 @@ from unittest.mock import patch
from yalexs.const import Brand
from yalexs.doorbell import ContentTokenExpired
from homeassistant.const import STATE_IDLE
from homeassistant.components.camera import CameraState
from homeassistant.core import HomeAssistant
from .mocks import _create_yale_with_devices, _mock_doorbell_from_fixture
@ -28,7 +28,7 @@ async def test_create_doorbell(
camera_k98gidt45gul_name_camera = hass.states.get(
"camera.k98gidt45gul_name_camera"
)
assert camera_k98gidt45gul_name_camera.state == STATE_IDLE
assert camera_k98gidt45gul_name_camera.state == CameraState.IDLE
url = hass.states.get("camera.k98gidt45gul_name_camera").attributes[
"entity_picture"