Guia do sistema de segurança para casas inteligentes
action.devices.types.SECURITYSYSTEM - Os sistemas de segurança podem ser ligados e desligados. Eles podem ser ativados em vários níveis de segurança (por exemplo, em casa e fora de casa) e informar dados sobre determinados sensores, como um sensor que detecta movimento ou uma janela aberta.
Esse tipo indica que o dispositivo recebe o ícone do sistema de segurança e alguns sinônimos e aliases relacionados.
Recursos do dispositivo
Consulte a documentação da característica correspondente para detalhes da implementação, como atributos e estados que seu serviço precisa oferecer suporte, e como criar respostas EXECUTE e QUERY.
Características obrigatórias
Essas características e comandos são obrigatórios, se aplicáveis ao seu dispositivo. Se o dispositivo não for compatível com esses recursos, insira o código de erro de
functionNotSupported em uma resposta QUERY ou EXECUTE. Consulte
Erros e exceções para mais informações.
Traços recomendados
Esses traços são recomendados, se aplicáveis ao seu dispositivo. No entanto, você pode misturar e combinar todos os traços disponíveis para corresponder melhor à funcionalidade do produto.
Exemplo de dispositivo: sistema de segurança simples
Esta seção contém exemplos de payloads de intent que representam um "Sistema de segurança" comum com base no tipo e nas características do dispositivo acima. Se você adicionar ou remover características na sua implementação, modifique as respostas de acordo para refletir essas mudanças.
Exemplo de resposta de sincronização
{
"requestId": "6894439706274654512",
"inputs": [
{
"intent": "action.devices.SYNC"
}
]
}{ "requestId": "6894439706274654512", "payload": { "agentUserId": "user123", "devices": [ { "id": "123", "type": "action.devices.types.SECURITYSYSTEM", "traits": [ "action.devices.traits.StatusReport", "action.devices.traits.ArmDisarm" ], "name": { "name": "Simple security system" }, "willReportState": true, "attributes": { "availableArmLevels": { "levels": [ { "level_name": "home_key", "level_values": [ { "level_synonym": [ "Home and Guarding", "level 1", "home", "SL1" ], "lang": "en" } ] }, { "level_name": "away_key", "level_values": [ { "level_synonym": [ "Away and Guarding", "level 2", "away", "SL2" ], "lang": "en" } ] } ], "ordered": true } }, "deviceInfo": { "manufacturer": "smart-home-inc", "model": "hs1234", "hwVersion": "3.2", "swVersion": "11.4" } } ] } }
Exemplo de resposta de QUERY
{ "requestId": "6894439706274654514", "inputs": [ { "intent": "action.devices.QUERY", "payload": { "devices": [ { "id": "123" } ] } } ] }
{ "requestId": "6894439706274654514", "payload": { "devices": { "123": { "status": "SUCCESS", "online": true, "isArmed": true, "currentArmLevel": "home_key", "currentStatusReport": [ { "blocking": false, "deviceTarget": "123", "priority": 0, "statusCode": "lowBattery" } ] } } } }
Exemplos de comandos EXECUTE
ArmDisarm
Para mais detalhes sobre os parâmetros de comando,
consulte a referência
action.devices.traits.ArmDisarm.
{ "requestId": "6894439706274654516", "inputs": [ { "intent": "action.devices.EXECUTE", "payload": { "commands": [ { "devices": [ { "id": "123" } ], "execution": [ { "command": "action.devices.commands.ArmDisarm", "params": { "arm": true, "armLevel": "away_key" } } ] } ] } } ] }
{ "requestId": "6894439706274654516", "payload": { "commands": [ { "ids": [ "123" ], "status": "SUCCESS", "states": { "online": true, "isArmed": true, "currentArmLevel": "away_key" } } ] } }
ERROS do dispositivo
Confira a lista completa de erros e exceções.Informar exceções de ativação
Ao tentar ativar ou desativar o sistema, você pode fornecer mais contexto usando códigos de exceção que são informados pelo traço StatusReport. As exceções podem ser reportadas como bloqueadoras ou não bloqueadoras.
- As exceções sem bloqueio informadas com um status "SUCCESS" indicam que a exceção não impediu o arme ou o desarme.
- Exceções de bloqueio informadas com um status "EXCEPTIONS" indicam que o arme ou desarme foi interrompido devido a essas exceções.
Códigos de exceção comumente associados a sistemas de segurança:
doorOpen: uma porta está aberta.windowOpen: uma janela está aberta.isOpen: um sensor detecta que algo está aberto, mas não sabe se é uma porta ou janela.
Exemplo: exceção não bloqueadora
Este exemplo mostra uma exceção não bloqueadora em que o sistema de segurança é ativado mesmo que uma janela seja informada como aberta.
| Usuário | Defina o sistema de segurança como alta segurança. |
| Google Assistente | Ok, a janela da frente está aberta. Ligando o sistema de segurança em segurança alta. |
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.EXECUTE",
"payload": {
"commands": [{
"devices": [{
"id": "123"
}],
"execution": [{
"command": "action.devices.commands.ArmDisarm",
"params": {
"arm": true,
"armLevel": "L2"
}
}]
}]
}
}]
}{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"commands": [
{
"ids": [
"123"
],
"status": "SUCCESS",
"states": {
"online": true,
"isArmed": true,
"currentArmLevel": "L2",
"currentStatusReport": [
{
"blocking": false,
"priority": 0,
"statusCode": "windowOpen",
"deviceTarget": "sensor_id1"
}
]
}
}
]
}
}Exemplo: exceção de bloqueio
| Usuário | Defina o sistema de segurança como alta segurança. |
| Google Assistente | Ocorreu um erro ao controlar o sistema de segurança. A janela da frente está aberta. |
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.EXECUTE",
"payload": {
"commands": [{
"devices": [{
"id": "123"
}],
"execution": [{
"command": "action.devices.commands.ArmDisarm",
"params": {
"arm": true,
"armLevel": "L2"
}
}]
}]
}
}]
}{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"commands": [
{
"ids": [
"123"
],
"status": "EXCEPTIONS",
"states": {
"online": true,
"isArmed": false,
"currentArmLevel": "L2",
"currentStatusReport": [
{
"blocking": true,
"priority": 0,
"statusCode": "windowOpen",
"deviceTarget": "sensor_id1"
}
]
}
}
]
}
}Proteção com a autenticação de dois fatores
Se o fluxo de ativação exigir que os usuários insiram um PIN em uma caixa de diálogo de autenticação de dois fatores, confirme se eles querem continuar ativando o sistema quando houver exceções ativas (por exemplo, quando uma janela ou porta está aberta).
Nesse cenário, talvez seja necessário inserir um PIN ou uma senha e depois confirmar.
Exemplo: desafio de confirmação
Este exemplo mostra um usuário tentando ativar o sistema de segurança, mas uma porta da frente é detectada como aberta. O usuário reconhece que o sistema de segurança deve ser ativado mesmo que a porta da frente esteja aberta.
| Usuário | Ligue o sistema de segurança. |
| Google Assistente | A porta da frente está aberta. Você quer mesmo ativar o sistema de segurança? |
| Usuário | Sim. |
| Google Assistente | Ok, ligando o sistema de segurança. |
Na primeira vez, responda com um desafio ackNeeded.
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.EXECUTE",
"payload": {
"commands": [{
"devices": [{
"id": "123"
}],
"execution": [{
"command": "action.devices.commands.ArmDisarm",
"params": {
"arm": true
}
}]
}]
}
}]
}{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"commands": [
{
"ids": [
"123"
],
"status": "ERROR",
"errorCode": "challengeNeeded",
"challengeNeeded": {
"type": "ackNeeded"
},
"states": {
"isArmed": true,
"currentArmLevel": "L2",
"currentStatusReport": [
{
"blocking": false,
"priority": 0,
"statusCode": "doorOpen",
"deviceTarget": "456"
}
]
}
}
]
}
}A solicitação subsequente do Google para você vai conter o resultado ack.
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.EXECUTE",
"payload": {
"commands": [{
"devices": [{
"id": "123"
}],
"execution": [{
"command": "action.devices.commands.ArmDisarm",
"params": {
"arm": true
},
"challenge": {
"ack": true
}
}]
}]
}
}]
}{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"commands": [
{
"ids": [
"123"
],
"status": "SUCCESS",
"states": {
"isArmed": true
}
}
]
}
}Exemplo: desafio de PIN e confirmação
Este exemplo mostra um usuário tentando ativar o sistema de segurança que exige a entrada de um PIN. O sistema detecta que os vidros da frente e de trás estão abertos e pede que o usuário confirme que o arme deve continuar.
| Usuário | Ligue o modo Ausente. |
| Google Assistente | Qual é o seu PIN? |
| Usuário | 1234. |
| Google Assistente | Parece que as janelas da frente e de trás estão abertas. Você quer mesmo continuar ativando o sistema de segurança no modo ausente? |
| Usuário | Sim. |
| Google Assistente | Ok, ligando o sistema de segurança no modo ausente. |
Na primeira vez, responda com um desafio padrão de pinNeeded.
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.ArmDisarm", "params": { "arm": true } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["456"], "status": "ERROR", "errorCode": "challengeNeeded", "challengeNeeded": { "type": "pinNeeded" } }] } }
Em seguida, o Google envia uma solicitação com o PIN fornecido. Para oferecer suporte
ao segundo turno, responda com um desafio ackNeeded com
informações adicionais, incluindo o nível de braço desejado e o relatório de status atual com
exceções de bloqueio.
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [...], "execution": [{ "command": "action.devices.commands.ArmDisarm", "params": { "arm": true, "armLevel": "away" }, "challenge": { "pin": "1234" } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["456"], "status": "ERROR", "states": { "targetArmLevel": "away", "currentStatusReport": [{ "blocking": true, "priority": 1, "deviceTarget": "front_window_id", "statusCode": "deviceOpen" }, { "blocking": true, "priority": 1, "deviceTarget": "back_window_id", "statusCode": "deviceOpen" } ] }, "errorCode": "challengeNeeded", "challengeNeeded": { "type": "ackNeeded" } }] } }
A solicitação subsequente do Google para você vai conter apenas o resultado ack,
e não o PIN fornecido na primeira vez.
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [...], "execution": [{ "command": "action.devices.commands.ArmDisarm", "params": { "arm": true, "armLevel": "away" }, "challenge": { "ack": true } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [ { "ids": [ "123" ], "status": "SUCCESS", "states": { "isArmed": true } } ] } }