From cdb3739051f3ff8b097540c90f5c4d10a1210b3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Oct 2026 09:53:13 +0000 Subject: [PATCH 1/2] feat(deps-dev): bump the seam group with 2 updates Bumps the seam group with 2 updates: [@seamapi/smith](https://github.com/seamapi/smith) and [@seamapi/types](https://github.com/seamapi/types). Updates `@seamapi/smith` from 1.1.0 to 1.1.1 - [Release notes](https://github.com/seamapi/smith/releases) - [Commits](https://github.com/seamapi/smith/compare/v1.1.0...v1.1.1) Updates `@seamapi/types` from 1.1129.0 to 1.1136.1 - [Release notes](https://github.com/seamapi/types/releases) - [Commits](https://github.com/seamapi/types/compare/v1.1129.0...v1.1136.1) --- updated-dependencies: - dependency-name: "@seamapi/smith" dependency-version: 1.1.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: seam - dependency-name: "@seamapi/types" dependency-version: 1.1136.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: seam ... Signed-off-by: dependabot[bot] --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 21b41e0b..ef63743d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,8 @@ "devDependencies": { "@seamapi/blueprint": "^1.12.0", "@seamapi/fake-seam-connect": "2.0.6", - "@seamapi/smith": "^1.1.0", - "@seamapi/types": "1.1129.0", + "@seamapi/smith": "^1.1.1", + "@seamapi/types": "1.1136.1", "change-case": "^5.4.4", "prettier": "^3.2.5" }, @@ -820,9 +820,9 @@ } }, "node_modules/@seamapi/smith": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@seamapi/smith/-/smith-1.1.0.tgz", - "integrity": "sha512-sI542rvN7Kq+whft3Ff5R6RRB7ORu2y23TGZOHtvEoxNp2OIYwf/wSuuY+7fZhZvIMvDsXSQJQyytOfrgKpxgg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@seamapi/smith/-/smith-1.1.1.tgz", + "integrity": "sha512-AcDsvtfhrfJLfkZ2m7uXCgkQL5rpaCQDE+d71f9mc3lUAv3otZv4IkNv0hvK4wjaaRJ3QEp+9tiu0fR4M64jYw==", "dev": true, "license": "MIT", "dependencies": { @@ -853,9 +853,9 @@ } }, "node_modules/@seamapi/types": { - "version": "1.1129.0", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.1129.0.tgz", - "integrity": "sha512-TlWoYyag1WXGB3CRjI3utqoDcmEvP4bPqCeUc1SXUW1o7bX3k3y+EGr9ZDPKfmMiQkOd6YaC4QgbP7h4hOSn6A==", + "version": "1.1136.1", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.1136.1.tgz", + "integrity": "sha512-B3flfbWB4zi3KXhrser7u7MpmdVRQO46M1Kjd7BK9p0cEWi/N8dCNx2vzUYwoQ8EqxiLImu5Rrj/aMtxurx+xA==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 5e388685..dfb9e116 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "devDependencies": { "@seamapi/blueprint": "^1.12.0", "@seamapi/fake-seam-connect": "2.0.6", - "@seamapi/smith": "^1.1.0", - "@seamapi/types": "1.1129.0", + "@seamapi/smith": "^1.1.1", + "@seamapi/types": "1.1136.1", "change-case": "^5.4.4", "prettier": "^3.2.5" } From 39905527bbfdd33e85971bd7924d232b0715ad20 Mon Sep 17 00:00:00 2001 From: Seam Bot Date: Tue, 27 Oct 2026 09:53:47 +0000 Subject: [PATCH 2/2] ci: Generate code --- seam/resources/access_code.py | 2 +- seam/resources/access_grant.py | 29 +++++++++++++++++++++ seam/resources/access_method.py | 25 ++++++++++++++++++ seam/resources/acs_credential.py | 25 ++++++++++++++++++ seam/resources/action_attempt.py | 4 +++ seam/resources/device.py | 31 +++++++++++++++++++++++ seam/resources/device_provider.py | 1 + seam/resources/unmanaged_access_code.py | 2 +- seam/resources/unmanaged_access_grant.py | 29 +++++++++++++++++++++ seam/resources/unmanaged_access_method.py | 25 ++++++++++++++++++ seam/resources/unmanaged_device.py | 1 + seam/routes/cameras_live_views.py | 24 +++++++++--------- seam/routes/connect_webviews.py | 4 +++ seam/routes/devices.py | 8 ++++++ seam/routes/devices_unmanaged.py | 8 ++++++ seam/routes/locks.py | 8 ++++++ 16 files changed, 212 insertions(+), 14 deletions(-) diff --git a/seam/resources/access_code.py b/seam/resources/access_code.py index 760db4a7..9b401c69 100644 --- a/seam/resources/access_code.py +++ b/seam/resources/access_code.py @@ -376,7 +376,7 @@ def from_dict(cls, d: Any): @dataclass class FailedToIssueError(ResourceMapping): - """Seam was unable to issue this access code before its start time, so the recipient may be unable to unlock the device. This usually points to a problem that needs attention, such as an offline or disconnected device. Seam keeps retrying, and this error clears automatically if the access code is eventually issued. + """Seam was unable to issue this access code before its start time, so the recipient may be unable to unlock the device. This usually points to a problem that needs attention, such as an offline or disconnected device. This error clears automatically if the access code is eventually issued. :ivar created_at: Date and time at which Seam created the error. diff --git a/seam/resources/access_grant.py b/seam/resources/access_grant.py index d0363906..3021003a 100644 --- a/seam/resources/access_grant.py +++ b/seam/resources/access_grant.py @@ -506,6 +506,33 @@ def from_dict(cls, d: Any): warning_code=d.get("warning_code", None), ) + @dataclass + class AccessRevokedWarning(ResourceMapping): + """Indicates that one of this access grant's access methods no longer grants access because of a change outside Seam, for example its card was encoded again for another credential. Seam does not replace the access method; issue a new one if the user still needs it. + + :ivar access_method_id: ID of the access method whose access was revoked. + + :ivar created_at: Date and time at which Seam created the warning. + + :ivar message: Detailed description of the warning. Provides insights into the issue and potentially how to rectify it. + + :ivar warning_code: Unique identifier of the type of warning. Enables quick recognition and categorization of the issue. + """ + + access_method_id: str + created_at: str + message: str + warning_code: Literal["access_revoked"] + + @classmethod + def from_dict(cls, d: Any): + return cls( + access_method_id=d.get("access_method_id", None), + created_at=d.get("created_at", None), + message=d.get("message", None), + warning_code=d.get("warning_code", None), + ) + Errors = Union[CannotCreateRequestedAccessMethodsError, AccessNotProvisionedError] _ErrorsVariants = { "cannot_create_requested_access_methods": CannotCreateRequestedAccessMethodsError, @@ -528,6 +555,7 @@ def from_dict(cls, d: Any): RequestedCodeUnavailableWarning, DeviceDoesNotSupportAccessCodesWarning, DeviceTimeConstraintsViolatedWarning, + AccessRevokedWarning, ] _WarningsVariants = { "being_deleted": BeingDeletedWarning, @@ -537,6 +565,7 @@ def from_dict(cls, d: Any): "requested_code_unavailable": RequestedCodeUnavailableWarning, "device_does_not_support_access_codes": DeviceDoesNotSupportAccessCodesWarning, "device_time_constraints_violated": DeviceTimeConstraintsViolatedWarning, + "access_revoked": AccessRevokedWarning, } access_grant_id: str diff --git a/seam/resources/access_method.py b/seam/resources/access_method.py index c6feed45..115a8a82 100644 --- a/seam/resources/access_method.py +++ b/seam/resources/access_method.py @@ -489,6 +489,29 @@ def from_dict(cls, d: Any): warning_code=d.get("warning_code", None), ) + @dataclass + class ScheduleRoundedUpWarning(ResourceMapping): + """Indicates that the access system can only end card access on fixed time marks, so access was extended past ``ends_at`` to the next mark. The message states when access actually ends. + + :ivar created_at: Date and time at which Seam created the warning. + + :ivar message: Detailed description of the warning. Provides insights into the issue and potentially how to rectify it. + + :ivar warning_code: Unique identifier of the type of warning. Enables quick recognition and categorization of the issue. + """ + + created_at: str + message: str + warning_code: Literal["schedule_rounded_up"] + + @classmethod + def from_dict(cls, d: Any): + return cls( + created_at=d.get("created_at", None), + message=d.get("message", None), + warning_code=d.get("warning_code", None), + ) + Errors = Union[FailedToIssueError, AccessNotProvisionedError] _ErrorsVariants = { "failed_to_issue": FailedToIssueError, @@ -516,6 +539,7 @@ def from_dict(cls, d: Any): UserIdentityMissingEmailAddressWarning, UserIdentityMissingPhoneNumberWarning, RequestedCodeUnavailableWarning, + ScheduleRoundedUpWarning, ] _WarningsVariants = { "being_deleted": BeingDeletedWarning, @@ -525,6 +549,7 @@ def from_dict(cls, d: Any): "user_identity_missing_email_address": UserIdentityMissingEmailAddressWarning, "user_identity_missing_phone_number": UserIdentityMissingPhoneNumberWarning, "requested_code_unavailable": RequestedCodeUnavailableWarning, + "schedule_rounded_up": ScheduleRoundedUpWarning, } access_method_id: str diff --git a/seam/resources/acs_credential.py b/seam/resources/acs_credential.py index b6451ef7..4ec620b8 100644 --- a/seam/resources/acs_credential.py +++ b/seam/resources/acs_credential.py @@ -365,6 +365,29 @@ def from_dict(cls, d: Any): warning_code=d.get("warning_code", None), ) + @dataclass + class ScheduleRoundedUpWarning(ResourceMapping): + """Indicates that the access system can only end card access on fixed time marks, so access was extended past ``ends_at`` to the next mark. The message states when access actually ends. + + :ivar created_at: Date and time at which Seam created the warning. + + :ivar message: Detailed description of the warning. Provides insights into the issue and potentially how to rectify it. + + :ivar warning_code: Unique identifier of the type of warning. Enables quick recognition and categorization of the issue. + """ + + created_at: str + message: str + warning_code: Literal["schedule_rounded_up"] + + @classmethod + def from_dict(cls, d: Any): + return cls( + created_at=d.get("created_at", None), + message=d.get("message", None), + warning_code=d.get("warning_code", None), + ) + Warnings = Union[ WaitingToBeIssuedWarning, ScheduleExternallyModifiedWarning, @@ -373,6 +396,7 @@ def from_dict(cls, d: Any): UnknownIssueWithAcsCredentialWarning, NeedsToBeReissuedWarning, RequestedCodeUnavailableWarning, + ScheduleRoundedUpWarning, ] _WarningsVariants = { "waiting_to_be_issued": WaitingToBeIssuedWarning, @@ -382,6 +406,7 @@ def from_dict(cls, d: Any): "unknown_issue_with_acs_credential": UnknownIssueWithAcsCredentialWarning, "needs_to_be_reissued": NeedsToBeReissuedWarning, "requested_code_unavailable": RequestedCodeUnavailableWarning, + "schedule_rounded_up": ScheduleRoundedUpWarning, } access_method: Literal["code", "card", "mobile_key", "cloud_key"] diff --git a/seam/resources/action_attempt.py b/seam/resources/action_attempt.py index ae613f97..3ff3b96c 100644 --- a/seam/resources/action_attempt.py +++ b/seam/resources/action_attempt.py @@ -585,6 +585,7 @@ class Warnings(ResourceMapping): "unknown_issue_with_acs_credential", "needs_to_be_reissued", "requested_code_unavailable", + "schedule_rounded_up", ] new_code: Optional[str] original_code: Optional[str] @@ -1071,6 +1072,7 @@ class Warnings(ResourceMapping): "unknown_issue_with_acs_credential", "needs_to_be_reissued", "requested_code_unavailable", + "schedule_rounded_up", ] new_code: Optional[str] original_code: Optional[str] @@ -1513,6 +1515,7 @@ class Warnings(ResourceMapping): "unknown_issue_with_acs_credential", "needs_to_be_reissued", "requested_code_unavailable", + "schedule_rounded_up", ] new_code: Optional[str] original_code: Optional[str] @@ -1914,6 +1917,7 @@ class Warnings(ResourceMapping): "user_identity_missing_email_address", "user_identity_missing_phone_number", "requested_code_unavailable", + "schedule_rounded_up", ] original_access_method_id: Optional[str] new_code: Optional[str] diff --git a/seam/resources/device.py b/seam/resources/device.py index 540e629d..eaf00350 100644 --- a/seam/resources/device.py +++ b/seam/resources/device.py @@ -635,6 +635,8 @@ class Properties(ResourceMapping): :ivar ecobee_metadata: Metadata for an ecobee device. + :ivar eufy_metadata: Metadata for a Eufy device. + :ivar four_suites_metadata: Metadata for a 4SUITES device. :ivar genie_metadata: Metadata for a Genie device. @@ -1368,6 +1370,28 @@ def from_dict(cls, d: Any): ecobee_device_id=d.get("ecobee_device_id", None), ) + @dataclass + class EufyMetadata(ResourceMapping): + """Metadata for a Eufy device. + + :ivar device_id: + + :ivar device_name: + + :ivar model:""" + + device_id: Optional[str] + device_name: Optional[str] + model: Optional[str] + + @classmethod + def from_dict(cls, d: Any): + return cls( + device_id=d.get("device_id", None), + device_name=d.get("device_name", None), + model=d.get("model", None), + ) + @dataclass class FourSuitesMetadata(ResourceMapping): """Metadata for a 4SUITES device. @@ -3289,6 +3313,7 @@ def from_dict(cls, d: Any): dormakaba_oracode_iho_metadata: Optional[DormakabaOracodeIhoMetadata] dormakaba_oracode_metadata: Optional[DormakabaOracodeMetadata] ecobee_metadata: Optional[EcobeeMetadata] + eufy_metadata: Optional[EufyMetadata] four_suites_metadata: Optional[FourSuitesMetadata] genie_metadata: Optional[GenieMetadata] honeywell_resideo_metadata: Optional[HoneywellResideoMetadata] @@ -3490,6 +3515,11 @@ def from_dict(cls, d: Any): if d.get("ecobee_metadata") is not None else None ), + eufy_metadata=( + cls.EufyMetadata.from_dict(d.get("eufy_metadata")) + if d.get("eufy_metadata") is not None + else None + ), four_suites_metadata=( cls.FourSuitesMetadata.from_dict(d.get("four_suites_metadata")) if d.get("four_suites_metadata") is not None @@ -4598,6 +4628,7 @@ def from_dict(cls, d: Any): "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", diff --git a/seam/resources/device_provider.py b/seam/resources/device_provider.py index b640af7a..ff64fe0a 100644 --- a/seam/resources/device_provider.py +++ b/seam/resources/device_provider.py @@ -152,6 +152,7 @@ class DeviceProvider: "omnitec", "kisi", "aqara", + "eufy", "sonos", ] display_name: str diff --git a/seam/resources/unmanaged_access_code.py b/seam/resources/unmanaged_access_code.py index 84fcc942..806ce0b1 100644 --- a/seam/resources/unmanaged_access_code.py +++ b/seam/resources/unmanaged_access_code.py @@ -362,7 +362,7 @@ def from_dict(cls, d: Any): @dataclass class FailedToIssueError(ResourceMapping): - """Seam was unable to issue this access code before its start time, so the recipient may be unable to unlock the device. This usually points to a problem that needs attention, such as an offline or disconnected device. Seam keeps retrying, and this error clears automatically if the access code is eventually issued. + """Seam was unable to issue this access code before its start time, so the recipient may be unable to unlock the device. This usually points to a problem that needs attention, such as an offline or disconnected device. This error clears automatically if the access code is eventually issued. :ivar created_at: Date and time at which Seam created the error. diff --git a/seam/resources/unmanaged_access_grant.py b/seam/resources/unmanaged_access_grant.py index 41c7524c..a880aa44 100644 --- a/seam/resources/unmanaged_access_grant.py +++ b/seam/resources/unmanaged_access_grant.py @@ -496,6 +496,33 @@ def from_dict(cls, d: Any): warning_code=d.get("warning_code", None), ) + @dataclass + class AccessRevokedWarning(ResourceMapping): + """Indicates that one of this access grant's access methods no longer grants access because of a change outside Seam, for example its card was encoded again for another credential. Seam does not replace the access method; issue a new one if the user still needs it. + + :ivar access_method_id: ID of the access method whose access was revoked. + + :ivar created_at: Date and time at which Seam created the warning. + + :ivar message: Detailed description of the warning. Provides insights into the issue and potentially how to rectify it. + + :ivar warning_code: Unique identifier of the type of warning. Enables quick recognition and categorization of the issue. + """ + + access_method_id: str + created_at: str + message: str + warning_code: Literal["access_revoked"] + + @classmethod + def from_dict(cls, d: Any): + return cls( + access_method_id=d.get("access_method_id", None), + created_at=d.get("created_at", None), + message=d.get("message", None), + warning_code=d.get("warning_code", None), + ) + Errors = Union[CannotCreateRequestedAccessMethodsError, AccessNotProvisionedError] _ErrorsVariants = { "cannot_create_requested_access_methods": CannotCreateRequestedAccessMethodsError, @@ -518,6 +545,7 @@ def from_dict(cls, d: Any): RequestedCodeUnavailableWarning, DeviceDoesNotSupportAccessCodesWarning, DeviceTimeConstraintsViolatedWarning, + AccessRevokedWarning, ] _WarningsVariants = { "being_deleted": BeingDeletedWarning, @@ -527,6 +555,7 @@ def from_dict(cls, d: Any): "requested_code_unavailable": RequestedCodeUnavailableWarning, "device_does_not_support_access_codes": DeviceDoesNotSupportAccessCodesWarning, "device_time_constraints_violated": DeviceTimeConstraintsViolatedWarning, + "access_revoked": AccessRevokedWarning, } access_grant_id: str diff --git a/seam/resources/unmanaged_access_method.py b/seam/resources/unmanaged_access_method.py index 719c971f..458a25c2 100644 --- a/seam/resources/unmanaged_access_method.py +++ b/seam/resources/unmanaged_access_method.py @@ -483,6 +483,29 @@ def from_dict(cls, d: Any): warning_code=d.get("warning_code", None), ) + @dataclass + class ScheduleRoundedUpWarning(ResourceMapping): + """Indicates that the access system can only end card access on fixed time marks, so access was extended past ``ends_at`` to the next mark. The message states when access actually ends. + + :ivar created_at: Date and time at which Seam created the warning. + + :ivar message: Detailed description of the warning. Provides insights into the issue and potentially how to rectify it. + + :ivar warning_code: Unique identifier of the type of warning. Enables quick recognition and categorization of the issue. + """ + + created_at: str + message: str + warning_code: Literal["schedule_rounded_up"] + + @classmethod + def from_dict(cls, d: Any): + return cls( + created_at=d.get("created_at", None), + message=d.get("message", None), + warning_code=d.get("warning_code", None), + ) + Errors = Union[FailedToIssueError, AccessNotProvisionedError] _ErrorsVariants = { "failed_to_issue": FailedToIssueError, @@ -510,6 +533,7 @@ def from_dict(cls, d: Any): UserIdentityMissingEmailAddressWarning, UserIdentityMissingPhoneNumberWarning, RequestedCodeUnavailableWarning, + ScheduleRoundedUpWarning, ] _WarningsVariants = { "being_deleted": BeingDeletedWarning, @@ -519,6 +543,7 @@ def from_dict(cls, d: Any): "user_identity_missing_email_address": UserIdentityMissingEmailAddressWarning, "user_identity_missing_phone_number": UserIdentityMissingPhoneNumberWarning, "requested_code_unavailable": RequestedCodeUnavailableWarning, + "schedule_rounded_up": ScheduleRoundedUpWarning, } access_method_id: str diff --git a/seam/resources/unmanaged_device.py b/seam/resources/unmanaged_device.py index 8cbf8340..7919a30b 100644 --- a/seam/resources/unmanaged_device.py +++ b/seam/resources/unmanaged_device.py @@ -1494,6 +1494,7 @@ def from_dict(cls, d: Any): "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", diff --git a/seam/routes/cameras_live_views.py b/seam/routes/cameras_live_views.py index d4b0d969..22de4849 100644 --- a/seam/routes/cameras_live_views.py +++ b/seam/routes/cameras_live_views.py @@ -18,7 +18,7 @@ def create( ) -> CameraLiveViewSession: """Creates a short-lived live view session for a single camera. Pass the returned session ID and token to ``/cameras/live_views/offer`` to start a WebRTC stream, and to ``/cameras/live_views/stop`` to end the session. - Camera live view is in beta. To enable it for your workspace, contact Seam support. To check whether a camera supports live view, use ``device.can_stream_live_video``. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Use your API key on your backend to create a client session with access to the camera's connected account, then authenticate live view requests with that client session's token. To check whether a camera supports live view, use ``device.can_stream_live_video``. :param device_id: ID of the camera to view. @@ -35,7 +35,7 @@ def offer( ) -> CameraLiveViewAnswer: """Exchanges a WebRTC SDP offer for an SDP answer that starts streaming video from the camera, for a live view session that you created using ``/cameras/live_views/create``. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. @@ -50,7 +50,7 @@ def offer( def stop(self, *, camera_live_view_session_id: str, token: str) -> None: """Stops a camera live view session that the current client session owns. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. @@ -70,7 +70,7 @@ async def create( ) -> CameraLiveViewSession: """Creates a short-lived live view session for a single camera. Pass the returned session ID and token to ``/cameras/live_views/offer`` to start a WebRTC stream, and to ``/cameras/live_views/stop`` to end the session. - Camera live view is in beta. To enable it for your workspace, contact Seam support. To check whether a camera supports live view, use ``device.can_stream_live_video``. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Use your API key on your backend to create a client session with access to the camera's connected account, then authenticate live view requests with that client session's token. To check whether a camera supports live view, use ``device.can_stream_live_video``. :param device_id: ID of the camera to view. @@ -87,7 +87,7 @@ async def offer( ) -> CameraLiveViewAnswer: """Exchanges a WebRTC SDP offer for an SDP answer that starts streaming video from the camera, for a live view session that you created using ``/cameras/live_views/create``. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. @@ -102,7 +102,7 @@ async def offer( async def stop(self, *, camera_live_view_session_id: str, token: str) -> None: """Stops a camera live view session that the current client session owns. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. @@ -129,7 +129,7 @@ def create( ) -> CameraLiveViewSession: """Creates a short-lived live view session for a single camera. Pass the returned session ID and token to ``/cameras/live_views/offer`` to start a WebRTC stream, and to ``/cameras/live_views/stop`` to end the session. - Camera live view is in beta. To enable it for your workspace, contact Seam support. To check whether a camera supports live view, use ``device.can_stream_live_video``. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Use your API key on your backend to create a client session with access to the camera's connected account, then authenticate live view requests with that client session's token. To check whether a camera supports live view, use ``device.can_stream_live_video``. :param device_id: ID of the camera to view. @@ -163,7 +163,7 @@ def offer( ) -> CameraLiveViewAnswer: """Exchanges a WebRTC SDP offer for an SDP answer that starts streaming video from the camera, for a live view session that you created using ``/cameras/live_views/create``. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. @@ -195,7 +195,7 @@ def offer( def stop(self, *, camera_live_view_session_id: str, token: str) -> None: """Stops a camera live view session that the current client session owns. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. @@ -231,7 +231,7 @@ async def create( ) -> CameraLiveViewSession: """Creates a short-lived live view session for a single camera. Pass the returned session ID and token to ``/cameras/live_views/offer`` to start a WebRTC stream, and to ``/cameras/live_views/stop`` to end the session. - Camera live view is in beta. To enable it for your workspace, contact Seam support. To check whether a camera supports live view, use ``device.can_stream_live_video``. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Use your API key on your backend to create a client session with access to the camera's connected account, then authenticate live view requests with that client session's token. To check whether a camera supports live view, use ``device.can_stream_live_video``. :param device_id: ID of the camera to view. @@ -265,7 +265,7 @@ async def offer( ) -> CameraLiveViewAnswer: """Exchanges a WebRTC SDP offer for an SDP answer that starts streaming video from the camera, for a live view session that you created using ``/cameras/live_views/create``. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. @@ -297,7 +297,7 @@ async def offer( async def stop(self, *, camera_live_view_session_id: str, token: str) -> None: """Stops a camera live view session that the current client session owns. - Camera live view is in beta. To enable it for your workspace, contact Seam support. + Camera live view is in public beta and enabled by default in production and sandbox workspaces. Authenticate with the client session token used to create the live view session. :param camera_live_view_session_id: ID of the camera live view session. diff --git a/seam/routes/connect_webviews.py b/seam/routes/connect_webviews.py index 6a16e689..914d3873 100644 --- a/seam/routes/connect_webviews.py +++ b/seam/routes/connect_webviews.py @@ -98,6 +98,7 @@ def create( "omnitec", "kisi", "aqara", + "eufy", "sonos", "yale_access", "hid_cm", @@ -296,6 +297,7 @@ async def create( "omnitec", "kisi", "aqara", + "eufy", "sonos", "yale_access", "hid_cm", @@ -501,6 +503,7 @@ def create( "omnitec", "kisi", "aqara", + "eufy", "sonos", "yale_access", "hid_cm", @@ -788,6 +791,7 @@ async def create( "omnitec", "kisi", "aqara", + "eufy", "sonos", "yale_access", "hid_cm", diff --git a/seam/routes/devices.py b/seam/routes/devices.py index 98bc869e..e71b2969 100644 --- a/seam/routes/devices.py +++ b/seam/routes/devices.py @@ -94,6 +94,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -146,6 +147,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -408,6 +410,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -460,6 +463,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -752,6 +756,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -804,6 +809,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -1187,6 +1193,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -1239,6 +1246,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", diff --git a/seam/routes/devices_unmanaged.py b/seam/routes/devices_unmanaged.py index 93267125..0a8ab755 100644 --- a/seam/routes/devices_unmanaged.py +++ b/seam/routes/devices_unmanaged.py @@ -73,6 +73,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -125,6 +126,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -326,6 +328,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -378,6 +381,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -615,6 +619,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -667,6 +672,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -954,6 +960,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", @@ -1006,6 +1013,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", "keynest_key", "noiseaware_activity_zone", "minut_sensor", diff --git a/seam/routes/locks.py b/seam/routes/locks.py index 777819c2..b2804d8a 100644 --- a/seam/routes/locks.py +++ b/seam/routes/locks.py @@ -104,6 +104,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] = None, device_types: Optional[ @@ -140,6 +141,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] ] = None, @@ -320,6 +322,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] = None, device_types: Optional[ @@ -356,6 +359,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] ] = None, @@ -593,6 +597,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] = None, device_types: Optional[ @@ -629,6 +634,7 @@ def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] ] = None, @@ -928,6 +934,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] = None, device_types: Optional[ @@ -964,6 +971,7 @@ async def list( "omnitec_lock", "kisi_lock", "aqara_lock", + "eufy_lock", ] ] ] = None,