מושגי DSL

זוהי סקירה כללית של המושגים הבסיסיים של Automation DSL.

רכיבי אוטומציה

תהליך אוטומציה מורכב מהרכיבים הבסיסיים הבאים, שבדרך כלל נבדקים בסדר הזה:

  1. Starter – מגדיר את התנאים הראשוניים שמפעילים את האוטומציה, כמו שינוי במאפיין. תהליך אוטומציה חייב לכלול גורם מפעיל.
  2. תנאי – אילוצים נוספים שצריך להעריך אחרי הפעלת האוטומציה. כדי שהפעולות של האוטומציה ימשיכו, הביטוי בתנאי צריך להיות שווה ל-true.
  3. פעולה – פקודות או עדכוני מצב שמתבצעים כשכל התנאים מתקיימים.

לדוגמה, יכול להיות שיש לכם פעולה אוטומטית שמפחיתה את הבהירות של האורות בחדר כשהטלוויזיה בחדר מופעלת בין שקיעה לזריחה. בדוגמה הזו:

  1. Starter (התחלה) – הטלוויזיה הופעלה, כלומר חל שינוי במצב של מאפיין הטלוויזיה.
  2. תנאי – המערכת מבצעת הערכה של השעה הנוכחית בבית שבו נמצאת הטלוויזיה.
  3. פעולה – התאורה בחדר שבו נמצא הטלוויזיה תהיה עמומה יותר.

האוטומציה מופעלת כשהטלוויזיה בחדר מופעלת, אבל היא מתבצעת רק אם מתקיים התנאי 'השעה היא בין שקיעה לזריחה'.

בנוסף למבנה הבסיסי, האוטומציות בממשקי ה-API של Home מכילות גם מטא-נתונים, כמו שם ותיאור, שאפשר להשתמש בהם כדי לזהות אותן למפתחים ולמשתמשים.

צמתים

בממשקי Home API, המבנה הלוגי של פעולה אוטומטית מורכב מnodes. צמתים הם יחידות מופשטים שניתנות לשימוש חוזר, שמייצגות התנהגויות של ישויות או תהליכי ביצוע. לכל צומת יכולים להיות משתני קלט, וגם משתני פלט שיכולים לשמש צמתים אחרים.

טבלה: סוגים של צמתים של אוטומציה
צומת סוג צומת הטמעה ב-Kotlin תיאור
Starter התנהגותי StarterNodeDsl הפעלת פעולה אוטומטית כשמצב המאפיין (כל מאפיין) משתנה.
StateReader התנהגותי StateReaderNodeDsl הפונקציה קוראת מאפיין של מאפיין ומאפשרת לתעד את הערך שלו לשימוש בצמתים של תנאים.
פעולה התנהגותי ActionNodeDsl הפעלת פקודות של מאפיינים.
Sequential תהליך הביצוע SequentialFlow ביצוע צמתים של פעולות בתצוגת עץ ברצף. זוהי התנהגות ברירת המחדל לביצוע.
מקביל תהליך הביצוע ParallelFlow ביצוע צמתים של פעולות בתצוגת עץ במקביל.
Condition תהליך הביצוע ConditionNodeDsl שינוי מותנה של תהליך הביצוע על סמך הערכות של ביטויים לוגיים. התנאים יכולים להיות משויכים ל-starter (תנאים ספציפיים ל-starter) או להיות גלובלים (רלוונטיים לכל ה-starters).
בחירה תהליך הביצוע SelectFlow מאפשרים ליותר מסמן אחד להפעיל פעולה אוטומטית.
ביטוי ערך Expression יכול להיות ערך של מאפיין של מאפיין, קבוע או ערך מילולי, והוא חייב להניב ערך של רשימה, מספר, ערך בוליאני או מחרוזת.

צמתים התנהגותיים

צמתים כמו 'סימנים לתחילת פעולה' ו'פעולות' הם צמתים התנהגותיים. ערכות התחלה מפעילות פעולה אוטומטית על סמך שינויים במאפייני המכשיר. פעולות הן הוראות למכשיר או עדכונים של מאפיינים.

בדרך כלל, צמתים התנהגותיים קשורים למאפייני המכשיר ולמצב של מאפייני הפלט, לשימוש כקלט בצמתים אחרים.

צמתים בתהליך הביצוע

צמתים מסוימים מייצגים תהליכי ביצוע, כמו רצף וביצוע מקביל. כל אחד מהצומתים האלה מכיל את הצמתים ההתנהגותיים שמגדירים את האוטומציה.

לדוגמה, תהליך כרונולוגי עשוי להכיל צמתים שפועלים בסדר כרונולוגי. בדרך כלל, אלה יהיו 'התחלה', 'תנאי' ו'פעולה'.

תהליכי ביצוע ברצף
איור 1: תהליך אוטומציה רציף

בתהליך מקביל יכולים לפעול כמה צמתים של פעולות בו-זמנית, למשל הפעלה של כמה נורות בו-זמנית. צמתים שמשתמשים בתהליך מקביל לא יפעלו עד שכל ההסתעפויות של התהליך המקביל יסתיימו.

תהליכי ביצוע מקבילים
איור 2: תהליך אוטומציה מקביל

סוג נוסף של תהליך ביצוע הוא תהליך ביצוע מותנה, שיכול לשנות את תהליך הביצוע על סמך הערכת ביטוי.

לדוגמה, יכול להיות שיש לכם תהליך אוטומציה שמבצע פעולה בהתאם לשעה ביום. צומת תנאי בודק את השעה ביום, ואז עוקב אחרי נתיב הביצוע המתאים על סמך ההערכה הזו.

זרימה של תנאי
איור 3: תהליך התנאי

תהליך בחירת אירוע שימושי כשרוצים להגדיר יותר מאירוע אחד שיפעיל את האוטומציה. כשאתם כוללים שני גורמים או יותר להתחלת תהליך בזרימה של select, כל אחד מהגורמים האלה יכול להפעיל את האוטומציה.

לדוגמה, אפשר לכתוב תרחיש אוטומציה שיוריד את התריסים בשקיעה, אם הטמפרטורה תהיה גבוהה מעבר לסף מסוים או אם הבהירות תחרוג מסף מסוים. שלושה סטארטרים נפרדים מטפלים בכל אחד מהתרחישים האלה, וכל השלושה יהיו עטופים בתהליך select.

בחירת תהליך
איור 4: בחירת תהליך

תהליכי עבודה בתצוגת עץ

בתהליכי אוטומציה מורכבים, אפשר גם להטמיע צמתים של תהליך ביצוע. לדוגמה, יכול להיות שתהיה לכם תהליך רצוף שמפעיל תהליך מקביל.

תהליכי ביצוע בתצוגת עץ
איור 5: תהליכי ביצוע בתצוגת עץ

אפשר להטמיע צמתים של DSL ולשלב אותם בדרכים שונות כדי לענות על הצרכים הספציפיים שלכם, בהתאם למגבלות שמפורטות בטבלה הבאה. העמודה Builder מכילה קישור למסמכי התיעוד של ה-builder של Kotlin ללא שגיאות בטיחות סוג (typesafe), שבהם מפורט מה מותר להשתמש בכל סוג של צומת.

טבלה: איך אפשר לשלב צמתים
צומת בנאי יכול להכיל את סוג הצומת ואת הנתונים הבאים חייב להיות באחד מסוגי הצמתים הבאים
Starter AutomationBuilder ביטוי Select, Sequential
ManualStarter AutomationBuilder Select, Sequential
StateReader AutomationBuilder ביטוי (בדרך כלל מורכב מערך של מאפיין מאפיין) פעולה, תנאי
פעולה ActionBuilder פקודה, ישות, ביטוי מקבילית, בחירה, רציפה
Sequential SequentialFlowBuilder מקבילית, בחירה, רציפה
Parallel ParallelFlowBuilder פעולה רציפה
Condition ConditionBuilder ביטוי מקביל, רציף
בחירה AutomationBuilder Condition, ‏ Sequential, ‏ Starter, ‏ ManualStarter רציפה, והיא חייבת להיות הצומת הראשון בתהליך

Automation DSL

ב-Home APIs, הפעולות האוטומטיות מוגדרות באמצעות Automation DSL (שפה ספציפית לדומיין). ה-DSL של האוטומציה מיושם בתור Kotlin DSL (שפה ייעודית לדומיין), באמצעות בוני Kotlin בטוחים לסוגים, והוא מיועד במיוחד להגדרת תבניות אוטומציה.

כשמפעילים אוטומציה, ה-builders של Kotlin ללא שגיאות סוג יוצרים כיתות נתונים של Kotlin, שמאוחר יותר עוברות סריאליזציה ל-JSON של מאגר פרוטוקולים, שמשמשים לביצוע קריאות לשירותי האוטומציה של Google.

באמצעות Automation DSL, תהליך היצירה של תהליכי אוטומציה פשוט ויעיל יותר. הוא משתמש באופן מקורי באותו מודל נתונים של מאפיינים רגילים מסוג Matter ומאפיינים מסוג smart home שמופיעים ב-Device API.

ב-Automation DSL מוגדר גם הלוגיקה של האוטומציה במונחים של סוגים מופשטים של מכשירים, בניגוד למופעים ספציפיים של מכשירים שנמצאים בבית של המשתמש. הוא מאפשר למפתח לספק פרמטרים של קלט שיכולים לשמש בסביבת זמן הריצה כדי לציין מכשירי מכונה בפועל, וגם ערכים חשובים אחרים של פרמטרים.

התחביר של ה-DSL דומה לזה של Kotlin, והוא גם בטוח לסוגי נתונים, אבל קוד אוטומציה שנכתב ב-Automation DSL פשוט ותמציתי יותר מאותו קוד אוטומציה שנכתב ב-Kotlin טהור.

דוגמה

לפניכם דוגמה לאוטומציה שמפעילה מכשיר, שנכתבה באמצעות Automation DSL:

val automation = automation {
  name = "MyFirstAutomation"
  description = "If light1 is on, turn on light2."
  isActive = true
  sequential {
    val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
    condition() { expression = onOffTrait.onOff equals true }
    action(device2, OnOffLightDevice) { command(OnOff.on()) }
  }
}

התהליך האוטומטי הזה הוא בסיסי מאוד: כשdevice1, תאורה, מופעלת (המאפיין onOff משתנה ל-true), נשלחת הפקודה on() להפעלת device2.

האוטומציה משתמשת בצומת sequential, שמציין שהצומתים שלו יפעלו בסדר כרונולוגי.

בצומת sequential יש צמתים התנהגותיים כמו starter,‏condition ו-action. הפלט של הצומת starter מוקצה למשתנה לשימוש בצומת condition.