يتم تنفيذ نوع الجهاز "جرس الباب" باستخدام ثلاث سمات:
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)")
}
}
ضبط اللغة المحكية
ضبط اللغة المحكية
يمكنك ضبط اللغة المنطوقة النشطة على جهاز معيّن على لغة محلية معيّنة
(على سبيل المثال، "en_US") باستخدام طريقة setActiveLocale لسمة
LocalizationConfiguration.
// 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، والتي يمكنك تنسيقها إلى سلاسل IPv4 أو IPv6 عادية باستخدام إطار عمل Network:
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، والتي تعرض ثلاث قيم:
- بروتوكول SDP للجلسة
- مدة الجلسة بالثواني
- معرّف الجلسة الذي يمكن استخدامه لتمديد الجلسة أو إنهائها
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 طريقتَين لجلب اللقطات، وذلك حسب ما إذا كنت بحاجة إلى لقطة مخزّنة مؤقتًا للعرض السريع أو لقطة مباشرة عند الطلب.
الحصول على لقطة معاينة مخزّنة مؤقتًا
لقطة المعاينة هي صورة مخزّنة مؤقتًا يمكن لحزمة SDK استردادها بدون تنشيط الكاميرا. هذه هي أسرع طريقة لجلب صورة ثابتة، وهي مثالية لصفحات النظرة العامة على الكاميرا أو شبكات لوحة البيانات.
للحصول على لقطة المعاينة، اقرأ سمة السمة 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 }
استنادًا إلى إعدادات الكاميرا ونشاطها، يشير عنوان 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
تشير جميع عناوين URL للّقطات إلى وسائط آمنة وتتطلّب رمز OAuth 2.0 المميّز لنطاق الإصدار 2 من Home APIs. لتنزيل الصور وعرضها، يجب إدخال رمز 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 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" } ] }
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 APIs.
تفعيل الميكروفون أو إيقافه
لتفعيل ميكروفون الجهاز أو إيقافه، عدِّل السمة
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:
| الوضع | قيمة التعداد | الوصف |
|---|---|---|
| الصوت | 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 استراتيجيات التسجيل المتاحة:
| الوضع | قيمة التعداد | الوصف |
|---|---|---|
| غير مفعَّلة | Disabled |
تم إيقاف التسجيل بالكامل. يُستخدم بشكل أساسي في الأجهزة القديمة. |
| التسجيل المتواصل | Cvr |
يتم تسجيل الفيديو على مدار الساعة طيلة أيام الأسبوع. يتطلّب اشتراكًا (على سبيل المثال، Google Home Premium. |
| EBR (التسجيل فقط عند رصد حدث) | Ebr |
يتم بدء التسجيل عند رصد أحداث (أشخاص أو حركة). تعتمد مدة الفيديو على مدة الحدث والاشتراك. |
| ETR (التسجيل المستند إلى حدث) | Etr |
تسجيل معاينة قصيرة (على سبيل المثال، 10 ثوانٍ) يتم تشغيلها بواسطة الأحداث. |
| عرض الخرائط الحي | 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 APIs.
تفعيل الرؤية الليلية أو إيقافها
لتفعيل الرؤية الليلية أو إيقافها في الكاميرا، استخدِم 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
}
تفعيل الإحصاءات أو إيقافها
يمكن لكل جهاز الموافقة بشكل فردي على إرسال بيانات إحصاءات تفصيلية إلى سحابة Google Home (يُرجى الاطّلاع على Cloud Monitoring for Home APIs).
لتفعيل الإحصاءات لجهاز معيّن، اضبط السمة
analyticsEnabled)
في
ExtendedGeneralDiagnosticsTrait
على true. عند ضبط analyticsEnabled، يتم ضبط سمة أخرى، وهي logUploadEnabled، تلقائيًا على true، ما يسمح بتحميل ملفات سجلّ الإحصاءات إلى Google Home Cloud.
// 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 APIs.
تغيير صوت الرنين
لتغيير صوت رنين جرس الباب، عليك أولاً الحصول على قائمة أصوات الرنين
المثبّتة على الجهاز، وذلك باستخدام
سمة 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 APIs. إذا كان الجرس الخارجي يتيح ضبط مدة الرنين، قد يريد المستخدم ضبط هذه المدة.
تعتمد القيمة المحدّدة هنا على مواصفات الجرس الخارجي نفسه، ومدة الرنين المقترَحة له.
لتغيير مدة الرنين الخارجي، عدِّل السمة
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 تحذّر المستخدم من أنّه سيتم حذف جميع بيانات سجلّ الفيديوهات على مدار الساعة وسجلّ الأحداث والمقاطع ومكتبة الوجوه المألوفة نهائيًا في جميع أنحاء البنية.
للحصول على تعليمات مفصّلة وأمثلة على الرموز، يُرجى الاطّلاع على إزالة جهاز.