From cc396b97368c93dd0452ceef74a8c27691370262 Mon Sep 17 00:00:00 2001 From: Jc2k Date: Sat, 14 Nov 2020 12:07:22 +0000 Subject: [PATCH] Add initial camera support to homekit_controller (#43100) --- .../components/homekit_controller/__init__.py | 12 + .../components/homekit_controller/camera.py | 50 + .../homekit_controller/connection.py | 20 +- .../components/homekit_controller/const.py | 1 + .../homekit_controller/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- .../specific_devices/test_anker_eufycam.py | 53 + .../homekit_controller/test_camera.py | 29 + .../homekit_controller/anker_eufycam.json | 2073 +++++++++++++++++ 10 files changed, 2240 insertions(+), 4 deletions(-) create mode 100644 homeassistant/components/homekit_controller/camera.py create mode 100644 tests/components/homekit_controller/specific_devices/test_anker_eufycam.py create mode 100644 tests/components/homekit_controller/test_camera.py create mode 100644 tests/fixtures/homekit_controller/anker_eufycam.json diff --git a/homeassistant/components/homekit_controller/__init__.py b/homeassistant/components/homekit_controller/__init__.py index b7139741be2..ef0fb531b1b 100644 --- a/homeassistant/components/homekit_controller/__init__.py +++ b/homeassistant/components/homekit_controller/__init__.py @@ -38,6 +38,8 @@ class HomeKitEntity(Entity): self._signals = [] + super().__init__() + @property def accessory(self) -> Accessory: """Return an Accessory model that this entity is attached to.""" @@ -171,6 +173,16 @@ class HomeKitEntity(Entity): raise NotImplementedError +class AccessoryEntity(HomeKitEntity): + """A HomeKit entity that is related to an entire accessory rather than a specific service or characteristic.""" + + @property + def unique_id(self) -> str: + """Return the ID of this device.""" + serial = self.accessory_info.value(CharacteristicsTypes.SERIAL_NUMBER) + return f"homekit-{serial}-aid:{self._aid}" + + async def async_setup_entry(hass, entry): """Set up a HomeKit connection on a config entry.""" conn = HKDevice(hass, entry, entry.data) diff --git a/homeassistant/components/homekit_controller/camera.py b/homeassistant/components/homekit_controller/camera.py new file mode 100644 index 00000000000..fc6a5bb4522 --- /dev/null +++ b/homeassistant/components/homekit_controller/camera.py @@ -0,0 +1,50 @@ +"""Support for Homekit cameras.""" +from aiohomekit.model.services import ServicesTypes + +from homeassistant.components.camera import Camera +from homeassistant.core import callback + +from . import KNOWN_DEVICES, AccessoryEntity + + +class HomeKitCamera(AccessoryEntity, Camera): + """Representation of a Homekit camera.""" + + # content_type = "image/jpeg" + + def get_characteristic_types(self): + """Define the homekit characteristics the entity is tracking.""" + return [] + + @property + def state(self): + """Return the current state of the camera.""" + return "idle" + + async def async_camera_image(self): + """Return a jpeg with the current camera snapshot.""" + return await self._accessory.pairing.image( + self._aid, + 640, + 480, + ) + + +async def async_setup_entry(hass, config_entry, async_add_entities): + """Set up Homekit sensors.""" + hkid = config_entry.data["AccessoryPairingID"] + conn = hass.data[KNOWN_DEVICES][hkid] + + @callback + def async_add_accessory(accessory): + stream_mgmt = accessory.services.first( + service_type=ServicesTypes.CAMERA_RTP_STREAM_MANAGEMENT + ) + if not stream_mgmt: + return + + info = {"aid": accessory.aid, "iid": stream_mgmt.iid} + async_add_entities([HomeKitCamera(conn, info)], True) + return True + + conn.add_accessory_factory(async_add_accessory) diff --git a/homeassistant/components/homekit_controller/connection.py b/homeassistant/components/homekit_controller/connection.py index ed2aaaa4656..9ba6ef98a02 100644 --- a/homeassistant/components/homekit_controller/connection.py +++ b/homeassistant/components/homekit_controller/connection.py @@ -76,6 +76,9 @@ class HKDevice: self.entity_map = Accessories() + # A list of callbacks that turn HK accessories into entities + self.accessory_factories = [] + # A list of callbacks that turn HK service metadata into entities self.listeners = [] @@ -289,14 +292,29 @@ class HKDevice: return True + def add_accessory_factory(self, add_entities_cb): + """Add a callback to run when discovering new entities for accessories.""" + self.accessory_factories.append(add_entities_cb) + self._add_new_entities_for_accessory([add_entities_cb]) + + def _add_new_entities_for_accessory(self, handlers): + for accessory in self.entity_map.accessories: + for handler in handlers: + if (accessory.aid, None) in self.entities: + continue + if handler(accessory): + self.entities.append((accessory.aid, None)) + break + def add_listener(self, add_entities_cb): - """Add a callback to run when discovering new entities.""" + """Add a callback to run when discovering new entities for services.""" self.listeners.append(add_entities_cb) self._add_new_entities([add_entities_cb]) def add_entities(self): """Process the entity map and create HA entities.""" self._add_new_entities(self.listeners) + self._add_new_entities_for_accessory(self.accessory_factories) def _add_new_entities(self, callbacks): for accessory in self.accessories: diff --git a/homeassistant/components/homekit_controller/const.py b/homeassistant/components/homekit_controller/const.py index b1e32417137..b3c55ba36a9 100644 --- a/homeassistant/components/homekit_controller/const.py +++ b/homeassistant/components/homekit_controller/const.py @@ -37,4 +37,5 @@ HOMEKIT_ACCESSORY_DISPATCH = { "occupancy": "binary_sensor", "television": "media_player", "valve": "switch", + "camera-rtp-stream-management": "camera", } diff --git a/homeassistant/components/homekit_controller/manifest.json b/homeassistant/components/homekit_controller/manifest.json index efe842bad0f..45c493ad864 100644 --- a/homeassistant/components/homekit_controller/manifest.json +++ b/homeassistant/components/homekit_controller/manifest.json @@ -4,7 +4,7 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/homekit_controller", "requirements": [ - "aiohomekit==0.2.54" + "aiohomekit==0.2.57" ], "zeroconf": [ "_hap._tcp.local." diff --git a/requirements_all.txt b/requirements_all.txt index 1b8b9ff4d4d..60ce66fe458 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -178,7 +178,7 @@ aioguardian==1.0.1 aioharmony==0.2.6 # homeassistant.components.homekit_controller -aiohomekit==0.2.54 +aiohomekit==0.2.57 # homeassistant.components.emulated_hue # homeassistant.components.http diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 610e0f4e337..fcd53e2be5e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -109,7 +109,7 @@ aioguardian==1.0.1 aioharmony==0.2.6 # homeassistant.components.homekit_controller -aiohomekit==0.2.54 +aiohomekit==0.2.57 # homeassistant.components.emulated_hue # homeassistant.components.http diff --git a/tests/components/homekit_controller/specific_devices/test_anker_eufycam.py b/tests/components/homekit_controller/specific_devices/test_anker_eufycam.py new file mode 100644 index 00000000000..45e0466ceea --- /dev/null +++ b/tests/components/homekit_controller/specific_devices/test_anker_eufycam.py @@ -0,0 +1,53 @@ +"""Test against characteristics captured from a eufycam.""" + +from tests.components.homekit_controller.common import ( + Helper, + setup_accessories_from_file, + setup_test_accessories, +) + + +async def test_eufycam_setup(hass): + """Test that a eufycam can be correctly setup in HA.""" + accessories = await setup_accessories_from_file(hass, "anker_eufycam.json") + config_entry, pairing = await setup_test_accessories(hass, accessories) + + entity_registry = await hass.helpers.entity_registry.async_get_registry() + + # Check that the camera is correctly found and set up + camera_id = "camera.eufycam2_0000" + camera = entity_registry.async_get(camera_id) + assert camera.unique_id == "homekit-A0000A000000000D-aid:4" + + camera_helper = Helper( + hass, + "camera.eufycam2_0000", + pairing, + accessories[0], + config_entry, + ) + + camera_state = await camera_helper.poll_and_get_state() + assert camera_state.attributes["friendly_name"] == "eufyCam2-0000" + assert camera_state.state == "idle" + assert camera_state.attributes["supported_features"] == 0 + + device_registry = await hass.helpers.device_registry.async_get_registry() + + device = device_registry.async_get(camera.device_id) + assert device.manufacturer == "Anker" + assert device.name == "eufyCam2-0000" + assert device.model == "T8113" + assert device.sw_version == "1.6.7" + + # These cameras are via a bridge, so via should be set + assert device.via_device_id is not None + + cameras_count = 0 + for state in hass.states.async_all(): + if state.entity_id.startswith("camera."): + cameras_count += 1 + + # There are multiple rtsp services, we only want to create 1 + # camera entity per accessory, not 1 camera per service. + assert cameras_count == 3 diff --git a/tests/components/homekit_controller/test_camera.py b/tests/components/homekit_controller/test_camera.py new file mode 100644 index 00000000000..ddb25fddffc --- /dev/null +++ b/tests/components/homekit_controller/test_camera.py @@ -0,0 +1,29 @@ +"""Basic checks for HomeKit cameras.""" +import base64 + +from aiohomekit.model.services import ServicesTypes +from aiohomekit.testing import FAKE_CAMERA_IMAGE + +from homeassistant.components import camera + +from tests.components.homekit_controller.common import setup_test_component + + +def create_camera(accessory): + """Define camera characteristics.""" + accessory.add_service(ServicesTypes.CAMERA_RTP_STREAM_MANAGEMENT) + + +async def test_read_state(hass, utcnow): + """Test reading the state of a HomeKit camera.""" + helper = await setup_test_component(hass, create_camera) + + state = await helper.poll_and_get_state() + assert state.state == "idle" + + +async def test_get_image(hass, utcnow): + """Test getting a JPEG from a camera.""" + helper = await setup_test_component(hass, create_camera) + image = await camera.async_get_image(hass, helper.entity_id) + assert image.content == base64.b64decode(FAKE_CAMERA_IMAGE) diff --git a/tests/fixtures/homekit_controller/anker_eufycam.json b/tests/fixtures/homekit_controller/anker_eufycam.json new file mode 100644 index 00000000000..b3ebfcf7c9f --- /dev/null +++ b/tests/fixtures/homekit_controller/anker_eufycam.json @@ -0,0 +1,2073 @@ +[ + { + "aid": 1, + "services": [ + { + "iid": 1, + "type": "0000003E-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 2, + "type": "00000014-0000-1000-8000-0026BB765291", + "format": "bool", + "perms": [ + "pw" + ] + }, + { + "iid": 3, + "type": "00000020-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Anker", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 4, + "type": "00000021-0000-1000-8000-0026BB765291", + "format": "string", + "value": "T8010", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 5, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "eufy HomeBase2-0AAA", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 6, + "type": "00000030-0000-1000-8000-0026BB765291", + "format": "string", + "value": "A0000A000000000A", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 7, + "type": "00000052-0000-1000-8000-0026BB765291", + "format": "string", + "value": "2.1.6", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 8, + "type": "00000053-0000-1000-8000-0026BB765291", + "format": "string", + "value": "2.0.0", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 9, + "type": "34AB8811-AC7F-4340-BAC3-FD6A85F9943B", + "format": "string", + "value": "3.0;17A93g", + "perms": [ + "pr", + "hd" + ], + "ev": false + } + ], + "stype": "accessory-information" + }, + { + "iid": 19, + "type": "80CF79D6-9D29-4268-83F7-58FA0244B7CE", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 20, + "type": "B6704D2D-682B-4CB5-9150-AF94EFD18C22", + "format": "string", + "perms": [ + "pw" + ], + "maxLen": 256 + }, + { + "iid": 21, + "type": "489F0737-E399-41C1-A38A-BC2C152DC88D", + "format": "string", + "value": "0|0", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 22, + "type": "DAC539C4-2E71-4C5F-97BE-47A11B41DE4A", + "format": "string", + "value": "0", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 23, + "type": "7BD15050-677E-446B-983F-CA276A96ECDF", + "format": "string", + "value": "0", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 24, + "type": "DBE912DF-223D-4038-8116-D0DFA1B6E3DF", + "format": "string", + "value": "T8010N2319490CEB", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "Unknown Service: 80CF79D6-9D29-4268-83F7-58FA0244B7CE" + }, + { + "iid": 16, + "type": "000000A2-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 18, + "type": "00000037-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.1.0", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "service" + } + ] + }, + { + "aid": 2, + "services": [ + { + "iid": 1, + "type": "0000003E-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 2, + "type": "00000014-0000-1000-8000-0026BB765291", + "format": "bool", + "perms": [ + "pw" + ] + }, + { + "iid": 3, + "type": "00000020-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Anker", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 4, + "type": "00000021-0000-1000-8000-0026BB765291", + "format": "string", + "value": "T8113", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 5, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "eufyCam2-000A", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 6, + "type": "00000030-0000-1000-8000-0026BB765291", + "format": "string", + "value": "A0000A000000000B", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 7, + "type": "00000052-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.6.7", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 8, + "type": "00000053-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.0.0", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "accessory-information" + }, + { + "iid": 48, + "type": "00000110-0000-1000-8000-0026BB765291", + "primary": true, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 50, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 51, + "type": "00000120-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQEA", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 52, + "type": "00000114-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AaoBAQACEQEBAQIBAAAAAgECAwEABAEAAwsBAoAHAgI4BAMBHgAAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAgAFAgLAAwMBHgAAAwsBAgAEAgIAAwMBHgAAAwsBAoACAgLgAQMBHgAAAwsBAuABAgJoAQMBHgAAAwsBAkABAgLwAAMBHg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 53, + "type": "00000115-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQ4BAQICCQEBAQIBAAMBAQIBAA==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 54, + "type": "00000116-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AgEAAAACAQEAAAIBAg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 55, + "type": "00000118-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + }, + { + "iid": 56, + "type": "00000117-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + } + ], + "stype": "camera-rtp-stream-management" + }, + { + "iid": 64, + "type": "00000110-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 66, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 67, + "type": "00000120-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQEA", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 68, + "type": "00000114-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AYwBAQACEQEBAQIBAAAAAgECAwEABAEAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAgAEAgIAAwMBHgAAAwsBAoACAgLgAQMBHgAAAwsBAuABAgJoAQMBHgAAAwsBAkABAgLwAAMBHg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 69, + "type": "00000115-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQ4BAQICCQEBAQIBAAMBAQIBAA==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 70, + "type": "00000116-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AgEAAAACAQEAAAIBAg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 71, + "type": "00000118-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + }, + { + "iid": 72, + "type": "00000117-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + } + ], + "stype": "camera-rtp-stream-management" + }, + { + "iid": 128, + "type": "204", + "primary": false, + "hidden": false, + "linked": [ + 112, + 160 + ], + "characteristics": [ + { + "iid": 130, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 131, + "type": "205", + "format": "tlv8", + "value": "AQQAAAAAAggBAAAAAAAAAAMLAQEAAgYBBKAPAAA=", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 132, + "type": "206", + "format": "tlv8", + "value": "AaQBAQACCwEBAQIBAAAAAgECAwsBAoAHAgI4BAMBHgAAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAoAHAgI4BAMBDwAAAwsBAgAFAgLQAgMBDwAAAwsBAoACAgJoAQMBDwAAAwsBAuABAgIOAQMBDwAAAwsBAkABAgK0AAMBDw==", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 133, + "type": "207", + "format": "tlv8", + "value": "AQ4BAQECCQEBAQIBAAMBAQ==", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 134, + "type": "209", + "format": "tlv8", + "value": "AR0BBAAAAAACCAEAAAAAAAAAAwsBAQACBgEEoA8AAAIkAQEAAhIBAQECAQIDBNAHAAAEBKAPAAADCwECgAcCAjgEAwEeAxQBAQECDwEBAQIBAAMBAQQEEAAAAA==", + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + }, + { + "iid": 135, + "type": "226", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + } + ], + "stype": "Unknown Service: 204" + }, + { + "iid": 112, + "type": "00000129-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 114, + "type": "00000130-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQMBAQA=", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 115, + "type": "00000131-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw", + "wr" + ], + "ev": false + }, + { + "iid": 116, + "type": "00000037-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.0", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "data-stream-transport-management" + }, + { + "iid": 144, + "type": "21A", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 146, + "type": "223", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 147, + "type": "225", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 148, + "type": "21B", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 149, + "type": "21C", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 150, + "type": "21D", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 152, + "type": "0000011B-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + } + ], + "stype": "Unknown Service: 21A" + }, + { + "iid": 80, + "type": "00000112-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 82, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Microphone", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 83, + "type": "0000011A-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 0, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + }, + { + "iid": 84, + "type": "00000119-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 100, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "unit": "percentage", + "minValue": 0, + "maxValue": 100, + "minStep": 1 + } + ], + "stype": "microphone" + }, + { + "iid": 160, + "type": "00000085-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 162, + "type": "00000022-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 0, + "perms": [ + "pr", + "ev" + ], + "ev": true + }, + { + "iid": 163, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Motion Sensor", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 164, + "type": "00000075-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 1, + "perms": [ + "pr", + "ev" + ], + "ev": false + } + ], + "stype": "motion" + }, + { + "iid": 101, + "type": "00000096-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 102, + "type": "00000068-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 38, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "unit": "percentage", + "minValue": 0, + "maxValue": 100, + "minStep": 1 + }, + { + "iid": 103, + "type": "0000008F-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "minValue": 0, + "maxValue": 2, + "minStep": 1 + }, + { + "iid": 104, + "type": "00000079-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + } + ], + "stype": "battery" + } + ] + }, + { + "aid": 3, + "services": [ + { + "iid": 1, + "type": "0000003E-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 2, + "type": "00000014-0000-1000-8000-0026BB765291", + "format": "bool", + "perms": [ + "pw" + ] + }, + { + "iid": 3, + "type": "00000020-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Anker", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 4, + "type": "00000021-0000-1000-8000-0026BB765291", + "format": "string", + "value": "T8113", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 5, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "eufyCam2-000A", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 6, + "type": "00000030-0000-1000-8000-0026BB765291", + "format": "string", + "value": "A0000A000000000C", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 7, + "type": "00000052-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.6.7", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 8, + "type": "00000053-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.0.0", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "accessory-information" + }, + { + "iid": 48, + "type": "00000110-0000-1000-8000-0026BB765291", + "primary": true, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 50, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 51, + "type": "00000120-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQEA", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 52, + "type": "00000114-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AaoBAQACEQEBAQIBAAAAAgECAwEABAEAAwsBAoAHAgI4BAMBHgAAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAgAFAgLAAwMBHgAAAwsBAgAEAgIAAwMBHgAAAwsBAoACAgLgAQMBHgAAAwsBAuABAgJoAQMBHgAAAwsBAkABAgLwAAMBHg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 53, + "type": "00000115-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQ4BAQICCQEBAQIBAAMBAQIBAA==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 54, + "type": "00000116-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AgEAAAACAQEAAAIBAg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 55, + "type": "00000118-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + }, + { + "iid": 56, + "type": "00000117-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + } + ], + "stype": "camera-rtp-stream-management" + }, + { + "iid": 64, + "type": "00000110-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 66, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 67, + "type": "00000120-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQEA", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 68, + "type": "00000114-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AYwBAQACEQEBAQIBAAAAAgECAwEABAEAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAgAEAgIAAwMBHgAAAwsBAoACAgLgAQMBHgAAAwsBAuABAgJoAQMBHgAAAwsBAkABAgLwAAMBHg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 69, + "type": "00000115-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQ4BAQICCQEBAQIBAAMBAQIBAA==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 70, + "type": "00000116-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AgEAAAACAQEAAAIBAg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 71, + "type": "00000118-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + }, + { + "iid": 72, + "type": "00000117-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + } + ], + "stype": "camera-rtp-stream-management" + }, + { + "iid": 128, + "type": "204", + "primary": false, + "hidden": false, + "linked": [ + 112, + 160 + ], + "characteristics": [ + { + "iid": 130, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 131, + "type": "205", + "format": "tlv8", + "value": "AQQAAAAAAggBAAAAAAAAAAMLAQEAAgYBBKAPAAA=", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 132, + "type": "206", + "format": "tlv8", + "value": "AaQBAQACCwEBAQIBAAAAAgECAwsBAoAHAgI4BAMBHgAAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAoAHAgI4BAMBDwAAAwsBAgAFAgLQAgMBDwAAAwsBAoACAgJoAQMBDwAAAwsBAuABAgIOAQMBDwAAAwsBAkABAgK0AAMBDw==", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 133, + "type": "207", + "format": "tlv8", + "value": "AQ4BAQECCQEBAQIBAAMBAQ==", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 134, + "type": "209", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + }, + { + "iid": 135, + "type": "226", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + } + ], + "stype": "Unknown Service: 204" + }, + { + "iid": 112, + "type": "00000129-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 114, + "type": "00000130-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQMBAQA=", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 115, + "type": "00000131-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw", + "wr" + ], + "ev": false + }, + { + "iid": 116, + "type": "00000037-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.0", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "data-stream-transport-management" + }, + { + "iid": 144, + "type": "21A", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 146, + "type": "223", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 147, + "type": "225", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 148, + "type": "21B", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 149, + "type": "21C", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 150, + "type": "21D", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 152, + "type": "0000011B-0000-1000-8000-0026BB765291", + "format": "bool", + "value": null, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + } + ], + "stype": "Unknown Service: 21A" + }, + { + "iid": 80, + "type": "00000112-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 82, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Microphone", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 83, + "type": "0000011A-0000-1000-8000-0026BB765291", + "format": "bool", + "value": null, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + }, + { + "iid": 84, + "type": "00000119-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": null, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "unit": "percentage", + "minValue": 0, + "maxValue": 100, + "minStep": 1 + } + ], + "stype": "microphone" + }, + { + "iid": 160, + "type": "00000085-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 162, + "type": "00000022-0000-1000-8000-0026BB765291", + "format": "bool", + "value": null, + "perms": [ + "pr", + "ev" + ], + "ev": true + }, + { + "iid": 163, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Motion Sensor", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 164, + "type": "00000075-0000-1000-8000-0026BB765291", + "format": "bool", + "value": null, + "perms": [ + "pr", + "ev" + ], + "ev": false + } + ], + "stype": "motion" + }, + { + "iid": 101, + "type": "00000096-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 102, + "type": "00000068-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": null, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "unit": "percentage", + "minValue": 0, + "maxValue": 100, + "minStep": 1 + }, + { + "iid": 103, + "type": "0000008F-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": null, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "minValue": 0, + "maxValue": 2, + "minStep": 1 + }, + { + "iid": 104, + "type": "00000079-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": null, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + } + ], + "stype": "battery" + } + ] + }, + { + "aid": 4, + "services": [ + { + "iid": 1, + "type": "0000003E-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 2, + "type": "00000014-0000-1000-8000-0026BB765291", + "format": "bool", + "perms": [ + "pw" + ] + }, + { + "iid": 3, + "type": "00000020-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Anker", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 4, + "type": "00000021-0000-1000-8000-0026BB765291", + "format": "string", + "value": "T8113", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 5, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "eufyCam2-0000", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 6, + "type": "00000030-0000-1000-8000-0026BB765291", + "format": "string", + "value": "A0000A000000000D", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 7, + "type": "00000052-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.6.7", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 8, + "type": "00000053-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.0.0", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "accessory-information" + }, + { + "iid": 48, + "type": "00000110-0000-1000-8000-0026BB765291", + "primary": true, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 50, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 51, + "type": "00000120-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQEA", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 52, + "type": "00000114-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AaoBAQACEQEBAQIBAAAAAgECAwEABAEAAwsBAoAHAgI4BAMBHgAAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAgAFAgLAAwMBHgAAAwsBAgAEAgIAAwMBHgAAAwsBAoACAgLgAQMBHgAAAwsBAuABAgJoAQMBHgAAAwsBAkABAgLwAAMBHg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 53, + "type": "00000115-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQ4BAQICCQEBAQIBAAMBAQIBAA==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 54, + "type": "00000116-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AgEAAAACAQEAAAIBAg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 55, + "type": "00000118-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + }, + { + "iid": 56, + "type": "00000117-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + } + ], + "stype": "camera-rtp-stream-management" + }, + { + "iid": 64, + "type": "00000110-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 66, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 67, + "type": "00000120-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQEA", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 68, + "type": "00000114-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AYwBAQACEQEBAQIBAAAAAgECAwEABAEAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAgAEAgIAAwMBHgAAAwsBAoACAgLgAQMBHgAAAwsBAuABAgJoAQMBHgAAAwsBAkABAgLwAAMBHg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 69, + "type": "00000115-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQ4BAQICCQEBAQIBAAMBAQIBAA==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 70, + "type": "00000116-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AgEAAAACAQEAAAIBAg==", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 71, + "type": "00000118-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + }, + { + "iid": 72, + "type": "00000117-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw" + ], + "ev": false + } + ], + "stype": "camera-rtp-stream-management" + }, + { + "iid": 128, + "type": "204", + "primary": false, + "hidden": false, + "linked": [ + 112, + 160 + ], + "characteristics": [ + { + "iid": 130, + "type": "000000B0-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 131, + "type": "205", + "format": "tlv8", + "value": "AQQAAAAAAggBAAAAAAAAAAMLAQEAAgYBBKAPAAA=", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 132, + "type": "206", + "format": "tlv8", + "value": "AaQBAQACCwEBAQIBAAAAAgECAwsBAoAHAgI4BAMBHgAAAwsBAgAFAgLQAgMBHgAAAwsBAoACAgJoAQMBHgAAAwsBAuABAgIOAQMBHgAAAwsBAkABAgK0AAMBHgAAAwsBAoAHAgI4BAMBDwAAAwsBAgAFAgLQAgMBDwAAAwsBAoACAgJoAQMBDwAAAwsBAuABAgIOAQMBDwAAAwsBAkABAgK0AAMBDw==", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 133, + "type": "207", + "format": "tlv8", + "value": "AQ4BAQECCQEBAQIBAAMBAQ==", + "perms": [ + "pr", + "ev" + ], + "ev": false + }, + { + "iid": 134, + "type": "209", + "format": "tlv8", + "value": "AR0BBAAAAAACCAEAAAAAAAAAAwsBAQACBgEEoA8AAAIkAQEAAhIBAQECAQIDBNAHAAAEBKAPAAADCwECgAcCAjgEAwEeAxQBAQECDwEBAQIBAAMBAQQEEAAAAA==", + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + }, + { + "iid": 135, + "type": "226", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev", + "tw" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + } + ], + "stype": "Unknown Service: 204" + }, + { + "iid": 112, + "type": "00000129-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 114, + "type": "00000130-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "AQMBAQA=", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 115, + "type": "00000131-0000-1000-8000-0026BB765291", + "format": "tlv8", + "value": "", + "perms": [ + "pr", + "pw", + "wr" + ], + "ev": false + }, + { + "iid": 116, + "type": "00000037-0000-1000-8000-0026BB765291", + "format": "string", + "value": "1.0", + "perms": [ + "pr" + ], + "ev": false + } + ], + "stype": "data-stream-transport-management" + }, + { + "iid": 144, + "type": "21A", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 146, + "type": "223", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 147, + "type": "225", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 148, + "type": "21B", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 149, + "type": "21C", + "format": "uint8", + "value": 1, + "perms": [ + "pr", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 150, + "type": "21D", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + }, + { + "iid": 152, + "type": "0000011B-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 1, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + } + ], + "stype": "Unknown Service: 21A" + }, + { + "iid": 80, + "type": "00000112-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 82, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Microphone", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 83, + "type": "0000011A-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 0, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false + }, + { + "iid": 84, + "type": "00000119-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 50, + "perms": [ + "pr", + "pw", + "ev" + ], + "ev": false, + "unit": "percentage", + "minValue": 0, + "maxValue": 100, + "minStep": 1 + } + ], + "stype": "microphone" + }, + { + "iid": 160, + "type": "00000085-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 162, + "type": "00000022-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 0, + "perms": [ + "pr", + "ev" + ], + "ev": true + }, + { + "iid": 163, + "type": "00000023-0000-1000-8000-0026BB765291", + "format": "string", + "value": "Motion Sensor", + "perms": [ + "pr" + ], + "ev": false + }, + { + "iid": 164, + "type": "00000075-0000-1000-8000-0026BB765291", + "format": "bool", + "value": 1, + "perms": [ + "pr", + "ev" + ], + "ev": false + } + ], + "stype": "motion" + }, + { + "iid": 101, + "type": "00000096-0000-1000-8000-0026BB765291", + "primary": false, + "hidden": false, + "linked": [], + "characteristics": [ + { + "iid": 102, + "type": "00000068-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 17, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "unit": "percentage", + "minValue": 0, + "maxValue": 100, + "minStep": 1 + }, + { + "iid": 103, + "type": "0000008F-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "minValue": 0, + "maxValue": 2, + "minStep": 1 + }, + { + "iid": 104, + "type": "00000079-0000-1000-8000-0026BB765291", + "format": "uint8", + "value": 0, + "perms": [ + "pr", + "ev" + ], + "ev": true, + "minValue": 0, + "maxValue": 1, + "minStep": 1 + } + ], + "stype": "battery" + } + ] + } +] \ No newline at end of file