diff --git a/package-lock.json b/package-lock.json index 1e775908..f82c9628 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,10 @@ "": { "name": "@seamapi/python", "devDependencies": { - "@seamapi/blueprint": "^1.10.0", + "@seamapi/blueprint": "^1.11.0", "@seamapi/fake-seam-connect": "2.0.6", "@seamapi/smith": "^1.1.0", - "@seamapi/types": "1.1047.0", + "@seamapi/types": "1.1053.0", "change-case": "^5.4.4", "prettier": "^3.2.5" }, @@ -787,20 +787,30 @@ "license": "MIT" }, "node_modules/@seamapi/blueprint": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-1.10.0.tgz", - "integrity": "sha512-XyP6zvbhv5naWEa9T9utNLi3FVVmvUB1Htih/IjUqS3Uz0FrIIBWy7Myk5+s4uylEt+wTdtSBaA1fGOF/6ILmA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-1.11.0.tgz", + "integrity": "sha512-uX0Lxf5GH5PLaRY9H8dO0FPxWhw6FQrVRHcYL9W/rkT+t6rZn5fUPJyT5FSOGo6QT0N5gLpjsVs+ymMMRtfCXA==", "dev": true, "license": "MIT", "dependencies": { "change-case": "^5.4.4", - "zod": "^3.23.8" + "zod": "^4.0.0" }, "engines": { "node": ">=22.12.0", "npm": ">=10.0.0" } }, + "node_modules/@seamapi/blueprint/node_modules/zod": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.2.tgz", + "integrity": "sha512-XkYXCol10+ba/6F/cueWV+TezUeOqXW0hdeJt5CdXjTYeAgAQg5N03RQdJ80mhfFE72+pblvYMW4wy2Qp4Qbrg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@seamapi/fake-seam-connect": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@seamapi/fake-seam-connect/-/fake-seam-connect-2.0.6.tgz", @@ -853,9 +863,9 @@ } }, "node_modules/@seamapi/types": { - "version": "1.1047.0", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.1047.0.tgz", - "integrity": "sha512-S3A3FcQ4fWJ1IsxVjHaE14k7WlQt0iKJsb3oPF/YVUZHJAmHnFg6riAF6LghlMig7prLf6C2uxaTDairw5dCJQ==", + "version": "1.1053.0", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.1053.0.tgz", + "integrity": "sha512-Qdis0HKIP52X4PmN0iKDwHX4ZvRq5BmKQfNtSi7TA7jrT/kQbNVk/zwIVle2yQcJjjxAEDBbHtSm+kb4FEuPZA==", "dev": true, "license": "MIT", "engines": { @@ -863,7 +873,7 @@ "npm": ">=10.0.0" }, "peerDependencies": { - "zod": "^3.24.0" + "zod": "^3.25.0 || ^4.0.0" } }, "node_modules/@sindresorhus/merge-streams": { @@ -5828,6 +5838,7 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 85b6576d..1e227dbe 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,10 @@ }, "packageManager": "npm@11.19.0", "devDependencies": { - "@seamapi/blueprint": "^1.10.0", + "@seamapi/blueprint": "^1.11.0", "@seamapi/fake-seam-connect": "2.0.6", "@seamapi/smith": "^1.1.0", - "@seamapi/types": "1.1047.0", + "@seamapi/types": "1.1053.0", "change-case": "^5.4.4", "prettier": "^3.2.5" } diff --git a/seam/resources/device.py b/seam/resources/device.py index d9ce544f..65fdd580 100644 --- a/seam/resources/device.py +++ b/seam/resources/device.py @@ -623,6 +623,8 @@ class Properties(ResourceMapping): :ivar controlbyweb_metadata: Metadata for a ControlByWeb device. + :ivar dormakaba_oracode_iho_metadata: Metadata for a dormakaba Oracode Homeowner's Portal device. + :ivar dormakaba_oracode_metadata: Metadata for a dormakaba Oracode device. :ivar ecobee_metadata: Metadata for an ecobee device. @@ -1150,6 +1152,61 @@ def from_dict(cls, d: Any): relay_name=d.get("relay_name", None), ) + @dataclass + class DormakabaOracodeIhoMetadata(ResourceMapping): + """Metadata for a dormakaba Oracode Homeowner's Portal device. + + :ivar door_id: Door ID for a dormakaba Oracode Homeowner's Portal device. + + :ivar door_name: Name of the door for a dormakaba Oracode Homeowner's Portal device. + + :ivar user_levels: User levels for a dormakaba Oracode Homeowner's Portal device. + """ + + @dataclass + class UserLevels(ResourceMapping): + """User levels for a dormakaba Oracode Homeowner's Portal device. + + :ivar checkInTime: + + :ivar checkOutTime: + + :ivar userLevel: + + :ivar userLevelName: + + :ivar userLevelType:""" + + checkInTime: Optional[str] + checkOutTime: Optional[str] + userLevel: Optional[float] + userLevelName: Optional[str] + userLevelType: Optional[str] + + @classmethod + def from_dict(cls, d: Any): + return cls( + checkInTime=d.get("checkInTime", None), + checkOutTime=d.get("checkOutTime", None), + userLevel=d.get("userLevel", None), + userLevelName=d.get("userLevelName", None), + userLevelType=d.get("userLevelType", None), + ) + + door_id: Optional[float] + door_name: Optional[str] + user_levels: Optional[List[UserLevels]] + + @classmethod + def from_dict(cls, d: Any): + return cls( + door_id=d.get("door_id", None), + door_name=d.get("door_name", None), + user_levels=[ + cls.UserLevels.from_dict(i) for i in d.get("user_levels") or [] + ], + ) + @dataclass class DormakabaOracodeMetadata(ResourceMapping): """Metadata for a dormakaba Oracode device. @@ -3140,6 +3197,7 @@ def from_dict(cls, d: Any): avigilon_alta_metadata: Optional[AvigilonAltaMetadata] brivo_metadata: Optional[BrivoMetadata] controlbyweb_metadata: Optional[ControlbywebMetadata] + dormakaba_oracode_iho_metadata: Optional[DormakabaOracodeIhoMetadata] dormakaba_oracode_metadata: Optional[DormakabaOracodeMetadata] ecobee_metadata: Optional[EcobeeMetadata] four_suites_metadata: Optional[FourSuitesMetadata] @@ -3317,6 +3375,13 @@ def from_dict(cls, d: Any): if d.get("controlbyweb_metadata") is not None else None ), + dormakaba_oracode_iho_metadata=( + cls.DormakabaOracodeIhoMetadata.from_dict( + d.get("dormakaba_oracode_iho_metadata") + ) + if d.get("dormakaba_oracode_iho_metadata") is not None + else None + ), dormakaba_oracode_metadata=( cls.DormakabaOracodeMetadata.from_dict( d.get("dormakaba_oracode_metadata") diff --git a/seam/resources/device_provider.py b/seam/resources/device_provider.py index b4276458..7cc91322 100644 --- a/seam/resources/device_provider.py +++ b/seam/resources/device_provider.py @@ -109,6 +109,7 @@ class DeviceProvider: "ecobee", "four_suites", "dormakaba_oracode", + "dormakaba_oracode_iho", "pti", "wyze", "seam_passport", diff --git a/seam/routes/connect_webviews.py b/seam/routes/connect_webviews.py index 0fa2e0f8..a8325fd9 100644 --- a/seam/routes/connect_webviews.py +++ b/seam/routes/connect_webviews.py @@ -56,6 +56,7 @@ def create( "ecobee", "four_suites", "dormakaba_oracode", + "dormakaba_oracode_iho", "pti", "wyze", "seam_passport", @@ -244,6 +245,7 @@ async def create( "ecobee", "four_suites", "dormakaba_oracode", + "dormakaba_oracode_iho", "pti", "wyze", "seam_passport", @@ -439,6 +441,7 @@ def create( "ecobee", "four_suites", "dormakaba_oracode", + "dormakaba_oracode_iho", "pti", "wyze", "seam_passport", @@ -716,6 +719,7 @@ async def create( "ecobee", "four_suites", "dormakaba_oracode", + "dormakaba_oracode_iho", "pti", "wyze", "seam_passport", diff --git a/seam/routes/devices.py b/seam/routes/devices.py index 08fb05ed..74bc325a 100644 --- a/seam/routes/devices.py +++ b/seam/routes/devices.py @@ -191,6 +191,7 @@ def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", @@ -491,6 +492,7 @@ async def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", @@ -821,6 +823,7 @@ def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", @@ -1242,6 +1245,7 @@ async def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", diff --git a/seam/routes/devices_unmanaged.py b/seam/routes/devices_unmanaged.py index 7112889d..5e1ffcc7 100644 --- a/seam/routes/devices_unmanaged.py +++ b/seam/routes/devices_unmanaged.py @@ -170,6 +170,7 @@ def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", @@ -409,6 +410,7 @@ async def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", @@ -684,6 +686,7 @@ def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", @@ -1009,6 +1012,7 @@ async def list( "akiles", "aqara", "ecobee", + "dormakaba_oracode_iho", "honeywell_resideo", "keynest", "korelock", diff --git a/seam/routes/locks.py b/seam/routes/locks.py index 3e99fe9e..868846f7 100644 --- a/seam/routes/locks.py +++ b/seam/routes/locks.py @@ -171,6 +171,7 @@ def list( "keyincode", "akiles", "aqara", + "dormakaba_oracode_iho", "korelock", "lockly", "smartthings", @@ -385,6 +386,7 @@ async def list( "keyincode", "akiles", "aqara", + "dormakaba_oracode_iho", "korelock", "lockly", "smartthings", @@ -656,6 +658,7 @@ def list( "keyincode", "akiles", "aqara", + "dormakaba_oracode_iho", "korelock", "lockly", "smartthings", @@ -989,6 +992,7 @@ async def list( "keyincode", "akiles", "aqara", + "dormakaba_oracode_iho", "korelock", "lockly", "smartthings",