Chime-Gerätehandbuch für iOS

Der grundlegende Chime-Gerätetyp kann entweder mit dem standardmäßigen Matter-basierten Matter.ChimeTrait oder mit der benutzerdefinierten Version des Traits von Google, Google.ChimeTrait, implementiert werden. Letztere unterstützt zusätzlich zu den im Matter-Standard angegebenen Funktionen externe Glocken. Ein Glockengerät kann auch Matter.IdentifyTrait implementieren, wodurch das Glockengerät visuell oder akustisch identifiziert werden kann.

Prüfen Sie immer, ob ein Gerät Attribute und Befehle unterstützt, bevor Sie Funktionen verwenden oder versuchen, Attribute zu aktualisieren. Weitere Informationen finden Sie unter Geräte auf iOS steuern.

Gerätetyp für Smart-Home-APIs Merkmale Swift-Beispiel-App Anwendungsfall

Glocke

ChimeDeviceType

home.matter.0000.types.0146

Ein Gerät, das eine Reihe vorinstallierter Sounds abspielen kann und in der Regel mit einer Türklingel, einer Audio-Türklingel oder einer Video-Türklingel verwendet wird.

Erforderliche Merkmale
     matter ChimeTrait

Optionale Merkmale
     matter IdentifyTrait
Türklingel

Grundlegende Informationen zu einem Gerät abrufen

   In der Beispiel-App für iOS implementiert   

Das Attribut BasicInformation enthält Informationen wie den Namen des Anbieters, die Anbieter-ID, die Produkt-ID, den Produktnamen (einschließlich Modellinformationen) und die Softwareversion für ein Gerät:

let vendorName = basicInfoTrait.attributes.vendorName!
let vendorID = basicInfoTrait.attributes.vendorID!
let productID = basicInfoTrait.attributes.productID!
let productName = basicInfoTrait.attributes.productName!
let softwareVersion = basicInfoTrait.attributes.softwareVersion!

Unterstützung von mehrteiligen Inhalten

Ein Gong kann aus mehreren Gerätetypen bestehen, darunter ein Gong und optional ein Lautsprecher. Einige Glockenspiele enthalten außerdem ein Thread Border Router (TBR). Um eine möglichst breite Unterstützung zu gewährleisten, sollten Home-APIs-Apps, die Glocken steuern, für Geräte mit mehreren Glocken geschrieben werden. Weitere Informationen finden Sie unter Multipart-Geräte.

Jedes Gerät mit mehrteiligem Glockenspiel sollte in der App durch eine einzelne Kachel dargestellt werden. Das Chime-Gerät sollte das primäre Gerät sein und ein untergeordneter Lautsprecher sollte ein Teil des Chime-Geräts sein.

Die Lautstärke des Lautsprechers sollte als primäre Einstellung eines Chime-Geräts angezeigt werden.

OnOff-Zuordnung

Bei einem Gong mit den Gerätetypen „Gong“ und „Lautsprecher“ sollte eine Ein/Aus-Schaltfläche in einer Steuerungs-App dem Enabled-Attribut des Gongs zugeordnet werden.

Gemäß der Matter-Gerätebibliotheksspezifikation kann das Festlegen des Enabled-Attributs des Chime-Traits auf False neben dem Deaktivieren des Chime wie ein globaler Stummschalter wirken, der alle hörbaren und visuellen Anzeigen unterdrückt.

Unterstützung für Automatisierung

Wie bereits erwähnt, kann ein ChimeDeviceType mehrere Teile haben. Entwickler sollten daher alle Glocken als mehrteilige Geräte behandeln. Das gilt auch für Automatisierungen, bei denen Glocken verwendet werden.

Glockensignale können in Auslösern und Aktionen für automatisierte Abläufe verwendet werden.

Jedes Komponentengerät unter dem übergeordneten Chime-Gerät, das in der Automatisierung verwendet wird, muss mit einem AutomationPartPath referenziert werden.

Die folgende Automatisierung zeigt, wie Sie eine Automatisierung mit einem mehrteiligen Gong erstellen, der das Chime-Trait sowie einen Lautsprecher implementiert. Die Automatisierung wird ausgelöst, wenn die Haustür geöffnet wird:

import GoogleHomeSDK
import GoogleHomeTypes

typealias ChimeTrait = Matter.ChimeTrait
typealias OpenCloseTrait = Google.OpenCloseTrait

// Fetch devices using the multipart device model.
let multipartDevices = try await home.devices(enableMultipartDevices: true).list()

guard let chimeParentDevice = multipartDevices.first(where: {
  $0.types.contains(ChimeDeviceType.self)
}) else { return }

guard let doorDevice = multipartDevices.first(where: {
  $0.types.contains(GoogleDoorDeviceType.self)
}) else { return }

// Extract the AutomationPartPath for the specific Chime part
guard let chimeType = await chimeParentDevice.types.get(ChimeDeviceType.self),
  let chimePartPath = chimeParentDevice.automationPart(chimeType) else {
  return
}

let starterNode = starter(doorDevice, GoogleDoorDeviceType.self, OpenCloseTrait.self)

let doorOpenClose = stateReader(doorDevice, GoogleDoorDeviceType.self, OpenCloseTrait.self)

// Build the automation
let chimeAutomation = automation(
  name: "Multipart Chime Demo",
  description: "Activate the chime when the door is opened"
) {
starterNode
condition {
  starterNode.openPercent.unwrapOptional().greaterThan(0)
}
  // Action: Play a chime sound
  action(chimePartPath) {
    ChimeTrait.playChimeSound()
  }
}

Weitere Informationen zu automatisierten Abläufen mit Geräten, die aus mehreren Teilen bestehen, findest du unter Automatisierte Abläufe mit Geräten, die aus mehreren Teilen bestehen.

Verbindung für ein Gerät prüfen

Die Verbindung für ein Gerät wird 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.

IP-Adresse des Geräts ermitteln

Verwenden Sie das Attribut networkInterfaces des GeneralDiagnosticsTrait, um die IP-Adresse des Geräts zu ermitteln. Die Adressen werden als Data-Objekte zurückgegeben, die Sie mit dem Network-Framework in standardmäßige IPv4- oder IPv6-Strings formatieren können:

func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
  let interfaces = trait.attributes.networkInterfaces ?? []
  var ipAddresses: [String] = []

  for interface in interfaces {
    for data in interface.iPv4Addresses {
      if let ipv4 = IPv4Address(data) {
        ipAddresses.append(String(describing: ipv4))
      }
    }
    for data in interface.iPv6Addresses {
      if let ipv6 = IPv6Address(data) {
        ipAddresses.append(String(describing: ipv6))
      }
    }
  }

  return ipAddresses
}