כאן מופיעה סקירה כללית של המושגים הבסיסיים של Automation DSL ב-Android.
רכיבי אוטומציה
אוטומציה מורכבת מהרכיבים הבסיסיים הבאים, שבדרך כלל נבדקים בסדר הזה:
- סימן לתחילת הפעולה – מגדיר את התנאים הראשוניים שמפעילים את הפעולה האוטומטית, כמו שינוי במאפיין. לכל פעולה אוטומטית צריך להיות סימן לתחילת הפעולה.
- תנאי – כל מגבלה נוספת שצריך לבדוק אחרי שהאוטומציה הופעלה. הביטוי בתנאי חייב להיות שווה ל-
trueכדי שהפעולות של האוטומציה ימשיכו. - פעולה – פקודות או עדכוני סטטוס שמתבצעים כשכל התנאים מתקיימים.
לדוגמה, יכול להיות שיש לכם פעולה אוטומטית שמעמעמת את האורות בחדר כשהטלוויזיה בחדר הזה מופעלת בין השקיעה לזריחה. בדוגמה הזו:
- גורם מפעיל — הטלוויזיה הופעלה, וזה שינוי במצב של תכונת הטלוויזיה.
- תנאי – המערכת בודקת את השעה הנוכחית בבית שבו נמצאת הטלוויזיה.
- פעולה – האורות בחדר שבו נמצאת הטלוויזיה מעומעמים.
האוטומציה תופעל כשהטלוויזיה בחדר תופעל, אבל היא תתבצע רק אם התנאי "השעה היא בין השקיעה לזריחה" יתקיים.
בנוסף למבנה הבסיסי, פעולות אוטומטיות ב-Home APIs מכילות גם מטא-נתונים, כמו שם ותיאור, שמאפשרים למפתחים ולמשתמשים לזהות אותן.
צמתים
בממשקי Home API, המבנה הלוגי של פעולה אוטומטית מורכב מצמתים. צמתים הם יחידות מופשטות שניתן לעשות בהן שימוש חוזר, והן מייצגות התנהגויות של ישויות או תהליכי ביצוע. לכל צומת יכולים להיות משתני קלט ומשתני פלט שצמתים אחרים יכולים להשתמש בהם.
| צומת | סוג צומת | הטמעה ב-Kotlin | תיאור |
|---|---|---|---|
| Starter | התנהגותי |
StarterNodeDsl
|
הפעלת אוטומציה כשמצב של תכונה (כל מאפיין) משתנה. |
| StateReader | התנהגותי |
StateReaderNodeDsl
|
קורא מאפיין של תכונה ומאפשר לתעד את הערך שלו לשימוש בצומתי תנאים. |
| פעולה | התנהגותי |
ActionNodeDsl
|
מפעיל פקודות של מאפיינים. |
| רציף | תהליך ההרצה |
SequentialFlow
|
מריץ צומתי פעולות בתצוגת עץ ברצף. זוהי התנהגות ברירת המחדל של ההפעלה. |
| מקביל | תהליך ההרצה |
ParallelFlow
|
מריץ צומתי פעולות בתצוגת עץ במקביל. |
| Condition | תהליך ההרצה |
ConditionNodeDsl
|
שינוי מותנה של תהליך הביצוע על סמך הערכות של ביטויים לוגיים. התנאים יכולים להיות משויכים לגורם מפעיל (תנאים ספציפיים לגורם מפעיל) או להיות גלובליים (לחול על כל הגורמים המפעילים). |
| בחירה | תהליך ההרצה |
SelectFlow
|
מאפשרת להפעיל פעולה אוטומטית באמצעות יותר מסימן אחד לתחילת פעולה. |
| IfFlow | תהליך ההרצה |
IfFlowDsl
|
מפעילה לכל היותר פעולה אחת (או הסתעפות אחת) על סמך התנאי (אם יש כזה) שמוערך כ-true (בדומה להצהרת if-then-else). |
| Expression | ערך |
Expression
|
הערך יכול להיות ערך של מאפיין של תכונה, קבוע או ליטרל, והוא חייב להיות רשימה, מספר, ערך בוליאני או מחרוזת. |
צמתים התנהגותיים
צמתים כמו סימנים לתחילת פעולה ופעולות הם צמתים התנהגותיים. גורמים להפעלה מפעילים פעולה אוטומטית על סמך שינויים במאפייני המכשיר. פעולות שולחות פקודות למכשיר או מעדכנות מאפיינים.
צומתי התנהגות בדרך כלל קשורים לתכונות של המכשיר ולמצב הפלט של התכונה, כדי להשתמש בהם כקלט בצמתים אחרים.
צמתים של תהליך הביצוע
חלק מהצמתים מייצגים תהליכי ביצוע, כמו ביצוע רציף ומקביל. כל אחד מהצמתים האלה מכיל את צמתי ההתנהגות שמגדירים את האוטומציה.
לדוגמה, תהליך סדרתי יכול להכיל צמתים שמופעלים בסדר עוקב. בדרך כלל, אלה יהיו גורם מפעיל, תנאי ופעולה.
בתהליך מקביל, יכולים להיות כמה צומתי פעולות שפועלים בו-זמנית, כמו הדלקת כמה אורות בו-זמנית. צמתים אחרי תהליך מקביל לא יופעלו עד שכל הענפים של התהליך המקביל יסתיימו.
סוג אחר של תהליך ביצוע הוא תהליך מותנה, שיכול לשנות את תהליך הביצוע על סמך הערכה של ביטוי.
לדוגמה, יכול להיות שיש לכם פעולה אוטומטית שמבצעת פעולה על סמך השאלה אם עכשיו לילה. צומת תנאי בודק את השעה ביום, ואז ממשיך לנתיב הביצוע המתאים על סמך ההערכה הזו.
תהליך בחירה שימושי כשרוצים שיהיה יותר מגורם מפעיל אחד שיכול להפעיל את האוטומציה. כשמוסיפים שניים או יותר סימנים לתחילת פעולה בתהליך select, כל אחד מהם יכול להפעיל את הפעולות האוטומטיות.
לדוגמה, אתם יכולים ליצור אוטומציה שמורידה את התריסים בשקיעה, אם הטמפרטורה עולה מעל סף מסוים או אם הבהירות חורגת מסף מסוים. שלושה פריטי הפעלה נפרדים מטפלים בכל אחד מהתרחישים האלה, ושלושתם יהיו עטופים בתהליך select.
תהליך if-then-else (IfFlow) מאפשר להפעיל תנאים מסתעפים בתוך אוטומציה. בניגוד לצומת condition, שעוצר את כל תהליך האוטומציה אם התנאי הוא false, תהליך if-then-else מבצע פעולות ספציפיות באופן מותנה כשהתנאי מתקיים, ויכול לחזור לתנאים חלופיים או לפעולות חלופיות, או להמשיך לצמתים הבאים באוטומציה. למידע נוסף, קראו את המאמר הפעלה מותנית.
תהליכים בתוך תהליכים
באוטומציות מורכבות, אפשר גם להוסיף צומתי תהליך ביצוע בתוך צמתים אחרים. לדוגמה, יכול להיות תהליך עבודה רציף שמפעיל תהליך עבודה מקביל.
אפשר להטמיע צומתי DSL ולשלב אותם בדרכים שונות כדי לענות על הצרכים הספציפיים שלכם, בהתאם למגבלות שמפורטות בטבלה הבאה. העמודה Builder מקשרת למסמכי התיעוד של Kotlin typesafe builder, שמפרטים מה מותר להשתמש בכל סוג של צומת.
| צומת | יכול להכיל את סוג הצומת והנתונים הבאים | חייב להיות באחד מסוגי הצמתים הבאים |
|---|---|---|
| Starter | ביטוי | בחירה, ברצף |
| ManualStarter | בחירה, ברצף | |
| StateReader | ביטוי (בדרך כלל מורכב מערך מאפיין של תכונה) | IfFlow, מקבילי, רציף |
| פעולה | פקודה, ישות, ביטוי | IfFlow, Parallel, Select, Sequential |
| רציף | IfFlow, Parallel, Select, Sequential | |
| מקביל | פעולה | IfFlow, Sequential |
| Condition | ביטוי | IfFlow, מקבילי, רציף |
| בחירה | Condition, Sequential, Starter, ManualStarter | רציף, וחייב להיות הצומת הראשון בתהליך |
| IfFlow | Action, Condition, Delay, IfFlow, Parallel, Sequential, StateReader, Suppression | לפי הסדר |
DSL של פעולות אוטומטיות
ב-Home API, הפעולות האוטומטיות מוגדרות באמצעות Automation DSL (שפה ספציפית לדומיין). ה-DSL של האוטומציה מוטמע בתור Kotlin DSL (שפה ספציפית לדומיין), באמצעות כלים למניעת שגיאות הקלדה ב-Kotlin, והוא מיועד במיוחד להגדרת תבניות של אוטומציה.
כשמבצעים קומפילציה של אוטומציה, בונים מסוג Kotlin type-safe יוצרים מחלקות נתונים של Kotlin, שעוברות סריאליזציה ל-JSON של מאגר אחסון לפרוטוקולים, שמשמש לביצוע קריאות ל-Automation Services של Google.
ה-DSL של האוטומציה מפשט ומייעל את תהליך יצירת האוטומציות. הוא משתמש באופן מקורי באותו מודל נתונים של Matter תכונות סטנדרטיות ו-smart home תכונות שמופיעות ב-Device API.
בנוסף, ה-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.