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