מושגי Android DSL

זוהי סקירה כללית של מושגי היסוד של שפת התחום הספציפית לאוטומציה ב-Android.

רכיבי אוטומציה

אוטומציה מורכבת מהרכיבים הבסיסיים הבאים, שבדרך כלל נבדקים בסדר הזה:

  1. סימן לתחילת הפעולה – מגדיר את התנאים הראשוניים שמפעילים את האוטומציה, כמו שינוי במאפיין. לכל אוטומציה צריך להיות סימן לתחילת הפעולה.
  2. תנאי – אילוצים נוספים להערכה אחרי הפעלת האוטומציה. הביטוי בתנאי צריך להיות שווה ל-true כדי שהפעולות של האוטומציה ימשיכו.
  3. פעולה – פקודות או עדכוני סטטוס שמבוצעים כשכל התנאים מתקיימים.

לדוגמה, יכול להיות שיש לכם פעולות אוטומטיות שמחלישות את האורות בחדר כשמפעילים את הטלוויזיה בחדר בין השקיעה לזריחה. בדוגמה הזו:

  1. Starter – הטלוויזיה הופעלה, וזהו שינוי במצב של מאפיין הטלוויזיה.
  2. תנאי – המערכת מעריכה את השעה הנוכחית בבית שבו נמצאת הטלוויזיה.
  3. פעולה – עוצמת ההארה של הנורות באותו חדר שבו נמצא הטלוויזיה תפחת.

הפעולה האוטומטית תופעל כשהטלוויזיה בחדר תופעל, אבל היא תתבצע רק אם התנאי 'השעה היא בין השקיעה לזריחה' יתקיים.

בנוסף למבנה הבסיסי, האוטומציות בממשקי ה-API של Home מכילות גם מטא-נתונים, כמו שם ותיאור, שאפשר להשתמש בהם כדי לזהות אותן עבור מפתחים ומשתמשים.

צמתים

בממשקי ה-API של Home, המבנה הלוגי של אוטומציה מורכב מצמתים. צמתים הם יחידות מופשטות לשימוש חוזר שמייצגות התנהגויות של ישויות או זרימות של ביצוע. לכל צומת יכולים להיות משתני קלט וגם משתני פלט, שצמתים אחרים יכולים להשתמש בהם.

טבלה: סוגים של צמתי אוטומציה
צומת סוג צומת הטמעה ב-Kotlin תיאור
Starter התנהגותי StarterNodeDsl הפעלה של אוטומציה כשמצב המאפיין (כל מאפיין) משתנה.
StateReader התנהגותי StateReaderNodeDsl קריאה של מאפיין של תכונה ומאפשרת לכם לתעד את הערך שלו לשימוש בצמתי תנאים.
פעולה התנהגותי ActionNodeDsl הפעלת פקודות של מאפיינים.
ברצף תהליך הביצוע SequentialFlow מבצעת צמתי פעולה מקוננים ברצף. זו התנהגות ברירת המחדל של ההרצה.
מקביל תהליך הביצוע ParallelFlow מבצעת צמתי פעולה מקוננים במקביל.
Condition תהליך הביצוע ConditionNodeDsl שינוי מותנה של תהליך הביצוע על סמך הערכות של ביטויים לוגיים. תנאים יכולים להיות משויכים ל-starter (תנאים ספציפיים ל-starter) או להיות גלובליים (חלים על כל ה-starters).
בחירה תהליך הביצוע SelectFlow מאפשר להפעיל פעולה אוטומטית באמצעות יותר מסימן אחד לתחילת פעולה.
Expression ערך Expression יכול להיות ערך של מאפיין של תכונה, קבוע או ערך מילולי, והוא חייב להיות רשימה, מספר, ערך בוליאני או מחרוזת.

צמתים התנהגותיים

צמתים כמו סימנים לתחילת פעולה ופעולות הם צמתים התנהגותיים. חבילות Starter מפעילות אוטומציה על סמך שינויים במאפייני המכשיר. פעולות ששולחות פקודות למכשיר או מעדכנות מאפיינים.

צמתים התנהגותיים קשורים בדרך כלל למאפייני המכשיר ולמצב מאפיין הפלט לשימוש כקלט בצמתים אחרים.

צמתים של זרימת ביצוע

חלק מהצמתים מייצגים תהליכי ביצוע, כמו תהליכים עוקבים ומקבילים. כל אחד מהצמתים האלה מכיל את הצמתים ההתנהגותיים שמגדירים את האוטומציה.

לדוגמה, זרימה רציפה עשויה להכיל צמתים שמופעלים בסדר רציף. בדרך כלל אלה יהיו התחלה, תנאי ופעולה.

תהליכי עבודה לביצוע רציף
איור 1: תהליך אוטומטי רציף

בזרימה מקבילית יכולים להיות כמה צמתי פעולה שמופעלים בו-זמנית, כמו הדלקה של כמה אורות בו-זמנית. צמתים שמופיעים אחרי זרימה מקבילית לא יופעלו עד שכל הענפים של הזרימה המקבילית יסתיימו.

תהליכי עבודה מקבילים
איור 2: זרימת אוטומציה מקבילית

סוג נוסף של תהליך ביצוע הוא תהליך מותנה, שיכול לשנות את תהליך הביצוע על סמך הערכה של ביטוי.

לדוגמה, יכול להיות שיש לכם פעולות אוטומטיות שמבצעות פעולה על סמך השאלה אם הלילה ירד. צומת של תנאי בודק את השעה ביום, ואז פועל לפי נתיב הביצוע המתאים על סמך הבדיקה הזו.

זרימת התנאי
איור 3: תהליך מותנה

תהליך בחירה שימושי כשרוצים להגדיר יותר מסימן אחד לתחילת פעולה שיכול להפעיל את האוטומציה. כשמקיפים שני סימנים או יותר לתחילת פעולה בתהליך select, כל אחד מהסימנים יכול להפעיל את האוטומציה.

לדוגמה, אפשר לכתוב אוטומציה שמורידה את התריסים בשקיעה, אם הטמפרטורה עולה מעל סף מסוים או אם הבהירות עולה מעל סף מסוים. שלושה סימנים נפרדים לתחילת פעולה מטפלים בכל אחד מהתרחישים האלה, וכל השלושה יהיו עטופים בזרימת select.

בחירת תהליך
איור 4: בחירת זרימה

תהליכי עבודה מוטמעים

באוטומציות מורכבות, אפשר גם להשתמש בצמתים של זרימת ביצוע בתוך צמתים אחרים. לדוגמה, יכולה להיות זרימה עוקבת שמבצעת זרימה מקבילה.

תהליכי ביצוע מוטמעים
איור 5: תהליכי ביצוע מוטמעים

אפשר להציב צמתי DSL בתוך צמתים אחרים ולשלב ביניהם בדרכים שונות כדי להתאים אותם לצרכים הספציפיים שלכם, בהתאם למגבלות שמפורטות בטבלה הבאה. הקישור בעמודה Builder מוביל לתיעוד של Kotlin בנושא Builder בטוח לסוגים, שבו מפורט מה מותר לשימוש בכל סוג של צומת.

טבלה: איך אפשר לשלב צמתים
צומת יכול להכיל את סוג הצומת והנתונים הבאים התאריך חייב להיות בטווח של אחד מסוגי הצמתים הבאים
Starter ביטוי בחירה באפשרות 'עוקב'
ManualStarter בחירה באפשרות 'רציף'
StateReader ביטוי (בדרך כלל כולל ערך מאפיין של מאפיין) פעולה, תנאי
פעולה פקודה, ישות, ביטוי מקבילי, בחירה, עוקב
ברצף מקבילי, בחירה, עוקב
מקביל פעולה לפי הסדר
Condition ביטוי מקבילי, רציף
בחירה תנאי, רציף, נקודת התחלה, הפעלה ידנית רציף, וחייב להיות הצומת הראשון בתהליך

Automation DSL

בממשקי ה-API של Home, פעולות אוטומטיות מוגדרות באמצעות Automation DSL (שפה ספציפית לתחום). ‏ Automation 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.