نوع دستگاه «زنگ در» بااستفاده از سه مشخصه پیادهسازی میشود:
PushAvStreamTransport،
که انتقال جاریسازی صوتی و تصویری را بااستفاده از
پروتکلهای مبتنی بر فشار مدیریت میکند،
WebRtcLiveView،
که امکان کنترل جاریسازیهای زنده و مکالمه متقابل را فراهم میکند، و
CameraSnapshot،
که پیشنمایشهای فوری ذخیرهشده و ضبطهای فوری زنده را ارائه میدهد.
همیشه قبلاز استفاده از هر ویژگی یا تلاش برای بهروزرسانی مشخصهها، پشتیبانی از مشخصه و فرمان را برای دستگاه بررسی کنید. برای اطلاعات بیشتر، کنترل دستگاهها در Android را ببینید.
| نوع دستگاه Home APIs | ویژگیها | برنامه نمونه Kotlin | کاربرد |
|---|---|---|---|
|
زنگ در
دستگاهی که با فشار دادن دکمهای در بیرون در فعال میشود و سیگنال شنیداری و/یا دیداری ایجاد میکند و برای جلب توجه فردی که در آن سوی در است استفاده میشود. زنگهای در ممکن است دارای جاریسازی زنده دسترسپذیر، مکالمه دوطرفه، یا رویدادهای تشخیص باشند. |
ویژگیهای الزامی 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 را بررسی کنید:
supportedRecordingModes- همه حالتهای بالقوهavailableRecordingModes- حالتهای قابل انتخابselectedRecordingMode- حالت فعال
// 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 به کاربر نمایش داده شود و به او هشدار دهد که همه سابقه ویدیویی شبانهروزی ضبطشده، سابقه رویداد، کلیپها، و دادههای کتابخانه چهره آشنا برای همیشه در سراسر ساختار حذف خواهد شد.
برای دستورالعملهای دقیق و نمونههای کد، به برداشتن دستگاه مراجعه کنید.