راهنمای دستگاه زنگ درب برای اندروید

نوع دستگاه Doorbell با استفاده از دو ویژگی پیاده‌سازی می‌شود: PushAvStreamTransport که انتقال جریان صوتی و تصویری را با استفاده از پروتکل‌های مبتنی بر فشار مدیریت می‌کند، و WebRtcLiveView که امکان کنترل پخش زنده و talkback را فراهم می‌کند.

قبل از استفاده از هرگونه ویژگی یا تلاش برای به‌روزرسانی ویژگی‌ها، همیشه پشتیبانی از ویژگی‌ها و دستورات را برای دستگاه بررسی کنید. به بخش کنترل دستگاه‌ها مراجعه کنید.Android برای اطلاعات بیشتر.

نوع دستگاه APIهای خانگی صفات نمونه برنامه کاتلین مورد استفاده

زنگ در

Google Doorbell Device

home.matter.6006.types.0113

دستگاهی که توسط دکمه‌ای در بیرون در فعال می‌شود و سیگنال صوتی و/یا بصری ایجاد می‌کند و برای جلب توجه شخصی که در آن سوی در است، استفاده می‌شود. زنگ درها ممکن است دارای پخش زنده قابل دسترسی، مکالمه دو طرفه یا رویدادهای تشخیص باشند.

ویژگی‌های مورد نیاز
گوگل PushAvStreamTransport
گوگل وب‌آر‌تی‌سی لایو ویو

زنگ در

شروع پخش زنده

برای شروع پخش زنده، رشته‌ی پروتکل شرح جلسه (SDP) را به متد startLiveView() از ویژگی WebRtcLiveView ارسال کنید، که یک WebRtcLiveViewTrait.StartLiveViewCommand.Response حاوی سه مقدار را برمی‌گرداند:

  • SDP برای جلسه.
  • مدت زمان جلسه بر حسب ثانیه.
  • شناسه جلسه، که ممکن است برای تمدید یا خاتمه جلسه استفاده شود.
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، متد startTalkback() از ویژگی WebRtcLiveView را فراخوانی کنید. برای توقف آن، 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.Active را به متد setTransportStatus() از ویژگی PushAvStreamTransport ارسال کنید. برای غیرفعال کردن قابلیت ضبط، 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
    }
}

تنظیمات صوتی

تنظیمات مختلف صدای دوربین را می‌توان از طریق APIهای Home کنترل کرد.

میکروفون را روشن یا خاموش کنید

برای روشن یا خاموش کردن میکروفون دستگاه، ویژگی microphoneMuted از ویژگی CameraAvStreamManagement را با استفاده از تابع داخلی setMicrophoneMuted کاتلین به‌روزرسانی کنید:

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

ضبط صدا را روشن یا خاموش کنید

برای فعال یا غیرفعال کردن ضبط صدا برای دستگاه، ویژگی recordingMicrophoneMuted از ویژگی CameraAvStreamManagement را با استفاده از تابع داخلی setRecordingMicrophoneMuted کاتلین به‌روزرسانی کنید:

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

تنظیم صدای بلندگو

برای تنظیم میزان صدای بلندگو برای دستگاه، ویژگی speakerVolumeLevel از ویژگی CameraAvStreamManagement را با استفاده از تابع داخلی setSpeakerVolumeLevel کاتلین به‌روزرسانی کنید:

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

تنظیمات دیگر

تنظیمات مختلف دوربین دیگر را می‌توان از طریق APIهای Home کنترل کرد.

فعال یا غیرفعال کردن دید در شب

برای فعال یا غیرفعال کردن دید در شب برای دوربین، از TriStateAutoEnum برای به‌روزرسانی ویژگی nightVision از ویژگی CameraAvStreamManagement با استفاده از تابع داخلی setNightVision کاتلین استفاده کنید:

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

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

تغییر روشنایی LED وضعیت

برای تغییر روشنایی LED وضعیت، ThreeLevelAutoEnum برای به‌روزرسانی ویژگی statusLightBrightness از ویژگی CameraAvStreamManagement با استفاده از تابع داخلی setStatusLightBrightness کاتلین استفاده کنید:

// 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 با بزرگنمایی و بهبود، توضیح داده شده است.

نمای دید (viewport) در یک ViewportStruct تعریف شده است که شامل چهار مقدار است که به عنوان مختصات نمای دید استفاده می‌شوند. این مختصات به صورت زیر تعریف می‌شوند:

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

تعیین مقادیر ViewportStruct به رابط کاربری برنامه و پیاده‌سازی دوربین بستگی دارد. در سطح بسیار ابتدایی، برای تنظیم نمای ویدیوی دوربین، ویژگی viewport از ویژگی CameraAvStreamManagement را با ViewportStruct به‌روزرسانی کنید، و از تابع داخلی setViewport کاتلین استفاده کنید:

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

حساسیت بیدار شدن دستگاه را تنظیم کنید

حساسیت بیدار شدن دستگاه برای صرفه‌جویی در مصرف باتری استفاده می‌شود، به این صورت که محدوده‌ای که دستگاه می‌تواند فعالیت را حس کند کاهش می‌یابد و زمان بیدار شدن پس از تشخیص آن فعالیت افزایش می‌یابد.

در APIهای Home، این مورد را می‌توان با استفاده از ویژگی motionSensitivity از triggerOptions در transportOptions دستگاه تنظیم کرد. این گزینه‌ها در ویژگی PushAvStreamTransport برای هر دستگاه تعریف شده‌اند.

حساسیت بیدارباش فقط می‌تواند روی مقادیر زیر تنظیم شود:

  • ۱ = کم
  • ۵ = متوسط
  • ۱۰ = زیاد

فرآیند به‌روزرسانی به این صورت است که پیکربندی انتقال برای جریان‌های ضبط فعال با استفاده از دستور 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,
      )
    }
  }

حداکثر طول رویداد را تنظیم کنید

حداکثر طول رویداد، مدت زمانی است که دوربین کلیپی از یک رویداد ضبط می‌کند. از طریق APIهای Home، این مدت زمان را می‌توان برای هر دستگاه، با همان طول زمانی که از طریق Google Home app (GHA) تنظیم می‌شود، در فواصل ثانیه تنظیم کرد:

  • ۱۰ ثانیه
  • ۱۵ ثانیه
  • ۳۰ ثانیه
  • ۶۰ ثانیه (۱ دقیقه)
  • ۱۲۰ ثانیه (۲ دقیقه)
  • ۱۸۰ ثانیه (۳ دقیقه)

در APIهای Home، این مورد را می‌توان با استفاده از ویژگی motionTimeControl از triggerOptions در transportOptions دستگاه تنظیم کرد. این گزینه‌ها در ویژگی 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,
      )
    }
  }

تنظیمات زنگ

تنظیمات مختلف زنگ در را می‌توان از طریق APIهای خانه کنترل کرد.

صدای زنگ را تغییر دهید

برای تغییر صدای زنگ در، ابتدا لیست صداهای زنگی که روی دستگاه نصب شده‌اند را با استفاده از ویژگی installedChimeSounds از ویژگی Chime دریافت کنید:

// 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 در کاتلین، ویژگی selectedChime از Chime trait را به‌روزرسانی کنید:

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

از زنگ خارجی استفاده کنید

زنگ در را می‌توان طوری تنظیم کرد که از یک زنگ خارجی، مانند زنگ مکانیکی نصب شده در داخل خانه، استفاده کند. این تنظیم باید هنگام نصب زنگ در انجام شود تا از آسیب احتمالی به زنگ خارجی جلوگیری شود.

برای نشان دادن نوع زنگ خارجی نصب شده، ExternalChimeType برای به‌روزرسانی ویژگی externalChime از Chime trait با استفاده از تابع داخلی setExternalChime کاتلین استفاده کنید:

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

مدت زمان زنگ خارجی را تغییر دهید

مدت زمان زنگ زدن یک زنگ خارجی (بر حسب ثانیه) را می‌توان از طریق APIهای Home پیکربندی کرد. اگر زنگ خارجی از مدت زمان زنگ پشتیبانی می‌کند، کاربر می‌تواند آن را پیکربندی کند.

مقدار تعیین‌شده در اینجا به مشخصات خود زنگ خارجی و مدت زمان پیشنهادی زنگ آن بستگی دارد.

برای تغییر مدت زمان زنگ خارجی، ویژگی externalChimeDurationSeconds از Chime trait را با استفاده از تابع داخلی setExternalChimeDurationSeconds در کاتلین به‌روزرسانی کنید:

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