إنشاء تطبيق جوّال باستخدام واجهات برمجة التطبيقات Home APIs على أجهزة iOS

1- مقدمة

f154e30306882c74.png

ما هي واجهات برمجة التطبيقات الخاصة بمنصة Home؟

توفّر واجهات برمجة التطبيقات Google Home مجموعة من المكتبات التي تتيح للمطوّرين الاستفادة من نظام Google Home المتكامل. باستخدام واجهات برمجة التطبيقات Home، يمكن للمطوّرين إنشاء تطبيقات تتيح إعداد الأجهزة المنزلية الذكية والتحكّم فيها بسلاسة.

3e11583c779a2cec.png

يقدّم هذا الفيديو شرحًا موجزًا عن تطبيق الأجهزة الجوّالة الذي ستنشئه، لذا تابِع الفيديو أثناء تنفيذ الدرس العملي.

مكوّنات Home APIs

تتألف واجهات برمجة التطبيقات الخاصة بالمنزل من:

  • واجهات برمجة التطبيقات الخاصة بالأجهزة والبنية: للتفاعل مع منزل أحد المستخدمين يمكن للتطبيقات استخدام واجهات برمجة التطبيقات هذه لقراءة معلومات عن الأجهزة والغرف والمباني (على سبيل المثال، الاطّلاع على درجة الحرارة الحالية في منظّم الحرارة) والتحكّم في الأجهزة (على سبيل المثال، تغيير درجة الحرارة المثلى المضبوطة في منظّم الحرارة).
  • واجهة برمجة التطبيقات الخاصة بالإعداد: تتيح إعداد أجهزة Matter الجديدة في الشبكة بأقل جهد ممكن.
  • Automation API: يمكنك إنشاء عمليات تشغيل آلي وحذفها والاستعلام عنها، وهي العمليات التي يتم تنفيذها في منزل المستخدم.

المتطلبات الأساسية

أهداف الدورة التعليمية

  • كيفية إنشاء تطبيق iOS باستخدام واجهات برمجة التطبيقات Home باتّباع أفضل الممارسات
  • كيفية استخدام واجهات برمجة التطبيقات Device وStructure لتمثيل منزل مزوّد بأجهزة ذكية والتحكّم فيه
  • كيفية استخدام Commissioning API لإضافة الأجهزة إلى منظومة Google Home المتكاملة
  • كيفية استخدام Automation API لإنشاء عملية تشغيل آلي أساسية

2. إعداد منزلك

تجهيز الأجهزة

توفّر Google Home Playground مجموعة متنوعة من أجهزة المنزل الذكي المحاكية والمُعدّة مسبقًا، ويُنصح باستخدامها لاستكشاف الإمكانات الكاملة لواجهات برمجة التطبيقات Home، خاصةً إذا كان لديك عدد محدود من الأجهزة في منزلك.

اتّبِع التعليمات لتسجيل الدخول إلى Google Home Playground وإكمال عملية ربط الحساب في تطبيق Google Home. بعد إكمال هذه العملية، من المفترض أن تتمكّن من رؤية الأجهزة في علامة التبويب "الأجهزة" في تطبيق Google Home.

c892afce113abe8f.png

3- الإعداد

الحصول على رمز التطبيق النموذجي

ابدأ باستنساخ الرمز المصدر من GitHub:

git clone https://github.com/google-home/google-home-api-sample-app-ios.git

يحتوي دليل العيّنات على فرعين، start وfinished، لهذا الدرس التطبيقي حول الترميز.

  • start: الرمز الأولي لهذا المشروع الذي ستجري فيه تغييرات لإكمال الدرس التطبيقي.
  • finished: الرمز البرمجي المكتمل لهذا الدرس التطبيقي، ويُستخدم للتحقّق من عملك.

استكشاف رمز "البدء"

ابدأ هذا الدرس العملي عن طريق التبديل إلى فرع start من المستودع الذي نسخته:

git checkout start

يحتوي هذا الفرع على الرمز الأولي للمشروع. ستعدّل هذا الرمز خلال الدرس التطبيقي لتنفيذ الوظائف الكاملة. يوفّر تطبيق العيّنة في الدرس التطبيقي حول الترميز بنية أساسية مدمجة في Swift للتفاعل مع حزمة تطوير البرامج لنظام التشغيل iOS الخاصة بواجهات برمجة تطبيقات Home. لنلقِ نظرة سريعة على المكوّنات الرئيسية في مشروع 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. تحدّد هذه العلامات الأقسام التي ستضيف فيها الرمز أو ستزيل التعليق منه لتنفيذ الوظيفة المطلوبة، وذلك باتّباع الخطوات المقدَّمة.

إنشاء ملفات إعداد النشر على أجهزة Apple

لإعداد App Attest، اتّبِع التعليمات المتعلّقة بإنشاء ملفات إعداد النشر على Apple. يُرجى العِلم أنّه بعد الإعداد، لا يمكن نشر التطبيق إلا على جهاز حقيقي، وليس في محاكي.

إعداد المصادقة

للحصول على معرّف عميل OAuth وتفعيل واجهات برمجة التطبيقات Home APIs، عليك أولاً تسجيل الدخول إلى Google Cloud وإنشاء مشروع جديد أو اختيار مشروع حالي. بعد ذلك، اتّبِع الخطوات المقدَّمة لإنشاء معرّف عميل OAuth وتفعيل واجهات برمجة تطبيقات Home وإضافة حسابك إلى القائمة المسموح بها.

إعداد حزمة تطوير البرامج (SDK)

احصل على حزمة تطوير البرامج (SDK) لنظام التشغيل iOS الخاصة بواجهات Home APIs، واضبطها باتّباع تعليمات الإعداد المتوفّرة في إعداد حزمة تطوير البرامج (SDK). تذكَّر استبدال HOME_API_TODO_ADD_APP_GROUP بمجموعة التطبيقات الخاصة بك.

إنشاء المشروع وتشغيله

بعد إنشاء المشروع وتشغيله باستخدام فرع start، من المفترض أن يظهر مربّع حوار TODO وشاشة تعرض الرسالة "يجب تسجيل الدخول". سيتم تنفيذ التفاعل مع واجهات برمجة التطبيقات Home في الأقسام التالية.

bd56b7080037e38a.png 9c0f08a3f4197a77.png

ملاحظة: ابحث في المشروع عن النص المعروض في مربّع الحوار للعثور على الرمز الذي يجب تعديله. على سبيل المثال، ابحث عن "TODO: initialize Home".

4. الإعداد

إعداد المنزل

قبل استخدام أي من واجهات برمجة التطبيقات Home لنظام التشغيل iOS، يجب تهيئة Home في تطبيقك. Home هو نقطة الدخول ذات المستوى الأعلى إلى حزمة تطوير البرامج (SDK) ويتيح الوصول إلى جميع الكيانات في بنية المستخدم. عند طلب جميع الكيانات من نوع معيّن، تعرض واجهة برمجة التطبيقات عنصر Query يتيح لك اختيار طريقة تلقّي النتائج. في GoogleHomeAPISampleIOS/Accounts/AccountViewModel.swift، أزِل التعليق والتنبيه في 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).")
      }
    }
  }

إذن استخدام واجهات برمجة التطبيقات الخاصة بمنصة Home

ستظهر شاشة الموافقة عند تشغيل التطبيق. اختَر بنية Google Home، ثم اختَر الحساب المُدرَج في قائمة السماح لمشروعك على Google Cloud.

47310f458c0094d9.png 4a571dbd9979a88c.png e29c75891a3a67af.png

5- الأجهزة والمنشآت

الحصول على الغرف والأجهزة

في 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() أولاً من أنّ الأجهزة في الغرفة نفسها قبل أن تجعلها تتفاعل كـ HomeDevices باستخدام DeviceControl وDeviceControlFactory.

4c677c4c294e67ca.png

ملاحظة: إذا لم يكن جهازك مُدرَجًا في DeviceControlFactory، سيظهر على أنّه "غير متوافق". لمزيد من المعلومات حول الأجهزة المتوافقة، يُرجى الاطّلاع على صفحة أنواع الأجهزة المتوافقة على iOS.

التفاعل مع جهاز

يكون رمز القابس 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.

إنشاء غرفة جديدة

تتيح Structure 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()، انتقِل إلى أعلى يسار الشاشة وانقر على رمز"+" > إضافة غرفة. أدخِل اسم الغرفة الجديد وانقر على "إنشاء غرفة". ستظهر الغرفة الجديدة بعد بضع ثوانٍ.

b122ae6642b7da1c.png a45f785e1d51938e.png 7753b56cbdcff8d6.png

نقل الجهاز إلى غرفة أخرى

في 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()، اضغط عليه مع الاستمرار، ثم اختَر "النقل إلى غرفة أخرى"، واختَر الغرفة الجديدة.

f9627592af44163d.png fd126fabb454f2bf.png 813e1e23e50cd9f6.png

حذف غرفة فارغة

في 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()، انقر على رمز سلة المهملات على يسار اسم الغرفة وأكِّد الإجراء. يُرجى العِلم أنّه لا يمكن حذف سوى الغرف الفارغة.

4f129262ad67f564.png

ملاحظة: أعِد الجهاز إلى مكانه لإنشاء غرفة فارغة.

6. التشغيل

ملاحظة: يتطلّب هذا القسم مركز Google وجهاز Matter. تأكَّد من أنّ مركز Google في منزلك متصل بالإنترنت ويمكن الوصول إليه. إذا لم يكن لديك جهاز متوافق مع Matter، جرِّب استخدام تطبيق Matter Virtual Device بدلاً من ذلك.

إضافة جهاز متوافق مع Matter

تتيح واجهة برمجة التطبيقات الخاصة بالإعداد لتطبيقك إضافة أجهزة Matter جديدة إلى منزل المستخدم وحسابه على Google. يوفّر ذلك تجربة إعداد سلسة مباشرةً داخل تطبيقك.

في 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 إلى غرفتك. بعد اختيار الغرفة واسم الجهاز، سيظهر الجهاز في شاشة "الأجهزة".

adf6cbb531787aaf.png f002bd6320bc480d.png

7. التشغيل الآلي

عرض جميع عمليات التشغيل الآلي في البنية

انقر على عمليات التشغيل الآلي في شريط التنقّل بأسفل الشاشة. ستعرض هذه الصفحة جميع عمليات التشغيل الآلي في هيكلك الإداري مع structure.listAutomations().

cc6d50f72f812c24.png

ملاحظة: إذا لم تكن قد أعددت أي عمليات تشغيل آلي للمنزل، ستظهر لك الرسالة "أضِف عملية تشغيل آلي للبدء".

إنشاء عملية تشغيل آلي

بعد أن تعرّفت على واجهات برمجة التطبيقات الخاصة بالأجهزة والمباني وإضافة جهاز جديد، حان الوقت لإنشاء عملية تشغيل آلي جديدة باستخدام Automation API.

في GoogleHomeAPISampleIOS/ViewModel/Automation/AutomationsRepository.swift، أزِل التعليق والتنبيه وقاعدة التشغيل الآلي الفارغة في 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()
      }
    }
  }

لإنشاء عملية تشغيل آلي تؤدي إلى إطفاء الضوء بعد خمس ثوانٍ من تشغيله، انتقِل إلى عرض عمليات التشغيل الآلي وانقر على الزر + إضافة. بعد ذلك، اختَر "إطفاء الضوء بعد 5 ثوانٍ". ستظهر تفاصيل التشغيل الآلي، بما في ذلك starter وcondition وaction. انقر على حفظ لإنشاء عملية التشغيل الآلي حسب structure.createAutomation().

21c1f8ea2a29134b.png 4bd36f6ed9c5f6e9.png

ملاحظة: تعتمد عمليات التشغيل الآلي المتاحة على الأجهزة في منزلك. إذا لم تظهر لك أي عمليات تشغيل آلي متاحة، جرِّب إعادة تسمية جهاز الإضاءة إلى "light2".

ارجع إلى علامة التبويب "الأجهزة" وفعِّل المصباح الذي يحمل الاسم "light2". سيتم إيقافه تلقائيًا بعد خمس ثوانٍ.

تتألف عملية التشغيل الآلي من المكوّنات التالية:

  • المشغّل: هو حدث يبدأ عملية التشغيل الآلي. في هذا المثال، ستبدأ عملية التشغيل الآلي عند حدوث تغيير في OnOffTrait.
  • الحالة: يتحقّق هذا الإجراء مما إذا كان الجهاز المبدئي يستوفي متطلبات معيّنة. في هذه الحالة، سيتم تنفيذ عملية التشغيل الآلي إذا كان الضوء مضاءً.
  • الإجراء: هو عملية التشغيل الآلي التي تريد تنفيذها، ولكن فقط إذا استوفى إجراء التفعيل المتطلبات. في حال استيفاء الشروط، سيتم إطفاء الضوء.

للاطّلاع على أمثلة إضافية، يُرجى الانتقال إلى صفحة أمثلة على عمليات التشغيل الآلي.

حذف عملية تشغيل آلي

يتم استدعاء الطريقة structure.deleteAutomation() عند التمرير سريعًا لليسار على عملية إعداد حالية للنظام الذكي والنقر على رمز المهملات لإزالتها من منزلك.

dc678cd9e16f89a5.png

8. تهانينا

تهانينا! لقد أنشأت بنجاح تطبيقًا أساسيًا للمنزل الذكي باستخدام واجهات برمجة التطبيقات Home APIs لنظام التشغيل iOS.

الإنجازات:

  • الإعداد: ربط تطبيقك بمنظومة Google Home المتكاملة باستخدام Home.connect()
  • الأذونات: يتم التعامل مع مصادقة المستخدم وتفويضه للوصول إلى بيانات المنزل.
  • الأجهزة والمباني: تم جلب الغرف والأجهزة وعرضها باستخدام home.rooms() وhome.devices().
  • التحكّم في الأجهزة: تنفيذ تفاعل الجهاز، مثل تبديل حالة OnOffPluginUnitDeviceType من خلال استدعاء الأوامر في سماته
  • إدارة البنية: تمت إضافة وظائف لإنشاء غرف جديدة (structure.createRoom()) ونقل الأجهزة بين الغرف (structure.move()) وحذف الغرف الفارغة (structure.deleteRoom()).
  • الإعداد: تم دمج عملية إعداد حزمة SDK لإضافة أجهزة Matter جديدة (MatterAddDeviceRequest).
  • التشغيل الآلي: تم التعرّف على كيفية إدراج العمليات المبرمَجة وإنشائها (structure.createAutomation()) وحذفها (structure.deleteAutomation()) ضمن بنية.

أصبح لديك الآن فهم أساسي لكيفية الاستفادة من واجهات برمجة التطبيقات الخاصة بالمنزل لإنشاء تجارب غنية للتحكّم في المنزل الذكي على أجهزة iOS.

الخطوات التالية:

  • استكشاف إمكانية التحكّم في أنواع الأجهزة الأخرى المتوفّرة في التطبيق النموذجي (الأضواء والمراوح والستائر وما إلى ذلك)
  • تعرَّف على السمات والأوامر المختلفة المتوفّرة للأجهزة المتنوعة.
  • جرِّب إنشاء عمليات تشغيل آلي أكثر تعقيدًا باستخدام مشغّلات وشروط وإجراءات مختلفة.
  • للحصول على ميزات وتفاصيل أكثر تقدّمًا، يمكنك الرجوع إلى مستندات واجهات برمجة التطبيقات الخاصة بمنزل Google.

أحسنت!