DSL kavramları

Bu, Otomasyon DSL'sinin temel kavramlarına genel bir bakıştır.

Otomasyon bileşenleri

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

  1. Başlatıcı: Otomasyonu etkinleştiren ilk koşulları (ör. bir özellikte yapılan değişiklik) tanımlar. Otomasyonlarda bir başlatıcı 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 değerini döndürmesi 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 odanın TV'si açıldığında o odadaki ışıkları karartan bir otomasyonunuz olabilir. Bu örnekte:

  1. Başlatıcı: TV açıldı. Bu, TV özelliğinin durumundaki bir değişikliktir.
  2. Durum: TV'nin bulunduğu evin mevcut 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ındaysa" koşulu karşılanırsa yürütülür.

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

Düğümler

Home API'lerinde, bir otomasyonun mantıksal yapısı nodes 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şkenlerinin yanı sıra 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
Başlatıcı Davranışsal StarterNodeDsl Bir özelliğin durumu (herhangi bir özellik) değiştiğinde otomasyon başlatılır.
StateReader Davranışsal StateReaderNodeDsl Bir özellik özelliğini okur ve koşul düğümlerinde kullanmak için değerini 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ştirin. Koşullar bir başlatıcıyla ilişkilendirilebilir (başlatıcıya özgü koşullar) 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 bir otomasyonu etkinleştirmesine izin verir.
İfade Değer Expression Bir özelliğin özelliğinin değeri, sabit veya değişmez değer olabilir ve bir 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 otomasyonu etkinleştirir. İşlemler, cihaz komutları verir veya özellikleri günceller.

Davranış düğümleri, genellikle diğer düğümlerde giriş olarak kullanılmak üzere cihaz özelliklerine ve çı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ı olarak çalışan 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 bir akışta, aynı anda birden fazla işlem düğümü yürütülebilir (ör. aynı anda birden fazla ışığı açma). 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ü de koşul akışı'dır. Bu akış, bir ifadenin değerlendirilmesine göre yürütme akışını değiştirebilir.

Örneğin, gece olup olmadığına bağlı olarak 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çilen akış kullanışlıdır. Bir select akışına iki veya daha fazla başlatıcı eklediğinizde, başlatıcılardan herhangi biri otomasyonu etkinleştirebilir.

Örneğin, güneş battığı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şlatıcı tarafından yönetilir ve üçünün de select akışına dahil edilmesi gerekir.

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

İç 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 belirli ihtiyaçlarınızı karşılamak için çeşitli şekillerde iç içe yerleştirilebilir ve birleştirilebilir. Oluşturucu sütunu, her tür düğümde nelerin 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üğümlerin birleştirilme şekli
Düğüm Derleyici Aşağıdaki düğüm türünü ve verilerini içerebilir Aşağıdaki düğüm türlerinden birinde olmalıdır
Başlatıcı AutomationBuilder İfade Seç, Sıralı
ManualStarter AutomationBuilder Seç, Sıralı
StateReader AutomationBuilder İfade (genellikle bir özellik özelliği değerinden oluşur) İşlem, Koşul
İşlem ActionBuilder Komut, Varlık, İfade Paralel, Seçmeli, Sıralı
Sıralı SequentialFlowBuilder Paralel, Seçmeli, Sıralı
Paralel ParallelFlowBuilder İşlem Sıralı
Durum ConditionBuilder İfade Paralel, Sıralı
Seçin AutomationBuilder Koşul, Sıralı, Başlatıcı, Manuel Başlatıcı Sıralı olmalı ve akıştaki ilk düğüm olmalıdır.

Otomasyon DSL

Home API'lerinde otomasyonlar, Otomasyon DSL'si (Alana Özel Dil) kullanılarak tanımlanır. Otomasyon DSL'si, Kotlin tür güvenliğine sahip oluşturucular 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 tür güvenliğine sahip derleyiciler Kotlin veri sınıfları oluşturur. Bu sınıflar daha sonra Google'ın Otomasyon Hizmetleri'ne ç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 özelliklerin ve smart home özelliklerinin veri modelini doğal 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, 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'e benzer ve tür açısından eşit derecede güvenlidir. Ancak Otomasyon DSL'sinde yazılmış bir otomasyon, saf Kotlin'de yazılmış aynı otomasyondan daha basit ve daha özdü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: Bir ışık olan device1 açıldığında (onOff özelliği true olarak değişir), device2'i açmak için on() komutu gönderilir.

Otomasyon, düğümlerinin sıralı olarak çalışacağını belirten 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.