זוהי סקירה כללית של מושגי הבסיס של שפת התחום הספציפית לאוטומציה ב-Android.
רכיבי אוטומציה
אוטומציה מורכבת מהרכיבים הבסיסיים הבאים, שבדרך כלל מוערכים בסדר הזה:
- הפעלה – מגדיר את התנאים הראשוניים שמפעילים את הפעולות האוטומטיות, כמו שינוי במאפיין. לכל פעולה אוטומטית צריך להיות סימן לתחילת הפעולה.
- תנאי – אילוצים נוספים להערכה אחרי הפעלת האוטומציה. הביטוי בתנאי צריך להיות שווה ל-
trueכדי שהפעולות של האוטומציה ימשיכו. - פעולה – פקודות או עדכוני סטטוס שמתבצעים כשכל התנאים מתקיימים.
לדוגמה, יכול להיות שיש לכם פעולה אוטומטית שמחלישה את האורות בחדר כשמפעילים את הטלוויזיה בחדר בין השקיעה לזריחה. בדוגמה הזו:
- Starter – הטלוויזיה הופעלה, וזהו שינוי במצב של מאפיין הטלוויזיה.
- תנאי – המערכת מעריכה את השעה הנוכחית בבית שבו נמצאת הטלוויזיה.
- פעולה – התאורה בחדר שבו נמצא הטלוויזיה תהיה עמומה יותר.
הפעולה האוטומטית תופעל כשהטלוויזיה בחדר תופעל, אבל היא תתבצע רק אם יתקיים התנאי 'השעה היא בין השקיעה לזריחה'.
בנוסף למבנה הבסיסי, האוטומציות בממשקי ה-API של Home מכילות גם מטא-נתונים, כמו שם ותיאור, שאפשר להשתמש בהם כדי לזהות אותן עבור מפתחים ומשתמשים.
צמתים
בממשקי ה-API של Home, המבנה הלוגי של אוטומציה מורכב מצמתים. צמתים הם יחידות מופשטות לשימוש חוזר שמייצגות התנהגויות של ישויות או זרימות של ביצוע. לכל צומת יכולים להיות משתני קלט וגם משתני פלט, שיכולים לשמש צמתים אחרים.
| צומת | סוג צומת | הטמעה של Kotlin | תיאור |
|---|---|---|---|
| Starter | התנהגותי |
StarterNodeDsl
|
הפעולה האוטומטית תתחיל כשמצב המאפיין (כל מאפיין) ישתנה. |
| StateReader | התנהגותי |
StateReaderNodeDsl
|
קריאה של מאפיין של תכונה ומאפשרת לכם לתעד את הערך שלו לשימוש בצמתי תנאים. |
| פעולה | התנהגותי |
ActionNodeDsl
|
הפעלת פקודות של מאפיינים. |
| רציף | תהליך הביצוע |
SequentialFlow
|
מבצעת צמתי פעולה מקוננים ברצף. זו התנהגות ברירת המחדל של ההרצה. |
| מקבילי | תהליך הביצוע |
ParallelFlow
|
מבצע צמתי פעולה מקוננים במקביל. |
| Condition | תהליך הביצוע |
ConditionNodeDsl
|
שינוי מותנה של תהליך הביצוע על סמך הערכות של ביטויים לוגיים. אפשר לשייך תנאים ל-Starter (תנאים ספציפיים ל-Starter) או להגדיר אותם כגלובליים (חלים על כל ה-Starters). |
| בחירה | תהליך הביצוע |
SelectFlow
|
מאפשר להפעיל פעולות אוטומטיות באמצעות יותר מסימן אחד לתחילת פעולה. |
| Expression | ערך |
Expression
|
יכול להיות הערך של מאפיין של תכונה, קבוע או ערך מילולי, והוא חייב להיות רשימה, מספר, ערך בוליאני או מחרוזת. |
צמתים התנהגותיים
צמתים כמו סימנים לתחילת פעולה ופעולות הם צמתים התנהגותיים. הפעולות האוטומטיות מתחילות לפעול על סמך שינויים במאפייני המכשיר. פעולות ששולחות פקודות למכשיר או מעדכנות מאפיינים.
צמתים התנהגותיים קשורים בדרך כלל למאפייני המכשיר ולמצב מאפיין הפלט לשימוש כקלט בצמתים אחרים.
צמתים של זרימת ביצוע
חלק מהצמתים מייצגים תהליכי ביצוע, כמו תהליכים עוקבים ומקבילים. כל אחד מהצמתים האלה מכיל את הצמתים ההתנהגותיים שמגדירים את האוטומציה.
לדוגמה, זרימה רציפה עשויה להכיל צמתים שמופעלים בסדר רציף. בדרך כלל אלה יהיו סימן לתחילת פעולה, תנאים ופעולה.
בזרימה מקבילית יכולים להיות כמה צמתי פעולה שמופעלים בו-זמנית, למשל הדלקה של כמה אורות בו-זמנית. צמתים שמופיעים אחרי זרימה מקבילה לא יופעלו עד שכל הענפים של הזרימה המקבילה יסתיימו.
סוג נוסף של תהליך ביצוע הוא תהליך מותנה, שיכול לשנות את תהליך הביצוע על סמך הערכה של ביטוי.
לדוגמה, יכול להיות שיש לכם פעולה אוטומטית שמבצעת פעולה על סמך השעה ביום. צומת של תנאי בודק את השעה ביום, ואז פועל לפי נתיב הביצוע המתאים על סמך הבדיקה הזו.
זרימת בחירה שימושית כשרוצים להגדיר יותר מסימן לתחילת פעולה אחד שיכול להפעיל את הפעולות האוטומטיות. כשמקיפים שני סימנים או יותר לתחילת פעולה בתוך זרימת select, כל אחד מהסימנים יכול להפעיל את האוטומציה.
לדוגמה, אפשר לכתוב אוטומציה להורדת התריסים בשקיעה, אם הטמפרטורה עולה מעל סף מסוים או אם הבהירות עולה מעל סף מסוים. שלושה תרחישים שונים מטופלים על ידי שלוש התחלות נפרדות, וכל השלושה עטופים בזרימת select.
הסתעפויות של זרימות
באוטומציות מורכבות, אפשר גם להשתמש בצמתים מוטמעים של זרימת הביצוע. לדוגמה, יכול להיות שיש לכם תהליך עבודה רציף שמבצע תהליך עבודה מקביל.
אפשר להטמיע ולשלב צמתי DSL בדרכים שונות כדי להתאים אותם לצרכים הספציפיים שלכם, בהתאם למגבלות שמפורטות בטבלה הבאה. הקישור בעמודה Builder מוביל לתיעוד של ה-builder ב-Kotlin, שבו מפורט מה מותר לשימוש בכל סוג של צומת.
| צומת | יכול להכיל את סוג הצומת והנתונים הבאים | חייב להיות באחד מסוגי הצמתים הבאים |
|---|---|---|
| Starter | ביטוי | בחירה באפשרות 'לפי הסדר' |
| ManualStarter | בחירה באפשרות 'לפי הסדר' | |
| StateReader | ביטוי (בדרך כלל כולל ערך מאפיין) | פעולה, תנאי |
| פעולה | פקודה, ישות, ביטוי | מקבילי, בחירה, עוקב |
| רציף | מקבילי, בחירה, עוקב | |
| מקבילי | פעולה | לפי הסדר |
| Condition | ביטוי | מקביל, עוקב |
| בחירה | תנאי, רצף, סימן לתחילת פעולה, סימן לתחילת פעולה ידני | רציף, וחייב להיות הצומת הראשון בתהליך |
Automation DSL
בממשקי ה-API של Home, פעולות אוטומטיות מוגדרות באמצעות Automation DSL (שפה ספציפית לדומיין). ה-DSL לאוטומציה מיושם כ-Kotlin DSL (שפה ספציפית לדומיין), באמצעות בנאים בטוחים מסוג Kotlin, והוא מיועד במיוחד להגדרת תבניות אוטומציה.
כשמקמפלים אוטומציה, כלי בנייה בטוחים לטיפוס ב-Kotlin יוצרים מחלקות נתונים ב-Kotlin, שמומרות לסריאליזציה ב-JSON של מאגר אחסון לפרוטוקולים. הנתונים האלה משמשים לביצוע קריאות לשירותי האוטומציה של Google.
ה-DSL של האוטומציה מפשט ומייעל את תהליך בניית האוטומציות. הוא משתמש באופן מובנה באותו מודל נתונים של תכונות רגילות Matter ותכונות smart home שמופיעות ב-Device API.
בנוסף, שפת ה-DSL לפעולות אוטומטיות מגדירה את הלוגיקה של פעולה אוטומטית במונחים של סוגי מכשירים מופשטים, ולא במונחים של מופעים ספציפיים של מכשירים שנמצאים בבית של משתמש. הוא מאפשר למפתח לספק פרמטרים של קלט שאפשר להשתמש בהם בזמן הריצה כדי לציין מופעים בפועל של מכשירים, וגם ערכים חשובים אחרים של פרמטרים.
תחביר ה-DSL דומה לזה של Kotlin, והוא בטוח באותה מידה מבחינת סוגי נתונים, אבל אוטומציה שנכתבת ב-DSL של Automation היא פשוטה ותמציתית יותר מאותה אוטומציה שנכתבת ב-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.