Android용 초인종 기기 가이드

초인종 기기 유형은 푸시 기반 프로토콜을 사용하여 오디오 및 동영상 스트림 전송을 처리하는 PushAvStreamTransport과 라이브 스트림 및 인터콤을 제어하는 기능을 제공하는 WebRtcLiveView의 두 가지 특성을 사용하여 구현됩니다.

기능을 사용하거나 속성을 업데이트하려고 시도하기 전에 항상 기기의 속성 및 명령어 지원을 확인하세요. 자세한 내용은 Android에서 기기 제어를 참고하세요.

Home API 기기 유형 특성 Kotlin 샘플 앱 사용 사례

초인종

GoogleDoorbellDevice

home.matter.6006.types.0113

문 밖에 있는 버튼으로 작동하며, 문 너머에 있는 사람의 주의를 끌기 위해 청각적 또는 시각적 신호를 내는 장치입니다. 초인종에는 접근 가능한 라이브 스트림, 양방향 TalkBack 또는 감지 활동이 포함될 수 있습니다.

필수 특성
     google PushAvStreamTransport
     google WebRtcLiveView

초인종

라이브 스트림 시작

라이브 스트림을 시작하려면 세션 설명 프로토콜 (SDP) 문자열을 WebRtcLiveView 특성의 startLiveView() 메서드로 전송합니다. 이 메서드는 다음 세 값을 포함하는 WebRtcLiveViewTrait.StartLiveViewCommand.Response을 반환합니다.

  • 세션의 SDP입니다.
  • 세션 시간(초)입니다.
  • 세션을 연장하거나 종료하는 데 사용할 수 있는 세션 ID입니다.
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)

라이브 스트림 연장

라이브 스트림에는 만료되는 사전 설정된 기간이 있습니다. 활성 스트림의 기간을 늘리려면 WebRtcLiveView.extendLiveView() 메서드를 사용하여 연장 요청을 실행합니다.

// 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 시작 및 중지

토크백을 시작하려면 WebRtcLiveView 트레이트의 startTalkback() 메서드를 호출합니다. 중지하려면 stopTalkback()를 사용합니다.

// Make sure camera stream is on
suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) {
  if(isOn) {
    trait.startTalkback(mediaSessionId)
  } else {
    trait.stopTalkback(mediaSessionId)
  }
}

녹화 기능 사용 설정 및 중지

카메라의 녹화 기능을 사용 설정하려면 TransportStatusEnum.ActivePushAvStreamTransport 특성의 setTransportStatus() 메서드에 전달합니다. 녹음 기능을 사용 중지하려면 TransportStatusEnum.Inactive을 전달합니다. 다음 예에서는 Boolean를 사용하여 녹화 기능을 전환하는 단일 호출로 이러한 호출을 래핑합니다.

// Start or stop recording for all connections.
suspend fun setCameraRecording(isOn: Boolean) {
  val pushAvStreamTransport = getPushAvStreamTransport
  if(isOn) {
    pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Active)
  } else {
    pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Inactive)
  }
}

카메라의 녹화 기능을 사용 설정하거나 사용 중지하는 것은 카메라 동영상을 켜거나 끄는 것과 같습니다. 카메라 동영상이 켜져 있으면 활동 및 관련 클립을 위해 녹화됩니다.

녹화 기능이 사용 중지된 경우 (카메라 동영상이 꺼져 있음):

  • 카메라가 기기 유형의 connectivityState에 따라 온라인으로 표시될 수 있습니다.
  • 실시간 스트림에 액세스할 수 없으며 카메라에서 클라우드 활동을 감지하지도 않습니다.

녹화 기능이 사용 설정되어 있는지 확인

카메라의 녹화 기능이 사용 설정되어 있는지 확인하려면 연결이 활성 상태인지 확인하세요. 다음 예에서는 이를 수행하는 두 함수를 정의합니다.

// Get the on/off state
suspend fun onOffState(cameraDevice: HomeDevice, cameraDeviceType) {
  // Query the device for pushAvStreamTransport
  val pushAvTrait = getPushAvStreamTransport()
  return pushAvTrait.recordModeActive()
}

// Check if the camera's recording capability is enabled
fun PushAvStreamTransport.recordModeActive(): Boolean {
  return currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false
}

또 다른 확인 방법은 술어와 함께 findTransport() 함수를 사용하는 것입니다.

// Fetch the current connections
suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) {
  val pushAvStreamTransport = getPushAvStreamTransport()
  return pushAvStreamTransport.findTransport().let {
      it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active
    }
}

오디오 설정

다양한 카메라 오디오 설정은 Home API를 통해 제어할 수 있습니다.

마이크 켜거나 끄기

기기의 마이크를 켜거나 끄려면 내장 setMicrophoneMuted Kotlin 함수를 사용하여 CameraAvStreamManagement 특성의 microphoneMuted 속성을 업데이트합니다.

// Turn the device's microphone on or off
suspend fun turnOffMicrophone(disableMicrophone: Boolean, trait: CameraAvStreamManagement) {
  trait.update { setMicrophoneMuted(disableMicrophone) }
}

오디오 녹음 사용 설정 또는 사용 중지하기

기기의 오디오 녹음을 사용 설정하거나 사용 중지하려면 내장된 setRecordingMicrophoneMuted Kotlin 함수를 사용하여 CameraAvStreamManagement 특성의 recordingMicrophoneMuted 속성을 업데이트합니다.

// Turn audio recording on or off for the device
suspend fun turnOffAudioRecording(disableAudioRecording: Boolean, trait: CameraAvStreamManagement) {
  trait.update { setRecordingMicrophoneMuted(disableAudioRecording) }
}

스피커 볼륨 조정

기기의 스피커 볼륨을 조정하려면 내장된 setSpeakerVolumeLevel Kotlin 함수를 사용하여 CameraAvStreamManagement 특성의 speakerVolumeLevel 속성을 업데이트합니다.

// Adjust the camera speaker volume
suspend fun adjustSpeakerVolume(volume: Int, trait: CameraAvStreamManagement) {
  trait.update { setSpeakerVolumeLevel(volume.toUbyte()) }
}

기타 설정

다양한 기타 카메라 설정은 Home API를 통해 제어할 수 있습니다.

야간 적외선 조명 사용 설정 또는 사용 중지하기

카메라의 야간 모드를 사용 설정하거나 사용 중지하려면 TriStateAutoEnum를 사용하여 내장 setNightVision Kotlin 함수를 사용하여 CameraAvStreamManagement 특성의 nightVision 속성을 업데이트하세요.

// Turn night vision on
cameraAvStreamManagement.update {
  setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.On)
}

// Turn night vision off
CameraAvStreamManagement.update {
  setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.Off)
}

상태 LED 밝기 변경

상태 LED의 밝기를 변경하려면 ThreeLevelAutoEnum를 사용하여 내장 setStatusLightBrightness Kotlin 함수를 사용하여 CameraAvStreamManagement 특성의 statusLightBrightness 속성을 업데이트합니다.

// Set the LED brightness to high
cameraAvStreamManagement.update {
  setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.High)
}

// Set the LED brightness to low
cameraAvStreamManagement.update {
  setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.Low)
}

카메라 표시 영역 변경

카메라 뷰포트는 Nest 카메라 동영상 확대/축소 및 개선 지원 도움말에 설명된 확대/축소 및 자르기 기능과 동일합니다.

뷰포트는 뷰포트의 좌표로 사용되는 네 개의 값이 포함된 ViewportStruct에 정의됩니다. 좌표는 다음과 같이 정의됩니다.

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

ViewportStruct 값을 결정하는 것은 앱의 UI와 카메라 구현에 따라 다릅니다. 매우 기본적인 수준에서 카메라 동영상의 뷰포트를 설정하려면 내장된 setViewport Kotlin 함수를 사용하여 ViewportStructCameraAvStreamManagement 특성의 viewport 속성을 업데이트합니다.

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(),
    )
) }

기기 절전 해제 민감도 조정

기기의 절전 모드 해제 감도는 기기가 활동을 감지할 수 있는 범위를 줄이고 활동을 감지한 후 절전 모드를 해제하는 시간을 늘려 배터리를 절약하는 데 사용됩니다.

Home API에서 이는 기기의 transportOptions에 있는 triggerOptionsmotionSensitivity 속성을 사용하여 설정할 수 있습니다. 이러한 옵션은 각 기기의 PushAvStreamTransport 특성 내에 정의됩니다.

절전 모드 해제 감도는 다음 값으로만 설정할 수 있습니다.

  • 1 = 낮음
  • 5 = 보통
  • 10 = 높음

업데이트 프로세스는 findTransport 명령어를 사용하여 활성 녹화 스트림의 전송 구성을 찾은 다음 modifyPushTransport 명령어를 사용하여 새 감도 값으로 구성을 수정하는 것입니다.

// Create a struct with the new wake-up sensitivity
val toUpdate =  TransportOptionsStruct(
  triggerOptions =
    TransportTriggerOptionsStruct(
      motionSensitivity =
        OptionalValue.present(wakeUpSensitivity.toUByte())
    )
  )

// Get the configurations for active connections
val connections  = pushAvStreamTransport.findTransport().transportConfigurations
  // Update all recording streams with the new transport options.
  for (connection in connections) {
    if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) {
      trait.modifyPushTransport(
        connectionId = connection.connectionId,
        transportOptions = toUpdate,
      )
    }
  }

최대 이벤트 길이 조정

최대 활동 길이는 카메라가 활동의 클립을 녹화하는 시간입니다. Home API를 통해 기기별로 Google Home app (GHA)를 통해 설정하는 것과 동일한 길이로 초 단위 간격으로 구성할 수 있습니다.

  • 10초
  • 15초
  • 30초
  • 60초(1분)
  • 120초(2분)
  • 180초 (3분)

Home API에서 이는 기기의 transportOptions에 있는 triggerOptionsmotionTimeControl 속성을 사용하여 설정할 수 있습니다. 이러한 옵션은 각 기기의 PushAvStreamTransport 특성 내에 정의됩니다.

업데이트 프로세스는 findTransport 명령어를 사용하여 활성 녹화 스트림의 전송 구성을 찾은 다음 modifyPushTransport 명령어를 사용하여 새 이벤트 길이 값으로 구성을 수정하는 것입니다.

// Create a struct with the new max event length
// where maxDuration is the length in seconds
val toUpdate =  TransportOptionsStruct(
  triggerOptions =
    TransportTriggerOptionsStruct(
      motionTimeControl =
        OptionalValue.present(
          TransportMotionTriggerTimeControlStruct(maxDuration = it.toUInt())
        )
    )
  )

// Get the configurations for active connections
val connections  = pushAvStreamTransport.findTransport().transportConfigurations
  // Update all recording streams with the new transport options.
  for (connection in connections) {
    if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) {
      trait.modifyPushTransport(
        connectionId = connection.connectionId,
        transportOptions = toUpdate,
      )
    }
  }

차임벨 설정

Home API를 통해 다양한 초인종 차임벨 설정을 제어할 수 있습니다.

차임벨 소리 변경

초인종 차임벨 소리를 변경하려면 먼저 Chime 특성의 installedChimeSounds 속성을 사용하여 기기에 설치된 차임벨 소리 목록을 가져옵니다.

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

그런 다음 기본 제공 setSelectedChime Kotlin 함수를 사용하여 Chime 특성의 selectedChime 속성을 업데이트합니다.

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

외부 차임벨 사용

초인종은 집 내부에 설치된 기계식 벨과 같은 외부 차임벨을 사용하도록 구성할 수 있습니다. 외부 차임벨의 손상을 방지하기 위해 초인종 설치 중에 구성해야 합니다.

설치된 외부 차임벨의 유형을 나타내려면 ExternalChimeType를 사용하여 내장 setExternalChime Kotlin 함수를 사용하여 Chime 특성의 externalChime 속성을 업데이트합니다.

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

외부 차임벨 지속 시간 변경

외부 초인종이 울리는 시간(초)은 Home API를 통해 구성할 수 있습니다. 외부 차임벨이 차임벨 지속 시간을 지원하는 경우 사용자가 이를 구성할 수 있습니다.

여기에서 설정된 값은 외부 초인종 자체의 사양과 권장 초인종 지속 시간에 따라 다릅니다.

외부 차임벨 소리 지속 시간을 변경하려면 내장 setExternalChimeDurationSeconds Kotlin 함수를 사용하여 Chime 특성의 externalChimeDurationSeconds 속성을 업데이트합니다.

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