Guida al dispositivo Chime per Android

Il tipo di dispositivo Chime fondamentale può essere implementato utilizzando la caratteristica standard basata su Matter com.google.home.matter.standard.Chime o la versione personalizzata della caratteristica di Google, com.google.home.google.Chime, che, oltre alle funzionalità specificate nello standard Matter, supporta i campanelli esterni. Un dispositivo di suoneria può anche implementare la caratteristica Identify, che fornisce un mezzo per identificare il dispositivo di suoneria a vista o a orecchio.

Prima di utilizzare qualsiasi funzionalità o tentare di aggiornare gli attributi, controlla sempre che il dispositivo supporti gli attributi e i comandi. Per saperne di più, consulta Controllare i dispositivi su Android.

Tipo di dispositivo delle API Home Tratti App di esempio Kotlin Caso d'uso

Cicalino

ChimeDevice

home.matter.0000.types.0146

Un dispositivo che può riprodurre una serie di suoni preinstallati e che viene in genere utilizzato con un campanello, un campanello audio o un campanello con videocamera.

Caratteristiche richieste
     matter Chime

Tratti facoltativi
     matter Identifica
Campanello

Ottenere informazioni di base su un dispositivo

   Implementato nell'app di esempio per Android   

La caratteristica BasicInformation include informazioni quali nome del fornitore, ID fornitore, ID prodotto, nome prodotto (incluse informazioni sul modello) e versione software per un dispositivo:

// 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}")
    }

Supporto multiparte

Un campanello può essere composto da più tipi di dispositivi, tra cui un campanello e facoltativamente uno speaker. Inoltre, alcuni suoni incorporano un Thread Border Router (TBR). Per garantire il supporto più ampio, le app API Home che controllano i campanelli devono essere scritte per ospitare dispositivi campanello multipart. Per saperne di più, consulta la sezione Dispositivi in più parti.

Ogni dispositivo di suoneria multipart deve essere rappresentato nell'app da un singolo riquadro. Il dispositivo Chime deve essere il dispositivo principale e uno speaker figlio deve essere una parte di Chime.

Il volume dello speaker dovrebbe essere visualizzato come impostazione principale di un dispositivo Chime.

Mappatura OnOff

Per un campanello con tipo di dispositivo sia campanello che altoparlante, un pulsante OnOff in un'app di controllo deve essere mappato all'attributo Enabled del campanello.

In base alla specifica della libreria dei dispositivi Matter, l'impostazione dell'attributo Enabled della caratteristica Suono di notifica su False potrebbe, oltre a disattivare il suono di notifica, fungere da interruttore di disattivazione dell'audio globale che sopprime tutti gli indicatori uditivi e visivi.

Supporto per l'automazione

Come affermato in precedenza, poiché un ChimeDevice può avere più parti, gli sviluppatori sono invitati a trattare tutti i cicalini come dispositivi multipart, e questo rimane valido nel caso di automazioni che utilizzano i cicalini.

I suoni possono essere utilizzati nei comandi iniziali e nelle azioni delle automazioni.

Qualsiasi dispositivo componente secondario del dispositivo Chime principale utilizzato nell'automazione deve essere referenziato utilizzando un AutomationPartPath .

La seguente automazione mostra come creare un'automazione con un suono multipart che implementa il tratto Suono e Altoparlante. L'automazione viene attivata quando viene aperta la porta d'ingresso:

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

Consulta Automazioni di dispositivi in più parti per ulteriori informazioni sulle automazioni che utilizzano dispositivi in più parti.

Controllare la connettività di un dispositivo

La connettività di un dispositivo viene effettivamente controllata a livello di tipo di dispositivo perché alcuni dispositivi supportano più tipi di dispositivi. Lo stato restituito è una combinazione degli stati di connettività per tutte le caratteristiche del dispositivo.

   Implementato nell'app di esempio per Android   
val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

In caso di tipi di dispositivi misti in assenza di connettività a internet, potrebbe essere osservato uno stato di PARTIALLY_ONLINE. Le caratteristiche standard di Matter potrebbero essere ancora online a causa del routing locale, ma le caratteristiche basate sul cloud saranno offline.

Ottenere l'indirizzo IP del dispositivo

Per trovare l'indirizzo IP del dispositivo, utilizza l'attributo networkInterfaces del tratto GeneralDiagnostics. Gli indirizzi vengono restituiti come array di byte, che puoi formattare in stringhe IPv4 o IPv6 standard:

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