From cb49fc8f575a7c5277fa5d5b40fa356be8240ebe Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 4 Jan 2024 06:38:22 -0700 Subject: [PATCH] Adjust for interesting govee schema refs: https://github.com/wez/govee2mqtt/issues/4 --- Cargo.lock | 12 + Cargo.toml | 1 + .../platform_api_test_get_device_scenes.snap | 987 ++-- .../platform_api_test_list_devices.snap | 2528 +++++----- .../platform_api_test_list_devices_2.snap | 4161 ++++++++++------- ...platform_api_test_list_devices_issue4.snap | 2226 +++++++++ src/commands/http_control.rs | 4 +- src/platform_api.rs | 60 +- test-data/list_devices_issue4.json | 1682 +++++++ 9 files changed, 8276 insertions(+), 3385 deletions(-) create mode 100644 src/__k9_snapshots__/platform_api/platform_api_test_list_devices_issue4.snap create mode 100644 test-data/list_devices_issue4.json diff --git a/Cargo.lock b/Cargo.lock index f2c104c..4205160 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -773,6 +773,7 @@ dependencies = [ "rusqlite", "serde", "serde_json", + "serde_json_path_to_error", "sqlite-cache", "tokio", "tower-http", @@ -1754,6 +1755,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_json_path_to_error" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7f2c2432eb04d880635fbf5d45cd5e619aeca7d4aff62cc1699671512db7d53" +dependencies = [ + "serde", + "serde_json", + "serde_path_to_error", +] + [[package]] name = "serde_path_to_error" version = "0.1.15" diff --git a/Cargo.toml b/Cargo.toml index 882a4f5..0191439 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,6 +34,7 @@ p12 = "0.6.3" axum = "0.7.3" tower-http = { version = "0.5.0", features = ["fs"] } async-channel = "2.1.1" +serde_json_path_to_error = "0.1.4" [dependencies.mosquitto-rs] version="0.9.0" diff --git a/src/__k9_snapshots__/platform_api/platform_api_test_get_device_scenes.snap b/src/__k9_snapshots__/platform_api/platform_api_test_get_device_scenes.snap index ff85bbb..dc29b93 100644 --- a/src/__k9_snapshots__/platform_api/platform_api_test_get_device_scenes.snap +++ b/src/__k9_snapshots__/platform_api/platform_api_test_get_device_scenes.snap @@ -9,465 +9,534 @@ GetDeviceScenesResponse { DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [ - EnumOption { - name: "rainbow B", - value: Object { - "id": Number(7691), - "paramId": Number(11837), - }, - }, - EnumOption { - name: "Sunrise", - value: Object { - "id": Number(1606), - "paramId": Number(1681), - }, - }, - EnumOption { - name: "Sunset", - value: Object { - "id": Number(1607), - "paramId": Number(1682), - }, - }, - EnumOption { - name: "Ocean", - value: Object { - "id": Number(1608), - "paramId": Number(1683), - }, - }, - EnumOption { - name: "Forest", - value: Object { - "id": Number(1609), - "paramId": Number(1684), - }, - }, - EnumOption { - name: "Sunset Glow", - value: Object { - "id": Number(1610), - "paramId": Number(1685), - }, - }, - EnumOption { - name: "Ripple", - value: Object { - "id": Number(1611), - "paramId": Number(1686), - }, - }, - EnumOption { - name: "Rainbow", - value: Object { - "id": Number(1612), - "paramId": Number(1687), - }, - }, - EnumOption { - name: "Meteor", - value: Object { - "id": Number(1613), - "paramId": Number(1688), - }, - }, - EnumOption { - name: "Aurora", - value: Object { - "id": Number(1614), - "paramId": Number(1689), - }, - }, - EnumOption { - name: "Karst Cave", - value: Object { - "id": Number(1615), - "paramId": Number(1690), - }, - }, - EnumOption { - name: "Glacier", - value: Object { - "id": Number(1616), - "paramId": Number(1691), - }, - }, - EnumOption { - name: "Lake", - value: Object { - "id": Number(1617), - "paramId": Number(1692), - }, - }, - EnumOption { - name: "Fire", - value: Object { - "id": Number(1618), - "paramId": Number(1693), - }, - }, - EnumOption { - name: "Journey of Flowers", - value: Object { - "id": Number(1619), - "paramId": Number(1694), - }, - }, - EnumOption { - name: "Downpour", - value: Object { - "id": Number(1620), - "paramId": Number(1695), - }, - }, - EnumOption { - name: "Rustling leaves", - value: Object { - "id": Number(1621), - "paramId": Number(1696), - }, - }, - EnumOption { - name: "Wave", - value: Object { - "id": Number(1622), - "paramId": Number(1697), - }, - }, - EnumOption { - name: "Morning", - value: Object { - "id": Number(1623), - "paramId": Number(1698), - }, - }, - EnumOption { - name: "Night", - value: Object { - "id": Number(1624), - "paramId": Number(1699), - }, - }, - EnumOption { - name: "Cherry blossoms", - value: Object { - "id": Number(1625), - "paramId": Number(1700), - }, - }, - EnumOption { - name: "Movie", - value: Object { - "id": Number(1626), - "paramId": Number(1701), - }, - }, - EnumOption { - name: "Leisure", - value: Object { - "id": Number(1627), - "paramId": Number(1702), - }, - }, - EnumOption { - name: "Night Light", - value: Object { - "id": Number(1628), - "paramId": Number(1703), - }, - }, - EnumOption { - name: "Romantic", - value: Object { - "id": Number(1629), - "paramId": Number(1704), - }, - }, - EnumOption { - name: "Fireworks", - value: Object { - "id": Number(1630), - "paramId": Number(1705), - }, - }, - EnumOption { - name: "Tunnel", - value: Object { - "id": Number(1631), - "paramId": Number(1706), - }, - }, - EnumOption { - name: "Drinks", - value: Object { - "id": Number(1632), - "paramId": Number(1707), - }, - }, - EnumOption { - name: "Work", - value: Object { - "id": Number(1633), - "paramId": Number(1708), - }, - }, - EnumOption { - name: "Study", - value: Object { - "id": Number(1634), - "paramId": Number(1709), - }, - }, - EnumOption { - name: "Candy", - value: Object { - "id": Number(1635), - "paramId": Number(1710), - }, - }, - EnumOption { - name: "Breathe", - value: Object { - "id": Number(1636), - "paramId": Number(1711), - }, - }, - EnumOption { - name: "Gradient", - value: Object { - "id": Number(1637), - "paramId": Number(1712), - }, - }, - EnumOption { - name: "Energetic", - value: Object { - "id": Number(1638), - "paramId": Number(1713), - }, - }, - EnumOption { - name: "Dreamlike", - value: Object { - "id": Number(1639), - "paramId": Number(1714), - }, - }, - EnumOption { - name: "Dreamland", - value: Object { - "id": Number(1640), - "paramId": Number(1715), - }, - }, - EnumOption { - name: "Fight", - value: Object { - "id": Number(1641), - "paramId": Number(1716), - }, - }, - EnumOption { - name: "Light", - value: Object { - "id": Number(1642), - "paramId": Number(1717), - }, - }, - EnumOption { - name: "Tenderness", - value: Object { - "id": Number(1643), - "paramId": Number(1718), - }, - }, - EnumOption { - name: "Warm", - value: Object { - "id": Number(1644), - "paramId": Number(1719), - }, - }, - EnumOption { - name: "Cheerful", - value: Object { - "id": Number(1645), - "paramId": Number(1720), - }, - }, - EnumOption { - name: "Rush", - value: Object { - "id": Number(1646), - "paramId": Number(1721), - }, - }, - EnumOption { - name: "Profound", - value: Object { - "id": Number(1647), - "paramId": Number(1722), - }, - }, - EnumOption { - name: "Daze", - value: Object { - "id": Number(1648), - "paramId": Number(1723), - }, - }, - EnumOption { - name: "Halloween", - value: Object { - "id": Number(1649), - "paramId": Number(1724), - }, - }, - EnumOption { - name: "Christmas", - value: Object { - "id": Number(1650), - "paramId": Number(1725), - }, - }, - EnumOption { - name: "Party", - value: Object { - "id": Number(1651), - "paramId": Number(1726), - }, - }, - EnumOption { - name: "Celebration", - value: Object { - "id": Number(1652), - "paramId": Number(1727), - }, - }, - EnumOption { - name: "Ghost", - value: Object { - "id": Number(1653), - "paramId": Number(1728), - }, - }, - EnumOption { - name: "Poppin", - value: Object { - "id": Number(1664), - "paramId": Number(1739), - }, - }, - EnumOption { - name: "Swing", - value: Object { - "id": Number(1665), - "paramId": Number(1740), - }, - }, - EnumOption { - name: "Racing", - value: Object { - "id": Number(1666), - "paramId": Number(1741), - }, - }, - EnumOption { - name: "Flash", - value: Object { - "id": Number(1667), - "paramId": Number(1742), - }, - }, - EnumOption { - name: "Marbles", - value: Object { - "id": Number(1668), - "paramId": Number(1743), - }, - }, - EnumOption { - name: "Split", - value: Object { - "id": Number(1669), - "paramId": Number(1744), - }, - }, - EnumOption { - name: "Stacking", - value: Object { - "id": Number(1654), - "paramId": Number(1729), - }, - }, - EnumOption { - name: "Greedy Snake", - value: Object { - "id": Number(1655), - "paramId": Number(1730), - }, - }, - EnumOption { - name: "Bouncing Ball", - value: Object { - "id": Number(1656), - "paramId": Number(1731), - }, - }, - EnumOption { - name: "Strike", - value: Object { - "id": Number(1657), - "paramId": Number(1732), - }, - }, - EnumOption { - name: "Bubble", - value: Object { - "id": Number(1658), - "paramId": Number(1733), - }, - }, - EnumOption { - name: "Crossing", - value: Object { - "id": Number(1659), - "paramId": Number(1734), - }, - }, - EnumOption { - name: "Electro Dance", - value: Object { - "id": Number(1660), - "paramId": Number(1735), - }, - }, - EnumOption { - name: "Flow", - value: Object { - "id": Number(1661), - "paramId": Number(1736), - }, - }, - EnumOption { - name: "Accumulation", - value: Object { - "id": Number(1662), - "paramId": Number(1737), - }, - }, - EnumOption { - name: "Release", - value: Object { - "id": Number(1663), - "paramId": Number(1738), - }, - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "rainbow B", + value: Object { + "id": Number(7691), + "paramId": Number(11837), + }, + extras: {}, + }, + EnumOption { + name: "Sunrise", + value: Object { + "id": Number(1606), + "paramId": Number(1681), + }, + extras: {}, + }, + EnumOption { + name: "Sunset", + value: Object { + "id": Number(1607), + "paramId": Number(1682), + }, + extras: {}, + }, + EnumOption { + name: "Ocean", + value: Object { + "id": Number(1608), + "paramId": Number(1683), + }, + extras: {}, + }, + EnumOption { + name: "Forest", + value: Object { + "id": Number(1609), + "paramId": Number(1684), + }, + extras: {}, + }, + EnumOption { + name: "Sunset Glow", + value: Object { + "id": Number(1610), + "paramId": Number(1685), + }, + extras: {}, + }, + EnumOption { + name: "Ripple", + value: Object { + "id": Number(1611), + "paramId": Number(1686), + }, + extras: {}, + }, + EnumOption { + name: "Rainbow", + value: Object { + "id": Number(1612), + "paramId": Number(1687), + }, + extras: {}, + }, + EnumOption { + name: "Meteor", + value: Object { + "id": Number(1613), + "paramId": Number(1688), + }, + extras: {}, + }, + EnumOption { + name: "Aurora", + value: Object { + "id": Number(1614), + "paramId": Number(1689), + }, + extras: {}, + }, + EnumOption { + name: "Karst Cave", + value: Object { + "id": Number(1615), + "paramId": Number(1690), + }, + extras: {}, + }, + EnumOption { + name: "Glacier", + value: Object { + "id": Number(1616), + "paramId": Number(1691), + }, + extras: {}, + }, + EnumOption { + name: "Lake", + value: Object { + "id": Number(1617), + "paramId": Number(1692), + }, + extras: {}, + }, + EnumOption { + name: "Fire", + value: Object { + "id": Number(1618), + "paramId": Number(1693), + }, + extras: {}, + }, + EnumOption { + name: "Journey of Flowers", + value: Object { + "id": Number(1619), + "paramId": Number(1694), + }, + extras: {}, + }, + EnumOption { + name: "Downpour", + value: Object { + "id": Number(1620), + "paramId": Number(1695), + }, + extras: {}, + }, + EnumOption { + name: "Rustling leaves", + value: Object { + "id": Number(1621), + "paramId": Number(1696), + }, + extras: {}, + }, + EnumOption { + name: "Wave", + value: Object { + "id": Number(1622), + "paramId": Number(1697), + }, + extras: {}, + }, + EnumOption { + name: "Morning", + value: Object { + "id": Number(1623), + "paramId": Number(1698), + }, + extras: {}, + }, + EnumOption { + name: "Night", + value: Object { + "id": Number(1624), + "paramId": Number(1699), + }, + extras: {}, + }, + EnumOption { + name: "Cherry blossoms", + value: Object { + "id": Number(1625), + "paramId": Number(1700), + }, + extras: {}, + }, + EnumOption { + name: "Movie", + value: Object { + "id": Number(1626), + "paramId": Number(1701), + }, + extras: {}, + }, + EnumOption { + name: "Leisure", + value: Object { + "id": Number(1627), + "paramId": Number(1702), + }, + extras: {}, + }, + EnumOption { + name: "Night Light", + value: Object { + "id": Number(1628), + "paramId": Number(1703), + }, + extras: {}, + }, + EnumOption { + name: "Romantic", + value: Object { + "id": Number(1629), + "paramId": Number(1704), + }, + extras: {}, + }, + EnumOption { + name: "Fireworks", + value: Object { + "id": Number(1630), + "paramId": Number(1705), + }, + extras: {}, + }, + EnumOption { + name: "Tunnel", + value: Object { + "id": Number(1631), + "paramId": Number(1706), + }, + extras: {}, + }, + EnumOption { + name: "Drinks", + value: Object { + "id": Number(1632), + "paramId": Number(1707), + }, + extras: {}, + }, + EnumOption { + name: "Work", + value: Object { + "id": Number(1633), + "paramId": Number(1708), + }, + extras: {}, + }, + EnumOption { + name: "Study", + value: Object { + "id": Number(1634), + "paramId": Number(1709), + }, + extras: {}, + }, + EnumOption { + name: "Candy", + value: Object { + "id": Number(1635), + "paramId": Number(1710), + }, + extras: {}, + }, + EnumOption { + name: "Breathe", + value: Object { + "id": Number(1636), + "paramId": Number(1711), + }, + extras: {}, + }, + EnumOption { + name: "Gradient", + value: Object { + "id": Number(1637), + "paramId": Number(1712), + }, + extras: {}, + }, + EnumOption { + name: "Energetic", + value: Object { + "id": Number(1638), + "paramId": Number(1713), + }, + extras: {}, + }, + EnumOption { + name: "Dreamlike", + value: Object { + "id": Number(1639), + "paramId": Number(1714), + }, + extras: {}, + }, + EnumOption { + name: "Dreamland", + value: Object { + "id": Number(1640), + "paramId": Number(1715), + }, + extras: {}, + }, + EnumOption { + name: "Fight", + value: Object { + "id": Number(1641), + "paramId": Number(1716), + }, + extras: {}, + }, + EnumOption { + name: "Light", + value: Object { + "id": Number(1642), + "paramId": Number(1717), + }, + extras: {}, + }, + EnumOption { + name: "Tenderness", + value: Object { + "id": Number(1643), + "paramId": Number(1718), + }, + extras: {}, + }, + EnumOption { + name: "Warm", + value: Object { + "id": Number(1644), + "paramId": Number(1719), + }, + extras: {}, + }, + EnumOption { + name: "Cheerful", + value: Object { + "id": Number(1645), + "paramId": Number(1720), + }, + extras: {}, + }, + EnumOption { + name: "Rush", + value: Object { + "id": Number(1646), + "paramId": Number(1721), + }, + extras: {}, + }, + EnumOption { + name: "Profound", + value: Object { + "id": Number(1647), + "paramId": Number(1722), + }, + extras: {}, + }, + EnumOption { + name: "Daze", + value: Object { + "id": Number(1648), + "paramId": Number(1723), + }, + extras: {}, + }, + EnumOption { + name: "Halloween", + value: Object { + "id": Number(1649), + "paramId": Number(1724), + }, + extras: {}, + }, + EnumOption { + name: "Christmas", + value: Object { + "id": Number(1650), + "paramId": Number(1725), + }, + extras: {}, + }, + EnumOption { + name: "Party", + value: Object { + "id": Number(1651), + "paramId": Number(1726), + }, + extras: {}, + }, + EnumOption { + name: "Celebration", + value: Object { + "id": Number(1652), + "paramId": Number(1727), + }, + extras: {}, + }, + EnumOption { + name: "Ghost", + value: Object { + "id": Number(1653), + "paramId": Number(1728), + }, + extras: {}, + }, + EnumOption { + name: "Poppin", + value: Object { + "id": Number(1664), + "paramId": Number(1739), + }, + extras: {}, + }, + EnumOption { + name: "Swing", + value: Object { + "id": Number(1665), + "paramId": Number(1740), + }, + extras: {}, + }, + EnumOption { + name: "Racing", + value: Object { + "id": Number(1666), + "paramId": Number(1741), + }, + extras: {}, + }, + EnumOption { + name: "Flash", + value: Object { + "id": Number(1667), + "paramId": Number(1742), + }, + extras: {}, + }, + EnumOption { + name: "Marbles", + value: Object { + "id": Number(1668), + "paramId": Number(1743), + }, + extras: {}, + }, + EnumOption { + name: "Split", + value: Object { + "id": Number(1669), + "paramId": Number(1744), + }, + extras: {}, + }, + EnumOption { + name: "Stacking", + value: Object { + "id": Number(1654), + "paramId": Number(1729), + }, + extras: {}, + }, + EnumOption { + name: "Greedy Snake", + value: Object { + "id": Number(1655), + "paramId": Number(1730), + }, + extras: {}, + }, + EnumOption { + name: "Bouncing Ball", + value: Object { + "id": Number(1656), + "paramId": Number(1731), + }, + extras: {}, + }, + EnumOption { + name: "Strike", + value: Object { + "id": Number(1657), + "paramId": Number(1732), + }, + extras: {}, + }, + EnumOption { + name: "Bubble", + value: Object { + "id": Number(1658), + "paramId": Number(1733), + }, + extras: {}, + }, + EnumOption { + name: "Crossing", + value: Object { + "id": Number(1659), + "paramId": Number(1734), + }, + extras: {}, + }, + EnumOption { + name: "Electro Dance", + value: Object { + "id": Number(1660), + "paramId": Number(1735), + }, + extras: {}, + }, + EnumOption { + name: "Flow", + value: Object { + "id": Number(1661), + "paramId": Number(1736), + }, + extras: {}, + }, + EnumOption { + name: "Accumulation", + value: Object { + "id": Number(1662), + "paramId": Number(1737), + }, + extras: {}, + }, + EnumOption { + name: "Release", + value: Object { + "id": Number(1663), + "paramId": Number(1738), + }, + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, ], }, diff --git a/src/__k9_snapshots__/platform_api/platform_api_test_list_devices.snap b/src/__k9_snapshots__/platform_api/platform_api_test_list_devices.snap index fa62a07..bede860 100644 --- a/src/__k9_snapshots__/platform_api/platform_api_test_list_devices.snap +++ b/src/__k9_snapshots__/platform_api/platform_api_test_list_devices.snap @@ -11,428 +11,529 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: None, - element_range: None, - element_type: None, - options: [ - ArrayOption { - value: 0, - }, - ArrayOption { - value: 1, - }, - ArrayOption { - value: 2, - }, - ArrayOption { - value: 3, - }, - ArrayOption { - value: 4, - }, - ArrayOption { - value: 5, - }, - ArrayOption { - value: 6, - }, - ArrayOption { - value: 7, - }, - ArrayOption { - value: 8, - }, - ArrayOption { - value: 9, - }, - ArrayOption { - value: 10, - }, - ArrayOption { - value: 11, - }, - ArrayOption { - value: 12, - }, - ArrayOption { - value: 13, - }, - ArrayOption { - value: 14, - }, - ], + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: None, + element_range: None, + element_type: None, + options: [ + ArrayOption { + value: 0, + }, + ArrayOption { + value: 1, + }, + ArrayOption { + value: 2, + }, + ArrayOption { + value: 3, + }, + ArrayOption { + value: 4, + }, + ArrayOption { + value: 5, + }, + ArrayOption { + value: 6, + }, + ArrayOption { + value: 7, + }, + ArrayOption { + value: 8, + }, + ArrayOption { + value: 9, + }, + ArrayOption { + value: 10, + }, + ArrayOption { + value: 11, + }, + ArrayOption { + value: 12, + }, + ArrayOption { + value: 13, + }, + ArrayOption { + value: 14, + }, + ], + }, + default_value: None, + required: true, }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [ - EnumOption { - name: "Tudum", - value: Number(3054), - }, - EnumOption { - name: "Party", - value: Number(3055), - }, - EnumOption { - name: "Dance Party", - value: Number(3056), - }, - EnumOption { - name: "Dine Together", - value: Number(3057), - }, - EnumOption { - name: "Dating", - value: Number(3058), - }, - EnumOption { - name: "Adventure", - value: Number(3059), - }, - EnumOption { - name: "Technology", - value: Number(3060), - }, - EnumOption { - name: "Sports", - value: Number(3061), - }, - EnumOption { - name: "Dreamlike", - value: Number(3062), - }, - EnumOption { - name: "Dynamic", - value: Number(3063), - }, - EnumOption { - name: "Blossom", - value: Number(3064), - }, - EnumOption { - name: "Christmas", - value: Number(3065), - }, - EnumOption { - name: "Halloween", - value: Number(3066), - }, - EnumOption { - name: "Fireworks", - value: Number(3067), - }, - EnumOption { - name: "Ghost", - value: Number(3068), - }, - EnumOption { - name: "Easter", - value: Number(3069), - }, - EnumOption { - name: "Valentine's Day", - value: Number(3070), - }, - EnumOption { - name: "Spin", - value: Number(3071), - }, - EnumOption { - name: "Stacking", - value: Number(3072), - }, - EnumOption { - name: "Shoot", - value: Number(3073), - }, - EnumOption { - name: "Racing", - value: Number(3074), - }, - EnumOption { - name: "Poker", - value: Number(3075), - }, - EnumOption { - name: "Crossing", - value: Number(3076), - }, - EnumOption { - name: "Fight", - value: Number(3077), - }, - EnumOption { - name: "Electro Dance", - value: Number(3078), - }, - EnumOption { - name: "Swing", - value: Number(3079), - }, - EnumOption { - name: "Candy Crush", - value: Number(3080), - }, - EnumOption { - name: "Portal", - value: Number(3081), - }, - EnumOption { - name: "Freeze", - value: Number(3082), - }, - EnumOption { - name: "Excited", - value: Number(3083), - }, - EnumOption { - name: "Tension", - value: Number(3084), - }, - EnumOption { - name: "Fright", - value: Number(3085), - }, - EnumOption { - name: "Energetic", - value: Number(3086), - }, - EnumOption { - name: "Doubt", - value: Number(3087), - }, - EnumOption { - name: "Meditation", - value: Number(3088), - }, - EnumOption { - name: "Daze", - value: Number(3089), - }, - EnumOption { - name: "Action", - value: Number(3090), - }, - EnumOption { - name: "Rivalry", - value: Number(3091), - }, - EnumOption { - name: "Puzzle Game", - value: Number(3092), - }, - EnumOption { - name: "Shooting Game", - value: Number(3093), - }, - EnumOption { - name: "Racing Game", - value: Number(3094), - }, - EnumOption { - name: "Card Playing", - value: Number(3095), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Tudum", + value: Number(3054), + extras: {}, + }, + EnumOption { + name: "Party", + value: Number(3055), + extras: {}, + }, + EnumOption { + name: "Dance Party", + value: Number(3056), + extras: {}, + }, + EnumOption { + name: "Dine Together", + value: Number(3057), + extras: {}, + }, + EnumOption { + name: "Dating", + value: Number(3058), + extras: {}, + }, + EnumOption { + name: "Adventure", + value: Number(3059), + extras: {}, + }, + EnumOption { + name: "Technology", + value: Number(3060), + extras: {}, + }, + EnumOption { + name: "Sports", + value: Number(3061), + extras: {}, + }, + EnumOption { + name: "Dreamlike", + value: Number(3062), + extras: {}, + }, + EnumOption { + name: "Dynamic", + value: Number(3063), + extras: {}, + }, + EnumOption { + name: "Blossom", + value: Number(3064), + extras: {}, + }, + EnumOption { + name: "Christmas", + value: Number(3065), + extras: {}, + }, + EnumOption { + name: "Halloween", + value: Number(3066), + extras: {}, + }, + EnumOption { + name: "Fireworks", + value: Number(3067), + extras: {}, + }, + EnumOption { + name: "Ghost", + value: Number(3068), + extras: {}, + }, + EnumOption { + name: "Easter", + value: Number(3069), + extras: {}, + }, + EnumOption { + name: "Valentine's Day", + value: Number(3070), + extras: {}, + }, + EnumOption { + name: "Spin", + value: Number(3071), + extras: {}, + }, + EnumOption { + name: "Stacking", + value: Number(3072), + extras: {}, + }, + EnumOption { + name: "Shoot", + value: Number(3073), + extras: {}, + }, + EnumOption { + name: "Racing", + value: Number(3074), + extras: {}, + }, + EnumOption { + name: "Poker", + value: Number(3075), + extras: {}, + }, + EnumOption { + name: "Crossing", + value: Number(3076), + extras: {}, + }, + EnumOption { + name: "Fight", + value: Number(3077), + extras: {}, + }, + EnumOption { + name: "Electro Dance", + value: Number(3078), + extras: {}, + }, + EnumOption { + name: "Swing", + value: Number(3079), + extras: {}, + }, + EnumOption { + name: "Candy Crush", + value: Number(3080), + extras: {}, + }, + EnumOption { + name: "Portal", + value: Number(3081), + extras: {}, + }, + EnumOption { + name: "Freeze", + value: Number(3082), + extras: {}, + }, + EnumOption { + name: "Excited", + value: Number(3083), + extras: {}, + }, + EnumOption { + name: "Tension", + value: Number(3084), + extras: {}, + }, + EnumOption { + name: "Fright", + value: Number(3085), + extras: {}, + }, + EnumOption { + name: "Energetic", + value: Number(3086), + extras: {}, + }, + EnumOption { + name: "Doubt", + value: Number(3087), + extras: {}, + }, + EnumOption { + name: "Meditation", + value: Number(3088), + extras: {}, + }, + EnumOption { + name: "Daze", + value: Number(3089), + extras: {}, + }, + EnumOption { + name: "Action", + value: Number(3090), + extras: {}, + }, + EnumOption { + name: "Rivalry", + value: Number(3091), + extras: {}, + }, + EnumOption { + name: "Puzzle Game", + value: Number(3092), + extras: {}, + }, + EnumOption { + name: "Shooting Game", + value: Number(3093), + extras: {}, + }, + EnumOption { + name: "Racing Game", + value: Number(3094), + extras: {}, + }, + EnumOption { + name: "Card Playing", + value: Number(3095), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(5), - }, - EnumOption { - name: "Rhythm", - value: Number(3), - }, - EnumOption { - name: "Spectrum", - value: Number(6), - }, - EnumOption { - name: "Rolling", - value: Number(4), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "Rolling", + value: Number(4), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - ], + }, + default_value: None, + required: true, }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], }, + default_value: None, + required: false, }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), + StructField { + field_name: "rgb", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [ - EnumOption { - name: "Fade", - value: Number(8216567), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Fade", + value: Number(8216567), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [ - EnumOption { - name: "Sunrise", - value: Number(0), - }, - EnumOption { - name: "Sunset", - value: Number(1), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Sunrise", + value: Number(0), + extras: {}, + }, + EnumOption { + name: "Sunset", + value: Number(1), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -445,422 +546,522 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: None, - element_range: None, - element_type: None, - options: [ - ArrayOption { - value: 0, - }, - ArrayOption { - value: 1, - }, - ArrayOption { - value: 2, - }, - ArrayOption { - value: 3, - }, - ArrayOption { - value: 4, - }, - ArrayOption { - value: 5, - }, - ArrayOption { - value: 6, - }, - ArrayOption { - value: 7, - }, - ArrayOption { - value: 8, - }, - ArrayOption { - value: 9, - }, - ArrayOption { - value: 10, - }, - ArrayOption { - value: 11, - }, - ArrayOption { - value: 12, - }, - ArrayOption { - value: 13, - }, - ArrayOption { - value: 14, - }, - ], + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: None, + element_range: None, + element_type: None, + options: [ + ArrayOption { + value: 0, + }, + ArrayOption { + value: 1, + }, + ArrayOption { + value: 2, + }, + ArrayOption { + value: 3, + }, + ArrayOption { + value: 4, + }, + ArrayOption { + value: 5, + }, + ArrayOption { + value: 6, + }, + ArrayOption { + value: 7, + }, + ArrayOption { + value: 8, + }, + ArrayOption { + value: 9, + }, + ArrayOption { + value: 10, + }, + ArrayOption { + value: 11, + }, + ArrayOption { + value: 12, + }, + ArrayOption { + value: 13, + }, + ArrayOption { + value: 14, + }, + ], + }, + default_value: None, + required: true, }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [ - EnumOption { - name: "Tudum", - value: Number(3054), - }, - EnumOption { - name: "Party", - value: Number(3055), - }, - EnumOption { - name: "Dance Party", - value: Number(3056), - }, - EnumOption { - name: "Dine Together", - value: Number(3057), - }, - EnumOption { - name: "Dating", - value: Number(3058), - }, - EnumOption { - name: "Adventure", - value: Number(3059), - }, - EnumOption { - name: "Technology", - value: Number(3060), - }, - EnumOption { - name: "Sports", - value: Number(3061), - }, - EnumOption { - name: "Dreamlike", - value: Number(3062), - }, - EnumOption { - name: "Dynamic", - value: Number(3063), - }, - EnumOption { - name: "Blossom", - value: Number(3064), - }, - EnumOption { - name: "Christmas", - value: Number(3065), - }, - EnumOption { - name: "Halloween", - value: Number(3066), - }, - EnumOption { - name: "Fireworks", - value: Number(3067), - }, - EnumOption { - name: "Ghost", - value: Number(3068), - }, - EnumOption { - name: "Easter", - value: Number(3069), - }, - EnumOption { - name: "Valentine's Day", - value: Number(3070), - }, - EnumOption { - name: "Spin", - value: Number(3071), - }, - EnumOption { - name: "Stacking", - value: Number(3072), - }, - EnumOption { - name: "Shoot", - value: Number(3073), - }, - EnumOption { - name: "Racing", - value: Number(3074), - }, - EnumOption { - name: "Poker", - value: Number(3075), - }, - EnumOption { - name: "Crossing", - value: Number(3076), - }, - EnumOption { - name: "Fight", - value: Number(3077), - }, - EnumOption { - name: "Electro Dance", - value: Number(3078), - }, - EnumOption { - name: "Swing", - value: Number(3079), - }, - EnumOption { - name: "Candy Crush", - value: Number(3080), - }, - EnumOption { - name: "Portal", - value: Number(3081), - }, - EnumOption { - name: "Freeze", - value: Number(3082), - }, - EnumOption { - name: "Excited", - value: Number(3083), - }, - EnumOption { - name: "Tension", - value: Number(3084), - }, - EnumOption { - name: "Fright", - value: Number(3085), - }, - EnumOption { - name: "Energetic", - value: Number(3086), - }, - EnumOption { - name: "Doubt", - value: Number(3087), - }, - EnumOption { - name: "Meditation", - value: Number(3088), - }, - EnumOption { - name: "Daze", - value: Number(3089), - }, - EnumOption { - name: "Action", - value: Number(3090), - }, - EnumOption { - name: "Rivalry", - value: Number(3091), - }, - EnumOption { - name: "Puzzle Game", - value: Number(3092), - }, - EnumOption { - name: "Shooting Game", - value: Number(3093), - }, - EnumOption { - name: "Racing Game", - value: Number(3094), - }, - EnumOption { - name: "Card Playing", - value: Number(3095), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Tudum", + value: Number(3054), + extras: {}, + }, + EnumOption { + name: "Party", + value: Number(3055), + extras: {}, + }, + EnumOption { + name: "Dance Party", + value: Number(3056), + extras: {}, + }, + EnumOption { + name: "Dine Together", + value: Number(3057), + extras: {}, + }, + EnumOption { + name: "Dating", + value: Number(3058), + extras: {}, + }, + EnumOption { + name: "Adventure", + value: Number(3059), + extras: {}, + }, + EnumOption { + name: "Technology", + value: Number(3060), + extras: {}, + }, + EnumOption { + name: "Sports", + value: Number(3061), + extras: {}, + }, + EnumOption { + name: "Dreamlike", + value: Number(3062), + extras: {}, + }, + EnumOption { + name: "Dynamic", + value: Number(3063), + extras: {}, + }, + EnumOption { + name: "Blossom", + value: Number(3064), + extras: {}, + }, + EnumOption { + name: "Christmas", + value: Number(3065), + extras: {}, + }, + EnumOption { + name: "Halloween", + value: Number(3066), + extras: {}, + }, + EnumOption { + name: "Fireworks", + value: Number(3067), + extras: {}, + }, + EnumOption { + name: "Ghost", + value: Number(3068), + extras: {}, + }, + EnumOption { + name: "Easter", + value: Number(3069), + extras: {}, + }, + EnumOption { + name: "Valentine's Day", + value: Number(3070), + extras: {}, + }, + EnumOption { + name: "Spin", + value: Number(3071), + extras: {}, + }, + EnumOption { + name: "Stacking", + value: Number(3072), + extras: {}, + }, + EnumOption { + name: "Shoot", + value: Number(3073), + extras: {}, + }, + EnumOption { + name: "Racing", + value: Number(3074), + extras: {}, + }, + EnumOption { + name: "Poker", + value: Number(3075), + extras: {}, + }, + EnumOption { + name: "Crossing", + value: Number(3076), + extras: {}, + }, + EnumOption { + name: "Fight", + value: Number(3077), + extras: {}, + }, + EnumOption { + name: "Electro Dance", + value: Number(3078), + extras: {}, + }, + EnumOption { + name: "Swing", + value: Number(3079), + extras: {}, + }, + EnumOption { + name: "Candy Crush", + value: Number(3080), + extras: {}, + }, + EnumOption { + name: "Portal", + value: Number(3081), + extras: {}, + }, + EnumOption { + name: "Freeze", + value: Number(3082), + extras: {}, + }, + EnumOption { + name: "Excited", + value: Number(3083), + extras: {}, + }, + EnumOption { + name: "Tension", + value: Number(3084), + extras: {}, + }, + EnumOption { + name: "Fright", + value: Number(3085), + extras: {}, + }, + EnumOption { + name: "Energetic", + value: Number(3086), + extras: {}, + }, + EnumOption { + name: "Doubt", + value: Number(3087), + extras: {}, + }, + EnumOption { + name: "Meditation", + value: Number(3088), + extras: {}, + }, + EnumOption { + name: "Daze", + value: Number(3089), + extras: {}, + }, + EnumOption { + name: "Action", + value: Number(3090), + extras: {}, + }, + EnumOption { + name: "Rivalry", + value: Number(3091), + extras: {}, + }, + EnumOption { + name: "Puzzle Game", + value: Number(3092), + extras: {}, + }, + EnumOption { + name: "Shooting Game", + value: Number(3093), + extras: {}, + }, + EnumOption { + name: "Racing Game", + value: Number(3094), + extras: {}, + }, + EnumOption { + name: "Card Playing", + value: Number(3095), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(5), - }, - EnumOption { - name: "Rhythm", - value: Number(3), - }, - EnumOption { - name: "Spectrum", - value: Number(4), - }, - EnumOption { - name: "Rolling", - value: Number(6), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Rolling", + value: Number(6), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - ], + }, + default_value: None, + required: true, }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], }, + default_value: None, + required: false, }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicSetting, instance: "diyScene", - parameters: Enum { - options: [ - EnumOption { - name: "fade", - value: Number(8216567), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "fade", + value: Number(8216567), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [ - EnumOption { - name: "color scene", - value: Number(465503), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "color scene", + value: Number(465503), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -873,428 +1074,529 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: None, - element_range: None, - element_type: None, - options: [ - ArrayOption { - value: 0, - }, - ArrayOption { - value: 1, - }, - ArrayOption { - value: 2, - }, - ArrayOption { - value: 3, - }, - ArrayOption { - value: 4, - }, - ArrayOption { - value: 5, - }, - ArrayOption { - value: 6, - }, - ArrayOption { - value: 7, - }, - ArrayOption { - value: 8, - }, - ArrayOption { - value: 9, - }, - ArrayOption { - value: 10, - }, - ArrayOption { - value: 11, - }, - ArrayOption { - value: 12, - }, - ArrayOption { - value: 13, - }, - ArrayOption { - value: 14, - }, - ], + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: None, + element_range: None, + element_type: None, + options: [ + ArrayOption { + value: 0, + }, + ArrayOption { + value: 1, + }, + ArrayOption { + value: 2, + }, + ArrayOption { + value: 3, + }, + ArrayOption { + value: 4, + }, + ArrayOption { + value: 5, + }, + ArrayOption { + value: 6, + }, + ArrayOption { + value: 7, + }, + ArrayOption { + value: 8, + }, + ArrayOption { + value: 9, + }, + ArrayOption { + value: 10, + }, + ArrayOption { + value: 11, + }, + ArrayOption { + value: 12, + }, + ArrayOption { + value: 13, + }, + ArrayOption { + value: 14, + }, + ], + }, + default_value: None, + required: true, }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [ - EnumOption { - name: "Tudum", - value: Number(3054), - }, - EnumOption { - name: "Party", - value: Number(3055), - }, - EnumOption { - name: "Dance Party", - value: Number(3056), - }, - EnumOption { - name: "Dine Together", - value: Number(3057), - }, - EnumOption { - name: "Dating", - value: Number(3058), - }, - EnumOption { - name: "Adventure", - value: Number(3059), - }, - EnumOption { - name: "Technology", - value: Number(3060), - }, - EnumOption { - name: "Sports", - value: Number(3061), - }, - EnumOption { - name: "Dreamlike", - value: Number(3062), - }, - EnumOption { - name: "Dynamic", - value: Number(3063), - }, - EnumOption { - name: "Blossom", - value: Number(3064), - }, - EnumOption { - name: "Christmas", - value: Number(3065), - }, - EnumOption { - name: "Halloween", - value: Number(3066), - }, - EnumOption { - name: "Fireworks", - value: Number(3067), - }, - EnumOption { - name: "Ghost", - value: Number(3068), - }, - EnumOption { - name: "Easter", - value: Number(3069), - }, - EnumOption { - name: "Valentine's Day", - value: Number(3070), - }, - EnumOption { - name: "Spin", - value: Number(3071), - }, - EnumOption { - name: "Stacking", - value: Number(3072), - }, - EnumOption { - name: "Shoot", - value: Number(3073), - }, - EnumOption { - name: "Racing", - value: Number(3074), - }, - EnumOption { - name: "Poker", - value: Number(3075), - }, - EnumOption { - name: "Crossing", - value: Number(3076), - }, - EnumOption { - name: "Fight", - value: Number(3077), - }, - EnumOption { - name: "Electro Dance", - value: Number(3078), - }, - EnumOption { - name: "Swing", - value: Number(3079), - }, - EnumOption { - name: "Candy Crush", - value: Number(3080), - }, - EnumOption { - name: "Portal", - value: Number(3081), - }, - EnumOption { - name: "Freeze", - value: Number(3082), - }, - EnumOption { - name: "Excited", - value: Number(3083), - }, - EnumOption { - name: "Tension", - value: Number(3084), - }, - EnumOption { - name: "Fright", - value: Number(3085), - }, - EnumOption { - name: "Energetic", - value: Number(3086), - }, - EnumOption { - name: "Doubt", - value: Number(3087), - }, - EnumOption { - name: "Meditation", - value: Number(3088), - }, - EnumOption { - name: "Daze", - value: Number(3089), - }, - EnumOption { - name: "Action", - value: Number(3090), - }, - EnumOption { - name: "Rivalry", - value: Number(3091), - }, - EnumOption { - name: "Puzzle Game", - value: Number(3092), - }, - EnumOption { - name: "Shooting Game", - value: Number(3093), - }, - EnumOption { - name: "Racing Game", - value: Number(3094), - }, - EnumOption { - name: "Card Playing", - value: Number(3095), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Tudum", + value: Number(3054), + extras: {}, + }, + EnumOption { + name: "Party", + value: Number(3055), + extras: {}, + }, + EnumOption { + name: "Dance Party", + value: Number(3056), + extras: {}, + }, + EnumOption { + name: "Dine Together", + value: Number(3057), + extras: {}, + }, + EnumOption { + name: "Dating", + value: Number(3058), + extras: {}, + }, + EnumOption { + name: "Adventure", + value: Number(3059), + extras: {}, + }, + EnumOption { + name: "Technology", + value: Number(3060), + extras: {}, + }, + EnumOption { + name: "Sports", + value: Number(3061), + extras: {}, + }, + EnumOption { + name: "Dreamlike", + value: Number(3062), + extras: {}, + }, + EnumOption { + name: "Dynamic", + value: Number(3063), + extras: {}, + }, + EnumOption { + name: "Blossom", + value: Number(3064), + extras: {}, + }, + EnumOption { + name: "Christmas", + value: Number(3065), + extras: {}, + }, + EnumOption { + name: "Halloween", + value: Number(3066), + extras: {}, + }, + EnumOption { + name: "Fireworks", + value: Number(3067), + extras: {}, + }, + EnumOption { + name: "Ghost", + value: Number(3068), + extras: {}, + }, + EnumOption { + name: "Easter", + value: Number(3069), + extras: {}, + }, + EnumOption { + name: "Valentine's Day", + value: Number(3070), + extras: {}, + }, + EnumOption { + name: "Spin", + value: Number(3071), + extras: {}, + }, + EnumOption { + name: "Stacking", + value: Number(3072), + extras: {}, + }, + EnumOption { + name: "Shoot", + value: Number(3073), + extras: {}, + }, + EnumOption { + name: "Racing", + value: Number(3074), + extras: {}, + }, + EnumOption { + name: "Poker", + value: Number(3075), + extras: {}, + }, + EnumOption { + name: "Crossing", + value: Number(3076), + extras: {}, + }, + EnumOption { + name: "Fight", + value: Number(3077), + extras: {}, + }, + EnumOption { + name: "Electro Dance", + value: Number(3078), + extras: {}, + }, + EnumOption { + name: "Swing", + value: Number(3079), + extras: {}, + }, + EnumOption { + name: "Candy Crush", + value: Number(3080), + extras: {}, + }, + EnumOption { + name: "Portal", + value: Number(3081), + extras: {}, + }, + EnumOption { + name: "Freeze", + value: Number(3082), + extras: {}, + }, + EnumOption { + name: "Excited", + value: Number(3083), + extras: {}, + }, + EnumOption { + name: "Tension", + value: Number(3084), + extras: {}, + }, + EnumOption { + name: "Fright", + value: Number(3085), + extras: {}, + }, + EnumOption { + name: "Energetic", + value: Number(3086), + extras: {}, + }, + EnumOption { + name: "Doubt", + value: Number(3087), + extras: {}, + }, + EnumOption { + name: "Meditation", + value: Number(3088), + extras: {}, + }, + EnumOption { + name: "Daze", + value: Number(3089), + extras: {}, + }, + EnumOption { + name: "Action", + value: Number(3090), + extras: {}, + }, + EnumOption { + name: "Rivalry", + value: Number(3091), + extras: {}, + }, + EnumOption { + name: "Puzzle Game", + value: Number(3092), + extras: {}, + }, + EnumOption { + name: "Shooting Game", + value: Number(3093), + extras: {}, + }, + EnumOption { + name: "Racing Game", + value: Number(3094), + extras: {}, + }, + EnumOption { + name: "Card Playing", + value: Number(3095), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(5), - }, - EnumOption { - name: "Rhythm", - value: Number(3), - }, - EnumOption { - name: "Spectrum", - value: Number(6), - }, - EnumOption { - name: "Rolling", - value: Number(4), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "Rolling", + value: Number(4), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - ], + }, + default_value: None, + required: true, }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], }, + default_value: None, + required: false, }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), + StructField { + field_name: "rgb", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [ - EnumOption { - name: "Fade", - value: Number(8216567), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Fade", + value: Number(8216567), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [ - EnumOption { - name: "Sunrise", - value: Number(0), - }, - EnumOption { - name: "Sunset", - value: Number(1), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Sunrise", + value: Number(0), + extras: {}, + }, + EnumOption { + name: "Sunset", + value: Number(1), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, ], }, diff --git a/src/__k9_snapshots__/platform_api/platform_api_test_list_devices_2.snap b/src/__k9_snapshots__/platform_api/platform_api_test_list_devices_2.snap index b0e3949..12455e1 100644 --- a/src/__k9_snapshots__/platform_api/platform_api_test_list_devices_2.snap +++ b/src/__k9_snapshots__/platform_api/platform_api_test_list_devices_2.snap @@ -11,259 +11,323 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Bounce", - value: Number(3), - }, - EnumOption { - name: "Hopping", - value: Number(4), - }, - EnumOption { - name: "Strike", - value: Number(5), - }, - EnumOption { - name: "Vibrate", - value: Number(6), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Bounce", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Strike", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Vibrate", + value: Number(6), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -276,259 +340,323 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Bounce", - value: Number(3), - }, - EnumOption { - name: "Hopping", - value: Number(4), - }, - EnumOption { - name: "Strike", - value: Number(5), - }, - EnumOption { - name: "Vibrate", - value: Number(6), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Bounce", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Strike", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Vibrate", + value: Number(6), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -541,279 +669,348 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 15, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 15, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Spectrum", - value: Number(3), - }, - EnumOption { - name: "Rolling", - value: Number(4), - }, - EnumOption { - name: "Separation", - value: Number(5), - }, - EnumOption { - name: "Hopping", - value: Number(6), - }, - EnumOption { - name: "PianoKeys", - value: Number(7), - }, - EnumOption { - name: "Fountain", - value: Number(8), - }, - EnumOption { - name: "DayAndNight", - value: Number(9), - }, - EnumOption { - name: "Sprouting", - value: Number(10), - }, - EnumOption { - name: "Shiny", - value: Number(11), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Rolling", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Separation", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "PianoKeys", + value: Number(7), + extras: {}, + }, + EnumOption { + name: "Fountain", + value: Number(8), + extras: {}, + }, + EnumOption { + name: "DayAndNight", + value: Number(9), + extras: {}, + }, + EnumOption { + name: "Sprouting", + value: Number(10), + extras: {}, + }, + EnumOption { + name: "Shiny", + value: Number(11), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -826,279 +1023,348 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 15, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 15, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Spectrum", - value: Number(3), - }, - EnumOption { - name: "Rolling", - value: Number(4), - }, - EnumOption { - name: "Separation", - value: Number(5), - }, - EnumOption { - name: "Hopping", - value: Number(6), - }, - EnumOption { - name: "PianoKeys", - value: Number(7), - }, - EnumOption { - name: "Fountain", - value: Number(8), - }, - EnumOption { - name: "DayAndNight", - value: Number(9), - }, - EnumOption { - name: "Sprouting", - value: Number(10), - }, - EnumOption { - name: "Shiny", - value: Number(11), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Rolling", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Separation", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "PianoKeys", + value: Number(7), + extras: {}, + }, + EnumOption { + name: "Fountain", + value: Number(8), + extras: {}, + }, + EnumOption { + name: "DayAndNight", + value: Number(9), + extras: {}, + }, + EnumOption { + name: "Sprouting", + value: Number(10), + extras: {}, + }, + EnumOption { + name: "Shiny", + value: Number(11), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -1111,277 +1377,346 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 15, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 15, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: None, + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: None, - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Spectrum", - value: Number(3), - }, - EnumOption { - name: "Rolling", - value: Number(4), - }, - EnumOption { - name: "Separation", - value: Number(5), - }, - EnumOption { - name: "Hopping", - value: Number(6), - }, - EnumOption { - name: "PianoKeys", - value: Number(7), - }, - EnumOption { - name: "Fountain", - value: Number(8), - }, - EnumOption { - name: "DayandNight", - value: Number(9), - }, - EnumOption { - name: "Sprouting", - value: Number(10), - }, - EnumOption { - name: "Shiny", - value: Number(11), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Rolling", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Separation", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "PianoKeys", + value: Number(7), + extras: {}, + }, + EnumOption { + name: "Fountain", + value: Number(8), + extras: {}, + }, + EnumOption { + name: "DayandNight", + value: Number(9), + extras: {}, + }, + EnumOption { + name: "Sprouting", + value: Number(10), + extras: {}, + }, + EnumOption { + name: "Shiny", + value: Number(11), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -1394,18 +1729,24 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -1418,185 +1759,233 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 15, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Dynamic", - value: Number(1), - }, - EnumOption { - name: "Calm", - value: Number(2), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Dynamic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Calm", + value: Number(2), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -1609,259 +1998,323 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Bounce", - value: Number(3), - }, - EnumOption { - name: "Hopping", - value: Number(4), - }, - EnumOption { - name: "Strike", - value: Number(5), - }, - EnumOption { - name: "Vibrate", - value: Number(6), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Bounce", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Strike", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Vibrate", + value: Number(6), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -1874,259 +2327,323 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Bounce", - value: Number(3), - }, - EnumOption { - name: "Hopping", - value: Number(4), - }, - EnumOption { - name: "Strike", - value: Number(5), - }, - EnumOption { - name: "Vibrate", - value: Number(6), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Bounce", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Strike", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Vibrate", + value: Number(6), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, @@ -2139,259 +2656,323 @@ GetDevicesResponse { DeviceCapability { kind: OnOff, instance: "powerSwitch", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Toggle, instance: "gradientToggle", - parameters: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), - }, - EnumOption { - name: "off", - value: Number(0), - }, - ], - }, + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: Range, instance: "brightness", - parameters: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 1, - max: 100, - precision: 1, + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedBrightness", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 100, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "brightness", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 100, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: SegmentColorSetting, instance: "segmentedColorRgb", - parameters: Struct { - fields: [ - StructField { - field_name: "segment", - field_type: Array { - size: Some( - ArraySize { - min: 1, - max: 8, - }, - ), - element_range: Some( - ElementRange { + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 8, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { min: 0, - max: 14, + max: 16777215, + precision: 1, }, - ), - element_type: Some( - "INTEGER", - ), - options: [], - }, - required: true, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: true, }, - required: true, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorRgb", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: ColorSetting, instance: "colorTemperatureK", - parameters: Integer { - unit: None, - range: IntegerRange { - min: 2000, - max: 9000, - precision: 1, + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, }, - }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "lightScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: MusicSetting, instance: "musicMode", - parameters: Struct { - fields: [ - StructField { - field_name: "musicMode", - field_type: Enum { - options: [ - EnumOption { - name: "Energic", - value: Number(1), - }, - EnumOption { - name: "Rhythm", - value: Number(2), - }, - EnumOption { - name: "Bounce", - value: Number(3), - }, - EnumOption { - name: "Hopping", - value: Number(4), - }, - EnumOption { - name: "Strike", - value: Number(5), - }, - EnumOption { - name: "Vibrate", - value: Number(6), - }, - ], - }, - required: true, - }, - StructField { - field_name: "sensitivity", - field_type: Integer { - unit: Some( - "unit.percent", - ), - range: IntegerRange { - min: 0, - max: 100, - precision: 1, - }, - }, - required: true, - }, - StructField { - field_name: "autoColor", - field_type: Enum { - options: [ - EnumOption { - name: "on", - value: Number(1), + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Bounce", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Strike", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Vibrate", + value: Number(6), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, }, - EnumOption { - name: "off", - value: Number(0), + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, }, - ], - }, - required: false, - }, - StructField { - field_name: "rgb", - field_type: Integer { - unit: None, - range: IntegerRange { - min: 0, - max: 16777215, - precision: 1, }, + default_value: None, + required: false, }, - required: false, - }, - ], - }, + ], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "diyScene", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, DeviceCapability { kind: DynamicScene, instance: "snapshot", - parameters: Enum { - options: [], - }, + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, }, ], }, diff --git a/src/__k9_snapshots__/platform_api/platform_api_test_list_devices_issue4.snap b/src/__k9_snapshots__/platform_api/platform_api_test_list_devices_issue4.snap new file mode 100644 index 0000000..532e24d --- /dev/null +++ b/src/__k9_snapshots__/platform_api/platform_api_test_list_devices_issue4.snap @@ -0,0 +1,2226 @@ +GetDevicesResponse { + code: 200, + message: "success", + data: [ + HttpDeviceInfo { + sku: "H7111", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Smart Floor Fan", + device_type: Other, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Toggle, + instance: "oscillationToggle", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: WorkMode, + instance: "workMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "workMode", + field_type: Enum { + options: [ + EnumOption { + name: "FanSpeed", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Custom", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Auto", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Sleep", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Nature", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "Storm", + value: Number(7), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "modeValue", + field_type: Enum { + options: [ + EnumOption { + name: "FanSpeed", + value: Null, + extras: { + "options": Array [ + Object { + "value": Number(1), + }, + Object { + "value": Number(2), + }, + Object { + "value": Number(3), + }, + Object { + "value": Number(4), + }, + Object { + "value": Number(5), + }, + Object { + "value": Number(6), + }, + Object { + "value": Number(7), + }, + Object { + "value": Number(8), + }, + ], + }, + }, + EnumOption { + name: "Custom", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Auto", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Sleep", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Nature", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Storm", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + ], + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + ], + }, + HttpDeviceInfo { + sku: "H7141", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Smart Humidifier", + device_type: Humidifer, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: WorkMode, + instance: "workMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "workMode", + field_type: Enum { + options: [ + EnumOption { + name: "Manual", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Custom", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Auto", + value: Number(3), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "modeValue", + field_type: Enum { + options: [ + EnumOption { + name: "Manual", + value: Null, + extras: { + "options": Array [ + Object { + "value": Number(1), + }, + Object { + "value": Number(2), + }, + Object { + "value": Number(3), + }, + Object { + "value": Number(4), + }, + Object { + "value": Number(5), + }, + Object { + "value": Number(6), + }, + Object { + "value": Number(7), + }, + Object { + "value": Number(8), + }, + ], + }, + }, + EnumOption { + name: "Custom", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Auto", + value: Null, + extras: { + "range": Object { + "max": Number(70), + "min": Number(40), + }, + }, + }, + ], + }, + default_value: None, + required: false, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Range, + instance: "humidity", + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 40, + max: 70, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Other, + instance: "lackWaterEvent", + parameters: None, + alarm_type: Some( + 51, + ), + event_state: Some( + Object { + "options": Array [ + Object { + "message": String("Lack of Water"), + "name": String("lack"), + "value": Number(1), + }, + ], + }, + ), + }, + ], + }, + HttpDeviceInfo { + sku: "H7131", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Smart Space Heater", + device_type: Heater, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Toggle, + instance: "oscillationToggle", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Toggle, + instance: "nightlightToggle", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Range, + instance: "brightness", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorRgb", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Mode, + instance: "nightlightScene", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "Flame", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rainbow", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Easy", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Sleep", + value: Number(5), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: TemperatureSetting, + instance: "targetTemperature", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "autoStop", + field_type: Enum { + options: [ + EnumOption { + name: "Auto Stop", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Maintain", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: Some( + Number(0), + ), + required: false, + }, + StructField { + field_name: "temperature", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 5, + max: 30, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + StructField { + field_name: "unit", + field_type: Enum { + options: [ + EnumOption { + name: "Celsius", + value: String("Celsius"), + extras: {}, + }, + EnumOption { + name: "Fahrenheit", + value: String("Fahrenheit"), + extras: {}, + }, + ], + }, + default_value: Some( + String("Celsius"), + ), + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Other, + instance: "sensorTemperature", + parameters: None, + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: WorkMode, + instance: "workMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "workMode", + field_type: Enum { + options: [ + EnumOption { + name: "gearMode", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Fan", + value: Number(9), + extras: {}, + }, + EnumOption { + name: "Auto", + value: Number(3), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "modeValue", + field_type: Enum { + options: [ + EnumOption { + name: "gearMode", + value: Null, + extras: { + "options": Array [ + Object { + "name": String("Low"), + "value": Number(1), + }, + Object { + "name": String("Medium"), + "value": Number(2), + }, + Object { + "name": String("High"), + "value": Number(3), + }, + ], + }, + }, + EnumOption { + name: "Fan", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Auto", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + ], + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + ], + }, + HttpDeviceInfo { + sku: "H7121", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Smart Air Purifier", + device_type: AirPurifier, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: WorkMode, + instance: "workMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "workMode", + field_type: Enum { + options: [ + EnumOption { + name: "High", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Medium", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Low", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Sleep", + value: Number(16), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "modeValue", + field_type: Enum { + options: [ + EnumOption { + name: "High", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Medium", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Low", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + EnumOption { + name: "Sleep", + value: Null, + extras: { + "defaultValue": Number(0), + }, + }, + ], + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Other, + instance: "filterLifeTime", + parameters: None, + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Other, + instance: "airQuality", + parameters: None, + alarm_type: None, + event_state: None, + }, + ], + }, + HttpDeviceInfo { + sku: "H6052", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Aura Table Lamp", + device_type: Light, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Toggle, + instance: "gradientToggle", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Range, + instance: "brightness", + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: SegmentColorSetting, + instance: "segmentedBrightness", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: SegmentColorSetting, + instance: "segmentedColorRgb", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorRgb", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorTemperatureK", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "lightScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: MusicSetting, + instance: "musicMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Spectrum", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Vibrate", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Energic", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(4), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: false, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "diyScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "snapshot", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + ], + }, + HttpDeviceInfo { + sku: "H6059", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Aura Mini", + device_type: Light, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Range, + instance: "brightness", + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: SegmentColorSetting, + instance: "segmentedBrightness", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorRgb", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorTemperatureK", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "lightScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: MusicSetting, + instance: "musicMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Magic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: false, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "diyScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "snapshot", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + ], + }, + HttpDeviceInfo { + sku: "H6057", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Night Light", + device_type: Light, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Toggle, + instance: "gradientToggle", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Range, + instance: "brightness", + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: SegmentColorSetting, + instance: "segmentedBrightness", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: SegmentColorSetting, + instance: "segmentedColorRgb", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorRgb", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorTemperatureK", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "lightScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: MusicSetting, + instance: "musicMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Dynamic", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Calm", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "LightWaves", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "ColorPainting", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(7), + extras: {}, + }, + EnumOption { + name: "Dandelion", + value: Number(8), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: false, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "diyScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "snapshot", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + ], + }, + HttpDeviceInfo { + sku: "H618A", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Alex's Light Strip", + device_type: Light, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Toggle, + instance: "gradientToggle", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Range, + instance: "brightness", + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: SegmentColorSetting, + instance: "segmentedBrightness", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "brightness", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: SegmentColorSetting, + instance: "segmentedColorRgb", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "segment", + field_type: Array { + size: Some( + ArraySize { + min: 1, + max: 15, + }, + ), + element_range: Some( + ElementRange { + min: 0, + max: 14, + }, + ), + element_type: Some( + "INTEGER", + ), + options: [], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorRgb", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorTemperatureK", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "lightScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: MusicSetting, + instance: "musicMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "Energic", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Rhythm", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "Rolling", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Separation", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "Hopping", + value: Number(6), + extras: {}, + }, + EnumOption { + name: "PianoKeys", + value: Number(7), + extras: {}, + }, + EnumOption { + name: "Fountain", + value: Number(8), + extras: {}, + }, + EnumOption { + name: "DayAndNight", + value: Number(9), + extras: {}, + }, + EnumOption { + name: "Sprouting", + value: Number(10), + extras: {}, + }, + EnumOption { + name: "Shiny", + value: Number(11), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: false, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "diyScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "snapshot", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + ], + }, + HttpDeviceInfo { + sku: "H70B1", + device: "AA:BB:CC:DD:EE:FF:00:11", + device_name: "Smart Curtain Lights", + device_type: Light, + capabilities: [ + DeviceCapability { + kind: OnOff, + instance: "powerSwitch", + parameters: Some( + Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: Range, + instance: "brightness", + parameters: Some( + Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 1, + max: 100, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorRgb", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: ColorSetting, + instance: "colorTemperatureK", + parameters: Some( + Integer { + unit: None, + range: IntegerRange { + min: 2000, + max: 9000, + precision: 1, + }, + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "lightScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: MusicSetting, + instance: "musicMode", + parameters: Some( + Struct { + fields: [ + StructField { + field_name: "musicMode", + field_type: Enum { + options: [ + EnumOption { + name: "MeteorShower", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "Crossing", + value: Number(2), + extras: {}, + }, + EnumOption { + name: "DreamColor", + value: Number(3), + extras: {}, + }, + EnumOption { + name: "FloatingMist", + value: Number(4), + extras: {}, + }, + EnumOption { + name: "Spectrum", + value: Number(5), + extras: {}, + }, + EnumOption { + name: "FallingSand", + value: Number(6), + extras: {}, + }, + ], + }, + default_value: None, + required: true, + }, + StructField { + field_name: "sensitivity", + field_type: Integer { + unit: Some( + "unit.percent", + ), + range: IntegerRange { + min: 0, + max: 100, + precision: 1, + }, + }, + default_value: None, + required: true, + }, + StructField { + field_name: "autoColor", + field_type: Enum { + options: [ + EnumOption { + name: "on", + value: Number(1), + extras: {}, + }, + EnumOption { + name: "off", + value: Number(0), + extras: {}, + }, + ], + }, + default_value: None, + required: false, + }, + StructField { + field_name: "rgb", + field_type: Integer { + unit: None, + range: IntegerRange { + min: 0, + max: 16777215, + precision: 1, + }, + }, + default_value: None, + required: false, + }, + ], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "diyScene", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + DeviceCapability { + kind: DynamicScene, + instance: "snapshot", + parameters: Some( + Enum { + options: [], + }, + ), + alarm_type: None, + event_state: None, + }, + ], + }, + ], +} \ No newline at end of file diff --git a/src/commands/http_control.rs b/src/commands/http_control.rs index 4b26743..b387226 100644 --- a/src/commands/http_control.rs +++ b/src/commands/http_control.rs @@ -121,10 +121,10 @@ impl HttpControlCommand { fn for_each_music_mode anyhow::Result>( mut apply: F, - parameters: &DeviceParameters, + parameters: &Option, ) -> anyhow::Result { match parameters { - DeviceParameters::Struct { fields } => { + Some(DeviceParameters::Struct { fields }) => { for f in fields { if f.field_name == "musicMode" { match &f.field_type { diff --git a/src/platform_api.rs b/src/platform_api.rs index 5785223..5433f34 100644 --- a/src/platform_api.rs +++ b/src/platform_api.rs @@ -4,6 +4,7 @@ use anyhow::Context; use reqwest::Method; use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; +use std::collections::HashMap; use std::time::Duration; // This file implements the Govee Platform API V1 as described at: @@ -222,7 +223,7 @@ impl GoveeApiClient { continue; } match &cap.parameters { - DeviceParameters::Enum { options } => { + Some(DeviceParameters::Enum { options }) => { for opt in options { result.push(opt.name.to_string()); } @@ -253,7 +254,7 @@ impl GoveeApiClient { continue; } match &cap.parameters { - DeviceParameters::Enum { options } => { + Some(DeviceParameters::Enum { options }) => { for opt in options { if scene.eq_ignore_ascii_case(&opt.name) { return self.control_device(&device, &cap, opt.value.clone()).await; @@ -292,10 +293,10 @@ impl GoveeApiClient { .capability_by_instance("brightness") .ok_or_else(|| anyhow::anyhow!("device has no brightness"))?; let value = match &cap.parameters { - DeviceParameters::Integer { + Some(DeviceParameters::Integer { range: IntegerRange { min, max, .. }, .. - } => (percent as u32).max(*min).min(*max), + }) => (percent as u32).max(*min).min(*max), _ => anyhow::bail!("unexpected parameter type for brightness"), }; self.control_device(&device, &cap, value).await @@ -310,10 +311,10 @@ impl GoveeApiClient { .capability_by_instance("colorTemperatureK") .ok_or_else(|| anyhow::anyhow!("device has no colorTemperatureK"))?; let value = match &cap.parameters { - DeviceParameters::Integer { + Some(DeviceParameters::Integer { range: IntegerRange { min, max, .. }, .. - } => (kelvin).max(*min).min(*max), + }) => (kelvin).max(*min).min(*max), _ => anyhow::bail!("unexpected parameter type for colorTemperatureK"), }; self.control_device(&device, &cap, value).await @@ -488,10 +489,10 @@ impl HttpDeviceInfo { let cap = self.capability_by_instance("colorTemperatureK")?; match cap.parameters { - DeviceParameters::Integer { + Some(DeviceParameters::Integer { range: IntegerRange { min, max, .. }, .. - } => Some((min, max)), + }) => Some((min, max)), _ => None, } } @@ -560,13 +561,17 @@ pub struct DeviceCapability { #[serde(rename = "type")] pub kind: DeviceCapabilityKind, pub instance: String, - pub parameters: DeviceParameters, + pub parameters: Option, + #[serde(rename = "alarmType")] + pub alarm_type: Option, + #[serde(rename = "eventState")] + pub event_state: Option, } impl DeviceCapability { pub fn enum_parameter_by_name(&self, name: &str) -> Option { match &self.parameters { - DeviceParameters::Enum { options } => options + Some(DeviceParameters::Enum { options }) => options .iter() .find(|e| e.name == name && e.value.is_i64()) .map(|e| e.value.as_i64().expect("i64") as u32), @@ -609,6 +614,9 @@ pub struct StructField { #[serde(flatten)] pub field_type: DeviceParameters, + #[serde(rename = "defaultValue")] + pub default_value: Option, + pub required: bool, } @@ -635,10 +643,12 @@ pub struct IntegerRange { } #[derive(Deserialize, Serialize, Debug, Clone)] -#[cfg_attr(debug_assertions, serde(deny_unknown_fields))] pub struct EnumOption { pub name: String, + #[serde(default)] pub value: JsonValue, + #[serde(flatten)] + pub extras: HashMap, } #[derive(Deserialize, Serialize, Debug, Clone)] @@ -647,6 +657,12 @@ pub struct ArrayOption { pub value: u32, } +pub fn from_json>(text: S) -> anyhow::Result { + let text = text.as_ref(); + serde_json_path_to_error::from_slice(text) + .map_err(|err| anyhow::anyhow!("{err}. Input: {}", String::from_utf8_lossy(text))) +} + pub async fn json_body( response: reqwest::Response, ) -> anyhow::Result { @@ -655,12 +671,7 @@ pub async fn json_body( .bytes() .await .with_context(|| format!("read {url} response body"))?; - serde_json::from_slice(&data).with_context(|| { - format!( - "parsing {url} response as json: {}", - String::from_utf8_lossy(&data) - ) - }) + from_json(&data).with_context(|| format!("parsing {url} response")) } pub async fn http_response_body( @@ -741,7 +752,7 @@ mod test { #[test] fn get_device_scenes() { - let resp: GetDeviceScenesResponse = serde_json::from_str(&SCENE_LIST).unwrap(); + let resp: GetDeviceScenesResponse = from_json(&SCENE_LIST).unwrap(); k9::assert_matches_snapshot!(format!("{resp:#?}")); } @@ -749,22 +760,29 @@ mod test { #[test] fn get_device_state() { - let resp: GetDeviceStateResponse = serde_json::from_str(&GET_DEVICE_STATE_EXAMPLE).unwrap(); + let resp: GetDeviceStateResponse = from_json(&GET_DEVICE_STATE_EXAMPLE).unwrap(); k9::assert_matches_snapshot!(format!("{resp:#?}")); } const LIST_DEVICES_EXAMPLE: &str = include_str!("../test-data/list_devices.json"); const LIST_DEVICES_EXAMPLE2: &str = include_str!("../test-data/list_devices_2.json"); + #[test] + fn list_devices_issue4() { + let resp: GetDevicesResponse = + from_json(&include_str!("../test-data/list_devices_issue4.json")).unwrap(); + k9::assert_matches_snapshot!(format!("{resp:#?}")); + } + #[test] fn list_devices_2() { - let resp: GetDevicesResponse = serde_json::from_str(&LIST_DEVICES_EXAMPLE2).unwrap(); + let resp: GetDevicesResponse = from_json(&LIST_DEVICES_EXAMPLE2).unwrap(); k9::assert_matches_snapshot!(format!("{resp:#?}")); } #[test] fn list_devices() { - let resp: GetDevicesResponse = serde_json::from_str(&LIST_DEVICES_EXAMPLE).unwrap(); + let resp: GetDevicesResponse = from_json(&LIST_DEVICES_EXAMPLE).unwrap(); k9::assert_matches_snapshot!(format!("{resp:#?}")); } } diff --git a/test-data/list_devices_issue4.json b/test-data/list_devices_issue4.json new file mode 100644 index 0000000..6c529bb --- /dev/null +++ b/test-data/list_devices_issue4.json @@ -0,0 +1,1682 @@ +{ + "code": 200, + "message": "success", + "data": [ + { + "sku": "H7111", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Smart Floor Fan", + "type": "devices.types.fan", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.toggle", + "instance": "oscillationToggle", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.work_mode", + "instance": "workMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "workMode", + "dataType": "ENUM", + "options": [ + { + "name": "FanSpeed", + "value": 1 + }, + { + "name": "Custom", + "value": 2 + }, + { + "name": "Auto", + "value": 3 + }, + { + "name": "Sleep", + "value": 5 + }, + { + "name": "Nature", + "value": 6 + }, + { + "name": "Storm", + "value": 7 + } + ], + "required": true + }, + { + "fieldName": "modeValue", + "dataType": "ENUM", + "options": [ + { + "name": "FanSpeed", + "options": [ + { + "value": 1 + }, + { + "value": 2 + }, + { + "value": 3 + }, + { + "value": 4 + }, + { + "value": 5 + }, + { + "value": 6 + }, + { + "value": 7 + }, + { + "value": 8 + } + ] + }, + { + "defaultValue": 0, + "name": "Custom" + }, + { + "defaultValue": 0, + "name": "Auto" + }, + { + "defaultValue": 0, + "name": "Sleep" + }, + { + "defaultValue": 0, + "name": "Nature" + }, + { + "defaultValue": 0, + "name": "Storm" + } + ], + "required": true + } + ] + } + } + ] + }, + { + "sku": "H7141", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Smart Humidifier", + "type": "devices.types.humidifier", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.work_mode", + "instance": "workMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "workMode", + "dataType": "ENUM", + "options": [ + { + "name": "Manual", + "value": 1 + }, + { + "name": "Custom", + "value": 2 + }, + { + "name": "Auto", + "value": 3 + } + ], + "required": true + }, + { + "fieldName": "modeValue", + "dataType": "ENUM", + "options": [ + { + "name": "Manual", + "options": [ + { + "value": 1 + }, + { + "value": 2 + }, + { + "value": 3 + }, + { + "value": 4 + }, + { + "value": 5 + }, + { + "value": 6 + }, + { + "value": 7 + }, + { + "value": 8 + } + ] + }, + { + "defaultValue": 0, + "name": "Custom" + }, + { + "name": "Auto", + "range": { + "min": 40, + "max": 70 + } + } + ], + "required": false + } + ] + } + }, + { + "type": "devices.capabilities.range", + "instance": "humidity", + "parameters": { + "unit": "unit.percent", + "dataType": "INTEGER", + "range": { + "min": 40, + "max": 70, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.event", + "instance": "lackWaterEvent", + "alarmType": 51, + "eventState": { + "options": [ + { + "name": "lack", + "value": 1, + "message": "Lack of Water" + } + ] + } + } + ] + }, + { + "sku": "H7131", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Smart Space Heater", + "type": "devices.types.heater", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.toggle", + "instance": "oscillationToggle", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.toggle", + "instance": "nightlightToggle", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.range", + "instance": "brightness", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 1, + "max": 100, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorRgb", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.mode", + "instance": "nightlightScene", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "Flame", + "value": 1 + }, + { + "name": "Rainbow", + "value": 2 + }, + { + "name": "Rhythm", + "value": 3 + }, + { + "name": "Easy", + "value": 4 + }, + { + "name": "Sleep", + "value": 5 + } + ] + } + }, + { + "type": "devices.capabilities.temperature_setting", + "instance": "targetTemperature", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "autoStop", + "defaultValue": 0, + "dataType": "ENUM", + "options": [ + { + "name": "Auto Stop", + "value": 1 + }, + { + "name": "Maintain", + "value": 0 + } + ], + "required": false + }, + { + "fieldName": "temperature", + "dataType": "INTEGER", + "range": { + "min": 5, + "max": 30, + "precision": 1 + }, + "required": true + }, + { + "fieldName": "unit", + "defaultValue": "Celsius", + "dataType": "ENUM", + "options": [ + { + "name": "Celsius", + "value": "Celsius" + }, + { + "name": "Fahrenheit", + "value": "Fahrenheit" + } + ], + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.property", + "instance": "sensorTemperature" + }, + { + "type": "devices.capabilities.work_mode", + "instance": "workMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "workMode", + "dataType": "ENUM", + "options": [ + { + "name": "gearMode", + "value": 1 + }, + { + "name": "Fan", + "value": 9 + }, + { + "name": "Auto", + "value": 3 + } + ], + "required": true + }, + { + "fieldName": "modeValue", + "dataType": "ENUM", + "options": [ + { + "name": "gearMode", + "options": [ + { + "name": "Low", + "value": 1 + }, + { + "name": "Medium", + "value": 2 + }, + { + "name": "High", + "value": 3 + } + ] + }, + { + "defaultValue": 0, + "name": "Fan" + }, + { + "defaultValue": 0, + "name": "Auto" + } + ], + "required": true + } + ] + } + } + ] + }, + { + "sku": "H7121", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Smart Air Purifier", + "type": "devices.types.air_purifier", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.work_mode", + "instance": "workMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "workMode", + "dataType": "ENUM", + "options": [ + { + "name": "High", + "value": 3 + }, + { + "name": "Medium", + "value": 2 + }, + { + "name": "Low", + "value": 1 + }, + { + "name": "Sleep", + "value": 16 + } + ], + "required": true + }, + { + "fieldName": "modeValue", + "dataType": "ENUM", + "options": [ + { + "defaultValue": 0, + "name": "High" + }, + { + "defaultValue": 0, + "name": "Medium" + }, + { + "defaultValue": 0, + "name": "Low" + }, + { + "defaultValue": 0, + "name": "Sleep" + } + ], + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.property", + "instance": "filterLifeTime" + }, + { + "type": "devices.capabilities.property", + "instance": "airQuality" + } + ] + }, + { + "sku": "H6052", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Aura Table Lamp", + "type": "devices.types.light", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.toggle", + "instance": "gradientToggle", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.range", + "instance": "brightness", + "parameters": { + "unit": "unit.percent", + "dataType": "INTEGER", + "range": { + "min": 1, + "max": 100, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.segment_color_setting", + "instance": "segmentedBrightness", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "segment", + "size": { + "min": 1, + "max": 15 + }, + "dataType": "Array", + "elementRange": { + "min": 0, + "max": 14 + }, + "elementType": "INTEGER", + "required": true + }, + { + "fieldName": "brightness", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.segment_color_setting", + "instance": "segmentedColorRgb", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "segment", + "size": { + "min": 1, + "max": 15 + }, + "dataType": "Array", + "elementRange": { + "min": 0, + "max": 14 + }, + "elementType": "INTEGER", + "required": true + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorRgb", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorTemperatureK", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 2000, + "max": 9000, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "lightScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.music_setting", + "instance": "musicMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "musicMode", + "dataType": "ENUM", + "options": [ + { + "name": "Spectrum", + "value": 1 + }, + { + "name": "Vibrate", + "value": 2 + }, + { + "name": "Energic", + "value": 3 + }, + { + "name": "Rhythm", + "value": 4 + } + ], + "required": true + }, + { + "unit": "unit.percent", + "fieldName": "sensitivity", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + }, + { + "fieldName": "autoColor", + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ], + "required": false + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": false + } + ] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "diyScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "snapshot", + "parameters": { + "dataType": "ENUM", + "options": [] + } + } + ] + }, + { + "sku": "H6059", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Aura Mini", + "type": "devices.types.light", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.range", + "instance": "brightness", + "parameters": { + "unit": "unit.percent", + "dataType": "INTEGER", + "range": { + "min": 1, + "max": 100, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.segment_color_setting", + "instance": "segmentedBrightness", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "segment", + "size": { + "min": 1, + "max": 15 + }, + "dataType": "Array", + "elementRange": { + "min": 0, + "max": 14 + }, + "elementType": "INTEGER", + "required": true + }, + { + "fieldName": "brightness", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorRgb", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorTemperatureK", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 2000, + "max": 9000, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "lightScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.music_setting", + "instance": "musicMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "musicMode", + "dataType": "ENUM", + "options": [ + { + "name": "Magic", + "value": 1 + }, + { + "name": "Rhythm", + "value": 2 + } + ], + "required": true + }, + { + "unit": "unit.percent", + "fieldName": "sensitivity", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + }, + { + "fieldName": "autoColor", + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ], + "required": false + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": false + } + ] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "diyScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "snapshot", + "parameters": { + "dataType": "ENUM", + "options": [] + } + } + ] + }, + { + "sku": "H6057", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Night Light", + "type": "devices.types.light", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.toggle", + "instance": "gradientToggle", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.range", + "instance": "brightness", + "parameters": { + "unit": "unit.percent", + "dataType": "INTEGER", + "range": { + "min": 1, + "max": 100, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.segment_color_setting", + "instance": "segmentedBrightness", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "segment", + "size": { + "min": 1, + "max": 15 + }, + "dataType": "Array", + "elementRange": { + "min": 0, + "max": 14 + }, + "elementType": "INTEGER", + "required": true + }, + { + "fieldName": "brightness", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.segment_color_setting", + "instance": "segmentedColorRgb", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "segment", + "size": { + "min": 1, + "max": 15 + }, + "dataType": "Array", + "elementRange": { + "min": 0, + "max": 14 + }, + "elementType": "INTEGER", + "required": true + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorRgb", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorTemperatureK", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 2000, + "max": 9000, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "lightScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.music_setting", + "instance": "musicMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "musicMode", + "dataType": "ENUM", + "options": [ + { + "name": "Energic", + "value": 1 + }, + { + "name": "Dynamic", + "value": 2 + }, + { + "name": "Calm", + "value": 3 + }, + { + "name": "Spectrum", + "value": 4 + }, + { + "name": "LightWaves", + "value": 5 + }, + { + "name": "ColorPainting", + "value": 6 + }, + { + "name": "Hopping", + "value": 7 + }, + { + "name": "Dandelion", + "value": 8 + } + ], + "required": true + }, + { + "unit": "unit.percent", + "fieldName": "sensitivity", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + }, + { + "fieldName": "autoColor", + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ], + "required": false + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": false + } + ] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "diyScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "snapshot", + "parameters": { + "dataType": "ENUM", + "options": [] + } + } + ] + }, + { + "sku": "H618A", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Alex's Light Strip", + "type": "devices.types.light", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.toggle", + "instance": "gradientToggle", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.range", + "instance": "brightness", + "parameters": { + "unit": "unit.percent", + "dataType": "INTEGER", + "range": { + "min": 1, + "max": 100, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.segment_color_setting", + "instance": "segmentedBrightness", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "segment", + "size": { + "min": 1, + "max": 15 + }, + "dataType": "Array", + "elementRange": { + "min": 0, + "max": 14 + }, + "elementType": "INTEGER", + "required": true + }, + { + "fieldName": "brightness", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.segment_color_setting", + "instance": "segmentedColorRgb", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "segment", + "size": { + "min": 1, + "max": 15 + }, + "dataType": "Array", + "elementRange": { + "min": 0, + "max": 14 + }, + "elementType": "INTEGER", + "required": true + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": true + } + ] + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorRgb", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorTemperatureK", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 2000, + "max": 9000, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "lightScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.music_setting", + "instance": "musicMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "musicMode", + "dataType": "ENUM", + "options": [ + { + "name": "Energic", + "value": 1 + }, + { + "name": "Rhythm", + "value": 2 + }, + { + "name": "Spectrum", + "value": 3 + }, + { + "name": "Rolling", + "value": 4 + }, + { + "name": "Separation", + "value": 5 + }, + { + "name": "Hopping", + "value": 6 + }, + { + "name": "PianoKeys", + "value": 7 + }, + { + "name": "Fountain", + "value": 8 + }, + { + "name": "DayAndNight", + "value": 9 + }, + { + "name": "Sprouting", + "value": 10 + }, + { + "name": "Shiny", + "value": 11 + } + ], + "required": true + }, + { + "unit": "unit.percent", + "fieldName": "sensitivity", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + }, + { + "fieldName": "autoColor", + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ], + "required": false + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": false + } + ] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "diyScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "snapshot", + "parameters": { + "dataType": "ENUM", + "options": [] + } + } + ] + }, + { + "sku": "H70B1", + "device": "AA:BB:CC:DD:EE:FF:00:11", + "deviceName": "Smart Curtain Lights", + "type": "devices.types.light", + "capabilities": [ + { + "type": "devices.capabilities.on_off", + "instance": "powerSwitch", + "parameters": { + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ] + } + }, + { + "type": "devices.capabilities.range", + "instance": "brightness", + "parameters": { + "unit": "unit.percent", + "dataType": "INTEGER", + "range": { + "min": 1, + "max": 100, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorRgb", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.color_setting", + "instance": "colorTemperatureK", + "parameters": { + "dataType": "INTEGER", + "range": { + "min": 2000, + "max": 9000, + "precision": 1 + } + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "lightScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.music_setting", + "instance": "musicMode", + "parameters": { + "dataType": "STRUCT", + "fields": [ + { + "fieldName": "musicMode", + "dataType": "ENUM", + "options": [ + { + "name": "MeteorShower", + "value": 1 + }, + { + "name": "Crossing", + "value": 2 + }, + { + "name": "DreamColor", + "value": 3 + }, + { + "name": "FloatingMist", + "value": 4 + }, + { + "name": "Spectrum", + "value": 5 + }, + { + "name": "FallingSand", + "value": 6 + } + ], + "required": true + }, + { + "unit": "unit.percent", + "fieldName": "sensitivity", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 100, + "precision": 1 + }, + "required": true + }, + { + "fieldName": "autoColor", + "dataType": "ENUM", + "options": [ + { + "name": "on", + "value": 1 + }, + { + "name": "off", + "value": 0 + } + ], + "required": false + }, + { + "fieldName": "rgb", + "dataType": "INTEGER", + "range": { + "min": 0, + "max": 16777215, + "precision": 1 + }, + "required": false + } + ] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "diyScene", + "parameters": { + "dataType": "ENUM", + "options": [] + } + }, + { + "type": "devices.capabilities.dynamic_scene", + "instance": "snapshot", + "parameters": { + "dataType": "ENUM", + "options": [] + } + } + ] + } + ] +}