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.

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

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ź 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 poleceń znajdziesz w  action.devices.traits.ArmDisarmdokumentacjiaction.devices.traits.ArmDisarm.

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"
        }
      }
    ]
  }
}

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.
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 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.
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"
              }
            ]
          }
        }
      ]
    }
  }

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.

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 żądanie od Google będzie zawierać 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: 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.

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 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.

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 od Google będzie zawierać tylko ack wynik, a nie kod PIN podany w pierwszej kolejce.

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
        }
      }
    ]
  }
}