Mobile App mit den Home APIs auf iOS erstellen

1. Einführung

f154e30306882c74.png

Was sind die Home-APIs?

Die Google Home APIs bieten eine Reihe von Bibliotheken, mit denen Entwickler das Google Home-Ökosystem nutzen können. Mit den Home-APIs können Entwickler Apps erstellen, mit denen Smart-Home-Geräte nahtlos in Betrieb genommen und gesteuert werden können.

3e11583c779a2cec.png

In diesem Video wird die mobile App, die Sie erstellen werden, kurz vorgestellt. Sehen Sie sich das Video an, während Sie das Codelab durcharbeiten.

Komponenten der Smart-Home-APIs

Die Home APIs bestehen aus:

  • Device API und Structure API: Interaktion mit dem Zuhause eines Nutzers. Apps können diese APIs verwenden, um Informationen zu Geräten, Räumen und Gebäuden zu lesen (z. B. die aktuelle Thermostattemperatur) und Geräte zu steuern (z. B. den Thermostatsollwert zu ändern).
  • Commissioning API: Neue Matter-Geräte lassen sich mit minimalem Aufwand in der Fabric in Betrieb nehmen (einrichten).
  • Automatisierungen-API: Automatisierungen erstellen, löschen und abfragen, die im Zuhause eines Nutzers ausgeführt werden.

Vorbereitung

Lerninhalte

  • So erstellen Sie eine iOS-App mit den Home APIs unter Berücksichtigung von Best Practices.
  • Verwendung der Geräte- und Gebäude-APIs zur Darstellung und Steuerung eines Smart Homes.
  • So fügen Sie Geräte mit der Commissioning API dem Google Home-Ökosystem hinzu.
  • So erstellen Sie mit der Automatisierungen-API eine einfache Automatisierung.

2. Zuhause einrichten

Geräte vorbereiten

Der Google Home Playground bietet eine Vielzahl von vorgefertigten emulierten Smart-Home-Geräten und wird empfohlen, um das volle Potenzial der Home-APIs zu erkunden, insbesondere wenn Sie nur wenige Geräte in Ihrem Zuhause haben.

Folge der Anleitung, um dich in Google Home Playground anzumelden und die Kontoverknüpfung in der Google Home App abzuschließen. Danach solltest du die Geräte auf dem Tab „Geräte“ in der Google Home App sehen können.

c892afce113abe8f.png

3. Einrichtung

Code der Beispiel-App abrufen

Klonen Sie zuerst den Quellcode von GitHub:

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

Das Beispielverzeichnis enthält für dieses Codelab zwei Branches: start und finished.

  • start: Der Startcode für dieses Projekt, in dem Sie Änderungen vornehmen, um das Codelab abzuschließen.
  • finished: Der vollständige Code für dieses Codelab, der zum Überprüfen Ihrer Arbeit verwendet wird.

„Start“-Code ansehen

Wechseln Sie zu Beginn dieses Codelabs zum start-Branch Ihres geklonten Repositorys:

git checkout start

Dieser Branch enthält den Startcode für das Projekt. Sie werden diesen Code im Laufe des Codelabs ändern, um die vollständige Funktionalität zu implementieren. Die Codelab-Beispiel-App bietet eine grundlegende Struktur, die in Swift für die Interaktion mit dem Home APIs iOS SDK erstellt wurde. Sehen wir uns die wichtigsten Komponenten im start-Projekt an:

  • Main Entry (GoogleHomeAPISampleIOSApp): Dies ist der Haupteinstiegspunkt der App und befindet sich in GoogleHomeAPISampleIOS/Main/GoogleHomeAPISampleIOS.swift. Es konfiguriert und initialisiert das SDK und richtet die primäre Benutzeroberfläche ein.
  • Core Views (View/):
    • MainView.swift: Die Stammansicht nach dem Start mit dem Haupt-NavigationView. Sie ist für die Auswahl des aktiven Google Home-Zuhause und die Anzeige des entsprechenden StructureView zuständig.
    • StructureView.swift: Hier werden die Inhalte für die aktuell ausgewählte Struktur angezeigt. Über Tabs können Sie zwischen einem Raster mit Geräten und der Liste Automatisierungen wechseln. Außerdem gibt es Menüs zum Hinzufügen von Räumen oder Geräten.
    • DeviceView.swift: Stellt die interaktive Kachel für ein einzelnes Gerät im StructureView-Raster dar.
    • AutomationsView.swift: Zeigt die Liste der vorhandenen Automatisierungen für die Struktur an und bietet die Möglichkeit, Automatisierungsdetails zu erstellen oder aufzurufen.
  • ViewModels (ViewModel/): Diese Klassen verwalten den Status und die Logik für die Ansichten.
    • AccountViewModel.swift: Verarbeitet die Verbindung zum Home-Objekt und verwaltet den Authentifizierungsstatus.
    • MainViewModel.swift: Verwaltet die Liste der verfügbaren Structure-Objekte und verfolgt die ausgewählte Struktur.
    • StructureViewModel.swift: Verwaltet die Anzeige von Räumen und DeviceControl-Objekten in der ausgewählten Struktur.
    • AutomationList.swift, AutomationViewModel.swift usw.: Verarbeitet das Abrufen, Anzeigen, Erstellen und Verwalten von automatisierten Abläufen.
  • Device Controls (ViewModel/Device/):
    • DeviceControl.swift: Eine Basisklasse zur Darstellung steuerbarer Geräte in der Benutzeroberfläche.
    • Spezifische Unterklassen (LightControl.swift, FanControl.swift, OnOffPlugInUnitControl.swift usw.): Implementieren Sie die UI-Logik, die Gerätesteuerung und die Statuszuordnung für verschiedene Gerätetypen basierend auf ihren Attributen.
    • DeviceControlFactory.swift: Verantwortlich für das Erstellen der entsprechenden DeviceControl-Unterklasse für ein bestimmtes HomeDevice.
  • Commissioning (Commissioning/):
    • CommissioningManager.swift: Enthält die Logik für die Verwaltung des Ablaufs zur Inbetriebnahme von Matter-Geräten.
  • Utilities & UX (Utils/, UX/, Storage/): Enthält Hilfscode für UI-Elemente (Farben, Dimensionen), Fehlerbehandlung, Datenspeicherung (SelectedStructureStorage.swift) und andere Dienstprogramme.

In diesem Codelab finden Sie Kommentare wie TODO oder auskommentierte Codeblöcke und Warnungen im start-Projekt. Diese Markierungen kennzeichnen die Abschnitte, in denen Sie Code hinzufügen oder auskommentieren müssen, um die erforderliche Funktionalität zu implementieren.

Apple-Bereitstellungskonfigurationsdateien erstellen

Folgen Sie der Anleitung zum Erstellen von Apple-Bereitstellungskonfigurationsdateien, um App Attest zu konfigurieren. Nach der Einrichtung kann die App nur auf einem echten Gerät und nicht in einem Simulator bereitgestellt werden.

Authentifizierung einrichten

Um die OAuth-Client-ID zu erhalten und die Home APIs zu aktivieren, müssen Sie sich zuerst in Google Cloud anmelden und entweder ein neues Projekt erstellen oder ein vorhandenes auswählen. Folge dann der Anleitung, um die OAuth-Client-ID zu generieren, die Home APIs zu aktivieren und dein Konto der Zulassungsliste hinzuzufügen.

SDK einrichten

Rufen Sie das Home APIs iOS SDK ab und konfigurieren Sie es anhand der Einrichtungsanleitung unter SDK einrichten. Denken Sie daran, HOME_API_TODO_ADD_APP_GROUP durch Ihre eigene App-Gruppe zu ersetzen.

Projekt erstellen und ausführen

Nachdem Sie das Projekt mit dem start-Branch erstellt und ausgeführt haben, sollte ein TODO-Dialogfeld und ein Bildschirm mit der Meldung „Anmeldung erforderlich“ angezeigt werden. Die Interaktion mit den Home APIs wird in den folgenden Abschnitten implementiert.

bd56b7080037e38a.png 9c0f08a3f4197a77.png

Hinweis: Suchen Sie im Projekt nach dem Text, der im Dialogfeld angezeigt wird, um den Code zu finden, der geändert werden muss. Suchen Sie beispielsweise nach „TODO: initialize Home“.

4. Initialisierung

Home initialisieren

Bevor Sie eine der Home APIs für iOS verwenden können, müssen Sie Home in Ihrer App initialisieren. Home ist der Einstiegspunkt der obersten Ebene für das SDK und bietet Zugriff auf alle Entitäten in der Struktur des Nutzers. Wenn Sie alle Entitäten eines bestimmten Typs anfordern, gibt die API ein Query-Objekt zurück, mit dem Sie auswählen können, wie die Ergebnisse empfangen werden sollen. Entferne in GoogleHomeAPISampleIOS/Accounts/AccountViewModel.swift den Kommentar und die Benachrichtigung in connect(), um die Initialisierung des Zuhauses zu implementieren.

  /// 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).")
      }
    }
  }

Berechtigung zur Verwendung der Home-APIs

Der Einwilligungsbildschirm wird angezeigt, wenn Sie die App ausführen. Wählen Sie die Google Home-Struktur und das Konto aus, das auf der Zulassungsliste Ihres Google Cloud-Projekts steht.

47310f458c0094d9.png 4a571dbd9979a88c.png e29c75891a3a67af.png

5. Geräte und Strukturen

Räume und Geräte abrufen

Entfernen Sie in GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift den Kommentar und die Benachrichtigung in getRoomsAndDevices(), um die Räume und Geräte in der ausgewählten Struktur mit home.rooms() bzw. home.devices() abzurufen.

  /// 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)
  }

Die Funktion process() sorgt zuerst dafür, dass sich die Geräte im selben Raum befinden, bevor sie als HomeDevices über DeviceControl und DeviceControlFactory interagieren.

4c677c4c294e67ca.png

Hinweis: Wenn Ihr Gerät nicht in der DeviceControlFactory aufgeführt ist, wird es als „Nicht unterstützt“ angezeigt. Weitere Informationen zu unterstützten Geräten finden Sie auf der Seite Unterstützte Gerätetypen unter iOS.

Mit einem Gerät interagieren

Der Stecker outlet1 ist anfangs inaktiv, wenn Sie auf die Geräte tippen oder wischen. Wenn Sie die Interaktion mit dem Gerät aktivieren möchten, suchen Sie nach GoogleHomeAPISampleIOS/ViewModel/Device/OnOffPlugInUnitControl.swift und entfernen Sie den Kommentar und die Benachrichtigung in der Funktion 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)
      }
    }
  }

Die Funktion primaryAction() in der Klasse OnOffPlugInUnitControl schaltet den Ein/Aus-Status eines Smart-Plug oder eines beliebigen Geräts um, das durch OnOffPluginUnitDeviceType dargestellt wird.

Weitere Beispiele für die Gerätesteuerung finden Sie unter GoogleHomeAPISampleIOS/ViewModel/Device.

Neuen Raum erstellen

Mit der Structure API können Räume erstellt und gelöscht sowie Geräte zwischen Räumen übertragen werden.

Entfernen Sie in GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift den Kommentar und die Benachrichtigung in 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)")
      }
    }
  }

Wenn Sie einen neuen Raum mit structure.createRoom() erstellen möchten, gehen Sie links oben zum Pluszeichen + > „Raum hinzufügen“. Geben Sie den Namen des neuen Chatrooms ein und klicken Sie auf „Chatroom erstellen“. Der neue Raum wird nach einigen Sekunden angezeigt.

b122ae6642b7da1c.png a45f785e1d51938e.png 7753b56cbdcff8d6.png

Gerät in einen anderen Raum verschieben

Entfernen Sie in GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift den Kommentar und die Benachrichtigung in 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)")
      }
    }
  }

Wenn du das Gerät mit structure.move() umstellen möchtest, halte es gedrückt, wähle „In einen anderen Raum verschieben“ aus und wähle den neuen Raum aus.

f9627592af44163d.png fd126fabb454f2bf.png 813e1e23e50cd9f6.png

Leeren Raum löschen

Entfernen Sie in GoogleHomeAPISampleIOS/ViewModel/StructureViewModel.swift den Kommentar und die Benachrichtigung in 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)")
      }
    }
  }

Wenn Sie einen leeren Raum mit structure.deleteRoom() löschen möchten, klicken Sie rechts neben dem Namen des Raums auf das Papierkorbsymbol und bestätigen Sie die Aktion. Es können nur leere Räume gelöscht werden.

4f129262ad67f564.png

Hinweis: Wenn Sie das Gerät zurückbewegen, wird ein leerer Raum erstellt.

6. Inbetriebnahme

Hinweis: Für diesen Abschnitt sind ein Google-Hub und ein Matter-Gerät erforderlich. Achte darauf, dass der Google Nest Hub in deinem Zuhause online und erreichbar ist. Wenn Sie kein Matter-Gerät haben, können Sie stattdessen die App Matter Virtual Device verwenden.

Matter-Gerät hinzufügen

Mit der Commissioning API kann deine App dem Zuhause und dem Google-Konto des Nutzers neue Matter-Geräte hinzufügen. So können Nutzer die Einrichtung direkt in Ihrer App vornehmen.

Entfernen Sie in GoogleHomeAPISampleIOS/Commissioning/CommissioningManager.swift den Kommentar und die Benachrichtigung in 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
    }
  }

Wenn du einen neuen Raum mit structure.prepareForMatterCommissioning() erstellen möchtest, wähle links oben das „+“-Symbol > Gerät zu Google Fabric hinzufügen aus. Dazu wird MatterAddDeviceRequest verwendet, um das Matter-Gerät in deinem Raum hinzuzufügen. Nachdem Sie den Raum und den Gerätenamen ausgewählt haben, wird das Gerät auf dem Bildschirm „Geräte“ angezeigt.

adf6cbb531787aaf.png f002bd6320bc480d.png

7. Automatisierung

Alle Automatisierungen im Gebäude ansehen

Tippen Sie in der unteren Navigationsleiste auf Automatisierte Abläufe. Darin werden alle Automatisierungen in Ihrer Struktur mit structure.listAutomations() aufgeführt.

cc6d50f72f812c24.png

Hinweis: Wenn Sie noch keine Smart-Home-Automatisierungen eingerichtet haben, wird die Meldung „Füge eine Automatisierung hinzu, um loszulegen“ angezeigt.

Automatisierung erstellen

Nachdem Sie sich mit den Geräte- und Struktur-APIs und dem Hinzufügen eines neuen Geräts vertraut gemacht haben, ist es an der Zeit, eine neue Automatisierung mit der Automation API zu erstellen.

Entfernen Sie in GoogleHomeAPISampleIOS/ViewModel/Automation/AutomationsRepository.swift den Kommentar, die Benachrichtigung und den leeren automatisierten Ablauf in 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()
      }
    }
  }

Wenn Sie eine Automatisierung erstellen möchten, die das Licht fünf Sekunden nach dem Einschalten ausschaltet, rufen Sie die Automatisierungsansicht auf und klicken Sie auf die Schaltfläche + Hinzufügen. Wähle dann Licht nach 5 Sekunden ausschalten aus. Die Automatisierungsdetails, einschließlich starter, condition und action, werden angezeigt. Klicken Sie auf Speichern, um die Automatisierung durch structure.createAutomation() zu erstellen.

21c1f8ea2a29134b.png 4bd36f6ed9c5f6e9.png

Hinweis: Welche Automatisierungen verfügbar sind, hängt von den Geräten in deinem Zuhause ab. Wenn keine verfügbaren Automatisierungen angezeigt werden, benenne dein Lichtgerät in „light2“ um.

Kehren Sie zum Tab „Geräte“ zurück und schalten Sie die Lampe mit dem Namen „light2“ ein. Es schaltet sich nach fünf Sekunden automatisch aus.

Eine Automatisierung besteht aus folgenden Komponenten:

  • Auslöser:Das ist ein Ereignis, das die Automatisierung auslöst. In diesem Beispiel würde die Automatisierung starten, sobald sich OnOffTrait ändert.
  • Bedingung:Hier wird geprüft, ob das Startergerät bestimmte Anforderungen erfüllt. In diesem Fall wird die Automatisierung ausgeführt, wenn das Licht eingeschaltet ist.
  • Aktion:Das ist die Automatisierung, die ausgeführt werden soll, aber nur, wenn der Starter die Anforderungen erfüllt. Wenn die Bedingungen erfüllt sind, wird das Licht ausgeschaltet.

Weitere Beispiele findest du auf der Seite Beispielautomatisierungen.

Automatisierung löschen

Die Methode structure.deleteAutomation() wird aufgerufen, wenn Sie auf einer vorhandenen Automatisierung nach links wischen und auf das Papierkorbsymbol tippen, um sie aus Ihrer Struktur zu entfernen.

dc678cd9e16f89a5.png

8. Glückwunsch

Glückwunsch! Sie haben mithilfe der Home APIs für iOS eine einfache Smart-Home-App erstellt.

Erreicht:

  • Initialisierung: Sie haben Ihre App über Home.connect() mit dem Google Home-Ökosystem verbunden.
  • Berechtigungen: Hier werden die Nutzerauthentifizierung und ‑autorisierung für den Zugriff auf Smart-Home-Daten verwaltet.
  • Geräte und Strukturen: Mit home.rooms() und home.devices() abgerufene und angezeigte Räume und Geräte.
  • Gerätesteuerung: Implementierte Geräteinteraktion, z. B. das Umschalten des Status eines OnOffPluginUnitDeviceType durch Aufrufen von Befehlen für seine Eigenschaften.
  • Verwaltung der Struktur: Es wurden Funktionen zum Erstellen neuer Räume (structure.createRoom()), zum Verschieben von Geräten zwischen Räumen (structure.move()) und zum Löschen leerer Räume (structure.deleteRoom()) hinzugefügt.
  • Inbetriebnahme: Der Inbetriebnahmeablauf des SDK wurde integriert, um neue Matter-Geräte (MatterAddDeviceRequest) hinzuzufügen.
  • Automatisierung: Wir haben uns angesehen, wie Automatisierungen in einer Struktur aufgelistet, erstellt (structure.createAutomation()) und gelöscht (structure.deleteAutomation()) werden.

Sie haben jetzt ein grundlegendes Verständnis dafür, wie Sie die Home-APIs nutzen können, um umfassende Smart-Home-Steuerungsfunktionen auf iOS zu entwickeln.

Nächste Schritte:

  • Steuern Sie andere Gerätetypen, die in der Beispiel-App enthalten sind (z. B. Lampen, Ventilatoren und Jalousien).
  • Hier finden Sie weitere Informationen zu den verschiedenen Merkmalen und Befehlen, die für verschiedene Geräte verfügbar sind.
  • Experimentieren Sie mit komplexeren automatisierten Abläufen, indem Sie verschiedene Auslöser, Bedingungen und Aktionen verwenden.
  • Weitere erweiterte Funktionen und Details finden Sie in der Dokumentation zu Home-APIs.

Gut gemacht!