Guia do dispositivo Chime para iOS

O tipo de dispositivo Chime fundamental pode ser implementado usando o padrão Matter-based Matter.ChimeTrait ou a versão personalizada do Google do traço, Google.ChimeTrait, que, além dos recursos especificados no padrão Matter, oferece suporte a campainhas externas. Um dispositivo de campainha também pode implementar o Matter.IdentifyTrait, 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 iOS para mais informações.

Tipo de dispositivo das APIs do Home Características App de exemplo em Swift Caso de uso

Campainha

ChimeDeviceType

home.matter.0000.types.0146

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.

Traços obrigatórios
     matter ChimeTrait

Traços opcionais
     matter IdentifyTrait
Campainha

Receber informações básicas sobre um dispositivo

   Implementado no app de exemplo para iOS   

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:

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!

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 ChimeDeviceType pode ter várias partes. Por isso, os desenvolvedores são incentivados a tratar todos os sinos como dispositivos multipartes, e 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 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()
  }
}

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.

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

Um estado de partiallyOnline pode ser observado no caso de tipos de dispositivos mistos quando não há conectividade com a Internet. As características padrão do Matter ainda podem estar on-line devido ao roteamento local, mas as características baseadas 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 do GeneralDiagnosticsTrait. Os endereços são retornados como objetos Data, que podem ser formatados em strings IPv4 ou IPv6 padrão usando a estrutura 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
}