Android DSL kavramları

Bu makalede, Android'deki Automation DSL'nin temel kavramlarına genel bir bakış sunulmaktadır.

Otomasyon bileşenleri

Otomasyonlar, genellikle bu sırayla değerlendirilen aşağıdaki temel bileşenlerden oluşur:

  1. Başlatıcı: Otomasyonu etkinleştiren ilk koşulları (ör. bir özellikteki değişiklik) tanımlar. Otomasyonun bir başlatıcısı olmalıdır.
  2. Koşul: Otomasyon etkinleştirildikten sonra değerlendirilecek ek kısıtlamalar. Otomasyon işlemlerinin devam etmesi için bir Koşul'daki ifadenin true olarak değerlendirilmesi gerekir.
  3. İşlem: Tüm koşullar karşılandığında gerçekleştirilen komutlar veya durum güncellemeleri.

Örneğin, gün batımı ile gün doğumu arasında odadaki TV açıldığında odanın ışıklarını kısan bir otomasyonunuz olabilir. Bu örnekte:

  1. Başlatma: TV'nin açılması, TV özelliğinde durum değişikliği olarak kabul edilir.
  2. Koşul: TV'nin bulunduğu evin geçerli saati değerlendirilir.
  3. İşlem: TV ile aynı odadaki ışıklar karartılıyor.

Otomasyon, odadaki TV açıldığında etkinleştirilir ancak yalnızca "gün batımı ile gün doğumu arasında" koşulu karşılandığında yürütülür.

Temel yapıya ek olarak, Home API'lerindeki otomasyonlar, geliştiriciler ve kullanıcılar tarafından tanımlanmak için kullanılabilecek ad ve açıklama gibi meta veriler de içerir.

Düğümler

Home API'lerinde, otomasyonun mantıksal yapısı düğümlerden oluşur. Düğümler, varlık davranışlarını veya yürütme akışlarını temsil eden soyut ve yeniden kullanılabilir birimlerdir. Her düğümde giriş değişkenlerinin yanı sıra diğer düğümler tarafından kullanılabilen çıkış değişkenleri olabilir.

Tablo: Otomasyon düğümü türleri
Düğüm Düğüm Türü Kotlin uygulaması Açıklama
Başlangıç Davranışsal StarterNodeDsl Bir özelliğin durumu (herhangi bir özellik) değiştiğinde otomasyon başlatır.
StateReader Davranışsal StateReaderNodeDsl Bir özellik özelliğini okur ve değerini koşul düğümlerinde kullanılmak üzere yakalamanıza olanak tanır.
İşlem Davranışsal ActionNodeDsl Özellik komutlarını çağırır.
Sıralı Yürütme akışı SequentialFlow İç içe yerleştirilmiş işlem düğümlerini sırayla yürütür. Bu, varsayılan yürütme davranışıdır.
Parallel Yürütme akışı ParallelFlow İç içe yerleştirilmiş işlem düğümlerini paralel olarak yürütür.
Durum Yürütme akışı ConditionNodeDsl Yürütme akışını, mantıksal ifadelerin değerlendirmelerine göre koşullu olarak değiştirin. Koşullar, bir başlatıcıyla (başlatıcıya özel koşullar) ilişkilendirilebilir veya genel olabilir (tüm başlatıcılar için geçerlidir).
Seçin Yürütme akışı SelectFlow Birden fazla başlatıcının otomasyonu etkinleştirmesine izin verir.
IfFlow Yürütme akışı IfFlowDsl Hangi koşulun (varsa) doğru olarak değerlendirildiğine bağlı olarak en fazla bir işlem (veya dal) çalıştırır (if-then-else ifadesine benzer).
Expression Değer Expression Bir özelliğin özelliğinin değeri, bir sabit veya değişmez değer olabilir ve liste, sayı, Boole veya dize olarak değerlendirilmelidir.

Davranış düğümleri

Başlatıcılar ve işlemler gibi düğümler, davranış düğümleridir. Başlatıcılar, cihaz özelliği değişikliklerine göre bir otomasyonu etkinleştirir. İşlemler, cihaz komutları gönderir veya özellikleri günceller.

Davranış düğümleri genellikle cihaz özelliklerine ve diğer düğümlerde giriş olarak kullanılmak üzere çıkış özelliği durumuna bağlıdır.

Yürütme akışı düğümleri

Bazı düğümler, sıralı ve paralel gibi yürütme akışlarını temsil eder. Bu düğümlerin her biri, otomasyonu tanımlayan davranış düğümlerini içerir.

Örneğin, sıralı bir akış, sıralı düzende yürütülen düğümler içerebilir. Bunlar genellikle başlangıç, koşul ve işlem olur.

Sıralı yürütme akışları
Şekil 1: Sıralı otomasyon akışı

Paralel akışta, aynı anda birden fazla işlem düğümü yürütülebilir. Örneğin, aynı anda birden fazla ışık açılabilir. Paralel akışı izleyen düğümler, paralel akışın tüm dalları tamamlanana kadar yürütülmez.

Paralel yürütme akışları
Şekil 2: Paralel otomasyon akışı

Başka bir yürütme akışı türü olan koşul akışı, bir ifadenin değerlendirilmesine bağlı olarak yürütme akışını değiştirebilir.

Örneğin, gece olup olmamasına göre bir işlem gerçekleştiren bir otomasyonunuz olabilir. Koşul düğümü, günün saatini kontrol eder ve ardından bu değerlendirmeye göre uygun yürütme yolunu izler.

Koşul akışı
Şekil 3: Koşul akışı

Otomasyonunuzu etkinleştirebilecek birden fazla başlatıcıya sahip olmak istediğinizde seçme akışı kullanışlıdır. İki veya daha fazla başlatıcıyı select akışına eklediğinizde başlatıcılardan herhangi biri otomasyonu etkinleştirebilir.

Örneğin, gün batımında, sıcaklık belirli bir eşiğin üzerine çıktığında veya parlaklık belirli bir eşiği aştığında panjurları indiren bir otomasyon yazabilirsiniz. Bu senaryoların her biri üç ayrı başlangıçla ele alınır ve üçü de select akışına dahil edilir.

Akış seçin
Şekil 4: Akış seçme

Bir if-then-else akışı (IfFlow), otomasyon içinde koşullu yürütmenin dallanmasına olanak tanır. Koşul false ise otomasyonun tamamını durduran bir condition düğümünün aksine, bir if-then-else akışı, koşul doğru olduğunda belirli işlemleri koşullu olarak yürütür ve alternatif koşullara veya yedek işlemlere geri dönebilir ya da otomasyondaki sonraki düğümlere devam edebilir. Daha fazla bilgi için Koşullu yürütme başlıklı makaleye bakın.

İç içe yerleştirilmiş akışlar

Karmaşık otomasyonlarda yürütme akışı düğümleri de iç içe yerleştirilebilir. Örneğin, paralel akışı yürüten sıralı bir akışınız olabilir.

İç içe yerleştirilmiş yürütme akışları
Şekil 5: İç içe yürütme akışları

DSL düğümleri, aşağıdaki tabloda belirtilen kısıtlamalara göre belirli ihtiyaçlarınızı karşılamak için iç içe yerleştirilebilir ve çeşitli şekillerde birleştirilebilir. Oluşturucu sütunu, her düğüm türünde neyin kullanılmasına izin verildiğini ayrıntılı olarak açıklayan Kotlin tür güvenli oluşturucu dokümanlarına bağlantı verir.

Tablo: Düğümler nasıl birleştirilebilir?
Düğüm Aşağıdaki düğüm türünü ve verileri içerebilir: Aşağıdaki düğüm türlerinden birinde olmalıdır
Başlangıç İfade Sıralı seçeneğini belirleyin.
ManualStarter Sıralı seçeneğini belirleyin.
StateReader İfade (genellikle bir özellik özelliği değerinden oluşur) IfFlow, Parallel, Sequential
İşlem Komut, Varlık, İfade IfFlow, Parallel, Select, Sequential
Sıralı IfFlow, Parallel, Select, Sequential
Parallel İşlem IfFlow, Sıralı
Durum İfade IfFlow, Parallel, Sequential
Seçin Condition, Sequential, Starter, ManualStarter Sıralı olmalı ve akıştaki ilk düğüm olmalıdır.
IfFlow Action, Condition, Delay, IfFlow, Parallel, Sequential, StateReader, Suppression Sıralı

Otomasyon DSL'si

Ev API'lerinde otomasyonlar, Automation DSL (alana özgü dil) kullanılarak tanımlanır. Automation DSL, Kotlin DSL (alana özgü dil) olarak uygulanır, Kotlin tür güvenli oluşturucularını kullanır ve özellikle otomasyon şablonlarını tanımlamak için tasarlanmıştır.

Bir otomasyon derlendiğinde, Kotlin tür güvenli oluşturucular Kotlin veri sınıfları oluşturur. Bu sınıflar daha sonra protokol arabelleği JSON'a serileştirilir. Bu JSON, Google'ın Otomasyon Hizmetleri'ne çağrı yapmak için kullanılır.

Otomasyon DSL'si, otomasyon oluşturma sürecini basitleştirir ve kolaylaştırır. Cihaz API'sinde yer alan Matter standart özellikler ve smart home özelliklerin veri modelini doğal olarak kullanır.

Otomasyon DSL'si, bir kullanıcının evinde bulunan belirli cihaz örneklerinin aksine, otomasyonun mantığını soyut cihaz türleri açısından da tanımlar. Bu, geliştiricinin gerçek cihaz örneklerini ve diğer önemli parametre değerlerini belirtmek için çalışma zamanında kullanılabilecek giriş parametreleri sağlamasına olanak tanır.

DSL söz dizimi Kotlin'inkine benzer ve aynı derecede tür güvenlidir. Ancak Automation DSL'de yazılan bir otomasyon, aynı otomasyonun saf Kotlin'de yazılmasına kıyasla daha basit ve kısadır.

Örnek

Aşağıda, Automation DSL kullanılarak yazılmış ve bir cihazı açan örnek bir otomasyon verilmiştir:

val automation = automation {
  name = "MyFirstAutomation"
  description = "If light1 is on, turn on light2."
  isActive = true
  sequential {
    val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
    condition() { expression = onOffTrait.onOff equals true }
    action(device2, OnOffLightDevice) { command(OnOff.on()) }
  }
}

Bu otomasyon çok basittir: device1 (bir ışık) açıldığında (onOff özelliği true olarak değiştiğinde) device2 cihazını açmak için on() komutunu gönderir.

Otomasyonda, düğümlerinin sırayla çalışacağını belirten bir sequential düğümü kullanılır.

sequential düğümünde starter, condition ve action gibi davranış düğümleri bulunur. starter düğümünün çıkışı, condition düğümünde kullanılmak üzere bir değişkene atanır.