این راهنما از Access دستگاهها و فراداده دستگاه در iOS ادامه مییابد و نمونههای دیگری از کنترل و دسترسی دستگاه را معرفی میکند.
برای استفاده از انواع یا ویژگیهای دستگاه خاص، مانند Matter OnOffTrait
که در بسیاری از مثالهای اینجا استفاده میشود، باید آنها را وارد کرد:
import GoogleHomeSDK
import GoogleHomeTypes
بررسی کنید که آیا یک صفت از یک فرمان پشتیبانی می کند
برای بررسی اینکه آیا یک فرمان برای یک دستگاه خاص پشتیبانی می شود یا خیر از تابع supports
سطح صفت استفاده کنید.
به عنوان مثال، برای بررسی پشتیبانی دستگاه از فرمان toggle
حالت روشن/خاموش:
// Check if the OnOff trait supports the toggle command. if onOffTraitTest.supportsToggleCommand { print("onOffTrait supports toggle command") } else { print("onOffTrait does not support stateful toggle command") }
ارسال فرمان به دستگاه
ارسال یک دستور شبیه به خواندن یک ویژگی حالت از یک صفت است. برای روشن یا خاموش کردن دستگاه، از دستور OnOffTrait
Toggle استفاده کنید که در مدل داده اکوسیستم Google Home به عنوان toggle()
تعریف شده است. این متد onOff
در صورت true
بودن به false
یا در صورت false
بودن به true
تغییر می دهد:
// Calling a command on a trait. do { try await onOffTraitTest.toggle() } catch let error as HomeError { // Code for handling the exception }
اگر مشکلی در جریان اجرا تشخیص داده شود، ممکن است دستورات یک استثنا برگردانند. بهعنوان یک توسعهدهنده، باید از بلوک do-catch
برای مدیریت صحیح این استثناها استفاده کنید و اطلاعات دقیق را در مورد مواردی که خطاها قابل اجرا هستند در اختیار کاربران قرار دهید. استثناهای کنترل نشده زمان اجرای برنامه را متوقف می کند و می تواند منجر به خرابی در برنامه شما شود.
یا از دستورات off()
یا on()
برای تنظیم صریح وضعیت استفاده کنید:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let error as HomeError { // Code for handling the exception }
پس از ارسال فرمان برای تغییر وضعیت، پس از تکمیل آن، می توانید وضعیت را همانطور که در Read a device state توضیح داده شده است بخوانید تا آن را در برنامه خود مدیریت کنید.
یک فرمان با پارامترها ارسال کنید
برخی از دستورات ممکن است از پارامترهایی استفاده کنند، مانند آنچه در OnOffTrait
یا LevelControlTrait
وجود دارد:
خاموش با اثر
// Turn off the light using the DyingLight effect. do { try await onOffTraitTest.offWithEffect( effectIdentifier: Matter.OnOffTrait.EffectIdentifierEnum.dyingLight, effectVariant: 0 ) } catch let error as HomeError { // Code for handling the exception }
moveToLevel
// Change the brightness of the light to 50% do { try await levelControlTraitTest.moveToLevel( level: UInt8(127), transitionTime: 0, optionsMask: Matter.LevelControlTrait.OptionsBitmap(), optionsOverride: Matter.LevelControlTrait.OptionsBitmap() ) } catch let error as HomeError { // Code for handling the exception }
بررسی کنید که آیا یک صفت از یک ویژگی پشتیبانی می کند یا خیر
برخی از دستگاه ها ممکن است از یک ویژگی Matter پشتیبانی کنند، اما نه یک ویژگی خاص. برای مثال، یک دستگاه Cloud-to-cloud که به Matter نگاشت شده است، ممکن است از هر ویژگی Matter پشتیبانی نکند. برای رسیدگی به مواردی مانند این، از ویژگی isSupported
در سطح صفت استفاده کنید تا بررسی کنید که آیا این ویژگی برای یک دستگاه خاص پشتیبانی میشود یا خیر.
به عنوان مثال، برای بررسی پشتیبانی دستگاه از ویژگی onOff
ویژگی On/Off:
// Check if the OnOff trait supports the onOff attribute. if onOffTrait.attributes.$onOff.isSupported { print("onOffTrait supports onOff state") } else { print("onOffTrait is for a command only device!") }
برخی از ویژگی ها در مشخصات Matter یا طرح smart home Cloud-to-cloud باطل هستند. برای این ویژگیها، با استفاده از isNullable
علاوه بر isSupported
، میتوانید تعیین کنید که آیا صفر برگردانده شده توسط ویژگی به این دلیل است که دستگاه آن مقدار را گزارش نمیکند یا اینکه مقدار مشخصه واقعاً nil
است:
// Check if a nullable attribute is set or is not supported. if let deviceType = await device.types.get(OnOffLightDeviceType.self) { if let onOffTrait = deviceType.traits[Matter.OnOffTrait.self] { if onOffTrait.attributes.startUpOnOff == nil { if onOffTrait.attributes.$startUpOnOff.isSupported { print( "onOffTrait supports startUpOnOff and it is nil. Check the spec for the contextual meaning." ) } else { print("onOffTrait does not support startUpOnOff!") } } else { print( "onOffTrait supports startUpOnOff and it is set to \(onOffTrait.attributes.startUpOnOff)" ) } } }
ویژگی های صفت را به روز کنید
اگر میخواهید مقدار یک مشخصه را تغییر دهید، و هیچ یک از دستورات صفت این کار را انجام نمیدهد، ممکن است ویژگی از تنظیم صریح مقدار آن پشتیبانی کند.
اینکه آیا می توان مقدار یک ویژگی را تغییر داد به دو عامل بستگی دارد:
- آیا ویژگی قابل نوشتن است؟
- آیا مقدار مشخصه به عنوان یک عارضه جانبی ارسال فرمان صفت تغییر می کند؟
اسناد مرجع برای صفات و ویژگی های آنها این اطلاعات را فراهم می کند.
بنابراین، ترکیبهایی از ویژگیهایی که نحوه تغییر مقدار یک ویژگی را دیکته میکنند عبارتند از:
فقط خواندنی است و تحت تأثیر سایر دستورات قرار نمی گیرد . این بدان معنی است که مقدار ویژگی تغییر نمی کند. برای مثال، ویژگی
currentPosition
SwitchTrait
.فقط خواندنی و تحت تأثیر سایر دستورات. این بدان معنی است که تنها راهی که می تواند مقدار مشخصه را تغییر دهد، در نتیجه ارسال یک فرمان است. به عنوان مثال، ویژگی
currentLevel
ازLevelControlTrait
فقط خواندنی است، اما مقدار آن را می توان با دستوراتی مانندmoveToLevel
تغییر داد.قابل نوشتن است و تحت تأثیر دستورات دیگر قرار نمی گیرد . این بدان معنی است که شما می توانید مستقیماً با استفاده از تابع
update
صفت مقدار مشخصه را تغییر دهید، اما هیچ دستوری وجود ندارد که بر مقدار ویژگی تأثیر بگذارد. برای مثال، ویژگیWrongCodeEntryLimit
DoorLockTrait
.قابل نوشتن و تحت تاثیر دستورات دیگر. این بدان معنی است که شما می توانید مستقیماً مقدار ویژگی را با استفاده از تابع
update
صفت تغییر دهید و مقدار ویژگی می تواند در نتیجه ارسال یک فرمان تغییر کند. به عنوان مثال، ویژگیoccupiedCoolingSetpoint
ازThermostatTrait
را می توان با دستورsetpointRaiseLower
روی آن نوشت و همچنین به روز کرد.
مثالی از استفاده از تابع به روز رسانی برای تغییر مقدار یک ویژگی
این مثال نحوه تنظیم صریح مقدار ویژگی DoorLockTrait.wrongCodeEntryLimit
را نشان می دهد.
برای تنظیم یک مقدار مشخصه، تابع update
صفت را فراخوانی کنید و یک تابع بهروزرسانی که مقدار جدید را تنظیم میکند، به آن ارسال کنید. این یک تمرین خوب است که ابتدا تأیید کنید که این ویژگی از یک ویژگی پشتیبانی می کند .
به عنوان مثال:
if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported { let _ = try await doorLockTraitTest.update { $0.setWrongCodeEntryLimit(3) } }