Przewodnik po urządzeniu Chime na iOS

Podstawowy typ urządzenia Chime można zaimplementować za pomocą standardowej cechy MatterMatter.ChimeTrait lub własnej wersji tej cechy od Google Google.ChimeTrait, która oprócz funkcji określonych w standardzie Matter obsługuje zewnętrzne dzwonki. Urządzenie dzwonkowe może też implementować interfejs Matter.IdentifyTrait, który umożliwia identyfikację urządzenia dzwonkowego na podstawie wyglądu lub dźwięku.

Zanim użyjesz jakichkolwiek funkcji lub spróbujesz zaktualizować atrybuty, zawsze sprawdzaj, czy urządzenie obsługuje atrybuty i polecenia. Więcej informacji znajdziesz w sekcji Sterowanie urządzeniami naiOS.

Typ urządzenia interfejsów Home API Cechy Przykładowa aplikacja w Swift Przypadek użycia

Dzwonki

ChimeDeviceType

home.matter.0000.types.0146

Urządzenie, które może odtwarzać różne preinstalowane dźwięki i jest zwykle używane z dzwonkiem, dzwonkiem audio lub wideodomofonem.

Wymagane cechy
     matter ChimeTrait

Opcjonalne cechy
     matter IdentifyTrait
Dzwonek

Uzyskiwanie podstawowych informacji o urządzeniu

   Zaimplementowano w przykładowej aplikacji na iOS   

Cechy BasicInformation zawierają informacje takie jak nazwa dostawcy, identyfikator dostawcy, identyfikator produktu, nazwa produktu (zawiera informacje o modelu) i wersja oprogramowania urządzenia:

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!

Obsługa przesyłania podzielonego na części

Dzwonek może składać się z kilku typów urządzeń, w tym z dzwonka i opcjonalnie z głośnika. Niektóre dzwonki mają teżThread Border Router (TBR). Aby zapewnić jak najszerszą obsługę, aplikacje interfejsów Home API, które sterują dzwonkami, powinny być napisane tak, aby obsługiwać urządzenia z wieloma dzwonkami. Więcej informacji znajdziesz w sekcji Urządzenia wieloczęściowe.

Każde urządzenie z wieloczęściowym dzwonkiem powinno być reprezentowane w aplikacji przez jeden kafelek. Urządzenie Chime powinno być urządzeniem głównym, a głośnik dla dzieci powinien być częścią urządzenia Chime.

Głośność głośnika powinna być wyświetlana jako ustawienie podstawowe urządzenia Chime.

Mapowanie OnOff

W przypadku dzwonka z typami urządzeń Dzwonek i Głośnik przycisk włączania/wyłączania w aplikacji sterującej powinien być przypisany do atrybutu Enabled dzwonka.

Zgodnie ze Matterspecyfikacją biblioteki urządzeń ustawienie atrybutu Enabled cechy Dzwonek na False może oprócz wyłączenia dzwonka działać jak globalny przełącznik wyciszania, który tłumi wszystkie wskaźniki dźwiękowe i wizualne.

Pomoc dotycząca automatyzacji

Jak wspomnieliśmy wcześniej, ponieważ ChimeDeviceType może mieć wiele części, zachęcamy deweloperów do traktowania wszystkich dzwonków jako urządzeń wieloczęściowych. Dotyczy to również automatyzacji, które korzystają z dzwonków.

Dzwonków można używać w poleceniach inicjujących i działaniach automatyzacji.

Każde urządzenie będące częścią nadrzędnego urządzenia Chime, które jest używane w automatyzacji, musi być przywoływane za pomocą AutomationPartPath.

Poniższa automatyzacja pokazuje, jak utworzyć automatyzację z wieloczęściowym dzwonkiem, która implementuje cechę Chime oraz głośnik. Automatyzacja jest aktywowana po otwarciu drzwi wejściowych:

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

Więcej informacji o automatyzacjach z użyciem urządzeń wieloczęściowych znajdziesz w artykule Automatyzacje z użyciem urządzeń wieloczęściowych.

Sprawdzanie połączenia urządzenia

Połączenie urządzenia jest sprawdzane na poziomie typu urządzenia, ponieważ niektóre urządzenia obsługują wiele typów. Zwracany stan jest kombinacją stanów łączności wszystkich cech na tym urządzeniu.

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

Stan partiallyOnline może wystąpić w przypadku różnych typów urządzeń, gdy nie ma połączenia z internetem. Matter standardowe cechy mogą być nadal dostępne online ze względu na routing lokalny, ale cechy oparte na chmurze będą niedostępne.

Uzyskiwanie adresu IP urządzenia

Aby znaleźć adres IP urządzenia, użyj atrybutu networkInterfaces elementu GeneralDiagnosticsTrait. Adresy są zwracane jako obiekty Data, które możesz sformatować w standardowe ciągi IPv4 lub IPv6 za pomocą struktury Network:

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
}