請參閱以下指南,瞭解如何使用各種 Automation DSL 節點建構自動化動作。
所有自動化 DSL 都會放在單一 automation
節點中。automation
節點會在外部 Kotlin 語言情境和內嵌 DSL 情境之間形成界線。
依序流程
自動化流程的預設類型為順序流程。
以下是相當基本的自動化 DSL 範本,使用由啟動條件、條件和動作組成的順序流程:
import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.sequential
import com.google.home.automation.starter
...
automation {
sequential {
starter<_>(...)
condition {...}
action {...}
}
}
您可以透過新增其他節點來改善這項功能。
Starter
啟動條件節點會定義啟用自動化動作的初始情況。例如狀態或值的變更。自動化動作必須至少包含一個啟動條件,否則驗證會失敗。如要在自動化動作中加入多個啟動條件,您必須使用選取節點。
根據特徵屬性建立的啟動條件
宣告以特徵屬性為基礎的啟動節點時,請指定:
- 裝置
- 特徵所屬的裝置類型
- 特徵
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
裝置類型參數是必要的,因為它可讓您指定自動化動作要處理的裝置內裝置類型。舉例來說,裝置可能由 FanDevice
和 HeatingCoolingUnitDevice
組成,兩者都包含 OnOff
特徵。指定裝置類型後,系統就會明確指出裝置的哪個部分會觸發自動化動作。
以事件為準的啟動條件
宣告以事件為基礎的啟動節點時,請指定:
- 裝置
- 特徵所屬的裝置類型
- 事件
starter<_>(doorBell, GoogleDoorbellDevice, DoorbellPressed)
以結構和事件為基礎的啟動條件,並含有參數
部分事件可能會包含參數,因此這些參數也必須納入啟動條件。
舉例來說,這個啟動條件會使用 Time
特徵的 ScheduledTimeEvent
,在早上 7 點啟用自動化動作:
val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(
LocalTime.of(7, 0, 0, 0)))
}
手動啟動器
手動啟動條件是一種特殊的啟動條件,可讓使用者手動執行自動化動作。
宣告手動啟動條件時:
- 請勿指定特徵或裝置類型。
- 提供會呼叫
Automation.execute()
的 UI 元素。
當您在 select
流程中將手動啟動條件與其他啟動條件並列時,手動啟動條件會覆寫其他啟動條件:
select {
manualStarter()
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
}
請注意,系統會評估手動啟動器後面的所有 condition
節點,並視 condition
運算式而定,可能會阻斷自動化動作的執行。
您可以將其他啟動條件與其 condition
放在單獨的序列式流程中,藉此調整自動化動作的結構,讓 condition
節點不會阻擋透過手動啟動條件啟動的自動化動作:
automation_graph {
sequential {
select {
sequential {
starter<_>(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
}
參照屬性值
如要在運算式中使用屬性值,請使用下列語法。
當中有 stateReader
:
val time = stateReader<_>(structure, Structure, Time)
val currTime = time.currentTime
使用 starter
:
val starterNode = starter<_>(device1, LaundryWasherDevice, OnOff)
condition() {
expression = starterNode.onOff equals true
}
條件節點和運算式
條件節點代表決策點,可決定自動化動作是否要繼續執行。自動化動作可以有多個 condition
節點。如果任何 condition
節點的運算式評估為 false
,整個自動化動作的執行作業就會結束。
在 condition
節點中,您可以使用各種運算子結合多個條件準則,只要運算式評估為單一布林值即可。如果結果值為 true
,表示符合條件,自動化動作就會繼續執行下一個節點。如果是 false
,自動化動作就會在該點停止執行。
運算式的形成方式與 Kotlin 中的運算式類似,且可能包含數字、字元、字串和布林值等基本值,以及列舉值。使用括號將子運算式分組,即可控制評估的順序。
以下是 condition
的範例,可將多個子運算式結合為單一運算式:
condition() {
val expr1 = starterNode.lockState equals DlLockState.Unlocked
val expr2 = stateReaderNode.lockState equals true
val expr3 = occupancySensingDevice.occupied notEquals 0
val expr4 = timeStateReaderNode
.currentTime
.between(
timeStateReaderNode.sunsetTime,
timeStateReaderNode.sunriseTime)
expression = (expr1 and expr2) or (expr3 and expr4)
}
您可以參照透過啟動條件存取的特徵值:
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
您也可以使用 stateReader
節點,在 condition
節點中參照特徵屬性值。
如要這麼做,請先在 stateReader
節點中擷取特徵屬性值。stateReader
會將 structure
和特徵做為引數:
import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)
然後在 condition
節點中參照 stateReader
:
condition() {
expression =
filterMonitoringState.changeIndication
.equals(ChangeIndicationEnum.Warning)
}
使用比較和邏輯運算子時,您可以在 condition
節點中使用多個 stateReaders
:
val armState = stateReader<_>(doorLock, DoorLockDevice, ArmDisarm )
val doorLockState = stateReader<_>(doorLock, DoorLockDevice, DoorLock)
condition() {
expression =
(armState.armState equals true)
and
(doorLockState.lockState equals true)
}
條件持續時間
除了條件中的布林值運算式之外,您還可以指定一段時間,在該時間內,運算式必須為 true 才能執行自動化動作。舉例來說,你可以定義條件,只在燈具開啟十分鐘後觸發。
condition {
expression(lightStateReader.onOff == true)
forDuration(Duration.ofMinutes(10))
}
時間長度可從 1 到 30 分鐘不等。
動作節點
動作節點是自動化動作執行的所在位置。在本範例中,動作會叫用 AssistantBroadcast
特徵的 broadcast()
指令:
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
匯入陳述式
開發自動化動作時,有時不容易瞭解如何將 Google Home API 的各種元素匯入程式碼。
特徵屬性會從特徵的 Companion
物件匯入:
import com.google.home.matter.standard.OnOff.Companion.onOff
由特徵定義的資料結構會從名稱結尾為「-Trait」的特徵類別匯入:
import com.google.home.matter.standard.MediaPlaybackTrait.PlaybackStateEnum
特徵指令會從特徵的 Companion
物件匯入:
import com.google.home.matter.standard.Thermostat.Companion.setTemperatureSetpointHold