Przewodnik po systemach zabezpieczeń inteligentnego domu
action.devices.types.SECURITYSYSTEM – systemy alarmowe można włączać i wyłączać. Można je uzbrajać na różnych poziomach bezpieczeństwa (np. w domu i poza domem) i mogą one przekazywać informacje z określonych czujników, np. czujnika wykrywającego ruch lub otwarte okno.
Ten typ oznacza, że urządzenie otrzymuje ikonę systemu zabezpieczeń oraz powiązane synonimy i aliasy.
Możliwości urządzenia
Szczegóły implementacji, takie jak atrybuty i stany, które powinna obsługiwać Twoja usługa, oraz sposób tworzenia odpowiedzi EXECUTE i QUERY, znajdziesz w dokumentacji odpowiedniego cechy.
Wymagane cechy
Te cechy i polecenia są wymagane, jeśli mają zastosowanie do Twojego urządzenia. Jeśli urządzenie nie obsługuje tych cech, w odpowiedzi QUERY lub EXECUTE wpisz kod błędu functionNotSupported. Więcej informacji znajdziesz w sekcji Błędy i wyjątki.
Zalecane cechy
Te cechy są zalecane, jeśli mają zastosowanie do Twojego urządzenia. Możesz jednak dowolnie łączyć wszystkie dostępne atrybuty, aby jak najlepiej dopasować je do istniejących funkcji produktu.
Przykładowe urządzenie: prosty system zabezpieczeń
Ta sekcja zawiera przykładowe ładunki intencji reprezentujące typowe „systemy zabezpieczeń” na podstawie typu urządzenia i cech wymienionych powyżej. Jeśli dodasz lub usuniesz cechy w swojej implementacji, odpowiednio zmodyfikuj odpowiedzi, aby odzwierciedlić te zmiany.
Przykładowa odpowiedź SYNC
{
"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" } } ] } }
Przykładowa odpowiedź 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" } ] } } } }
Przykładowe polecenia EXECUTE
ArmDisarm
Więcej informacji o parametrach poleceń znajdziesz w
action.devices.traits.ArmDisarmdokumentacjiaction.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" } } ] } }
BŁĘDY urządzenia
Zobacz pełną listę błędów i wyjątków.Zgłaszanie wyjątków od uzbrajania
Podczas próby uzbrojenia lub rozbrojenia systemu możesz podać dodatkowy kontekst za pomocą kodów wyjątków, które zgłaszasz za pomocą cechy StatusReport. Wyjątki można zgłaszać jako blokujące lub nieblokujące.
- Wyjątki nieblokujące zgłaszane ze stanem „SUCCESS” wskazują, że wyjątek nie uniemożliwił uzbrojenia ani rozbrojenia.
- Wyjątki blokowania zgłaszane ze stanem „EXCEPTIONS” wskazują, że włączanie lub wyłączanie zostało zatrzymane z powodu tych wyjątków.
Kody wyjątków, które są często powiązane z systemami zabezpieczeń, to:
doorOpen: Drzwi są otwarte.windowOpen: okno jest otwarte.isOpen: czujnik wykrywa, że coś jest otwarte (ale nie wie, czy są to drzwi czy okno).
Przykład: wyjątek nieblokujący
Ten przykład pokazuje wyjątek nieblokujący, w którym system alarmowy jest włączony, mimo że okno jest otwarte.
| Użytkownik | Ustaw system alarmowy na wysoki poziom bezpieczeństwa. |
| Asystent Google | OK, przednie okno jest otwarte. Włączam system alarmowy z wysokim poziomem bezpieczeństwa. |
{
"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"
}
]
}
}
]
}
}Przykład: wyjątek blokowania
| Użytkownik | Ustaw system alarmowy na wysoki poziom bezpieczeństwa. |
| Asystent Google | Wystąpił błąd podczas sterowania systemem zabezpieczeń. Przednie okno jest otwarte. |
{
"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"
}
]
}
}
]
}
}Uzbrajanie z użyciem uwierzytelniania dwuskładnikowego
Jeśli proces uzbrajania wymaga od użytkowników wpisania kodu PIN w oknie dialogowym uwierzytelniania dwuskładnikowego, musisz potwierdzić, czy chcą kontynuować uzbrajanie systemu, gdy występują aktywne wyjątki (np. gdy okno lub drzwi są otwarte).
W takiej sytuacji może być wymagane zarówno wpisanie kodu PIN lub hasła, jak i potwierdzenie.
Przykład: Wyzwanie z potwierdzeniem
Ten przykład pokazuje, jak użytkownik próbuje włączyć system alarmowy, ale wykryto otwarte drzwi wejściowe. Użytkownik potwierdza, że system alarmowy powinien być włączony, nawet jeśli drzwi wejściowe są otwarte.
| Użytkownik | Włącz system alarmowy. |
| Asystent Google | Drzwi frontowe są otwarte. Czy na pewno chcesz włączyć system zabezpieczeń? |
| Użytkownik | Tak. |
| Asystent Google | OK, włączam system alarmowy. |
W pierwszej kolejce powinieneś odpowiedzieć 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"
}
]
}
}
]
}
}Kolejne żądanie od Google będzie zawierać 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
}
}
]
}
}Przykład: kod PIN i potwierdzenie
Ten przykład pokazuje użytkownika, który próbuje włączyć system zabezpieczeń wymagający podania kodu PIN. System wykrywa, że przednie i tylne okna są otwarte, i prosi użytkownika o potwierdzenie, że uzbrajanie powinno być kontynuowane.
| Użytkownik | Włącz tryb „Poza domem”. |
| Asystent Google | Jaki jest Twój kod PIN? |
| Użytkownik | 1234. |
| Asystent Google | Wygląda na to, że przednie i tylne okno są otwarte. Czy na pewno chcesz kontynuować uzbrajanie systemu zabezpieczeń w tryb „Poza domem”? |
| Użytkownik | Tak. |
| Asystent Google | OK, włączam system alarmowy w trybie „Poza domem”. |
W pierwszej kolejce powinieneś odpowiedzieć standardowym pinNeeded wyzwaniem.
{ "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" } }] } }
Następnie Google wysyła prośbę zawierającą podany kod PIN. Aby wesprzeć drugą turę, musisz odpowiedzieć ackNeededwyzwaniem z dodatkowymi informacjamiackNeeded, w tym docelowym poziomem ramienia i raportem o bieżącym stanie z wyjątkami blokującymi.
{ "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" } }] } }
Kolejne żądanie od Google będzie zawierać tylko ack wynik, a nie kod PIN podany w pierwszej kolejce.
{ "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 } } ] } }