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

نوع دستگاه «زنگ در» بااستفاده از سه مشخصه پیاده‌سازی می‌شود: PushAvStreamTransport، که انتقال جاری‌سازی صوتی و تصویری را بااستفاده از پروتکل‌های مبتنی بر فشار مدیریت می‌کند، WebRtcLiveView، که امکان کنترل جاری‌سازی‌های زنده و مکالمه متقابل را فراهم می‌کند، و CameraSnapshot، که پیش‌نمایش‌های فوری ذخیره‌شده و ضبط‌های فوری زنده را ارائه می‌دهد.

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

نوع دستگاه Home APIs ویژگی‌ها برنامه نمونه Kotlin کاربرد

زنگ در

GoogleDoorbellDevice

home.matter.6006.types.0113

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

ویژگی‌های الزامی
     google PushAvStreamTransport
     google WebRtcLiveView

زنگ در

دریافت اطلاعات پایه درباره دستگاه

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

ویژگی BasicInformation شامل اطلاعاتی مثل نام فروشنده، شناسه فروشنده، شناسه محصول، نام محصول (شامل اطلاعات مدل)، و نسخه نرم‌افزار دستگاه می‌شود:

// 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}")
    }

دریافت شماره سریال

برای دریافت شماره سریال دستگاه، از فرمان GetSerialNumber در ExtendedBasicInformation ویژگی استفاده کنید. مثال نشان می‌دهد که شماره سریال در متغیری به‌نام serialNumber ذخیره می‌شود:

val basicInfo: ExtendedBasicInformation = device.getTrait(ExtendedBasicInformation)
val serialNumber = basicInfo.getSerialNumber().serialNumber

پاسخ‌های سریع

ویژگی «پاسخ‌های سریع» به کاربر امکان می‌دهد پیام ازپیش تعریف‌شده‌ای را به دستگاه زنگ در ارسال کند.

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

«پاسخ‌های سریع» ازطریق PresetMessage ویژگی پیاده‌سازی می‌شود.

پخش پیام ازپیش تنظیم‌شده

برای پخش پیام پیش‌تنظیم‌شده، با playPresetMessage روش تماس بگیرید و یکی از مقادیر رشته‌ای موجود در availablePhraseTypes دارایی را به آن منتقل کنید.

import com.google.home.HomeDevice
import com.google.home.HomeException
import com.google.home.google.GoogleDoorbellDevice
import com.google.home.google.PresetMessage
import kotlinx.coroutines.flow.first

suspend fun playDoorbellPresetMessage(device: HomeDevice, phraseTypeString: String) {
    try {
        // 1. Retrieve the first snapshot of the doorbell device type
        val doorbellDevice = device.type(GoogleDoorbellDevice).first()

        // 2. Extract the PresetMessage trait
        val presetMessageTrait = doorbellDevice.trait(PresetMessage)
        if (presetMessageTrait == null) {
            println("PresetMessage trait is not supported on this doorbell device.")
            return
        }

        // 3. (Optional) Check available phrase types supported by the device
        val availablePhrases = presetMessageTrait.availablePhraseTypes
        if (availablePhrases != null) {
            val phraseTypesList = availablePhrases.map { it.phraseType }
            println("Supported quick response phrases: $phraseTypesList")
        }

        // 4. Send the playPresetMessage command to the doorbell
        presetMessageTrait.playPresetMessage(phraseType = phraseTypeString)
        println("Preset message command sent successfully.")

    } catch (e: HomeException) {
        println("Home API error occurred: ${e.message}")
    } catch (e: Exception) {
        println("Unexpected failure: ${e.message}")
    }
}

تنظیم زبان گفتار

بااستفاده از روش setActiveLocale در مشخصه LocalizationConfiguration، زبان گفتاری فعال دستگاه را روی منطقه جغرافیایی خاصی (برای نمونه، «en_US») تنظیم کنید.

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

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

برای پیدا کردن جدیدترین زمانی که دستگاه با فضای ابری ارتباط داشته است، از مشخصه lastContactTimestamp ویژگی ExtendedGeneralDiagnostics استفاده کنید:

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

تنظیمات نوع پایه دوربین

ویژگی Mount شامل تنظیمات پایه دوربین و اطلاعات وضعیت است. می‌توانید مشخصه‌هایی مثل وضعیت نصب، نوع تشخیص، و نام نوع نصب را بخوانید. علاوه‌براین، می‌توانید از مشخصه Mount برای ملغی کردن پیکربندی نوع نصب پیش‌فرض استفاده کنید.

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

بررسی اتصال‌پذیری دستگاه

اتصال‌پذیری برای دستگاه درواقع در سطح نوع دستگاه بررسی می‌شود زیرا برخی‌از دستگاه‌ها از چندین نوع دستگاه پشتیبانی می‌کنند. وضعیت برگشتی ترکیبی از وضعیت‌های اتصال‌پذیری برای همه مشخصه‌های آن دستگاه است.

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   
val doorbellConnectivity = doorbellDevice.metadata.sourceConnectivity.connectivityState

درصورت عدم اتصال به اینترنت، ممکن است وضعیت PARTIALLY_ONLINE در مورد انواع دستگاه‌های ترکیبی مشاهده شود. ممکن است Matter مشخصه استاندارد به‌دلیل مسیریابی محلی همچنان آنلاین باشد، اما مشخصه‌های مبتنی بر ابر آفلاین خواهد بود.

دریافت نشانی IP دستگاه

برای پیدا کردن نشانی IP دستگاه، از مشخصه networkInterfaces ویژگی GeneralDiagnostics استفاده کنید. نشانی‌ها به‌صورت آرایه‌های بایت برگردانده می‌شوند که می‌توانید آن‌ها را به رشته‌های استاندارد IPv4 یا IPv6 قالب‌بندی کنید:

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

شروع جاری‌سازی زنده

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

برای شروع جاری‌سازی زنده، رشته «پروتکل شرح جلسه» (SDP) را به روش WebRtcLiveView ویژگی startLiveView() ارسال کنید، که 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)

تمدید کردن جاری‌سازی زنده

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

جاری‌سازی‌های زنده دارای مدت زمان پیش‌تنظیم‌شده‌ای هستند که پس‌از آن منقضی می‌شوند. برای افزایش مدت زمان یک جاری‌سازی فعال، درخواست تمدید را بااستفاده از روش 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

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

برای شروع 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.Active را به PushAvStreamTransport روش setTransportStatus() ویژگی منتقل کنید. برای غیرفعال کردن قابلیت ضبط، آن را ارسال کنید TransportStatusEnum.Inactive. در مثال زیر، این تماس‌ها را در یک تماس واحد که از Boolean برای روشن/خاموش کردن قابلیت ضبط استفاده می‌کند می‌پیچیم:

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

فعال یا غیرفعال کردن قابلیت ضبط دوربین همانند روشن یا خاموش کردن ویدیو دوربین است. وقتی ویدیو دوربین روشن باشد، دوربین درحال ضبط است (برای اهداف رویدادها و کلیپ‌های مربوط).

وقتی قابلیت ضبط غیرفعال باشد (ویدیو دوربین خاموش باشد):

  • دوربین همچنان می‌تواند براساس connectivityState نوع دستگاه آنلاین نشان داده شود.
  • به جاری‌سازی زنده نمی‌توان دسترسی داشت و دوربین هیچ رویداد ابری را تشخیص نمی‌دهد.

بررسی کنید قابلیت ضبط فعال باشد

برای تعیین اینکه قابلیت ضبط دوربین فعال است یا نه، بررسی کنید که آیا اتصالی فعال است یا نه. مثال زیر دو تابع را برای انجام این کار تعریف می‌کند:

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

روش دیگر برای بررسی، استفاده از تابع findTransport() با گزاره است:

// Fetch the current connections
suspend fun queryRecordModeState(trait: PushAvStreamTransport) {
  return trait.findTransport().let {
      it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active
    }
}

دریافت عکس‌های آنی دوربین

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

از مشخصه CameraSnapshot برای بازیابی عکس‌های آنی تصویر ثابت از دوربین استفاده کنید. این نماگرفت‌ها برای چندین سناریو مفید هستند:

  • به‌عنوان کاشی جای‌بان در رابط کاربری درحالی‌که پخش زنده WebRTC درحال بارگیری است.
  • به‌عنوان تصویر پیش‌نمایش ثابت که با تعامل کاربر به جاری‌سازی زنده ارتقا می‌یابد.
  • به‌عنوان بوم پس‌زمینه برای طراحی و پیکربندی مناطق فعالیت سفارشی.

ویژگی CameraSnapshot دو روش برای واکشی کردن نماهای فوری ارائه می‌دهد، بسته به اینکه به نمای فوری ذخیره‌شده برای پردازش سریع نیاز دارید یا به نمای فوری زنده درخواستی.

دریافت عکس آنی پیش‌نمایش ذخیره‌شده

عکس آنی پیش‌نمایش تصویری ذخیره‌شده در حافظه نهان است که «کیت توسعه نرم‌افزاری» می‌تواند بدون روشن کردن دوربین آن را بازیابی کند. این سریع‌ترین روش برای واکشی تصویر ثابت است و برای صفحات نمای کلی دوربین یا شبکه‌های داشبورد ایده‌آل است.

برای دریافت چیدمان پیش‌نمایش، مشخصه ویژگی preview_image_url را بخوانید:

// Get a flow of the CameraSnapshot trait
val cameraSnapshotFlow: Flow<CameraSnapshot?> = cameraDevice
  .type(GoogleCameraDevice)
  .trait(CameraSnapshot)

// Get the current trait state
val cameraSnapshot = cameraSnapshotFlow.firstOrNull()
if (cameraSnapshot != null) {
  val previewImageUrl = cameraSnapshot.previewImageUrl
  // Load the preview image from the URL
} else {
  // CameraSnapshot trait not supported on this device
}

بسته به پیکربندی و فعالیت دوربین، نشانی وب پیش‌نمایش به تصویر ذخیره‌شده در حافظه نهان تولیدشده از فیلم ویدیویی اخیر (اولین قاب I از جدیدترین بخش ویدیو) یا یک عکس فوری که دوربین به‌صورت دوره‌ای بارگذاری می‌کند اشاره می‌کند.

برای نشان دادن تازگی تصویر، ابر Google Home سرصفحه X-Home-Image-Captured-At را در تصویر JPEG/PNG ارائه شده جاسازی می‌کند که در قالب زمان هماهنگ جهانی (UTC) است. می‌توانید این سرایند را در سمت کارخواه تجزیه کنید تا سن لحظه‌نگار را در برنامه نمایش دهید.

دریافت عکس آنی زنده درصورت درخواست

برای سفرهای کاربری که به نمای زنده فعلی دوربین نیاز دارند—مثل راه‌اندازی «مناطق فعالیت»—می‌توانید عکس آنی زنده درخواست کنید. راه‌اندازی عکس فوری زنده به دوربین دستور می‌دهد بیدار شود، قاب جدیدی بگیرد، و آن را در فضای ابری بارگذاری کند.

برای درخواست کردن نمای لحظه‌ای زنده، از فرمان getLiveSnapshot() استفاده کنید:

try {
  val response = cameraSnapshot.getLiveSnapshot()
  val snapshotUrl = response.snapshotUrl
  // Load the live snapshot image from the URL
} catch (e: Exception) {
  Log.e("CameraSnapshot", "Failed to get live snapshot: ${e.message}")
}

اصالت‌سنجی درخواست‌های نمای کلی

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

همه نشانی‌های وب نمای فوری به رسانه‌های امن اشاره می‌کنند و برای دامنه Home APIs v2 به کد OAuth 2.0 نیاز دارند. برای بارگیری و پرداز کردن تصاویر، کد OAuth باید به‌عنوان کد «حامل» در سرصفحه Authorization درخواست HTTP شما تزریق شود.

مثال زیر نحوه پیکربندی درخواست شبکه امن برای بارگیری یک نمای فوری را نشان می‌دهد:

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import java.io.IOException
import java.net.HttpURLConnection
import java.net.URL
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

/**
 * Downloads a snapshot from a URL using an OAuth access token.
 */
suspend fun loadSnapshotImage(urlString: String, oauthToken: String): Bitmap? =
  withContext(Dispatchers.IO) {
    var connection: HttpURLConnection? = null
    try {
      val url = URL(urlString)
      connection = url.openConnection() as HttpURLConnection
      // 1. Configure the HTTP GET request with the Bearer token
      connection.setRequestProperty("Authorization", "Bearer $oauthToken")

      // 2. Fetch the image data
      if (connection.responseCode == HttpURLConnection.HTTP_OK) {
        connection.inputStream.use { inputStream ->
          BitmapFactory.decodeStream(inputStream)
        }
      } else {
        null
      }
    } catch (e: IOException) {
      e.printStackTrace()
      null
    } finally {
      connection?.disconnect()
    }
  }

مدیریت جاری‌سازی زنده

تنظیم کیفیت جاری‌سازی زنده برای بهینه‌سازی استفاده از پهنای باند براساس بافتار مشاهده مشتری (برای مثال، تغییر به وضوح پایین‌تر هنگام نمایش کاشی پیش‌نمایش کوچک‌تر، نمای جدولی، یا حالت تصویردرتصویر) مفید است.

تغییر کیفیت به‌صورت پویا بااستفاده از WebRtcLiveView ویژگی به‌طور خاص وضوح جلسه جاری‌سازی زنده فعال را در یک مشتری خاص مدیریت می‌کند. این تنظیم با پیکربندی تنظیم استفاده از پهنای باند در سطح دستگاه که مستقیماً روی دستگاه انجام می‌شود و بر همه بینندگان همزمان و کیفیت ضبط‌های ویدیویی قدیمی ذخیره‌شده در فضای ابری تأثیر می‌گذارد، یکسان نیست.

مثال زیر نحوه بازیابی و به‌روزرسانی کیفیت جاری‌سازی زنده برای یک دستگاه را نشان می‌دهد:

  • گزینه‌های کیفیت پشتیبانی‌شده را بازیابی کنید: وضوح‌های جاری‌سازی دردسترس پشتیبانی‌شده توسط دستگاه را دریافت کنید. کد، ویژگی supportedQualityHints مربوط به WebRtcLiveView ویژگی را در جریان نوع دستگاه پُرسمان می‌کند و کیفیت‌های پشتیبانی‌شده را به‌عنوان StateFlow حاوی فهرستی از مقادیر QualityHint نمایان می‌کند (مثل QUALITY_HINT_SD، QUALITY_HINT_HD، QUALITY_HINT_FHD، QUALITY_HINT_QHD، یا QUALITY_HINT_UHD).

  • تغییر کیفیت جاری‌سازی زنده: QualityHint انتخاب‌شده‌ای را برای تغییر وضوح جاری‌سازی زنده فعال اعمال کنید (برای مثال، تغییر از «وضوح استاندارد» به «وضوح بالا»). تابع changeQuality ویژگی جاری‌سازی زنده دستگاه را حل می‌کند و changeLiveViewQuality را با mediaSessionId فعال و پیکربندی QualityHint انتخابی فرا می‌خواند.

// Assuming you have a HomeDevice instance 'device'
val availableQualityHints: StateFlow<List> =
    device.type(GoogleDoorbellDevice)
        .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(GoogleDoorbellDevice).trait(WebRtcLiveView).first() ?: return
    try {
        trait.changeLiveViewQuality(mediaSessionId, qualityHint)
    } catch (e: Exception) {
        // Handle error
    }
}

تنظیمات باتری

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

اولویت مصرف باتری را تنظیم کنید

با تنظیم تراز انرژی می‌توانید مبادله بین عمر باتری و عملکرد دستگاه را پیکربندی کنید. می‌توانید نمایه‌های باتری مختلفی مثل «طولانی»، «متعادل»، و «عملکرد» ایجاد کنید و بین آن‌ها جابه‌جا شوید.

این ویژگی با به‌روزرسانی مشخصه currentEnergyBalance ویژگی EnergyPreference پیاده‌سازی می‌شود. این مشخصه نمایه عدد صحیح را می‌پذیرد که با نمایه خاصی که در فهرست energyBalances دستگاه تعریف شده است مطابقت دارد (برای مثال، 0 برای EXTENDED، 1 برای BALANCED، و 2 برای PERFORMANCE).

مقدار null برای currentEnergyBalance نشان می‌دهد که دستگاه از نمایه سفارشی استفاده می‌کند. این حالت فقط خواندنی است.

در زیر نمونه‌ای از ساختاری که مشخصه currentEnergyBalance استفاده خواهد کرد نشان داده شده است، و پس‌از آن تکه‌کد واقعی که از این مشخصه استفاده می‌کند آمده است.

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

روشن کردن «بهینه‌سازی باتری» خودکار

برای پیکربندی این ویژگی، مشخصه currentLowPowerModeSensitivity را در EnergyPreference ویژگی به‌روز کنید. این مشخصه از نمایه برای انتخاب سطح حساسیت استفاده می‌کند، جایی که 0 معمولاً نشان‌دهنده Disabled و 1 نشان‌دهنده Enabled یا Automatic است.

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

وضعیت شارژ باتری را دریافت کنید

برای دریافت وضعیت شارژ فعلی دستگاه (درحال شارژ، شارژ کامل، یا درحال شارژ نبودن)، از batChargeState ویژگی PowerSource ویژگی استفاده کنید.

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

دریافت سطح باتری

برای دریافت میزان شارژ باتری فعلی، از مشخصه batChargeLevel ویژگی PowerSource استفاده کنید. سطح OK،‏ Warning (پایین)، یا Critical است.

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

دریافت منبع برق

برای تعیین منبع تغذیه دستگاه، از مشخصه‌های BatPresent و wiredPresent ویژگی PowerSource استفاده کنید.

  val trait: PowerSource
  val isWired = trait.wiredPresent
  val hasBattery = trait.batPresent

بررسی کنید که آیا باتری نیاز به تعویض دارد یا خیر

ویژگی batReplaceability نشان می‌دهد که آیا باتری غیرقابل تعویض، قابل تعویض توسط کاربر، یا قابل تعویض در کارخانه است.

مشخصه batReplacementNeeded در PowerSource ویژگی به شما می‌گوید که آیا باتری نیاز به تعویض دارد یا نه.

// Get the battery replacement status
val batteryStatus = powerSourceTrait.batReplacementNeeded

if (batteryStatus) {
  println("Replace the battery.")
}

وقتی باتری قابل تعویض توسط کاربر باشد، batReplacementDescription باتری را توصیف می‌کند، ازجمله اطلاعاتی مثل عامل شکل، شیمی، و سازنده ترجیحی.

تنظیمات صوتی

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

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

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

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

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

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

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

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

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

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

تنظیمات منطقه فعالیت

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

ویژگی ZoneManagement رابطی برای مدیریت مناطق سفارشی موردعلاقه (مناطق فعالیت) در دستگاه‌های دوربین و زنگ در فراهم می‌کند. از این مناطق برای فیلتر کردن تشخیص رویداد (مثل حرکت شخص یا وسیله نقلیه) در مناطق خاصی از میدان دید دستگاه استفاده می‌شود.

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

مناطق فعالیت معمولاً بااستفاده از مختصات دکارتی دوبعدی تعریف می‌شوند. این مشخصه TwoDCartesianVertexStruct را برای رأس‌ها و TwoDCartesianZoneStruct را برای تعریف منطقه (نام، رأس‌ها، رنگ، و کاربرد) ارائه می‌دهد.

بررسی مناطق فعالیت

برای نمایش مناطق فعالیت، zones مشخصه ZoneManagement ویژگی را بررسی کنید.

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

افزودن منطقه فعالیت

برای ایجاد منطقه جدید، از فرمان createTwoDCartesianZone استفاده کنید. این فرمان TwoDCartesianZoneStruct را می‌گیرد، که نام، رأس‌ها، رنگ، و کاربرد منطقه را تعریف می‌کند.

مثال زیر نشان می‌دهد چگونه منطقه‌ای به‌نام «ایوان جلویی» با چهار رأس ایجاد کنید که به رنگ صورتی (#F439A0) باشد و برای تشخیص حرکت استفاده شود.

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}")
  }
}

به‌روزرسانی منطقه فعالیت

برای به‌روز کردن منطقه موجود، از فرمان updateTwoDCartesianZone استفاده کنید. این فرمان به zoneId و TwoDCartesianZoneStruct به‌روزشده نیاز دارد.

private suspend fun ZoneManagement.updateZone(
  zoneId: UShort,
  zone: ZoneManagementTrait.TwoDCartesianZoneStruct
) {
  // Execute the command to update the zone
  this.updateTwoDCartesianZone(zoneId = zoneId, zone = zone)
}

حذف کردن منطقه فعالیت

برای برداشتن منطقه، از فرمان removeZone با zoneId خاص استفاده کنید.

private suspend fun ZoneManagement.deleteZone(zoneId: UShort) {
  // Execute the command to remove the zone
  this.removeZone(zoneId = zoneId)
}

راه‌اندازهای رویداد صوتی

ویژگی AvStreamAnalysis میانایی برای مدیریت کردن راه‌اندازهای تشخیص رویداد در دستگاه‌های دوربین و زنگ در فراهم می‌کند. درحالی‌که محرک‌های مبتنی بر دید (مانند افراد یا وسایل نقلیه) می‌توانند مختص منطقه باشند، محرک‌های مربوط به صدا معمولاً پیکربندی‌های سطح دستگاه هستند.

انواع محرک زیر برای تشخیص صدا با EventTriggerTypeEnum دردسترس است:

حالت مقدار Enum شرح
صدا Sound تشخیص صدای عمومی.
صحبت کردن یک شخص PersonTalking گفتار را تشخیص می‌دهد.
پارس سگ DogBark صدای سگ را تشخیص می‌دهد.
شکستن شیشه GlassBreak صدای شکستن شیشه را تشخیص می‌دهد.
هشدار دود SmokeAlarm زنگ‌های هشدار دود را تشخیص می‌دهد، که اغلب با الگوی شنیداری T3 (سه بوق کوتاه و سپس یک مکث) شناخته می‌شوند.
هشدار مونوکسیدکربن CoAlarm هشدارهای کربن منوکسید (CO) را تشخیص می‌دهد، که معمولاً با الگوی شنیداری T4 (چهار بوق کوتاه و سپس یک مکث) تشخیص داده می‌شود.

بررسی وضعیت تشخیص صدا

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

در توسعه Android بااستفاده از «جریان‌های Kotlin»، معمولاً ویژگی AvStreamAnalysis را از HomeDevice مشاهده می‌کنید.

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

به‌روزرسانی مجموعه راه‌اندازهای فعال

برای به‌روزرسانی مجموعه راه‌اندازهای فعال، از فرمان SetOrUpdateEventDetectionTriggers استفاده کنید که فهرست ساختارهای EventTriggerEnablement را می‌گیرد.

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

حالت‌های ضبط

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

ویژگی RecordingMode میانایی برای مدیریت رفتار ضبط ویدیو و تصویر در دستگاه‌های دوربین و زنگ در فراهم می‌کند. به کاربران امکان می‌دهد بین ضبط مداوم، ضبط رویدادمحور، یا غیرفعال کردن کامل ضبط (فقط «نمای زنده») انتخاب کنند.

RecordingModeEnum استراتژی‌های ضبط دردسترس را تعریف می‌کند:

حالت مقدار Enum شرح
غیرفعال Disabled ضبط کاملاً غیرفعال است. عمدتاً توسط دستگاه‌های قدیمی استفاده می‌شود.
CVR (ضبط ویدیو پیوسته) Cvr ویدیو به‌صورت شبانه‌روزی ضبط می‌شود. به اشتراک نیاز دارد (برای نمونه، Google Home Premium.
EBR (ضبط براساس رویداد) Ebr ضبط با رویدادها (شخص، حرکت) راه‌اندازی می‌شود. طول ویدیو به مدت رویداد و اشتراک بستگی دارد.
ETR (ضبط رویداد-راه‌اندازی‌شده) Etr ضبط پیش‌نمایش کوتاه (برای مثال، ۱۰ ثانیه) راه‌اندازی‌شده توسط رویدادها.
نمای زنده LiveView ضبط غیرفعال است، اما کاربران همچنان می‌توانند به جاری‌سازی زنده دسترسی داشته باشند.
تصاویر ثابت Images وقتی رویدادی رخ می‌دهد، به‌جای ویدیو، عکس فوری ضبط می‌شود.

بررسی حالت‌های ضبط

برای نمایش پیکربندی ضبط کنونی، مشخصه‌های ویژگی RecordingMode را بررسی کنید:

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

تغییر دادن حالت ضبط

قبل‌از به‌روزرسانی، مطمئن شوید که شاخص انتخاب‌شده از مشخصه supportedRecordingModes در مشخصه availableRecordingModes وجود دارد.

برای به‌روزرسانی حالت انتخاب‌شده، از تابع setSelectedRecordingMode استفاده کنید و نمایه‌ حالت انتخاب‌شده را ارسال کنید:

private suspend fun RecordingMode.updateRecordingMode(index: Int) {
    // Execute the command to update the selected mode
    this.setSelectedRecordingMode(index.toUByte())
}

سایر تنظیمات

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

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

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

// 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 Kotlin داخلی استفاده کنید:

// 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 به رابط کاربری برنامه و پیاده‌سازی دوربین بستگی دارد. در سطح بسیار ابتدایی، برای تنظیم نمای دوربین ویدیو، ویژگی viewport نشانگر CameraAvStreamManagement را با ViewportStruct، بااستفاده از تابع setViewport Kotlin داخلی به‌روز کنید:

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

فعال یا غیرفعال کردن تجزیه‌وتحلیل

هر دستگاه می‌تواند به‌صورت جداگانه موافقت کند که داده‌های تجزیه‌وتحلیل دقیق را به ابر Google Home ارسال کند (پایش ابری برای واسط‌های برنامه‌نویسی کاربردی خانه را ببینید).

برای فعال کردن تجزیه‌وتحلیل برای دستگاه، analyticsEnabled دارایی ExtendedGeneralDiagnosticsTrait را روی true تنظیم کنید. وقتی analyticsEnabled را تنظیم می‌کنید، دارایی دیگری، logUploadEnabled، به‌طور خودکار روی true تنظیم می‌شود، که به فایل‌های گزارش تجزیه‌وتحلیل اجازه می‌دهد در ابر Google Home بارگذاری شوند.

// Enable analytics
extendedGeneralDiagnostics.update {
  setAnalyticsEnabled(true)
}

// Disable analytics
extendedGeneralDiagnostics.update {
  setAnalyticsEnabled(false)
}

پیکربندی‌های انتقال و ضبط

این بخش تنظیمات مربوط به کیفیت جاری‌سازی دوربین و راه‌اندازی رویداد را پوشش می‌دهد. این تنظیمات توسط PushAvStreamTransport ویژگی مدیریت می‌شود.

خواندن تنظیمات انتقال

این بخش نشان می‌دهد که چگونه پیکربندی فعلی را از دستگاه دوربین یا زنگ در بازیابی کنید. این دستور ویژگی PushAvStreamTransport را واکشی می‌کند، اتصال خاصی را که برای ضبط استفاده شده است پیدا می‌کند، و سپس مقادیر فعلی کیفیت پهنای باند، حساسیت بیدار شدن، و حداکثر طول رویداد را استخراج می‌کند.

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

به‌روزرسانی تنظیمات حمل‌ونقل

این بخش نحوه تغییر تنظیمات حمل‌ونقل را نشان می‌دهد. این دستور TransportOptionsStruct جدیدی حاوی مقادیر جدید ایجاد می‌کند و سپس از دستور modifyPushTransport برای ارسال این تنظیمات به‌روزشده به دستگاه استفاده می‌کند و آن‌ها را روی اتصال ضبط‌شده‌ای که در مرحله قبلی پیدا شده است اعمال می‌کند.

برای اصلاح این تنظیمات، از فرمان modifyPushTransport با TransportOptionsStruct استفاده کنید.

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

تعیین کیفیت پهنای باند

videoStreamIdدارایی TransportOptionsStruct با پیکربندی جاری‌سازی ویدیو خاصی مطابقت دارد.

برای دریافت جاری‌سازی‌های ویدیویی پشتیبانی‌شده، به مشخصه allocatedVideoStreams مراجعه کنید، که فهرستی از VideoStreamStructs است. از ویژگی CameraAvStreamManagement برای دستگاه.

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

خصوصیت motionSensitivity TransportTriggerOptionsStruct با مقادیر زیر مطابقت دارد:

برچسب مقدار (UByte)
پایین ‫۱ واحد
متوسط ۵ واحد
حداکثر ‫۱۰ واحد

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

maxDuration دارایی TransportMotionTriggerTimeControlStruct با مدت‌های زیر (به ثانیه) مطابقت دارد:

  • ‫۱۰ دقیقه، ‫۱۵ دقیقه، ‫۳۰ دقیقه، ‫۶۰ دقیقه، ‫۱۲۰ دقیقه، ‫۱۸۰ دقیقه

تنظیمات Chime

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

تغییر صدای زنگ اخبار

برای تغییر دادن صدای زنگ در، ابتدا بااستفاده از 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 Kotlin، ویژگی selectedChime از مشخصه Chime را به‌روز کنید:

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

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

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

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

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

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

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

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

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

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

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

فعال کردن زمینه زنگ

   پیاده‌سازی‌شده در «برنامه نمونه برای Android»   

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

برای دیدن اینکه کدام زمینه‌های زنگ برای کاربر دردسترس است، فیلتر زمان‌بندی ایجاد کنید و از آن برای فیلتر کردن نتایج getAvailableThemes() فرمان از ChimeThemes ویژگی استفاده کنید. این دستور فهرستی از زمینه‌های دردسترس، ازجمله نام زمینه‌ها، را برمی‌گرداند.

مثال زیر نحوه فیلتر کردن فهرست را نشان می‌دهد. اگر زمان کنونی بین زمان شروع و پایان آن (مقادیر startTimeSeconds و endTimeSeconds، به‌ترتیب) باشد، موضوع فعال درنظر گرفته می‌شود. اگر زمان شروع تنظیم نشده باشد، از ابتدای زمان فعال درنظر گرفته می‌شود. اگر زمان پایانی تنظیم نشده باشد، تا ابد فعال می‌ماند. اگر هر دو وجود نداشته باشند، زمینه همیشه فعال است.

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

وقتی نام زمینه موردنظرتان را، مثلاً Christmas، پیدا کردید، می‌توانید آن را بااستفاده از تابع setSelectedTimeboxedThemeName() در مشخصه ChimeThemes انتخاب کنید:

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

تنظیمات اعلام بازدیدکننده

می‌توانید تنظیمات اعلام حضور مراجعه‌کننده را برای زنگ‌های در بااستفاده از ویژگی VisitorAnnouncement «میاناهای برنامه‌سازی کاربردی Home» پُرسمان و مدیریت کنید. این مشخصه کنترل می‌کند که حضور مراجعه‌کننده در بلندگوها یا نمایشگرهای هوشمند Google هنگام زدن زنگ در اعلام شود یا نه.

مثال زیر نشان می‌دهد چگونه بررسی کنید که آیا اعلام‌های بازدیدکننده فعال هستند یا نه، و چگونه این تنظیم را به‌روز کنید:

// Read the current visitor announcements state
val isEnabled = visitorAnnouncementTrait.visitorAnnouncementsEnabled

// Toggle the visitor announcements setting
visitorAnnouncementTrait.update {
    setVisitorAnnouncementsEnabled(true)
}

ازکار انداختن دستگاه

برای برداشتن زنگ در از ساختار، با device.decommissionDevice() تماس بگیرید. ازکار انداختن باعث می‌شود صفحه تأیید مدیریت‌شده توسط Google به کاربر نمایش داده شود و به او هشدار دهد که همه سابقه ویدیویی شبانه‌روزی ضبط‌شده، سابقه رویداد، کلیپ‌ها، و داده‌های کتابخانه چهره آشنا برای همیشه در سراسر ساختار حذف خواهد شد.

برای دستورالعمل‌های دقیق و نمونه‌های کد، به برداشتن دستگاه مراجعه کنید.