Przewodnik po systemie bezpieczeństwa inteligentnego domu

action.devices.types.SECURITYSYSTEM – systemy alarmowe mogą być włączane i wyłączane. Mogą być włączane na różnych poziomach bezpieczeństwa (np. w domu i Poza domem) oraz przekazują informacje z niektórych czujników, takich jak czujnik wykrywający ruch lub otwarte okno.

Ten typ oznacza, że na urządzeniu pojawia się ikona systemu bezpieczeństwa synonimy i aliasy.

Funkcje urządzenia

Zapoznaj się z dokumentacją dotyczącą cech, aby: szczegóły implementacji, takie jak atrybuty i stany, które powinna obsługiwać Twoja usługa, oraz sposób kompilować odpowiedzi EXECUTE i QUERY.

Wymagane cechy

Te cechy i polecenia są wymagane w przypadku Twojego urządzenia. Jeśli Twoje urządzenie nie obsługuje tych cech, wpisz kod błędu functionNotSupported w odpowiedzi QUERY lub EXECUTE. Zobacz Więcej informacji znajdziesz w artykule Błędy i wyjątki.

Są one zalecane (jeśli mają zastosowanie do Twojego urządzenia). Możesz jednak dowolnie łączyć ze sobą wszystkie cechy, aby jak najlepiej dopasować funkcji produktu.

Wymagania dotyczące jakości

  • Czas oczekiwania: nie może przekraczać 2000 ms.
  • Miarodajność: wartość nie może być mniejsza niż 97%.

Przykład urządzenia: prosty system alarmowy

Ta sekcja zawiera przykładowe ładunki intencji reprezentujące wspólny „system zabezpieczeń” na podstawie typu urządzenia i cech wymienionych powyżej. Jeśli dodasz lub usuniesz cechy swojej implementacji, odpowiednio zmodyfikuj swoje odpowiedzi, by odzwierciedlić te zmiany.

Przykładowa odpowiedź SYNC

Prośba
.
{
  "requestId": "6894439706274654512",
  "inputs": [
    {
      "intent": "action.devices.SYNC"
    }
  ]
}
.
Odpowiedź
{
  "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ź na zapytanie QUERY

Prośba
.
{
  "requestId": "6894439706274654514",
  "inputs": [
    {
      "intent": "action.devices.QUERY",
      "payload": {
        "devices": [
          {
            "id": "123"
          }
        ]
      }
    }
  ]
}
.
Odpowiedź
{
  "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 polecenia: zobacz action.devices.traits.ArmDisarm odwołania.

Prośba
.
{
  "requestId": "6894439706274654516",
  "inputs": [
    {
      "intent": "action.devices.EXECUTE",
      "payload": {
        "commands": [
          {
            "devices": [
              {
                "id": "123"
              }
            ],
            "execution": [
              {
                "command": "action.devices.commands.ArmDisarm",
                "params": {
                  "arm": true,
                  "armLevel": "away_key"
                }
              }
            ]
          }
        ]
      }
    }
  ]
}
.
Odpowiedź
{
  "requestId": "6894439706274654516",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "SUCCESS",
        "states": {
          "online": true,
          "isArmed": true,
          "currentArmLevel": "away_key"
        }
      }
    ]
  }
}

Urządzenie ERRORS

Zobacz pełną listę błędów i wyjątków.

Zgłaszanie wyjątków włączania

Przy próbie włączenia lub wyłączenia systemu można podać dodatkowe kontekstu za pomocą kodów wyjątków. które zgłaszasz za pomocą cechy StatusReport. Wyjątki mogą być zgłaszane jako blokujące lub nieblokujące.

  • Wyjątki nieblokujące zgłoszone z komunikatem „SUKCES” wskazuje, że wyjątek nie uniemożliwił włączenia ani wyłączenia alarmu.
  • Wyjątki blokowania zgłoszone z wartością „EXCEPTIONS” wskazuje, że uzbrojenie lub wyłączenie z powodu tych wyjątków zostało zatrzymane.

Kody wyjątków często kojarzone z systemami bezpieczeństwa:

  • doorOpen: drzwi są otwarte.
  • windowOpen: otwarte jest okno.
  • isOpen: czujnik wykrył, że coś jest otwarte (ale nie wie (jeśli chodzi o drzwi lub okno).
.

Przykład: wyjątek nieblokujący

Ten przykład pokazuje nieblokujący wyjątek, w którym system alarmowy jest włączony, mimo że okno zostało zgłoszone jako otwarte.

Użytkownik Ustaw wysoki poziom zabezpieczeń systemu alarmowego.
Asystent Google OK, przednie okno jest otwarte. Włączam wysoki poziom bezpieczeństwa w systemie alarmowym.
Prośba
.
{
    "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"
            }
          }]
        }]
      }
    }]
  }
.
Odpowiedź
{
    "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 blokujący

Użytkownik Ustaw wysoki poziom zabezpieczeń systemu alarmowego.
Asystent Google Wystąpił błąd sterowanie systemem alarmowym. Frontowe okno jest otwarte.
Prośba
.
{
    "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"
            }
          }]
        }]
      }
    }]
  }
.
Odpowiedź 2
{
    "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"
              }
            ]
          }
        }
      ]
    }
  }

Włącz uwierzytelnianie dwuskładnikowe

Jeśli proces włączania obsługi wymaga od użytkowników wpisania kodu PIN w Two-factor authentication, musisz potwierdzić, że użytkownik chce nadal włączać system, gdy są wyjątków (np. gdy okno lub drzwi są otwarte).

W tym scenariuszu może być wymagane podanie zarówno kodu PIN, jak i hasła, a następnie potwierdzenia.

Przykład: test zabezpieczający

Ten przykład pokazuje, jak użytkownik próbuje włączyć system alarmowy, ale wykryto, że drzwi wejściowe są otwarte. Użytkownik rozumie, że zabezpieczenia system powinien być włączony, mimo że drzwi wejściowe są otwarte.

Użytkownik Włącz system alarmowy.
Asystent Google Drzwi frontowe są otwarte. Czy na pewno chcesz włączyć system alarmowy?
Użytkownik Tak.
Asystent Google OK, włączam przez system alarmowy.

W pierwszej turze musisz odpowiedzieć, używając wyzwania ackNeeded.

Prośba 1
.
{
    "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
            }
          }]
        }]
      }
    }]
  }
.
Odpowiedź 2
{
    "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 zapytanie od Google do Ciebie będzie zawierać wynik ack.

Prośba 2
.
{
    "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
            }
          }]
        }]
      }
    }]
  }
.
Odpowiedź
{
    "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
    "payload": {
      "commands": [
        {
          "ids": [
            "123"
          ],
          "status": "SUCCESS",
          "states": {
            "isArmed": true
          }
        }
      ]
    }
  }

Przykład: test zabezpieczający z kodem PIN i potwierdzenie

Ten przykład pokazuje, jak użytkownik próbuje włączyć system alarmowy wymagający podania kodu PIN. System wykrywa, że przednie i tylne okna są otwarte, i prosi o potwierdzenie powinno być kontynuowane.

Użytkownik Odwróć rękę.
Asystent Google Jaki jest Twój kod PIN?
Użytkownik 1234.
Asystent Google Wygląda na to, a przednie i tylne okna. Czy na pewno chcesz kontynuować Włączyć system alarmowy w tryb Poza domem?
Użytkownik Tak.
Asystent Google OK, włączam system alarmowy na Poza domem

W pierwszej turze musisz odpowiedzieć standardowym wyzwaniem pinNeeded.

Prośba 1
.
{
  "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
          }
        }]
      }]
    }
  }]
}
.
Odpowiedź
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["456"],
      "status": "ERROR",
      "errorCode": "challengeNeeded",
      "challengeNeeded": {
        "type": "pinNeeded"
      }
    }]
  }
}

Następnie przesyłamy żądanie zawierające podany kod PIN. Aby pomóc w drugiej turze musisz odpowiedzieć w ramach wyzwania ackNeeded, podając: zawiera dodatkowe informacje, m.in. na poziomie grupy docelowej, a także bieżący raport o stanie zawierający blokujących wyjątki.

Prośba 2
.
{
  "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"
          }
        }]
      }]
    }
  }]
}
.
Odpowiedź
{
  "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 Google do Ciebie będzie zawierać tylko wynik ack, a nie kod PIN podany w pierwszej turze.

Prośba 3
.
{
  "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
          }
        }]
      }]
    }
  }]
}
.
Odpowiedź
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "SUCCESS",
        "states": {
          "isArmed": true
        }
      }
    ]
  }
}