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

Kapı zili cihaz türü iki özellik kullanılarak uygulanır: PushAvStreamTransportTrait, anlık bildirim tabanlı protokoller kullanılarak ses ve video akışı aktarımını işler ve WebRtcLiveViewTrait, canlı akışları kontrol etme ve konuşma özelliği sağlar.

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

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 etkinleştirilen, kapının diğer tarafında bulunan bir kişinin dikkatini çekmek için kullanılan sesli ve/veya görsel sinyal veren cihaz. Kapı zillerinde erişilebilir canlı yayınlar, iki yönlü konuşma veya algılama etkinlikleri bulunabilir.

Zorunlu Özellikler
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Kapı zili

Cihaz hakkında temel bilgileri edinme

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

// [START get_device_information]
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!
// [END get_device_information]

Seri numarasını alma

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ına sunulur. Bu uygulama, kullanıcıya listeden seçim yapma olanağı sunabilir. Önceden tanımlanmış mesajlar kullanıcı tarafından düzenlenemez.

Hızlı Yanıtlar, PresetMessage özelliğiyle uygulanır.

Hazır mesaj oynatma

Hazır 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 bir cihazın etkin konuşma dilini belirli bir yerel ayara (ör. "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 montaj 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)
}

Bir 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 lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

İnternet bağlantısı olmadığında karışık cihaz türleri söz konusuysa partiallyOnline durumu gözlemlenebilir. Matter standart özellikleri, yerel yönlendirme nedeniyle hâlâ çevrimiçi olabilir ancak bulut tabanlı özellikler çevrimdışı olur.

Cihazın IP adresini alma

Cihazın IP adresini bulmak için GeneralDiagnosticsTrait öğesinin networkInterfaces özelliğini kullanın. Adresler, Data çerçevesi kullanılarak standart IPv4 veya IPv6 dizeleri olarak biçimlendirebileceğiniz Network nesneleri olarak döndürülür:

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

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

Canlı yayınların süresi önceden belirlenir ve bu süre sonunda sona erer. Etkin bir akışın süresini uzatmak için extendLiveView(mediaSessionId:optionalArgsProvider:) yöntemini kullanarak uzatma isteğinde bulunun:

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

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

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

Kaliteyi dinamik olarak değiştirmek için WebRtcLiveView özelliği kullanılır. Bu özellik, belirli bir istemcideki etkin canlı yayın oturumunun çözünürlüğünü özel olarak yönetir. Bu ayar, cihaz genelinde bant genişliği kullanım ayarını doğrudan cihazda yapılandırmakla aynı şey değildir. Cihaz genelinde bant genişliği kullanım ayarını yapılandırmak, aynı anda izleyen tüm kullanıcıları ve buluta kaydedilen eski 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 tarafından desteklenen kullanılabilir akış çözünürlüklerini alır. Kod, supportedQualityHints özelliğini kullanarak desteklenen akış kalitelerini QualityHint değerleri (ör. .sd, .hd, .fhd, .qhd veya .uhd) listesi olarak göstermek için WebRtcLiveView özelliğine sorgu gönderir.

  • Canlı yayın kalitesini değiştirme: Etkin canlı yayının akış çözünürlüğünü değiştirmek için seçili bir QualityHint uygulayın (örneğin, standart çözünürlükten yüksek çözünürlüğe geçme). 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 TransportStatusEnum.Active özelliğinin PushAvStreamTransportTrait trait'inin setTransportStatus(transportStatus:optionalArgsProvider:) yöntemini kullanın. Kayıt özelliğini devre dışı bırakmak için bunu iletin TransportStatusEnum.Inactive. Aşağıdaki örnekte, bu aramaları, kayıt özelliğini etkinleştirmek veya devre dışı bırakmak için Boolean kullanan tek bir aramada 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. Kameranın videosu açıkken kayıt yapılır (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şilemiyor ve kamera herhangi bir bulut etkinliği algılamıyor.

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 yapacak iki işlev tanımlanmaktadı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
}

Pil ayarları

Çeşitli pil ayarları, Home API'leri aracılığıyla 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. Bu özellik, cihazın energyBalances listesinde tanımlanan belirli bir profile karşılık gelen bir tam sayı dizini kabul eder (örneğin, EXTENDED için 0, BALANCED için 1 ve PERFORMANCE için 2).

currentEnergyBalance için null değeri, cihazın özel bir 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 asıl 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

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. Burada 0 genellikle Disabled'i, 1 ise Enabled veya Automatic'i temsil eder.

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

Pil şarj durumunu alma

Cihazın mevcut şarj durumunu (şarj oluyor, tamamen şarj oldu veya şarj olmuyor) almak 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 alma

Mevcut pil seviyesini almak için batChargeLevel özelliğini kullanın. PowerSource özelliği. Düzey OK, Warning (düşük) veya Critical'dir.

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ı alın

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

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

Ses ayarları

Çeşitli ses ayarları, Home API'leri aracılığıyla 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ı etkinleştirme veya devre dışı bırakma

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ün ses düzeyini ayarlama

Cihazın hoparlör sesini 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ı

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 alanlarla sınırlamak için kullanılır.

Etkinlik bölgeleri, kullanıcının bir iş ortağı uygulamasında yapılandırılır. Bu sayede kullanıcı, kameranın görüş alanındaki belirli alanların üzerine bölgeler çizebilir. Bu kullanıcı tanımlı bölgeler daha sonra bu özellik tarafından kullanılan yapılara çevrilir. Etkinlik bölgelerinin işleyiş şekli hakkında daha fazla bilgi için Etkinlik bölgelerini ayarlama ve kullanma başlıklı makaleyi inceleyin.

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

Etkinlik bölgelerini 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, dört köşeli, somon renginde (#F439A0) ve hareket algılama için kullanılan "Ön Veranda" adlı 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ölgesini 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ölgesini silme

Bir bölgeyi kaldırmak için belirli 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örsel tabanlı tetikleyiciler (ör. insanlar veya araçlar) bölgeye özgü 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ıldı GlassBreak Cam kırılma sesini algılar.
Duman alarmı SmokeAlarm Genellikle T3 sesli modeliyle (üç kısa bip sesi ve ardından duraklama) tanınan duman alarmlarını algılar.
Karbonmonoksit alarmı CoAlarm Genellikle T4 sesli deseniyle (dört kısa bip sesi ve ardından duraklama) tanınan karbonmonoksit (CO) alarmlarını algılar.

Ses algılama durumunu kontrol etme

Ses algılama özelliğinin mevcut durumunu kullanıcıya göstermek için cihazın desteklediği ve cihaz donanımı tarafından etkinleştirilen özellikleri 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 tetikleyiciler grubunu güncelleme

Etkinleştirilen tetikleyiciler grubunu güncellemek için SetOrUpdateEventDetectionTriggers komutunu kullanın. Bu komut, EventTriggerEnablement yapılarının listesini alır.

// 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ı

RecordingMode özelliği, kamera ve kapı zili cihazlarında video ve görüntü kaydı 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ünüm) arasında seçim 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ılmıştır. Genellikle eski cihazlar tarafından kullanılır.
CVR (Kesintisiz Video Kaydı) Cvr Video 7/24 kaydedilir. Abonelik gerektirir (örneğin, Google Home Premium.
EDK (Etkinliğe Dayalı Kayıt) Ebr Kayıt, etkinliklerle (kişi, hareket) tetiklenir. Video uzunluğu, etkinliğin süresine ve aboneliğe bağlıdır.
ETR (Event Triggered Recording - Etkinlik Tetiklemeli Kayıt) Etr Etkinlikler tarafından tetiklenen kısa önizleme kaydı (örneğin, 10 saniye).
Canlı Görünüm LiveView Kaydetme özelliği devre dışı bırakılır ancak kullanıcılar canlı yayına erişmeye devam edebilir.
Sabit Görseller Images Etkinlikler gerçekleştiğinde video yerine anlık görüntüler kaydedilir.

Kayıt modlarını kontrol edin

Mevcut kayıt yapılandırmasını görüntülemek için RecordingMode özelliğinin özelliklerini 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üncelleme yapmadan önce, supportedRecordingModes özelliğinden seçilen dizinin availableRecordingModes özelliğinde bulunduğundan emin olun.

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

let recordingModeTrait: Google.RecordingModeTrait
let recordingModeID: UInt8

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

Diğer ayarlar

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

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

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

// 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 üzere 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 başlıklı destek makalesinde açıklanan yakınlaştırma ve kırpma özelliğiyle aynıdır.

Görünüm alanı, dört değer içeren bir ViewportStruct içinde tanımlanır. Bu değerler, görünüm alanının koordinatları olarak kullanılı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ünüm alanını ayarlamak için CameraAvStreamManagementTrait özelliğinin viewport özelliğini yerleşik setViewport işlevini kullanarak 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, TransportOptionsStruct özelliklerinde değişiklik yapılmasını gerektirir. Bu değişiklikler daha sonra bir akış bağlantısının aktarım seçeneklerine iletilir. Swift'te 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, ayrı ayrı olarak Google Home bulutuna ayrıntılı analiz verileri göndermeyi etkinleştirebilir (Cloud Monitoring for Home APIs başlıklı bölüme bakın).

Bir cihaz için analizleri etkinleştirmek üzere ExtendedGeneralDiagnosticsTrait öğesinin analyticsEnabled özelliğini true olarak ayarlayın. analyticsEnabled ayarını yaptığınızda logUploadEnabled adlı başka bir özellik otomatik olarak true olarak ayarlanır. Bu sayede, analiz günlük dosyaları Google Home Cloud'a yüklenebilir.

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

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

Taşıma ve kayıt yapılandırmaları

Bu bölümde, kamera yayını kalitesi ve etkinlik tetikleme ile ilgili ayarlar ele alınmaktadır. Bu ayarlar, PushAvStreamTransport özelliği tarafından yönetilir.

Taşıma ayarlarını okuma

Bu bölümde, mevcut yapılandırmanın bir kamera veya kapı zili cihazından nasıl alınacağı gösterilmektedir. PushAvStreamTransport özelliğini getirir, kayıt için kullanılan bağlantıyı bulur ve ardından bant genişliği kalitesi, uyandırma hassasiyeti ve maksimum etkinlik uzunluğu için geçerli 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

Aktarım 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 birlikte 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

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

Desteklenen video akışlarını almak için allocatedVideoStreams özelliğine bakın. Bu özellik, VideoStreamStructs listesidir. cihazın CameraAvStreamManagement özelliğinden.

Cihazın uyandırma hassasiyetini ayarlama

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

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

Maksimum etkinlik süresini ayarlama

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

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

Chime ayarları

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

Zil sesini değiştirme

Kapı zili sesini değiştirmek için önce ChimeTrait özelliğinin installedChimeSounds özelliğini kullanarak cihaza yüklenen zil sesi 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

Kapı zili, evde kurulu mekanik zil gibi harici bir zil kullanacak şekilde yapılandırılabilir. Harici zil sesinde olası hasarı önlemek için bu ayar kapı zili kurulumu sırasında yapılandırılmalıdır.

Hangi tür harici zil sesinin yüklendiğini belirtmek için ExternalChimeType yerleşik setExternalChime işlevini kullanarak ChimeTrait özelliğinin externalChime özelliğini güncelleyin: externalChime externalChime

// 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 bir zilin çalma süresi (saniye cinsinden) Home API'leri aracılığıyla yapılandırılabilir. Harici zil, zil süresini destekliyorsa kullanıcı bunu yapılandırmak isteyebilir.

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

Harici zil sesinin 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 sesini etkinleştirme

Bazı kapı zillerinde, yalnızca sınırlı bir süre için kullanılabilen zil sesleri olabilir. Örneğin, tatillere özel zil sesleri. Bunlara zil sesi temaları denir.

Bir kullanıcı için hangi zil sesi temalarının kullanılabildiğini görmek istiyorsanız bir zaman kutusu filtresi oluşturun ve getAvailableThemes komutunun sonuçlarını filtrelemek için bu filtreyi kullanın.ChimeThemes Bu işlem, 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) arasındaysa tema etkin olarak kabul edilir. Başlangıç saati ayarlanmamışsa başlangıçtan itibaren etkin kabul edilir. Bitiş zamanı ayarlanmamışsa süresiz olarak etkin kalır. Her ikisi de eksikse 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 duyurusu ayarları

Home API'lerinin VisitorAnnouncement özelliğiyle kapı zillerinin ziyaretçi anonsu ayarlarını sorgulayabilir ve yönetebilirsiniz. Bu özellik, kapı zili çalındığı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ı kontrol etme ve bu ayarı güncelleme adımları gösterilmektedir:

let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled

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