iOS için kapı zili cihazı kılavuzu

Kapı zili cihaz türü üç özellik kullanılarak uygulanır: PushAvStreamTransportTrait, push tabanlı protokolleri kullanarak ses ve video akışı aktarımını yönetir, WebRtcLiveViewTrait, canlı yayınları ve TalkBack'i kontrol etme olanağı sağlar ve CameraSnapshotTrait, önbelleğe alınmış önizleme anlık görüntüleri ve canlı anlık görüntü yakalama özellikleri sunar.

Herhangi bir özelliği kullanmadan veya özellikleri güncellemeye çalışmadan önce her zaman cihazın özellik ve komut desteğini kontrol edin. Daha fazla bilgi için iOScihazlarını kontrol etme başlıklı makaleyi inceleyin.

Home API'leri Cihaz Türü Özellikler Swift Örnek Uygulaması Kullanım Örneği

Kapı zili

GoogleDoorbellDeviceType

home.matter.6006.types.0113

Kapının dışındaki bir düğmeyle çalıştırılan ve sesli ve/veya görsel bir sinyal veren, kapının diğer tarafında bulunan bir kişinin dikkatini çekmek için kullanılan cihaz. Kapı zillerinde erişilebilir canlı yayınlar, iki yönlü konuşma veya algılama etkinlikleri bulunabilir.

Gerekli Özellikler
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Kapı zili

Cihaz hakkında temel bilgileri alma

   iOS için örnek uygulamada uygulandı   

BasicInformation özelliği; cihazın tedarikçi adı, tedarikçi kimliği, ürün kimliği, ürün adı (model bilgilerini içerir) ve yazılım sürümü gibi bilgileri içerir:

let vendorName = basicInfoTrait.attributes.vendorName!
let vendorID = basicInfoTrait.attributes.vendorID!
let productID = basicInfoTrait.attributes.productID!
let productName = basicInfoTrait.attributes.productName!
let softwareVersion = basicInfoTrait.attributes.softwareVersion!

Seri numarasını alma

   iOS için örnek uygulamada uygulandı   

Cihazın seri numarasını almak için ExtendedBasicInformation özelliğinin GetSerialNumber komutunu kullanın. Örnekte, seri numarasının serialNumber adlı bir değişkene kaydedilmesi gösterilmektedir:

// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait
let response = try await extendedBasicInformationTrait.getSerialNumber()
let serialNumber = response.serialNumber

Hızlı Yanıtlar

Hızlı Yanıtlar özelliği, kullanıcının kapı zili cihazına önceden tanımlanmış bir mesaj göndermesine olanak tanır.

Bu özellik yalnızca kapı zili cihazlarında kullanılabilir. Önceden tanımlanmış mesajların listesi, iş ortağı uygulamasında mevcuttur. Uygulama, bu mesajları kullanıcıya sunarak aralarından seçim yapmasını isteyebilir. Önceden tanımlanmış mesajlar kullanıcı tarafından düzenlenemez.

Hızlı Yanıtlar, PresetMessage özelliği aracılığıyla uygulanır.

Hazır mesaj çalma

Önceden ayarlanmış bir mesajı oynatmak için playPresetMessage yöntemini çağırın ve availablePhraseTypes özelliğinde bulunan dize değerlerinden birini iletin.


import GoogleHomeSDK
import GoogleHomeTypes

func playDoorbellPresetMessage(device: HomeDevice, phraseTypeString: String) async {
    // 1. Retrieve the GoogleDoorbellDeviceType helper on the device
    guard let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) else {
        print("This device is not a Google Doorbell or is currently uninitialized.")
        return
    }

    // 2. Extract the Google.PresetMessageTrait
    guard let presetMessageTrait = doorbellDeviceType.traits[Google.PresetMessageTrait.self] else {
        print("PresetMessageTrait is not supported on this device.")
        return
    }

    // 3. (Optional) Check available phrase types supported by the device
    if let availablePhrases = presetMessageTrait.attributes.availablePhraseTypes {
        let phraseTypeNames = availablePhrases.map { $0.phraseType }
        print("Supported quick response phrases: \(phraseTypeNames)")
    }

    // 4. Send the playPresetMessage command asynchronously
    do {
        try await presetMessageTrait.playPresetMessage(phraseType: phraseTypeString)
        print("Preset message successfully requested.")
    } catch {
        print("SDK error occurred playing preset message: \(error)")
    }
}

Konuşma dilini ayarlama

Konuşma dilini ayarlama

LocalizationConfiguration özelliğinin setActiveLocale yöntemini kullanarak cihazın etkin konuşma dilini belirli bir yerel ayara (örneğin, "en_US") ayarlayın.

// Setting the active language
// Assuming localizationConfigurationTrait: Matter.LocalizationConfigurationTrait
let selectedLocale = "en_US"
try await localizationConfigurationTrait.update {
    $0.setActiveLocale(selectedLocale)
}

Cihazın bulutla en son iletişim kurduğu zamanı alma

Cihazın bulutla en son ne zaman iletişim kurduğunu öğrenmek için ExtendedGeneralDiagnostics özelliğinin lastContactTimestamp özelliğini kullanın:

if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp {
  self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp))
}

Kamera montaj aparatı türü ayarları

Mount özelliği, kamera montaj ayarlarını ve durum bilgilerini içerir. Bağlama durumu, algılama türü ve bağlama türü adı gibi özellikleri okuyabilirsiniz. Ayrıca, varsayılan bağlama türü yapılandırmasını geçersiz kılmak için Mount özelliğini kullanabilirsiniz.

// 1. Get the Mount trait
guard let mountTrait = deviceType.traits[Google.MountTrait.self] else {
  print("Mount trait not supported or configured on this device.")
  return
}

// 2. Read the current mount state, detection type, and type name
let mountState         = mountTrait.attributes.mountState         // Type: Google.MountTrait.MountStateEnum?
let mountDetectionType = mountTrait.attributes.mountDetectionType // Type: Google.MountTrait.MountDetectionTypeEnum?
let mountTypeName      = mountTrait.attributes.mountTypeName      // Type: String?

// 3. Update the mount type override
try await mountTrait.update { mutableTrait in
  mutableTrait.setMountTypeOverride(.official)
}

Cihazın bağlantısını kontrol etme

Bazı cihazlar birden fazla cihaz türünü desteklediğinden, bir cihazın bağlantısı aslında cihaz türü düzeyinde kontrol edilir. Döndürülen durum, söz konusu cihazdaki tüm özelliklerin bağlantı durumlarının birleşimidir.

let doorbellConnectivity = doorbellDeviceType.metadata.sourceConnectivity.connectivityState

İnternet bağlantısı olmadığında karma cihaz türleri için partiallyOnline durumu görülebilir. Matter standart özellikleri, yerel yönlendirme nedeniyle hâlâ online olabilir ancak bulut tabanlı özellikler çevrimdışı olur.

Cihazın IP adresini alma

Cihazın IP adresini bulmak için GeneralDiagnosticsTrait'nin networkInterfaces özelliğini kullanın. Adresler Data nesneleri olarak döndürülür. Network çerçevesini kullanarak bunları standart IPv4 veya IPv6 dizeleri olarak biçimlendirebilirsiniz:

func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
  let interfaces = trait.attributes.networkInterfaces ?? []
  var ipAddresses: [String] = []

  for interface in interfaces {
    for data in interface.iPv4Addresses {
      if let ipv4 = IPv4Address(data) {
        ipAddresses.append(String(describing: ipv4))
      }
    }
    for data in interface.iPv6Addresses {
      if let ipv6 = IPv6Address(data) {
        ipAddresses.append(String(describing: ipv6))
      }
    }
  }

  return ipAddresses
}

Canlı yayın başlatma

   iOS için örnek uygulamada uygulandı   

Canlı yayın başlatmak için Oturum Açıklama Protokolü (SDP) dizesini WebRtcLiveViewTrait özelliğinin startLiveView(offerSdp:) yöntemine gönderin. Bu yöntem üç değer döndürür:

  • Oturumun SDP'si.
  • Saniye cinsinden oturum süresi.
  • Oturumu uzatmak veya sonlandırmak için kullanılabilecek oturum kimliği.
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
  do {
    // Sending StartLiveView command
    let response = try await liveViewTrait.startLiveView(
      offerSdp: offerSdp
    )
    // Received StartLiveView response
    return (
      answerSdp: response.answerSdp,
      mediaSessionId: response.mediaSessionId,
      liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
    )
  } catch {
    // Failed to send StartLiveView command
    throw error
  }
}

Canlı yayını uzatma

   iOS için örnek uygulamada uygulandı   

Canlı yayınların önceden ayarlanmış bir süresi vardır ve bu süre dolduğunda yayın sona erer. Etkin bir akışın süresini uzatmak için extendLiveView(mediaSessionId:optionalArgsProvider:) yöntemini kullanarak uzatma isteği gönderin:

public func extendLiveView(mediaSessionId: String) async throws {
  do {
    // Extending live view
    let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
  } catch {
    // Failed to extend live view
    throw error
  }
}

TalkBack'i başlatma ve durdurma

   iOS için örnek uygulamada uygulandı   

TalkBack'i başlatmak için WebRtcLiveViewTrait özelliğinin startTalkback(mediaSessionId:optionalArgsProvider:) yöntemini çağırın. Durdurmak için stopTalkback(mediaSessionId:) simgesini kullanın.

public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
  do {
    if isOn {
      try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
    } else {
      try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
    }
  } catch {
    throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
  }
}

Canlı yayını yönetme

   iOS için örnek uygulamada uygulandı   

Canlı yayın kalitesini ayarlamak, istemcinin görüntüleme bağlamına göre bant genişliği kullanımını optimize etmek için kullanışlıdır (ör. daha küçük bir önizleme karosu, tablo görünümü veya pencere içinde pencere modu gösterilirken daha düşük bir çözünürlüğe geçme).

WebRtcLiveView özelliğini kullanarak kaliteyi dinamik olarak değiştirmek, belirli bir istemcideki etkin canlı yayın oturumunun çözünürlüğünü yönetir. Bu, doğrudan cihaz üzerinde cihaz genelinde bant genişliği kullanım ayarı yapılandırmakla aynı şey değildir. Bu ayar, tüm eşzamanlı izleyicileri ve buluta kaydedilen geçmiş video kayıtlarının kalitesini etkiler.

Aşağıdaki örnekte, bir cihazın canlı yayın kalitesinin nasıl alınacağı ve güncelleneceği gösterilmektedir:

  • Desteklenen kalite seçeneklerini alma: Cihazın desteklediği kullanılabilir akış çözünürlüklerini alma Kod, desteklenen yayın kalitelerini supportedQualityHints özelliğini kullanarak QualityHint değerlerinin (ör. .sd, .hd, .fhd, .qhd veya .uhd) listesi olarak göstermek için WebRtcLiveView özelliğini sorgular.

  • Canlı yayın kalitesini değiştirme: Etkin canlı yayının çözünürlüğünü değiştirmek için seçili bir QualityHint uygulayın (ör. standart çözünürlükten yüksek çözünürlüğe geçiş). updateQualityHint işlevi, seçilen QualityHint yapılandırmasını etkin medya oturumuna uygulamak için WebRtcLiveView özelliğinin changeLiveViewQuality yöntemini kullanır.

public var supportedQualityHints: [Google.WebRtcLiveViewTrait.QualityHint] {
  return liveViewTrait?.attributes.supportedQualityHints ?? []
}

public func updateQualityHint(
  liveViewTrait: Google.WebRtcLiveViewTrait,
  hint: Google.WebRtcLiveViewTrait.QualityHint,
  mediaSessionId: String
) async {
  do {
    _ = try await liveViewTrait.changeLiveViewQuality(
      mediaSessionId: mediaSessionId,
      qualityHint: hint
    )
  } catch {
    // error
  }
}

Kayıt özelliğini etkinleştirme ve devre dışı bırakma

Kameranın kayıt özelliğini etkinleştirmek için PushAvStreamTransportTrait özelliğinin setTransportStatus(transportStatus:optionalArgsProvider:) yöntemine TransportStatusEnum.Active değerini iletin. Kayıt özelliğini devre dışı bırakmak için TransportStatusEnum.Inactive değerini iletin. Aşağıdaki örnekte, bu çağrıları kayıt özelliğini açıp kapatmak için Boolean kullanan tek bir çağrıda sarmalıyoruz:

public func toggleIsRecording(isOn: Bool) {
  self.uiState = .loading

  guard let pushAvStreamTransportTrait else {
    // PushAvStreamTransportTrait not found.
    return
  }
  Task {
    do {
      try await pushAvStreamTransportTrait.setTransportStatus(
        transportStatus: isOn ? .active : .inactive)
      if isOn {
        do {
          self.player = try self.createWebRtcPlayer()
        } catch {
          // Failed to initialize WebRtcPlayer
          self.uiState = .disconnected
          return
        }
        await self.player?.initialize()
        self.uiState = .live
      } else {
        self.player = nil
        self.uiState = .off
      }
    } catch {
      // Failed to toggle onOff
    }
  }
}

Kameranın kayıt özelliğini etkinleştirmek veya devre dışı bırakmak, kamera videosunu açmak veya kapatmakla aynıdır. Bir kameranın videosu açık olduğunda kayıt yapar (etkinlikler ve ilgili klipler için).

Kayıt özelliği devre dışı bırakıldığında (kamera videosu kapalıyken):

  • Kamera, connectivityState cihaz türüne göre çevrimiçi olarak görünmeye devam edebilir.
  • Canlı yayına erişilemez ve kamera herhangi bir bulut etkinliği algılamaz.

Kayıt özelliğinin etkin olup olmadığını kontrol etme

Bir kameranın kayıt özelliğinin etkin olup olmadığını belirlemek için herhangi bir bağlantının etkin olup olmadığını kontrol edin. Aşağıdaki örnekte, bu işlemi gerçekleştirmek için iki işlev tanımlanmıştır:

public func isDeviceRecording() -> Bool {
  guard let pushAvStreamTransportTrait else {
    // PushAvStreamTransportTrait not found.
    return false
  }
  guard
    let hasActiveConnection =
      pushAvStreamTransportTrait
      .attributes
      .currentConnections?
      .contains(where: { $0.transportStatus == .active })
  else {
    return false
  }
  return hasActiveConnection
}

Kamera anlık görüntülerini alma

   iOS için örnek uygulamada uygulandı   

Bir kameradan statik görüntü anlık görüntüleri almak için CameraSnapshot özelliğini kullanın. Bu anlık görüntüler çeşitli senaryolarda kullanışlıdır:

  • WebRTC canlı yayını yüklenirken kullanıcı arayüzünde yer tutucu karo olarak
  • Kullanıcı etkileşimi üzerine canlı yayına yükseltilen statik bir önizleme resmi olarak.
  • Özel Etkinlik Bölgeleri çizmek ve yapılandırmak için arka plan tuvali olarak.

CameraSnapshot özelliği, hızlı oluşturma için önbelleğe alınmış bir anlık görüntüye mi yoksa isteğe bağlı canlı bir anlık görüntüye mi ihtiyacınız olduğuna bağlı olarak anlık görüntüleri getirmenin iki yolunu sunar.

Önbelleğe alınmış önizleme anlık görüntüsü alma

Önizleme anlık görüntüsü, SDK'nın kamerayı uyandırmadan alabileceği önbelleğe alınmış bir resimdir. Bu, statik bir görüntü getirmenin en hızlı yöntemidir ve kamera genel bakış sayfaları veya kontrol paneli ızgaraları için idealdir.

Önizleme anlık görüntüsünü almak için preview_image_url özellik niteliğini okuyun:

guard let cameraSnapshotTrait = deviceType.traits[
  Google.CameraSnapshotTrait.self
] else {
  print("CameraSnapshot trait not supported on this device.")
  return
}

if let previewImageUrlString = cameraSnapshotTrait
  .attributes.preview_image_url,
   let url = URL(string: previewImageUrlString) {
  // Load the preview image from the URL
}

Kamera yapılandırmasına ve etkinliğine bağlı olarak önizleme URL'si, son video görüntülerinden (en son video parçasının ilk I-frame'i) oluşturulan önbelleğe alınmış bir resmi veya kamera tarafından düzenli olarak yüklenen bir anlık görüntüyü gösterir.

Google Home bulutu, görüntünün güncelliğini belirtmek için sunulan JPEG/PNG görüntüsüne UTC biçiminde bir X-Home-Image-Captured-At başlığı yerleştirir. Anlık görüntünün yaşını bir uygulamada görüntülemek için bu üstbilgiyi istemci tarafında ayrıştırabilirsiniz.

İstediğiniz zaman canlı anlık görüntü alma

Kameranın mevcut canlı görünümünü gerektiren kullanıcı yolculukları (ör. Etkinlik Bölgeleri'ni ayarlama) için canlı anlık görüntü isteyebilirsiniz. Canlı anlık görüntü tetiklendiğinde kamera uyanır, yeni bir kare yakalar ve bunu buluta yükler.

Canlı anlık görüntü istemek için getLiveSnapshot() komutunu kullanın:

do {
  let response = try await cameraSnapshotTrait.getLiveSnapshot()
  let snapshotUrlString = response.snapshot_url

  if let url = URL(string: snapshotUrlString) {
    // Load the live snapshot image from the URL
  }
} catch {
  print("Failed to get live snapshot: \(error)")
}

Anlık görüntü isteklerinin kimliğini doğrulama

   iOS için örnek uygulamada uygulandı   

Tüm anlık görüntü URL'leri güvenli medyaya işaret eder ve Home API'leri v2 kapsamı için OAuth 2.0 jetonu gerektirir. Resimleri indirip oluşturmak için OAuth jetonunun, HTTP isteğinizin Authorization üstbilgisine hamiline ait jeton olarak eklenmesi gerekir.

Aşağıdaki örnekte, anlık görüntü indirmek için güvenli bir ağ isteğinin nasıl yapılandırılacağı gösterilmektedir:

import UIKit

func loadSnapshotImage(from url: URL, home: Home) async -> UIImage? {
  do {
    // 1. Retrieve the OAuth access token from the Home APIs SDK
    let (accessToken, _) = try await home.permissions.authorization()

    // 2. Configure the HTTP GET request with the Bearer token
    var request = URLRequest(url: url)
    request.setValue(
      "Bearer \(accessToken)",
      forHTTPHeaderField: "Authorization"
    )

    // 3. Fetch the image data
    let (data, _) = try await URLSession.shared.data(for: request)
    return UIImage(data: data)
  } catch {
    print("Error loading snapshot image: \(error)")
    return nil
  }
}

Pil ayarları

Home API'leri aracılığıyla çeşitli pil ayarları kontrol edilebilir.

Pil kullanımı tercihini ayarlama

Enerji dengesini ayarlayarak bir cihazın pil ömrü ile performansı arasındaki dengeyi yapılandırabilirsiniz. "Genişletilmiş", "Dengeli" ve "Performans" gibi farklı pil profilleri oluşturabilir ve bunlar arasında geçiş yapabilirsiniz.

Bu özellik, EnergyPreference özelliğinin currentEnergyBalance özelliği güncellenerek uygulanır. Özellik, cihazın energyBalances listesinde tanımlanan belirli bir profile karşılık gelen bir tam sayı dizini kabul eder (ör. EXTENDED için 0, BALANCED için 1 ve PERFORMANCE için 2).

currentEnergyBalance için null değeri, cihazın özel profil kullandığını gösterir. Bu, salt okunur bir durumdur.

Aşağıda, currentEnergyBalance özelliğinin kullanacağı bir yapı örneği ve ardından özelliği kullanan gerçek kod snippet'i gösterilmektedir.

// Example energyBalances list
{
  "energy_balances": [
    {
      "step": 0,
      "label": "EXTENDED"
    },
    {
      "step": 50,
      "label": "BALANCED"
    },
    {
      "step": 100,
      "label": "PERFORMANCE"
    }
  ]
}
private func setBatteryUsage(to option: UInt8) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentEnergyBalance(option)
  }
}

Otomatik pil tasarrufunu açma

   iOS için örnek uygulamada uygulandı   

Bu özelliği yapılandırmak için EnergyPreference özelliğinin currentLowPowerModeSensitivity özelliğini güncelleyin. Bu özellik, hassasiyet düzeyini seçmek için bir dizin kullanır. 0 genellikle Disabled, 1 ise Enabled veya Automatic anlamına gelir.

private func setAutoBatterySaver(to value: Bool) async throws {
  _ = try await energyPreferenceTrait.update {
    $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0)
  }
}

Pil şarj durumunu alma

   iOS için örnek uygulamada uygulandı   

Cihazın mevcut şarj durumunu (şarj oluyor, tamamen şarj oldu veya şarj olmuyor) öğrenmek için PowerSource özelliğinin batChargeState özelliğini kullanın.

self.chargingState = powerSourceTrait.attributes.batChargeState

var description: String
switch self.chargingState {
case .isCharging:
  description = "Charging"
case .isAtFullCharge:
  description = "Full"
case .isNotCharging:
  description = "Not Charging"
default:
  description = "Unknown"
}

Pil seviyesini öğrenme

Mevcut pil seviyesini öğrenmek için PowerSource özelliğinin batChargeLevel özelliğini kullanın. Seviye OK, Warning (düşük) veya Critical olabilir.

self.batteryLevel = powerSourceTrait.attributes.batChargeLevel

var description: String
switch self.batteryLevel {
case .ok:
  description = "OK"
case .warning:
  description = "Warning"
case .critical:
  description = "Critical"
default:
  description = "Unknown"
}

Güç kaynağını alma

Cihazın kullandığı güç kaynağını belirlemek için PowerSource özelliğinin BatPresent ve wiredPresent özelliklerini kullanın.

if powerSourceTrait.attributes.wiredPresent ?? false {
  self.powerSourceType = .wired
} else if powerSourceTrait.attributes.batPresent ?? false {
  self.powerSourceType = .battery
} else {
  self.powerSourceType = nil
}

Pilin değiştirilmesi gerekip gerekmediğini kontrol etme

batReplaceability özelliği, pilin değiştirilemez, kullanıcı tarafından değiştirilebilir veya fabrika tarafından değiştirilebilir olup olmadığını gösterir.

Pil değiştirilebiliyorsa PowerSource özelliğinin batReplacementNeeded özelliği, pilin değiştirilmesi gerekip gerekmediğini belirtir.

// Get the battery replacement status
var batteryStatus = powerSourceTrait.attributes.batReplacementNeeded

if batteryStatus {
  print("Replace the battery.")
}

Pil kullanıcı tarafından değiştirilebiliyorsa batReplacementDescription, form faktörü, kimyasal yapısı ve tercih edilen üretici gibi bilgileri de içerecek şekilde pili tanımlar.

Ses ayarları

Home API'leri aracılığıyla çeşitli ses ayarları kontrol edilebilir.

Mikrofonu açma veya kapatma

Cihazın mikrofonunu açmak veya kapatmak için yerleşik setMicrophoneMuted işlevini kullanarak CameraAvStreamManagementTrait özelliğinin microphoneMuted özelliğini güncelleyin:

// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

Ses kaydını açma veya kapatma

Cihazda ses kaydını etkinleştirmek veya devre dışı bırakmak için yerleşik setRecordingMicrophoneMuted işlevini kullanarak CameraAvStreamManagementTrait özelliğinin recordingMicrophoneMuted özelliğini güncelleyin:

// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setRecordingMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

Hoparlör ses seviyesini ayarlama

Cihazın hoparlör ses seviyesini ayarlamak için yerleşik setSpeakerVolumeLevel işlevini kullanarak CameraAvStreamManagementTrait özelliğinin speakerVolumeLevel özelliğini güncelleyin:

// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setSpeakerVolumeLevel(value)
    }
  } catch {
    // Error
  }
}

Etkinlik bölgesi ayarları

   iOS için örnek uygulamada uygulandı   

ZoneManagement özelliği, kamera ve kapı zili cihazlarında özel ilgi alanlarını (etkinlik bölgeleri) yönetmek için bir arayüz sağlar. Bu bölgeler, etkinlik algılamayı (ör. kişi veya araç hareketi) cihazın görüş alanındaki belirli alanlara göre filtrelemek için kullanılır.

Etkinlik bölgeleri, kullanıcı tarafından bir iş ortağı uygulamasında yapılandırılır ve kullanıcının kameranın görüş alanındaki belirli alanlar üzerinde bölgeler çizmesine olanak tanır. Kullanıcı tarafından tanımlanan bu bölgeler daha sonra bu özelliğin kullandığı yapılara dönüştürülür. Etkinlik Bölgeleri'nin işleyiş şekli hakkında daha fazla bilgi için Etkinlik Bölgeleri'ni ayarlama ve kullanma başlıklı makaleyi inceleyin.

Etkinlik bölgeleri genellikle 2D Kartezyen koordinatları kullanılarak tanımlanır. Bu özellik, köşeler için TwoDCartesianVertexStruct ve bölge tanımı (ad, köşeler, renk ve kullanım) için TwoDCartesianZoneStruct sağlar.

Etkinlik Bölgeleri'ni kontrol etme

Etkinlik bölgelerini görüntülemek için ZoneManagement özelliğinin zones özelliğini kontrol edin.

let zoneManagementTrait: Google.ZoneManagementTrait

self.zones = zoneManagementTrait.attributes.zones ?? []

Etkinlik Bölgesi ekleme

Yeni bir bölge oluşturmak için createTwoDCartesianZone komutunu kullanın. Bu komut, bölgenin adını, köşelerini, rengini ve kullanımını tanımlayan bir TwoDCartesianZoneStruct alır.

Aşağıdaki örnekte, "Ön Veranda" adlı, dört köşeli, somon renginde (#F439A0) ve hareket algılama için kullanılan bir bölgenin nasıl oluşturulacağı gösterilmektedir.

import GoogleHomeSDK
import GoogleHomeTypes

func createFrontPorchZone(trait: Google.ZoneManagementTrait) async {
  // 1. Define the vertices for the zone (2D Cartesian coordinates)
  // Values are UInt16, typically scaled to the device's twoDCartesianMax.
  let vertices = [
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048),
    Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090)
  ]

  // 2. Define the zone structure using the given SDK struct
  let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct(
    name: "Front Porch",
    use: [.motion], // ZoneUseEnum.motion
    vertices: vertices,
    // Color is a hex string (for example, Salmon/Pink)
    color: "#F439A0"
  )

  do {
    // 3. Execute the raw command to add the zone to the device
    // This returns the created zone's ID (UInt16).
    var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone)
  } catch {
    // Error
  }
}

Etkinlik Bölgesi'ni güncelleme

Mevcut bir bölgeyi güncellemek için updateTwoDCartesianZone komutunu kullanın. Bu komut için zoneId ve güncellenmiş TwoDCartesianZoneStruct gerekir.

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16
let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct

do {
  _ = try await zoneManagementTrait.updateTwoDCartesianZone(
        zoneID: zoneID, zone: zone)
} catch {
  // Error
}

Etkinlik Bölgesi'ni silme

Bir bölgeyi kaldırmak için belirli bir zoneId ile removeZone komutunu kullanın.

let zoneManagementTrait: Google.ZoneManagementTrait
let zoneID: UInt16

do {
  _ = try await zoneManagementTrait.removeZone(zoneID: zoneID)
} catch {
  // Error
}

Ses Etkinliği Tetikleyicileri

AvStreamAnalysis özelliği, kamera ve kapı zili cihazlarında olay algılama tetikleyicilerini yönetmek için bir arayüz sağlar. Görüntü tabanlı tetikleyiciler (ör. insanlar veya araçlar) bölgeye özel olabilirken sesle ilgili tetikleyiciler genellikle cihaz düzeyinde yapılandırmalardır.

EventTriggerTypeEnum ile ses algılama için aşağıdaki tetikleyici türleri kullanılabilir:

Mod Enum değeri Açıklama
Ses Sound Genel ses algılama.
Birisi konuşuyor PersonTalking Konuşmayı algılar.
Köpek havlaması DogBark Köpek seslerini algılar.
Cam kırılması GlassBreak Cam kırılma sesini algılar.
Duman alarmı SmokeAlarm Genellikle T3 sesli kalıbıyla (üç kısa bip sesi ve ardından bir duraklama) tanınan duman alarmlarını algılar.
Karbonmonoksit alarmı CoAlarm Genellikle T4 ses deseniyle (dört kısa bip sesi ve ardından bir duraklama) tanınan karbonmonoksit (CO) alarmlarını algılar.

Ses algılama durumunu kontrol etme

Ses algılamanın mevcut durumunu kullanıcıya göstermek için cihazın neleri desteklediğini ve cihaz donanımının neleri etkinleştirdiğini kontrol etmeniz gerekir. Kontrol edilecek iki özellik şunlardır:

iOS geliştirmede, bu özellikleri okumak için genellikle cihazdan AvStreamAnalysis özelliğine erişirsiniz.

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait

let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? []
let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? []

let eventTriggers [EventTrigger] = []
for trigger in possibleEventTriggers {
  self.eventTriggers.append(
    EventTrigger(
      id: trigger,
      enabled: enabledEventTriggers.contains(trigger)
    )
  )
}

Etkin tetikleyici grubunu güncelleme

Etkin tetikleyici grubunu güncellemek için EventTriggerEnablement yapılarının listesini alan SetOrUpdateEventDetectionTriggers komutunu kullanın.

// Example struct to store event triggers
public struct EventTrigger: Equatable {
  public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum
  public var enabled: Bool
}

let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait
let eventTriggers: [EventTrigger]

let enabledEventTriggers = eventTriggers.map {
  Google.AvStreamAnalysisTrait.EventTriggerEnablement(
    eventTriggerType: $0.id,
    enablementStatus: $0.enabled ? .enabled : .disabled
  )
}

try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers(
  eventTriggerEnablements: enabledEventTriggers
)

Kayıt modları

   iOS için örnek uygulamada uygulandı   

RecordingMode özelliği, kamera ve kapı zili cihazlarında video ve görüntü kaydetme davranışını yönetmek için bir arayüz sağlar. Kullanıcılar kesintisiz kayıt, etkinliğe dayalı kayıt veya kaydı tamamen devre dışı bırakma (yalnızca canlı görüntüleme) seçenekleri arasından tercih yapabilir.

RecordingModeEnum, kullanılabilir kayıt stratejilerini tanımlar:

Mod Enum değeri Açıklama
Devre dışı Disabled Kayıt tamamen devre dışı bırakıldıysa. Genellikle eski cihazlar tarafından kullanılır.
CVR (Kesintisiz Video Kaydı) Cvr Video 7/24 kaydedilir. Abonelik gerektirir (ör. Google Home Premium).
EDK (Etkinliğe Dayalı Kayıt) Ebr Kayıt, etkinlikler (kişi, hareket) tarafından tetiklenir. Video uzunluğu, etkinliğin süresine ve aboneliğe bağlıdır.
ETR (Etkinlikle Tetiklenen Kayıt) Etr Etkinlikler tarafından tetiklenen kısa önizleme kaydı (ör. 10 saniye).
Live View LiveView Kayıt devre dışı bırakılır ancak kullanıcılar canlı yayına erişmeye devam edebilir.
Sabit Görüntüler Images Olaylar gerçekleştiğinde video yerine anlık görüntüler kaydedilir.

Kayıt modlarını kontrol etme

Mevcut kayıt yapılandırmasını görüntülemek için RecordingMode özelliğinin niteliklerini kontrol edin:

// Example struct to store recording modes.
public struct RecordingMode: Hashable {
  public let id: UInt8
  public let mode: Google.RecordingModeTrait.RecordingModeEnum
}

let recordingModeTrait: Google.RecordingModeTrait

if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes,
   let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes,
   let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode {

  var recordingModes: [RecordingMode] = []

  for recordingModeId in availableRecordingModes {
    guard Int(recordingModeId) < supportedRecordingModes.count,
          Int(recordingModeId) >= 0 else {
      // Out of bounds error
    }

    recordingModes.append(
      RecordingMode(
        id: recordingModeId,
        mode: supportedRecordingModes[Int(recordingModeId)].recordingMode,
      )
    )
  }
}

Kayıt modunu değiştirme

Güncellemeden önce, supportedRecordingModes özelliğinden seçilen dizinin availableRecordingModes özelliğinde bulunduğundan emin olun.

Seçilen modu güncellemek için setSelectedRecordingMode işlevini kullanın ve seçilen modun dizinini iletin:

let recordingModeTrait: Google.RecordingModeTrait
let recordingModeID: UInt8

_ = try await recordingModeTrait.update {
  $0.setSelectedRecordingMode(recordingModeID)
}

Diğer ayarlar

Home API'leri aracılığıyla çeşitli ayarlar kontrol edilebilir.

Gece görüşünü açma veya kapatma

Kameranın gece görüşünü açmak veya kapatmak için yerleşik setNightVision işlevini kullanarak CameraAvStreamManagementTrait özelliğinin nightVision özelliğini güncellemek için TriStateAutoEnum kullanın:

// Turn night vision on or off
func setNightVision(
  to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setNightVision(value)
    }
  } catch {
    // Error
  }
}

Durum LED'inin parlaklığını değiştirme

Durum LED'inin parlaklığını değiştirmek için yerleşik setStatusLightBrightness işlevini kullanarak CameraAvStreamManagementTrait özelliğinin statusLightBrightness özelliğini güncellemek için ThreeLevelAutoEnum kullanın:

// Set the LED brightness
func setStatusLightBrightness(
  to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setStatusLightBrightness(value)
    }
  } catch {
    // Error
  }
}

Kamera görüntü alanını değiştirme

Kamera görüntü alanı, Nest kamera videosunu yakınlaştırma ve iyileştirme destek makalesinde açıklanan yakınlaştırma ve kırpma özelliğiyle aynıdır.

Görüntü alanı, görüntü alanının koordinatları olarak kullanılan dört değer içeren bir ViewportStruct içinde tanımlanır. Koordinatlar şu şekilde tanımlanır:

(x1,y1) -- (x2,y1)
   |          |
(x1,y2) -- (x2,y2)

ViewportStruct değerlerinin belirlenmesi, uygulamanın kullanıcı arayüzüne ve kamera uygulamasına bağlıdır. En temel düzeyde, kamera videosunun görüntü alanını ayarlamak için yerleşik setViewport işlevini kullanarak CameraAvStreamManagementTrait özelliğinin viewport özelliğini ViewportStruct ile güncelleyin.

func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {

  let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
    x1: x1,
    y1: y1,
    x2: x2,
    y2: y2
  )

  Task {
    do {
      try await cameraAvStreamManagementTrait.update {
        $0.setViewport(viewport)
      }
    } catch {
      // Error
    }
  }

}

TransportOptionsStruct oluşturma

Bazı ayarlar için TransportOptionsStruct içindeki özelliklerde değişiklik yapılması gerekir. Bu değişiklikler daha sonra akış bağlantısının aktarım seçeneklerine iletilir. Swift için bu yapının, özellikler güncellenmeden önce oluşturulması gerekir.

Aşağıdaki ayar değişiklikleriyle kullanılacak yapıyı oluşturmak için bu yardımcı işlevi kullanın:

func getTransportOptions(
  transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
  wakeUpSensitivity: UInt8?,
  maxEventLength: UInt32?
) async throws
  -> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{

  var newMotionTimeControl:
    Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
  if let maxEventLength {
    guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
      throw HomeError.failedPrecondition(
        // Error - cannot update max event length without motion time control
    }
    newMotionTimeControl =
      Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
        initialDuration: motionTimeControl.initialDuration,
        augmentationDuration: motionTimeControl.augmentationDuration,
        maxDuration: maxEventLength,
        blindDuration: motionTimeControl.blindDuration
      )
  }

  return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: nil,
    audioStreamID: nil,
    tlsEndpointID: transportOptions.tlsEndpointID,
    url: transportOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
      triggerType: .motion,
      motionZones: nil,
      motionSensitivity: wakeUpSensitivity,
      motionTimeControl: newMotionTimeControl,
      maxPreRollLen: nil
    ),
    ingestMethod: .cmafIngest,
    containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
      containerType: .cmaf,
      cmafContainerOptions: nil
    ),
    expiryTime: nil
  )
}

private func getRecordingConnection() async throws
  -> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
  guard let pushAvStreamTransportTrait else {
    // Error - PushAvStreamTransport trait not available
    return nil
  }

  let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

  for connection in connections {
    guard let transportOptions = connection.transportOptions,
      transportOptions.streamUsage == .recording
    else {
      continue
    }

    return connection
  }

  return nil
}

Analizleri etkinleştirme veya devre dışı bırakma

Her cihaz, Google Home bulutuna ayrıntılı analiz verileri göndermeyi ayrı ayrı etkinleştirebilir (Home API'leri için Cloud Monitoring bölümüne bakın).

Bir cihaz için analizleri etkinleştirmek istiyorsanız ExtendedGeneralDiagnosticsTrait öğesinin analyticsEnabled mülkünü true olarak ayarlayın. analyticsEnabled ayarını yaptığınızda başka bir özellik olan logUploadEnabled otomatik olarak true değerine ayarlanır. Bu sayede analiz günlüğü dosyaları Google Home bulutuna yüklenebilir.

// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(true)
}

// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
  $0.setAnalyticsEnabled(false)
}

Aktarım ve kayıt yapılandırmaları

Bu bölümde, kamera görüntü akışı kalitesi ve etkinlik tetiklemeyle ilgili ayarlar ele alınmaktadır. Bu ayarlar PushAvStreamTransport özelliği tarafından yönetilir.

Taşıma ayarlarını okuma

Bu bölümde, bir kamera veya kapı zili cihazından mevcut yapılandırmanın nasıl alınacağı gösterilmektedir. PushAvStreamTransport özelliğini getirir, kayıt için kullanılan belirli bağlantıyı bulur ve ardından bant genişliği kalitesi, uyanma hassasiyeti ve maksimum etkinlik uzunluğu için mevcut değerleri ayıklar.

// Assuming access to
// var pushAvStreamTransportTrait: Google.PushAvStreamTransportTrait
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

// Locate the connection designated for recording
let recordingConnection = connections.first { connection in
    guard let transportOptions = connection.transportOptions else { return false }
    return transportOptions.streamUsage == .recording
}

let options = recordingConnection?.transportOptions

// 1. Bandwidth Quality (Video Stream ID)
let videoStreamId = options?.videoStreamID

// 2. Wake-up Sensitivity (Motion Sensitivity)
let wakeUpSensitivity = options?.triggerOptions.motionSensitivity

// 3. Max Event Length (Motion Trigger Time Control)
let maxEventLength = options?.triggerOptions.motionTimeControl?.maxDuration

Taşıma ayarlarını güncelleme

Bu bölümde, taşıma ayarlarının nasıl değiştirileceği gösterilmektedir. Yeni değerleri içeren yeni bir TransportOptionsStruct oluşturur ve ardından bu güncellenmiş ayarları cihaza geri göndermek için modifyPushTransport komutunu kullanarak önceki adımda bulunan kayıt bağlantısına uygular.

Bu ayarları değiştirmek için TransportOptionsStruct ile modifyPushTransport komutunu kullanın.

// Example: Updating to Max Quality and 30s duration
let currentOptions = recordingConnection!.transportOptions!
let newOptions = Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: 2, // Max Quality
    tlsEndpointID: currentOptions.tlsEndpointID,
    url: currentOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
        triggerType: .motion,
        motionSensitivity: 5, // Medium
        motionTimeControl: Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
            initialDuration: currentOptions.triggerOptions.motionTimeControl?.initialDuration ?? 10,
            augmentationDuration: currentOptions.triggerOptions.motionTimeControl?.augmentationDuration ?? 5,
            maxDuration: 30,
            blindDuration: currentOptions.triggerOptions.motionTimeControl?.blindDuration ?? 0
        )
    ),
    ingestMethod: currentOptions.ingestMethod,
    containerOptions: currentOptions.containerOptions
)

try await pushAvStreamTransportTrait.modifyPushTransport(
    connectionID: recordingConnection!.connectionID,
    transportOptions: newOptions
)

Bant genişliği kalitesini belirleme

TransportOptionsStruct öğesinin videoStreamId özelliği, belirli bir video akışı yapılandırmasına karşılık gelir.

Desteklenen video akışlarını almak için VideoStreamStructs listesi olan allocatedVideoStreams özelliğine bakın. özelliğinden alınır.CameraAvStreamManagement

Cihazın uyandırma hassasiyetini ayarlama

TransportTriggerOptionsStruct öğesinin motionSensitivity özelliği aşağıdaki değerlere karşılık gelir:

Şirket Değer (UInt8)
Düşük 1
Orta 5
Yüksek 10

Maksimum etkinlik uzunluğunu ayarlama

TransportMotionTriggerTimeControlStruct öğesinin maxDuration özelliği, aşağıdaki UInt32 sürelerine (saniye cinsinden) karşılık gelir:

  • 10, 15, 30, 60, 120, 180

Zil ayarları

Çeşitli kapı zili ayarları, Home API'leri aracılığıyla kontrol edilebilir.

Zil sesini değiştirme

Kapı zili sesini değiştirmek için öncelikle ChimeTrait özelliğinin installedChimeSounds özelliğini kullanarak cihazda yüklü olan zil seslerinin listesini alın:

doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
  return chimeSound.chimeID, chimeSound.name
}

Ardından, yerleşik setSelectedChime işlevini kullanarak ChimeTrait özelliğinin selectedChime özelliğini güncelleyin:

func setDoorbellChime(chimeID: UInt8) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setSelectedChime(chimeID)
    }
  } catch {
    // Error
  }
}

Harici zil kullanma

   iOS için örnek uygulamada uygulandı   

Kapı zili, evin içine monte edilmiş mekanik zil gibi harici bir zil kullanacak şekilde yapılandırılabilir. Harici zilin zarar görmesini önlemek için bu ayar kapı zili kurulumu sırasında yapılandırılmalıdır.

Ne tür bir harici zil takıldığını belirtmek için yerleşik setExternalChime işlevini kullanarak ChimeTrait özelliğinin externalChime özelliğini güncellemek için ExternalChimeType kullanın:

// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setExternalChime(value)
    }
  } catch {
    // Error
  }
}

Harici zil süresini değiştirme

Harici zilin çalma süresi (saniye cinsinden) Home API'leri üzerinden yapılandırılabilir. Harici zil, zil süresini destekliyorsa kullanıcı bunu yapılandırmak isteyebilir.

Burada ayarlanan değer, harici zilin kendi özelliklerine ve önerilen zil süresine bağlıdır.

Harici zil süresini değiştirmek için yerleşik setExternalChimeDurationSeconds işlevini kullanarak ChimeTrait özelliğinin externalChimeDurationSeconds özelliğini güncelleyin:

// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
  do {
    _ = try await doorbellChimeTrait.update {
      $0.setExternalChimeDuration(value)
    }
  } catch {
    // Error
  }
}

Zil teması etkinleştirme

   iOS için örnek uygulamada uygulandı   

Bazı kapı zillerinin zil sesleri, kullanıcılara yalnızca sınırlı bir süre için sunulabilir. Örneğin, tatillere özel zil sesleri. Bunlara zil temaları denir.

Bir kullanıcı için hangi zil temalarının kullanılabildiğini görmek istiyorsanız zaman kutusu filtresi oluşturun ve bu filtreyi kullanarak ChimeThemes özelliğindeki getAvailableThemes komutunun sonuçlarını filtreleyin. Bu komut, tema adları da dahil olmak üzere kullanılabilir temaların listesini döndürür.

Aşağıdaki örnekte, listenin nasıl filtreleneceği gösterilmektedir. Geçerli saat, temanın başlangıç ve bitiş saatleri (sırasıyla startTimeSeconds ve endTimeSeconds değerleri) içindeyse tema etkin olarak kabul edilir. Başlangıç zamanı ayarlanmamışsa başlangıçtan itibaren etkin olduğu kabul edilir. Bitiş zamanı ayarlanmazsa süresiz olarak etkin kalmaya devam eder. İkisi de yoksa tema her zaman etkindir.

let chimeThemes = try await chimeThemeTrait.getAvailableThemes().themes

if !chimeThemes.isEmpty {
  var chimeThemeSettings = []
  for chimeTheme in chimeThemes {
    let currentDateTime = UInt64(Date().timeIntervalSince1970)

    // Only show chime themes that are active.
    if chimeTheme.startTimeSeconds ?? 0 &lt;= currentDateTime
      &amp;&amp; chimeTheme.endTimeSeconds ?? UInt64.max &gt;= currentDateTime
    {
      self.chimeThemeSettings.append(chimeTheme.name)
    }
  }
}

İstediğiniz temanın adını (ör. Christmas) öğrendikten sonra ChimeThemes ChimeThemes özelliğindeki setSelectedTimeboxedThemeName() işlevini kullanarak temayı seçebilirsiniz.

private func setChimeTheme(to value: String) async throws {
  _ = try await chimeThemeTrait.update {
    $0.setSelectedTimeboxedThemeName(value)
  }
}

Ziyaretçi anonsu ayarları

Home API'lerin VisitorAnnouncement özelliğini kullanarak kapı zilleri için ziyaretçi anonsu ayarlarını sorgulayabilir ve yönetebilirsiniz. Bu özellik, birisi kapı zilini çaldığında ziyaretçinin varlığının Google akıllı hoparlörlerinde veya ekranlarında duyurulup duyurulmayacağını kontrol eder.

Aşağıdaki örnekte, ziyaretçi anonslarının etkin olup olmadığının nasıl kontrol edileceği ve bu ayarın nasıl güncelleneceği gösterilmektedir:

let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled

let value: Bool
_ = try await self.visitorAnnouncementTrait?.update {
  $0.setVisitorAnnouncementsEnabled(value)
}

Cihazı kullanımdan kaldırma

Kapı zilini bir yapıdan kaldırmak için device.decommission() yöntemini çağırın. Kullanımdan kaldırma işlemi, kullanıcıya Google tarafından yönetilen bir onay ekranı gösterir. Bu ekranda, kaydedilen tüm 24/7 video geçmişi, olay geçmişi, klipler ve tanıdık yüz kitaplığı verilerinin yapı genelinde kalıcı olarak silineceği uyarısı yer alır.

Ayrıntılı talimatlar ve kod örnekleri için Cihaz kaldırma başlıklı makaleyi inceleyin.