Karmaşık otomasyonlar için iOS DSL kılavuzu

Otomasyon DSL'si, DSL rehberi - iOS'teki temel otomasyonlar bölümünde açıklananlardan daha karmaşık otomasyonlar oluşturmak için kullanılabilir.

Birden fazla işlemle sıralı

Birden fazla işlemle sıralı

Otomasyonlar birden fazla işlem yapabilir. Örneğin, tek bir action düğümü yerine sıralı olarak çalışan birden fazla action düğümünüz olabilir:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

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

}

Birden fazla paralel işlemle sıralı

Birden fazla paralel işlemle sıralı

Bir parallel düğümüne birden fazla action düğümü yerleştirirseniz işlemler eşzamanlı olarak yürütülür.

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

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

}

sequential düğümünde parallel düğümünden sonra gelen action düğümleri varsa parallel düğümünün içindeki tüm düğümler yürütülene kadar yürütülmeyi beklerler.

Gecikmeler

Yürütmeye devam etmeden önce ne kadar süre duraklatılacağını temsil eden bir Duration bağımsız değişkeni alan delay(for:) yöntemini kullanarak otomasyonlarınızda duraklamalar uygulayabilirsiniz. Duraklatma süresi beş saniye ile 24 saat arasında olabilir.

Örneğin, bir ışığı her açma/kapatma arasında beş saniyelik bir duraksama olacak şekilde dört kez açmak için:

typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait

sequential {
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}

Tetikleyici engelleme

Tetikleyici engelleme, otomasyonunuzun ilk tetikleyici olaydan sonra belirli bir süre boyunca bir starter öğesini yoksaymasına olanak tanıyan bir özelliktir. Örneğin, otomasyonda hareket algılamayla tetiklenen bir starter varsa ve beş dakikalık bir tetikleyici engelleme süresi belirtirseniz starter tetiklendiğinde sonraki beş dakika boyunca tekrar tetiklenmez. Bu, otomasyonun tekrar tekrar hızlı bir şekilde tetiklenmesini önler.

Tetikleyicileri otomasyonunuzdan kaldırmak için suppress(for:) anahtar kelimesini, sonraki tetikleyicilere yanıt vermeden önce ne kadar bekleyeceğinizi belirten bir Duration bağımsız değişkeniyle kullanın. Engelleme süresi beş saniye ile 24 saat arasında olabilir.

typealias OccupancySensorDevice = Matter.OccupancySensorDeviceType
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias MotionDetectionTrait = Google.MotionDetectionTrait
typealias OnOffTrait = Matter.OnOffTrait

automation {
  let starterNode = starter(device, OccupancySensorDevice.self, MotionDetectionTrait.self)
  starterNode
  suppress(for: .seconds(30 * 60)  // 30 minutes
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}

Tetikleyicinin devre dışı bırakılmasının, Suppression'ten önce gelen bir otomasyondaki tüm starters'leri etkilediğini unutmayın.

Bir işlemde özellik özelliklerini ayarlama

Bir özellik özelliğinin değerini ayarlamak için:

  1. Bir action düğümü içinde update düğümü oluşturun. İlgili özelliği update düğümüne parametre olarak ekleyin:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. Değiştirilecek her özellik için update düğümünde bir değiştirici işlevi kullanın ve bu işleve yeni değeri iletin. Değiştirici işlevinin adını oluşturmak için:
    1. Özelliğin adını büyük harflerle yazma
    2. Başına set kelimesini ekleyin.
    Örneğin, defaultMoveRate adlı bir özelliği güncellemek için setDefaultMoveRate adlı bir değiştirici işlevi kullanırsınız.

Bir update düğümünün birden fazla değiştirici işlevi olabileceğini unutmayın. İki özelliğin güncellendiği bir örnek aşağıda verilmiştir:

typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait

action(fan, FanDeviceType.self) {
  update(FanControlTrait.self) {
    $0.setFanMode(.on)
  }
}