זוהי סקירה כללית של המושגים הבסיסיים של Automation DSL.
רכיבי אוטומציה
תהליך אוטומציה מורכב מהרכיבים הבסיסיים הבאים, שבדרך כלל נבדקים בסדר הזה:
- Starter – מגדיר את התנאים הראשוניים שמפעילים את האוטומציה, כמו שינוי במאפיין. תהליך אוטומציה חייב לכלול גורם מפעיל.
- תנאי – אילוצים נוספים שצריך להעריך אחרי הפעלת האוטומציה. כדי שהפעולות של האוטומציה ימשיכו, הביטוי בתנאי צריך להיות שווה ל-
true
. - פעולה – פקודות או עדכוני מצב שמתבצעים כשכל התנאים מתקיימים.
לדוגמה, יכול להיות שיש לכם פעולה אוטומטית שמפחיתה את הבהירות של האורות בחדר כשהטלוויזיה בחדר מופעלת בין שקיעה לזריחה. בדוגמה הזו:
- Starter (התחלה) – הטלוויזיה הופעלה, כלומר חל שינוי במצב של מאפיין הטלוויזיה.
- תנאי – המערכת מבצעת הערכה של השעה הנוכחית בבית שבו נמצאת הטלוויזיה.
- פעולה – התאורה בחדר שבו נמצא הטלוויזיה תהיה עמומה יותר.
האוטומציה מופעלת כשהטלוויזיה בחדר מופעלת, אבל היא מתבצעת רק אם מתקיים התנאי 'השעה היא בין שקיעה לזריחה'.
בנוסף למבנה הבסיסי, האוטומציות בממשקי ה-API של Home מכילות גם מטא-נתונים, כמו שם ותיאור, שאפשר להשתמש בהם כדי לזהות אותן למפתחים ולמשתמשים.
צמתים
בממשקי Home API, המבנה הלוגי של פעולה אוטומטית מורכב מnodes. צמתים הם יחידות מופשטים שניתנות לשימוש חוזר, שמייצגות התנהגויות של ישויות או תהליכי ביצוע. לכל צומת יכולים להיות משתני קלט, וגם משתני פלט שיכולים לשמש צמתים אחרים.
צומת | סוג צומת | הטמעה ב-Kotlin | תיאור |
---|---|---|---|
Starter | התנהגותי |
StarterNodeDsl
|
הפעלת פעולה אוטומטית כשמצב המאפיין (כל מאפיין) משתנה. |
StateReader | התנהגותי |
StateReaderNodeDsl
|
הפונקציה קוראת מאפיין של מאפיין ומאפשרת לתעד את הערך שלו לשימוש בצמתים של תנאים. |
פעולה | התנהגותי |
ActionNodeDsl
|
הפעלת פקודות של מאפיינים. |
Sequential | תהליך הביצוע |
SequentialFlow
|
ביצוע צמתים של פעולות בתצוגת עץ ברצף. זוהי התנהגות ברירת המחדל לביצוע. |
מקביל | תהליך הביצוע |
ParallelFlow
|
ביצוע צמתים של פעולות בתצוגת עץ במקביל. |
Condition | תהליך הביצוע |
ConditionNodeDsl
|
שינוי מותנה של תהליך הביצוע על סמך הערכות של ביטויים לוגיים. התנאים יכולים להיות משויכים ל-starter (תנאים ספציפיים ל-starter) או להיות גלובלים (רלוונטיים לכל ה-starters). |
בחירה | תהליך הביצוע |
SelectFlow
|
מאפשרים ליותר מסמן אחד להפעיל פעולה אוטומטית. |
ביטוי | ערך |
Expression
|
יכול להיות ערך של מאפיין של מאפיין, קבוע או ערך מילולי, והוא חייב להניב ערך של רשימה, מספר, ערך בוליאני או מחרוזת. |
צמתים התנהגותיים
צמתים כמו 'סימנים לתחילת פעולה' ו'פעולות' הם צמתים התנהגותיים. ערכות התחלה מפעילות פעולה אוטומטית על סמך שינויים במאפייני המכשיר. פעולות הן הוראות למכשיר או עדכונים של מאפיינים.
בדרך כלל, צמתים התנהגותיים קשורים למאפייני המכשיר ולמצב של מאפייני הפלט, לשימוש כקלט בצמתים אחרים.
צמתים בתהליך הביצוע
צמתים מסוימים מייצגים תהליכי ביצוע, כמו רצף וביצוע מקביל. כל אחד מהצומתים האלה מכיל את הצמתים ההתנהגותיים שמגדירים את האוטומציה.
לדוגמה, תהליך כרונולוגי עשוי להכיל צמתים שפועלים בסדר כרונולוגי. בדרך כלל, אלה יהיו 'התחלה', 'תנאי' ו'פעולה'.
בתהליך מקביל יכולים לפעול כמה צמתים של פעולות בו-זמנית, למשל הפעלה של כמה נורות בו-זמנית. צמתים שמשתמשים בתהליך מקביל לא יפעלו עד שכל ההסתעפויות של התהליך המקביל יסתיימו.
סוג נוסף של תהליך ביצוע הוא תהליך ביצוע מותנה, שיכול לשנות את תהליך הביצוע על סמך הערכת ביטוי.
לדוגמה, יכול להיות שיש לכם תהליך אוטומציה שמבצע פעולה בהתאם לשעה ביום. צומת תנאי בודק את השעה ביום, ואז עוקב אחרי נתיב הביצוע המתאים על סמך ההערכה הזו.
תהליך בחירת אירוע שימושי כשרוצים להגדיר יותר מאירוע אחד שיפעיל את האוטומציה. כשאתם כוללים שני גורמים או יותר להתחלת תהליך בזרימה של select
, כל אחד מהגורמים האלה יכול להפעיל את האוטומציה.
לדוגמה, אפשר לכתוב תרחיש אוטומציה שיוריד את התריסים בשקיעה, אם הטמפרטורה תהיה גבוהה מעבר לסף מסוים או אם הבהירות תחרוג מסף מסוים. שלושה סטארטרים נפרדים מטפלים בכל אחד מהתרחישים האלה, וכל השלושה יהיו עטופים בתהליך select
.
תהליכי עבודה בתצוגת עץ
בתהליכי אוטומציה מורכבים, אפשר גם להטמיע צמתים של תהליך ביצוע. לדוגמה, יכול להיות שתהיה לכם תהליך רצוף שמפעיל תהליך מקביל.
אפשר להטמיע צמתים של 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
.