Çeşitli otomasyon DSL düğümlerinin nasıl kullanılarak otomasyon oluşturulabileceğini anlamak için 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 dili bağlamı ile yerleştirilmiş DSL bağlamı arasındaki sınırı oluşturur.
Sıralı akış
Sıralı akış, varsayılan otomasyon akışı türüdür.
Başlatıcı, koşul ve işlemden oluşan sıralı bir akış kullanan çok basit bir Automation DSL şablonu aşağıda verilmiştir:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
Bu, ek düğümler eklenerek daha iyi hale getirilebilir.
Başlangıç
Başlangıç düğümleri, otomasyonu etkinleştiren ilk koşulları tanımlar. Örneğin, durum veya değer değişikliği. Otomasyonun en az bir başlatıcısı 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ünü kullanmanız gerekir.
Özellik özelliğine dayalı başlangıç
Bir özellik özelliğine dayalı başlangıç düğümü bildirirken ş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 cihaz içinde hangi cihaz türüne yönelik olduğunu belirtmenize olanak tanıdığı için gereklidir. Örneğin, bir cihaz FanDeviceType
ve HeatingCoolingUnitDeviceType
öğelerinden oluşabilir. Bu öğelerin her ikisinde de OnOffTrait
özelliği bulunur. Cihaz türü belirtildiğinde, cihazın hangi bölümünün otomasyonu tetiklediği konusunda belirsizlik olmaz.
Etkinliğe dayalı başlangıç
Bir etkinliğe dayalı başlangıç düğümü bildirirken şunları belirtin:
- cihaz
- Özelliğin ait olduğu cihaz türü
- etkinlik
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
Parametrelerle birlikte yapı ve etkinliğe dayalı başlangıç
Bazı etkinliklerde parametreler olabilir. Bu nedenle, bu parametrelerin de başlangıçta yer alması gerekir.
Örneğin, bu başlatıcı, otomasyonu sabah 7:00'de etkinleştirmek için TimeTrait
'nın ScheduledEvent
'ını 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şlangıç ilan ederken:
- Bir özellik veya cihaz türü belirtmeyin.
-
Automation.execute()
işlevini çağıran 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 engellemeyecek şekilde yapılandırmanın bir yolu, diğer başlatıcıyı condition
'sı 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 ifadedeki özellik 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ğini belirleyen 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 otomasyonun tamamının 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örler 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ütmeyi durdurur.
İfadeler, Swift'teki ifadelere benzer şekilde oluşturulur ve sayılar, karakterler, dizeler ve Boole'lar gibi temel değerlerin yanı sıra Enum değerlerini de içerebilir. Alt ifadeleri parantez içinde gruplandırarak değerlendirme sırasını kontrol edebilirsiniz.
Aşağıda, birden fazla alt ifadeyi tek bir ifadede birleştiren condition
örneği verilmiştir:
condition {
let exp1 = starterNode.lockState.equals(.unlocked)
let exp2 = stateReaderNode.lockState.equals(true)
let exp3 = occupancySensingDevice.occupied.notEquals(0)
(exp1.and(exp2)).or(exp3)
}
Bir 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
Bir condition
düğümünde özellik özelliği değerlerine referans vermenin diğer yolu, stateReader
düğümünü kullanmaktır.
Bunu yapmak için önce özellik özelliği değerini bir stateReader
düğümünde yakalayın. stateReader
, bağımsız değişken olarak structure
ve özelliği alır:
typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait
let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)
Ardından, condition
düğümünde stateReader
öğesine referans verin:
condition {
filterMonitoringState.changeIndication.equals(.warning)
}
Karşılaştırma ve mantıksal operatörler kullanıldığında, 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ığı belirtebilirsiniz. Örneğin, yalnızca bir ışık on dakika boyunca açık kalırsa tetiklenen bir koşul tanımlayabilirsiniz.
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
Süre 1 dakika ile 30 dakika arasında olabilir.
İşlem düğümleri
Otomasyonun işinin yapıldığı yer işlem düğümüdür.
Bu örnekte, işlem AssistantBroadcastTrait
'nın broadcast()
komutunu çağırır:
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}