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

Kapı zili cihaz türü iki özellik kullanılarak uygulanır: PushAvStreamTransport, anlık bildirim tabanlı protokoller kullanılarak ses ve video akışı aktarımını işler ve WebRtcLiveView, 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 Androidcihazlarını kontrol etme başlıklı makaleye bakın.

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

Kapı zili

GoogleDoorbellDevice

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 yer alabilir.

Zorunlu Özellikler
     google PushAvStreamTransport
     google WebRtcLiveView

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:

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

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.

import java.util.Locale

// Convert underscore format (en_US) to Java Locale
fun String.toLocale(): Locale = Locale.forLanguageTag(this.replace('_', '-'))

// Setting the active language
val trait: LocalizationConfiguration = device.getTrait(LocalizationConfiguration)
val selectedLocale = "en_US" // Target locale string
trait.update {
    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:

fun getLastContactTimeStamp(trait: ExtendedGeneralDiagnostics): java.time.Instant {
  val timestamp = trait.lastContactTimestamp
  return Instant.ofEpochSecond(timestamp.toLong())
}

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.

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 özellikler, 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 şeklinde 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.
  • Oturum süresi (saniye cinsinden).
  • Oturumu uzatmak veya sonlandırmak için kullanılabilecek oturum kimliği.
suspend fun getWebRtcLiveViewTrait(cameraDevice: HomeDevice) {
 return cameraDevice.type(GoogleDoorbellDevice).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)
  }
}

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

Kameranın kayıt özelliğini etkinleştirmek için TransportStatusEnum.Active öğesini PushAvStreamTransport trait'inin setTransportStatus() 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:

// 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, 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 gerçekleştirmek için 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 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 edildi 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ı alma

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

  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 removeZone komutunu ilgili zoneId ile birlikte 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 etkinlik 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:

Kotlin akışlarını kullanarak Android geliştirme yaparken genellikle HomeDevice'den 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ştirilmiş 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:

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

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

Kamerada gece görüşünü açmak veya kapatmak için yerleşik setNightVision Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin TriStateAutoEnum 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 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 yerleşik setViewport Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin viewport özelliğini ViewportStruct ile güncelleyin:

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 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
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 açıklanmaktadır. Yeni değerleri içeren yeni bir TransportOptionsStruct oluşturur ve ardından bu güncellenmiş ayarları modifyPushTransport komutunu kullanarak cihaza geri gönderir. Bu ayarlar, önceki adımda bulunan kayıt bağlantısına uygulanır.

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 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ırılma 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ürelerle (saniye cinsinden) eşleşir:

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

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 Chime özelliğinin installedChimeSounds özelliğini kullanarak cihaza yüklenen zili seslerinin listesini alın:

// Get a list of chimes and identify the currently selected one
private val doorbellChimeTraitFlow: Flow =
    device.traitFromType(Chime, GoogleDoorbellDevice)
val chimeSounds = doorbellChimeTraitFlow.first().installedChimeSounds ?: emptyList()

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

// Set the chime using the chimeId from the installed list
chimeSounds.firstOrNull { it.name == name }?.let { setSelectedChime(it.chimeId) }

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 Kotlin işlevini kullanarak Chime özelliğinin externalChime özelliğini güncellemek üzere ExternalChimeType kullanın:

// Indicate the external chime is mechanical
chime.update {
  setExternalChime(ChimeTrait.ExternalChimeType.Mechanical)
}

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 Kotlin işlevini kullanarak Chime özelliğinin externalChimeDurationSeconds özelliğini güncelleyin:

// Change the external chime duration
chime.update {
  setExternalChimeDurationSeconds(newDuration.toUShort())
}

Ç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.

// Get themes from the ChimeThemes trait
fun List<ChimeThemesTrait.ThemeStruct>.filterTimeboxedThemes():
    List<ChimeThemesTrait.ThemeStruct> {
  val now = timeSource.instant().epochSecond.toULong()
  return filter { chimeStruct: ChimeThemesTrait.ThemeStruct ->
    val startTime: ULong = chimeStruct.startTimeSeconds.getOrNull() ?: 0UL
    val endTime: ULong = chimeStruct.endTimeSeconds.getOrNull() ?: MAX_VALUE
    startTime <= now && now <= endTime
  }
}

val availableThemes =
  doorbellChimeThemesTraitFlow
    .first()
    .getAvailableThemes()
    .themes
    .filterTimeboxedThemes()

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

// Select a theme using the ChimeThemes trait
val themeToSelect = "Christmas"
if (themeToSelect in availableThemeNames) {
  doorbellChimeThemesTraitFlow.first().setSelectedTimeboxedThemeName(themeToSelect)
}