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