הפניה לאופרטור DSL ב-Android

אופרטורים מאפשרים לבדוק את הערך של מאפייני התכונה מול ערכים ספציפיים, להשוות אותם זה לזה ולשלב ביטויים שמשמשים בצמתים 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

אופרטורים להשוואה

בין

הפונקציה מחזירה את הערך true אם הערך של Expression 1 הוא בין הערך של Expression 2 לבין הערך של Expression 3 (כולל). הדירוג של הביטויים משתנה בהתאם לסוג הנתונים שלהם. סוגי נתונים פשוטים כמו מספרים ומחרוזות מדורגים באותו אופן כמו ב-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),
  )

עם זאת, לא חייבים לבחור תאריכים מלאים. ב-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)

שווה ל-

הפונקציה מחזירה את הערך true אם Expression 1 שווה ל-Expression 2.

דוגמה
ביטוי 1 ביטוי 2 תוצאה
6 1 false
2 2 true

דוגמה ל-DSL

washer.operationalState equals STOPPED

greaterThan

הפונקציה מחזירה את הערך true אם Expression 1 גדול מ-Expression 2.

דוגמה
ביטוי 1 ביטוי 2 תוצאה
6 1 true
1 6 false

דוגמה ל-DSL

( blindsPosition.currentPositionLift greaterThan 0u )

greaterThanOrEquals

הפונקציה מחזירה את הערך true אם Expression 1 גדול מ-Expression 2 או שווה לו.

דוגמה
ביטוי 1 ביטוי 2 תוצאה
8 6 true
6 6 true
1 6 false

דוגמה ל-DSL

( starterNode.measuredValue greaterThanOrEquals 50 )

lessThan

הערך שמתקבל הוא true אם הביטוי 1 קטן מהביטוי 2.

דוגמה
ביטוי 1 ביטוי 2 תוצאה
6 1 false
1 6 true

דוגמה ל-DSL

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

lessThanOrEquals

הפונקציה מחזירה את הערך true אם Expression 1 קטן מ-Expression 2 או שווה לו.

דוגמה
ביטוי 1 ביטוי 2 תוצאה
8 6 false
6 6 true
1 6 true

דוגמה ל-DSL

( starterNode.measuredValue lessThanOrEquals 25 )

notEquals

הערך שמתקבל הוא true אם Expression 1 לא שווה ל-Expression 2.

דוגמה
ביטוי 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))

לא

הופכת את הערך הלוגי של ביטוי.

דוגמה
ביטוי תוצאה
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))