نوع دستگاه «زنگ در» بااستفاده از سه مشخصه پیادهسازی میشود:
PushAvStreamTransportTrait،
که انتقال جاریسازی صوتی و ویدیویی را بااستفاده از پروتکلهای مبتنی بر ارسال مدیریت میکند،
WebRtcLiveViewTrait،
که امکان کنترل جاریسازیهای زنده و TalkBack را فراهم میکند، و
CameraSnapshotTrait،
که عکسهای آنی پیشنمایش ذخیرهشده در حافظه نهان و عکسهای آنی زنده را ارائه میدهد.
همیشه قبلاز استفاده از هر ویژگی یا تلاش برای بهروزرسانی مشخصهها، پشتیبانی از مشخصه و فرمان را برای دستگاه بررسی کنید. برای اطلاعات بیشتر، به کنترل دستگاهها در iOS مراجعه کنید.
| نوع دستگاه Home APIs | ویژگیها | برنامه نمونه Swift | مورد استفاده |
|---|---|---|---|
|
زنگ در
دستگاهی که با دکمهای در بیرون در فعال میشود و سیگنال شنیداری و/یا دیداری ایجاد میکند و برای جلب توجه فردی که در جایی در آن سوی در است استفاده میشود. زنگهای در ممکن است دارای جاریسازی زنده دردسترس، مکالمه دوطرفه، یا رویدادهای تشخیص باشند. |
ویژگیهای الزامی google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
زنگ در |
دریافت اطلاعات پایه درباره دستگاه
در برنامه نمونه برای iOS پیادهسازی شده است
ویژگی BasicInformation
شامل اطلاعاتی مثل نام فروشنده، شناسه فروشنده، شناسه محصول،
نام محصول (شامل اطلاعات مدل)، و نسخه نرمافزار دستگاه است:
let vendorName = basicInfoTrait.attributes.vendorName! let vendorID = basicInfoTrait.attributes.vendorID! let productID = basicInfoTrait.attributes.productID! let productName = basicInfoTrait.attributes.productName! let softwareVersion = basicInfoTrait.attributes.softwareVersion!
دریافت شماره سریال
در برنامه نمونه برای iOS پیادهسازی شده است
برای دریافت شماره سریال دستگاه، از فرمان
GetSerialNumber در مشخصه
ExtendedBasicInformation استفاده کنید.
مثال زیر ذخیره کردن شماره سریال را در متغیری بهنام serialNumber نشان میدهد:
// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait let response = try await extendedBasicInformationTrait.getSerialNumber() let serialNumber = response.serialNumber
پاسخهای سریع
ویژگی «پاسخهای سریع» به کاربر امکان میدهد پیام ازپیش تعریفشدهای را به دستگاه زنگ در ارسال کند.
این ویژگی فقط در دستگاههای زنگ در دردسترس است. فهرست پیامهای ازپیش تعریفشده برای برنامه شریک دردسترس است و ممکن است آنها را برای انتخاب به کاربر ارائه دهد. پیامهای ازپیشتعریفشده توسط کاربر قابلویرایش نیستند.
«پاسخهای سریع» ازطریق ویژگی PresetMessage
پیادهسازی میشود.
پخش پیام ازپیش تنظیمشده
برای پخش پیام ازپیشتنظیمشده، روش
playPresetMessage
را فراخوانی کنید و یکی از مقادیر رشتهای موجود در ویژگی
availablePhraseTypes را به آن منتقل کنید.
import GoogleHomeSDK
import GoogleHomeTypes
func playDoorbellPresetMessage(device: HomeDevice, phraseTypeString: String) async {
// 1. Retrieve the GoogleDoorbellDeviceType helper on the device
guard let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) else {
print("This device is not a Google Doorbell or is currently uninitialized.")
return
}
// 2. Extract the Google.PresetMessageTrait
guard let presetMessageTrait = doorbellDeviceType.traits[Google.PresetMessageTrait.self] else {
print("PresetMessageTrait is not supported on this device.")
return
}
// 3. (Optional) Check available phrase types supported by the device
if let availablePhrases = presetMessageTrait.attributes.availablePhraseTypes {
let phraseTypeNames = availablePhrases.map { $0.phraseType }
print("Supported quick response phrases: \(phraseTypeNames)")
}
// 4. Send the playPresetMessage command asynchronously
do {
try await presetMessageTrait.playPresetMessage(phraseType: phraseTypeString)
print("Preset message successfully requested.")
} catch {
print("SDK error occurred playing preset message: \(error)")
}
}
تنظیم زبان گفتار
تنظیم زبان گفتار
زبان گفتاری فعال دستگاه را بااستفاده از روش setActiveLocale از ویژگی LocalizationConfiguration روی منطقه خاصی (برای مثال، «en_US») تنظیم کنید.
// Setting the active language // Assuming localizationConfigurationTrait: Matter.LocalizationConfigurationTrait let selectedLocale = "en_US" try await localizationConfigurationTrait.update { $0.setActiveLocale(selectedLocale) }
دریافت آخرین زمان تماس ابری دستگاه
برای پیدا کردن آخرین باری که دستگاه با فضای ابری تماس داشته است، از
مشخصه lastContactTimestamp
ویژگی
ExtendedGeneralDiagnostics
استفاده کنید:
if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp { self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp)) }
تنظیمات نوع پایه دوربین
مشخصه Mount
حاوی تنظیمات پایه دوربین و اطلاعات وضعیت است. میتوانید مشخصههایی مثل وضعیت نصب، نوع تشخیص، و نام نوع نصب را بخوانید.
علاوهبراین، میتوانید از ویژگی Mount برای لغو پیکربندی پیشفرض
نوع سوار کردن استفاده کنید.
// 1. Get the Mount trait guard let mountTrait = deviceType.traits[Google.MountTrait.self] else { print("Mount trait not supported or configured on this device.") return } // 2. Read the current mount state, detection type, and type name let mountState = mountTrait.attributes.mountState // Type: Google.MountTrait.MountStateEnum? let mountDetectionType = mountTrait.attributes.mountDetectionType // Type: Google.MountTrait.MountDetectionTypeEnum? let mountTypeName = mountTrait.attributes.mountTypeName // Type: String? // 3. Update the mount type override try await mountTrait.update { mutableTrait in mutableTrait.setMountTypeOverride(.official) }
بررسی اتصالپذیری دستگاه
اتصالپذیری دستگاه درواقع در سطح نوع دستگاه بررسی میشود زیرا برخیاز دستگاهها از چندین نوع دستگاه پشتیبانی میکنند. وضعیت برگرداندهشده ترکیبی از وضعیتهای اتصالپذیری برای همه ویژگیهای آن دستگاه است.
let doorbellConnectivity = doorbellDeviceType.metadata.sourceConnectivity.connectivityState
درصورت وجود انواع دستگاههای ترکیبی، ممکن است وضعیت partiallyOnline مشاهده شود
وقتی اتصال اینترنت وجود ندارد. ممکن است ویژگیهای استاندارد Matter بهدلیل مسیریابی محلی همچنان آنلاین باشند، اما ویژگیهای مبتنی بر ابر آفلاین خواهند بود.
دریافت نشانی IP دستگاه
برای پیدا کردن نشانی IP دستگاه، از مشخصه networkInterfaces
GeneralDiagnosticsTrait استفاده کنید.
نشانیها بهعنوان اشیاء Data برگردانده میشوند که میتوانید آنها را بااستفاده از چارچوب Network به رشتههای استاندارد IPv4 یا IPv6 قالببندی کنید:
func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
let interfaces = trait.attributes.networkInterfaces ?? []
var ipAddresses: [String] = []
for interface in interfaces {
for data in interface.iPv4Addresses {
if let ipv4 = IPv4Address(data) {
ipAddresses.append(String(describing: ipv4))
}
}
for data in interface.iPv6Addresses {
if let ipv6 = IPv6Address(data) {
ipAddresses.append(String(describing: ipv6))
}
}
}
return ipAddresses
}
شروع کردن جاریسازی زنده
در برنامه نمونه برای iOS پیادهسازی شده است
برای شروع جاریسازی زنده، رشته «پروتکل شرح جلسه» (SDP) را به روش startLiveView(offerSdp:) مشخصه WebRtcLiveViewTrait ارسال کنید که سه مقدار را برمیگرداند:
- «پروتکل شرح جلسه» برای جلسه.
- مدت جلسه برحسب ثانیه.
- شناسه جلسه که ممکن است برای تمدید یا پایان دادن به جلسه استفاده شود.
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
do {
// Sending StartLiveView command
let response = try await liveViewTrait.startLiveView(
offerSdp: offerSdp
)
// Received StartLiveView response
return (
answerSdp: response.answerSdp,
mediaSessionId: response.mediaSessionId,
liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
)
} catch {
// Failed to send StartLiveView command
throw error
}
}
تمدید کردن جاریسازی زنده
در برنامه نمونه برای iOS پیادهسازی شده است
جاریسازیهای زنده مدت زمان ازپیش تعیینشدهای دارند که پساز آن منقضی میشوند. برای طولانیتر کردن
مدت جاریسازی فعال، بااستفاده از روش
extendLiveView(mediaSessionId:optionalArgsProvider:)
درخواست تمدید ارسال کنید:
public func extendLiveView(mediaSessionId: String) async throws {
do {
// Extending live view
let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
} catch {
// Failed to extend live view
throw error
}
}
شروع و توقف TalkBack
در برنامه نمونه برای iOS پیادهسازی شده است
برای شروع TalkBack، روش startTalkback(mediaSessionId:optionalArgsProvider:) مشخصه WebRtcLiveViewTrait را فراخوانی کنید.
برای توقف، از stopTalkback(mediaSessionId:) استفاده کنید.
public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
do {
if isOn {
try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
} else {
try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
}
} catch {
throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
}
}
مدیریت جاریسازی زنده
در برنامه نمونه برای iOS پیادهسازی شده است
تنظیم کیفیت جاریسازی زنده برای بهینهسازی استفاده از پهنای باند براساس بافتار مشاهده مشتری مفید است (برای مثال، جابهجایی به وضوح پایینتر هنگام نمایش کاشی پیشنمایش کوچکتر، نمای جدولی، یا حالت تصویردرتصویر).
تغییر پویای کیفیت بااستفاده از ویژگی
WebRtcLiveView
بهطور خاص وضوح جلسه جاریسازی زنده فعال را در یک کارخواه خاص مدیریت میکند. این تنظیمات با پیکربندی تنظیمات استفاده از پهنای باند در سراسر دستگاه بهطور مستقیم در دستگاه یکسان نیست، که بر همه بینندگان همزمان و کیفیت ضبطهای ویدیویی تاریخی ذخیرهشده در فضای ابری تأثیر میگذارد.
مثال زیر نحوه بازیابی و بهروزرسانی کیفیت جاریسازی زنده را برای دستگاه نشان میدهد:
بازیابی گزینههای کیفیت پشتیبانیشده: دریافت وضوحهای جاریسازی دردسترس که دستگاه از آنها پشتیبانی میکند. کد، ویژگی
WebRtcLiveViewرا جستجو میکند تا کیفیتهای جاریسازی پشتیبانیشده را بهعنوان فهرستی از مقادیرQualityHint(مانند.sd،.hd،.fhd،.qhd، یا.uhd) بااستفاده از ویژگیsupportedQualityHintsنمایش دهد.تغییر کیفیت جاریسازی زنده: برای تغییر وضوح جاریسازی زنده فعال،
QualityHintانتخابشده را اعمال کنید (برای مثال، تغییر از «وضوح استاندارد» به «وضوح بالا»). تابعupdateQualityHintاز روشchangeLiveViewQualityویژگیWebRtcLiveViewبرای اعمال پیکربندیQualityHintانتخابشده به جلسه رسانه فعال استفاده میکند.
public var supportedQualityHints: [Google.WebRtcLiveViewTrait.QualityHint] { return liveViewTrait?.attributes.supportedQualityHints ?? [] } public func updateQualityHint( liveViewTrait: Google.WebRtcLiveViewTrait, hint: Google.WebRtcLiveViewTrait.QualityHint, mediaSessionId: String ) async { do { _ = try await liveViewTrait.changeLiveViewQuality( mediaSessionId: mediaSessionId, qualityHint: hint ) } catch { // error } }
فعال و غیرفعال کردن قابلیت ضبط
برای فعال کردن قابلیت ضبط دوربین،
TransportStatusEnum.Active
را به روش
setTransportStatus(transportStatus:optionalArgsProvider:)
ویژگی
PushAvStreamTransportTrait
منتقل کنید. برای غیرفعال کردن قابلیت ضبط، آن را
TransportStatusEnum.Inactive کنید.
در مثال زیر، این فراخوانیها را در یک فراخوانی واحد قرار میدهیم که از
Boolean برای روشن/خاموش کردن قابلیت ضبط استفاده میکند:
public func toggleIsRecording(isOn: Bool) {
self.uiState = .loading
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return
}
Task {
do {
try await pushAvStreamTransportTrait.setTransportStatus(
transportStatus: isOn ? .active : .inactive)
if isOn {
do {
self.player = try self.createWebRtcPlayer()
} catch {
// Failed to initialize WebRtcPlayer
self.uiState = .disconnected
return
}
await self.player?.initialize()
self.uiState = .live
} else {
self.player = nil
self.uiState = .off
}
} catch {
// Failed to toggle onOff
}
}
}
فعال یا غیرفعال کردن قابلیت ضبط دوربین مانند روشن یا خاموش کردن ویدیو دوربین است. وقتی ویدیو دوربین روشن است، درحال ضبط کردن است (برای اهداف رویدادها و کلیپهای مرتبط).
وقتی قابلیت ضبط غیرفعال است (ویدیو دوربین خاموش است):
- دوربین همچنان میتواند طبق
connectivityStateنوع دستگاه بهعنوان آنلاین نشان داده شود. - جاریسازی زنده دردسترس نیست و دوربین هیچ رویداد ابری را شناسایی نمیکند.
بررسی کنید که آیا قابلیت ضبط فعال است یا نه
برای تعیین اینکه آیا قابلیت ضبط دوربین فعال است یا نه، بررسی کنید که آیا اتصالی فعال است یا نه. مثال زیر دو تابع را برای انجام این کار تعریف میکند:
public func isDeviceRecording() -> Bool {
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return false
}
guard
let hasActiveConnection =
pushAvStreamTransportTrait
.attributes
.currentConnections?
.contains(where: { $0.transportStatus == .active })
else {
return false
}
return hasActiveConnection
}
بازیابی عکسهای آنی دوربین
در برنامه نمونه برای iOS پیادهسازی شده است
از ویژگی CameraSnapshot برای بازیابی عکسهای آنی تصویر ثابت از دوربین استفاده کنید.
این عکسهای آنی برای چندین سناریو مفید هستند:
- بهعنوان کاشی جایبان در میانای کاربر درحین بار شدن جاریسازی زنده WebRTC.
- بهعنوان تصویر پیشنمایش ثابت که با تعامل کاربر به جاریسازی زنده ارتقا مییابد.
- بهعنوان بوم پسزمینه برای ترسیم و پیکربندی مناطق فعالیت سفارشی.
ویژگی CameraSnapshot دو روش برای واکشی عکسهای آنی ارائه میدهد، بسته به اینکه
آیا برای رندر سریع به عکس آنی ذخیرهشده در حافظه نهان نیاز دارید یا به عکس آنی زنده
درخواستی.
دریافت عکس آنی پیشنمایش ذخیرهشده در حافظه نهان
عکس آنی پیشنمایش تصویری ذخیرهشده در حافظه نهان است که کیت توسعه نرمافزار میتواند بدون فعال کردن دوربین آن را بازیابی کند. این سریعترین روش برای واکشی تصویر ثابت است و برای صفحههای نمای کلی دوربین یا شبکههای داشبورد ایدهآل است.
برای دریافت عکس آنی پیشنمایش، مشخصه ویژگی preview_image_url را بخوانید:
guard let cameraSnapshotTrait = deviceType.traits[ Google.CameraSnapshotTrait.self ] else { print("CameraSnapshot trait not supported on this device.") return } if let previewImageUrlString = cameraSnapshotTrait .attributes.preview_image_url, let url = URL(string: previewImageUrlString) { // Load the preview image from the URL }
بسته به پیکربندی و فعالیت دوربین، نشانی وب پیشنمایش به تصویر ذخینهشدهای اشاره میکند که از فیلم ویدیویی اخیر (اولین قاب I از آخرین قطعه ویدیو) یا عکس آنیای که بهطور دورهای توسط دوربین بارگذاری شده است تولید شده است.
برای نشان دادن تازگی تصویر، فضای ابری Google Home یک
سرصفحه X-Home-Image-Captured-At را در تصویر JPEG/PNG ارائهشده
جاسازی میکند که در قالب UTC است. میتوانید این سرصفحه را در
سمت کارخواه تجزیه کنید تا سن عکس آنی را در برنامه نمایش دهید.
دریافت عکس آنی زنده درخواستی
برای مسیرهای کاربر که به نمای زنده فعلی دوربین نیاز دارند (مثلاً راهاندازی «مناطق فعالیت»)، میتوانید عکس آنی زنده درخواست کنید. راهاندازی عکس آنی زنده به دوربین دستور میدهد که بیدار شود، قاب جدیدی را ضبط کند، و آن را در فضای ابری بارگذاری کند.
برای درخواست عکس آنی زنده، از فرمان getLiveSnapshot() استفاده کنید:
do { let response = try await cameraSnapshotTrait.getLiveSnapshot() let snapshotUrlString = response.snapshot_url if let url = URL(string: snapshotUrlString) { // Load the live snapshot image from the URL } } catch { print("Failed to get live snapshot: \(error)") }
اصالتسنجی کردن درخواستهای عکس آنی
در برنامه نمونه برای iOS پیادهسازی شده است
همه نشانیهای وب عکس آنی به رسانه ایمن اشاره میکنند و به کد OAuth 2.0 برای
دامنه Home APIs v2 نیاز دارند. برای بارگیری و ارائه تصاویر، کد OAuth باید بهعنوان کد «دارنده» در سرصفحه Authorization درخواست HTTP شما تزریق شود.
مثال زیر نحوه پیکربندی درخواست شبکه امن برای بارگیری عکس آنی را نشان میدهد:
import UIKit func loadSnapshotImage(from url: URL, home: Home) async -> UIImage? { do { // 1. Retrieve the OAuth access token from the Home APIs SDK let (accessToken, _) = try await home.permissions.authorization() // 2. Configure the HTTP GET request with the Bearer token var request = URLRequest(url: url) request.setValue( "Bearer \(accessToken)", forHTTPHeaderField: "Authorization" ) // 3. Fetch the image data let (data, _) = try await URLSession.shared.data(for: request) return UIImage(data: data) } catch { print("Error loading snapshot image: \(error)") return nil } }
تنظیمات باتری
تنظیمات مختلف باتری را میتوان ازطریق Home API کنترل کرد.
تنظیم اولویت مصرف باتری
تنظیم توازن انرژی به شما امکان میدهد توازن بین عمر باتری و عملکرد دستگاه را پیکربندی کنید. میتوانید نمایههای باتری مختلفی مثل «طولانی»، «متعادل»، و «عملکرد» ایجاد کنید و بین آنها جابهجا شوید.
این ویژگی با بهروزرسانی مشخصه
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" } ] }
private func setBatteryUsage(to option: UInt8) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentEnergyBalance(option) } }
روشن کردن «بهینهسازی باتری» خودکار
در برنامه نمونه برای iOS پیادهسازی شده است
برای پیکربندی این ویژگی، مشخصه
currentLowPowerModeSensitivity
ویژگی EnergyPreference
را بهروز کنید. این مشخصه از نمایهای برای انتخاب سطح حساسیت استفاده میکند، که در آن 0 معمولاً نشاندهنده Disabled است و 1 نشاندهنده Enabled یا Automatic است.
private func setAutoBatterySaver(to value: Bool) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0) } }
دریافت وضعیت شارژ باتری
در برنامه نمونه برای iOS پیادهسازی شده است
برای دریافت وضعیت شارژ فعلی دستگاه (درحال شارژ، شارژ کامل، یا عدم شارژ)، از مشخصه
batChargeState
ویژگی
PowerSource
استفاده کنید.
self.chargingState = powerSourceTrait.attributes.batChargeState var description: String switch self.chargingState { case .isCharging: description = "Charging" case .isAtFullCharge: description = "Full" case .isNotCharging: description = "Not Charging" default: description = "Unknown" }
دریافت سطح باتری
برای دریافت سطح باتری فعلی، از مشخصه
batChargeLevel
ویژگی
PowerSource
استفاده کنید. سطح آن OK، Warning (پایین)، یا Critical است.
self.batteryLevel = powerSourceTrait.attributes.batChargeLevel var description: String switch self.batteryLevel { case .ok: description = "OK" case .warning: description = "Warning" case .critical: description = "Critical" default: description = "Unknown" }
دریافت منبع برق
برای تعیین منبع برقی که دستگاه استفاده میکند،
از مشخصههای BatPresent
و
wiredPresent
در ویژگی
PowerSource
استفاده کنید.
if powerSourceTrait.attributes.wiredPresent ?? false { self.powerSourceType = .wired } else if powerSourceTrait.attributes.batPresent ?? false { self.powerSourceType = .battery } else { self.powerSourceType = nil }
بررسی کنید که آیا باتری نیاز به تعویض دارد یا نه
مشخصه batReplaceability نشان میدهد که باتری غیرقابلتعویض است، توسط کاربر قابلتعویض است، یا توسط کارخانه قابلتعویض است.
اگر باتری قابلتعویض باشد،
batReplacementNeeded
مشخصه
PowerSource
به شما میگوید که آیا باتری باید تعویض شود یا نه.
// Get the battery replacement status var batteryStatus = powerSourceTrait.attributes.batReplacementNeeded if batteryStatus { print("Replace the battery.") }
وقتی باتری قابلتعویض توسط کاربر باشد،
batReplacementDescription
باتری را توصیف میکند، ازجمله اطلاعاتی مانند ضریب شکل، شیمی، و
سازنده ترجیحی.
تنظیمات صوتی
تنظیمات صوتی مختلف را میتوان ازطریق Home API کنترل کرد.
روشن یا خاموش کردن میکروفون
برای روشن یا خاموش کردن میکروفون دستگاه، مشخصه
microphoneMuted
ویژگی CameraAvStreamManagementTrait را بااستفاده از تابع داخلی
setMicrophoneMuted بهروز کنید:
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
روشن یا خاموش کردن ضبط صدا
برای روشن یا خاموش کردن ضبط صدا برای دستگاه، مشخصه
recordingMicrophoneMuted
ویژگی CameraAvStreamManagementTrait را بااستفاده از تابع داخلی
setRecordingMicrophoneMuted بهروز کنید:
// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setRecordingMicrophoneMuted(!on)
}
} catch {
// Error
}
}
تنظیم میزان صدای بلندگو
برای تنظیم میزان صدای بلندگو برای دستگاه،
ویژگی speakerVolumeLevel
مشخصه CameraAvStreamManagementTrait را بااستفاده از
تابع داخلی setSpeakerVolumeLevel بهروز کنید:
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
تنظیمات منطقه فعالیت
در برنامه نمونه برای iOS پیادهسازی شده است
ویژگی ZoneManagement واسطی برای مدیریت مناطق موردعلاقه سفارشی (مناطق فعالیت) در دستگاههای دوربین و زنگ در ارائه میدهد.
از این مناطق برای فیلتر کردن تشخیص رویداد (مثل حرکت فرد یا خودرو) در مناطق خاصی در میدان دید دستگاه استفاده میشود.
مناطق فعالیت توسط کاربر در برنامه شریک پیکربندی میشوند، و به آنها اجازه میدهند تا مناطقی را روی نواحی خاصی در میدان دید دوربین ترسیم کنند. سپس این مناطق تعریفشده توسط کاربر به ساختارهای مورداستفاده این مشخصه ترجمه میشوند. برای اطلاعات بیشتر درباره نحوه عملکرد مناطق فعالیت، به راهاندازی و استفاده از «مناطق فعالیت» مراجعه کنید.
مناطق فعالیت معمولاً بااستفاده از مختصات دکارتی دوبعدی تعریف میشوند.
این ویژگی
TwoDCartesianVertexStruct را برای رئوس و
TwoDCartesianZoneStruct
را برای تعریف منطقه (نام، رئوس، رنگ، و کاربرد) ارائه میدهد.
بررسی مناطق فعالیت
برای نمایش مناطق فعالیت، مشخصه
zones
از ویژگی ZoneManagement را بررسی کنید.
let zoneManagementTrait: Google.ZoneManagementTrait self.zones = zoneManagementTrait.attributes.zones ?? []
افزودن منطقه فعالیت
برای ایجاد منطقه جدید، از فرمان
createTwoDCartesianZone استفاده کنید. این فرمان TwoDCartesianZoneStruct را میگیرد،
که نام، رئوس، رنگ، و کاربرد منطقه را تعریف میکند.
مثال زیر نشان میدهد که چگونه منطقهای بهنام «ایوان جلو» با چهار رأس، رنگ سالمون (#F439A0)، و مورداستفاده برای تشخیص حرکت ایجاد کنید.
import GoogleHomeSDK import GoogleHomeTypes func createFrontPorchZone(trait: Google.ZoneManagementTrait) async { // 1. Define the vertices for the zone (2D Cartesian coordinates) // Values are UInt16, typically scaled to the device's twoDCartesianMax. let vertices = [ Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090) ] // 2. Define the zone structure using the given SDK struct let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct( name: "Front Porch", use: [.motion], // ZoneUseEnum.motion vertices: vertices, // Color is a hex string (for example, Salmon/Pink) color: "#F439A0" ) do { // 3. Execute the raw command to add the zone to the device // This returns the created zone's ID (UInt16). var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone) } catch { // Error } }
بهروزرسانی منطقه فعالیت
برای بهروزرسانی منطقه موجود، از فرمان
updateTwoDCartesianZone استفاده کنید. این فرمان به zoneId و
TwoDCartesianZoneStruct بهروزشده نیاز دارد.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct do { _ = try await zoneManagementTrait.updateTwoDCartesianZone( zoneID: zoneID, zone: zone) } catch { // Error }
حذف منطقه فعالیت
برای برداشتن منطقه، از فرمان
removeZone با zoneId خاص استفاده کنید.
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 do { _ = try await zoneManagementTrait.removeZone(zoneID: zoneID) } catch { // Error }
راهاندازهای رویداد صوتی
ویژگی AvStreamAnalysis میانایی برای مدیریت راهاندازهای تشخیص رویداد در دستگاههای دوربین و زنگ در ارائه میدهد. درحالیکه راهاندازهای مبتنی بر بینایی (مانند افراد یا وسایل نقلیه) میتوانند مختص منطقه باشند، راهاندازهای مرتبط با صدا معمولاً پیکربندیهای سطح دستگاه هستند.
انواع راهاندازهای زیر برای تشخیص صدا با
EventTriggerTypeEnum دردسترس است:
| حالت | مقدار Enum | شرح |
|---|---|---|
| صدا | Sound |
تشخیص صدای عمومی. |
| صحبت کردن یک شخص | PersonTalking |
گفتار را تشخیص میدهد. |
| پارس سگ | DogBark |
صدای سگسانان را تشخیص میدهد. |
| شکستن شیشه | GlassBreak |
صدای شکستن شیشه را تشخیص میدهد. |
| هشدار دود | SmokeAlarm |
هشدار دود را تشخیص میدهد، که اغلب با الگوی شنیداری T3 (سه بوق کوتاه و سپس یک مکث) شناخته میشود. |
| هشدار مونوکسیدکربن | CoAlarm |
هشدارهای کربن مونوکسید (CO) را تشخیص میدهد، معمولاً با الگوی شنیداری T4 (چهار بوق کوتاه و سپس مکث) تشخیص داده میشود. |
بررسی وضعیت تشخیص صدا
برای نمایش وضعیت فعلی تشخیص صدا به کاربر، باید بررسی کنید دستگاه از چه چیزی پشتیبانی میکند و چه چیزی توسط سختافزار دستگاه فعال شده است. دو مشخصهای که باید بررسی شود عبارتاند از:
در توسعه iOS، معمولاً برای خواندن این مشخصهها،
به ویژگی AvStreamAnalysis از دستگاه دسترسی پیدا میکنید.
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? [] let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? [] let eventTriggers [EventTrigger] = [] for trigger in possibleEventTriggers { self.eventTriggers.append( EventTrigger( id: trigger, enabled: enabledEventTriggers.contains(trigger) ) ) }
بهروزرسانی مجموعه راهاندازهای فعالشده
برای بهروزرسانی مجموعه راهاندازهای فعالشده، از فرمان
SetOrUpdateEventDetectionTriggers
استفاده کنید که فهرستی از ساختارهای EventTriggerEnablement را میگیرد.
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let eventTriggers: [EventTrigger] let enabledEventTriggers = eventTriggers.map { Google.AvStreamAnalysisTrait.EventTriggerEnablement( eventTriggerType: $0.id, enablementStatus: $0.enabled ? .enabled : .disabled ) } try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers( eventTriggerEnablements: enabledEventTriggers )
حالتهای ضبط
در برنامه نمونه برای iOS پیادهسازی شده است
مشخصه RecordingMode میانایی برای مدیریت رفتار ضبط ویدیو و تصویر در دستگاههای دوربین و زنگ در ارائه میدهد. این ویژگی به کاربران امکان میدهد بین ضبط پیوسته، ضبط مبتنی بر رویداد، یا غیرفعال کردن کامل ضبط (فقط «نمای زنده») انتخاب کنند.
RecordingModeEnum
استراتژیهای ضبط دردسترس را تعریف میکند:
| حالت | مقدار Enum | شرح |
|---|---|---|
| غیرفعال | Disabled |
ضبط کاملاً غیرفعال است. عمدتاً توسط دستگاههای قدیمی استفاده میشود. |
| CVR (ضبط ویدیو پیوسته) | Cvr |
ویدیو بهصورت شبانهروزی ضبط میشود. به اشتراک نیاز دارد (برای مثال، Google Home Premium. |
| EBR (ضبط درصورت رویداد) | Ebr |
ضبط با رویدادها (شخص، حرکت) راهاندازی میشود. طول ویدیو به مدت رویداد و اشتراک بستگی دارد. |
| ETR (ضبط با راهانداز رویداد) | Etr |
ضبط پیشنمایش کوتاه (برای مثال، ۱۰ ثانیه) که با رویدادها راهاندازی میشود. |
| نمای زنده | LiveView |
ضبط غیرفعال است، اما کاربران همچنان میتوانند به جاریسازی زنده دسترسی داشته باشند. |
| تصاویر ثابت | Images |
هنگام وقوع رویدادها، بهجای ویدیو، عکس آنی ضبط میشود. |
بررسی کردن حالتهای ضبط
برای نمایش پیکربندی ضبط فعلی، مشخصههای
ویژگی RecordingMode را بررسی کنید:
supportedRecordingModes- همه حالتهای بالقوهavailableRecordingModes- حالتهای قابلانتخابselectedRecordingMode- حالت فعال
// Example struct to store recording modes. public struct RecordingMode: Hashable { public let id: UInt8 public let mode: Google.RecordingModeTrait.RecordingModeEnum } let recordingModeTrait: Google.RecordingModeTrait if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes, let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes, let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode { var recordingModes: [RecordingMode] = [] for recordingModeId in availableRecordingModes { guard Int(recordingModeId) < supportedRecordingModes.count, Int(recordingModeId) >= 0 else { // Out of bounds error } recordingModes.append( RecordingMode( id: recordingModeId, mode: supportedRecordingModes[Int(recordingModeId)].recordingMode, ) ) } }
تغییر دادن حالت ضبط
قبلاز بهروزرسانی، مطمئن شوید که نمایه انتخابشده از مشخصه supportedRecordingModes
در مشخصه availableRecordingModes وجود دارد.
برای بهروزرسانی حالت انتخابشده، از تابع
setSelectedRecordingMode استفاده کنید و نمایه حالت انتخابشده را ارسال کنید:
let recordingModeTrait: Google.RecordingModeTrait let recordingModeID: UInt8 _ = try await recordingModeTrait.update { $0.setSelectedRecordingMode(recordingModeID) }
سایر تنظیمات
تنظیمات مختلف دیگری را میتوان ازطریق Home API کنترل کرد.
روشن یا خاموش کردن دید در شب
برای روشن یا خاموش کردن دید در شب برای دوربین، از TriStateAutoEnum استفاده کنید
تا مشخصه
nightVision
از ویژگی CameraAvStreamManagementTrait را بااستفاده از تابع داخلی
setNightVision بهروز کنید:
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
تغییر روشنایی LED وضعیت
برای تغییر دادن روشنایی LED وضعیت، از
ThreeLevelAutoEnum
برای بهروزرسانی ویژگی
statusLightBrightness
از مشخصه CameraAvStreamManagementTrait بااستفاده از تابع داخلی
setStatusLightBrightness استفاده کنید:
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
تغییر دادن نمای دوربین
نمای دوربین همان ویژگی «بزرگنمایی و برش» است که در مقاله پشتیبانی بزرگنمایی و بهبود ویدیو دوربین Nest توضیح داده شده است.
نمای هدف در ViewportStruct تعریف میشود که شامل چهار مقدار است که
بهعنوان مختصات نمای هدف استفاده میشوند. مختصات بهصورت زیر تعریف میشود:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
تعیین مقادیر برای ViewportStruct به رابط کاربری برنامه و
پیادهسازی دوربین بستگی دارد. در سطح بسیار ابتدایی، برای تنظیم کردن نمای دوربین
ویدیو،
ویژگی viewport
مشخصه CameraAvStreamManagementTrait را با ViewportStruct، بااستفاده از
تابع داخلی setViewport بهروز کنید.
func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {
let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
x1: x1,
y1: y1,
x2: x2,
y2: y2
)
Task {
do {
try await cameraAvStreamManagementTrait.update {
$0.setViewport(viewport)
}
} catch {
// Error
}
}
}
تولید TransportOptionsStruct
برخیاز تنظیمات نیاز به اصلاح ویژگیها در TransportOptionsStruct دارند،
که سپس به گزینههای انتقال اتصال جاریسازی منتقل میشود. برای
Swift، این ساختار باید قبلاز بهروزرسانی هر ویژگی تولید شود.
از این تابع کمکی برای تولید ساختار برای استفاده با تغییرات تنظیمات زیر استفاده کنید:
func getTransportOptions(
transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
wakeUpSensitivity: UInt8?,
maxEventLength: UInt32?
) async throws
-> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{
var newMotionTimeControl:
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
if let maxEventLength {
guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
throw HomeError.failedPrecondition(
// Error - cannot update max event length without motion time control
}
newMotionTimeControl =
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
initialDuration: motionTimeControl.initialDuration,
augmentationDuration: motionTimeControl.augmentationDuration,
maxDuration: maxEventLength,
blindDuration: motionTimeControl.blindDuration
)
}
return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
streamUsage: .recording,
videoStreamID: nil,
audioStreamID: nil,
tlsEndpointID: transportOptions.tlsEndpointID,
url: transportOptions.url,
triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
triggerType: .motion,
motionZones: nil,
motionSensitivity: wakeUpSensitivity,
motionTimeControl: newMotionTimeControl,
maxPreRollLen: nil
),
ingestMethod: .cmafIngest,
containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
containerType: .cmaf,
cmafContainerOptions: nil
),
expiryTime: nil
)
}
private func getRecordingConnection() async throws
-> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
guard let pushAvStreamTransportTrait else {
// Error - PushAvStreamTransport trait not available
return nil
}
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations
for connection in connections {
guard let transportOptions = connection.transportOptions,
transportOptions.streamUsage == .recording
else {
continue
}
return connection
}
return nil
}
فعال یا غیرفعال کردن Analytics
هر دستگاه میتواند بهطور جداگانه برای ارسال دادههای تحلیلی دقیق به فضای ابری Google Home موافقت کند (به پایش ابری برای Home APIs مراجعه کنید).
برای فعال کردن تجزیهوتحلیل برای دستگاه، ویژگی
analyticsEnabled)
ExtendedGeneralDiagnosticsTrait
را روی true تنظیم کنید. وقتی analyticsEnabled را تنظیم میکنید،
دارایی دیگری، logUploadEnabled، بهطور خودکار روی true تنظیم میشود که
اجازه میدهد فایلهای گزارش تجزیهوتحلیل در فضای ابری Google Home بارگذاری شود.
// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(true)
}
// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(false)
}
پیکربندیهای انتقال و ضبط
این بخش تنظیمات مربوط به کیفیت جاریسازی دوربین و
راهاندازی رویداد را پوشش میدهد. این تنظیمات توسط ویژگی
PushAvStreamTransport
مدیریت میشود.
خواندن تنظیمات حملونقل
این بخش نشان میدهد که چگونه پیکربندی فعلی را از دستگاه زنگ در یا دوربین بازیابی کنید. این کد ویژگی PushAvStreamTransport را واکشی میکند،
اتصال خاصی را که برای ضبط استفاده میشود پیدا میکند، و سپس
مقادیر فعلی کیفیت پهنای باند، حساسیت تنظیمات بیدار شدن،
و حداکثر طول رویداد را استخراج میکند.
// Assuming access to // var pushAvStreamTransportTrait: Google.PushAvStreamTransportTrait let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations // Locate the connection designated for recording let recordingConnection = connections.first { connection in guard let transportOptions = connection.transportOptions else { return false } return transportOptions.streamUsage == .recording } let options = recordingConnection?.transportOptions // 1. Bandwidth Quality (Video Stream ID) let videoStreamId = options?.videoStreamID // 2. Wake-up Sensitivity (Motion Sensitivity) let wakeUpSensitivity = options?.triggerOptions.motionSensitivity // 3. Max Event Length (Motion Trigger Time Control) let maxEventLength = options?.triggerOptions.motionTimeControl?.maxDuration
بهروزرسانی تنظیمات حملونقل
این بخش نحوه تغییر تنظیمات انتقال را نشان میدهد.
این کد یک TransportOptionsStruct جدید حاوی مقادیر جدید ایجاد میکند و
سپس از فرمان modifyPushTransport برای ارسال این تنظیمات بهروزشده
به دستگاه استفاده میکند و آنها را روی اتصال ضبط که در
مرحله قبل پیدا شده است اعمال میکند.
برای اصلاح این تنظیمات، از
فرمان modifyPushTransport
با TransportOptionsStruct استفاده کنید.
// Example: Updating to Max Quality and 30s duration let currentOptions = recordingConnection!.transportOptions! let newOptions = Google.PushAvStreamTransportTrait.TransportOptionsStruct( streamUsage: .recording, videoStreamID: 2, // Max Quality tlsEndpointID: currentOptions.tlsEndpointID, url: currentOptions.url, triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct( triggerType: .motion, motionSensitivity: 5, // Medium motionTimeControl: Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct( initialDuration: currentOptions.triggerOptions.motionTimeControl?.initialDuration ?? 10, augmentationDuration: currentOptions.triggerOptions.motionTimeControl?.augmentationDuration ?? 5, maxDuration: 30, blindDuration: currentOptions.triggerOptions.motionTimeControl?.blindDuration ?? 0 ) ), ingestMethod: currentOptions.ingestMethod, containerOptions: currentOptions.containerOptions ) try await pushAvStreamTransportTrait.modifyPushTransport( connectionID: recordingConnection!.connectionID, transportOptions: newOptions )
تعیین کیفیت پهنای باند
مشخصه videoStreamId
TransportOptionsStruct با پیکربندی خاصی از جاریسازی ویدیو مطابقت دارد.
برای دریافت جاریسازیهای ویدیویی پشتیبانیشده، به
مشخصه allocatedVideoStreams مراجعه کنید
که فهرستی از VideoStreamStructs است.
از ویژگی CameraAvStreamManagement برای دستگاه.
تنظیم حساسیت بیدار شدن دستگاه
ویژگی motionSensitivity
TransportTriggerOptionsStruct با مقادیر زیر مطابقت دارد:
| برچسب | مقدار (UInt8) |
|---|---|
| پایین | 1 |
| متوسط | 5 |
| زیاد | 10 |
تنظیم حداکثر طول رویداد
ویژگی maxDuration
TransportMotionTriggerTimeControlStruct
با مدتهای UInt32 زیر (به ثانیه) مطابقت دارد:
- 10، 15، 30، 60، 120، 180
تنظیمات زنگ اخبار
تنظیمات مختلف زنگ اخبار را میتوان ازطریق Home API کنترل کرد.
تغییر صدای زنگ اخبار
برای تغییر صدای زنگ اخبار، ابتدا فهرست صداهای زنگ نصبشده در دستگاه را بااستفاده از مشخصه installedChimeSounds از ویژگی ChimeTrait دریافت کنید:
doorbellChimeTrait.attributes.installedChimeSounds?.compactMap { chimeSound in
return chimeSound.chimeID, chimeSound.name
}
سپس، مشخصه
selectedChime
ویژگی ChimeTrait را بااستفاده از تابع داخلی setSelectedChime
بهروز کنید:
func setDoorbellChime(chimeID: UInt8) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setSelectedChime(chimeID)
}
} catch {
// Error
}
}
استفاده از زنگ اخبار خارجی
در برنامه نمونه برای iOS پیادهسازی شده است
زنگ در را میتوان برای استفاده از زنگ اخبار خارجی، مثل زنگ مکانیکی نصبشده در داخل خانه، پیکربندی کرد. این تنظیم باید درطول نصب زنگ در پیکربندی شود تا از آسیب احتمالی به زنگ اخبار خارجی جلوگیری شود.
برای نشان دادن نوع زنگ خارجی نصبشده، از
ExternalChimeType
برای بهروزرسانی مشخصه
externalChime
از ویژگی ChimeTrait بااستفاده از تابع داخلی
setExternalChime استفاده کنید:
// Indicate the external chime is mechanical
func setExternalChime(to value: Google.ChimeTrait.ExternalChimeType) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChime(value)
}
} catch {
// Error
}
}
تغییر مدت زنگ اخبار خارجی
مدتزمان زنگ زدن زنگ اخبار خارجی (به ثانیه) را میتوان ازطریق Home API پیکربندی کرد. اگر زنگ خارجی از مدتزمان زنگ پشتیبانی کند، ممکن است کاربر بخواهد این مورد را پیکربندی کند.
مقدار تنظیمشده در اینجا به مشخصات خود زنگ اخبار خارجی و مدتزمان توصیهشده برای زنگ اخبار بستگی دارد.
برای تغییر مدتزمان زنگ اخبار خارجی، مشخصه
externalChimeDurationSeconds
ویژگی ChimeTrait را بااستفاده از تابع توکار
setExternalChimeDurationSeconds بهروز کنید:
// Change the external chime duration
func setExternalChimeDuration(to value: UInt16) async {
do {
_ = try await doorbellChimeTrait.update {
$0.setExternalChimeDuration(value)
}
} catch {
// Error
}
}
فعال کردن زمینه زنگ ساعت
در برنامه نمونه برای iOS پیادهسازی شده است
برخیاز زنگهای در ممکن است زنگ اخباری داشته باشند که فقط برای مدت محدودی دردسترس کاربران باشد. برای مثال، زنگهای مخصوص تعطیلات. به اینها زمینههای زنگ میگویند.
برای دیدن اینکه کدام زمینههای زنگ برای کاربر دردسترس است، فیلتر جعبه زمان ایجاد کنید
و از آن برای فیلتر کردن نتایج
getAvailableThemes
فرمان از
ChimeThemes
ویژگی استفاده کنید. این کار فهرستی از زمینههای دردسترس، ازجمله نام زمینهها را برمیگرداند.
مثال زیر نحوه فیلتر کردن فهرست را نشان میدهد.
اگر زمان فعلی بین زمان شروع و پایان طرح زمینه باشد (بهترتیب مقادیر startTimeSeconds و endTimeSeconds)، طرح زمینه فعال درنظر گرفته میشود. اگر زمان شروع تنظیم نشده باشد، از ابتدای زمان فعال درنظر گرفته میشود. اگر زمان پایانی تنظیم نشده باشد، برای مدت نامحدودی فعال میماند. اگر هر دو وجود نداشته باشند، زمینه همیشه فعال است.
let chimeThemes = try await chimeThemeTrait.getAvailableThemes().themes
if !chimeThemes.isEmpty {
var chimeThemeSettings = []
for chimeTheme in chimeThemes {
let currentDateTime = UInt64(Date().timeIntervalSince1970)
// Only show chime themes that are active.
if chimeTheme.startTimeSeconds ?? 0 <= currentDateTime
&& chimeTheme.endTimeSeconds ?? UInt64.max >= currentDateTime
{
self.chimeThemeSettings.append(chimeTheme.name)
}
}
}
وقتی نام زمینه موردنظرتان را پیدا کردید، مثلاً Christmas، میتوانید
آن را بااستفاده از تابع setSelectedTimeboxedThemeName()
در ویژگی ChimeThemes ChimeThemes انتخاب کنید.
private func setChimeTheme(to value: String) async throws {
_ = try await chimeThemeTrait.update {
$0.setSelectedTimeboxedThemeName(value)
}
}
تنظیمات اعلام حضور مراجعهکننده
میتوانید تنظیمات اعلام حضور مراجعهکننده را برای زنگهای در بااستفاده از ویژگی
VisitorAnnouncement
در Home API پُرسمان و مدیریت کنید. این مشخصه کنترل میکند که وقتی فردی زنگ در را بهصدا درمیآورد، حضور مراجعهکننده در بلندگوها یا نمایشگرهای هوشمند Google اعلام شود یا نه.
مثال زیر نشان میدهد که چگونه بررسی کنید که آیا اعلام حضور مراجعهکننده فعال است یا نه، و چگونه این تنظیم را بهروز کنید:
let visitorAnnouncementsEnabled: Bool = visitorAnnouncementTrait.attributes.visitorAnnouncementsEnabled let value: Bool _ = try await self.visitorAnnouncementTrait?.update { $0.setVisitorAnnouncementsEnabled(value) }
ازکار انداختن دستگاه
برای برداشتن زنگ در از ساختمان، با
device.decommission() تماس بگیرید. ازکارانداختن باعث میشود کاربر با صفحه تأیید مدیریتشده توسط Google مواجه شود که هشدار میدهد تمام سابقه ویدیویی ۲۴ساعته، سابقه رویداد، کلیپها، و دادههای کتابخانه چهره آشنا در سراسر ساختار برای همیشه حذف خواهند شد.
برای دستورالعملهای دقیق و نمونههای کد، به برداشتن دستگاه مراجعه کنید.