מכשירי תאורה משתמשים בתכונות סטנדרטיות של Matter כדי לזהות גופי תאורה, להחליף בין מצבי הפעלה ולשנות את רמות הבהירות.
סוג המכשיר הבסיסי ביותר של תאורה הוא
OnOffLightDeviceType
שמיושם עם התכונות
OnOffTrait ו-
IdentifyTrait
ותומך באופן אופציונלי בתכונה
LevelControlTrait
ובתכונה
LightEffectsTrait.
סוגי תאורה אחרים מציעים יכולות נוספות ומוטמעים באמצעות תכונות שונות:
| סוג המכשיר ב-Home APIs | תכונות | אפליקציה לדוגמה ב-Swift | תרחיש לדוגמה |
|---|---|---|---|
|
טמפרטורת צבע בהירה
מכשיר תאורה שאפשר להדליק או לכבות, לכוונן את עוצמת האור שלו ולכוונן את טמפרטורת הצבע שלו. |
תכונות נדרשות matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
בהיר | |
|
מנורה עם אפשרות עמעום
מכשיר תאורה שאפשר להדליק או לכבות, לכוון את עוצמת האור שלו ולהפעיל אותו באמצעות חיישן נוכחות מקושר. |
תכונות נדרשות matter IdentifyTrait matter OnOffTrait matter LevelControlTrait |
בהיר | |
|
תאורה עם מגוון צבעים רחב
מכשיר תאורה שאפשר להדליק או לכבות, לכוונן את עוצמת האור שלו, לכוונן את טמפרטורת הצבע שלו ולהפעיל אותו באמצעות חיישן נוכחות מקושר. |
תכונות נדרשות matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
בהיר | |
|
נורית הפעלה/כיבוי
מכשיר תאורה שאפשר להדליק או לכבות. |
תכונות נדרשות matter IdentifyTrait matter OnOffTrait |
בהיר |
לפני שמשתמשים בתכונות או מנסים לעדכן מאפיינים, תמיד צריך לבדוק אם המכשיר תומך במאפיינים ובפקודות. מידע נוסף זמין במאמר שליטה במכשירים ב-iOS.
דרישות מוקדמות
לפני שמתחילים לעבוד עם מכשירי תאורה ועקומות תאורה, צריך לוודא שהאפליקציה מפעילה את Home SDK וכוללת את הייבוא הנדרש:
import Foundation import GoogleHomeSDK import GoogleHomeTypes import Network
איתור מכשירים קלים
כדי למצוא מכשירי תאורה במבנה, מסננים את רשימת המכשירים לפי סוג המכשיר, למשל OnOffLightDeviceType ו-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)
אפשר גם לאחזר את כל מכשירי התאורה מכמה סוגים של מכשירי תאורה במסנן אחד:
// 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) }
לקבל מידע בסיסי על מכשיר
המאפיין BasicInformation כולל מידע כמו שם הספק, מזהה הספק, מזהה המוצר, שם המוצר (כולל מידע על הדגם) וגרסת התוכנה של המכשיר:
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!
זיהוי מכשיר תאורה
כשיש בחדר כמה נורות, אתם יכולים לעזור למשתמשים לאתר גוף תאורה פיזי ספציפי על ידי הפעלת מצב זיהוי חזותי, כמו הבהוב של הנורה למשך כמה שניות. כל ארבעת סוגי המכשירים של תאורה דורשים את התכונה Matter.IdentifyTrait.
כדי להתחיל את מצב הזיהוי, מפעילים את הפקודה identify עם משך זמן של identifyTime בשניות. העברת הערך 0 מפסיקה את מצב הזיהוי באופן מיידי. אפשר גם להפעיל את triggerEffect כדי להריץ אפקט חזותי ספציפי, כמו Blink או 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
)
}
}
בדיקת הקישוריות של מכשיר תאורה
הקישוריות של מכשיר נבדקת בפועל ברמת סוג המכשיר, כי חלק מהמכשירים תומכים בכמה סוגי מכשירים. המצב שמוחזר הוא שילוב של מצבי הקישוריות של כל התכונות במכשיר הזה.
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
יכול להיות שיוצג מצב של partiallyOnline במקרה של סוגי מכשירים מעורבים כשאין חיבור לאינטרנט. יכול להיות שתכונות סטנדרטיות של Matter עדיין יהיו אונליין בגלל ניתוב מקומי, אבל תכונות מבוססות-ענן יהיו אופליין.
איך מוצאים את כתובת ה-IP של המכשיר
כדי למצוא את כתובת ה-IP של המכשיר, משתמשים במאפיין networkInterfaces של GeneralDiagnosticsTrait.
הכתובות מוחזרות כאובייקטים מסוג Data, שאפשר להמיר למחרוזות IPv4 או IPv6 רגילות באמצעות מסגרת 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
}
שליטה במכשירי תאורה
סוגי המכשירים OnOffLight ו-DimmableLight משתמשים בתכונות הסטנדרטיות של Matter כדי לזהות גופי תאורה, להחליף בין מצבי הפעלה ולשנות את רמות הבהירות.
הדלקה או כיבוי של אורות
אפשר להשתמש בתכונה OnOffTrait כדי לקרוא את מצב ההפעלה הנוכחי של OnOffLight או DimmableLight, ולהדליק או לכבות את האור.
לפני שקוראים את המאפיין onOff, צריך לוודא שהמכשיר תומך בו. חלק מהמכשירים פועלים כנקודות קצה לפקודות בלבד ולא מדווחים על המצב.
// 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!") }
כשהערך של onOff הוא true, הנורה דולקת. כשהערך של onOff הוא false, הנורית כבויה.
כדי לשנות את מצב ההפעלה של הנורה, צריך לוודא שהתכונה תומכת בפקודה הרצויה ואז להפעיל את on(), off() או 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 }
אפשר גם לקרוא ישירות ל-on() ול-off() כדי להגדיר מצב מפורש:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let _ as HomeError { // Code for handling the exception }
כדי לכבות אור עם מעבר חזותי הדרגתי, צריך להפעיל את offWithEffect() ולציין ערך של 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 }
כוונון רמות הבהירות
DimmableLight דורש את המאפיין LevelControlTrait, ו-OnOffLight יכול לתמוך בו. אפשר להשתמש בתכונה הזו כדי לקרוא את רמת הבהירות של האור ולשלוט בה.
המאפיין currentLevel מדווח על רמת הבהירות הנוכחית בסולם מ-0 עד 254. אפשר גם לבדוק את minLevel ו-maxLevel כדי לקבוע את טווח הבהירות החוקי שנתמך על ידי החומרה.
כדי להגדיר את הבהירות לערך ספציפי, צריך להתקשר אל moveToLevel(). שימו לב שהפקודה moveToLevel() משנה את הרמה הנוכחית רק כשהאור כבר דולק, אלא אם מגדירים את optionsOverride עם executeIfOff. כדי להדליק את האור באופן אוטומטי כשמגדירים רמת בהירות שאינה אפס (או לכבות אותו כשמגדירים את הרמה למינימום), משתמשים ב-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 }
בדוגמה הבאה, המערכת קוראת את רמת הבהירות הנוכחית ומשתמשת ב-moveToLevelWithOnOff() כדי להגדיר את הבהירות של נורה ניתנת לעמעום ל-75% (190) במעבר של שנייה אחת (10 עשיריות השנייה):
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() ) } }
אפשר גם להגביר או להפחית את הבהירות ביחס לרמה הנוכחית על ידי קריאה ל-stepWithOnOff() עם .up או .down ו-stepSize.
צבע הפקד
התכונהColorControlTrait
זמינה גם ב-
ColorTemperatureLightDeviceType
וגם ב-
ExtendedColorLightDeviceType.
התכונה הזו מאפשרת לכוון את טמפרטורת הצבע במיקרו-מעלות הדדיות או במיירדים.
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() ) }
אפשר גם להגדיר צבע באמצעות קואורדינטות של כרומטיות CIE 1931 וערכי גוון ורוויה של 16 ביט.
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
היא תכונה אופציונלית של Google ב-
ExtendedColorLightDevice
שמפשטת את השליטה בצבע על ידי קבלת שמות צבעים, ערכי RGB או ערכי HSV מאוחדים של נקודה צפה (floating-point) שמשלבים צבע ובהירות ביחידה אחת.
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
ניהול עקומות התאורה
עקומת תאורה מגדירה לוח זמנים אוטומטי שמשנה בצורה חלקה את הבהירות ואת טמפרטורת הצבע (אופציונלי) של נורות היעד במהלך היום. לדוגמה, עקומת תאורה יכולה להגביר בהדרגה את האורות בבוקר ולעמעם אותם לגוון חם יותר בערב. סוגי תאורה שתומכים רק בבהירות, כמו תאורה ניתנת לעמעום, פועלים לפי עקומת הבהירות ומתעלמים מטמפרטורת הצבע.
המאפיין Google.LightingCurveTrait הוא מאפיין Google Home platform (GHP) ברמת הבית. אתם ניגשים אליו ממכונה של Structure ולא ממכשיר תאורה ספציפי.
כל לוח זמנים בתכונה מיוצג על ידי LightingCurveSetting, שמצמד settingId ייחודי עם LightingCurveConfig. בטבלה הבאה מתוארים שדות התצורה של LightingCurveConfig:
| שדה | תיאור |
|---|---|
curvePointsArray |
רצף של לפחות שני פריטים מסוג CurvePoint עם זמנים שונים. כל נקודה מציינת time (CurveTimeOfDay עם hours מ-0 עד 23 ו-minutes מ-0 עד 59), brightnessPercent (מ-0 עד 100) ו-colorTemperature אופציונלי בקלווין. אם מציינים את המאפיין colorTemperature בנקודה כלשהי, הוא חייב להיות ערך חיובי בכל הנקודות. |
roomId |
המזהה של החדר הרלוונטי (לדוגמה, room@{uuid}). החלת עקומת התאורה על נורות תואמות בחדר הזה, שניתן לעמעם אותן ולשנות את טמפרטורת הצבע שלהן. צריך לציין roomId או devices. |
devices |
אובייקט TargetDevices שמכיל רשימה של רשומות TargetDevice, כל אחת עם id של מכשיר ומזהה type של מכשיר (כמו home.matter.0000.types.0101 עבור DimmableLight או home.matter.0000.types.010c עבור ColorTemperatureLight). צריך לציין devices או roomId. |
daysOfWeekArray |
הימים בשבוע שבהם עקומת התאורה פועלת (Locale.Weekday). אם הרשימה ריקה, עקומת התאורה פועלת מדי יום. |
adaptive |
ערך בוליאני אופציונלי שמציין אם עקומת התאורה היא דינמית, כלומר אם תאורת היעד חוזרת לרמת העקומה הפעילה כשהיא מופעלת במהלך החלון המתוזמן. כשהאפשרות false מופעלת, שינוי ידני של תאורה מנתק את התאורה מעקומת התאורה למשך שאר היום. כשtrue, נורה שכובתה ואז הודלקה שוב במהלך חלון הזמנים של לוח הזמנים, תתחבר מחדש לעקומת התאורה, תתאים את עצמה לבהירות ולטמפרטורת הצבע הנוכחיות של העקומה, ותפעל לפי העקומה מאותו רגע. |
enabled |
ערך בוליאני אופציונלי שמציין אם הגדרת עקומת התאורה פעילה. ברירת המחדל היא true כשיוצרים הגדרה חדשה. כשמשמיטים את enabled מפקודת עדכון, המצב של enabled לא משתנה. |
קריאת ההגדרות של עקומת התאורה
כדי לבדוק את עקומות התאורה שהוגדרו למבנה, מאחזרים את המאפיין Google.LightingCurveTrait מה-Structure וקוראים את המאפיין 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"
)
}
}
}
יצירת הגדרה של עקומת תאורה
כדי ליצור לוח זמנים חדש לעקומת תאורה במבנה, צריך ליצור LightingCurveConfig עם לפחות שני רשומות של CurvePoint, נורות יעד (שצוינו על ידי roomId או devices) והימים הפעילים בשבוע. ואז מעבירים את ההגדרה אל createLightingCurveSetting(). הפקודה מחזירה את הערך הייחודי של settingId שהוקצה להגדרה החדשה של עקומת התאורה.
בדוגמה הבאה נוצרת עקומת תאורה לחדר בימי חול, שבה הבהירות עולה מ-30% בשעה 7:00 ל-80% בשעה 9:00, ומתעמעמת ל-20% בשעה 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
}
כדי לטרגט מכשירי תאורה ספציפיים במקום חדר שלם, צריך לספק את הפרמטר devices באמצעות 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
עדכון הגדרה של עקומת תאורה
כדי לשנות עקומת תאורה קיימת, למשל לשנות את נקודות העקומה, לעדכן את הימים הפעילים בשבוע או להפעיל ולהשבית את לוח הזמנים, צריך להפעיל את updateLightingCurveSetting() עם היעד settingId ו-LightingCurveConfig מעודכן.
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
)
}
מחיקת הגדרה של עקומת תאורה
כדי להסיר הגדרה של עקומת תאורה ממבנה, מפעילים את deleteLightingCurveSetting() עם ה-settingId של ההגדרה שרוצים למחוק.
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)
}