Perangkat lampu menggunakan karakteristik Matter standar untuk mengidentifikasi perabot, mengalihkan status daya, dan menyesuaikan tingkat kecerahan.
Jenis perangkat lampu paling dasar adalah
OnOffLightDeviceType
yang diimplementasikan dengan trait
OnOffTrait dan
IdentifyTrait
serta secara opsional mendukung trait
LevelControlTrait
dan trait
LightEffectsTrait.
Jenis lampu lainnya menawarkan kemampuan tambahan dan diimplementasikan dengan ciri yang berbeda:
| Jenis Perangkat Home API | Sifat | Aplikasi Contoh Swift | Kasus Penggunaan |
|---|---|---|---|
|
Lampu Suhu Warna
Perangkat pencahayaan yang dapat dinyalakan atau dimatikan, intensitas cahayanya disesuaikan, dan suhu warnanya disesuaikan. |
Karakteristik yang Diperlukan matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
Terang | |
|
Lampu yang Dapat Diredupkan
Perangkat pencahayaan yang dapat dinyalakan atau dimatikan, intensitas cahayanya disesuaikan, dan dinyalakan atau dimatikan melalui sensor kehadiran yang terikat. |
Karakteristik yang Diperlukan matter IdentifyTrait matter OnOffTrait matter LevelControlTrait |
Terang | |
|
Lampu Warna yang Diperluas
Perangkat pencahayaan yang dapat dinyalakan atau dimatikan, intensitas cahayanya disesuaikan, suhu warnanya disesuaikan, dan dinyalakan/dimatikan melalui sensor kehadiran yang terikat. |
Karakteristik yang Diperlukan matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
Terang | |
|
Lampu On/Off
Perangkat pencahayaan yang dapat dinyalakan atau dimatikan. |
Required Traits matter IdentifyTrait matter OnOffTrait |
Terang |
Selalu periksa dukungan atribut dan perintah untuk perangkat sebelum menggunakan fitur apa pun atau mencoba memperbarui atribut. Lihat Mengontrol perangkat di iOS untuk mengetahui informasi selengkapnya.
Prasyarat
Sebelum menggunakan perangkat pencahayaan dan kurva pencahayaan, pastikan aplikasi Anda menginisialisasi Home SDK dan menyertakan impor yang diperlukan:
import Foundation import GoogleHomeSDK import GoogleHomeTypes import Network
Menemukan perangkat lampu
Untuk menemukan perangkat pencahayaan dalam struktur, filter daftar perangkat berdasarkan jenis perangkat,
seperti
OnOffLightDeviceType
dan
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)
Anda juga dapat mengambil semua perangkat pencahayaan di beberapa jenis perangkat lampu dalam satu filter:
// 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) }
Mendapatkan informasi dasar tentang perangkat
Diimplementasikan di Aplikasi Contoh untuk iOS
Karakteristik BasicInformation
mencakup informasi seperti nama vendor, ID vendor, ID produk,
nama produk (termasuk informasi model), dan versi software untuk perangkat:
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!
Mengidentifikasi perangkat pencahayaan
Jika sebuah ruangan berisi beberapa lampu, Anda dapat membantu pengguna menemukan perlengkapan fisik tertentu dengan memicu status identifikasi visual, seperti mengedipkan lampu selama beberapa detik. Keempat jenis perangkat lampu memerlukan
ciri Matter.IdentifyTrait.
Panggil perintah identify dengan durasi identifyTime dalam detik untuk memulai
status identifikasi. Meneruskan 0 akan segera menghentikan status identifikasi. Anda juga dapat memanggil triggerEffect untuk menjalankan efek visual tertentu,
seperti Blink atau 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
)
}
}
Memeriksa konektivitas perangkat pencahayaan
Konektivitas untuk perangkat sebenarnya diperiksa di tingkat jenis perangkat karena beberapa perangkat mendukung beberapa jenis perangkat. Status yang ditampilkan adalah kombinasi status konektivitas untuk semua karakteristik di perangkat tersebut.
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
Status partiallyOnline dapat diamati dalam kasus jenis perangkat campuran
saat tidak ada konektivitas internet. Karakteristik standar Matter
mungkin masih online karena perutean lokal, tetapi karakteristik berbasis cloud akan
offline.
Mendapatkan alamat IP perangkat
Untuk menemukan alamat IP perangkat, gunakan atribut networkInterfaces dari
GeneralDiagnosticsTrait.
Alamat ditampilkan sebagai objek Data, yang dapat Anda format ke string IPv4 atau IPv6 standar menggunakan 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
}
Mengontrol perangkat pencahayaan
Jenis perangkat OnOffLight dan DimmableLight menggunakan karakteristik
Matter standar untuk mengidentifikasi perlengkapan, mengalihkan status daya,
dan menyesuaikan tingkat kecerahan.
Menyalakan atau mematikan lampu
Gunakan karakteristik
OnOffTrait
untuk membaca status daya saat ini dari OnOffLight atau DimmableLight dan
untuk menyalakan atau mematikan lampu.
Sebelum membaca atribut onOff, pastikan perangkat mendukungnya. Beberapa
perangkat beroperasi sebagai endpoint khusus perintah dan tidak melaporkan status.
// 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!") }
Jika onOff adalah true, lampu akan menyala. Jika onOff adalah false, lampu akan
mati.
Untuk mengubah status daya lampu, pastikan karakteristik mendukung
perintah yang diinginkan, lalu panggil on(), off(), atau 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 }
Anda juga dapat memanggil on() dan off() secara langsung untuk menetapkan status eksplisit:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let _ as HomeError { // Code for handling the exception }
Untuk mematikan lampu dengan transisi visual bertahap, panggil offWithEffect()
dan tentukan nilai 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 }
Atur tingkat kecerahan
DimmableLight memerlukan karakteristik LevelControlTrait, dan OnOffLight dapat mendukungnya secara opsional. Gunakan karakteristik ini untuk membaca dan
mengontrol tingkat kecerahan lampu.
Atribut currentLevel melaporkan tingkat kecerahan saat ini dalam skala
dari 0 hingga 254. Anda juga dapat memeriksa minLevel dan maxLevel untuk menentukan
rentang kecerahan valid yang didukung oleh hardware.
Untuk menyetel kecerahan ke nilai tertentu, panggil moveToLevel(). Perhatikan bahwa
moveToLevel() hanya mengubah level saat ini jika lampu sudah menyala,
kecuali jika Anda mengonfigurasi optionsOverride dengan executeIfOff. Untuk otomatis
menyalakan lampu saat menyetel tingkat kecerahan bukan nol (atau mematikannya saat
menyetel tingkat ke minimum), gunakan 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 }
Contoh berikut membaca tingkat kecerahan saat ini dan menggunakan
moveToLevelWithOnOff() untuk menyetel lampu yang dapat diredupkan ke kecerahan 75% (190) selama
transisi 1 detik (10 persepuluh detik):
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() ) } }
Anda juga dapat menambah atau mengurangi kecerahan relatif terhadap level saat ini dengan
memanggil stepWithOnOff() dengan .up atau .down dan stepSize.
Warna kontrol
SifatColorControlTrait
tersedia di
ColorTemperatureLightDeviceType
dan
ExtendedColorLightDeviceType.
Sifat ini memungkinkan Anda menyesuaikan suhu warna dalam derajat mikro-timbal balik atau mired.
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() ) }
Anda juga dapat menetapkan warna menggunakan koordinat kromatisitas CIE 1931 serta nilai hue dan saturasi 16-bit.
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
adalah karakteristik Google opsional di
ExtendedColorLightDevice
yang menyederhanakan kontrol warna dengan menerima nama warna, nilai RGB, atau nilai HSV
floating point terpadu yang menggabungkan warna dan kecerahan dalam satu unit.
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
Mengelola kurva pencahayaan
Kurva pencahayaan menentukan jadwal otomatis yang mentransisikan kecerahan dan suhu warna opsional lampu target dengan lancar sepanjang hari. Misalnya, kurva pencahayaan dapat meningkatkan kecerahan lampu secara bertahap di pagi hari dan meredupkannya ke nuansa yang lebih hangat di malam hari. Jenis perangkat lampu yang hanya mendukung kecerahan, seperti Lampu yang Dapat Diredupkan, mengikuti kurva kecerahan dan mengabaikan suhu warna.
Karakteristik
Google.LightingCurveTrait
adalah karakteristik Google Home platform (GHP)
tingkat struktur. Anda mengaksesnya dari instance
Structure, bukan
dari perangkat pencahayaan individual.
Setiap jadwal pada karakteristik diwakili oleh LightingCurveSetting, yang
menyandingkan settingId unik dengan LightingCurveConfig. Tabel berikut
menjelaskan kolom konfigurasi LightingCurveConfig:
| Kolom | Deskripsi |
|---|---|
curvePointsArray |
Urutan minimal dua item CurvePoint dengan waktu yang berbeda. Setiap titik menentukan time (CurveTimeOfDay dengan hours dari 0 hingga 23 dan minutes dari 0 hingga 59), brightnessPercent (0 hingga 100), dan colorTemperature opsional dalam Kelvin. Jika colorTemperature ditentukan untuk titik mana pun, nilainya harus positif untuk semua titik. |
roomId |
ID ruangan target (misalnya, room@{uuid}). Menerapkan kurva pencahayaan ke lampu yang kompatibel dengan fitur peredupan dan suhu warna di ruangan tersebut. Tentukan roomId atau devices. |
devices |
Objek TargetDevices yang berisi daftar entri TargetDevice, masing-masing dengan id perangkat dan ID type perangkat (seperti home.matter.0000.types.0101 untuk DimmableLight atau home.matter.0000.types.010c untuk ColorTemperatureLight). Tentukan devices atau roomId. |
daysOfWeekArray |
Hari dalam seminggu saat kurva pencahayaan berjalan (Locale.Weekday). Jika daftar kosong, kurva pencahayaan akan berjalan setiap hari. |
adaptive |
Boolean opsional yang menunjukkan apakah kurva pencahayaan bersifat adaptif, yang berarti lampu target melanjutkan tingkat kurva aktif saat dinyalakan selama periode penjadwalan. Jika false, perubahan manual pada lampu akan melepaskan lampu dari kurva pencahayaan selama sisa hari itu. Jika true, lampu yang dimatikan lalu dinyalakan kembali selama periode penjadwalan akan mengaktifkan kembali lampu dengan kurva pencahayaan, sehingga lampu akan menyesuaikan dengan kecerahan dan color temperature kurva saat ini, dan mengikuti kurva dari sana. |
enabled |
Boolean opsional yang menunjukkan apakah setelan kurva pencahayaan aktif. Setelan defaultnya adalah true saat membuat setelan baru. Jika enabled dihilangkan dari perintah update, status enabled tidak akan berubah. |
Membaca setelan kurva pencahayaan
Untuk memeriksa kurva pencahayaan yang dikonfigurasi untuk struktur, ambil karakteristik
Google.LightingCurveTrait
dari Structure dan baca atribut
lightingCurveSettingsArray-nya.
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"
)
}
}
}
Membuat setelan kurva pencahayaan
Untuk membuat jadwal kurva pencahayaan baru pada struktur, buat
LightingCurveConfig dengan setidaknya dua entri CurvePoint, lampu target
(ditentukan oleh roomId atau devices), dan hari aktif dalam seminggu. Kemudian, teruskan konfigurasi ke createLightingCurveSetting(). Perintah ini menampilkan
settingId unik yang ditetapkan ke setelan kurva pencahayaan baru.
Contoh berikut membuat kurva pencahayaan hari kerja untuk ruangan yang meningkatkan kecerahan dari 30% pada pukul 07.00 menjadi 80% pada pukul 09.00 dan meredupkannya menjadi 20% pada pukul 21.00:
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
}
Untuk menargetkan perangkat pencahayaan tertentu, bukan seluruh ruangan, berikan parameter devices menggunakan 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
Memperbarui setelan kurva pencahayaan
Untuk mengubah kurva pencahayaan yang ada—seperti mengubah titik kurvanya,
memperbarui hari aktif dalam seminggu, atau mengaktifkan dan menonaktifkan
jadwal—panggil updateLightingCurveSetting() dengan settingId target dan
LightingCurveConfig yang diperbarui.
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
)
}
Menghapus setelan kurva pencahayaan
Untuk menghapus setelan kurva pencahayaan dari struktur, panggil
deleteLightingCurveSetting() dengan settingId setelan yang ingin Anda
hapus.
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)
}