Kamera cihaz türü iki özellik kullanılarak uygulanır:
PushAvStreamTransport,
bu özellik, push tabanlı protokoller kullanarak ses ve video akışı aktarımını yönetir ve
WebRtcLiveView,
bu özellik, canlı yayınları ve talkback'i 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 Androidcihazlarını kontrol etme başlıklı makaleye bakın.
| Home API'leri Cihaz Türü | Özellikler | Kotlin Örnek Uygulaması | Kullanım Örneği |
|---|---|---|---|
|
Kamera
Sabit görüntü veya video çeken bir cihaz. Kameralarda erişilebilir canlı yayınlar, iki yönlü konuşma veya algılama etkinlikleri bulunabilir. |
Zorunlu Özellikler google PushAvStreamTransport google WebRtcLiveView |
Kamera |
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:
// Get device basic information. All general information traits are on the RootNodeDevice type. device.type(RootNodeDevice).first().standardTraits.basicInformation?.let { basicInformation -> println("vendorName ${basicInformation.vendorName}") println("vendorId ${basicInformation.vendorId}") println("productId ${basicInformation.productId}") println("productName ${basicInformation.productName}") println("softwareVersion ${basicInformation.softwareVersion}") }
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:
val basicInfo: ExtendedBasicInformation = device.getTrait(ExtendedBasicInformation) val serialNumber = basicInfo.getSerialNumber().serialNumber
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:
fun getLastContactTimeStamp(trait: ExtendedGeneralDiagnostics): java.time.Instant { val timestamp = trait.lastContactTimestamp return Instant.ofEpochSecond(timestamp.toLong()) }
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.
// Get the Mount trait val mountTrait: Mount = device.getTrait(Mount) // Read the current mount state and detection type val mountState = mountTrait.mountState val mountDetectionType = mountTrait.mountDetectionType // Read the current mount type name val mountTypeName = mountTrait.mountTypeName // Update the mount type override mountTrait.update { setMountTypeOverride(MountTrait.MountTypeOverrideEnum.Official) }
Bir cihazın bağlantısını kontrol etme
Bir cihazın bağlantısı aslında cihaz türü düzeyinde kontrol edilir. Çünkü bazı cihazlar birden fazla cihaz türünü destekler. Döndürülen durum, söz konusu cihazdaki tüm özelliklerin bağlantı durumlarının birleşimidir.
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState
İnternet bağlantısı olmadığında karışık cihaz türleri söz konusuysa PARTIALLY_ONLINE durumu gözlemlenebilir.
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 GeneralDiagnostics özelliğinin networkInterfaces özelliğini kullanın. Adresler, standart IPv4 veya IPv6 dizeleri olarak biçimlendirebileceğiniz bayt dizileri olarak döndürülür:
val ipAddresses =
trait.networkInterfaces?.flatMap { networkInterface ->
(networkInterface.ipv4Addresses + networkInterface.ipv6Addresses).mapNotNull { bytes ->
try {
java.net.InetAddress.getByAddress(bytes).hostAddress
} catch (e: java.net.UnknownHostException) {
null
}
}
} ?: emptyList()
Canlı yayın başlatma
Canlı yayın başlatmak için Oturum Açıklama Protokolü (SDP) dizesini WebRtcLiveView özelliğinin startLiveView() yöntemine gönderin. Bu yöntem, üç değer içeren bir WebRtcLiveViewTrait.StartLiveViewCommand.Response döndürür:
- Oturumun SDP'si.
- Saniye cinsinden oturum süresi.
- Oturumu uzatmak veya sonlandırmak için kullanılabilecek oturum kimliği.
suspend fun getWebRtcLiveViewTrait(cameraDevice: HomeDevice) { return cameraDevice.type(GoogleCameraDevice).trait(WebRtcLiveView).first { it?.metadata?.sourceConnectivity?.connectivityState == ConnectivityState.ONLINE } } // Start the live view suspend fun startCameraStream(trait: WebRtcLiveView, offerSdp: String) { val response = trait.startLiveView(offerSdp) // Response contains three fields (see below) return response } ... // This is used to manage the WebRTC connection val peerConnection: RTCPeerConnection = ... ... val startResponse = startCameraStream(sdp) val answerSdp = startResponse?.answerSdp val sessionDuration = startResponse?.liveSessionDurationSeconds val mediaSessionId = startResponse?.mediaSessionId peerConnection.setRemoteDescription(SessionDescription.Type.ANSWER, answerSdp)
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 WebRtcLiveView.extendLiveView() yöntemini kullanarak uzatma isteğinde bulunun:
// Assuming camera stream has just been started suspend fun scheduleExtension(trait: WebRtcLiveView, mediaSessionId: String, liveSessionDurationSeconds: UShort ) { delay(liveSessionDurationSeconds - BUFFER_SECONDS * 1000) val response = trait.extendLiveView(mediaSessionId) // returns how long the session will be live for return response.liveSessionDurationSeconds }
TalkBack'i başlatma ve durdurma
TalkBack'i başlatmak için
WebRtcLiveView
özelliğinin startTalkback()
yöntemini çağırın. Durdurmak için stopTalkback() simgesini kullanın.
// Make sure camera stream is on suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) { if(isOn) { trait.startTalkback(mediaSessionId) } else { trait.stopTalkback(mediaSessionId) } }
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, cihaz türü akışında
WebRtcLiveViewözelliğininsupportedQualityHintsözelliğini sorgular ve desteklenen nitelikleri,QualityHintdeğerlerinin (ör.QUALITY_HINT_SD,QUALITY_HINT_HD,QUALITY_HINT_FHD,QUALITY_HINT_QHDveyaQUALITY_HINT_UHD) listesini içeren birStateFlowolarak gösterir.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
QualityHintuygulayın (örneğin, standart çözünürlükten yüksek çözünürlüğe geçme).changeQualityişlevi, cihazın canlı yayın özelliğini çözer ve etkinmediaSessionIdile istenenQualityHintyapılandırmasıylachangeLiveViewQualityişlevini çağırır.
// Assuming you have a HomeDevice instance 'device' val availableQualityHints: StateFlow<List> = device.type(GoogleCameraDevice) .trait(WebRtcLiveView) .map { trait -> trait?.supportedQualityHints ?: emptyList() } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) // Assuming you have a HomeDevice instance 'device' suspend fun changeQuality(mediaSessionId: String, qualityHint: QualityHint) { // Get the trait from the device val trait = device.type(GoogleCameraDevice).trait(WebRtcLiveView).first() ?: return try { trait.changeLiveViewQuality(mediaSessionId, qualityHint) } catch (e: Exception) { // Handle 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
PushAvStreamTransport
trait'inin
setTransportStatus()
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:
// Start or stop recording for all connections. suspend fun setCameraRecording(trait: PushAvStreamTransport, isOn: Boolean) { if(isOn) { trait.setTransportStatus(TransportStatusEnum.Active) } else { trait.setTransportStatus(TransportStatusEnum.Inactive) } }
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ö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:
// Get the on/off state suspend fun onOffState(pushAvStreamTransport: PushAvStreamTransport) { return pushAvStreamTransport .currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false } // Check if the camera's recording capability is enabled fun PushAvStreamTransport.recordModeActive(): Boolean { return currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false }
Kontrol etmenin bir diğer yolu da findTransport() işlevini bir yüklemle kullanmaktır:
// Fetch the current connections suspend fun queryRecordModeState(trait: PushAvStreamTransport) { return trait.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
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" } ]
// The index parameter must be within the UByte range (0-255). suspend fun setEnergyBalance(trait: EnergyPreference, index: Int) { trait.update { setCurrentEnergyBalance(index.toUByte()) } } // Setting the battery usage to more recording ie performance setEnergyBalance(energyPreference, 2)
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.
suspend fun setAutomaticBatterySaver(enable: Boolean, trait: EnergyPreference) { // 0 is Disabled, 1 is Enabled val value = if (enable) 1.toUByte() else 0.toUByte() trait.update { setCurrentLowPowerModeSensitivity(value) } }
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.
// Get the battery charging state val batteryChargeState = powerSource.batChargeState when (batteryChargeState) { PowerSourceTrait.BatChargeStateEnum.IsCharging -> "Charging" PowerSourceTrait.BatChargeStateEnum.IsAtFullCharge -> "Full" PowerSourceTrait.BatChargeStateEnum.IsNotCharging -> "Not Charging" else -> "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.
// Get the battery charge level val batteryLevel = powerSourceTrait.batChargeLevel when (batteryLevel) { PowerSourceTrait.BatChargeLevelEnum.OK -> "OK" PowerSourceTrait.BatChargeLevelEnum.Warning -> "Warning" PowerSourceTrait.BatChargeLevelEnum.Critical -> "Critical" else -> "Unknown" }
Güç kaynağını alın
Cihazın kullandığı güç kaynağını belirlemek için PowerSource özelliğinin BatPresent ve wiredPresent özelliklerini kullanın.
val trait: PowerSource val isWired = trait.wiredPresent val hasBattery = trait.batPresent
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 Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin microphoneMuted özelliğini güncelleyin:
// Turn the device's microphone on or off suspend fun turnOffMicrophone(disableMicrophone: Boolean, trait: CameraAvStreamManagement) { trait.update { setMicrophoneMuted(disableMicrophone) } }
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 Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin recordingMicrophoneMuted özelliğini güncelleyin:
// Turn audio recording on or off for the device suspend fun turnOffAudioRecording(disableAudioRecording: Boolean, trait: CameraAvStreamManagement) { trait.update { setRecordingMicrophoneMuted(disableAudioRecording) } }
Hoparlörün ses düzeyini ayarlama
Cihazın hoparlör sesini ayarlamak için yerleşik setSpeakerVolumeLevel Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin speakerVolumeLevel özelliğini güncelleyin:
// Adjust the camera speaker volume suspend fun adjustSpeakerVolume(volume: Int, trait: CameraAvStreamManagement) { trait.update { setSpeakerVolumeLevel(volume.toUbyte()) } }
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.
// 1. Obtain the trait flow from the device private val zoneManagementFlow: Flow= device.type(CAMERA_TYPE).flatMapLatest { it.trait(ZoneManagement) } // 2. Map the flow to the list of zone structures val activityZones: Flow<List<ZoneManagementTrait.ZoneInformationStruct>> = zoneManagementFlow.map { trait -> trait.zones ?: emptyList() }
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 com.google.home.google.ZoneManagement import com.google.home.google.ZoneManagementTrait import com.google.home.matter.serialization.OptionalValue /** * Creates a custom activity zone named "Front Porch" with a salmon color * configured for motion detection. */ suspend fun createFrontPorchZone(zoneManagement: ZoneManagement) { // 1. Define the vertices for the zone (2D Cartesian coordinates) // Values are typically scaled to a maximum defined by the device's twoDCartesianMax attribute. val vertices = listOf( ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260u, y = 422u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049u, y = 0u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048u, y = 0u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048u, y = 950u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630u, y = 1349u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880u, y = 2048u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0u, y = 2048u), ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638u, y = 1090u) ) // 2. Define the zone structure val newZone = ZoneManagementTrait.TwoDCartesianZoneStruct( name = "Front Porch", vertices = vertices, // Usage defines what the zone filters (for example, Motion, Person, Vehicle) use = listOf(ZoneManagementTrait.ZoneUseEnum.Motion), // Color is typically a hex string (for example, Salmon/Pink) color = OptionalValue.present("#F439A0") ) try { // 3. Execute the command to add the zone to the device zoneManagement.createTwoDCartesianZone(newZone) println("Successfully created activity zone.") } catch (e: Exception) { // Handle potential HomeException or Timeout println("Failed to create activity zone: ${e.message}") } }
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.
private suspend fun ZoneManagement.updateZone( zoneId: UShort, zone: ZoneManagementTrait.TwoDCartesianZoneStruct ) { // Execute the command to update the zone this.updateTwoDCartesianZone(zoneId = zoneId, zone = zone) }
Etkinlik bölgesini silme
Bir bölgeyi kaldırmak için belirli zoneId ile birlikte removeZone komutunu kullanın.
private suspend fun ZoneManagement.deleteZone(zoneId: UShort) { // Execute the command to remove the zone this.removeZone(zoneId = zoneId) }
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:
Kotlin akışlarını kullanarak Android geliştirme yaparken genellikle HomeDevice öğesinden AvStreamAnalysis özelliğini gözlemlersiniz.
// Example structure to store the data class EventTriggerAttribute(val type: EventTriggerTypeEnum, val enabled: Boolean) // 1. Obtain the trait flow from the device private val avStreamAnalysisFlow: Flow<AvStreamAnalysis> = device.traitFromType(AvStreamAnalysis, CAMERA_TYPES.first { device.has(it) }) // 2. Map the flow to a list of sound event attributes val soundEventTriggersState: Flow<List<EventTriggerAttribute>> = avStreamAnalysisFlow.map { trait -> // Get raw lists from the trait attributes val supported = trait.supportedEventTriggers ?: emptyList() val enabled = trait.enabledEventTriggers ?: emptyList() // Define sound-specific triggers to filter for val soundTypes = setOf( EventTriggerTypeEnum.Sound, EventTriggerTypeEnum.PersonTalking, EventTriggerTypeEnum.DogBark, EventTriggerTypeEnum.GlassBreak, EventTriggerTypeEnum.SmokeAlarm, EventTriggerTypeEnum.CoAlarm, ) // Filter and associate status supported .filter { soundTypes.contains(it) } .map { type -> EventTriggerAttribute( type = type, enabled = enabled.contains(type) ) } }
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.
private suspend fun AvStreamAnalysis.updateEventTriggers( eventTriggers: List<EventTriggerAttribute> ) { val toUpdate = eventTriggers.map { EventTriggerEnablement( eventTriggerType = it.type, enablementStatus = if (it.enabled) { EnablementStatusEnum.Enabled } else { EnablementStatusEnum.Disabled }, ) } // Execute the command on the device setOrUpdateEventDetectionTriggers(toUpdate) }
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:
supportedRecordingModes: Tüm olası modlaravailableRecordingModes: Seçilebilir modlarselectedRecordingMode: Etkin mod
// 1. Obtain the trait flow from the device private val recordingModeTraitFlow: Flow= device.traitFromType(RecordingMode, CAMERA_TYPES.first { device.has(it) }) // 2. Map the flow to recording mode options data class RecordingModeOptions( val recordingMode: RecordingModeTrait.RecordingModeEnum, val index: Int, val available: Boolean, val readableString: String, ) private val recordingModeOptions: Flow<List > = recordingModeTraitFlow.map { trait -> val supported = trait.supportedRecordingModes?.map { it.recordingMode } ?: emptyList() val available = trait.availableRecordingModes?.map { it.toInt() } ?: emptyList() supported.withIndex().map { (index, mode) -> RecordingModeOptions( recordingMode = mode, index = index, available = available.contains(index), readableString = mode.toReadableString(), ) } }
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:
private suspend fun RecordingMode.updateRecordingMode(index: Int) { // Execute the command to update the selected mode this.setSelectedRecordingMode(index.toUByte()) }
Diğer ayarlar
Diğer çeşitli ayarlar Home API'leri aracılığıyla kontrol edilebilir.
Resim yönünü değiştirme
Kamera görüntüsünün (video) yönü döndürülebilir. Video yalnızca 180 derece döndürülebilir.
Kameranın görüntü yönünü değiştirmek için yerleşik setImageRotation Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin imageRotation özelliğini güncelleyin:
// Change the camera's image orientation val isRotated = false cameraAvStreamManagement.update { setImageRotation(if (isRotated) 180.toUShort() else 0.toUShort()) }
Gece görüşünü açma veya kapatma
Kamerada gece görüşünü açmak veya kapatmak için TriStateAutoEnum
yerleşik setNightVision Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin nightVision
özelliğini güncelleyin:
// Turn night vision on cameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.On) } // Turn night vision off CameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.Off) }
Durum LED'inin parlaklığını değiştirme
Durum LED'inin parlaklığını değiştirmek için yerleşik setStatusLightBrightness Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin statusLightBrightness özelliğini güncellemek üzere ThreeLevelAutoEnum işlevini kullanın:
// Set the LED brightness to high cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.High) } // Set the LED brightness to low cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.Low) }
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üntü alanını ayarlamak için CameraAvStreamManagement özelliğinin viewport özelliğini ViewportStruct ile güncelleyin. Bunu yaparken yerleşik setViewport Kotlin işlevini kullanın:
cameraAvStreamManagement .update { setViewport( CameraAvStreamManagementTrait.ViewportStruct( x1 = horizontalRange.rangeStart.roundToInt().toUShort(), x2 = horizontalRange.rangeEnd.roundToInt().toUShort(), y1 = verticalRange.rangeStart.roundToInt().toUShort(), y2 = verticalRange.rangeEnd.roundToInt().toUShort(), ) ) }
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
analyticsEnabled
özelliğini
ExtendedGeneralDiagnosticsTrait
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 extendedGeneralDiagnostics.update { setAnalyticsEnabled(true) } // Disable analytics extendedGeneralDiagnostics.update { 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.
val trait: PushAvStreamTransport = device.getTrait(PushAvStreamTransport) val connections = trait.findTransport().transportConfigurations // Locate the connection designated for recording val recordingConnection = connections.firstOrNull { it.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording } val options = recordingConnection?.transportOptions?.getOrNull() // 1. Bandwidth Quality (Video Stream ID) val videoStreamId = options?.videoStreamId?.getOrNull() // 2. Wake-up Sensitivity (Motion Sensitivity) val wakeUpSensitivity = options?.triggerOptions?.motionSensitivity?.getOrNull() // 3. Max Event Length (Motion Trigger Time Control) val maxEventLength = options?.triggerOptions?.motionTimeControl?.getOrNull()?.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.
val toUpdate = TransportOptionsStruct( videoStreamId = OptionalValue.present(2u), // e.g., Max Quality triggerOptions = TransportTriggerOptionsStruct( motionSensitivity = OptionalValue.present(5u), // e.g., Medium motionTimeControl = OptionalValue.present( TransportMotionTriggerTimeControlStruct(maxDuration = 30u) ) ) ) if (recordingConnection != null) { trait.modifyPushTransport( connectionId = recordingConnection.connectionId, transportOptions = toUpdate ) }
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 VideoStreamStructs listesi olan allocatedVideoStreams özelliğine bakın.
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 (UByte) |
|---|---|
| Düşük | 1u |
| Orta zorlukta | 5u |
| Yüksek | 10u |
Maksimum etkinlik süresini ayarlama
maxDuration, TransportMotionTriggerTimeControlStruct özelliğinin aşağıdaki sürelerine (saniye cinsinden) karşılık gelir:
- 10u, 15u, 30u, 60u, 120u, 180u