Işık cihazları, armatürleri tanımlamak, güç durumlarını değiştirmek ve parlaklık seviyelerini ayarlamak için standart Matter özelliklerini kullanır.
En temel ışık cihazı türü, OnOffTrait ve IdentifyTrait özellikleriyle uygulanan ve isteğe bağlı olarak LevelControlTrait ile LightEffectsTrait özelliklerini destekleyen OnOffLightDeviceType türüdür.
Diğer ışık türleri ek özellikler sunar ve farklı özelliklerle uygulanır:
| Home API'leri Cihaz Türü | Özellikler | Swift Örnek Uygulaması | Kullanım Örneği |
|---|---|---|---|
|
Renk Sıcaklığı Işığı
Açılıp kapatılabilen, ışık yoğunluğu ve renk sıcaklığı ayarlanabilen bir aydınlatma cihazı. |
Gerekli Özellikler matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
Açık | |
|
Parlaklığı Ayarlanabilir Işık
Açılıp kapatılabilen, ışığının yoğunluğu ayarlanabilen ve bağlı bir varlık sensörü aracılığıyla açılıp kapatılabilen bir aydınlatma cihazı. |
Required Traits matter IdentifyTrait matter OnOffTrait matter LevelControlTrait |
Açık | |
|
Genişletilmiş Renkli Işık
Açılıp kapatılabilen, ışık yoğunluğu ve renk sıcaklığı ayarlanabilen ve bağlı bir varlık sensörü aracılığıyla açılıp kapatılabilen aydınlatma cihazı. |
Gerekli Özellikler matter IdentifyTrait matter OnOffTrait matter LevelControlTrait matter ColorControlTrait |
Açık | |
|
Açma/Kapama Işığı
Açılıp kapatılabilen bir aydınlatma cihazı. |
Required Traits matter IdentifyTrait matter OnOffTrait |
Açık |
Herhangi bir özelliği kullanmadan veya özellikleri güncellemeye çalışmadan önce her zaman cihazın özellik ve komut desteğini kontrol edin. Daha fazla bilgi için iOScihazlarını kontrol etme başlıklı makaleyi inceleyin.
Ön koşullar
Aydınlatma cihazları ve aydınlatma eğrileriyle çalışmadan önce uygulamanızın Home SDK'yı başlattığından ve gerekli içe aktarma işlemlerini içerdiğinden emin olun:
import Foundation import GoogleHomeSDK import GoogleHomeTypes import Network
Işık cihazlarını bulma
Bir yapıdaki aydınlatma cihazlarını bulmak için cihaz listesini cihaz türüne göre filtreleyin. Örneğin,
OnOffLightDeviceType
ve
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)
Ayrıca, tek bir filtrede birden fazla ışık cihazı türündeki tüm aydınlatma cihazlarını alabilirsiniz:
// 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) }
Cihaz hakkında temel bilgileri alma
iOS için örnek uygulamada uygulandı
BasicInformation özelliği; cihazın tedarikçi adı, tedarikçi kimliği, ürün kimliği, ürün adı (model bilgilerini içerir) ve yazılım sürümü gibi bilgileri içerir:
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!
Aydınlatma cihazını tanımlama
Bir odada birden fazla ışık varsa görsel bir tanımlama durumu (ör. ışığı birkaç saniye boyunca yanıp söndürme) tetikleyerek kullanıcıların belirli bir fiziksel armatürü bulmasına yardımcı olabilirsiniz. Dört ışık cihazı türünün tümü Matter.IdentifyTrait özelliğini gerektirir.
Tanımlama durumunu başlatmak için identify komutunu saniye cinsinden identifyTime süresiyle çağırın. 0 değerini iletmek, tanımlama durumunu hemen durdurur. Blink veya Breathe gibi belirli bir görsel efekti çalıştırmak için triggerEffect işlevini de çağırabilirsiniz.
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
)
}
}
Işıklandırma cihazının bağlantısını kontrol etme
Bazı cihazlar birden fazla cihaz türünü desteklediğinden, bir cihazın bağlantısı aslında cihaz türü düzeyinde kontrol edilir. Döndürülen durum, söz konusu cihazdaki tüm özelliklerin bağlantı durumlarının birleşimidir.
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
İnternet bağlantısı olmadığında karma cihaz türleri için partiallyOnline durumu görülebilir. Matter standart özellikleri, yerel yönlendirme nedeniyle hâlâ online olabilir ancak bulut tabanlı özellikler çevrimdışı olur.
Cihazın IP adresini alma
Cihazın IP adresini bulmak için GeneralDiagnosticsTrait'nin networkInterfaces özelliğini kullanın.
Adresler Data nesneleri olarak döndürülür. Network çerçevesini kullanarak bunları standart IPv4 veya IPv6 dizeleri olarak biçimlendirebilirsiniz:
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
}
Aydınlatma cihazlarını kontrol etme
OnOffLight ve DimmableLight cihaz türleri, armatürleri tanımlamak, güç durumlarını değiştirmek ve parlaklık seviyelerini ayarlamak için standart Matter özelliklerini kullanır.
Işığı açma veya kapatma
Bir OnOffLight veya DimmableLight cihazının mevcut güç durumunu okumak ve ışığı açıp kapatmak için OnOffTrait özelliğini kullanın.
onOff özelliğini okumadan önce cihazın bu özelliği desteklediğini doğrulayın. Bazı cihazlar yalnızca komut uç noktaları olarak çalışır ve durum bildirmez.
// 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 olduğunda ışık yanar. onOff, false olduğunda ışık kapalıdır.
Işığın güç durumunu değiştirmek için özelliğin istenen komutu desteklediğini doğrulayın ve ardından on(), off() veya toggle() komutunu çağırın.
// 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 }
Ayrıca, açık bir durum ayarlamak için doğrudan on() ve off() işlevlerini de çağırabilirsiniz:
do { try await onOffTraitTest.off() try await onOffTraitTest.on() } catch let _ as HomeError { // Code for handling the exception }
Bir ışığı kademeli görsel geçişle kapatmak için offWithEffect() işlevini çağırın ve bir EffectIdentifierEnum değeri belirtin:
// 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 }
Parlaklık düzeylerini ayarlayın
DimmableLight için LevelControlTrait özelliği gerekir. OnOffLight ise bu özelliği isteğe bağlı olarak destekleyebilir. Bu özelliği kullanarak bir ışığın parlaklık seviyesini okuyabilir ve kontrol edebilirsiniz.
currentLevel özelliği, mevcut parlaklık seviyesini 0 ile 254 arasında bir ölçekte bildirir. Donanım tarafından desteklenen geçerli parlaklık aralığını belirlemek için minLevel ve maxLevel değerlerini de inceleyebilirsiniz.
Parlaklığı belirli bir değere ayarlamak için moveToLevel() yöntemini çağırın. moveToLevel(), optionsOverride'i executeIfOff ile yapılandırmadığınız sürece yalnızca ışık açıkken mevcut seviyeyi değiştirir. Sıfır olmayan bir parlaklık seviyesi ayarlarken ışığı otomatik olarak açmak (veya seviyeyi minimuma ayarlarken kapatmak) için moveToLevelWithOnOff() kullanın.
// 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 }
Aşağıdaki örnekte mevcut parlaklık seviyesi okunur ve kısılabilir bir ışığı 1 saniyelik (10 saniyenin onda biri) geçişle% 75 parlaklığa (190) ayarlamak için moveToLevelWithOnOff() kullanılır:
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() ) } }
Ayrıca stepWithOnOff() komutunu .up veya .down ve stepSize ile çağırarak parlaklığı mevcut seviyeye göre artırabilir veya azaltabilirsiniz.
Kontrol rengi
ColorControlTrait
özelliği hem
ColorTemperatureLightDeviceType
hem de
ExtendedColorLightDeviceType
üzerinde kullanılabilir.
Bu özellik, renk sıcaklığını mikro karşılıklı derece veya mired cinsinden ayarlamanıza olanak tanır.
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() ) }
Ayrıca CIE 1931 renk koordinatlarını ve 16 bit renk tonu ve doygunluk değerlerini kullanarak rengi ayarlayabilirsiniz.
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, ExtendedColorLightDevice
üzerinde isteğe bağlı bir Google özelliğidir.
Renk adlarını, RGB değerlerini veya renk ile parlaklığı tek bir birimde birleştiren birleşik kayan nokta HSV değerlerini kabul ederek renk kontrolünü basitleştirir.
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
Işık eğrilerini yönetme
Aydınlatma eğrisi, gün boyunca hedef ışıkların parlaklığını ve isteğe bağlı renk sıcaklığını sorunsuz bir şekilde değiştiren otomatik bir program tanımlar. Örneğin, bir aydınlatma eğrisi sabahları ışıkları kademeli olarak açabilir ve akşamları daha sıcak bir tona kısabilir. Yalnızca parlaklığı destekleyen ışık cihazı türleri (ör. kısılabilir ışık), parlaklık eğrisini takip eder ve renk sıcaklığını yok sayar.
Google.LightingCurveTrait özelliği, yapı düzeyinde bir Google Home platform (GHP) özelliğidir. Bu hizmete tek bir aydınlatma cihazından değil, bir Structure örneğinden erişirsiniz.
Özellikteki her program, benzersiz bir settingId ile LightingCurveConfig değerini eşleyen bir LightingCurveSetting ile temsil edilir. Aşağıdaki tabloda LightingCurveConfig aracının yapılandırma alanları açıklanmaktadır:
| Alan | Açıklama |
|---|---|
curvePointsArray |
Farklı zamanlara sahip en az iki CurvePoint öğesinden oluşan bir dizi. Her nokta bir time (0 ile 23 arasında hours ve 0 ile 59 arasında minutes içeren CurveTimeOfDay), bir brightnessPercent (0 ile 100 arasında) ve Kelvin cinsinden isteğe bağlı bir colorTemperature belirtir. Herhangi bir nokta için colorTemperature belirtilirse tüm noktalar için pozitif bir değer olmalıdır. |
roomId |
Hedef odanın kimliği (ör. room@{uuid}). Aydınlatma eğrisini, o odadaki uyumlu, kısılabilir ve renk sıcaklığı ışıklarına uygular. roomId veya devices değerlerinden birini belirtin. |
devices |
Her biri bir cihaz id ve cihaz type kimliği (DimmableLight için home.matter.0000.types.0101 veya ColorTemperatureLight için home.matter.0000.types.010c gibi) içeren TargetDevice girişlerinin listesini içeren bir TargetDevices nesnesi. devices veya roomId değerini belirtin. |
daysOfWeekArray |
Işıklandırma eğrisinin çalıştığı haftanın günleri (Locale.Weekday). Liste boşsa ışıklandırma eğrisi her gün çalışır. |
adaptive |
Işık eğrisinin uyarlanabilir olup olmadığını belirten isteğe bağlı Boole değeri. Uyarlanabilir ışık eğrisi, hedef ışığın planlanan zaman aralığında açıldığında etkin eğri seviyesine devam ettiği anlamına gelir. false etkin olduğunda, bir ışıkta manuel olarak yapılan değişiklik, günün geri kalanında ışığı aydınlatma eğrisinden ayırır. true olduğunda, planlama zaman aralığı sırasında kapatılıp tekrar açılan bir ışık, ışık eğrisiyle yeniden etkileşime girerek eğrinin mevcut parlaklığına ve renk sıcaklığına uyar ve eğriyi oradan takip eder. |
enabled |
Işık eğrisi ayarının etkin olup olmadığını gösteren isteğe bağlı boole değeri. Yeni bir ayar oluşturulurken varsayılan olarak true değerine ayarlanır. enabled, bir güncelleme komutundan çıkarıldığında enabled durumu değişmez. |
Işık eğrisi ayarlarını okuma
Bir yapı için yapılandırılmış aydınlatma eğrilerini incelemek için Structure özelliğinden Google.LightingCurveTrait özelliğini alın ve lightingCurveSettingsArray özelliğini okuyun.
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"
)
}
}
}
Işıklandırma eğrisi ayarı oluşturma
Bir yapıda yeni bir aydınlatma eğrisi programı oluşturmak için en az iki CurvePoint girişi, hedef ışıklar (roomId veya devices ile belirtilir) ve haftanın etkin günlerini içeren bir LightingCurveConfig oluşturun. Ardından yapılandırmayı createLightingCurveSetting() öğesine iletin. Komut, yeni ışıklandırma eğrisi ayarına atanan benzersiz settingId değerini döndürür.
Aşağıdaki örnekte, bir oda için hafta içi aydınlatma eğrisi oluşturulmaktadır. Bu eğri, parlaklığı sabah 07:00'de% 30'dan sabah 09:00'da% 80'e çıkarır ve akşam 21:00'de% 20'ye düşürür:
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
}
Tüm oda yerine belirli aydınlatma cihazlarını hedeflemek için Google.LightingCurveTrait.TargetDevices kullanarak devices parametresini sağlayın:
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
Işık eğrisi ayarını güncelleme
Mevcut bir aydınlatma eğrisini değiştirmek (ör. eğri noktalarını değiştirmek, haftanın etkin günlerini güncellemek veya programı etkinleştirip devre dışı bırakmak) için hedef settingId ve güncellenmiş LightingCurveConfig ile updateLightingCurveSetting() yöntemini çağırın.
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
)
}
Işıklandırma eğrisi ayarını silme
Bir yapıdan ışıklandırma eğrisi ayarını kaldırmak için silmek istediğiniz ayarın settingId değeriyle deleteLightingCurveSetting() yöntemini çağırın.
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)
}