Bu kılavuz, iOS'te cihazlara ve cihaz meta verilerine erişme konusundan devam eder ve cihaz kontrolü ile erişimiyle ilgili ek örnekler sunar.
Buradaki örneklerin çoğunda kullanılan Matter
OnOffTrait
gibi belirli cihaz türlerini veya özellikleri kullanmak için bunların içe aktarılması gerekir:
import GoogleHomeSDK
import GoogleHomeTypes
Bir özelliğin komut destekleyip desteklemediğini kontrol etme
Bir komutun belirli bir cihazda desteklenip desteklenmediğini kontrol etmek için özellik düzeyinde supports
işlevini kullanın.
Örneğin, bir cihazın Açma/Kapama özelliği toggle
komutunu destekleyip desteklemediğini kontrol etmek için:
// 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") }
Cihaza komut gönderme
Komut göndermek, bir özellikten durum özelliği okumaya benzer. Cihazı açmak veya kapatmak için Google Home ekosistemi veri modelinde toggle()
olarak tanımlanan OnOffTrait
açma/kapatma komutunu kullanın. Bu yöntem, onOff
değeri true
ise false
olarak, false
ise true
olarak değiştirir:
// Calling a command on a trait. do { try await onOffTraitTest.toggle() } catch let error as HomeError { // Code for handling the exception }
Yürütme akışında bir sorun tespit edilirse komutlar istisna döndürebilir. Geliştirici olarak, bu istisnaları düzgün şekilde işlemek ve hataların düzeltilebildiği durumlarda kullanıcılara ayrıntılı bilgi sunmak için bir do-catch
bloğu kullanmanız gerekir. İşlenmeyen istisnalar, uygulama çalışma zamanını durdurur ve uygulamanızda kilitlenmelere neden olabilir.
Alternatif olarak, durumu açıkça ayarlamak için off()
veya on()
komutlarını kullanın:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let error as HomeError { // Code for handling the exception }
Durumu değiştirmek için bir komut gönderdikten sonra, komut tamamlandığında durumu Cihaz durumunu okuma bölümünde açıklandığı gibi okuyabilir ve uygulamanızda işleyebilirsiniz.
Parametrelerle komut gönderme
Bazı komutlar, OnOffTrait
veya LevelControlTrait
üzerindekiler gibi parametreler kullanabilir:
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 }
Bir özelliğin, bir özelliği destekleyip desteklemediğini kontrol etme
Bazı cihazlar Matter özelliğini destekleyebilir ancak belirli bir özelliği desteklemeyebilir. Örneğin, Cloud-to-cloud cihazı Matter ile eşlenmişse her Matter özelliğini desteklemeyebilir. Bu gibi durumları ele almak için, özelliğin belirli bir cihazda desteklenip desteklenmediğini kontrol etmek üzere özellik düzeyinde isSupported
özelliğini kullanın.
Örneğin, bir cihazın On/Off özelliği için onOff
özelliğini destekleyip desteklemediğini kontrol etmek için:
// 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!") }
Bazı özellikler, Matter spesifikasyonunda veya Cloud-to-cloud smart home şemasında boş değer atanabilir. Bu özellikler için, özellik tarafından döndürülen nil değerinin, cihazın bu değeri bildirmemesinden mi yoksa özelliğin değerinin gerçekten nil
olmasından mı kaynaklandığını belirleyebilirsiniz. Bunun için isSupported
özelliğine ek olarak isNullable
özelliğini kullanın:
// 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)" ) } } }
Özellikleri güncelleme
Belirli bir özelliğin değerini değiştirmek istiyorsanız ve özelliğin komutlarından hiçbiri bunu yapmıyorsa özellik, değerinin açıkça ayarlanmasını destekleyebilir.
Bir özelliğin değerinin değiştirilip değiştirilemeyeceği iki faktöre bağlıdır:
- Özellik yazılabilir mi?
- Özelliğin değeri, bir özellik komutu göndermenin yan etkisi olarak değişebilir mi?
Özellikler ve bunların nitelikleriyle ilgili referans belgelerinde bu bilgiler yer alır.
Bu nedenle, bir özelliğin değerinin nasıl değiştirileceğini belirleyen özellik kombinasyonları şunlardır:
Salt okunur ve diğer komutlardan etkilenmez. Bu, özelliğin değerinin değişmediği anlamına gelir. Örneğin,
currentPosition
SwitchTrait
özelliği.Salt okunur ve diğer komutlardan etkilenir. Bu, özelliğin değerinin yalnızca bir komut gönderilmesi sonucunda değişebileceği anlamına gelir. Örneğin,
LevelControlTrait
öğesinincurrentLevel
özelliği salt okunurdur ancak değerimoveToLevel
gibi komutlarla değiştirilebilir.Yazılabilir ve diğer komutlardan etkilenmez. Bu, özelliğin
update
işlevini kullanarak özelliğin değerini doğrudan değiştirebileceğiniz ancak özelliğin değerini etkileyecek herhangi bir komut olmadığı anlamına gelir. Örneğin,WrongCodeEntryLimit
DoorLockTrait
özelliği.Yazılabilir ve diğer komutlardan etkilenir. Bu, özelliğin
update
işlevini kullanarak özelliğin değerini doğrudan değiştirebileceğiniz ve komut gönderilmesi sonucunda özelliğin değerinin değişebileceği anlamına gelir. Örneğin,occupiedCoolingSetpoint
özelliğiThermostatTrait
setpointRaiseLower
komutuyla yazılabilir ve güncellenebilir.
Bir özelliğin değerini değiştirmek için güncelleme işlevini kullanma örneği
Bu örnekte, DoorLockTrait.wrongCodeEntryLimit
özelliğinin değerinin nasıl açıkça ayarlanacağı gösterilmektedir.
Bir özellik değerini ayarlamak için özelliğin
update
işlevini çağırın
ve yeni değeri ayarlayan bir güncelleme işlevi iletin. Özelliğin bir özelliği desteklediğini doğrulamanız iyi bir uygulamadır.
Örneğin:
if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported { let _ = try await doorLockTraitTest.update { $0.setWrongCodeEntryLimit(3) } }