Dieser Leitfaden setzt den Leitfaden Zugriff auf Geräte und Gerätemetadaten auf iOS fort und enthält zusätzliche Beispiele für die Gerätesteuerung und den Zugriff.
Wenn Sie bestimmte Gerätetypen oder Merkmale verwenden möchten, z. B. das Matter
OnOffTrait, das in vielen der hier aufgeführten Beispiele verwendet wird, müssen sie importiert werden:
import GoogleHomeSDK
import GoogleHomeTypes
Prüfen, ob ein Merkmal einen Befehl unterstützt
Mit der Funktion supports auf Merkmalsebene können Sie prüfen, ob ein Befehl für ein bestimmtes Gerät unterstützt wird.
So prüfen Sie beispielsweise, ob ein Gerät den Befehl des Merkmals „Ein/Aus“ unterstützt:
toggle
// 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") }
Befehl an Geräte senden
Das Senden eines Befehls ähnelt dem Lesen eines Statusattributs aus einem Merkmal. Verwenden Sie den
OnOffTrait
Befehl „Umschalten“, der im Datenmodell des Google Home-Ökosystems als toggle() definiert ist, um das Gerät ein- oder auszuschalten. Mit dieser Methode wird onOff in false geändert, wenn es true ist, oder in true, wenn es false ist:
// Calling a command on a trait. do { try await onOffTraitTest.toggle() } catch let _ as HomeError { // Code for handling the exception }
Befehle können eine Ausnahme zurückgeben, wenn ein Problem mit dem Ausführungsablauf festgestellt wird. Als Entwickler sollten Sie einen do-catch Block verwenden, um diese Ausnahmen ordnungsgemäß
zu verarbeiten und Nutzern detaillierte Informationen zu Fällen zu geben, in denen
die Fehler behoben werden können. Nicht behandelte Ausnahmen beenden die Laufzeit der App und können zu Abstürzen in Ihrer App führen.
Alternativ können Sie die Befehle off() oder on() verwenden, um den Status explizit festzulegen:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let _ as HomeError { // Code for handling the exception }
Nachdem Sie einen Befehl zum Ändern des Status gesendet haben, können Sie den Status lesen, wie unter Gerätestatus lesen beschrieben, um ihn in Ihrer App zu verarbeiten.
Befehl mit Parametern senden
Einige Befehle können Parameter verwenden, z. B. die Befehle des
OnOffTrait oder des Merkmals
LevelControlTrait:
offWithEffect
// Turn off the light using the DyingLight effect. do { try await onOffTraitTest.offWithEffect( effectIdentifier: Matter.OnOffTrait.EffectIdentifierEnum.dyingLight, effectVariant: 0 ) } catch let _ 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 _ as HomeError { // Code for handling the exception }
Prüfen, ob ein Merkmal ein Attribut unterstützt
Einige Geräte unterstützen möglicherweise ein Matter Merkmal, aber nicht ein
bestimmtes Attribut. Beispielsweise unterstützt ein Cloud-to-cloud Gerät, das
zugeordnet wurde, möglicherweise nicht alle
Matter Attribute.Matter Verwenden Sie in solchen Fällen die Eigenschaft isSupported auf Merkmalsebene, um zu prüfen, ob das Attribut für ein bestimmtes Gerät unterstützt wird.
So prüfen Sie beispielsweise, ob ein Gerät das Attribut
onOff
des Merkmals „Ein/Aus“ unterstützt:
// 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!") }
Einige Attribute sind in der Matter Spezifikation oder
dem Cloud-to-cloud smart home Schema nullable. Bei diesen Attributen können Sie mit isNullable zusätzlich zu isSupported feststellen, ob ein von dem Attribut zurückgegebenes nil darauf zurückzuführen ist, dass das Gerät diesen Wert nicht meldet, oder ob der Wert des Attributs tatsächlich nil ist:
// 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 \(String(describing: onOffTrait.attributes.startUpOnOff))" ) } } }
Merkmalattribute aktualisieren
Wenn Sie den Wert eines bestimmten Attributs ändern möchten und keiner der Befehle des Merkmals dies tut, unterstützt das Attribut möglicherweise das explizite Festlegen des Werts.
Ob der Wert eines Attributs geändert werden kann, hängt von zwei Faktoren ab:
- Ist das Attribut beschreibbar?
- Kann sich der Wert des Attributs als Nebeneffekt des Sendens eines Merkmalsbefehls ändern?
Diese Informationen finden Sie in der Referenzdokumentation für Merkmale und ihre Attribute.
Daher sind die Kombinationen von Eigenschaften, die bestimmen, wie der Wert eines Attributs geändert werden kann, folgende:
Schreibgeschützt und nicht von anderen Befehlen betroffen. Das bedeutet, dass sich der Wert des Attributs nicht ändert. Beispiel: Das
currentPositionAttribut desSwitchTrait.Schreibgeschützt und von anderen Befehlen betroffen. Das bedeutet, dass sich der Wert des Attributs nur durch das Senden eines Befehls ändern kann. Beispiel: Das
currentLevelAttribut desLevelControlTraitist schreibgeschützt, aber sein Wert kann durch Befehle wiemoveToLevelgeändert werden.Beschreibbar und nicht von anderen Befehlen betroffen. Das bedeutet, dass Sie den Wert des Attributs direkt mit der Funktion
updatedes Merkmals ändern können, aber es gibt keine Befehle, die sich auf den Wert des Attributs auswirken. Beispiel: DasWrongCodeEntryLimitAttribut desDoorLockTrait.Beschreibbar und von anderen Befehlen betroffen. Das bedeutet, dass Sie den Wert des Attributs direkt mit der Funktion
updatedes Merkmals ändern können und sich der Wert des Attributs durch das Senden eines Befehls ändern kann. Beispiel: DasoccupiedCoolingSetpointAttribut desThermostatTraitkann geschrieben, aber auch mit demsetpointRaiseLowerBefehl aktualisiert werden.
Beispiel für die Verwendung der Funktion „update“ zum Ändern des Werts eines Attributs
In diesem Beispiel wird gezeigt, wie Sie den Wert des
DoorLockTrait.wrongCodeEntryLimit Attributs explizit festlegen.
Rufen Sie die Funktion
updatedes Merkmals
auf und übergeben Sie ihr eine Update-Funktion, die den neuen Wert festlegt, um einen Attributwert festzulegen. Es empfiehlt sich, zuerst zu
prüfen,
ob das Merkmal ein Attribut unterstützt.
Beispiel:
if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported { let _ = try await doorLockTraitTest.update { $0.setWrongCodeEntryLimit(3) } }