Operator DSL w Androidzie

Operatory umożliwiają sprawdzanie wartości atrybutów cech pod kątem określonych wartości, porównywanie ich ze sobą i łączenie wyrażeń używanych w węzłach condition.

Operatory są udostępniane za pomocą tych instrukcji 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

Operatory porównania

pomiędzy

Zwraca wartość true, gdy wartość wyrażenia 1 mieści się w zakresie wartości wyrażenia 2 i wyrażenia 3 (włącznie). Wyrażenia są klasyfikowane w różny sposób w zależności od typu danych. Proste typy danych, takie jak liczby i ciągi znaków, są klasyfikowane w taki sam sposób jak w Kotlinie.

Przykład
Wyrażenie 1 Wyrażenie 2 Wyrażenie 3 Wynik
6 1 3 false
2 1 3 true

Przykład DSL

val time = stateReader<_>(structure, Time)
condition() {
  expression = time.currentTime
     .between(
      time.sunsetTime,
      time.sunriseTime)
}

Używanie dat z funkcją between()

Używając operatora between(), możesz określić zakres dat:

val exp2 =
  time.currentDate.between(
    LocalDate.of(2025, Month.OCTOBER, 1),
    LocalDate.of(2025, Month.DECEMBER, 15),
  )

Nie musisz jednak podawać pełnych dat. Język DSL automatyzacji umożliwia też wyrażanie zakresu dat na różne sposoby:

  • Używając tylko roku i miesiąca:
val exp2 =
  time.currentDate.yearMonth.between(
    YearMonth.of(2024, Month.OCTOBER),
    YearMonth.of(2026, Month.JANUARY),
  )
  • Używając tylko miesiąca i dnia:
val exp2 =
  time.currentDate.monthDay.between(
    MonthDay.of(Month.OCTOBER, 1),
    MonthDay.of(Month.DECEMBER, 15),
  )
  • Używając tylko dnia miesiąca:
val exp2 = time.currentDate.day.between(1, 15)

równa się

Zwraca wartość true, gdy Wyrażenie 1 jest równe Wyrażeniu 2.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
6 1 false
2 2 true

Przykład DSL

washer.operationalState equals STOPPED

greaterThan

Zwraca wartość true, gdy Wyrażenie 1 jest większe niż Wyrażenie 2.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
6 1 true
1 6 false

Przykład DSL

( blindsPosition.currentPositionLift greaterThan 0u )

greaterThanOrEquals

Zwraca wartość true, gdy Wyrażenie 1 jest większe lub równe Wyrażeniu 2.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
8 6 true
6 6 true
1 6 false

Przykład DSL

( starterNode.measuredValue greaterThanOrEquals 50 )

lessThan

zwraca wartość true, gdy Wyrażenie 1 jest mniejsze niż Wyrażenie 2.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
6 1 false
1 6 true

Przykład DSL

time.currentTime lessThan LocalTime.of(22,0,0,0)

lessThanOrEquals

Zwraca wartość true, gdy Wyrażenie 1 jest mniejsze lub równe Wyrażeniu 2.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
8 6 false
6 6 true
1 6 true

Przykład DSL

( starterNode.measuredValue lessThanOrEquals 25 )

notEquals

Zwraca wartość true, gdy Wyrażenie 1 jest różne od Wyrażenia 2.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
6 1 true
1 6 true
2 2 false

Przykład DSL

occupancyStateChange.occupied notEquals 0

Operatory arytmetyczne

Dodaj

Operator dodawania ( +).

Przykład DSL

var totalCount = 0
...
totalCount = totalCount + 1

Odejmowanie

Operator odejmowania ( -).

Przykład DSL

var countdown = 10
...
countdown = countdown - 1

Mnożenie

Operator mnożenia ( *).

Przykład DSL

val millis = seconds * 1000

Dzielenie

Operator dzielenia ( / ).

Przykład DSL

val rpm = revolutions / minutes

Operatory logiczne

i

Łączy 2 wyrażenia w wyrażenie logiczne AND, które przyjmuje wartość true, gdy oba wyrażenia mają wartość true.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
false false false
true false false
false true false
true true true

Przykład DSL

((device.occupied notEquals 0) and
   time.currentTime.between(time.sunriseTime, time.sunsetTime))

nie

Neguje wartość logiczną wyrażenia.

Przykład
Wyrażenie Wynik
true false
false true

Przykład DSL

time.currentTime not (between(time.sunriseTime, time.sunsetTime))

lub

Łączy 2 wyrażenia w wyrażenie logiczne OR.

Przykład
Wyrażenie 1 Wyrażenie 2 Wynik
false false false
true false true
false true true

Przykład DSL

(time.currentTime equals LocalTime.of(10,0,0,0)) or
  (time.currentTime equals LocalTime.of(22,0,0,0))