Questa guida è la continuazione di Accesso ai dispositivi e ai metadati dei dispositivi su iOS e introduce altri esempi di controllo e accesso ai dispositivi.
Per utilizzare tipi o caratteristiche di dispositivi specifici, come Matter
OnOffTrait utilizzato in molti degli esempi qui riportati, è necessario importarli:
import GoogleHomeSDK
import GoogleHomeTypes
Verificare se una caratteristica supporta un comando
Utilizza la funzione supports a livello di caratteristica per verificare se un comando è supportato per un determinato dispositivo.
Ad esempio, per verificare se un dispositivo supporta il comando della caratteristica On/Off:
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") }
Invio di un comando a un dispositivo
L'invio di un comando è simile alla lettura di un attributo di stato da una caratteristica. Per
accendere o spegnere il dispositivo, utilizza il
OnOffTrait
comando Toggle, definito nel modello di dati dell'ecosistema Google Home
come toggle(). Questo metodo cambia onOff in false se è true o in true se è false:
// Calling a command on a trait. do { try await onOffTraitTest.toggle() } catch let _ as HomeError { // Code for handling the exception }
I comandi potrebbero restituire un'eccezione se viene rilevato un problema con il flusso di esecuzione. In qualità di sviluppatore, dovresti utilizzare un blocco do-catch per gestire correttamente
queste eccezioni e fornire agli utenti informazioni dettagliate sui casi in cui
gli errori sono azionabili. Le eccezioni non gestite interrompono il runtime dell'app e possono causare arresti anomali nell'app.
In alternativa, utilizza i comandi off() o on() per impostare esplicitamente lo stato:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let _ as HomeError { // Code for handling the exception }
Dopo aver inviato un comando per modificare lo stato, una volta completato, puoi leggere lo stato come descritto in Leggere lo stato di un dispositivo per gestirlo nella tua app.
Invio di un comando con parametri
Alcuni comandi possono utilizzare parametri, come quelli di
OnOffTrait o
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 }
Verificare se una caratteristica supporta un attributo
Alcuni dispositivi potrebbero supportare una Matter caratteristica, ma non un
attributo specifico. Ad esempio, un dispositivo Cloud-to-cloud che è stato
mappato a Matter potrebbe non supportare tutti gli attributi Matter. Per gestire questi casi, utilizza la proprietà isSupported a livello di caratteristica per verificare se l'attributo è supportato per un determinato dispositivo.
Ad esempio, per verificare se un dispositivo supporta l'attributo della caratteristica On/Off:
onOff
// 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!") }
Alcuni attributi sono nullabili nella specifica Matter o
nello schema Cloud-to-cloud smart home. Per questi attributi, puoi determinare se un nil restituito dall'attributo è dovuto al fatto che il dispositivo non segnala quel valore o se il valore dell'attributo è effettivamente nil, utilizzando isNullable oltre a 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 \(String(describing: onOffTrait.attributes.startUpOnOff))" ) } } }
Aggiornare gli attributi delle caratteristiche
Se vuoi modificare il valore di un determinato attributo e nessuno dei comandi della caratteristica lo fa, l'attributo potrebbe supportare l'impostazione esplicita del suo valore.
La possibilità di modificare il valore di un attributo dipende da due fattori:
- L'attributo è scrivibile?
- Il valore dell'attributo può cambiare come effetto collaterale dell'invio di un comando di caratteristica?
La documentazione di riferimento per le caratteristiche e i relativi attributi fornisce queste informazioni.
Pertanto, le combinazioni di proprietà che determinano la modalità di modifica del valore di un attributo sono:
Di sola lettura e non influenzate da altri comandi. Ciò significa che il valore dell'attributo non cambia. Ad esempio, l'attributo
currentPositiondiSwitchTrait.Di sola lettura e influenzate da altri comandi. Ciò significa che l'unico modo in cui il valore dell'attributo può cambiare è a seguito dell'invio di un comando. Ad esempio, l'
currentLevelattributo diLevelControlTraitè di sola lettura, ma il suo valore può essere modificato da comandi comemoveToLevel.Scrivibili e non influenzate da altri comandi. Ciò significa che puoi modificare direttamente il valore dell'attributo utilizzando la funzione
updatedella caratteristica, ma non esistono comandi che influiranno sul valore dell'attributo. Ad esempio, l'WrongCodeEntryLimitattributo diDoorLockTrait.Scrivibili e influenzate da altri comandi. Ciò significa che puoi modificare direttamente il valore dell'attributo utilizzando la funzione
updatedella caratteristica e il valore dell'attributo può cambiare a seguito dell'invio di un comando. Ad esempio, l'occupiedCoolingSetpointattributo diThermostatTraitpuò essere scritto, ma anche aggiornato con ilsetpointRaiseLowercomando.
Esempio di utilizzo della funzione di aggiornamento per modificare il valore di un attributo
Questo esempio mostra come impostare esplicitamente il valore dell'
DoorLockTrait.wrongCodeEntryLimit attributo.
Per impostare il valore dell'attributo, chiama la funzione
update del trait
e passale una funzione di aggiornamento che imposta il nuovo valore. È consigliabile verificare innanzitutto che la caratteristica supporti un attributo.
Ad esempio:
if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported { let _ = try await doorLockTraitTest.update { $0.setWrongCodeEntryLimit(3) } }