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