Android DSL rehberi

Çeşitli otomasyon DSL düğümlerinin bir otomasyon oluşturmak için nasıl kullanılabileceğini anlamak üzere aşağıdaki kılavuzu kullanın.

Tüm otomasyon DSL'leri tek bir automation düğümüne yerleştirilir. automation düğümü, dış Kotlin dili 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 {...}
  }
}

Ek düğümler ekleyerek bu işlemi daha hassas hale getirebilirsiniz.

Başlangıç

Başlatıcı düğümler, bir 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 niteliğine dayalı başlatıcı

Bir özellik niteliğine dayalı başlatıcı 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 cihazdaki hangi cihaz türünü hedeflediğini belirtmenize olanak tanıdığı için zorunludur. Örneğin, bir cihaz FanDevice ve HeatingCoolingUnitDevice bileşenlerinden oluşabilir. Bu bileşenlerin her ikisi de OnOff özelliğini içerir. Cihaz türünü belirterek otomasyonu cihazın hangi parçasının tetiklediğiyle ilgili belirsizliği ortadan kaldırabilirsiniz.

Etkinliğe dayalı başlatıcı

Bir etkinliğe dayalı başlatıcı düğüm bildirirken şunları belirtin:

  • cihaz
  • özelliğin ait olduğu cihaz türü
  • etkinlik
starter<_>(doorBell, GoogleDoorbellDevice, DoorbellPressed)

Parametrelerle birlikte bir yapıya ve etkinliğe dayalı başlatıcı

Bazı etkinliklerin parametreleri olabilir. Bu nedenle, bu parametrelerin de başlatıcıya dahil edilmesi gerekir.

Örneğin, bu başlatıcı, otomasyonu saat 07: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)))
}

Hava durumuna dayalı başlatıcı

Hava durumu özelliğini kullanarak başlatıcıda mevcut veya tahmini hava koşullarını belirtebilirsiniz:

val weatherState = starter<_>(structure, trait = Weather)

Örnek otomasyonlar sayfasında Yağmur yağma ihtimali varsa panjurları kapat örneğine bakın.

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ı tanımlarken:

  • Özellik veya cihaz türü belirtmeyin.
  • Automation.execute() yöntemini çağıran bir kullanıcı arayüzü öğesi sağlayın.

Manuel başlatıcıyı başka bir başlatıcıyla birlikte select akışına yerleştirdiğinizde manuel başlatıcı, diğer başlatıcıyı geçersiz kılar:

select {
  manualStarter()
  starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
}

Manuel başlatıcıdan sonraki 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 başlatıcıdan ayırma

Otomasyonunuzu, condition düğümlerinin manuel başlatıcıyla etkinleştirilen bir otomasyonu engellemeyeceği şekilde 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 ifadedeki ö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ğ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.

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. Sonuç değeri true ise koşul karşılanır ve otomasyon, sonraki düğümü yürütmeye devam eder. false ise otomasyonun yürütülmesi o noktada durur.

İfadeler, Kotlin'deki ifadelere benzer şekilde oluşturulur ve sayılar, karakterler, dizeler ve boole değerleri gibi temel değerlerin yanı sıra Enum değerleri de içerebilir. Alt ifadeleri parantez içine alarak gruplandırmak, değerlendirilme sırasını kontrol etmenize olanak tanır.

Birden fazla alt ifadeyi tek bir ifadede birleştiren bir condition örneği aşağıda 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)
}

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ünde özellik niteliği değerlerine referans vermenin diğer yolu, stateReader düğümünü kullanmaktır.

Bunu yapmak için önce özellik niteliğ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 öğ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

Koşulda bir boole ifadesinin yanı sıra, 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 kaldığında tetiklenen bir koşul tanımlayabilirsiniz.

  condition {
    expression(lightStateReader.onOff == true)
    forDuration(Duration.ofMinutes(10))
  }

Süre, 5 saniye ile 24 saat arasında değişebilir.

İşlem düğümleri

İşlem düğümü, otomasyonun 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!"))
}

İfadeleri içe aktarma

Otomasyon geliştirirken Home API'lerinin çeşitli öğelerini kodunuza nasıl aktaracağınız her zaman net olmayabilir.

Özellik nitelikleri, özelliğin Companion nesnesinden içe aktarılır:

import com.google.home.matter.standard.OnOff.Companion.onOff

Bir özellikle 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