本节利用三星Smartthings Classic物联网平台的web service smartapp,实现了一个Alexa智能家居skill的例子,由此来了解Alexa是如何控制其他云的智能家居设备的。

三星Smartthings平台是如何运行第三方云来控制其设备的

三星Smartthings Classic支持开发者自己编写SmartApp来控制智能家居设备。参考官网中Web Service SmartApps的教程就可以写一个允许使用Web API来远程控制该平台设备的SmartApp。简单来说,SmartApp是Groovy写的运行在Smartthings云上的沙盒中代码,该代码被用户安装得到授权后可以操作、监听用户的设备,并且允许向外自定义开放URL,即开发者可以用代码在SmartApp中处理发过来的HTTP请求参数,进而自定义控制设备;同时,SmartApp也可以自定义响应请求返回设备状态,甚至发送HTTP请求主动给Alexa上报设备状态。

那么,三星如何验证发来的消息呢?答案是使用Oauth。Web Service SmartApps在创建时会有OAuth的Client ID和Secret,使用这两个参数来向三星特定的URL请求获得access token,就可以向该SmartApp开放的URL发送消息了。在OAuth的时候,会让用户选择允许该token访问哪些设备资源。Smartthings还允许创建虚拟设备,所以测试起来非常方便,过多不赘述,详见官网。

Alexa中Skill是如何向其注册设备、控制设备的

亚马逊给出了一个Python的Smart home skill例子,并且有详细的说明,其中用到的AWS服务也都有免费额度的,不用担心扣钱。

  1. Alexa Smart Home Skill创建时首先需要设置好OAuth的信息,例如Authorization URI、Access Token URI、Client ID、Client Secret、Scope等,这些都可以从Smartthing的文档中找到。Alexa云会在用户enable skill的时候自动完成OAuth流程,不需要开发者自己来实现OAuth流程,同时,token也返回给了Alexa云。Skill只有在接到用户intent的时候,才会收到由Alexa云发来的对应的access token。

  2. 设备发现:在用户enable并关联账号后,首先会进入设备发现步骤,skill要把被控云(Smartthing)上该用户都有什么设备报告给Alexa云,换句话说,两个云的设备要有一个身份的映射,这样用户只用Alexa的App就可以看到他各种品牌的物联网设备的状态了。Alexa在设备发现时会发送Discover命令给Skill,并携带token。Skill这时候拿着token去SmartApp开放的URL去查询都有哪些设备,然后根据得到的内容回复如下内容给Alexa,关键的有这么几个:

    • endpointId:设备的唯一标识号。应该在该用户的skill中唯一,类似于设备ID。
    • friendlyName:用户在Alexa App中看到的设备的名字。测试发现Alexa App中有一个BUG,friendlyName若重名,在Alexa App中显示面板中后发现的设备会覆盖掉之前同名的设备,用户没有方法分辨。因此,恶意的skill就有机会伪造用户之前的已发现的设备的状态,但是也称不上一个安全漏洞。
    • manufacturerName、description:Alexa App中看到的设备详细信息,可以随意填写,随意伪造。导致恶意Skill可以在Alexa中随便号称该设备就是Smartthing生产的,结合伪造的friendlyName,使用户完全无法分辨真实skill上报的设备是否被恶意顶替了。
    • displayCategories:说明设备的类型,必须是Alexa预定义的类型之一。
    • capabilities:设备支持的能力,如开关,亮度,以及该能力是否可被主动询问获得,等等。这也是Alexa预定义好的。
  3. 控制与消息上报

    在Echo收到用户的语音命令后(Smart home语音命令不能被定制),Alexa会发送特定的命令(directive),命令中携带了要操作的设备的唯一 标识endpoint以及用户在被控云的access token,skill程序只要向被控云特定的URL接口发送指令即可。

    SmartApp也可以在获得了用户的亚马逊token后,向特定的event结点主动报告更新设备的状态。

{
"directive": {
"header": {
"namespace": "Alexa.Discovery",
"name": "Discover",
"payloadVersion": "3",
"messageId": "1bd5d003-31b9-476f-ad03-71d471922820"
},
"payload": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
}
}
}
}
{
"event": {
"header": {
"correlationToken": "12345692749237492",
"messageId": "1bd5d003-31b9-476f-ad03-71d471922820",
"name": "Discover.Response",
"namespace": "Alexa.Discovery",
"payloadVersion": "3"
},
"payload": {
"endpoints": [
{
"endpointId": "demo_id",
"manufacturerName": "Smart Device Company",
"friendlyName": "Bedroom Outlet",
"description": "Smart Device Switch",
"displayCategories": ["SWITCH"],
"cookie": {
"key1": "arbitrary key/value pairs for skill to reference this endpoint.",
"key2": "There can be multiple entries",
"key3": "but they should only be used for reference purposes.",
"key4": "This is not a suitable place to maintain current endpoint state."
},
"capabilities": [
{
"type": "AlexaInterface",
"interface": "Alexa",
"version": "3"
},
{
"interface": "Alexa.PowerController",
"version": "3",
"type": "AlexaInterface",
"properties": {
"supported": [
{
"name": "powerState"
}
],
"retrievable": true
}
}
]
}
]
}
}
}

关于设备身份映射的解释

虽然恶意skill有可能在Alexa App中顶替到其他skill创建的设备,但是用户在Web控制页面和设置routine时能够看到是两个不同的设备。通过查看web页面的网络流量,发现Alexa在真正标识设备时加入了skill的id作为前缀(base64编码)来防止恶意skill之间冲突上报设备信息,Alexa中表示设备信息的数据结构见附录(从浏览器调试中获得)。

另外还有一个小问题是用户语音UI如何准确的翻译到要控制哪个设备,如有相似或同名,似乎Alexa会额外询问到底要选择控制哪一个,这点没有深入测试。


附录代码

Smartapp

/**
* My web smartapp
*
* Copyright 2019 Ascii0x03
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
* for the specific language governing permissions and limitations under the License.
*
*/
definition(
name: " My web smartapp",
namespace: "J_unique_Namespace",
author: "Ascii0x03",
description: "web smartapp for alexa",
category: "My Apps",
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png",
iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png") preferences {
section ("Allow external service to control these things1...") {
input "switches", "capability.switch", multiple: true, required: true
}
}
mappings {
path("/switches") {
action: [
GET: "listSwitches"
]
}
path("/switches/:command") {
action: [
PUT: "updateSwitches"
]
}
path("/switches/:deviceid/:command") {
action: [
PUT: "updateASwitch"
]
}
path("/amazontoken/:accesstoken/:refreshtoken") {
action: [GET: "getAmzToken"]
}
} def installed() {
log.debug "Installed with settings: ${settings}"
initialize()
} def updated() {
log.debug "Updated with settings: ${settings}" //unsubscribe()
initialize()
} def initialize() {
// TODO: subscribe to attributes, devices, locations, etc.
subscribe(switches, "switch", eventDetectedHandler)
//subscribe(switch2, "switch.on", eventDetectedHandler)
//subscribe(switch1, "switch.off", eventDetectedHandler)
//subscribe(switch2, "switch.off", eventDetectedHandler)
} // returns a list like
// [[name: "kitchen lamp", value: "off"], [name: "bathroom", value: "on"]]
def listSwitches() {
def resp = []
//def resp = [value:switch1.currentValue("switch")]
switches.each {
resp << [name: it.displayName, value: it.currentValue("switch")]
}
return resp
} void updateSwitches() {
// use the built-in request object to get the command parameter
def command = params.command // all switches have the command
// execute the command on all switches
// (note we can do this on the array - the command will be invoked on every element
switch(command) {
case "ON":
switches.on()
report_state_to_amazon("ON", "switch1")
break
case "OFF":
switches.off()
report_state_to_amazon("OFF", "switch1")
break
default:
httpError(400, "$command is not a valid command for all switches specified")
}
}
void updateASwitch() {
def command = params.command
def deviceid = params.deviceid
switches.each {
if(it.displayName == deviceid) {
switch(command) {
case "ON":
it.on()
report_state_to_amazon("ON", deviceid)
break
case "OFF":
it.off()
report_state_to_amazon("OFF", deviceid)
break
default:
httpError(400, "$command is not a valid command for $deviceid specified")
}
}
}
}
def getAmzToken() {
def accesstoken = params.accesstoken
def refreshtoken = params.refreshtoken
log.debug "accesstoken: $accesstoken"
state.amzaccesstoken = accesstoken
state.amzrefreshtoken = refreshtoken
} def report_state_to_amazon(state_value, endpoint_id) {
pause(3000)
def amz_url = "https://api.amazonalexa.com/v3/events"
def sensor_value = "DETECTED"
if( state_value == "OFF"){
sensor_value = "NOT_DETECTED"
}
def body = """
{
"context": {
"properties": [
{
"namespace": "Alexa.BrightnessController",
"name": "brightness",
"value": 85,
"timeOfSample": "2017-02-03T16:20:50.52Z",
"uncertaintyInMilliseconds": 60000
}
]
},
"event": {
"header": {
"messageId": "c50bbb73-1ee8-44f8-af9b-19a0a2195474",
"namespace": "Alexa",
"name": "ChangeReport",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type":"BearerToken",
"token":"$state.amzaccesstoken"
},
"endpointId" : "$endpoint_id"
},
"payload": {
"change": {
"cause": {
"type": "PHYSICAL_INTERACTION"
},
"properties": [
{
"namespace": "Alexa.PowerController",
"name": "powerState",
"value": "$state_value",
"timeOfSample": "2019-04-16T16:20:50.52Z",
"uncertaintyInMilliseconds": 0
},
{
"namespace": "Alexa.ContactSensor",
"name": "detectionState",
"value": "$sensor_value",
"timeOfSample": "2019-04-16T16:20:50.52Z",
"uncertaintyInMilliseconds": 0
}
]
}
}
}
}
"""
def params = [
uri: amz_url,
headers: ["Authorization":"Bearer " + state.amzaccesstoken],
contentType:"application/json",
body:body
]
log.debug state.amzaccesstoken
// try {
httpPost(params) { resp ->
//log.debug "response data: ${resp.statusCode}"
//log.debug "response contentType: ${resp.contentType}"
}
// } catch (e) {
// log.debug "something went wrong sending http to Amazon: $e"
// }
}
// TODO: implement event handlers
def eventDetectedHandler(evt) {
log.debug "DetectedHandler called: $evt"
//log.debug evt.getDevice() // get the value of this event, e.g., "on" or "off"
//log.debug "The value of this event is ${evt.value}"
if (evt.value == "on") {
report_state_to_amazon("ON", evt.getDevice());
} else {
report_state_to_amazon("OFF", evt.getDevice());
} // get the Date this event happened at
//log.debug "This event happened at ${evt.date}" // did the value of this event change from its previous state?
//log.debug "The value of this event is different from its previous value: ${evt.isStateChange()}"
}

Alexa Skill Lambda代码(只贴了lambda_function,其他与git中一致)

# -*- coding: utf-8 -*-

# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Amazon Software License (the "License"). You may not use this file except in
# compliance with the License. A copy of the License is located at
#
# http://aws.amazon.com/asl/
#
# or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific
# language governing permissions and limitations under the License.
from botocore.vendored import requests
import boto3
import json
from alexa.skills.smarthome import AlexaResponse dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('table_smart_home_skill1')
def lambda_handler(request, context): # Dump the request for logging - check the CloudWatch logs
print('lambda_handler request -----')
print(json.dumps(request)) if context is not None:
print('lambda_handler context -----')
print(context) # Validate we have an Alexa directive
if 'directive' not in request:
aer = AlexaResponse(
name='ErrorResponse',
payload={'type': 'INVALID_DIRECTIVE',
'message': 'Missing key: directive, Is the request a valid Alexa Directive?'})
return send_response(aer.get()) # Check the payload version
payload_version = request['directive']['header']['payloadVersion']
if payload_version != '3':
aer = AlexaResponse(
name='ErrorResponse',
payload={'type': 'INTERNAL_ERROR',
'message': 'This skill only supports Smart Home API version 3'})
return send_response(aer.get()) # Crack open the request and see what is being requested
name = request['directive']['header']['name']
namespace = request['directive']['header']['namespace'] # Handle the incoming request from Alexa based on the namespace if namespace == 'Alexa.Authorization':
if name == 'AcceptGrant':
# Note: This sample accepts any grant request
# In your implementation you would use the code and token to get and store access tokens
grant_code = request['directive']['payload']['grant']['code']
grantee_token = request['directive']['payload']['grantee']['token']
###Send the amazon grant_code
data = {"grant_type":"authorization_code",
"code":grant_code,
"client_id":"amzn1.application-oa2-client.XXX",
"client_secret":"XXX"}
post_data = ""
for key in data:
post_data = post_data + key + '=' + data[key] + '&' headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}
r = requests.post('https://api.amazon.com/auth/o2/token', data = post_data, headers = headers)
#print(r.status_code)
if(r.status_code == 200):
print(r.json())
resp = r.json()
access_token = resp['access_token']
refresh_token = resp['refresh_token'] ###TODO:Send amazon access_token to SmartThings
smartthings_uri = smartthings_discover_endpoint(grantee_token)
headers = {'Authorization': 'Bearer ' + grantee_token}
r = requests.get(smartthings_uri + '/amazontoken' + '/' + access_token + '/' + refresh_token, headers = headers)
#print("JJJ:SmartThings sent amazon token")
#print(r.status_code) table.put_item(
Item={
'ItemId': grantee_token,
'amazon_access_token': access_token,
'refresh_token': refresh_token,
}
) else:
print("JJ:Get access_token Bug!")
return aar = AlexaResponse(namespace='Alexa.Authorization', name='AcceptGrant.Response')
return send_response(aar.get()) if namespace == 'Alexa.Discovery':
if name == 'Discover':
adr = AlexaResponse(namespace='Alexa.Discovery', name='Discover.Response')
capability_alexa = adr.create_payload_endpoint_capability()
#capability_sensor = adr.create_payload_endpoint_capability()
capability_alexa_powercontroller = adr.create_payload_endpoint_capability(
interface='Alexa.PowerController',
supported=[{'name': 'powerState'}],
proactively_reported = True,
retrievable = True)
capability_ContactSensor = adr.create_payload_endpoint_capability(
type='AlexaInterface',
interface = 'Alexa.ContactSensor',
supported=[{'name':'detectionState'}],
proactively_reported = True,
retrievable = True
) adr.add_payload_endpoint(
friendly_name='J_smart_sensor_switch',
endpoint_id='switch1',
description='SmartThings Switch1',
display_categories=['SWITCH'],
manufacturer_name='SmartThings_J',
capabilities=[capability_alexa, capability_alexa_powercontroller, capability_ContactSensor]
)
adr.add_payload_endpoint(
friendly_name='J_smart_sensor_switch2',
endpoint_id='switch2',
description='SmartThings Switch2',
display_categories=['SWITCH'],
manufacturer_name='SmartThings_J',
capabilities=[capability_alexa, capability_alexa_powercontroller, capability_ContactSensor]
) return send_response(adr.get()) if namespace == 'Alexa.PowerController':
# Note: This sample always returns a success response for either a request to TurnOff or TurnOn
endpoint_id = request['directive']['endpoint']['endpointId']
##TODO: lookup smartthings according to id and find status power_state_value = 'OFF' if name == 'TurnOff' else 'ON'
correlation_token = request['directive']['header']['correlationToken']
token = request['directive']['endpoint']['scope']['token']
# Check for an error when setting the state
smartthing_endpoint = smartthings_discover_endpoint(token)
state_set = smartthings_control_device(smartthing_endpoint, token, endpoint_id, power_state_value)
if not state_set:
return AlexaResponse(
name='ErrorResponse',
payload={'type': 'ENDPOINT_UNREACHABLE', 'message': 'Unable to reach endpoint database.'}).get() apcr = AlexaResponse(correlation_token=correlation_token, token=token, endpoint_id=endpoint_id)
apcr.add_context_property(namespace='Alexa.PowerController', name='powerState', value=power_state_value)
if power_state_value == "ON":
apcr.add_context_property(namespace='Alexa.ContactSensor', name='detectionState', value='DETECTED')
else:
apcr.add_context_property(namespace='Alexa.ContactSensor', name='detectionState', value='NOT_DETECTED') return send_response(apcr.get()) # if namespace == 'Alexa.LockController':
# Note: This sample always returns a success response for either a request to TurnOff or TurnOn
endpoint_id = request['directive']['endpoint']['endpointId']
state_value = 'LOCKED' if name == 'Lock' else 'UNLOCKED'
correlation_token = request['directive']['header']['correlationToken'] # Check for an error when setting the state
state_set = set_device_state(endpoint_id=endpoint_id, state='lockState', value=state_value)
if not state_set:
return AlexaResponse(
name='ErrorResponse',
payload={'type': 'ENDPOINT_UNREACHABLE', 'message': 'Unable to reach endpoint database.'}).get() apcr = AlexaResponse(correlation_token=correlation_token)
apcr.add_context_property(namespace='Alexa.LockController', name='lockState', value=state_value) return send_response(apcr.get()) if namespace == 'Alexa':
if name == 'ReportState':
endpoint_id = request['directive']['endpoint']['endpointId']
token = request['directive']['endpoint']['scope']['token']
smartthing_endpoint = smartthings_discover_endpoint(token)
power_state_value = smartthings_get_device_state(smartthing_endpoint, token, endpoint_id)
if power_state_value == 'ON':
sensor_state_value = 'DETECTED'
else:
sensor_state_value = 'NOT_DETECTED'
##TODO: retrive status of devices
correlation_token = request['directive']['header']['correlationToken']
apcr = AlexaResponse(correlation_token=correlation_token,token=token, endpoint_id=endpoint_id,name='StateReport')
apcr.add_context_property(namespace='Alexa.ContactSensor', name='detectionState', value=sensor_state_value)
apcr.add_context_property(namespace='Alexa.PowerController', name='powerState', value=power_state_value)
return send_response(apcr.get()) def send_response(response):
# TODO Validate the response
print('lambda_handler response -----')
print(json.dumps(response))
return response def set_device_state(endpoint_id, state, value):
smartthings_discover_endpoint()
return True def smartthings_get_device_state(smartthing_endpoint, token, endpoint_id):
headers = {'Authorization': 'Bearer '+ token}
#print(smartthing_endpoint + '/' + endpoint_id)
r = requests.get(smartthing_endpoint + '/' + 'switches', headers=headers)
#print(r.json())
if (r.status_code == 200):
for i in r.json():
if i['name'] == endpoint_id:
if i['value'] == 'on':
return 'ON'
else:
return 'OFF'
else:
print("JJJ: get device state BUG!")
print(r.status_code) def smartthings_control_device(smartthing_endpoint, token, endpoint_id, cmd):
headers = {'Authorization': 'Bearer '+ token}
response = requests.put(smartthing_endpoint + '/switches/' + endpoint_id + '/' + cmd, headers=headers)
print("JJJ: Control device response: " + str(response.status_code))
return True def smartthings_discover_endpoint(token):
headers = {'Authorization': 'Bearer ' + token}
r = requests.get("https://graph.api.smartthings.com/api/smartapps/endpoints", headers=headers)
resp = r.json()
#print(resp)
for i in resp:
url = i['uri']
return url

Alexa中设备、场景的数据结构

{
   "networkDetail":"{"   locationDetails":{
      "locationDetails":{
         "Default_Location":{
            "locationId":"Default_Location",
            "amazonBridgeDetails":{
               "amazonBridgeDetails":{
                  "LambdaBridge_SKILL/eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjE3NTdjNjlmLTFhYzktNGZlYi05NWI3LWFkNTI4OTk1ZTNiNSIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==":{
                     "amazonBridgeIdentifier":{
                        "amazonBridgeDSN":"SKILL/eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjE3NTdjNjlmLTFhYzktNGZlYi05NWI3LWFkNTI4OTk1ZTNiNSIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==",
                        "amazonBridgeType":"LambdaBridge",
                        "lambdaBridge":true,
                        "amazonBridgeSource":"SKILL"
                     },
                     "applianceDetails":{
                        "applianceDetails":{
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjE3NTdjNjlmLTFhYzktNGZlYi05NWI3LWFkNTI4OTk1ZTNiNSIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==_fake_end1":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjE3NTdjNjlmLTFhYzktNGZlYi05NWI3LWFkNTI4OTk1ZTNiNSIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==_fake_end1",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjE3NTdjNjlmLTFhYzktNGZlYi05NWI3LWFkNTI4OTk1ZTNiNSIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ=="
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"Fake SmartThings Switch",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"smartthings1",
                              "friendlyNameModifiedAt":1554150257260,
                              "capabilitiesModifiedAt":1554150257260,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"6aa7c6ce-723f-4f0b-aca3-a467fa8f89cf",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1554150257260,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{                                  }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"powerState"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":false,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.PowerController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SWITCH"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjE3NTdjNjlmLTFhYzktNGZlYi05NWI3LWFkNTI4OTk1ZTNiNSIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ=="
                              }
                           }
                        }
                     }
                  },
                  "LambdaBridge_SKILL/eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjI3MDZhOGNmLWUzYWItNGRjNi04ZTNkLWEwYjlkZWYxOWQ1NyIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==":{
                     "amazonBridgeIdentifier":{
                        "amazonBridgeDSN":"SKILL/eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjI3MDZhOGNmLWUzYWItNGRjNi04ZTNkLWEwYjlkZWYxOWQ1NyIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==",
                        "amazonBridgeType":"LambdaBridge",
                        "lambdaBridge":true,
                        "amazonBridgeSource":"SKILL"
                     },
                     "applianceDetails":{
                        "applianceDetails":{
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjI3MDZhOGNmLWUzYWItNGRjNi04ZTNkLWEwYjlkZWYxOWQ1NyIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==_fake_end1":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjI3MDZhOGNmLWUzYWItNGRjNi04ZTNkLWEwYjlkZWYxOWQ1NyIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ==_fake_end1",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjI3MDZhOGNmLWUzYWItNGRjNi04ZTNkLWEwYjlkZWYxOWQ1NyIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ=="
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"Fake SmartThings Switch2",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"smartthings1",
                              "friendlyNameModifiedAt":1554150257281,
                              "capabilitiesModifiedAt":1554150257281,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"c792b2e7-e71b-41ec-b2e3-9e9476ab7e35",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1554150257281,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{                                  }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"powerState"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.PowerController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SWITCH"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjI3MDZhOGNmLWUzYWItNGRjNi04ZTNkLWEwYjlkZWYxOWQ1NyIsInN0YWdlIjoiZGV2ZWxvcG1lbnQifQ=="
                              }
                           }
                        }
                     }
                  },
                  "LambdaBridge_SKILL/eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9":{
                     "amazonBridgeIdentifier":{
                        "amazonBridgeDSN":"SKILL/eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9",
                        "amazonBridgeType":"LambdaBridge",
                        "lambdaBridge":true,
                        "amazonBridgeSource":"SKILL"
                     },
                     "applianceDetails":{
                        "applianceDetails":{
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_e0401c4e-ff5e-43f6-af5f-4986afb8266e":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_e0401c4e-ff5e-43f6-af5f-4986afb8266e",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Routine",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"Goodbye!",
                              "friendlyNameModifiedAt":1552940633050,
                              "capabilitiesModifiedAt":1552940633050,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"147bd392-8ffd-4dc3-b954-0a91231ecea6",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1552940633050,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSSceneControllerCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "proactivelyReported":false,
                                    "supportsDeactivation":false,
                                    "interfaceName":"Alexa.SceneController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SCENE_TRIGGER"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_5178a3ef-b365-4338-b1b2-aab4fbbc5e1e":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_5178a3ef-b365-4338-b1b2-aab4fbbc5e1e",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Routine",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"IAmBack",
                              "friendlyNameModifiedAt":1552940633063,
                              "capabilitiesModifiedAt":1552940633063,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"a5c397bd-847b-45fa-89fb-f34eb556f207",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1552940633050,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSSceneControllerCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "proactivelyReported":false,
                                    "supportsDeactivation":false,
                                    "interfaceName":"Alexa.SceneController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SCENE_TRIGGER"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_f59f6427-db90-4402-8a6b-c2be09ae2ff0":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_f59f6427-db90-4402-8a6b-c2be09ae2ff0",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Switch",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"smartthings2",
                              "friendlyNameModifiedAt":1554149203953,
                              "capabilitiesModifiedAt":1554149203953,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"3b84b62c-4c56-4e6a-814a-5bd92df3511c",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1554149203953,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"connectivity"
                                          }
                                       ],
                                       "proactivelyReported":false,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.EndpointHealth"
                                 },
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"powerState"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.PowerController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SWITCH"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_6848728a-6951-4457-8d1b-037fea3fea67":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_6848728a-6951-4457-8d1b-037fea3fea67",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Routine",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"Good Morning!",
                              "friendlyNameModifiedAt":1552940633068,
                              "capabilitiesModifiedAt":1552940633068,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"5c5d0a42-66a7-47f0-a2a1-3dd88da1e31d",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1552940633050,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSSceneControllerCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "proactivelyReported":false,
                                    "supportsDeactivation":false,
                                    "interfaceName":"Alexa.SceneController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SCENE_TRIGGER"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_c4940aaa-4e5c-46fe-9419-2d9f77c7cee8":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_c4940aaa-4e5c-46fe-9419-2d9f77c7cee8",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Routine",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"哈哈",
                              "friendlyNameModifiedAt":1552940633074,
                              "capabilitiesModifiedAt":1552940633074,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"476ee698-1638-41eb-a8a0-e963b60d85c6",
                              "applianceNetworkState":{
                                 "reachability":"NOT_REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1552940633050,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.A3S5BH2HU6VAYF.G090L91072720DQ7.CUSTOMER.2019-03-18T20:23:52.425Z.78cc347a-2f85-4c12-8c82-30555a1c75c0"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/aa14d7cf-2510-42fc-b49a-61a3201d7688"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSSceneControllerCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "proactivelyReported":false,
                                    "supportsDeactivation":false,
                                    "interfaceName":"Alexa.SceneController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SCENE_TRIGGER"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_403dd373-7940-4edb-ad96-88bf3f28e4cc":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_403dd373-7940-4edb-ad96-88bf3f28e4cc",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Device",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"11111",
                              "friendlyNameModifiedAt":1554149203958,
                              "capabilitiesModifiedAt":1554149203958,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"7cec84af-4f7a-49f0-92d6-e3403ea910fd",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1554149203953,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"powerState"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.PowerController"
                                 },
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"connectivity"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.EndpointHealth"
                                 }
                              ],
                              "applianceTypes":[
                                 "SMARTPLUG"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_d956f54a-b71a-4c49-b92e-234e880e2bef":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_d956f54a-b71a-4c49-b92e-234e880e2bef",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Switch",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"smartthings1",
                              "friendlyNameModifiedAt":1554149203970,
                              "capabilitiesModifiedAt":1554149203970,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"a7431ebe-3631-4ad4-ac58-112a092df4be",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1554149203953,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"connectivity"
                                          }
                                       ],
                                       "proactivelyReported":false,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.EndpointHealth"
                                 },
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"powerState"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.PowerController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SWITCH"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_63c09df9-6d13-40f8-bec0-c1217c5dd9ed":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_63c09df9-6d13-40f8-bec0-c1217c5dd9ed",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Light (dimmable)",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"smartthings3",
                              "friendlyNameModifiedAt":1554149203964,
                              "capabilitiesModifiedAt":1554149203964,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"1cf0ab83-b1fe-405b-bd00-f1f07a7927a0",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1554149203953,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"brightness"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.BrightnessController"
                                 },
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"connectivity"
                                          }
                                       ],
                                       "proactivelyReported":false,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.EndpointHealth"
                                 },
                                 {
                                    "capabilityType":"AVSInterfaceCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "properties":{
                                       "supported":[
                                          {
                                             "name":"powerState"
                                          }
                                       ],
                                       "proactivelyReported":true,
                                       "retrievable":true,
                                       "readOnly":false
                                    },
                                    "interfaceName":"Alexa.PowerController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SWITCH",
                                 "LIGHT"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           },
                           "SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_93a23d5f-c61c-44b1-b41e-5bdf6ebd66e8":{
                              "applianceId":"SKILL_eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9_93a23d5f-c61c-44b1-b41e-5bdf6ebd66e8",
                              "endpointTypeId":"",
                              "driverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              },
                              "manufacturerName":"SmartThings",
                              "friendlyDescription":"SmartThings Routine",
                              "modelName":"",
                              "deviceType":"CLOUD_DISCOVERED_DEVICE",
                              "version":"0",
                              "friendlyName":"Good Night!",
                              "friendlyNameModifiedAt":1552940633087,
                              "capabilitiesModifiedAt":1552940633087,
                              "ipAddress":"",
                              "port":"",
                              "entityId":"302b9711-6998-4865-9204-7a4ea5c2d2af",
                              "applianceNetworkState":{
                                 "reachability":"REACHABLE",
                                 "lastSeenAt":1554150273030,
                                 "createdAt":1552940633050,
                                 "lastSeenDiscoverySessionId":{
                                    "value":"amzn1.HomeAutomation.ApplianceDiscovery.A1OZ7FH12OZY2A.LambdaBridge.fakeDSN.CUSTOMER.2019-04-01T20:24:17.180Z.22e16552-2ad2-4562-bb8d-20e5862326b6"
                                 }
                              },
                              "tags":{
                                 "tagNameToValueSetMap":{                                  }
                              },
                              "additionalApplianceDetails":{
                                 "additionalApplianceDetails":{
                                    "uri":"https://graph.api.smartthings.com:443/api/smartapps/installations/3f4b5154-1538-429d-9311-b095a17c18a8"
                                 }
                              },
                              "firmwareVersion":"0",
                              "actions":[                               ],
                              "capabilities":[
                                 {
                                    "capabilityType":"AVSSceneControllerCapability",
                                    "type":"AlexaInterface",
                                    "version":"3",
                                    "proactivelyReported":false,
                                    "supportsDeactivation":false,
                                    "interfaceName":"Alexa.SceneController"
                                 }
                              ],
                              "applianceTypes":[
                                 "SCENE_TRIGGER"
                              ],
                              "isEnabled":true,
                              "aliases":[                               ],
                              "connectedVia":"",
                              "alexaDeviceIdentifierList":[                               ],
                              "ipaddress":"",
                              "applianceLambdaControlled":true,
                              "applianceDriverIdentity":{
                                 "namespace":"SKILL",
                                 "identifier":"eyJza2lsbElkIjoiYW16bjEuYXNrLnNraWxsLjJiZGJjNzRmLWNlNGQtNGUyZC1iNzQxLTMyNmM3YmEzNThmMCIsInN0YWdlIjoibGl2ZSJ9"
                              }
                           }
                        }
                     }
                  }
               }
            },
            "applianceGroups":{
               "applianceGroups":{                }
            }
         }
      }
   },
   "version":"1.0",
   "relations":[    ]
}"
}

深入理解Amazon Alexa Skill(四)的更多相关文章

  1. 深入理解Amazon Alexa Skill(三)

    本节来讨论Alexa Skill中涉及到的授权问题. Alexa内功能的授权 Alexa会发给skill用户的token,然后skill代码使用这个token来访问Web API访问用户的Alexa内 ...

  2. 深入理解Amazon Alexa Skill(一)

    语音助手(Virtual Personal Assistants, VPA)是物联网智能家居中很火的一个领域,用户可以通过语言作为入口来控制家里各种各样的设备,而亚马逊的Alexa(echo,echo ...

  3. 深入理解Amazon Alexa Skill(二)

    理解skill调用 本节来更详细的讨论alexa是如何确定调用哪个skill的. 参考:https://developer.amazon.com/zh/docs/custom-skills/under ...

  4. Amazon Alexa登录授权(Android)

    访问Alexa的API,必须要携带AccessToken,也就是必须要登录授权,本文主要记录Amazon Alexa在Android平台上的登录授权过程. 一.在亚马逊开发者平台注册应用 进入亚马逊开 ...

  5. Amazon Alexa 语音识别1 : 简介

    Alexa是Amazon自家的语音识别技术,需要配合自家的Echo音箱使用.开发者可以在Amazon上建立自己的程序(Skill)来连接到自己的应用或是硬件.例如,用户家里有一套xx牌的智能灯,现在希 ...

  6. (5) 深入理解Java Class文件格式(四)

    转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415 前情回顾   在上一篇博客深入理解Java Class文件格式(三) 中, ...

  7. TCP/UDP协议、理解三次握手四次挥手、Socket

    一.什么是socket? 中文名叫套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议. 在程序员的言论,他就是一个封装好的模块,要 ...

  8. 深入理解协程(四):async/await异步爬虫实战

    本文目录: 同步方式爬取博客标题 async/await异步爬取博客标题 本片为深入理解协程系列文章的补充. 你将会在从本文中了解到:async/await如何运用的实际的爬虫中. 案例 从CSDN上 ...

  9. 深入理解PHP内核(十四)类的成员变量及方法

    原文链接:http://www.orlion.ga/1237/ 类的成员变量在PHP中本质是一个变量,只是这些变量都归属于某个类,并且给这些变量是有访问控制的. 类的成员方法在PHP中本质是一个函数, ...

随机推荐

  1. [CSS] Specify grid columns, rows, and areas at once with the grid-template shorthand

    We can specify grid columns, rows, and areas in one property using the grid-template shorthand. .con ...

  2. 辛星浅析yaf框架中的类的自己主动载入问题

    因为公司非常多项目都是基于yaf的,而非常多刚接触yaf的朋友问的第一个问题就是:yaf的自己主动载入是依照什么规则来的. 鉴于此.于是我特别开了一篇博文来记录一下. 首先在yaf中.models文件 ...

  3. 【hdu 2897】邂逅明下

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  4. 【hdu 1536】S-Nim

    Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...

  5. 物联网学生科协第三届H-star现场编程比赛

    问题 A: 剪纸片 时间限制: 1 Sec 内存限制: 128 MB 题目描写叙述 这是一道简单的题目,假如你身边有一张纸.一把剪刀.在H-star的比赛现场,你会这么做: 1. 将这张纸剪成两片(平 ...

  6. Undefined symbols for architecture i386: "_OBJC_CLASS_$_KKGridView", referenced from:

    Undefined symbols for architecture i386: "_OBJC_CLASS_$_KKGridView", referenced from:

  7. 中国象棋V2:Java源代码、毕业设计等所有文档,已经全部提交到CSDN-Code平台

    下载地址:https://code.csdn.net/FansUnion/chinesechess-v2 主要内容:Java源代码.毕业设计.API文档.声音图片等资源.Demo截图等一切的一切. 2 ...

  8. Thermal management in a gaming machine

    BACKGROUND OF THE INVENTION 1. Field of the Invention The present invention relates to wager gaming ...

  9. 人生不过一个字【Life is but a word】

    有人说,人生是一出悲悲喜喜的戏,是一首飘飘忽忽的歌,是一次上去又下来的登山运动,是一场明明灭灭的烟花……是的,有道理,但听起来,太玄虚:悟起来,太深远:做起来,太复杂.              我说 ...

  10. Arcgis api for javascript学习笔记(3.2X版本)-初步尝试

    Arcgis api for javascript(3.22版本)官方地址 :https://developers.arcgis.com/javascript/3/ 1. 根据官方示例实现一个简单地图 ...