Os dispositivos de iluminação usam atributos padrão de Matter para identificar luminárias, alternar estados de energia e ajustar os níveis de brilho.
O tipo de dispositivo de iluminação mais básico é o
OnOffLightDeviceType,
implementado com as características
OnOffTrait e
IdentifyTrait
e, opcionalmente, as características
LevelControlTrait
e
LightEffectsTrait.
Outros tipos de luz oferecem recursos adicionais e são implementados com características diferentes:
| Tipo de dispositivo das APIs Home | Características | App de exemplo do Swift | Caso de uso |
|---|---|---|---|
|
Luz de temperatura da cor
Um dispositivo de iluminação que é capaz de ser ligado ou desligado, com a intensidade da sua luz ajustada e a sua temperatura da cor ajustada. |
Atributos obrigatórios matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
Claro | |
|
Luz com dimmer
Um dispositivo de iluminação que pode ser ligado ou desligado, ter a intensidade da luz ajustada e ser acionado por um sensor de presença vinculado. |
Atributos obrigatórios matter IdentifyTrait matter OnOffTrait matter LevelControlTrait |
Claro | |
|
Luz colorida estendida
Um dispositivo de iluminação que pode ser ligado ou desligado, ter a intensidade da luz e a temperatura da cor ajustadas e ser acionado por um sensor de presença vinculado. |
Atributos obrigatórios matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
Claro | |
|
Luz de ativação/desativação
Um dispositivo de iluminação que pode ser ligado ou desligado. |
Atributos obrigatórios matter IdentifyTrait matter OnOffTrait |
Claro |
Sempre verifique se o 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.
Pré-requisitos
Antes de trabalhar com dispositivos e curvas de iluminação, verifique se o app inicializa o SDK do Home e inclui as importações necessárias:
import Foundation import GoogleHomeSDK import GoogleHomeTypes import Network
Encontrar dispositivos de iluminação
Para encontrar dispositivos de iluminação em uma estrutura, filtre a lista de dispositivos por tipo,
como
OnOffLightDeviceType
e
DimmableLightDeviceType
.
let allDevices = try await home.devices().list() // Get all On/Off Light devices in the structure let onOffLights = allDevices.filter { $0.types.contains(OnOffLightDeviceType.self) } // Get all Dimmable Light devices in the structure let dimmableLights = allDevices.filter { $0.types.contains(DimmableLightDeviceType.self) } // Retrieve a specific device type instance to access its traits let onOffLightDeviceType = await onOffLights.first?.types.get(OnOffLightDeviceType.self) let dimmableLightDeviceType = await dimmableLights.first?.types.get(DimmableLightDeviceType.self)
Também é possível recuperar todos os dispositivos de iluminação de vários tipos em um único filtro:
// Get a list of devices with similar device types (lights) let lightDevices = try await self.home.devices().list().compactMap { $0.types.contains(DimmableLightDeviceType.self) || $0.types.contains(OnOffLightDeviceType.self) || $0.types.contains(ColorTemperatureLightDeviceType.self) || $0.types.contains(ExtendedColorLightDeviceType.self) }
Receber informações básicas sobre um dispositivo
Implementado no app de exemplo para iOS
O atributo 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!
Identificar um dispositivo de iluminação
Quando um ambiente tem várias luzes, você pode ajudar os usuários a localizar uma luminária
física específica acionando um estado de identificação visual, como piscar
a luz por alguns segundos. Todos os quatro tipos de dispositivo de iluminação exigem o atributo Matter.IdentifyTrait.
Chame o comando identify com uma duração de identifyTime em segundos para iniciar
o estado de identificação. Transmitir 0 interrompe o estado de identificação
imediatamente. Também é possível chamar triggerEffect para executar um efeito visual específico,
como Blink ou Breathe.
func identifyLight(lightDeviceType: DimmableLightDeviceType) async throws {
guard let identifyTrait = lightDeviceType.matterTraits.identifyTrait else {
return
}
// Blink the light for 10 seconds so the user can locate it
if identifyTrait.supportsIdentifyCommand {
try await identifyTrait.identify(identifyTime: 10)
}
// Or trigger a specific visual identification effect
if identifyTrait.supportsTriggerEffectCommand {
try await identifyTrait.triggerEffect(
effectIdentifier: .blink,
effectVariant: .default
)
}
}
Verificar a conectividade de um dispositivo de iluminação
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 todos os atributos desse 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. Os atributos padrão do Matter
ainda podem estar on-line devido ao roteamento local, mas os atributos baseados na nuvem estarão
off-line.
Encontrar 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 como strings IPv4 ou IPv6 padrão usando o 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
}
Controlar dispositivos de iluminação
Os tipos de dispositivo OnOffLight e DimmableLight usam atributos padrão
Matter para identificar acessórios, alternar estados de energia
e ajustar os níveis de brilho.
Acender ou apagar uma luz
Use o atributo
OnOffTrait
para ler o estado de energia atual de um OnOffLight ou DimmableLight e
para ligar ou desligar a luz.
Antes de ler o atributo onOff, verifique se o dispositivo é compatível com ele. Alguns
dispositivos operam como endpoints somente de comando e não informam o estado.
// Check if the OnOff trait supports the onOff attribute. if onOffTrait.attributes.$onOff.isSupported { print("onOffTrait supports onOff state") } else { print("onOffTrait is for a command only device!") }
Quando onOff é true, a luz está acesa. Quando onOff é false, a luz está
apagada.
Para mudar o estado de energia da luz, verifique se o atributo é compatível com o
comando pretendido e chame on(), off() ou toggle().
// Check if the OnOff trait supports the toggle command. if onOffTraitTest.supportsToggleCommand { print("onOffTrait supports toggle command") } else { print("onOffTrait does not support stateful toggle command") }
// Calling a command on a trait. do { try await onOffTraitTest.toggle() } catch let _ as HomeError { // Code for handling the exception }
Também é possível chamar on() e off() diretamente para definir um estado explícito:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let _ as HomeError { // Code for handling the exception }
Para desligar uma luz com uma transição visual gradual, chame offWithEffect()
e especifique um valor EffectIdentifierEnum:
// Turn off the light using the DyingLight effect. do { try await onOffTraitTest.offWithEffect( effectIdentifier: Matter.OnOffTrait.EffectIdentifierEnum.dyingLight, effectVariant: 0 ) } catch let _ as HomeError { // Code for handling the exception }
Ajustar níveis de brilho
Um
DimmableLight requer a característica
LevelControlTrait, e um OnOffLight pode oferecer suporte a ela. Use esse atributo para ler e
controlar o nível de brilho de uma luz.
O atributo currentLevel informa o nível de brilho atual em uma escala
de 0 a 254. Também é possível inspecionar minLevel e maxLevel para determinar
o intervalo de brilho válido com suporte do hardware.
Para definir o brilho como um valor específico, chame moveToLevel(). Observe que
moveToLevel() só muda o nível atual quando a luz já está acesa,
a menos que você configure optionsOverride com executeIfOff. Para ligar
automaticamente a luz ao definir um nível de brilho diferente de zero (ou desligá-la ao
definir o nível como mínimo), use moveToLevelWithOnOff().
// Change the brightness of the light to 50% do { try await levelControlTraitTest.moveToLevel( level: UInt8(127), transitionTime: 0, optionsMask: Matter.LevelControlTrait.OptionsBitmap(), optionsOverride: Matter.LevelControlTrait.OptionsBitmap() ) } catch let _ as HomeError { // Code for handling the exception }
O exemplo a seguir lê o nível de brilho atual e usa
moveToLevelWithOnOff() para definir uma luz regulável para 75% de brilho (190) em
uma transição de 1 segundo (10 décimos de segundo):
func setLightBrightness(lightDeviceType: DimmableLightDeviceType) async throws { guard let levelControl = lightDeviceType.matterTraits.levelControlTrait else { return } // Read the current brightness level (0 to 254) let currentLevel: UInt8? = levelControl.attributes.currentLevel print("Current brightness level: \(String(describing: currentLevel))") // Move to ~75% brightness (190 out of 254) and turn on the light if it is off if levelControl.supportsMoveToLevelWithOnOffCommand { try await levelControl.moveToLevelWithOnOff( level: UInt8(190), transitionTime: 10, optionsMask: Matter.LevelControlTrait.OptionsBitmap(), optionsOverride: Matter.LevelControlTrait.OptionsBitmap() ) } }
Também é possível aumentar ou diminuir o brilho em relação ao nível atual
chamando stepWithOnOff() com .up ou .down e um stepSize.
Cor do controle
O atributoColorControlTrait
está disponível no
ColorTemperatureLightDeviceType
e no
ExtendedColorLightDeviceType.
Esse atributo permite ajustar a temperatura da cor em graus microrecíprocos ou mireds.
guard let colorControlTrait = colorTempLightDeviceType.matterTraits.colorControlTrait else { return } // Read the current color temperature and hardware limits in mireds // (Mireds = 1,000,000 / Kelvin; e.g., 370 mireds ≈ 2700K warm white, 250 mireds = 4000K cool white) let currentMireds = colorControlTrait.attributes.colorTemperatureMireds let minMireds = colorControlTrait.attributes.colorTempPhysicalMinMireds ?? 153 let maxMireds = colorControlTrait.attributes.colorTempPhysicalMaxMireds ?? 500 // Clamp target (370 mireds ≈ 2700K) to the device's physical bounds let targetMireds = min(max(UInt16(370), minMireds), maxMireds) if colorControlTrait.supportsMoveToColorTemperatureCommand { try await colorControlTrait.moveToColorTemperature( colorTemperatureMireds: targetMireds, transitionTime: 20, // 2.0 seconds (in 0.1s units) optionsMask: Matter.ColorControlTrait.OptionsBitmap(), optionsOverride: Matter.ColorControlTrait.OptionsBitmap() ) }
Também é possível definir a cor usando coordenadas de cromaticidade CIE 1931 e valores de matiz e saturação de 16 bits.
guard let colorControlTrait = extendedColorLightDeviceType.matterTraits.colorControlTrait else { return } // 1. Move to CIE 1931 xy chromaticity coordinates (scaled 0..65279) // Example: x = 0.3127 (20493), y = 0.3290 (21561) for D65 white point if colorControlTrait.supportsMoveToColorCommand { try await colorControlTrait.moveToColor( colorX: 20493, colorY: 21561, transitionTime: 10, // 1.0 second (in 0.1s units) optionsMask: Matter.ColorControlTrait.OptionsBitmap(), optionsOverride: Matter.ColorControlTrait.OptionsBitmap() ) } let currentX = colorControlTrait.attributes.currentX let currentY = colorControlTrait.attributes.currentY // 2. Move to 16-bit Enhanced Hue (0..65534) and 8-bit Saturation (0..254) if colorControlTrait.supportsEnhancedMoveToHueAndSaturationCommand { try await colorControlTrait.enhancedMoveToHueAndSaturation( enhancedHue: 43690, // ~240° (Blue) on the 0..65534 scale saturation: 254, // Full saturation transitionTime: 15, // 1.5 seconds (in 0.1s units) optionsMask: Matter.ColorControlTrait.OptionsBitmap(), optionsOverride: Matter.ColorControlTrait.OptionsBitmap() ) } // 3. Start a hardware color loop across the device's hue range if colorControlTrait.supportsColorLoopSetCommand { try await colorControlTrait.colorLoopSet( updateFlags: [ .updateAction, .updateDirection, .updateTime, .updateStartHue ], action: .activateFromColorLoopStartEnhancedHue, direction: .increment, time: 30, // 30 seconds per full cycle startHue: 0, optionsMask: Matter.ColorControlTrait.OptionsBitmap(), optionsOverride: Matter.ColorControlTrait.OptionsBitmap() ) }
Google.ExtendedColorControlTrait
é um atributo opcional do Google em
ExtendedColorLightDevice
que simplifica o controle de cores ao aceitar nomes de cores, valores RGB ou valores HSV
de usar pontos flutuantes unificados que combinam cor e brilho em uma única unidade.
guard let extendedColorControlTrait = extendedColorLightDeviceType.googleTraits.extendedColorControlTrait else { return } // 1. Set color by name if extendedColorControlTrait.supportsMoveToColorNameCommand { try await extendedColorControlTrait.moveToColorName(colorName: "Lavender") } let currentColorName = extendedColorControlTrait.attributes.currentName // 2. Set color using 8-bit RGB values (0..255 per channel) // Automatically coordinates brightness (LevelControl) and color (ColorControl) if extendedColorControlTrait.supportsMoveToColorRGBCommand { try await extendedColorControlTrait.moveToColorRGB( red: 255, green: 128, blue: 0 ) } let currentRed = extendedColorControlTrait.attributes.currentRed let currentGreen = extendedColorControlTrait.attributes.currentGreen let currentBlue = extendedColorControlTrait.attributes.currentBlue // 3. Set color and brightness together using floating-point HSV // hue: 0.0...360.0, saturation: 0.0...1.0, value (brightness): 0.0...1.0 if extendedColorControlTrait.supportsMoveToColorHSVCommand { try await extendedColorControlTrait.moveToColorHSV( hue: 210.0, saturation: 0.85, value: 0.75 ) } let currentHue = extendedColorControlTrait.attributes.currentHue let currentSaturation = extendedColorControlTrait.attributes.currentSaturation let currentValue = extendedColorControlTrait.attributes.currentValue
Gerenciar curvas de iluminação
Uma curva de iluminação define uma programação automatizada que faz a transição suave do brilho e da temperatura da cor opcional das luzes de destino ao longo do dia. Por exemplo, uma curva de iluminação pode aumentar gradualmente o brilho das luzes pela manhã e diminuí-lo para um tom mais quente à noite. Os tipos de dispositivos de iluminação que só aceitam brilho, como a luz regulável, seguem a curva de brilho e ignoram a temperatura da cor.
O atributo
Google.LightingCurveTrait
é um atributo Google Home platform (GHP)
no nível da estrutura. Você o acessa de uma instância
Structure, em vez de
um dispositivo de iluminação individual.
Cada programação no atributo é representada por um LightingCurveSetting, que
combina um settingId exclusivo com um LightingCurveConfig. A tabela a seguir
descreve os campos de configuração de LightingCurveConfig:
| Campo | Descrição |
|---|---|
curvePointsArray |
Uma sequência de pelo menos dois itens CurvePoint com horários distintos. Cada ponto especifica um time (CurveTimeOfDay com hours de 0 a 23 e minutes de 0 a 59), um brightnessPercent (0 a 100) e um colorTemperature opcional em Kelvin. Se colorTemperature for especificado para qualquer ponto, ele precisará ser um valor positivo para todos os pontos. |
roomId |
O ID do ambiente de destino (por exemplo, room@{uuid}). Aplica a curva de iluminação às luzes compatíveis com ajuste de intensidade e temperatura da cor nesse ambiente. Especifique roomId ou devices. |
devices |
Um objeto TargetDevices que contém uma lista de entradas TargetDevice, cada uma com um id e um ID de type do dispositivo (como home.matter.0000.types.0101 para DimmableLight ou home.matter.0000.types.010c para ColorTemperatureLight). Especifique devices ou roomId. |
daysOfWeekArray |
Os dias da semana em que a curva de iluminação é executada (Locale.Weekday). Se a lista estiver vazia, a curva de iluminação será executada diariamente. |
adaptive |
Booleano opcional que indica se a curva de iluminação é adaptável, ou seja, se uma luz de destino retoma o nível da curva ativa quando é ligada durante o período de agendamento de horários. Quando o recurso false está ativado, uma mudança manual em uma luz a desativa da curva de iluminação pelo resto do dia. Quando true, uma luz que é desligada e ligada novamente durante o período de agendamento de horários é reativada com a curva de iluminação, fazendo com que ela se ajuste ao brilho e à Temperatura da cor atuais da curva e siga a curva a partir daí. |
enabled |
Booleano opcional que indica se a configuração da curva de iluminação está ativa. O padrão é true ao criar uma nova configuração. Quando enabled é omitido de um comando de atualização, o estado de enabled não muda. |
Ler as configurações da curva de iluminação
Para inspecionar as curvas de iluminação configuradas para uma estrutura, recupere o atributo
Google.LightingCurveTrait
do Structure e leia o atributo
lightingCurveSettingsArray.
func readLightingCurves(structure: Structure) async {
guard let lightingCurve = await structure.traits.get(
Google.LightingCurveTrait.self
) else {
return
}
for setting in lightingCurve.attributes.lightingCurveSettingsArray {
let settingId = setting.settingId
let config = setting.config
print(
"Setting ID: \(String(describing: settingId)), " +
"enabled: \(String(describing: config?.enabled))"
)
for point in config?.curvePointsArray ?? [] {
print(
" Time: \(point.time?.hours ?? 0):\(point.time?.minutes ?? 0), " +
"Brightness: \(point.brightnessPercent ?? 0)%, " +
"ColorTemp: \(point.colorTemperature ?? 0)K"
)
}
}
}
Criar uma configuração de curva de iluminação
Para criar uma nova programação de curva de iluminação em uma estrutura, construa um
LightingCurveConfig com pelo menos duas entradas CurvePoint, luzes de destino
(especificadas por roomId ou devices) e os dias ativos da semana. Em seguida,
transmita a configuração para createLightingCurveSetting(). O comando retorna
o settingId exclusivo atribuído à nova configuração de curva de iluminação.
O exemplo a seguir cria uma curva de iluminação para dias úteis em um ambiente que aumenta o brilho de 30% às 7h para 80% às 9h e diminui para 20% às 21h:
func createRoomLightingCurve(
structure: Structure,
targetRoomId: String
) async throws -> String? {
guard let lightingCurve = await structure.traits.get(
Google.LightingCurveTrait.self
) else {
return nil
}
let curvePoints = [
Google.LightingCurveTrait.CurvePoint(
time: Google.LightingCurveTrait.CurveTimeOfDay(hours: 7, minutes: 0),
brightnessPercent: 30,
colorTemperature: 2700
),
Google.LightingCurveTrait.CurvePoint(
time: Google.LightingCurveTrait.CurveTimeOfDay(hours: 9, minutes: 0),
brightnessPercent: 80,
colorTemperature: 4000
),
Google.LightingCurveTrait.CurvePoint(
time: Google.LightingCurveTrait.CurveTimeOfDay(hours: 21, minutes: 0),
brightnessPercent: 20,
colorTemperature: 2200
),
]
let config = Google.LightingCurveTrait.LightingCurveConfig(
curvePointsArray: curvePoints,
roomId: targetRoomId,
daysOfWeekArray: [
.monday,
.tuesday,
.wednesday,
.thursday,
.friday,
],
adaptive: true,
enabled: true
)
let response = try await lightingCurve.createLightingCurveSetting(
config: config
)
return response.settingId
}
Para segmentar dispositivos de iluminação específicos em vez de um ambiente inteiro, forneça o
parâmetro devices usando Google.LightingCurveTrait.TargetDevices:
let targetDevices = Google.LightingCurveTrait.TargetDevices(
devicesArray: [
Google.LightingCurveTrait.TargetDevice(
id: dimmableLight.id,
type: DimmableLightDeviceType.identifier
)
]
)
let deviceCurveConfig = Google.LightingCurveTrait.LightingCurveConfig(
curvePointsArray: curvePoints,
devices: targetDevices,
daysOfWeekArray: [.saturday, .sunday],
adaptive: true,
enabled: true
)
let response = try await lightingCurve.createLightingCurveSetting(
config: deviceCurveConfig
)
let settingId = response.settingId
Atualizar uma configuração de curva de iluminação
Para modificar uma curva de iluminação, como mudar os pontos da curva,
atualizar os dias ativos da semana ou ativar e desativar a
programação, chame updateLightingCurveSetting() com o settingId de destino e um
LightingCurveConfig atualizado.
func updateLightingCurve(
structure: Structure,
settingId: String,
updatedConfig: Google.LightingCurveTrait.LightingCurveConfig
) async throws {
guard let lightingCurve = await structure.traits.get(
Google.LightingCurveTrait.self
) else {
return
}
_ = try await lightingCurve.updateLightingCurveSetting(
settingId: settingId,
config: updatedConfig
)
}
Excluir uma configuração de curva de iluminação
Para remover uma configuração de curva de iluminação de uma estrutura, chame
deleteLightingCurveSetting() com o settingId da configuração que você quer
excluir.
func deleteLightingCurve(
structure: Structure,
settingId: String
) async throws {
guard let lightingCurve = await structure.traits.get(
Google.LightingCurveTrait.self
) else {
return
}
_ = try await lightingCurve.deleteLightingCurveSetting(settingId: settingId)
}