Guia de dispositivos de iluminação

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

ColorTemperatureLightDeviceType

home.matter.0000.types.010c

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

Atributos opcionais
     google LightEffectsTrait
     google ExtendedColorControlTrait
Claro

Luz com dimmer

DimmableLightDeviceType

home.matter.0000.types.0101

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

Atributos opcionais
     google LightEffectsTrait
Claro

Luz colorida estendida

ExtendedColorLightDeviceType

home.matter.0000.types.010d

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

Atributos opcionais
     google LightEffectsTrait
     google ExtendedColorControlTrait
Claro

Luz de ativação/desativação

OnOffLightDeviceType

home.matter.0000.types.0100

Um dispositivo de iluminação que pode ser ligado ou desligado.

Atributos obrigatórios
     matter IdentifyTrait
     matter OnOffTrait

Atributos opcionais
     matter LevelControlTrait
     google LightEffectsTrait
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 atributo ColorControlTrait 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)
}