O tipo de dispositivo Chime fundamental pode ser implementado usando o
traço padrão baseado em Matter
com.google.home.matter.standard.Chime
ou a versão personalizada do Google do traço,
com.google.home.google.Chime,
que, além dos recursos especificados no padrão
Matter, oferece suporte a campainhas externas.
Um dispositivo de campainha também pode implementar a
característica Identify,
que oferece uma maneira de identificar o dispositivo de campainha por visão ou som.
Sempre verifique se um dispositivo é compatível com atributos e comandos antes de usar qualquer recurso ou tentar atualizar atributos. Consulte Controlar dispositivos no Android para mais informações.
| Tipo de dispositivo das APIs do Home | Características | App de exemplo em Kotlin | Caso de uso |
|---|---|---|---|
|
Campainha
Um dispositivo que pode tocar uma variedade de sons pré-instalados e geralmente é usado com uma campainha, uma campainha de áudio ou uma campainha com vídeo. |
Características obrigatórias matter Chime |
Campainha |
Receber informações básicas sobre um dispositivo
Implementado no app de exemplo para Android
O traço BasicInformation
inclui informações como nome do fornecedor, ID do fornecedor, ID do produto,
nome do produto (inclui informações do modelo) e versão do software de um 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}") }
Suporte a várias partes
Um toque pode ser composto de vários tipos de dispositivos, incluindo um Chime e, opcionalmente, um alto-falante. Além disso, alguns sinos incorporam um Thread Border Router (TBR). Para garantir a maior compatibilidade possível, os apps de APIs Home que controlam campainhas precisam ser programados para acomodar dispositivos de campainha multipartes. Consulte Dispositivos multipartes para mais informações.
Cada dispositivo de campainha multipartes precisa ser representado no app por um único bloco. O dispositivo Chime precisa ser o principal, e um alto-falante infantil precisa ser uma parte do Chime.
O volume do alto-falante aparece como uma configuração principal de um dispositivo Chime.
Mapeamento OnOff
Para um toque com um tipo de dispositivo Chime e Speaker, um botão OnOff em um
app de controle precisa ser mapeado para o atributo Enabled do Chime.
De acordo com a especificação da biblioteca de dispositivos Matter, definir o atributo Enabled da característica Chime como False pode, além de desativar o Chime, agir como um interruptor de mudo global que suprime todos os indicadores audíveis e visuais.
Suporte para automação
Como mencionado anteriormente, um ChimeDevice pode ter várias partes. Por isso, recomendamos que os desenvolvedores tratem todos os sinos como dispositivos multipartes. Isso continua sendo válido no caso de automações que usam sinos.
Os toques podem ser usados em ativações e ações de automação.
Qualquer dispositivo componente usado na automação e conectado ao dispositivo Chime principal precisa ser referenciado usando um
AutomationPartPath
.
A automação a seguir demonstra como criar uma automação com um toque multipart que implementa a característica Chime e um alto-falante. A automação é acionada quando a porta da frente é aberta:
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()) } } }
Consulte Automações de dispositivos multipartes para mais informações sobre automações usando dispositivos multipartes.
Verificar a conectividade de um dispositivo
A conectividade de um dispositivo é verificada no nível do tipo de dispositivo porque alguns dispositivos são compatíveis com vários tipos. O estado retornado é uma combinação dos estados de conectividade de todas as características do dispositivo.
Implementado no app de exemplo para Androidval lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState
Um estado de PARTIALLY_ONLINE pode ser observado no caso de tipos de dispositivos mistos quando não há conectividade com a Internet.
Os traços padrão do Matter ainda podem estar on-line devido ao roteamento local, mas os baseados na nuvem vão ficar off-line.
Receber o endereço IP do dispositivo
Para encontrar o endereço IP do dispositivo, use o atributo networkInterfaces da
característica
GeneralDiagnostics. Os endereços são retornados como matrizes de bytes, que podem ser formatadas como strings IPv4 ou IPv6 padrão:
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()