Guida al dispositivo Chime per iOS

Il tipo di dispositivo Chime fondamentale può essere implementato utilizzando lo standard basato su Matter Matter.ChimeTrait o la versione personalizzata della caratteristica di Google, Google.ChimeTrait, che, oltre alle funzionalità specificate nello standard Matter, supporta i campanelli esterni. Un dispositivo di suoneria può anche implementare Matter.IdentifyTrait, 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 iOS.

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

Cicalino

ChimeDeviceType

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.

Tratti richiesti
     matter ChimeTrait

Tratti facoltativi
     matter IdentifyTrait
Campanello

Ottenere informazioni di base su un dispositivo

   Implementato nell'app di esempio per iOS   

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:

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!

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 ChimeDeviceType può avere più parti, gli sviluppatori sono invitati a trattare tutti i campanelli come dispositivi multipart, e questo rimane valido nel caso di automazioni che utilizzano i campanelli.

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 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 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.

let lightConnectivity =
  dimmableLightDeviceType.metadata.sourceConnectivity
  .connectivityState

Uno stato di partiallyOnline può essere osservato nel caso di tipi di dispositivi misti quando non è presente una connettività a internet. Le caratteristiche Matter standard 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 di GeneralDiagnosticsTrait. Gli indirizzi vengono restituiti come oggetti Data, che puoi formattare in stringhe IPv4 o IPv6 standard utilizzando il 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
}