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

自動化 DSL 可用於建立比這份指南討論的自動化動作更複雜的自動化動作。

依序執行多項動作

依序執行多項動作

自動化動作可以執行多項操作。舉例來說,您可以有多個 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)
  }
}