複雜自動化動作的 iOS DSL 指南

自動化 DSL 可用於建立比 DSL 指南 - iOS 上的自動化動作中所述的自動化動作更複雜的自動化動作。

包含多個動作的順序

包含多個動作的順序

自動化動作可以執行多項操作。舉例來說,您可以使用多個 action 節點取代單一 action 節點,並依序執行:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

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

}

依序執行多個並行動作

依序執行多個並行動作

如果在 parallel 節點中放置多個 action 節點,動作會同時執行。

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

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

}

如果 sequential 節點中的 action 節點位於 parallel 節點之後,則會等待執行,直到 parallel 節點中的所有節點都已執行完畢。

延遲入帳

您可以使用 delay(for:) 方法,在自動化動作中加入暫停功能,該方法會使用 Duration 引數,代表在繼續執行前要暫停多久。暫停時間最短可為 5 秒,最長可達 24 小時。

例如,如果想在每次切換燈具時間隔五秒,並切換四次燈具,請執行下列操作:

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() }
}

觸發抑制

觸發事件抑制功能可讓自動化動作在初始觸發事件發生後,在指定時間內忽略 starter。舉例來說,如果自動化動作包含由動作偵測觸發的 starter,且您指定的觸發抑制時間為五分鐘,那麼 starter 觸發後,在接下來的五分鐘內就不會再次觸發。這可避免自動化動作不斷重複觸發。

如要將觸發事件抑制功能套用至自動化動作,請使用 suppress(for:) 關鍵字,並搭配 Duration 引數,代表在回應後續觸發事件前,要等待多久。停用時間最短可設為 5 秒,最長則可設為 24 小時。

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() }
}

請注意,觸發事件抑制會影響 Suppression 之前自動化動作中的所有 starters

在動作中設定特徵屬性

如要設定特徵屬性的值,請按照下列步驟操作:

  1. action 節點中建立 update 節點,並將相關特徵納入 update 節點的引數:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. update 節點中,針對每個要修改的屬性,使用修飾符函式,並傳遞新值。如何命名變化函式:
    1. 將屬性名稱改為大寫
    2. 在開頭加上 set 字串。
    舉例來說,如要更新名為 defaultMoveRate 的屬性,您可以使用名為 setDefaultMoveRate 的修飾函式。

請注意,update 節點可以有多個修飾符函式。以下是更新兩個屬性的範例:

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

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