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