iOS'te cihazları kontrol etme

Bu kılavuz, iOS'te cihazlara ve cihaz meta verilerine erişme başlıklı makalenin devamı niteliğindedir 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çık/Kapalı özelliğinin 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

Bir komut göndermek, bir özellikten durum niteliğini 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ğerini true ise false olarak, false ise true olarak değiştirir:

// Calling a command on a trait.
do {
  try await onOffTraitTest.toggle()
} catch let _ as HomeError {
  // Code for handling the exception
}

Yürütme akışında bir sorun algılanırsa komutlar bir istisna döndürebilir. Geliştirici olarak, bu istisnaları düzgün şekilde işlemek ve hataların işlem yapılabilir olduğu durumlarda kullanıcılara ayrıntılı bilgi sunmak için do-catch bloğunu 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 _ as HomeError {
  // Code for handling the exception
}

Durumu değiştirmek için bir komut gönderdikten sonra, komut tamamlandığında Cihaz durumunu okuma bölümünde açıklandığı gibi durumu 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 _ 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
}

Bir özelliğin bir niteliği destekleyip desteklemediğini kontrol edin

Bazı cihazlar Matter özelliğini destekleyebilir, ancak belirli bir özelliği desteklemeyebilir. Örneğin, Matter ile eşlenen bir Cloud-to-cloud aygıtı her Matter özniteliğini desteklemeyebilir. Bu gibi durumları ele almak için, niteliğin belirli bir cihaz için desteklenip desteklenmediğini kontrol etmek üzere trait-level isSupported özelliğini kullanın.

Örneğin, bir cihazın Açık/Kapalı özelliğinin onOff özniteliğ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 öznitelikler için, öznitelik tarafından döndürülen nil değerinin, cihazın bu değeri bildirmemesinden mi kaynaklandığını, yoksa özniteliğin değerinin gerçekten nil olup olmadığını, isSupported öğesine ek olarak isNullable kullanarak belirleyebilirsiniz:

// 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))"
      )
    }
  }
}

Ö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 niteliklerine ilişkin referans dokümanlar bu bilgiyi sağlar.

Bu nedenle, bir özelliğin değerinin nasıl değiştirileceğini belirleyen özellik kombinasyonları şunlardır:

Bir özelliğin değerini değiştirmek için güncelleme işlevini kullanma örneği

Bu örnekte, DoorLockTrait.wrongCodeEntryLimit özelliği 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. Öncelikle ö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)
  }
}