Przewodnik po gongu na Androida

Podstawowy typ urządzenia Chime można zaimplementować za pomocą standardowego atrybutu opartego na Mattercom.google.home.matter.standard.Chime lub własnej wersji atrybutu Google com.google.home.google.Chime, która oprócz funkcji określonych w standardzie Matter obsługuje zewnętrzne dzwonki. Urządzenie z dzwonkiem może też implementować cechę Identify, która umożliwia identyfikację urządzenia z dzwonkiem 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 naAndroid.

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

Dzwonki

ChimeDevice

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 Dzwonek

Cechy opcjonalne
     matter Identyfikator
Dzwonek

Uzyskiwanie podstawowych informacji o urządzeniu

   Wdrożono w przykładowej aplikacji na Androida   

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

// Get device basic information. All general information traits are on the RootNodeDevice type.
    device.type(RootNodeDevice).first().standardTraits.basicInformation?.let { basicInformation ->
        println("vendorName ${basicInformation.vendorName}")
        println("vendorId ${basicInformation.vendorId}")
        println("productId ${basicInformation.productId}")
        println("productName ${basicInformation.productName}")
        println("softwareVersion ${basicInformation.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 już wspomnieliśmy, ponieważ ChimeDevice może mieć wiele części, zalecamy, aby deweloperzy traktowali wszystkie dzwonki jako urządzenia wieloczęściowe. 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 com.google.home.automation.automation
import com.google.home.automation.greaterThan
import com.google.home.google.GoogleDoorDevice
import com.google.home.google.OpenClose
import com.google.home.matter.standard.ChimeDevice
import com.google.home.matter.standard.Chime
// ...

// Fetch devices
val devices = homeManager.devices()

// Fetch devices using the multipart device model.
val multipartDevices = homeManager.devices(enableMultipartDevices = true)

val doorDevice = devices.first() {
  it.has(GoogleDoorDevice) &&
  it.has(OpenClose)
}

// Obtain a reference to the chime device.
val chime = multipartDevices.first() {
  it.has(ChimeDevice) &&
  it.has(Chime)
}

// Extract the AutomationPartPath for the specific Chime part
val chimePartPath = chime.automationPart(chime.part(ChimeDevice).first())!!

// Build the automation
val chimeAutomation = automation {
  sequential {
    val doorOpenClose = stateReader<_>(doorDevice, GoogleDoorDevice, OpenClose)
    // Starter: When the door state changes
    val starterNode = starter<_>(doorDevice, GoogleDoorDevice, OpenClose)
    condition {
     expression = doorOpenClose.openPercent greaterThan(0)
    }
    // Action: Play a chime sound
    action(chimePartPath) {
      command(Chime.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.

   Wdrożono w przykładowej aplikacji na Androida   
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

Stan PARTIALLY_ONLINE 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 lokalne przekierowywanie, ale cechy oparte na chmurze będą niedostępne.

Uzyskiwanie adresu IP urządzenia

Aby znaleźć adres IP urządzenia, użyj atrybutu networkInterfaces cechy GeneralDiagnostics. Adresy są zwracane jako tablice bajtów, które możesz sformatować jako standardowe ciągi IPv4 lub IPv6:

val ipAddresses =
  trait.networkInterfaces?.flatMap { networkInterface ->
    (networkInterface.ipv4Addresses + networkInterface.ipv6Addresses).mapNotNull { bytes ->
      try {
        java.net.InetAddress.getByAddress(bytes).hostAddress
      } catch (e: java.net.UnknownHostException) {
        null
      }
    }
  } ?: emptyList()