Guide pour système de sécurité de la maison connectée
action.devices.types.SECURITYSYSTEM
: les systèmes de sécurité peuvent être activés et désactivés. Ils peuvent être activés sur plusieurs niveaux de sécurité (par exemple, chez eux et absents) et envoyer des informations sur certains capteurs, comme un capteur qui détecte un mouvement ou une fenêtre ouverte.
Ce type indique que l'appareil obtient l'icône du système de sécurité, ainsi que certains synonymes et alias associés.
Fonctionnalités de l'appareil
Reportez-vous à la documentation sur les fonctionnalités correspondantes pour obtenir des détails sur l'implémentation, tels que les attributs et les états que votre service doit prendre en charge, et pour découvrir comment créer des réponses EXECUTE et QUERY.
Traits obligatoires
Ces traits et commandes sont requis, le cas échéant. Si votre appareil n'est pas compatible avec ces traits, saisissez le code d'erreur de functionNotSupported
dans une réponse QUERY ou EXECUTE. Pour en savoir plus, consultez la section Erreurs et exceptions.
Traits recommandés
Ces traits sont recommandés s'ils s'appliquent à votre appareil. Cependant, vous êtes libre de combiner toutes les caractéristiques disponibles pour correspondre au mieux aux fonctionnalités existantes de votre produit.
Exigences de qualité
- La latence doit être inférieure ou égale à 2 000 ms.
- Fiabilité: la valeur doit être supérieure ou égale à 97%.
Exemple d'appareil: système de sécurité simple
Cette section contient des exemples de charges utiles d'intent représentant un "système de sécurité" commun basé sur le type d'appareil et les caractéristiques décrites ci-dessus. Si vous ajoutez ou supprimez des caractéristiques dans votre implémentation, modifiez vos réponses en conséquence pour refléter ces modifications.
Exemple de réponse 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" } } ] } }
Exemple de réponse 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" } ] } } } }
Exemples de commandes EXECUTE
Désactivation d'activation
Pour en savoir plus sur les paramètres de la commande, consultez la documentation de référence sur
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" } } ] } }
ERREURS sur l'appareil
Consultez la liste complète des erreurs et exceptions.Signaler les exceptions d'activation
Lorsque vous essayez d'activer ou de désactiver le système, vous pouvez fournir du contexte supplémentaire via des codes d'exception que vous signalez via la caractéristique StatusReport. Les exceptions peuvent être signalées comme bloquantes ou non bloquantes.
- Les exceptions non bloquantes signalées par l'état "SUCCESS" indiquent que l'exception n'a pas empêché l'activation ni la désactivation.
- Les exceptions bloquantes signalées par l'état "EXCEPTIONS" indiquent que l'activation ou la désactivation a été interrompue en raison de ces exceptions.
Les codes d'exception généralement associés aux systèmes de sécurité incluent:
doorOpen
: une porte est ouverte.windowOpen
: une fenêtre est ouverte.isOpen
: un capteur détecte quelque chose d'ouvert, mais ne sait pas s'il s'agit d'une porte ou d'une fenêtre.
Exemple: exception non bloquante
Cet exemple présente une exception non bloquante dans laquelle le système de sécurité est activé même si une fenêtre est signalée comme ouverte.
Utilisateur | Définissez le système de sécurité sur "Sécurité élevée". |
Assistant Google | OK, la fenêtre avant est ouverte. J'active le système de sécurité à haut niveau de sécurité. |
{ "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" } ] } } ] } }
Exemple: Blocage de l'exception
Utilisateur | Définissez le système de sécurité sur "Sécurité élevée". |
Assistant Google | Une erreur s'est produite lors du contrôle du système de sécurité. La fenêtre de face est ouverte. |
{ "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": false, "currentArmLevel": "L2", "currentStatusReport": [ { "blocking": true, "priority": 0, "statusCode": "windowOpen", "deviceTarget": "sensor_id1" } ] } } ] } }
Activation avec authentification à deux facteurs
Si votre flux d'activation nécessite que les utilisateurs saisissent un code via une boîte de dialogue d'authentification à deux facteurs, vous devez confirmer s'ils souhaitent continuer à activer le système en cas d'exceptions actives (par exemple, lorsqu'une fenêtre ou une porte est ouverte).
Ce scénario peut nécessiter à la fois un code PIN ou une phrase secrète, suivis d'une confirmation.
Exemple: Défi de confirmation
Cet exemple montre un utilisateur qui tente d'activer le système de sécurité, mais une porte d'entrée est détectée comme ouverte. L'utilisateur reconnaît que le système de sécurité doit être activé même si la porte d'entrée est ouverte.
Utilisateur | Activez le système de sécurité. |
Assistant Google | La porte d'entrée est ouverte. Voulez-vous vraiment activer le système de sécurité ? |
Utilisateur | Oui. |
Assistant Google | D'accord, j'active le système de sécurité. |
Dans le premier tour, vous devez répondre avec un défi 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" } ] } } ] } }
La demande suivante que Google vous envoie contiendra le résultat 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 } } ] } }
Exemple: code d'accès et question de confirmation
Cet exemple montre un utilisateur qui tente d'activer le système de sécurité sans saisir le code. Le système détecte que les fenêtres avant et arrière sont ouvertes et demande à l'utilisateur de confirmer que l'activation doit se poursuivre.
Utilisateur | Activez le mode Absent. |
Assistant Google | Quel est votre code ? |
Utilisateur | 1234 |
Assistant Google | Il semble que la fenêtre avant et la fenêtre arrière sont ouvertes. Voulez-vous vraiment poursuivre l'activation du système de sécurité sur Absent ? |
Utilisateur | Oui. |
Assistant Google | OK, j'active le système de sécurité sur Absent |
Au premier tour, vous devez répondre par un défi pinNeeded
standard.
{ "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" } }] } }
Google donne ensuite suite à une demande contenant le code d'accès fourni. Pour effectuer le deuxième tour, vous devez répondre à une question d'authentification ackNeeded
avec des informations supplémentaires, y compris le niveau du groupe cible et le rapport d'état actuel avec les exceptions bloquantes.
{ "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" } }] } }
La demande suivante de Google ne contiendra que le résultat ack
, et non le code fourni lors du premier tour.
{ "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 } } ] } }