Otomasyon oluşturmak için çeşitli Otomasyon DSL düğümlerinin nasıl kullanılabileceğini anlamak üzere aşağıdaki kılavuzu kullanın.
Tüm otomasyon DSL'si tek bir automation
düğümüne yerleştirilir. automation
düğümü, dış Kotlin 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 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 ekleyerek hassaslaştırılabilir.
Başlangıç
Başlatıcı düğümler, bir otomasyonu etkinleştiren ilk koşulları tanımlar. Örneğin, durumda veya değerde bir değişiklik. Otomasyonlarda 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 seçim düğümü kullanmanız gerekir.
Özellik özelliğine dayalı başlatıcı
Bir özellik özelliğine dayalı bir başlatıcı düğüm açıklarken şunları belirtin:
- cihaz
- Özelliğin ait olduğu cihaz türü
- özellik
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
Cihaz türü parametresi, otomasyonun bir cihazdaki hangi cihaz türünü adresleyeceğini belirtmenize olanak tanıdığı için gereklidir. Örneğin, bir cihaz FanDevice
ve HeatingCoolingUnitDevice
'ten oluşabilir. Bu iki öğe de OnOff
ö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, GoogleDoorbellDevice, DoorbellPressed)
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 Time
özelliğinin ScheduledTimeEvent
değerini kullanır:
val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(
LocalTime.of(7, 0, 0, 0)))
}
Manuel başlatıcı
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, 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 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:
automation_graph {
sequential {
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:
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ğinden karar veren bir karar noktasını temsil eder. Bir otomasyonun 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 doğru/yanlış değer 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, Kotlin'deki 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 etmenizi sağlar.
Birden fazla alt ifadeyi tek bir ifadede birleştiren bir condition
örneğini aşağıda bulabilirsiniz:
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)
}
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
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:
import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)
Ardından condition
düğümünde stateReader
'e referans verin:
condition() {
expression =
filterMonitoringState.changeIndication
.equals(ChangeIndicationEnum.Warning)
}
Karşılaştırma ve mantık operatörleri kullanılarak 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ığı da belirtebilirsiniz. Örneğin, yalnızca bir ışık on dakika boyunca açıksa etkinleşen bir koşul tanımlayabilirsiniz.
condition {
expression(lightStateReader.onOff == true)
forDuration(Duration.ofMinutes(10))
}
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, 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 öğelerinin kodunuza nasıl aktarılacağı her zaman açık değildir.
Ö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ı "-Özellik" 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