۱. مقدمه

API های خانگی چیستند؟
رابطهای برنامهنویسی کاربردی (API) گوگل هوم مجموعهای از کتابخانهها را برای توسعهدهندگان فراهم میکند تا بتوانند از اکوسیستم گوگل هوم استفاده کنند. با استفاده از رابطهای برنامهنویسی کاربردی هوم، توسعهدهندگان میتوانند برنامههایی بسازند که به طور یکپارچه دستگاههای خانه هوشمند را راهاندازی و کنترل میکنند.

این ویدیو توضیح مختصری از برنامه موبایلی که قرار است بسازید ارائه میدهد، بنابراین همزمان با انجام آزمایش کد، ویدیو را دنبال کنید.
اجزای API های خانگی
API های Home از موارد زیر تشکیل شده اند:
- رابطهای برنامهنویسی دستگاه و ساختار : با خانه کاربر تعامل دارند. برنامهها میتوانند از این رابطهای برنامهنویسی کاربردی (API) برای خواندن اطلاعات مربوط به دستگاهها، اتاقها و سازهها (برای مثال، مشاهده دمای فعلی ترموستات) و کنترل دستگاهها (برای مثال، تغییر نقطه تنظیم ترموستات) استفاده کنند.
- راهاندازی API : راهاندازی (راهاندازی) دستگاههای جدید Matter در شبکه با حداقل تلاش.
- API اتوماسیون : ایجاد، حذف و پرسوجو از اتوماسیونهای در حال اجرا در خانه کاربر.
پیشنیازها
- آخرین نسخه پایدار Xcode .
- یک حساب گوگل که حداقل یک ساختار در خانه داشته باشد.
- یک دستگاه iOS با سیستم عامل iOS 16.4+ که با حساب آزمایشی راهاندازی شده باشد.
- یک شناسه اپل که در برنامه توسعهدهندگان اپل برای ایجاد نمایه تأمینکننده ثبتنام شده باشد.
- یک مرکز گوگل که از API های Home پشتیبانی میکند .
آنچه یاد خواهید گرفت
- نحوه ساخت یک برنامه iOS با استفاده از API های Home با بهترین شیوه ها.
- نحوه استفاده از API های دستگاه و ساختار برای نمایش و کنترل یک خانه هوشمند.
- نحوه استفاده از API راهاندازی برای افزودن دستگاهها به اکوسیستم گوگل هوم.
- نحوه استفاده از API اتوماسیون برای ایجاد یک اتوماسیون اولیه.
۲. خانه خود را آماده کنید
دستگاهها را آماده کنید
Google Home Playground انواع دستگاههای خانه هوشمند شبیهسازیشده از پیش ساختهشده را ارائه میدهد و برای کاوش در پتانسیل کامل APIهای Home، به خصوص اگر تعداد محدودی دستگاه در خانه خود دارید، توصیه میشود.
برای ورود به Google Home Playground و تکمیل پیوند حساب در برنامه Google Home ، دستورالعملها را دنبال کنید. پس از تکمیل این کار، باید بتوانید دستگاهها را در تب «دستگاهها» در برنامه Google Home مشاهده کنید.

۳. راهاندازی
کد برنامه نمونه را دریافت کنید
با کپی کردن کد منبع از GitHub شروع کنید:
git clone https://github.com/google-home/google-home-api-sample-app-ios.git
دایرکتوری نمونه شامل دو شاخه start و finished برای این codelab است.
-
start: کد آغازین برای این پروژه که در آن تغییراتی برای تکمیل آزمایشگاه کد ایجاد خواهید کرد. -
finished: کد تکمیلشده برای این آزمایشگاه کد که برای بررسی کار شما استفاده میشود.
کد «شروع» را بررسی کنید
این آزمایشگاه کد را با رفتن به شاخه start مخزن کلون شده خود آغاز کنید:
git checkout start
این شاخه شامل کد آغازین پروژه است. شما این کد را در سراسر codelab تغییر خواهید داد تا عملکرد کامل را پیادهسازی کنید. برنامه نمونه codelab یک ساختار پایه ساخته شده در Swift برای تعامل با Home APIs iOS SDK ارائه میدهد. بیایید نگاهی سریع به اجزای کلیدی در پروژه start بیندازیم:
-
Main Entry (GoogleHomeAPISampleIOSApp): این ورودی اصلی برنامه است که درGoogleHomeAPISampleIOS/Main/GoogleHomeAPISampleIOS.swiftقرار دارد. این ورودی، SDK را پیکربندی و مقداردهی اولیه میکند و رابط کاربری اصلی را تنظیم میکند. -
Core Views (View/):-
MainView.swift: نمای ریشه پس از اجرا، شاملNavigationViewاصلی. این نمای انتخاب ساختار فعال Google Home را مدیریت کرده وStructureViewمربوطه را نمایش میدهد. -
StructureView.swift: محتوای ساختار انتخابشدهی فعلی را نمایش میدهد و با استفاده از تبها بین شبکهای از دستگاهها و لیست اتوماسیونها جابهجا میشود. همچنین منوهایی برای اضافه کردن اتاقها یا دستگاهها ارائه میدهد. -
DeviceView.swift: نشاندهندهی کاشی تعاملی برای یک دستگاه واحد در شبکهیStructureViewاست. -
AutomationsView.swift: فهرست اتوماسیونهای موجود برای ساختار را نشان میدهد و امکان پیمایش برای ایجاد یا مشاهده جزئیات اتوماسیون را فراهم میکند.
-
-
ViewModels (ViewModel/): این کلاسها وضعیت و منطق نماها را مدیریت میکنند.-
AccountViewModel.swift: اتصال به شیءHomeرا مدیریت کرده و وضعیت احراز هویت را مدیریت میکند. -
MainViewModel.swift: فهرست اشیاءStructureموجود را مدیریت میکند و ساختار انتخاب شده را پیگیری میکند. -
StructureViewModel.swift: نمایش اتاقها و اشیاءDeviceControlرا در ساختار انتخابشده مدیریت میکند. -
AutomationList.swift،AutomationViewModel.swiftو غیره: دریافت، نمایش، ایجاد و مدیریت اتوماسیونها را مدیریت میکند.
-
-
Device Controls (ViewModel/Device/):-
DeviceControl.swift: یک کلاس پایه برای نمایش دستگاههای قابل کنترل در رابط کاربری. - زیرکلاسهای خاص (
LightControl.swift،FanControl.swift،OnOffPlugInUnitControl.swiftو غیره): منطق رابط کاربری، کنترل دستگاه و نگاشت حالت را برای انواع مختلف دستگاه بر اساس ویژگیهای آنها پیادهسازی میکنند. -
DeviceControlFactory.swift: مسئول ایجاد زیرکلاسDeviceControlمناسب برایHomeDeviceداده شده است.
-
-
Commissioning (Commissioning/):-
CommissioningManager.swift: شامل منطق مدیریت جریان راهاندازی دستگاه Matter است.
-
-
Utilities & UX (Utils/, UX/, Storage/): شامل کد کمکی برای عناصر رابط کاربری (رنگها، ابعاد)، مدیریت خطا، ذخیرهسازی دادهها (SelectedStructureStorage.swift) و سایر ابزارها است.
در سراسر این آزمایشگاه کد، کامنتهایی مانند TODO یا بلوکهای کد کامنتگذاری شده و هشدارها را در پروژه start خواهید یافت. اینها بخشهایی را مشخص میکنند که در آنها کد را برای پیادهسازی قابلیتهای مورد نیاز، با دنبال کردن مراحل ارائه شده، اضافه یا از حالت کامنت خارج خواهید کرد.
ایجاد فایلهای پیکربندی استقرار اپل
برای پیکربندی App Attest، دستورالعملهای مربوط به ایجاد فایلهای پیکربندی استقرار اپل را دنبال کنید. توجه داشته باشید که پس از راهاندازی، برنامه فقط میتواند روی یک دستگاه واقعی مستقر شود، نه در یک شبیهساز.
تنظیم احراز هویت
برای دریافت شناسه کلاینت OAuth و فعال کردن APIهای Home، ابتدا وارد Google Cloud شوید و یک پروژه جدید ایجاد کنید یا یک پروژه موجود را انتخاب کنید. سپس، مراحل ارائه شده را برای تولید شناسه کلاینت OAuth و فعال کردن APIهای Home دنبال کنید و حساب خود را به لیست مجاز اضافه کنید.
SDK را تنظیم کنید
کیت توسعه نرمافزار iOS مربوط به APIهای Home را دریافت کرده و با مراجعه به دستورالعملهای راهاندازی ارائه شده در بخش «راهاندازی SDK» ، آن را پیکربندی کنید. به یاد داشته باشید که HOME_API_TODO_ADD_APP_GROUP با گروه برنامه خود جایگزین کنید.
ساخت و اجرای پروژه
پس از ساخت و اجرای پروژه با شاخه start ، یک کادر محاورهای TODO و صفحهای که عبارت "ورود الزامی است" را نشان میدهد، باید ظاهر شود. تعامل Home APIs در بخشهای بعدی پیادهسازی خواهد شد.


نکته : با جستجوی متن نمایش داده شده در کادر محاورهای، کدی را که باید اصلاح شود، پیدا کنید. برای مثال، عبارت "TODO: initialize Home" را جستجو کنید.
۴. مقداردهی اولیه
مقداردهی اولیه خانه
قبل از استفاده از هر یک از APIهای Home برای iOS، باید Home را در برنامه خود مقداردهی اولیه کنید. Home ورودی سطح بالا به SDK است و دسترسی به تمام موجودیتهای موجود در ساختار کاربر را فراهم میکند. هنگام درخواست تمام موجودیتهای یک نوع خاص، API یک شیء Query را برمیگرداند که به شما امکان میدهد نحوه دریافت نتایج را انتخاب کنید. در GoogleHomeAPISampleIOS/Accounts/AccountViewModel.swift ، برای پیادهسازی مقداردهی اولیه Home، کامنت را حذف کرده و در connect() هشدار دهید.
/// TODO: initialize Home
/// Remove comments to initialize Home and handling permission.
private func connect() {
Task {
do {
self.home = try await Home.connect()
} catch {
Logger().error("Auth error: \(error).")
}
}
}
اجازه استفاده از APIهای Home
هنگام اجرای برنامه، صفحه رضایت ظاهر میشود. ساختار Google Home را انتخاب کنید و حسابی را که در لیست مجوزهای پروژه Google Cloud شما قرار دارد، انتخاب کنید.



۵. دستگاهها و سازهها
اتاقها و دستگاهها را دریافت کنید
در GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift ، توضیحات و هشدار موجود در getRoomsAndDevices() را حذف کنید تا اتاقها و دستگاهها در ساختار انتخاب شده به ترتیب با home.rooms() و home.devices() دریافت شوند.
/// TODO: get rooms and devices
/// Remove comments to get the rooms and devices from home entry
private func getRoomsAndDevices(){
self.home.rooms().batched()
.combineLatest(self.home.devices().batched())
.receive(on: DispatchQueue.main)
.catch { error in
Logger().error("Failed to load rooms and devices: \(error)")
return Just((Set<Room>(), Set<HomeDevice>()))
}
.map { [weak self] rooms, devices in
guard let self = self else { return [] }
self.hasLoaded = true
return self.process(rooms: rooms, devices: devices)
}
/// receive from .map and .assign() to publisher entries
.assign(to: &self.$entries)
}
تابع process() ابتدا اطمینان حاصل میکند که دستگاهها در یک اتاق هستند و سپس با استفاده DeviceControl و DeviceControlFactory آنها را به عنوان HomeDevices به کار میگیرد.

توجه : اگر دستگاه شما در DeviceControlFactory فهرست نشده باشد، به صورت "Unsupported" نمایش داده میشود. برای کسب اطلاعات بیشتر در مورد اینکه کدام دستگاهها پشتیبانی میشوند، به صفحه انواع دستگاههای پشتیبانی شده در iOS مراجعه کنید.
تعامل با یک دستگاه
plug outlet1 در ابتدا هنگام ضربه زدن یا کشیدن روی دستگاهها غیرفعال است. برای فعال کردن تعامل با آن، GoogleHomeAPISampleIOS/ViewModel/Device/OnOffPlugInUnitControl.swift را پیدا کنید و توضیحات و هشدار را در تابع primaryAction() حذف کنید.
/// TODO: primary action of OnOffPlug
/// Toggles the plug; usually provided as the `action` callback on a Button.
public override func primaryAction() {
self.updateTileInfo(isBusy: true)
Task { @MainActor [weak self] in
guard
let self = self,
let onOffPluginUnitDeviceType = self.onOffPluginUnitDeviceType,
let onOffTrait = onOffPluginUnitDeviceType.matterTraits.onOffTrait
else { return }
do {
try await onOffTrait.toggle()
} catch {
Logger().error("Failed to to toggle OnOffPluginUnit on/off trait: \(error)")
self.updateTileInfo(isBusy: false)
}
}
}
تابع primaryAction() که در کلاس OnOffPlugInUnitControl یافت میشود، وضعیت روشن/خاموش یک پریز هوشمند یا هر دستگاهی که با OnOffPluginUnitDeviceType نمایش داده میشود را تغییر میدهد.
مثالهای بیشتر کنترل دستگاه در GoogleHomeAPISampleIOS/ViewModel/Device موجود است.
ایجاد یک اتاق جدید
API ساختار، ایجاد و حذف اتاقها و همچنین انتقال دستگاهها بین اتاقها را امکانپذیر میکند.
در GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift ، کامنت و هشدار را در addRoom() حذف کنید.
/// TODO: add room
/// Add a new room in a given structure.
func addRoom(name: String, structure: Structure) {
Task {
do {
// The view will be updated with the values from the devices publisher.
_ = try await structure.createRoom(name: name)
} catch {
Logger().error("Failed to create room: \(error)")
}
}
}
برای ایجاد یک اتاق جدید با استفاده از structure.createRoom() ، به گوشه بالا سمت چپ بروید و نماد "+" > "افزودن اتاق" را انتخاب کنید. نام اتاق جدید خود را وارد کنید و روی "ایجاد اتاق" کلیک کنید. اتاق جدید پس از چند ثانیه ظاهر میشود.



دستگاه را به اتاق دیگری منتقل کنید
در GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift ، کامنت و هشدار را در moveDevice() حذف کنید.
/// TODO: move device
/// Move a device into a different room.
func moveDevice(device deviceID: String, to roomID: String, structure: Structure) {
Task {
do {
_ = try await structure.move(device: deviceID, to: roomID)
} catch {
Logger().error("Failed to move to room: \(error)")
}
}
}
برای جابجایی دستگاه با استفاده از structure.move() ، آن را لمس طولانی کنید، "انتقال به اتاق دیگر" را انتخاب کنید و اتاق جدید را انتخاب کنید.



حذف یک اتاق خالی
در GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift ، کامنت و هشدار را در removeRoom() حذف کنید.
/// TODO: delete room
/// Delete an empty room in a given structure.
func removeRoom(id: String, structure: Structure) {
Task {
do {
// The view will be updated with the values from the devices publisher.
_ = try await structure.deleteRoom(id: id)
} catch {
Logger().error("Failed to remove room: \(error)")
}
}
}
برای حذف یک اتاق خالی با استفاده از structure.deleteRoom() ، روی آیکون سطل زباله در سمت راست نام اتاق کلیک کنید و عملیات را تأیید کنید. توجه داشته باشید که فقط اتاقهایی که خالی هستند را میتوان حذف کرد.

توجه : برای ایجاد یک اتاق خالی، دستگاه را به عقب حرکت دهید.
۶. راهاندازی
توجه : این بخش به یک گوگل هاب و یک دستگاه Matter نیاز دارد. مطمئن شوید که گوگل هاب در ساختار شما آنلاین و قابل دسترسی است. اگر دستگاه Matter ندارید، به جای آن از برنامه Matter Virtual Device استفاده کنید.
یک دستگاه Matter اضافه کنید
API راهاندازی به برنامه شما این امکان را میدهد که دستگاههای Matter جدید را به حساب کاربری خانگی و گوگل کاربر اضافه کند. این امر یک تجربه راهاندازی یکپارچه را مستقیماً در برنامه شما فراهم میکند.
در GoogleHomeAPISampleIOS/Commissioning/CommissioningManager.swift ، کامنت و هشدار موجود در addMatterDevice() را حذف کنید.
/// TODO: add Matter Device
/// Starts the Matter device commissioning flow to add the device to the user's home.
/// - Parameters:
/// - structure: The structure to add the device to.
/// - add3PFabricFirst: Whether to add the device to a third party fabric first.
public func addMatterDevice(to structure: Structure, add3PFabricFirst: Bool) {
self.isCommissioning = true
/// pass if it's 1p or 3p commissioning
let userDefaults = UserDefaults(
suiteName: CommissioningManager.appGroup)
userDefaults?.set(
add3PFabricFirst, forKey: CommissioningUserDefaultsKeys.shouldPerform3PFabricCommissioning)
Task {
do {
try await structure.prepareForMatterCommissioning()
} catch {
Logger().error("Failed to prepare for Matter Commissioning: \(error).")
self.isCommissioning = false
return
}
// Prepare the Matter request by providing the ecosystem name and home to be added to.
let topology = MatterAddDeviceRequest.Topology(
ecosystemName: "Google Home",
homes: [MatterAddDeviceRequest.Home(displayName: structure.name)]
)
let request = MatterAddDeviceRequest(topology: topology)
do {
Logger().info("Starting MatterAddDeviceRequest.")
try await request.perform()
Logger().info("Completed MatterAddDeviceRequest.")
let commissionedDeviceIDs = try structure.completeMatterCommissioning()
Logger().info("Commissioned device IDs: \(commissionedDeviceIDs).")
} catch let error {
structure.cancelMatterCommissioning()
Logger().error("Failed to complete MatterAddDeviceRequest: \(error).")
}
self.isCommissioning = false
}
}
برای ایجاد یک اتاق جدید با استفاده از structure.prepareForMatterCommissioning() ، به گوشه بالا سمت چپ بروید و نماد "+" > افزودن دستگاه به Google Fabric را انتخاب کنید. این ابزار MatterAddDeviceRequest برای افزودن دستگاه Matter به اتاق شما استفاده میکند. پس از انتخاب اتاق و نام دستگاه، دستگاه در صفحه "Devices" نمایش داده میشود.


۷. اتوماسیون
مشاهده تمام اتوماسیونهای موجود در ساختار
روی Automations در نوار ناوبری پایین ضربه بزنید. این کار تمام اتوماسیونهای موجود در ساختار شما را با structure.listAutomations() فهرست میکند.

توجه : اگر هیچ اتوماسیون خانگی تنظیم نکرده باشید، پیام «برای شروع، یک اتوماسیون اضافه کنید» را مشاهده خواهید کرد.
ایجاد یک اتوماسیون
اکنون که با APIهای دستگاه و ساختار و اضافه کردن یک دستگاه جدید آشنا شدید، زمان آن رسیده است که با استفاده از API اتوماسیون، یک اتوماسیون جدید ایجاد کنید.
در GoogleHomeAPISampleIOS/ViewModel/Automation/AutomationsRepository.swift ، توضیحات، alert و automation خالی را در lightAutomation() حذف کنید.
/// TODO: create automation
/// - Parameter devices: devices in current selected structure
/// - Returns: the automation object to be created
/// This automation will turn off the light after 5 seconds.
public func lightAutomation(devices: Set<HomeDevice>) async throws -> any DraftAutomation {
let light = devices.first { $0.name == "light2" }
guard let light else {
Logger().error("Unable to find light device with name light2")
throw HomeError.notFound("No devices support OnOffLightDeviceType")
}
return automation(
name: "Turn off light after 5 seconds",
description:
"""
Turns off light2 after it has been on for 5 seconds.
"""
) {
let onOffStarter = starter(light, OnOffLightDeviceType.self, OnOffTrait.self)
onOffStarter
condition {
onOffStarter.onOff.equals(true)
}
delay(for: Duration.seconds(5))
action(light, OnOffLightDeviceType.self) {
OnOffTrait.off()
}
}
}
برای ایجاد یک اتوماسیون که چراغ را پنج ثانیه پس از روشن شدن خاموش کند، به نمای اتوماسیون بروید و روی دکمه " + Add " کلیک کنید. سپس " Turn off light after 5 seconds " را انتخاب کنید. جزئیات اتوماسیون، شامل starter ، condition و action ، ظاهر میشوند. برای ایجاد اتوماسیون توسط structure.createAutomation() ، روی " Save " کلیک کنید.


توجه : اتوماسیونهای موجود به دستگاههای موجود در خانه شما بستگی دارند. اگر هیچ اتوماسیونی را نمیبینید، سعی کنید نام دستگاه نوری خود را به "light2" تغییر دهید.
به برگه «دستگاهها» برگردید و چراغی با نام «نور۲» را روشن کنید. این چراغ پس از پنج ثانیه به طور خودکار خاموش میشود.
اجزای یک اتوماسیون عبارتند از:
- شروعکننده: این رویدادی است که اتوماسیون را آغاز میکند. در این مثال، اتوماسیون به محض ایجاد تغییر در
OnOffTraitشروع میشود. - وضعیت: این بررسی میکند که آیا دستگاه استارت الزامات خاص را برآورده میکند یا خیر. در این حالت، اگر چراغ روشن باشد، اتوماسیون اجرا میشود.
- اقدام: این اتوماسیونی است که میخواهید انجام دهید، اما فقط در صورتی که استارتر الزامات را برآورده کند. اگر شرایط برآورده شود، چراغ خاموش میشود.
برای مثالهای بیشتر، صفحه اتوماسیونهای نمونه را بررسی کنید.
حذف یک اتوماسیون
متد structure.deleteAutomation() زمانی فراخوانی میشود که شما یک اتوماسیون موجود را به سمت چپ بکشید و روی آیکون سطل زباله ضربه بزنید تا آن را از ساختار خود حذف کنید.

۸. تبریک
تبریک! شما با موفقیت یک اپلیکیشن خانه هوشمند پایه با استفاده از APIهای Home برای iOS ساختید.
کارهایی که انجام دادهاید :
- مقداردهی اولیه : برنامه شما با استفاده از
Home.connect()به اکوسیستم Google Home متصل شد. - مجوزها : احراز هویت و مجوز کاربر برای دسترسی به دادههای خانگی مدیریت شد.
- دستگاهها و ساختارها : اتاقها و دستگاهها با استفاده از
home.rooms()وhome.devices()دریافت و نمایش داده میشوند. - کنترل دستگاه : تعامل دستگاه پیادهسازی شده، مانند تغییر وضعیت
OnOffPluginUnitDeviceTypeبا فراخوانی دستورات روی ویژگیهای آن. - مدیریت ساختار : قابلیت ایجاد اتاقهای جدید (
structure.createRoom())، جابجایی دستگاهها بین اتاقها (structure.move()) و حذف اتاقهای خالی (structure.deleteRoom()) اضافه شده است. - راهاندازی : جریان راهاندازی SDK را برای افزودن دستگاههای جدید Matter (
MatterAddDeviceRequest) یکپارچهسازی کرد. - اتوماسیون : نحوه لیست کردن، ایجاد (
structure.createAutomation()) و حذف (structure.deleteAutomation()) اتوماسیونها درون یک ساختار را بررسی کرد.
اکنون شما درک پایهای از نحوهی استفاده از APIهای Home برای ساخت تجربیات غنی کنترل خانه هوشمند در iOS دارید.
مراحل بعدی :
- کنترل انواع دیگر دستگاههای ارائه شده در برنامه نمونه (چراغها، پنکهها، پردهها و غیره) را بررسی کنید.
- عمیقتر به ویژگیها و دستورات مختلف موجود برای دستگاههای مختلف بپردازید.
- با استفاده از شروعکنندهها، شرطها و اقدامات مختلف، اتوماسیونهای پیچیدهتری را ایجاد کنید.
- برای ویژگیها و جزئیات پیشرفتهتر، به مستندات APIهای صفحه اصلی مراجعه کنید.
آفرین!