iOS DSL kılavuzu

Otomasyon oluşturmak için çeşitli Automation DSL düğümlerinin nasıl kullanılabileceğini anlamak üzere aşağıdaki kılavuzdan yararlanın.

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

Ardışık 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 GoogleHomeSDK
import GoogleHomeTypes

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

Bu, ek düğümler ekleyerek hassaslaştırılabilir.

Başlangıç

Başlatıcı düğümleri, bir otomasyonu etkinleştiren ilk koşulları tanımlar. Örneğin, durumda veya değerde bir değişiklik. Bir otomasyonda en az bir başlatıcı 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ü kullanmanız gerekir.

Özellik özelliğine dayalı başlatıcı

Bir özellik özelliğine dayalı bir başlatıcı düğümü tanımlarken ş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 cihazda hangi cihaz türünü adresleyeceğini belirtmenize olanak tanıdığı için gereklidir. Örneğin, bir cihaz FanDeviceType ve HeatingCoolingUnitDeviceType'ten oluşabilir. Her ikisi de OnOffTrait özelliğini içerir. Cihaz türünü belirterek otomasyonun cihazın hangi kısmını tetiklediği konusunda belirsizlik kalmaz.

Etkinliğe dayalı başlatıcı

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

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

Parametreler içeren, bir yapıya ve etkinliğe dayalı başlatıcı

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

Örneğin, bu başlatıcı otomasyonu 07:00'de etkinleştirmek için TimeTrait'nin ScheduledEvent özelliğini kullanır:

typealias TimeTrait = Google.TimeTrait

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

Manuel marş

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

  • Özellik veya cihaz türü belirtmeyin.
  • Automation.execute() çağrısı yapan 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 ifadeden ayırma

Otomasyonunuzu, condition düğümlerinin manuel başlatıcıyla etkinleştirilen bir otomasyonu engellememesi için 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 ifadede bir özelliğin 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ğinin belirlendiği 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 tüm otomasyonun 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örleri 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ı, karakter, dize ve boole gibi ilkel değerlerin yanı sıra Enum değerleri içerebilir. Alt ifadeleri parantezle gruplandırmak, değerlendirilme sıralarını kontrol etmenize olanak tanır.

Birden fazla alt ifadeyi tek bir ifadede birleştiren bir condition örneğini aşağıda bulabilirsiniz:

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

condition düğümündeki özellik değerlerine referans vermenin 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. stateReader, 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'e 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ığı da belirtebilirsiniz. Örneğin, yalnızca bir ışık on dakika boyunca açıksa etkinleşen bir koşul tanımlayabilirsiniz.

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

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

İşlem düğümleri

İşlem düğümü, otomasyonun çalışmasının gerçekleştiği yerdir. Bu örnekte, işlem AssistantBroadcastTrait'nin broadcast() komutunu çağırır:

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