Auf Geräte und Gerätemetadaten für iOS zugreifen

Auf Geräte-APIs kann über die Home-APIs für iOS zugegriffen werden. Importieren Sie die folgenden Pakete in Ihre App:

import GoogleHomeSDK
import GoogleHomeTypes

Weitere Informationen finden Sie unter Datenmodell unter iOS.

Fehlerbehandlung

Einige Methoden in den Home APIs geben HomeError aus. Wir empfehlen daher, einen do-catch-Block zu verwenden, um HomeError bei diesen Aufrufen abzufangen.

Prüfen Sie beim Verarbeiten von HomeError die Felder code und message, um herauszufinden, was schiefgelaufen ist.

Alle nicht behandelten Fehler führen zum Absturz Ihrer App.

Weitere Informationen finden Sie unter Fehlerbehandlung.

Ein Beispiel finden Sie unter Befehl an ein Gerät senden.

Beispielanrufe

Geräteliste abrufen

Rufen Sie mit einem Verweis auf das Home-Objekt devices() auf, um ein Query der verfügbaren Geräte abzurufen. Rufen Sie die Methode batched() von Query auf. Diese gibt bei jeder Änderung der Gerätemetadaten ein Set zurück, das den aktuellen Status des Zuhauses widerspiegelt. Oder rufen Sie Query.list() auf, um eine Übersicht der verfügbaren Geräte zu erhalten. Dies ist eine Hilfsmethode, die den batched()-Stream abonniert und den ersten ausgegebenen Wert zurückgibt. Query.stream() erstellt einen Stream, der neue Werte bei Änderungen an Gerätemetadaten wie Name, Raum oder Struktur ausgibt. Intern wird batched() verwendet und es werden nur die geänderten Eigenschaften ausgegeben.

// Get a list of all devices accessible to the user
let homeDevices = try await self.home.devices().list()

Dort sind die Status für jedes Gerät verfügbar und unterstützte Befehle können an das Gerät gesendet werden.

Gerätetypen abrufen

Wenn Sie die mit einem Gerät verknüpften Gerätetypen abrufen möchten, lesen Sie die types-Eigenschaft des Geräts, die ein DeviceTypeController zurückgibt.

Rufen Sie DeviceTypeController.subscribe(_:) auf, um Updates für einen bestimmten Gerätetyp zu abonnieren:

let devices = try await self.home.devices().list()
if let device = devices.first(where: { $0.id == myDeviceId }) {
  var receivedUpdate1 = false
  var receivedUpdate2 = false
  device.types.subscribe(OnOffLightDeviceType.self)
    .assertNoFailure()
    .sink { device in
      if !receivedUpdate1 {
        receivedUpdate1 = true
        Task {
          try await device.matterTraits.onOffTrait?.on()
        }
        return
      }
      if !receivedUpdate2 {
        receivedUpdate2 = true
        return
      }
      fatalError("Received unexpected update")
    }
}

Wenn das Gerät den angegebenen Gerätetyp nicht unterstützt, wird ein Empty Publisher zurückgegeben, das sofort abgeschlossen wird.

Wenn das Gerät einen bestimmten Gerätetyp unterstützt, können Sie ein Handle für diesen Typ abrufen, indem Sie get() aufrufen:

if let device = devices.first(where: { $0.id == myDeviceId }) {
  let deviceType = await device.types.get(OnOffLightDeviceType.self)
}

Wenn das Gerät den angegebenen Typ nicht unterstützt, wird nil zurückgegeben.

Rufen Sie DeviceTypeController.subscribeAll() auf, um eine Publisher von DeviceTypeCollection zu erhalten. Mit dieser Klasse können Sie prüfen, ob das Gerät einen bestimmten Gerätetyp hat:

if let device = devices.first(where: { $0.id == myDeviceId }) {
  device.types.subscribeAll()
    .assertNoFailure()
    .sink { types in
      let lightDeviceType = types[OnOffLightDeviceType.self]
      let fanDeviceType = types[FanDeviceType.self]
    }
}

Gerätetyp-Trait abrufen

Gerätetypen sind der Einstiegspunkt zum Lesen von Attributen, da sie ein Gerät in seine funktionalen Teile zerlegen (z. B. Endpunkte in Matter).

Außerdem werden Attributkonflikte berücksichtigt, falls ein Gerät zwei Gerätetypen hat, die beide dasselbe Attribut haben. Wenn ein Gerät beispielsweise sowohl ein Lautsprecher als auch eine dimmbare Lampe ist, hat es zwei On/Off- und zwei Level Control-Traits.

Eine andere Art von Trait-Konflikt kann auftreten, wenn ein Gerät zwei Traits mit demselben Namen hat. onOff kann sich beispielsweise auf eine Instanz des Standard-Traits OnOff oder auf eine Instanz eines vom Hersteller definierten OnOff-Traits beziehen. Um Unklarheiten darüber zu vermeiden, welches Attribut gemeint ist, verweisen Sie auf ein Attribut über eine der beiden Attributsammlungen für jeden Gerätetyp.

Verwenden Sie für Standardmerkmale, die analogen Matter-Standardclustern entsprechen, matterTraits. Beispiel: So rufen Sie ein bestimmtes Attribut für den Gerätetyp „Dimmable Light“ ab:

if let dimmableLightDeviceType =
  await device.types.get(DimmableLightDeviceType.self)
{
  // Accessing standard trait on the type.
  let levelControlTrait =
    dimmableLightDeviceType.matterTraits.levelControlTrait.self
}

Verwenden Sie für Google-Merkmale googleTraits:

if let doorbellDeviceType = await device.types.get(GoogleDoorbellDeviceType.self) {
  // Accessing Google trait on the type.
  let doorbellPressTrait =
    doorbellDeviceType.googleTraits.doorbellPressTrait.self
}

Wenn Sie auf ein herstellerspezifisches Merkmal zugreifen möchten, verweisen Sie über die traits-Property darauf, stellen Sie aber den Paketnamen des Herstellers voran:

let deviceType = await device1?.types.get(OnOffLightDeviceType.self)
// Accessing custom trait on the type.
if let spinnerTrait = deviceType?.traits[ExampleOrganization.SpinnerTrait.self] {
  let rpmVal = spinnerTrait.attributes.rpm
}

Gerätestatus lesen

Hier sehen Sie ein Beispiel für die Prüfung des Attributs OnOff aus dem On/Off-Trait des Geräts:

let lightDevices = devices.filter {
  $0.types.contains(OnOffLightDeviceType.self)
}
let light1 = lightDevices.first
let lightDeviceTypeOptional = await light1?.types.get(OnOffLightDeviceType.self)
if let onOffTrait = lightDeviceTypeOptional?.matterTraits.onOffTrait {
  let onOffVal = onOffTrait.attributes.onOff
}

Liste von Geräten mit einem bestimmten Merkmal abrufen

Wenn Sie eine Liste von Geräten mit einem bestimmten Merkmal abrufen möchten, müssen Sie die Geräte, die Gerätetypen der einzelnen Geräte und die Merkmale der einzelnen Gerätetypen durchlaufen. So rufen Sie beispielsweise eine Liste der Geräte im Zuhause auf, die alle das Attribut „Ein/Aus“ haben:

// Get all light devices that support levelControl
var levelControlDevices: [HomeDevice] = []
var allDevices = try await home.devices().list()
for device in allDevices {
  if let deviceType = await device.types.get(OnOffLightDeviceType.self) {
    if deviceType.traits.contains(Matter.LevelControlTrait.self) {
      levelControlDevices.append(device)
    }
  }
}

Eine vollständige Liste der in den Home APIs verfügbaren Traits findest du unter Trait-Index unter iOS.

Liste von Geräten mit ähnlichen Gerätetypen abrufen

So rufen Sie eine Liste der Geräte ab, die alle Lampen in einem Zuhause darstellen:

// Get a list of devices with similar device types (lights)
let lightDevices =
  try await self.home.devices().list().compactMap {
    $0.types.contains(DimmableLightDeviceType.self)
      || $0.types.contains(OnOffLightDeviceType.self)
      || $0.types.contains(ColorTemperatureLightDeviceType.self)
      || $0.types.contains(ExtendedColorLightDeviceType.self)
  }

Es gibt mehrere Gerätetypen in den Home-APIs, die einen Kerngerätetyp darstellen können. Es gibt beispielsweise keinen Gerätetyp „Licht“. Stattdessen gibt es vier verschiedene Gerätetypen, die eine Lampe darstellen können, wie im vorherigen Beispiel gezeigt. Um einen umfassenden Überblick über den Gerätetyp auf höherer Ebene in einem Zuhause zu erhalten, müssen mehrere Gerätetypen berücksichtigt werden.

Eine vollständige Liste der Gerätetypen und ihrer Attribute, die in den Home-APIs verfügbar sind, finden Sie unter Unterstützte Gerätetypen unter iOS.

Anbietername, Anbieter-ID oder Produkt-ID für ein Gerät abrufen

Das Merkmal BasicInformationTrait enthält Informationen wie die Anbieter-ID, die Produkt-ID, den Produktnamen und die Seriennummer eines Geräts:

guard
  let vendorName =
    basicInfoTrait.attributes.vendorName
else {
  fatalError("Failed to get vendorName")
}
guard
  let vendorID =
    basicInfoTrait.attributes.vendorID
else {
  fatalError("Failed to get vendorID")
}
guard
  let productID =
    basicInfoTrait.attributes.productID
else {
  fatalError("Failed to get productID")
}

Cloud-zu-Cloud-Geräteidentifizierung für Gerätehersteller

Wenn Sie Gerätehersteller sind und Cloud-to-cloud-Geräte entwickeln, können Sie Ihre Cloud-to-cloud-Geräte über das BasicInformation-Attribut identifizieren. Dazu können Sie diese Stringfelder in die SYNC-Antwort einfügen:

  • Von der Connectivity Standards Alliance (CSA) ausgestellte Anbieter-ID: "matterOriginalVendorId": "0xfff1",

  • Eine Produktkennzeichnung, die ein Produkt eines Anbieters eindeutig identifiziert: "matterOriginalProductId": "0x1234",

  • Eine eindeutige Kennung für das Gerät, die herstellerspezifisch erstellt wird: "matterUniqueId": "matter-device-id",

Verwenden Sie beim Eingeben dieser String-Felder Ihre Matter-Anbieter- und Produkt-IDs, sofern vorhanden. Wenn Sie kein CSA-Mitglied sind und Ihnen diese IDs nicht zugewiesen wurden, können Sie die Felder matterOriginalVendorId und matterOriginalProductId leer lassen und matterUniqueId als Kennung angeben.

Im Beispiel für die SYNC-Antwort wird die Verwendung dieser Felder gezeigt:

{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "agentUserId": "1836.15267389",
    "devices": [
      {
        "id": "456",
        "type": "action.devices.types.LIGHT",
        "traits": [
          "action.devices.traits.OnOff",
          "action.devices.traits.Brightness",
          "action.devices.traits.ColorSetting",
        ],
        "willReportState": true,
        "deviceInfo": { ... },
        "matterOriginalVendorId": "0xfff1",
        "matterOriginalProductId": "0x1234",
        "matterUniqueId": "matter-device-id",
        "otherDeviceIds": [
          {
            "deviceId": "local-device-id",
          }
        ]
      }
    ]
  }
}

Weitere Informationen finden Sie in der Cloud-to-cloud-Dokumentation.SYNC

Geräte- und Attributmetadaten

Geräten und Attributen in den Home-APIs sind Metadaten zugeordnet, die bei der Verwaltung der Nutzerfreundlichkeit in einer App hilfreich sein können.

Jedes Merkmal in den Home APIs enthält die Property sourceConnectivity, die Informationen zum Onlinestatus und zur Lokalität (lokales oder Remote-Routing) eines Merkmals enthält.

Primären Typ eines Geräts abrufen

Einige Geräte können über die Home-APIs mehrere Gerätetypen präsentieren. Damit Nutzern in einer App die richtigen Optionen für ihre Geräte angezeigt werden, z. B. die Gerätesteuerung und vorgeschlagene automatisierte Abläufe, ist es hilfreich, zu prüfen, ob ein Gerätetyp der primäre Typ des Geräts ist.

if let deviceType =
  await device?.types.get(HumiditySensorDeviceType.self)
{
  if deviceType.metadata.isPrimaryType {
    print("Humidity Sensor is the primary type on this device.")
  } else {
    print("Humidity Sensor isn't the primary type on this device.")
  }
}

Prüfen, ob ein Attribut online ist

Lesen Sie das Attribut connectivityState, um die Konnektivität eines Traits zu prüfen:

let levelControlConnectivity =
  levelControlTrait.metadata.sourceConnectivity
  .connectivityState

Einige Merkmale, in der Regel smart home-Merkmale von Google, werden möglicherweise als offline angezeigt, wenn das Gerät keine Internetverbindung hat. Das liegt daran, dass diese Merkmale cloudbasiert sind und kein lokales Routing haben.

Verbindung für ein Gerät prüfen

Die Verbindung für ein Gerät wird tatsächlich auf der Ebene des Gerätetyps geprüft, da einige Geräte mehrere Gerätetypen unterstützen. Der zurückgegebene Status ist eine Kombination der Verbindungsstatus für alle Merkmale auf diesem Gerät.

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

Der Status partiallyOnline kann bei gemischten Gerätetypen auftreten, wenn keine Internetverbindung besteht. Matter-Standardmerkmale sind aufgrund des lokalen Routings möglicherweise weiterhin online, cloudbasierte Merkmale jedoch nicht.

Netzwerkrouting eines Attributs prüfen

Der Ort für ein Merkmal ist auch in den Home APIs verfügbar. Das dataSourceLocality gibt an, ob das Merkmal remote (über die Cloud), lokal (über einen lokalen Hub) oder Peer-to-Peer (direkt von Gerät zu Gerät, ohne Hub) weitergeleitet wird.

Der unbekannte Ortswert unspecified ist beispielsweise möglich, wenn eine App gestartet wird und noch keine Verbindung zu einem Hub oder Server für die Gerätekonnektivität hergestellt hat. Diese Geräte sind nicht erreichbar und Interaktionsanfragen von Befehlen oder Ereignissen schlagen fehl. Es liegt im Ermessen des Kunden, wie er mit solchen Geräten umgeht.

let levelControlLocality =
  levelControlTrait.metadata.sourceConnectivity
  .dataSourceLocality

Netzwerkrouting für ein Gerät prüfen

Wie die Konnektivität wird die Lokalität auf Geräteebene geprüft. Der zurückgegebene Status ist eine Kombination aus der Lokalität für alle Merkmale auf diesem Gerät.

let lightLocality =
  dimmableLightDeviceType.metadata.sourceConnectivity.dataSourceLocality

Der Status mixed kann in einem ähnlichen Szenario wie bei der partiallyOnline-Verbindung auftreten: Einige Attribute sind cloudbasiert, andere lokal.

Name eines Geräts ändern

Rufen Sie die Methode setName(_:) auf, um den Namen eines Geräts zu ändern:

let updatedDevice = try await theDevice.setName("new device name")

Wenn Sie den Namen eines Geräts ändern, bleibt die ursprüngliche HomeDevice-Struktur unverändert und die Änderung wird im zurückgegebenen aktualisierten HomeDevice-Objekt widergespiegelt.

Namen werden abgeschnitten, wenn sie das Limit von 60 Unicode-Codepunkten (Zeichen) überschreiten. Es werden keine Fehler ausgegeben. Entwickler sind dafür verantwortlich, lange Namen zu verarbeiten. Sie können beispielsweise entscheiden, ob sie Nutzer darüber informieren möchten, dass Namen gekürzt werden.

API-Liste

Nachdem eine Instanz von Home erstellt wurde, sind die folgenden Geräte-APIs darüber zugänglich:

API Beschreibung
device(id:) Gibt einen Publisher für das angegebene Gerät zurück, der den Gerätestatus ausgibt, sobald er sich ändert.
devices() Alle Geräte in allen Strukturen müssen im Google-Konto vorhanden sein. Gibt ein Query<HomeDevice> zurück, das weitere Abruf- und Filteroptionen bietet.

Sobald Sie ein HomeDevice haben, können Sie über dieses auf die folgenden APIs zugreifen:

API Beschreibung
id Die eindeutige System-ID des Geräts.
name Der vom Nutzer angegebene Name des Geräts.
structureID Die ID des Gebäudes, dem das Gerät zugewiesen ist. Gibt String? zurück.
roomID Die ID des Raums, dem das Gerät zugewiesen ist. Gibt String? zurück.
types Einen bestimmten Typ oder alle verfügbaren Typen auf dem Gerät abrufen
isMatterDevice Gibt an, ob das Gerät von Matter unterstützt wird.
sourceConnectivity Die Quellverbindung des Geräts, die aggregierte Verbindungsstatus und die Netzwerk-Lokalität der Geräteattribute darstellt.