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 werfen eine HomeError
. Wir empfehlen daher, einen do-catch
-Block zu verwenden, um HomeError
bei diesen Aufrufen zu fangen.
Prüfen Sie bei der Verarbeitung 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
Rufe mit einer Referenz auf das Home
-Objekt devices()
auf, um eine Query
mit barrierefreien Geräten zu erhalten.
Rufen Sie die Methode batched()
von Query
auf. Dabei wird bei jeder Änderung der Gerätemetadaten ein Set ausgegeben, das den aktuellen Status des Zuhauses widerspiegelt. Alternativ können Sie Query.list()
aufrufen, um einen Überblick über die verfügbaren Geräte zu erhalten. Dies ist eine praktische Methode, mit der du den batched()
-Stream abonnierst und den ersten gesendeten Wert zurückgibst.
Query.stream()
erzeugt einen Stream, der bei Änderungen der Gerätemetadaten wie Name, Raum oder Gebäude neue Werte ausgibt. Intern wird batched()
verwendet und nur die geänderten Properties werden gesendet.
// Get a list of all devices accessible to the user let homeDevices = try await self.home.devices().list()
Dort können die Status der einzelnen Geräte abgerufen und unterstützte Befehle an das Gerät gesendet werden.
Gerätetypen abrufen
Um die mit einem Gerät verknüpften Gerätetypen abzurufen, lesen Sie die Property types
des Geräts. Sie gibt einen DeviceTypeController
zurück.
Rufe 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 Empty
Publisher
zurückgegeben und die Anfrage wird sofort abgeschlossen.
Wenn das Gerät einen bestimmten Gerätetyp unterstützt, kannst du einen Handle für diesen Typ abrufen, indem du get()
aufrufst:
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 kannst du 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ätetypeigenschaft abrufen
Gerätetypen sind der Einstiegspunkt für das Lesen von Merkmalen, da sie ein Gerät in seine funktionalen Teile zerlegen (z. B. Endpunkte in Matter).
Außerdem werden Kollisionen von Merkmalen berücksichtigt, wenn ein Gerät zwei Gerätetypen hat, die beide dasselbe Merkmal haben. Wenn ein Gerät beispielsweise sowohl ein Lautsprecher als auch eine dimmbare Lampe ist, hat es zwei „An/Aus“- und zwei „Steuerung der Helligkeit“-Attribute.
Eine weitere Art von Merkmalsüberschneidung kann auftreten, wenn ein Gerät zwei Merkmale mit demselben Namen hat. onOff
kann sich beispielsweise auf eine Instanz des standardmäßigen OnOff
-Attributs oder auf eine Instanz eines vom Hersteller definierten OnOff
-Attributs beziehen. Um mögliche Unklarheiten zu vermeiden, auf welches Merkmal sich ein Verweis bezieht, sollten Sie für jeden Gerätetyp einen Verweis über eine der beiden Merkmalssammlungen einfügen.
Verwenden Sie für Standardmerkmale, also solche, die den Matter-Standardclustern entsprechen, matterTraits
. So rufen Sie beispielsweise ein bestimmtes Merkmal für den Gerätetyp „Dimmbares Licht“ 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-Attribute 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 darauf über die Property traits
, fügen Sie aber davor den Paketnamen des Herstellers ein:
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
In diesem Beispiel wird das OnOff
-Attribut aus dem Attribut „An/Aus“ des Geräts geprüft:
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 der Geräte mit einer bestimmten Eigenschaft abrufen
Wenn Sie eine Liste der Geräte mit einer bestimmten Eigenschaft abrufen möchten, müssen Sie die Geräte, die Gerätetypen der einzelnen Geräte und die Eigenschaften der einzelnen Gerätetypen durchgehen. So rufen Sie beispielsweise eine Liste der Geräte im Zuhause auf, die alle die Eigenschaft „An/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 Merkmale finden Sie im Merkmalindex für iOS.
Liste der Geräte mit ähnlichen Gerätetypen abrufen
So rufen Sie eine Liste der Geräte auf, die alle Lampen in einem Zuhause repräsentieren:
// 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) }
In den Smart-Home-APIs gibt es mehrere Gerätetypen, die einen Hauptgerätetyp darstellen könnten. Es gibt beispielsweise keinen Gerätetyp „Lampe“. Stattdessen gibt es vier verschiedene Gerätetypen, die eine Lampe darstellen könnten, wie im vorherigen Beispiel gezeigt. Um einen umfassenden Überblick über die Gerätetypen in einem Zuhause zu erhalten, müssen daher mehrere Gerätetypen berücksichtigt werden.
Eine vollständige Liste der Gerätetypen und ihrer Merkmale, 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 Attribut 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äteidentifikation für Gerätehersteller
Wenn Sie ein Gerätehersteller sind und Cloud-to-cloud-Geräte herstellen, können Sie die folgenden Stringfelder in die SYNC
-Antwort aufnehmen, um Ihre Cloud-to-cloud-Geräte über das BasicInformation
-Attribut zu identifizieren:
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 aufgebaut ist:
"matterUniqueId": "matter-device-id",
Verwenden Sie bei der Eingabe dieser Stringfelder Ihre Matter-Anbieter- und Produkt-IDs, falls 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.
In der Beispiel-SYNC-Antwort wird die Verwendung dieser Felder veranschaulicht:
{
"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 SYNC
-Dokumentation.
Geräte- und Merkmalsmetadaten
Geräten und Merkmalen in den Home APIs sind Metadaten zugeordnet, die die Nutzerfreundlichkeit in einer App verbessern können.
Jede Eigenschaft in den Home APIs enthält eine sourceConnectivity
-Property mit Informationen zum Onlinestatus und zur Lokalität einer Eigenschaft (lokales oder Remote-Routing).
Primären Typ eines Geräts abrufen
Einige Geräte können über die Smart-Home-APIs mehrere Gerätetypen präsentieren. Damit Nutzern in einer App die richtigen Optionen für ihre Geräte angezeigt werden (z. B. Gerätesteuerung und vorgeschlagene Automatisierungen), ist es hilfreich zu prüfen, ob ein Gerätetyp der primäre Gerätetyp 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 Merkmal online ist
Lesen Sie das Attribut connectivityState
, um die Konnektivität eines Merkmals zu prüfen:
let levelControlConnectivity = levelControlTrait.metadata.sourceConnectivity .connectivityState
Einige Merkmale, in der Regel Google smart home-Merkmale, 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 eines Geräts prüfen
Die Konnektivität eines Geräts wird auf Gerätetypebene 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-Standardeigenschaften sind aufgrund des lokalen Routings möglicherweise weiterhin online, aber cloudbasierte Eigenschaften sind offline.
Netzwerk-Routing eines Merkmals prüfen
Die Region für ein Merkmal ist auch in den Home APIs verfügbar. Die dataSourceLocality
gibt an, ob das Attribut per Remotezugriff (über die Cloud), lokal (über einen lokalen Hub) oder Peer-to-Peer (direkt von Gerät zu Gerät, kein Hub) weitergeleitet wird.
Der Wert „Unbekannter Ort“ unspecified
ist beispielsweise möglich, wenn eine App gerade gestartet wird und noch keinen Hub oder Server für die Geräteverbindung erreicht hat. Diese Geräte sind nicht erreichbar und Interaktionsanfragen von Befehlen oder Ereignissen schlagen fehl. Der Kunde muss selbst entscheiden, wie er mit solchen Geräten umgeht.
let levelControlLocality = levelControlTrait.metadata.sourceConnectivity .dataSourceLocality
Netzwerk-Routing für ein Gerät prüfen
Wie bei der Konnektivität wird auch die Lokalität auf Gerätetypebene geprüft. Der zurückgegebene Status ist eine Kombination aus der Lokalität aller Merkmale auf diesem Gerät.
let lightLocality = dimmableLightDeviceType.metadata.sourceConnectivity.dataSourceLocality
Ein Status von mixed
kann in einem ähnlichen Szenario wie bei einer partiallyOnline
-Verbindung auftreten: Einige Merkmale 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 das ursprüngliche HomeDevice
-Objekt unverändert. Die Änderung wird im zurückgegebenen aktualisierten HomeDevice
-Objekt berücksichtigt.
API-Liste
Sobald eine Instanz von Home
erstellt wurde, können Sie über sie auf die folgenden Geräte-APIs zugreifen:
API | Beschreibung |
---|---|
device(id:) |
Gibt für das angegebene Gerät eine Publisher zurück, die den Gerätestatus sendet, sobald er sich ändert. |
devices() |
Alle Geräte in allen Gebäuden im Google-Konto abrufen Gibt einen Query<HomeDevice> zurück, der weitere Abruf- und Filteroptionen bietet. |
Sobald du eine HomeDevice
hast, kannst du über sie 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 Zimmers, dem das Gerät zugewiesen ist. Gibt String? zurück. |
types |
Sie können einen bestimmten Typ oder alle verfügbaren Typen auf dem Gerät abrufen. |
isMatterDevice |
Wenn das Gerät von Matter unterstützt wird. |
sourceConnectivity |
Die Quellverbindung des Geräts, die aggregierte Verbindungsstatus und die Netzwerklokalität der Merkmale des Geräts darstellt. |