מושגי Android DSL

כאן מופיעה סקירה כללית של המושגים הבסיסיים של Automation DSL ב-Android.

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

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

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

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

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

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

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

צמתים

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

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

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

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

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

צמתים של תהליך הביצוע

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

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

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

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

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

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

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

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

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

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

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

תהליך if-then-else (IfFlow) מאפשר להפעיל תנאים מסתעפים בתוך אוטומציה. בניגוד לצומת condition, שעוצר את כל תהליך האוטומציה אם התנאי הוא false, תהליך if-then-else מבצע פעולות ספציפיות באופן מותנה כשהתנאי מתקיים, ויכול לחזור לתנאים חלופיים או לפעולות חלופיות, או להמשיך לצמתים הבאים באוטומציה. למידע נוסף, קראו את המאמר הפעלה מותנית.

תהליכים בתוך תהליכים

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

תהליכי ביצוע בתצוגת עץ
איור 5: תהליכי ביצוע בתצוגת עץ

אפשר להטמיע צומתי 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.