El tipo de dispositivo fundamental de Chime se puede implementar con el rasgo estándar basado en Matter, Matter.ChimeTrait, o con la versión personalizada del rasgo de Google, Google.ChimeTrait, que, además de las capacidades especificadas en el estándar Matter, admite timbres externos.
Un dispositivo de timbre también puede implementar Matter.IdentifyTrait, que proporciona un medio para identificar el dispositivo de timbre por la vista o el sonido.
Siempre verifica la compatibilidad de los atributos y los comandos de un dispositivo antes de usar cualquier función o intentar actualizar atributos. Consulta Cómo controlar dispositivos eniOS para obtener más información.
| Tipo de dispositivo de las APIs de Home | Rasgos | App de ejemplo de Swift | Caso de uso |
|---|---|---|---|
|
Timbre
Dispositivo que puede reproducir una variedad de sonidos preinstalados y que, por lo general, se usa con un timbre, un timbre de audio o un timbre con video. |
Rasgos obligatorios matter ChimeTrait |
Timbre |
Obtén información básica sobre un dispositivo
Implementado en la app de ejemplo para iOS
El rasgo BasicInformation incluye información como el nombre del proveedor, el ID del proveedor, el ID del producto, el nombre del producto (incluida la información del modelo) y la versión de software de un dispositivo:
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!
Compatibilidad con cargas multipartes
Un timbre puede estar compuesto por varios tipos de dispositivos, incluido un Chime y, de manera opcional, una bocina. Además, algunos timbres incorporan un Thread Border Router (TBR). Para garantizar la mayor compatibilidad posible, las apps de las APIs de Home que controlan los timbres deben escribirse de manera que admitan dispositivos de timbre de varias partes. Consulta Dispositivos multipartes para obtener más información.
Cada dispositivo de campanilla de varias partes debe estar representado en la app por una sola tarjeta. El dispositivo Chime debe ser el dispositivo principal, y la bocina secundaria debe ser una parte del Chime.
El volumen de la bocina debe aparecer como un parámetro de configuración principal de un dispositivo Chime.
Asignación de OnOff
En el caso de una campanilla con los tipos de dispositivo Timbre y Bocina, un botón de encendido y apagado en una app de control debe asignarse al atributo Enabled de la campanilla.
Según la especificación de la biblioteca de dispositivos de Matter, establecer el atributo Enabled del rasgo Chime en False puede, además de inhabilitar el timbre, actuar como un interruptor de silencio global que suprime todos los indicadores visuales y audibles.
Asistencia para la automatización
Como se mencionó anteriormente, debido a que un ChimeDeviceType puede tener varias partes, se recomienda a los desarrolladores que traten todos los sonidos como dispositivos multipartes, y esto sigue siendo cierto en el caso de las automatizaciones que usan sonidos.
Las campanillas se pueden usar en activadores y acciones de automatización.
Cualquier dispositivo componente que se encuentre debajo del dispositivo principal de Chime y que se use en la automatización debe hacer referencia a un AutomationPartPath.
La siguiente automatización muestra cómo crear una automatización con un timbre de varias partes que implementa el rasgo Chime y un Speaker. La automatización se activa cuando se abre la puerta principal:
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() } }
Consulta Automatizaciones de dispositivos multipartes para obtener más información sobre las automatizaciones que usan dispositivos multipartes.
Cómo verificar la conectividad de un dispositivo
En realidad, la conectividad de un dispositivo se verifica a nivel del tipo de dispositivo, ya que algunos dispositivos admiten varios tipos. El estado que se devuelve es una combinación de los estados de conectividad de todos los rasgos del dispositivo.
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
Se puede observar un estado de partiallyOnline en el caso de tipos de dispositivos mixtos cuando no hay conectividad a Internet. Es posible que los rasgos estándar de Matter sigan en línea debido al enrutamiento local, pero los rasgos basados en la nube estarán sin conexión.
Obtén la dirección IP del dispositivo
Para encontrar la dirección IP del dispositivo, usa el atributo networkInterfaces de GeneralDiagnosticsTrait.
Las direcciones se devuelven como objetos Data, que puedes formatear como cadenas IPv4 o IPv6 estándar con el framework 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
}