Otomasyon oluşturmak için çeşitli Automation DSL düğümlerinin nasıl kullanılabileceğini anlamak üzere aşağıdaki kılavuzdan yararlanın.
Tüm otomasyon DSL'si tek bir automation
düğümüne yerleştirilir. automation
düğümü, dış Swift dil bağlamı ile yerleşik DSL bağlamı arasındaki sınırı oluşturur.
Sıralı akış
Sıralı akış, varsayılan otomasyon akışı türüdür.
Aşağıda, başlatıcı, koşul ve işlemden oluşan sıralı bir akış kullanan çok basit bir Otomasyon DSL şablonu verilmiştir:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
Bu, ek düğümler ekleyerek hassaslaştırılabilir.
Başlangıç
Başlatıcı düğümleri, bir otomasyonu etkinleştiren ilk koşulları tanımlar. Örneğin, durumda veya değerde bir değişiklik. Bir otomasyonda en az bir başlatıcı olmalıdır. Aksi takdirde doğrulama başarısız olur. Bir otomasyona birden fazla başlatıcı eklemek için select
düğümü kullanmanız gerekir.
Özellik özelliğine dayalı başlatıcı
Bir özellik özelliğine dayalı bir başlatıcı düğümü tanımlarken şunları belirtin:
- cihaz
- Özelliğin ait olduğu cihaz türü
- özellik
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
Cihaz türü parametresi, otomasyonun bir cihazda hangi cihaz türünü adresleyeceğini belirtmenize olanak tanıdığı için gereklidir. Örneğin, bir cihaz FanDeviceType
ve HeatingCoolingUnitDeviceType
'ten oluşabilir. Her ikisi de OnOffTrait
özelliğini içerir. Cihaz türünü belirterek otomasyonun cihazın hangi kısmını tetiklediği konusunda belirsizlik kalmaz.
Etkinliğe dayalı başlatıcı
Bir etkinliğe dayalı bir başlatıcı düğümü tanımlarken şunları belirtin:
- cihaz
- Özelliğin ait olduğu cihaz türü
- etkinlik
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
Parametreler içeren, bir yapıya ve etkinliğe dayalı başlatıcı
Bazı etkinliklerin parametreleri olabilir. Bu nedenle, bu parametrelerin de başlatıcıya eklenmesi gerekir.
Örneğin, bu başlatıcı otomasyonu 07:00'de etkinleştirmek için TimeTrait
'nin ScheduledEvent
özelliğini kullanır:
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
Manuel marş
Manuel başlatıcı, kullanıcının otomasyonu manuel olarak çalıştırmasına olanak tanıyan özel bir başlatıcı türüdür.
Manuel başlatıcıyı tanımlarken:
- Özellik veya cihaz türü belirtmeyin.
Automation.execute()
çağrısı yapan bir kullanıcı arayüzü öğesi sağlayın.
Bir select
akışına başka bir başlatıcıyla birlikte manuel başlatıcı yerleştirildiğinde manuel başlatıcı, diğer başlatıcıyı geçersiz kılar:
select {
manualStarter()
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
}
Manuel başlatıcıyı izleyen tüm condition
düğümlerinin değerlendirileceğini ve condition
ifadesine bağlı olarak otomasyonun yürütülmesini engelleyebileceğini unutmayın.
Otomasyonunuzu, condition
düğümlerinin manuel başlatıcıyla etkinleştirilen bir otomasyonu engellememesi için yapılandırmanın bir yolu, diğer başlatıcıyı condition
ile birlikte ayrı bir sıralı akışa yerleştirmektir:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
select {
sequential {
starter(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
Bir özelliğin değerine referans verme
Bir ifadede bir özelliğin değerini kullanmak için aşağıdaki söz dizimini kullanın.
stateReader
ile:
typealias TimeTrait = Google.TimeTrait
let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime
starter
ile:
typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait
let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
Koşul düğümleri ve ifadeleri
Koşul düğümü, otomasyonun devam edip etmeyeceğinin belirlendiği bir karar noktasını temsil eder. Bir otomasyonda birden fazla condition
düğümü olabilir.
Herhangi bir condition
düğümünün ifadesi false
olarak değerlendirilirse tüm otomasyonun yürütülmesi sona erer.
Bir condition
düğümünde, ifade tek bir Boole değeri olarak değerlendirildiği sürece çeşitli operatörleri kullanarak birden fazla koşul ölçütünü birleştirebilirsiniz. Elde edilen değer true
ise koşul karşılanır ve otomasyon, sonraki düğümün yürütülmesine devam eder. Değer false
ise otomasyon o noktada yürütülmeyi durdurur.
İfadeler, Swift'teki ifadelere benzer şekilde oluşturulur ve sayı, karakter, dize ve boole gibi ilkel değerlerin yanı sıra Enum değerleri içerebilir. Alt ifadeleri parantezle gruplandırmak, değerlendirilme sıralarını kontrol etmenize olanak tanır.
Birden fazla alt ifadeyi tek bir ifadede birleştiren bir condition
örneğini aşağıda bulabilirsiniz:
condition {
let exp1 = starterNode.lockState.equals(.unlocked)
let exp2 = stateReaderNode.lockState.equals(true)
let exp3 = occupancySensingDevice.occupied.notEquals(0)
(exp1.and(exp2)).or(exp3)
}
Başlatıcı aracılığıyla erişilen bir özelliğin değerine referans verebilirsiniz:
typealias OnOffTrait = Matter.OnOffTrait
let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
condition
düğümündeki özellik değerlerine referans vermenin diğer yolu, stateReader
düğümüdür.
Bunu yapmak için önce özellik özelliği değerini bir stateReader
düğümünde yakalayın. stateReader
, structure
ve özelliği bağımsız değişken olarak alır:
typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait
let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)
Ardından, condition
düğümünde stateReader
'e referans verin:
condition {
filterMonitoringState.changeIndication.equals(.warning)
}
Karşılaştırma ve mantıksal operatörler kullanılarak bir condition
düğümünde birden fazla stateReaders
kullanılabilir:
typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait
let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
let exp1 = armState.armState
let exp2 = doorLockState.lockState
exp1.and(exp2)
}
Koşul süresi
Bir koşuldaki boole ifadesine ek olarak, otomasyonun çalıştırılması için ifadenin doğru olması gereken bir zaman aralığı da belirtebilirsiniz. Örneğin, yalnızca bir ışık on dakika boyunca açıksa etkinleşen bir koşul tanımlayabilirsiniz.
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
Süre bir ila 30 dakika arasında olabilir.
İşlem düğümleri
İşlem düğümü, otomasyonun çalışmasının gerçekleştiği yerdir.
Bu örnekte, işlem AssistantBroadcastTrait
'nin broadcast()
komutunu çağırır:
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}