From 5faa47880634f1b295e87275140ea9165678976c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Nov 2026 09:53:12 +0000 Subject: [PATCH 1/2] feat(deps-dev): bump @seamapi/types Bumps the seam group with 1 update: [@seamapi/types](https://github.com/seamapi/types). Updates `@seamapi/types` from 1.1182.0 to 1.1187.0 - [Release notes](https://github.com/seamapi/types/releases) - [Commits](https://github.com/seamapi/types/compare/v1.1182.0...v1.1187.0) --- updated-dependencies: - dependency-name: "@seamapi/types" dependency-version: 1.1187.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: seam ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f2a2ffa..2b0ade77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "@seamapi/blueprint": "^1.13.2", "@seamapi/fake-seam-connect": "2.0.6", "@seamapi/smith": "^1.2.0", - "@seamapi/types": "1.1182.0", + "@seamapi/types": "1.1187.0", "change-case": "^5.4.4", "prettier": "^3.2.5" }, @@ -853,9 +853,9 @@ } }, "node_modules/@seamapi/types": { - "version": "1.1182.0", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.1182.0.tgz", - "integrity": "sha512-fFm3zsLFGAMrK2n7qQdo091kAuIuu+bL2bJAwrgxOCqM7wFUwDdzPlbzVr1/fyWYmk6VY6tyWhDB/ZYeol8f3g==", + "version": "1.1187.0", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.1187.0.tgz", + "integrity": "sha512-QTLGjfOyXxRMw5Mz9HcIadTQLyFCUNBsvDjeUgDgB9hfbw/cB3x07RyZnxc90QzIz0yz0o0auORXmqPM7vF+4w==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 18587e03..caf7f998 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@seamapi/blueprint": "^1.13.2", "@seamapi/fake-seam-connect": "2.0.6", "@seamapi/smith": "^1.2.0", - "@seamapi/types": "1.1182.0", + "@seamapi/types": "1.1187.0", "change-case": "^5.4.4", "prettier": "^3.2.5" } From c41a150e28471aeabfba9804a6cb3a0ed42110b4 Mon Sep 17 00:00:00 2001 From: Seam Bot Date: Thu, 12 Nov 2026 09:54:38 +0000 Subject: [PATCH 2/2] ci: Generate code --- seam/resources/device.py | 122 +++++++++++++++++++++++++++++ seam/resources/device_provider.py | 1 + seam/resources/unmanaged_device.py | 1 + seam/routes/connect_webviews.py | 4 + seam/routes/devices.py | 12 +++ seam/routes/devices_unmanaged.py | 12 +++ seam/routes/noise_sensors.py | 8 +- 7 files changed, 156 insertions(+), 4 deletions(-) diff --git a/seam/resources/device.py b/seam/resources/device.py index 93668d4a..3a886dbb 100644 --- a/seam/resources/device.py +++ b/seam/resources/device.py @@ -15,6 +15,8 @@ def _from_discriminated_dict( class Device: """Represents a `device `_ that has been connected to Seam. + :ivar air_quality_index: Air quality index, if the device measures it. + :ivar can_activate_weekly_program: Indicates whether the thermostat can be returned to its weekly program, the schedule that is configured on the device itself, releasing any hold that Seam has set. :ivar can_configure_auto_lock: Indicates whether the lock supports configuring automatic locking. @@ -61,6 +63,10 @@ class Device: :ivar capabilities_supported: Collection of capabilities that the device supports when connected to Seam. Values are ``access_code``, which indicates that the device can manage and utilize digital PIN codes for secure access; ``lock``, which indicates that the device controls a door locking mechanism, enabling the remote opening and closing of doors and other entry points; ``noise_detection``, which indicates that the device supports monitoring and responding to ambient noise levels; ``thermostat``, which indicates that the device can regulate and adjust indoor temperatures; ``battery``, which indicates that the device can manage battery life and health; and ``phone``, which indicates that the device is a mobile device, such as a smartphone. **Important:** Superseded by `capability flags `_. + :ivar co2_ppm: Carbon dioxide concentration in parts per million, if the device measures it. + + :ivar co_ppm: Carbon monoxide concentration in parts per million, if the device measures it. + :ivar connected_account_id: Unique identifier for the account associated with the device. :ivar created_at: Date and time at which the device object was created. @@ -81,14 +87,34 @@ class Device: :ivar is_managed: Indicates whether Seam manages the device. See also `Managed and Unmanaged Devices `_. + :ivar is_occupied: Indicates whether the device detects that the space is occupied, if the device measures occupancy. + + :ivar is_smoking_detected: Indicates whether the device detects smoking, if the device measures it. + :ivar location: Location information for the device. + :ivar mold_risk_level: Mold risk level as reported by the device, if the device measures it. + + :ivar named_sensors: Additional sensors of the same kind on the device, each with a stable ``sensor_name``. Present only when the device has more than one sensor of a kind or no single main sensor. + :ivar nickname: Optional nickname to describe the device, settable through Seam. + :ivar noise_level_decibels: Noise level in decibels, if the device measures noise. + + :ivar noise_level_nrs: Noise level as a Noise Risk Score (NRS), if the device reports one. + + :ivar occupant_count: Number of occupants the device detects, if the device counts occupants. + :ivar properties: Properties of the device. + :ivar relative_humidity: Relative humidity, as a value between 0 and 1, inclusive, if the device measures humidity. + :ivar space_ids: IDs of the spaces the device is in. + :ivar temperature_celsius: Temperature in °C, if the device measures temperature. + + :ivar temperature_fahrenheit: Temperature in °F, if the device measures temperature. + :ivar warnings: Array of warnings associated with the device. Each warning object within the array contains two fields: ``warning_code`` and ``message``. ``warning_code`` is a string that uniquely identifies the type of warning, enabling quick recognition and categorization of the issue. ``message`` provides a more detailed description of the warning, offering insights into the issue and potentially how to rectify it. :ivar workspace_id: Unique identifier for the Seam workspace associated with the device. @@ -569,6 +595,73 @@ def from_dict(cls, d: Any): timezone=d.get("timezone", None), ) + @dataclass + class NamedSensors(ResourceMapping): + """Additional sensors of the same kind on the device, each with a stable ``sensor_name``. Present only when the device has more than one sensor of a kind or no single main sensor. + + :ivar air_quality_index: Air quality index, if the device measures it. + + :ivar co2_ppm: Carbon dioxide concentration in parts per million, if the device measures it. + + :ivar co_ppm: Carbon monoxide concentration in parts per million, if the device measures it. + + :ivar display_name: Display name of the sensor. Defaults to ``sensor_name``. + + :ivar is_occupied: Indicates whether the device detects that the space is occupied, if the device measures occupancy. + + :ivar is_smoking_detected: Indicates whether the device detects smoking, if the device measures it. + + :ivar mold_risk_level: Mold risk level as reported by the device, if the device measures it. + + :ivar noise_level_decibels: Noise level in decibels, if the device measures noise. + + :ivar noise_level_nrs: Noise level as a Noise Risk Score (NRS), if the device reports one. + + :ivar occupant_count: Number of occupants the device detects, if the device counts occupants. + + :ivar relative_humidity: Relative humidity, as a value between 0 and 1, inclusive, if the device measures humidity. + + :ivar sensor_name: Stable, hardware-defined name of the sensor, such as a port number. + + :ivar temperature_celsius: Temperature in °C, if the device measures temperature. + + :ivar temperature_fahrenheit: Temperature in °F, if the device measures temperature. + """ + + air_quality_index: Optional[float] + co2_ppm: Optional[float] + co_ppm: Optional[float] + display_name: str + is_occupied: Optional[bool] + is_smoking_detected: Optional[bool] + mold_risk_level: Optional[str] + noise_level_decibels: Optional[float] + noise_level_nrs: Optional[float] + occupant_count: Optional[float] + relative_humidity: Optional[float] + sensor_name: str + temperature_celsius: Optional[float] + temperature_fahrenheit: Optional[float] + + @classmethod + def from_dict(cls, d: Any): + return cls( + air_quality_index=d.get("air_quality_index", None), + co2_ppm=d.get("co2_ppm", None), + co_ppm=d.get("co_ppm", None), + display_name=d.get("display_name", None), + is_occupied=d.get("is_occupied", None), + is_smoking_detected=d.get("is_smoking_detected", None), + mold_risk_level=d.get("mold_risk_level", None), + noise_level_decibels=d.get("noise_level_decibels", None), + noise_level_nrs=d.get("noise_level_nrs", None), + occupant_count=d.get("occupant_count", None), + relative_humidity=d.get("relative_humidity", None), + sensor_name=d.get("sensor_name", None), + temperature_celsius=d.get("temperature_celsius", None), + temperature_fahrenheit=d.get("temperature_fahrenheit", None), + ) + @dataclass class Properties(ResourceMapping): """Properties of the device. @@ -4703,6 +4796,7 @@ def from_dict(cls, d: Any): "cloud_recording_not_enabled": CloudRecordingNotEnabledWarning, } + air_quality_index: Optional[float] can_activate_weekly_program: Optional[bool] can_configure_auto_lock: Optional[bool] can_hvac_cool: Optional[bool] @@ -4730,6 +4824,8 @@ def from_dict(cls, d: Any): "access_code", "lock", "noise_detection", "thermostat", "battery", "phone" ] ] + co2_ppm: Optional[float] + co_ppm: Optional[float] connected_account_id: str created_at: str custom_metadata: Dict[str, Union[str, bool]] @@ -4789,20 +4885,32 @@ def from_dict(cls, d: Any): "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] display_name: str errors: List[Errors] is_managed: Literal[True] + is_occupied: Optional[bool] + is_smoking_detected: Optional[bool] location: Optional[Location] + mold_risk_level: Optional[str] + named_sensors: Optional[List[NamedSensors]] nickname: Optional[str] + noise_level_decibels: Optional[float] + noise_level_nrs: Optional[float] + occupant_count: Optional[float] properties: Optional[Properties] + relative_humidity: Optional[float] space_ids: List[str] + temperature_celsius: Optional[float] + temperature_fahrenheit: Optional[float] warnings: List[Warnings] workspace_id: str @classmethod def from_dict(cls, d: Any): return cls( + air_quality_index=d.get("air_quality_index", None), can_activate_weekly_program=d.get("can_activate_weekly_program", None), can_configure_auto_lock=d.get("can_configure_auto_lock", None), can_hvac_cool=d.get("can_hvac_cool", None), @@ -4840,6 +4948,8 @@ def from_dict(cls, d: Any): can_turn_off_hvac=d.get("can_turn_off_hvac", None), can_unlock_with_code=d.get("can_unlock_with_code", None), capabilities_supported=d.get("capabilities_supported", None), + co2_ppm=d.get("co2_ppm", None), + co_ppm=d.get("co_ppm", None), connected_account_id=d.get("connected_account_id", None), created_at=d.get("created_at", None), custom_metadata=DeepAttrDict(d.get("custom_metadata", None)), @@ -4861,18 +4971,30 @@ def from_dict(cls, d: Any): for i in d.get("errors") or [] ], is_managed=d.get("is_managed", None), + is_occupied=d.get("is_occupied", None), + is_smoking_detected=d.get("is_smoking_detected", None), location=( cls.Location.from_dict(d.get("location")) if d.get("location") is not None else None ), + mold_risk_level=d.get("mold_risk_level", None), + named_sensors=[ + cls.NamedSensors.from_dict(i) for i in d.get("named_sensors") or [] + ], nickname=d.get("nickname", None), + noise_level_decibels=d.get("noise_level_decibels", None), + noise_level_nrs=d.get("noise_level_nrs", None), + occupant_count=d.get("occupant_count", None), properties=( cls.Properties.from_dict(d.get("properties")) if d.get("properties") is not None else None ), + relative_humidity=d.get("relative_humidity", None), space_ids=d.get("space_ids", None), + temperature_celsius=d.get("temperature_celsius", None), + temperature_fahrenheit=d.get("temperature_fahrenheit", None), warnings=[ _from_discriminated_dict(i, cls._WarningsVariants, "warning_code") for i in d.get("warnings") or [] diff --git a/seam/resources/device_provider.py b/seam/resources/device_provider.py index c022320b..4e3f26a6 100644 --- a/seam/resources/device_provider.py +++ b/seam/resources/device_provider.py @@ -148,6 +148,7 @@ class DeviceProvider: "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", diff --git a/seam/resources/unmanaged_device.py b/seam/resources/unmanaged_device.py index 4829d8e1..39568ea6 100644 --- a/seam/resources/unmanaged_device.py +++ b/seam/resources/unmanaged_device.py @@ -1540,6 +1540,7 @@ def from_dict(cls, d: Any): "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] display_name: str errors: List[Errors] diff --git a/seam/routes/connect_webviews.py b/seam/routes/connect_webviews.py index 3cf78918..c2c162ff 100644 --- a/seam/routes/connect_webviews.py +++ b/seam/routes/connect_webviews.py @@ -94,6 +94,7 @@ def create( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -296,6 +297,7 @@ async def create( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -505,6 +507,7 @@ def create( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -792,6 +795,7 @@ async def create( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", diff --git a/seam/routes/devices.py b/seam/routes/devices.py index e2ee28d3..9e03802d 100644 --- a/seam/routes/devices.py +++ b/seam/routes/devices.py @@ -115,6 +115,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -172,6 +173,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -229,6 +231,7 @@ def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -442,6 +445,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -499,6 +503,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -556,6 +561,7 @@ async def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -789,6 +795,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -846,6 +853,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -903,6 +911,7 @@ def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -1223,6 +1232,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -1280,6 +1290,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -1337,6 +1348,7 @@ async def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", diff --git a/seam/routes/devices_unmanaged.py b/seam/routes/devices_unmanaged.py index 75ca28d9..965ebf15 100644 --- a/seam/routes/devices_unmanaged.py +++ b/seam/routes/devices_unmanaged.py @@ -94,6 +94,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -151,6 +152,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -208,6 +210,7 @@ def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -360,6 +363,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -417,6 +421,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -474,6 +479,7 @@ async def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -650,6 +656,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -707,6 +714,7 @@ def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -764,6 +772,7 @@ def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", @@ -988,6 +997,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] = None, device_types: Optional[ @@ -1045,6 +1055,7 @@ async def list( "reolink_camera", "unifi_protect_camera", "sonos_speaker", + "alertify_sensor", ] ] ] = None, @@ -1102,6 +1113,7 @@ async def list( "reolink", "unifi_protect", "yale_connect", + "alertify", "ical", "lodgify", "hostaway", diff --git a/seam/routes/noise_sensors.py b/seam/routes/noise_sensors.py index 8183a3f4..59546a80 100644 --- a/seam/routes/noise_sensors.py +++ b/seam/routes/noise_sensors.py @@ -43,7 +43,7 @@ def list( device_types: Optional[ List[Literal["noiseaware_activity_zone", "minut_sensor"]] ] = None, - manufacturer: Optional[Literal["minut", "noiseaware"]] = None, + manufacturer: Optional[Literal["minut", "noiseaware", "alertify"]] = None, ) -> List[Device]: """Returns a list of all `noise sensors `_. @@ -88,7 +88,7 @@ async def list( device_types: Optional[ List[Literal["noiseaware_activity_zone", "minut_sensor"]] ] = None, - manufacturer: Optional[Literal["minut", "noiseaware"]] = None, + manufacturer: Optional[Literal["minut", "noiseaware", "alertify"]] = None, ) -> List[Device]: """Returns a list of all `noise sensors `_. @@ -142,7 +142,7 @@ def list( device_types: Optional[ List[Literal["noiseaware_activity_zone", "minut_sensor"]] ] = None, - manufacturer: Optional[Literal["minut", "noiseaware"]] = None, + manufacturer: Optional[Literal["minut", "noiseaware", "alertify"]] = None, ) -> List[Device]: """Returns a list of all `noise sensors `_. @@ -215,7 +215,7 @@ async def list( device_types: Optional[ List[Literal["noiseaware_activity_zone", "minut_sensor"]] ] = None, - manufacturer: Optional[Literal["minut", "noiseaware"]] = None, + manufacturer: Optional[Literal["minut", "noiseaware", "alertify"]] = None, ) -> List[Device]: """Returns a list of all `noise sensors `_.