Ce guide fait suite à Accéder aux appareils et aux métadonnées des appareils sur iOS et présente d'autres exemples de contrôle et d'accès aux appareils.
Pour utiliser des types ou des caractéristiques d'appareils spécifiques, tels que Matter
OnOffTrait
utilisé dans de nombreux exemples ici, ils doivent être importés :
import GoogleHomeSDK
import GoogleHomeTypes
Vérifier si un trait est compatible avec une commande
Utilisez la fonction supports
au niveau du trait pour vérifier si une commande est compatible avec un appareil spécifique.
Par exemple, pour vérifier si un appareil est compatible avec la commande toggle
du trait On/Off :
// Check if the OnOff trait supports the toggle command. if onOffTraitTest.supportsToggleCommand { print("onOffTrait supports toggle command") } else { print("onOffTrait does not support stateful toggle command") }
Envoyer une commande à un appareil
L'envoi d'une commande est semblable à la lecture d'un attribut d'état à partir d'un trait. Pour allumer ou éteindre l'appareil, utilisez la commande d'activation/désactivation OnOffTrait
, qui est définie dans le modèle de données de l'écosystème Google Home comme toggle()
. Cette méthode remplace onOff
par false
si la valeur est true
, ou par true
si la valeur est false
:
// Calling a command on a trait. do { try await onOffTraitTest.toggle() } catch let error as HomeError { // Code for handling the exception }
Les commandes peuvent renvoyer une exception si un problème est détecté dans le flux d'exécution. En tant que développeur, vous devez utiliser un bloc do-catch
pour gérer correctement ces exceptions et fournir des informations détaillées aux utilisateurs dans les cas où les erreurs sont exploitables. Les exceptions non gérées arrêteront l'exécution de l'application et peuvent entraîner des plantages dans votre application.
Vous pouvez également utiliser les commandes off()
ou on()
pour définir explicitement l'état :
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let error as HomeError { // Code for handling the exception }
Après avoir envoyé une commande pour modifier l'état, une fois qu'elle est terminée, vous pouvez lire l'état comme décrit dans Lire l'état d'un appareil pour le gérer dans votre application.
Envoyer une commande avec des paramètres
Certaines commandes peuvent utiliser des paramètres, comme celles de OnOffTrait
ou LevelControlTrait
:
offWithEffect
// Turn off the light using the DyingLight effect. do { try await onOffTraitTest.offWithEffect( effectIdentifier: Matter.OnOffTrait.EffectIdentifierEnum.dyingLight, effectVariant: 0 ) } catch let error as HomeError { // Code for handling the exception }
moveToLevel
// Change the brightness of the light to 50% do { try await levelControlTraitTest.moveToLevel( level: UInt8(127), transitionTime: 0, optionsMask: Matter.LevelControlTrait.OptionsBitmap(), optionsOverride: Matter.LevelControlTrait.OptionsBitmap() ) } catch let error as HomeError { // Code for handling the exception }
Vérifier si un trait est compatible avec un attribut
Il est possible que certains appareils soient compatibles avec un trait Matter, mais pas avec un attribut spécifique. Par exemple, un appareil Cloud-to-cloud mappé sur Matter n'est pas forcément compatible avec tous les attributs Matter. Pour gérer de tels cas, utilisez la propriété isSupported
au niveau du trait pour vérifier si l'attribut est compatible avec un appareil spécifique.
Par exemple, pour vérifier si un appareil est compatible avec l'attribut onOff
du trait On/Off :
// Check if the OnOff trait supports the onOff attribute. if onOffTrait.attributes.$onOff.isSupported { print("onOffTrait supports onOff state") } else { print("onOffTrait is for a command only device!") }
Certains attributs peuvent être définis sur "null" dans la spécification Matter ou dans le schéma smart home de Cloud-to-cloud. Pour ces attributs, vous pouvez déterminer si la valeur nil renvoyée par l'attribut est due au fait que l'appareil ne signale pas cette valeur ou si la valeur de l'attribut est réellement nil
, en utilisant isNullable
en plus de isSupported
:
// Check if a nullable attribute is set or is not supported. if let deviceType = await device.types.get(OnOffLightDeviceType.self) { if let onOffTrait = deviceType.traits[Matter.OnOffTrait.self] { if onOffTrait.attributes.startUpOnOff == nil { if onOffTrait.attributes.$startUpOnOff.isSupported { print( "onOffTrait supports startUpOnOff and it is nil. Check the spec for the contextual meaning." ) } else { print("onOffTrait does not support startUpOnOff!") } } else { print( "onOffTrait supports startUpOnOff and it is set to \(onOffTrait.attributes.startUpOnOff)" ) } } }
Mettre à jour les attributs de caractéristiques
Si vous souhaitez modifier la valeur d'un attribut donné et qu'aucune des commandes du trait ne le fait, l'attribut peut permettre de définir explicitement sa valeur.
La possibilité de modifier la valeur d'un attribut dépend de deux facteurs :
- L'attribut est-il modifiable ?
- La valeur de l'attribut peut-elle changer en tant qu'effet secondaire de l'envoi d'une commande de caractéristique ?
La documentation de référence sur les traits et leurs attributs fournit ces informations.
Par conséquent, les combinaisons de propriétés qui déterminent comment la valeur d'un attribut peut être modifiée sont les suivantes :
Lecture seule et non affecté par les autres commandes. Cela signifie que la valeur de l'attribut ne change pas. Par exemple, l'attribut
currentPosition
deSwitchTrait
.Lecture seule et affecté par d'autres commandes. Cela signifie que la valeur de l'attribut ne peut changer que suite à l'envoi d'une commande. Par exemple, l'attribut
currentLevel
deLevelControlTrait
est en lecture seule, mais sa valeur peut être modifiée par des commandes telles quemoveToLevel
.Écriture possible et non affecté par d'autres commandes. Cela signifie que vous pouvez modifier directement la valeur de l'attribut à l'aide de la fonction
update
du trait, mais qu'aucune commande n'affectera la valeur de l'attribut. Par exemple, l'attributWrongCodeEntryLimit
deDoorLockTrait
.Écriture possible et affectée par d'autres commandes. Cela signifie que vous pouvez modifier directement la valeur de l'attribut à l'aide de la fonction
update
du trait, et que la valeur de l'attribut peut changer à la suite de l'envoi d'une commande. Par exemple, l'attributoccupiedCoolingSetpoint
deThermostatTrait
peut être écrit, mais aussi mis à jour avec la commandesetpointRaiseLower
.
Exemple d'utilisation de la fonction de mise à jour pour modifier la valeur d'un attribut
Cet exemple montre comment définir explicitement la valeur de l'attribut DoorLockTrait.wrongCodeEntryLimit
.
Pour définir la valeur d'un attribut, appelez la fonction update
du trait et transmettez-lui une fonction de mise à jour qui définit la nouvelle valeur. Nous vous recommandons de vérifier d'abord que le trait accepte un attribut.
Exemple :
if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported { let _ = try await doorLockTraitTest.update { $0.setWrongCodeEntryLimit(3) } }