Add more HomeKit device enumeration tests (#22194)

* Test that Aqara Gateway, Ecobee 3 and Lennox E30 is correctly enumerated

* Move json to fixtures directory

* Move IO to executor
This commit is contained in:
Jc2k 2019-03-30 10:21:11 +00:00 committed by Martin Hjelmare
parent 1a39fb4de7
commit 906f0113ad
10 changed files with 2352 additions and 9 deletions

View File

@ -1,5 +1,6 @@
"""Code to support homekit_controller tests.""" """Code to support homekit_controller tests."""
import json import json
import os
from datetime import timedelta from datetime import timedelta
from unittest import mock from unittest import mock
@ -13,7 +14,8 @@ from homeassistant.components.homekit_controller.const import (
DOMAIN, HOMEKIT_ACCESSORY_DISPATCH) DOMAIN, HOMEKIT_ACCESSORY_DISPATCH)
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from tests.common import async_fire_time_changed, fire_service_discovered from tests.common import (
async_fire_time_changed, fire_service_discovered, load_fixture)
class FakePairing: class FakePairing:
@ -149,10 +151,13 @@ class FakeService(AbstractService):
return char return char
def setup_accessories_from_file(path): async def setup_accessories_from_file(hass, path):
"""Load an collection of accessory defs from JSON data.""" """Load an collection of accessory defs from JSON data."""
with open(path, 'r') as accessories_data: accessories_fixture = await hass.async_add_executor_job(
accessories_json = json.load(accessories_data) load_fixture,
os.path.join('homekit_controller', path),
)
accessories_json = json.loads(accessories_fixture)
accessories = [] accessories = []

View File

@ -0,0 +1,41 @@
"""
Regression tests for Aqara Gateway V3.
https://github.com/home-assistant/home-assistant/issues/20957
"""
from homeassistant.components.light import SUPPORT_BRIGHTNESS, SUPPORT_COLOR
from tests.components.homekit_controller.common import (
setup_accessories_from_file, setup_test_accessories, Helper
)
async def test_aqara_gateway_setup(hass):
"""Test that a Aqara Gateway can be correctly setup in HA."""
accessories = await setup_accessories_from_file(
hass, 'aqara_gateway.json')
pairing = await setup_test_accessories(hass, accessories)
entity_registry = await hass.helpers.entity_registry.async_get_registry()
# Check that the light is correctly found and set up
alarm_id = "alarm_control_panel.aqara_hub_1563"
alarm = entity_registry.async_get(alarm_id)
assert alarm.unique_id == 'homekit-0000000123456789-66304'
alarm_helper = Helper(
hass, 'alarm_control_panel.aqara_hub_1563', pairing, accessories[0])
alarm_state = await alarm_helper.poll_and_get_state()
assert alarm_state.attributes['friendly_name'] == 'Aqara Hub-1563'
# Check that the light is correctly found and set up
light = entity_registry.async_get('light.aqara_hub_1563')
assert light.unique_id == 'homekit-0000000123456789-65792'
light_helper = Helper(
hass, 'light.aqara_hub_1563', pairing, accessories[0])
light_state = await light_helper.poll_and_get_state()
assert light_state.attributes['friendly_name'] == 'Aqara Hub-1563'
assert light_state.attributes['supported_features'] == (
SUPPORT_BRIGHTNESS | SUPPORT_COLOR
)

View File

@ -0,0 +1,43 @@
"""
Regression tests for Ecobee 3.
https://github.com/home-assistant/home-assistant/issues/15336
"""
from homeassistant.components.climate.const import (
SUPPORT_TARGET_TEMPERATURE, SUPPORT_OPERATION_MODE)
from tests.components.homekit_controller.common import (
setup_accessories_from_file, setup_test_accessories, Helper
)
async def test_ecobee3_setup(hass):
"""Test that a Ecbobee 3 can be correctly setup in HA."""
accessories = await setup_accessories_from_file(hass, 'ecobee3.json')
pairing = await setup_test_accessories(hass, accessories)
entity_registry = await hass.helpers.entity_registry.async_get_registry()
climate = entity_registry.async_get('climate.homew')
assert climate.unique_id == 'homekit-123456789012-16'
climate_helper = Helper(hass, 'climate.homew', pairing, accessories[0])
climate_state = await climate_helper.poll_and_get_state()
assert climate_state.attributes['friendly_name'] == 'HomeW'
assert climate_state.attributes['supported_features'] == (
SUPPORT_TARGET_TEMPERATURE | SUPPORT_OPERATION_MODE
)
occ1 = entity_registry.async_get('binary_sensor.kitchen')
assert occ1.unique_id == 'homekit-AB1C-56'
occ1_helper = Helper(
hass, 'binary_sensor.kitchen', pairing, accessories[0])
occ1_state = await occ1_helper.poll_and_get_state()
assert occ1_state.attributes['friendly_name'] == 'Kitchen'
occ2 = entity_registry.async_get('binary_sensor.porch')
assert occ2.unique_id == 'homekit-AB2C-56'
occ3 = entity_registry.async_get('binary_sensor.basement')
assert occ3.unique_id == 'homekit-AB3C-56'

View File

@ -1,6 +1,5 @@
"""Make sure that existing Koogeek LS1 support isn't broken.""" """Make sure that existing Koogeek LS1 support isn't broken."""
import os
from datetime import timedelta from datetime import timedelta
from unittest import mock from unittest import mock
@ -19,8 +18,7 @@ LIGHT_ON = ('lightbulb', 'on')
async def test_koogeek_ls1_setup(hass): async def test_koogeek_ls1_setup(hass):
"""Test that a Koogeek LS1 can be correctly setup in HA.""" """Test that a Koogeek LS1 can be correctly setup in HA."""
profile_path = os.path.join(os.path.dirname(__file__), 'koogeek_ls1.json') accessories = await setup_accessories_from_file(hass, 'koogeek_ls1.json')
accessories = setup_accessories_from_file(profile_path)
pairing = await setup_test_accessories(hass, accessories) pairing = await setup_test_accessories(hass, accessories)
entity_registry = await hass.helpers.entity_registry.async_get_registry() entity_registry = await hass.helpers.entity_registry.async_get_registry()
@ -50,8 +48,7 @@ async def test_recover_from_failure(hass, utcnow, failure_cls):
See https://github.com/home-assistant/home-assistant/issues/18949 See https://github.com/home-assistant/home-assistant/issues/18949
""" """
profile_path = os.path.join(os.path.dirname(__file__), 'koogeek_ls1.json') accessories = await setup_accessories_from_file(hass, 'koogeek_ls1.json')
accessories = setup_accessories_from_file(profile_path)
pairing = await setup_test_accessories(hass, accessories) pairing = await setup_test_accessories(hass, accessories)
helper = Helper(hass, 'light.koogeek_ls1_20833f', pairing, accessories[0]) helper = Helper(hass, 'light.koogeek_ls1_20833f', pairing, accessories[0])

View File

@ -0,0 +1,29 @@
"""
Regression tests for Aqara Gateway V3.
https://github.com/home-assistant/home-assistant/issues/20885
"""
from homeassistant.components.climate.const import (
SUPPORT_TARGET_TEMPERATURE, SUPPORT_OPERATION_MODE)
from tests.components.homekit_controller.common import (
setup_accessories_from_file, setup_test_accessories, Helper
)
async def test_lennox_e30_setup(hass):
"""Test that a Lennox E30 can be correctly setup in HA."""
accessories = await setup_accessories_from_file(hass, 'lennox_e30.json')
pairing = await setup_test_accessories(hass, accessories)
entity_registry = await hass.helpers.entity_registry.async_get_registry()
climate = entity_registry.async_get('climate.lennox')
assert climate.unique_id == 'homekit-XXXXXXXX-100'
climate_helper = Helper(hass, 'climate.lennox', pairing, accessories[0])
climate_state = await climate_helper.poll_and_get_state()
assert climate_state.attributes['friendly_name'] == 'Lennox'
assert climate_state.attributes['supported_features'] == (
SUPPORT_TARGET_TEMPERATURE | SUPPORT_OPERATION_MODE
)

View File

@ -0,0 +1,488 @@
[
{
"services": [
{
"iid": 1,
"characteristics": [
{
"value": "Aqara",
"description": "Manufacturer",
"type": "20",
"iid": 3,
"perms": [
"pr"
],
"format": "string"
},
{
"value": "ZHWA11LM",
"description": "Model",
"type": "21",
"iid": 4,
"perms": [
"pr"
],
"format": "string"
},
{
"value": "Aqara Hub-1563",
"description": "Name",
"type": "23",
"iid": 5,
"perms": [
"pr"
],
"format": "string"
},
{
"value": "0000000123456789",
"description": "Serial Number",
"type": "30",
"iid": 6,
"perms": [
"pr"
],
"format": "string"
},
{
"description": "Identify",
"iid": 7,
"perms": [
"pw"
],
"type": "14",
"format": "bool"
},
{
"value": "1.4.7",
"description": "Firmware Revision",
"type": "52",
"iid": 8,
"perms": [
"pr"
],
"format": "string"
}
],
"type": "3e"
},
{
"iid": 60,
"characteristics": [
{
"value": "1.1.0",
"description": "Protocol Version",
"type": "37",
"iid": 62,
"perms": [
"pr"
],
"format": "string"
}
],
"type": "a2"
},
{
"hidden": true,
"iid": 65536,
"characteristics": [
{
"value": false,
"description": "New Accessory Permission",
"type": "b1c09e4c-e202-4827-b343-b0f32f727cff",
"iid": 65538,
"perms": [
"pr",
"pw",
"ev",
"hd"
],
"format": "bool"
},
{
"value": "()",
"description": "Accessory Joined",
"type": "2cb22739-1e4c-4798-a712-bc2faf51afc3",
"maxLen": 256,
"iid": 65539,
"perms": [
"pr",
"ev",
"hd"
],
"format": "string"
},
{
"value": " ",
"description": "Remove Accessory",
"type": "75d19fa9-218b-4943-427e-341e5d1c60cc",
"iid": 65540,
"perms": [
"pr",
"pw",
"ev",
"hd"
],
"format": "string"
},
{
"maxValue": 100,
"value": 40,
"minValue": 0,
"description": "Gateway Volume",
"type": "ee56b186-b0d3-528e-8c79-c21fc9bcf437",
"unit": "percentage",
"iid": 65541,
"minStep": 1,
"perms": [
"pr",
"pw"
],
"format": "int"
},
{
"value": "Chinese",
"description": "Language",
"type": "4cf1436a-755c-1277-bdb8-30be29eb8620",
"iid": 65542,
"perms": [
"pr",
"pw"
],
"format": "string"
},
{
"value": "2019-02-12 06:45:07+10",
"description": "Date and Time",
"type": "4cb28907-66df-4d9c-924c-9971abf30edc",
"iid": 65543,
"perms": [
"pr",
"pw"
],
"format": "string"
},
{
"value": " ",
"description": "Identify Accessory",
"type": "e1c20b22-e3a7-4b12-8ba3-c16e778648a7",
"iid": 65544,
"perms": [
"pr",
"ev",
"hd"
],
"format": "string"
},
{
"value": "aiot-coap.aqara.cn",
"description": "Country Domain",
"type": "25d889cb-7135-4a21-b5b4-c1ffd6d2dd5c",
"iid": 65545,
"perms": [
"pr",
"pw",
"hd"
],
"format": "string"
},
{
"value": -1,
"description": "Firmware Update Status",
"type": "7d943f6a-e052-4e96-a124-d17bf00e32cb",
"iid": 65546,
"perms": [
"pr",
"ev",
"hd"
],
"format": "int"
},
{
"description": "Firmware Update Data",
"iid": 65547,
"perms": [
"pw",
"hd"
],
"type": "7f51dc43-dc68-4237-bae8-d705e61139f5",
"format": "data"
},
{
"description": "Firmware Update URL",
"type": "a45efd52-0db5-4c1a-1227-513fbcd8185f",
"maxLen": 256,
"iid": 65548,
"perms": [
"pw",
"hd"
],
"format": "string"
},
{
"description": "Firmware Update Checksum",
"iid": 65549,
"perms": [
"pw",
"hd"
],
"type": "40f0124a-579d-40e4-245e-0ef6740ea64b",
"format": "string"
}
],
"type": "9715bf53-ab63-4449-8dc7-2485d617390a"
},
{
"iid": 65792,
"characteristics": [
{
"value": "Lightbulb-1563",
"description": "Name",
"type": "23",
"iid": 65794,
"perms": [
"pr"
],
"format": "string"
},
{
"value": false,
"description": "On",
"type": "25",
"iid": 65795,
"perms": [
"pr",
"pw",
"ev"
],
"format": "bool"
},
{
"maxValue": 360,
"value": 0,
"minValue": 0,
"description": "Hue",
"type": "13",
"unit": "arcdegrees",
"iid": 65796,
"minStep": 1,
"perms": [
"pr",
"pw",
"ev"
],
"format": "float"
},
{
"maxValue": 100,
"value": 100,
"minValue": 0,
"description": "Saturation",
"type": "2f",
"unit": "percentage",
"iid": 65797,
"minStep": 1,
"perms": [
"pr",
"pw",
"ev"
],
"format": "float"
},
{
"maxValue": 100,
"value": 0,
"minValue": 0,
"description": "Brightness",
"type": "8",
"unit": "percentage",
"iid": 65798,
"minStep": 1,
"perms": [
"pr",
"pw",
"ev"
],
"format": "int"
},
{
"value": "",
"description": "Timers",
"type": "232aa6bd-6ce2-4d7f-b7cf-52305f0d2bcf",
"iid": 65799,
"perms": [
"pr",
"pw",
"hd"
],
"format": "tlv8"
}
],
"type": "43"
},
{
"iid": 66048,
"characteristics": [
{
"value": "MIIO Service",
"description": "Name",
"type": "23",
"iid": 66050,
"perms": [
"pr"
],
"format": "string"
},
{
"value": false,
"description": "miio provisioned",
"type": "6ef066c1-08f8-46de-9121-b89b77e459e7",
"iid": 66051,
"perms": [
"pr",
"hd"
],
"format": "bool"
},
{
"description": "miio bindkey",
"iid": 66052,
"perms": [
"pw",
"hd"
],
"type": "6ef066c2-08f8-46de-9121-b89b77e459e7",
"format": "string"
},
{
"value": "152601563",
"description": "miio did",
"type": "6ef066c5-08f8-46de-9121-b89b77e459e7",
"iid": 66053,
"perms": [
"pr",
"hd"
],
"format": "string"
},
{
"value": "lumi.gateway.aqhm01",
"description": "miio model",
"type": "6ef066c4-08f8-46de-9121-b89b77e459e7",
"iid": 66054,
"perms": [
"pr",
"hd"
],
"format": "string"
},
{
"value": "ch",
"description": "miio country domain",
"type": "6ef066c3-08f8-46de-9121-b89b77e459e7",
"iid": 66055,
"perms": [
"pr",
"pw",
"hd"
],
"format": "string"
},
{
"value": "country code",
"description": "miio country code",
"type": "6ef066d1-08f8-46de-9121-b89b77e459e7",
"iid": 66056,
"perms": [
"pr",
"pw",
"hd"
],
"format": "string"
},
{
"value": "app",
"description": "miio config type",
"type": "6ef066d3-08f8-46de-9121-b89b77e459e7",
"iid": 66057,
"perms": [
"pr",
"pw",
"hd"
],
"format": "string"
},
{
"value": 28800,
"description": "miio gmt offset",
"type": "6ef066d2-08f8-46de-9121-b89b77e459e7",
"unit": "seconds",
"iid": 66058,
"perms": [
"pr",
"pw",
"hd"
],
"format": "int"
}
],
"type": "6ef066c0-08f8-46de-9121-b89b77e459e7"
},
{
"iid": 66304,
"characteristics": [
{
"value": "Security System",
"description": "Name",
"type": "23",
"iid": 66306,
"perms": [
"pr"
],
"format": "string"
},
{
"maxValue": 4,
"value": 3,
"minValue": 0,
"description": "Security System Current State",
"type": "66",
"valid-values": [
1,
3,
4
],
"iid": 66307,
"minStep": 1,
"perms": [
"pr",
"ev"
],
"format": "uint8"
},
{
"maxValue": 3,
"value": 3,
"minValue": 0,
"description": "Security System Target State",
"type": "67",
"valid-values": [
1,
3
],
"iid": 66308,
"minStep": 1,
"perms": [
"pr",
"pw",
"ev"
],
"format": "uint8"
}
],
"type": "7e"
}
],
"aid": 1
}
]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,508 @@
[
{
"aid": 1,
"services": [
{
"type": "3E",
"characteristics": [
{
"value": "HomeW",
"perms": [
"pr"
],
"type": "23",
"format": "string",
"iid": 2
},
{
"value": "ecobee Inc.",
"perms": [
"pr"
],
"type": "20",
"format": "string",
"iid": 3
},
{
"value": "123456789012",
"perms": [
"pr"
],
"type": "30",
"format": "string",
"iid": 4
},
{
"value": "ecobee3",
"perms": [
"pr"
],
"type": "21",
"format": "string",
"iid": 5
},
{
"perms": [
"pw"
],
"type": "14",
"format": "bool",
"iid": 6
},
{
"value": "4.2.394",
"perms": [
"pr"
],
"type": "52",
"format": "string",
"iid": 8
},
{
"value": 0,
"perms": [
"pr",
"ev"
],
"type": "A6",
"format": "uint32",
"iid": 9
}
],
"iid": 1
},
{
"type": "A2",
"characteristics": [
{
"value": "1.1.0",
"perms": [
"pr"
],
"maxLen": 64,
"type": "37",
"format": "string",
"iid": 31
}
],
"iid": 30
},
{
"primary": true,
"type": "4A",
"characteristics": [
{
"value": 1,
"maxValue": 2,
"minStep": 1,
"perms": [
"pr",
"ev"
],
"type": "F",
"minValue": 0,
"format": "uint8",
"iid": 17
},
{
"value": 1,
"maxValue": 3,
"minStep": 1,
"perms": [
"pr",
"pw",
"ev"
],
"type": "33",
"minValue": 0,
"format": "uint8",
"iid": 18
},
{
"value": 21.8,
"maxValue": 100,
"minStep": 0.1,
"perms": [
"pr",
"ev"
],
"unit": "celsius",
"type": "11",
"minValue": 0,
"format": "float",
"iid": 19
},
{
"value": 22.2,
"maxValue": 33.3,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "35",
"minValue": 7.2,
"format": "float",
"iid": 20
},
{
"value": 1,
"maxValue": 1,
"minStep": 1,
"perms": [
"pr",
"pw",
"ev"
],
"type": "36",
"minValue": 0,
"format": "uint8",
"iid": 21
},
{
"value": 24.4,
"maxValue": 33.3,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "D",
"minValue": 18.3,
"format": "float",
"iid": 22
},
{
"value": 22.2,
"maxValue": 26.1,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "12",
"minValue": 7.2,
"format": "float",
"iid": 23
},
{
"value": 34,
"maxValue": 100,
"minStep": 1,
"perms": [
"pr",
"ev"
],
"unit": "percentage",
"type": "10",
"minValue": 0,
"format": "float",
"iid": 24
},
{
"value": 36,
"maxValue": 50,
"minStep": 1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "percentage",
"type": "34",
"minValue": 20,
"format": "float",
"iid": 25
},
{
"value": "HomeW",
"perms": [
"pr"
],
"type": "23",
"format": "string",
"iid": 27
},
{
"value": 0,
"perms": [
"pr",
"ev"
],
"type": "B7DDB9A3-54BB-4572-91D2-F1F5B0510F8C",
"format": "uint8",
"iid": 33
},
{
"value": 22.2,
"maxValue": 26.1,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "E4489BBC-5227-4569-93E5-B345E3E5508F",
"minValue": 7.2,
"format": "float",
"iid": 34
},
{
"value": 24.4,
"maxValue": 33.3,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "7D381BAA-20F9-40E5-9BE9-AEB92D4BECEF",
"minValue": 18.3,
"format": "float",
"iid": 35
},
{
"value": 17.8,
"maxValue": 26.1,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "73AAB542-892A-4439-879A-D2A883724B69",
"minValue": 7.2,
"format": "float",
"iid": 36
},
{
"value": 27.8,
"maxValue": 33.3,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "5DA985F0-898A-4850-B987-B76C6C78D670",
"minValue": 18.3,
"format": "float",
"iid": 37
},
{
"value": 18.9,
"maxValue": 26.1,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "05B97374-6DC0-439B-A0FA-CA33F612D425",
"minValue": 7.2,
"format": "float",
"iid": 38
},
{
"value": 26.7,
"maxValue": 33.3,
"minStep": 0.1,
"perms": [
"pr",
"pw",
"ev"
],
"unit": "celsius",
"type": "A251F6E7-AC46-4190-9C5D-3D06277BDF9F",
"minValue": 18.3,
"format": "float",
"iid": 39
},
{
"minValue": 0,
"maxValue": 3,
"minStep": 1,
"perms": [
"pw"
],
"type": "1B300BC2-CFFC-47FF-89F9-BD6CCF5F2853",
"format": "uint8",
"iid": 40
},
{
"value": "2014-01-03T00:00:00-05:00",
"perms": [
"pr",
"pw",
"ev"
],
"type": "1621F556-1367-443C-AF19-82AF018E99DE",
"format": "string",
"iid": 41
},
{
"perms": [
"pw"
],
"type": "FA128DE6-9D7D-49A4-B6D8-4E4E234DEE38",
"format": "bool",
"iid": 48
},
{
"value": 1,
"perms": [
"pr",
"ev"
],
"type": "4A6AE4F6-036C-495D-87CC-B3702B437741",
"format": "uint8",
"iid": 49
},
{
"value": 0,
"perms": [
"pr",
"ev"
],
"type": "DB7BF261-7042-4194-8BD1-3AA22830AEDD",
"format": "uint8",
"iid": 50
},
{
"value": false,
"perms": [
"pr",
"ev"
],
"type": "41935E3E-B54D-42E9-B8B9-D33C6319F0AF",
"format": "bool",
"iid": 51
},
{
"minValue": 0,
"maxValue": 100,
"perms": [
"pr",
"pw",
"ev"
],
"type": "C35DA3C0-E004-40E3-B153-46655CDD9214",
"value": 0,
"format": "uint8",
"iid": 52
},
{
"value": 100,
"perms": [
"pr",
"ev"
],
"type": "48F62AEC-4171-4B4A-8F0E-1EEB6708B3FB",
"format": "uint8",
"iid": 53
},
{
"value": "The Hive is humming along. You have no pending alerts or reminders.",
"perms": [
"pr",
"ev"
],
"iid": 54,
"type": "1B1515F2-CC45-409F-991F-C480987F92C3",
"format": "string",
"maxLen": 256
}
],
"iid": 16
},
{
"type": "85",
"characteristics": [
{
"value": "HomeW",
"perms": [
"pr"
],
"type": "23",
"format": "string",
"iid": 28
},
{
"value": false,
"perms": [
"pr",
"ev"
],
"type": "22",
"format": "bool",
"iid": 66
},
{
"minValue": -1,
"maxValue": 86400,
"perms": [
"pr",
"ev"
],
"type": "BFE61C70-4A40-11E6-BDF4-0800200C9A66",
"value": 2980,
"format": "int",
"iid": 67
}
],
"iid": 56
},
{
"type": "86",
"characteristics": [
{
"value": "HomeW",
"perms": [
"pr"
],
"type": "23",
"format": "string",
"iid": 29
},
{
"minValue": 0,
"maxValue": 1,
"minStep": 1,
"perms": [
"pr",
"ev"
],
"type": "71",
"value": 1,
"format": "uint8",
"iid": 65
},
{
"minValue": -1,
"maxValue": 86400,
"perms": [
"pr",
"ev"
],
"type": "A8f798E0-4A40-11E6-BDF4-0800200C9A66",
"value": 2980,
"format": "int",
"iid": 68
}
],
"iid": 57
}
]
}
]

View File

@ -0,0 +1,196 @@
[
{
"aid": 1,
"services": [
{
"characteristics": [
{
"format": "bool",
"iid": 2,
"perms": [
"pw"
],
"type": "14"
},
{
"format": "string",
"iid": 3,
"perms": [
"pr"
],
"type": "20",
"value": "Lennox"
},
{
"format": "string",
"iid": 4,
"perms": [
"pr"
],
"type": "21",
"value": "E30 2B"
},
{
"format": "string",
"iid": 5,
"perms": [
"pr"
],
"type": "23",
"value": "Lennox"
},
{
"format": "string",
"iid": 6,
"perms": [
"pr"
],
"type": "30",
"value": "XXXXXXXX"
},
{
"format": "string",
"iid": 7,
"perms": [
"pr"
],
"type": "52",
"value": "3.40.XX"
},
{
"format": "string",
"iid": 8,
"perms": [
"pr"
],
"type": "53",
"value": "3.0.XX"
}
],
"iid": 1,
"type": "3E"
},
{
"characteristics": [
{
"format": "uint8",
"iid": 101,
"maxValue": 2,
"minStep": 1,
"minValue": 0,
"perms": [
"pr",
"ev"
],
"type": "F",
"value": 1
},
{
"format": "uint8",
"iid": 102,
"maxValue": 3,
"minStep": 1,
"minValue": 0,
"perms": [
"pr",
"pw",
"ev"
],
"type": "33",
"value": 3
},
{
"format": "float",
"iid": 103,
"maxValue": 100,
"minStep": 0.1,
"minValue": 0,
"perms": [
"pr",
"ev"
],
"type": "11",
"unit": "celsius",
"value": 20.5
},
{
"format": "float",
"iid": 104,
"maxValue": 32,
"minStep": 0.5,
"minValue": 4.5,
"perms": [
"pr",
"pw",
"ev"
],
"type": "35",
"unit": "celsius",
"value": 21
},
{
"format": "uint8",
"iid": 105,
"maxValue": 1,
"minStep": 1,
"minValue": 0,
"perms": [
"pr",
"pw",
"ev"
],
"type": "36",
"value": 0
},
{
"format": "float",
"iid": 106,
"maxValue": 37,
"minStep": 0.5,
"minValue": 16,
"perms": [
"pr",
"pw",
"ev"
],
"type": "D",
"unit": "celsius",
"value": 29.5
},
{
"format": "float",
"iid": 107,
"maxValue": 100,
"minStep": 1,
"minValue": 0,
"perms": [
"pr",
"ev"
],
"type": "10",
"unit": "percentage",
"value": 34
},
{
"format": "float",
"iid": 108,
"maxValue": 32,
"minStep": 0.5,
"minValue": 4.5,
"perms": [
"pr",
"pw",
"ev"
],
"type": "12",
"unit": "celsius",
"value": 21
}
],
"iid": 100,
"primary": true,
"type": "4A"
}
]
}
]