DSL kılavuzu - temel otomasyonlar

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.

Sıralı DSL örneği

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.

Manuel başlatıcıyı koşullu ifadeden ayırma

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