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ı yayınları ve konuşma özelliğini kontrol etme olanağı 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
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 gibi özellikler olabilir. |
Zorunlu Özellikler google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Kapı zili |
Cihaz hakkında temel bilgileri edinme
BasicInformation
özelliği; satıcı adı, satıcı kimliği, ürün kimliği, ürün adı (model bilgilerini içerir), yazılım sürümü ve cihazın seri numarası 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! let serialNumber = basicInfoTrait.attributes.serialNumber! // [END get_device_information]
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)) }
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.
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.
- Oturum süresi (saniye cinsinden).
- 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 önceden belirlenmiş bir süresi vardır 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)")
}
}
Kayıt özelliğini etkinleştirme ve devre dışı bırakma
Kameranın kayıt özelliğini etkinleştirmek için TransportStatusEnum.Active öğesini PushAvStreamTransportTrait özelliğinin setTransportStatus(transportStatus:optionalArgsProvider:) yöntemine iletin. Kayıt özelliğini devre dışı bırakmak için bu işlevi geçirin
TransportStatusEnum.Inactive.
Aşağıdaki örnekte, bu aramaları, kayıt özelliğini açıp kapatmak 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,
connectivityStatecihaz türüne göre çevrimiçi olarak gösterilmeye 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 gerçekleştirmek için 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 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ı alma
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 removeZone komutunu ilgili zoneId ile birlikte 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 kalıbıyla (üç 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ştirilmiş 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ın kesintisiz kayıt, etkinliğe dayalı kayıt veya kaydı tamamen devre dışı bırakma (yalnızca Canlı Görüntüleme) arasında seçim yapmasına olanak tanır.
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 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:
supportedRecordingModes: Tüm olası modlaravailableRecordingModes: Seçilebilir modlarselectedRecordingMode: Etkin mod
// 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 ViewportStruct ile güncelleyin. Bunu yaparken yerleşik setViewport işlevini kullanın.
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
}
Cihazın uyandırılma hassasiyetini ayarlama
Cihazın uyanma hassasiyeti, cihazın etkinliği algılayabileceği aralığı azaltarak ve bu etkinliği algıladıktan sonra uyanma süresini artırarak pil tasarrufu yapmak için kullanılır.
Home API'lerinde bu, cihazın transportOptions içindeki triggerOptions öğesinin motionSensitivity özelliği kullanılarak ayarlanabilir. Bu seçenekler her cihaz için PushAvStreamTransportTrait özelliğinde tanımlanır.
Uyandırma hassasiyeti yalnızca aşağıdaki değerlere ayarlanabilir:
- 1 = Düşük
- 5 = Orta
- 10 = Yüksek
Güncelleme işlemi için findTransport komutunu kullanarak etkin kayıt akışlarının aktarım yapılandırmasını bulun, ardından modifyPushTransport komutunu kullanarak yapılandırmayı yeni hassasiyet değeriyle değiştirin.
modifyPushTransport komutu, TransportOptionsStruct değerinin tamamının iletilmesini gerektirir. Bu nedenle, mevcut yapılandırmadaki değerleri önce kopyalamanız gerekir. Bunu yapmak için yardımcı işlev oluşturmak üzere TransportOptionsStruct oluşturma başlıklı makaleyi inceleyin.
func setWakeUpSensitivity(to value: UInt8) async {
do {
let connection = try await getRecordingConnection()
guard let connection,
let transportOptions = connection.transportOptions
else {
// Error - Transport options not available
return
}
guard transportOptions.triggerOptions.motionSensitivity != nil else {
// Error - Motion sensitivity not available to be updated for this device
return
}
try await pushAvStreamTransportTrait.modifyPushTransport(
connectionID: connection.connectionID,
transportOptions: self.getTransportOptions(
transportOptions: transportOptions,
wakeUpSensitivity: value,
maxEventLength: nil
)
)
} catch {
// Error
}
}
Maksimum etkinlik süresini ayarlama
Maksimum etkinlik süresi, kameranın bir etkinlik için klip kaydedeceği süredir. Bu, Home API'leri aracılığıyla cihaz başına Google Home app (GHA) üzerinden olduğu gibi saniyelik aralıklarla aynı uzunluklarda yapılandırılabilir:
- 10 saniye
- 15 saniye
- 30 saniye
- 60 saniye (1 dakika)
- 120 saniye (2 dakika)
- 180 saniye (3 dakika)
Home API'lerinde bu, cihazın transportOptions içindeki triggerOptions öğesinin motionTimeControl özelliği kullanılarak ayarlanabilir. Bu seçenekler her cihaz için PushAvStreamTransportTrait özelliğinde tanımlanır.
Güncelleme işlemi için findTransport komutunu kullanarak etkin kayıt akışlarının aktarım yapılandırmasını bulmanız, ardından modifyPushTransport komutunu kullanarak yapılandırmayı yeni etkinlik uzunluğu değeriyle değiştirmeniz gerekir.
modifyPushTransport komutu, TransportOptionsStruct değerinin tamamının iletilmesini gerektirir. Bu nedenle, mevcut yapılandırmadaki değerleri önce kopyalamanız gerekir. Bunu yapmak için yardımcı işlev oluşturmak üzere TransportOptionsStruct oluşturma başlıklı makaleyi inceleyin.
func setMaxEventLength(to value: UInt32) async {
do {
let connection = try await getRecordingConnection()
guard let connection,
let transportOptions = connection.transportOptions
else {
// Error - Transport options not available
return
}
guard transportOptions.triggerOptions.motionTimeControl != nil else {
// Error - Motion time control not available to be updated for this device
return
}
try await pushAvStreamTransportTrait.modifyPushTransport(
connectionID: connection.connectionID,
transportOptions: self.getTransportOptions(
transportOptions: transportOptions,
wakeUpSensitivity: nil,
maxEventLength: value
)
)
} catch {
// Error
}
}
Analizleri etkinleştirme veya devre dışı bırakma
Her cihaz, ayrı ayrı olarak Google Home Cloud'a 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 başka bir mülk olan logUploadEnabled 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)
}
Zil 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 zili 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
Kapı zili, evde kurulu 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.
Hangi tür harici zil sesinin yüklendiğini belirtmek için yerleşik setExternalChime işlevini kullanarak ChimeTrait özelliğinin externalChime özelliğini güncellemek üzere ExternalChimeType özelliğini 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 bir zilin çalma süresi (saniye cinsinden) Home API'leri aracılığıyla yapılandırılabilir. Harici zil sesi, zil sesi süresini destekliyorsa kullanıcı bu süreyi 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
}
}
Çan temasını 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 aralığı 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. İkisi 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 <= currentDateTime
&& chimeTheme.endTimeSeconds ?? UInt64.max >= 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)
}
}```