iOS DSL kılavuzu

Çeşitli otomasyon DSL düğümlerinin nasıl kullanılarak otomasyon oluşturulabileceğini anlamak için aşağıdaki kılavuzdan yararlanın.

Tüm otomasyon DSL'si tek bir automation düğümüne yerleştirilir. automation düğümü, dıştaki Swift dil bağlamı ile yerleştirilmiş 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

Başlatıcı, koşul ve işlemden oluşan sıralı bir akış kullanan çok basit bir Otomasyon DSL şablonu aşağıda verilmiştir:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {
  starter(...)
  condition {...}
  action {...}
}

Bu, ek düğümler eklenerek daha iyi hale getirilebilir.

Başlangıç

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

Bir özellik özelliğine dayalı başlangıç düğümü bildirirken şunları belirtin:

  • cihaz
  • özelliğin ait olduğu cihaz türü
  • özellik
starter(
  thermostat,
  Matter.TemperatureSensorDeviceType.self,
  Matter.TemperatureMeasurementTrait.self
)

Cihaz türü parametresi, otomasyonun bir cihazdaki hangi cihaz türüne yönelik olduğunu belirtmenize olanak tanıdığı için gereklidir. Örneğin, bir cihaz hem FanDeviceType hem de HeatingCoolingUnitDeviceType içerebilir. Her ikisi de OnOffTrait özelliğini içerir. Cihaz türü belirtildiğinde, cihazın hangi bölümünün otomasyonu tetiklediği konusunda belirsizlik olmaz.

Etkinliğe dayalı başlatıcı

Bir etkinliğe dayalı başlangıç düğümü bildirirken şunları belirtin:

  • cihaz
  • Özelliğin ait olduğu cihaz türü
  • etkinlik
starter(
  doorbell,
  Google.GoogleDoorbellDeviceType.self,
  Google.DoorbellPressTrait.DoorbellPressedEvent
)

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

Bazı etkinliklerde parametreler olabilir. Bu nedenle, bu parametrelerin de başlangıçta yer alması gerekir.

Örneğin, bu başlatıcı, otomasyonu sabah 7:00'de etkinleştirmek için TimeTrait'nın ScheduledEvent kullanır:

typealias TimeTrait = Google.TimeTrait

let earlyMorning = starter(
  structure,
  TimeTrait.ScheduledEvent.self
) {
  TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}

Hava durumuna dayalı başlatıcı

Başlangıçta, hava durumu özelliğini kullanarak mevcut veya tahmin edilen hava koşullarını belirtebilirsiniz:

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

Otomatikleştirme örnekleri sayfasındaki Yağmur yağma ihtimali varsa jaluzileri kapat bölümüne bakın.

Manuel marş motoru

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ı bildirirken:

  • Özellik veya cihaz türü belirtmeyin.
  • Automation.execute() işlevini çağıran 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,
    Matter.TemperatureSensorDeviceType.self,
    Matter.TemperatureMeasurementTrait.self
  )
}

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

Otomasyonunuzu, condition düğümlerinin manuel başlatıcıyla etkinleştirilen bir otomasyonu engellemeyecek şekilde yapılandırmanın bir yolu, diğer başlatıcıyı condition ile birlikte ayrı bir sıralı akışa yerleştirmektir:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  select {
    sequential {
      starter(...)
      condition {...}
    }
    sequential {
      manualStarter()
    }
  }
  action {...}

}

Bir özelliğin değerine referans verme

Bir ifadedeki özellik değerini kullanmak için aşağıdaki söz dizimini kullanın.

stateReader ile:

typealias TimeTrait = Google.TimeTrait

let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime

starter ile:

typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait

let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
  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.

Bir condition düğümünde, ifade tek bir Boole değeri olarak değerlendirildiği sürece çeşitli operatörler 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, Swift'teki ifadelere benzer şekilde oluşturulur ve sayılar, karakterler, dizeler ve boole'lar gibi temel değerlerin yanı sıra Enum değerlerini de içerebilir. Alt ifadeleri parantezlerle gruplandırarak değerlendirildikleri sırayı kontrol edebilirsiniz.

Aşağıda, birden fazla alt ifadeyi tek bir ifadede birleştiren condition örneği verilmiştir:

condition {
  let exp1 = starterNode.lockState.equals(.unlocked)
  let exp2 = stateReaderNode.lockState.equals(true)
  let exp3 = occupancySensingDevice.occupied.notEquals(0)
  (exp1.and(exp2)).or(exp3)
}

Başlatıcı aracılığıyla erişilen bir özelliğin değerine referans verebilirsiniz:

typealias OnOffTrait = Matter.OnOffTrait

let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
  starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }

stateReader

Bir condition düğümündeki özellik özelliği değerlerine başvurmanın 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. Bir stateReader işlevi, structure ve özelliği bağımsız değişken olarak alır:

typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait

let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)

Ardından, condition düğümünde stateReader öğesine referans verin:

condition {
filterMonitoringState.changeIndication.equals(.warning)
}

Karşılaştırma ve mantıksal operatörler kullanılarak bir condition düğümünde birden fazla stateReaders kullanılabilir:

typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait

let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
  let exp1 = armState.armState
  let exp2 = doorLockState.lockState
  exp1.and(exp2)
}

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ığı belirtebilirsiniz. Örneğin, yalnızca bir ışık on dakika boyunca açık kalırsa tetiklenen bir koşul tanımlayabilirsiniz.

condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}

Süre 1 ila 30 dakika arasında olabilir.

İşlem düğümleri

Otomasyonun çalışması işlem düğümünde gerçekleşir. Bu örnekte, işlem AssistantBroadcastTrait'nın broadcast() komutunu çağırır:

action(speaker, SpeakerDeviceType.self) {
  Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}