運算子可讓您根據特定值檢查特徵屬性的值、相互比較,以及合併 condition
節點中使用的運算式。
運算子可透過下列 import
陳述式提供:
import com.google.home.automation.and
import com.google.home.automation.between
import com.google.home.automation.contains
import com.google.home.automation.equals
import com.google.home.automation.greaterThan
import com.google.home.automation.greaterThanOrEquals
import com.google.home.automation.lessThan
import com.google.home.automation.not
import com.google.home.automation.notEquals
import com.google.home.automation.or
比較運算子
介於
當「運算式 1」的值介於「運算式 2」和「運算式 3」之間 (含首尾) 時,會評估為 true
。運算式的排名方式會因資料類型而異。系統會以與 Kotlin 相同的方式,為數字和字串等簡單資料類型排序。
運算式 1 | 運算式 2 | 運算式 3 | 結果 |
---|---|---|---|
6 |
1 |
3 |
false |
2 |
1 |
3 |
true |
DSL 範例
val time = stateReader<_>(structure, Time)
condition() {
expression = time.currentTime
.between(
time.sunsetTime,
time.sunriseTime)
}
使用 between() 函式指定日期範圍
使用 between()
運算子時,您可以指定日期範圍:
val exp2 =
time.currentDate.between(
LocalDate.of(2025, Month.OCTOBER, 1),
LocalDate.of(2025, Month.DECEMBER, 15),
)
不過,您不一定要輸入完整日期,您也可以透過多種方式,在 Automation DSL 中表示日期範圍:
- 僅使用年和月:
val exp2 =
time.currentDate.yearMonth.between(
YearMonth.of(2024, Month.OCTOBER),
YearMonth.of(2026, Month.JANUARY),
)
- 僅使用月份和日期:
val exp2 =
time.currentDate.monthDay.between(
MonthDay.of(Month.OCTOBER, 1),
MonthDay.of(Month.DECEMBER, 15),
)
- 只使用當月第幾日:
val exp2 = time.currentDate.day.between(1, 15)
等於
如果「運算式 1」等於「運算式 2」,則評估結果為 true
。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
6 |
1 |
false |
2 |
2 |
true |
DSL 範例
washer.operationalState equals STOPPED
greaterThan
如果運算式 1 大於運算式 2,則求值結果為 true
。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
6 |
1 |
true |
1 |
6 |
false |
DSL 範例
( blindsPosition.currentPositionLift greaterThan 0u )
greaterThanOrEquals
如果「運算式 1」大於或等於「運算式 2」,則評估結果為 true
。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
8 |
6 |
true |
6 |
6 |
true |
1 |
6 |
false |
DSL 範例
( starterNode.measuredValue greaterThanOrEquals 50 )
lessThan
當「運算式 1」小於「運算式 2」時,會評估為 true
。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
6 |
1 |
false |
1 |
6 |
true |
DSL 範例
time.currentTime lessThan LocalTime.of(22,0,0,0)
lessThanOrEquals
當「運算式 1」小於或等於「運算式 2」時,會評估為 true
。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
8 |
6 |
false |
6 |
6 |
true |
1 |
6 |
true |
DSL 範例
( starterNode.measuredValue lessThanOrEquals 25 )
notEquals
如果運算式 1 不等於運算式 2,則評估結果為 true
。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
6 |
1 |
true |
1 |
6 |
true |
2 |
2 |
false |
DSL 範例
occupancyStateChange.occupied notEquals 0
算術運算子
新增
加法運算子 ( +
)。
DSL 範例
var totalCount = 0
...
totalCount = totalCount + 1
減號
減法運算子 ( -
)。
DSL 範例
var countdown = 10
...
countdown = countdown - 1
相乘
乘法運算子 ( *
)。
DSL 範例
val millis = seconds * 1000
除號
除法運算子 ( /
)。
DSL 範例
val rpm = revolutions / minutes
邏輯運算子
和
在邏輯 AND 運算式中合併兩個運算式,當兩個運算式都是 true
時,評估結果為 true
。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
false |
false |
false |
true |
false |
false |
false |
true |
false |
true |
true |
true |
DSL 範例
((device.occupied notEquals 0) and
time.currentTime.between(time.sunriseTime, time.sunsetTime))
not
反轉運算式的邏輯值。
運算式 | 結果 |
---|---|
true |
false |
false |
true |
DSL 範例
time.currentTime not (between(time.sunriseTime, time.sunsetTime))
或
將兩個運算式合併為邏輯 OR 運算式。
運算式 1 | 運算式 2 | 結果 |
---|---|---|
false |
false |
false |
true |
false |
true |
false |
true |
true |
DSL 範例
(time.currentTime equals LocalTime.of(10,0,0,0)) or
(time.currentTime equals LocalTime.of(22,0,0,0))