Android DSL 運算子參考資料

運算子可讓您根據特定值檢查特徵屬性的值、相互比較,以及合併 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))