Ç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ış Kotlin 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 com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.sequential
import com.google.home.automation.starter
...
automation {
sequential {
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, TemperatureSensorDevice, TemperatureMeasurement)
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 FanDevice
ve HeatingCoolingUnitDevice
öğelerinden oluşabilir. Bu öğelerin her ikisinde de OnOff
ö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, GoogleDoorbellDevice, DoorbellPressed)
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 saat 7:00'de etkinleştirmek için Time
özelliğinin ScheduledTimeEvent
özelliğini kullanır:
val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(
LocalTime.of(7, 0, 0, 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, TemperatureSensorDevice, TemperatureMeasurement)
}
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:
automation_graph {
sequential {
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:
val time = stateReader<_>(structure, Structure, Time)
val currTime = time.currentTime
starter
ile:
val starterNode = starter<_>(device1, LaundryWasherDevice, OnOff)
condition() {
expression = 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. Sonuç değeri true
ise koşul karşılanır ve otomasyon, sonraki düğümün yürütülmesine devam eder. Bu değer false
ise otomasyon bu noktada yürütmeyi durdurur.
İfadeler, Kotlin'deki 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() {
val expr1 = starterNode.lockState equals DlLockState.Unlocked
val expr2 = stateReaderNode.lockState equals true
val expr3 = occupancySensingDevice.occupied notEquals 0
val expr4 = timeStateReaderNode
.currentTime
.between(
timeStateReaderNode.sunsetTime,
timeStateReaderNode.sunriseTime)
expression = (expr1 and expr2) or (expr3 and expr4)
}
Bir başlatıcı aracılığıyla erişilen bir özelliğin değerine referans verebilirsiniz:
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:
import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)
Ardından, condition
düğümünde stateReader
öğesine referans verin:
condition() {
expression =
filterMonitoringState.changeIndication
.equals(ChangeIndicationEnum.Warning)
}
Karşılaştırma ve mantıksal operatörler kullanılarak bir condition
düğümünde birden fazla stateReaders
kullanılabilir:
val armState = stateReader<_>(doorLock, DoorLockDevice, ArmDisarm )
val doorLockState = stateReader<_>(doorLock, DoorLockDevice, DoorLock)
condition() {
expression =
(armState.armState equals true)
and
(doorLockState.lockState equals true)
}
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 {
expression(lightStateReader.onOff == true)
forDuration(Duration.ofMinutes(10))
}
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 AssistantBroadcast
özelliğinin
broadcast()
komutunu çağırır:
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
Ekstreleri içe aktarma
Otomasyon geliştirirken Home API'lerinin çeşitli öğelerini kodunuza nasıl aktaracağınız her zaman açık olmayabilir.
Özellik özellikleri, özelliğin Companion
nesnesinden içe aktarılır:
import com.google.home.matter.standard.OnOff.Companion.onOff
Bir özellik tarafından tanımlanan veri yapıları, adı "-Trait" ile biten özellik sınıfından içe aktarılır:
import com.google.home.matter.standard.MediaPlaybackTrait.PlaybackStateEnum
Özellik komutları, özelliğin Companion
nesnesinden içe aktarılır:
import com.google.home.matter.standard.Thermostat.Companion.setTemperatureSetpointHold