iOS'te cihazları kontrol etme

Bu kılavuz, iOS'te cihazlara ve cihaz meta verilerine erişim başlıklı makaleden devam eder ve cihaz kontrolü ile erişimle ilgili ek örnekler sunar.

Buradaki örneklerin çoğunda kullanılan Matter OnOffTrait gibi belirli cihaz türlerini veya özelliklerini kullanmak için içe aktarmaları gerekir:

import GoogleHomeSDK
import GoogleHomeTypes

Bir özelliğin komutu destekleyip desteklemediğini kontrol etme

Bir komutun belirli bir cihazda desteklenip desteklenmediğini kontrol etmek için özellik düzeyindeki 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")
}

Bir cihaza komut gönderme

Komut gönderme, bir özellikten durum özelliğini okumaya benzer. Cihazı açmak veya kapatmak için OnOffTrait açma/kapatma komutunu kullanın. Bu komut, Google Home ekosistemi veri modelinde toggle() olarak tanımlanır. 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 bir şekilde işlemek için bir do-catch bloğu kullanmalı ve hataların işlem yapılabilir olduğu durumlarda kullanıcılara ayrıntılı bilgi sunmalısınız. İşlenmemiş 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 Cihaz durumunu okuma bölümünde açıklandığı gibi durumu okuyarak uygulamanızda kullanabilirsiniz.

Parametrelerle komut gönderme

Bazı komutlar, OnOffTrait veya LevelControlTrait'tekiler gibi parametreler kullanabilir:

// 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
}
// 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, Matter ile eşlenen bir Cloud-to-cloud cihaz, 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üzeyindeki isSupported mülkünü kullanın.

Örneğin, bir cihazın Açık/Kapalı özelliğinin 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 alabilir. Bu özelliklerde, isSupported'e ek olarak isNullable kullanarak özelliğin döndürdüğü nil değerinin cihazın bu değeri bildirmemesinden mi yoksa özelliğin değerinin aslında nil olmasından mı kaynaklandığını 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 \(onOffTrait.attributes.startUpOnOff)"
      )
    }
  }
}

Özellik özelliklerini güncelleme

Belirli bir özelliğin değerini değiştirmek istiyorsanız ve özelliğin hiçbir komutu 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?
  • Özellik komutu göndermenin yan etkisi olarak özelliğin değeri değişebilir mi?

Bu bilgiler, özellikler ve özelliklerine ilişkin referans dokümanlarında sağlanır.

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

Bir özelliğin değerini değiştirmek için update işlevinin kullanıldığı örnek

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 bu işleve yeni değeri ayarlayan bir güncelleme işlevi iletin. Öncelikle özelliğin bir özelliği destekleyip desteklemediğini doğrulamak iyi bir uygulamadır.

Örneğin:

if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported {
  let _ = try await doorLockTraitTest.update {
    $0.setWrongCodeEntryLimit(3)
  }
}