Android DSL kavramları

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

Otomasyon bileşenleri

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

  1. Başlatıcı: Otomasyonu etkinleştiren başlangıç koşullarını (ör. bir özellikte değişiklik) tanımlar. Otomasyonların başlatıcısı olmalıdır.
  2. Koşul: Bir otomasyon etkinleştirildikten sonra değerlendirilecek ek kısıtlamalar. Bir otomasyonun işlemlerinin devam edebilmesi için koşuldaki 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 bir odadaki TV açıldığında o odadaki ışıkları kısan bir otomasyonunuz olabilir. Bu örnekte:

  1. Başlatıcı: TV açıldı. Bu, TV özelliğinde bir durum değişikliğidir.
  2. Koşul: TV'nin bulunduğu evin geçerli saati değerlendirilir.
  3. İşlem: TV ile aynı odadaki ışıklar kısılır.

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

Home API'lerindeki otomasyonlar, temel yapının yanı sıra geliştiriciler ve kullanıcılar için tanımlamak amacıyla kullanılabilecek name ve description gibi meta veriler de içerir.

Düğümler

Home API'lerinde bir 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, yeniden kullanılabilir birimlerdir. Her düğümün giriş değişkenleri ve diğer düğümler tarafından kullanılabilecek çıkış değişkenleri olabilir.

Tablo: Otomasyon düğümü türleri
Düğüm Düğüm Türü Kotlin uygulaması Açıklama
Starter Davranışsal StarterNodeDsl Bir özelliğin durumu (herhangi bir özellik) değiştiğinde otomasyonu başlatır.
StateReader Davranışsal StateReaderNodeDsl Bir özellik niteliğini okur ve değerini koşul düğümlerinde kullanmak ü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.
Paralel 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 Mantıksal ifadelerin değerlendirmelerine göre yürütme akışını koşullu olarak değiştirme Koşullar bir başlatıcıyla ilişkilendirilebilir (başlatıcıya özel koşullar) veya genel olabilir (tüm başlatıcılar için geçerli).
Seçin Yürütme akışı SelectFlow Bir otomasyonu birden fazla başlatıcının etkinleştirmesine olanak tanır.
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).
İfade Değer Expression Bir özelliğin niteliğinin değeri, sabit veya değişmez değer olabilir ve bir liste, sayı, boole ya da dize olarak değerlendirilmelidir.

Davranışsal düğümler

Başlatıcılar ve işlemler gibi düğümler davranışsal düğümlerdir. Başlatıcılar, cihaz özelliklerindeki değişikliklere göre otomasyonu etkinleştirir. İşlemler, cihaz komutları verir veya özellikleri günceller.

Davranış düğümleri genellikle cihaz özelliklerine bağlıdır ve diğer düğümlerde giriş olarak kullanılmak üzere özellik durumunu verir.

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ı olarak yürütülen düğümler içerebilir. Bunlar genellikle başlatıcı, koşul ve işlemdir.

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

Paralel akışta, aynı anda birden fazla ışığı açmak gibi birden fazla işlem düğümü aynı anda yürütülebilir. Paralel akışı takip eden 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ü de koşul akışıdır. Bu akış, bir ifadenin değerlendirmesine göre yürütme akışını değiştirebilir.

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

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

Seçim akışı, otomasyonunuzu etkinleştirebilecek birden fazla başlatıcınız olmasını istediğinizde 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 bir eşiği aştığında jaluzileri indiren bir otomasyon yazabilirsiniz. Bu senaryoların her biri için üç ayrı başlatıcı kullanılır ve üçü de bir select akışına sarmalanır.

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

Eğer-ise-değilse akışı (IfFlow), otomasyon içinde dallara ayrılan koşullu yürütmeye olanak tanır. Koşul false olduğunda tüm otomasyonu durduran condition düğümünün aksine, if-then-else akışı bir 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ı makaleyi inceleyin.

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

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

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

DSL düğümleri, aşağıdaki tabloda belirtilen kısıtlamalara göre özel ihtiyaçlarınızı karşılamak için çeşitli şekillerde iç içe yerleştirilebilir ve birleştirilebilir. Builder sütunu, her düğüm türünde kullanılmasına izin verilenleri ayrıntılı olarak açıklayan Kotlin typesafe builder 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
Starter İfade Seç, Sıralı
ManualStarter Seç, Sıralı
StateReader İfade (genellikle bir özellik değeri içerir) IfFlow, Paralel, Sıralı
İşlem Komut, Varlık, İfade IfFlow, Parallel, Select, Sequential
Sıralı IfFlow, Parallel, Select, Sequential
Paralel İşlem IfFlow, Sıralı
Durum İfade IfFlow, Paralel, Sıralı
Seçin Condition, Sequential, Starter, ManualStarter Sıralı ve akıştaki ilk düğüm olmalıdır.
IfFlow İşlem, Koşul, Gecikme, IfFlow, Paralel, Sıralı, StateReader, Gizleme Sıralı

Otomasyon DSL'si

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

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

Otomasyon DSL'si, otomasyon oluşturma sürecini basitleştirir ve kolaylaştırır. Cihaz API'sinde yer alan Matter standart özellik ve smart home özellikten oluşan aynı veri modelini yerel olarak kullanır.

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

DSL söz dizimi Kotlin'inkine benzer ve aynı şekilde tip güvenliğine sahiptir ancak Automation DSL'de yazılan bir otomasyon, saf Kotlin'de yazılan aynı otomasyondan daha basit ve daha kısadır.

Örnek

Aşağıda, Automation DSL kullanılarak yazılmış, 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 basit: device1 adlı ışık açıldığında (onOff özelliği true olarak değişir) device2 adlı ışığı açmak için on() komutunu gönderir.

Otomasyon, düğümlerinin sıralı olarak çalışacağını gösteren bir sequential düğümü kullanı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.