הפניה לאופרטור 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 כשהערך של ביטוי 1 הוא בין הערך של ביטוי 2 לערך של ביטוי 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 כשביטוי 1 שווה לביטוי 2.

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

דוגמה ל-DSL

washer.operationalState equals STOPPED

greaterThan

הפונקציה מחזירה את הערך true כשביטוי 1 גדול מביטוי 2.

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

דוגמה ל-DSL

( blindsPosition.currentPositionLift greaterThan 0u )

greaterThanOrEquals

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

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

דוגמה ל-DSL

( starterNode.measuredValue lessThanOrEquals 25 )

notEquals

התוצאה היא true כשביטוי 1 לא שווה לביטוי 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))