המדריך הבא יעזור לכם להבין איך אפשר להשתמש בצמתים שונים של Automation DSL כדי ליצור אוטומציה.
כל ה-DSL של האוטומציה ממוקם בתוך צומת automation יחיד. הצומת automation יוצר את הגבול בין ההקשר החיצוני של שפת Swift לבין ההקשר של ה-DSL המוטמע.
תהליך עבודה עוקב
הזרימה העוקבת היא סוג ברירת המחדל של תהליך אוטומציה.
הנה תבנית בסיסית מאוד של שפת תיאור אוטומציה (Automation DSL) שמשתמשת בזרימה רציפה שכוללת סימן לתחילת פעולה, תנאי ופעולה:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
אפשר לשפר את התוצאה על ידי הוספת צמתים נוספים.
מתחילים
צמתי התחלה מגדירים את הנסיבות הראשוניות שמפעילות אוטומציה. לדוגמה, שינוי במצב או בערך. לכל פעולה אוטומטית צריך להיות לפחות סימן לתחילת פעולה אחד, אחרת האימות ייכשל. כדי להוסיף יותר מסימן לתחילת פעולה אחד לפעולות אוטומטיות, צריך להשתמש בצומת select.
חבילת התחלה שמבוססת על מאפיין של תכונה
כשמצהירים על צומת התחלתי שמבוסס על מאפיין trait, מציינים:
- המכשיר
- סוג המכשיר שאליו שייך המאפיין
- המאפיין
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
פרמטר סוג המכשיר הוא חובה כי הוא מאפשר לכם לציין את סוג המכשיר בתוך מכשיר שאליו מתייחסת האוטומציה. לדוגמה, מכשיר יכול להיות מורכב מ-FanDeviceType ומ-HeatingCoolingUnitDeviceType, שניהם מכילים את המאפיין OnOffTrait. כשמציינים את סוג המכשיר, אין עמימות לגבי החלק במכשיר שמפעיל את האוטומציה.
חבילת Starter על סמך אירוע
כשמגדירים צומת התחלה שמבוסס על אירוע, צריך לציין:
- המכשיר
- סוג המכשיר שאליו שייך המאפיין
- האירוע
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
סימן לתחילת פעולה שמבוסס על מבנה ואירוע, עם פרמטרים
חלק מהאירועים יכולים לכלול פרמטרים, ולכן צריך לכלול גם את הפרמטרים האלה בקוד ההתחלה.
לדוגמה, סימן תחילת הפעולה הזה משתמש ב-TimeTrait של ScheduledEvent כדי להפעיל את הפעולות האוטומטיות בשעה 7:00 בבוקר:
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
סימן לתחילת פעולה על סמך מזג האוויר
אתם יכולים לציין תנאי מזג אוויר נוכחיים או צפויים בסימן לתחילת פעולה, באמצעות המאפיין Weather:
let weatherState = starter<_>(structure, trait = Weather)
אפשר לראות את הדוגמה Close the blinds if it is likely to rain (סגירת התריסים אם צפוי גשם) בדף Example automations (דוגמאות לאוטומציות).
סימן לתחילת פעולה ידני
סימן לתחילת פעולה ידני הוא סוג מיוחד של סימן לתחילת פעולה שמאפשר למשתמש להפעיל את הפעולות האוטומטיות באופן ידני.
כשמגדירים סימן ידני לתחילת פעולה:
- אל תציינו תכונה או סוג מכשיר.
- מספקים רכיב בממשק המשתמש שקורא ל-
Automation.execute().
כשמציבים הפעלה ידנית בתהליך select יחד עם הפעלה אחרת, ההפעלה הידנית מבטלת את ההפעלה האחרת:
select {
manualStarter()
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
}
חשוב לזכור שכל condition צומת אחרי סימן לתחילת פעולה ידני ייבדק,
ויכול לחסום את הרצה של הפעולות האוטומטיות, בהתאם לcondition
ביטוי.
אחת הדרכים להגדיר את האוטומציה כך שצמתי condition לא יחסמו אוטומציה שהופעלה באמצעות סימן לתחילת פעולה ידני היא להציב את סימן לתחילת הפעולה האחר בתהליך רציף נפרד יחד עם condition שלה:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
select {
sequential {
starter(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
הפניה לערך של מאפיין
כדי להשתמש בערך של מאפיין בביטוי, משתמשים בתחביר הבא.
עם stateReader:
typealias TimeTrait = Google.TimeTrait
let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime
עם starter:
typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait
let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
צמתי תנאים וביטויים
צומת של תנאי מייצג נקודת החלטה שקובעת אם האוטומציה תימשך או לא. באוטומציה יכולים להיות כמה צמתים (nodes) של condition.
אם הביטוי של צומת condition כלשהו מחזיר את הערך false, ההרצה של כל הפעולות האוטומטיות מסתיימת.
בצומת condition, אפשר לשלב כמה קריטריונים של תנאים באמצעות אופרטורים שונים, כל עוד הביטוי מוערך לערך בוליאני יחיד. אם הערך שמתקבל הוא true, התנאי מתקיים והאוטומציה ממשיכה להפעיל את הצומת הבא. אם התאריך הוא false, האוטומציה מפסיקה לפעול בנקודה הזו.
הביטויים מורכבים באופן דומה לביטויים ב-Swift, והם יכולים להכיל ערכים פרימיטיביים כמו מספרים, תווים, מחרוזות וערכים בוליאניים, וגם ערכי Enum. קיבוץ של ביטויי משנה באמצעות סוגריים מאפשר לכם לשלוט בסדר שבו הם מוערכים.
דוגמה ל-condition שמשלב כמה ביטויי משנה לביטוי אחד:
condition {
let exp1 = starterNode.lockState.equals(.unlocked)
let exp2 = stateReaderNode.lockState.equals(true)
let exp3 = occupancySensingDevice.occupied.notEquals(0)
(exp1.and(exp2)).or(exp3)
}
אפשר להפנות לערך של מאפיין שהגישה אליו מתבצעת דרך starter:
typealias OnOffTrait = Matter.OnOffTrait
let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
דרך נוספת להפניה לערכי מאפייני מאפיינים בצומת condition היא באמצעות צומת stateReader.
כדי לעשות את זה, קודם צריך לתעד את ערך מאפיין המאפיין בצומת stateReader. הפונקציה stateReader מקבלת את structure ואת המאפיין כארגומנטים:
typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait
let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)
לאחר מכן, מפנים אל stateReader בצומת condition:
condition {
filterMonitoringState.changeIndication.equals(.warning)
}
אפשר להשתמש בכמה תנאים stateReaders בצומת condition באמצעות אופרטורים להשוואה ואופרטורים לוגיים:
typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait
let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
let exp1 = armState.armState
let exp2 = doorLockState.lockState
exp1.and(exp2)
}
משך התנאי
בנוסף לביטוי בוליאני בתנאי, אפשר לציין לוח זמנים שבמהלכו הביטוי צריך להיות נכון כדי שהאוטומציה תפעל. לדוגמה, אפשר להגדיר תנאי שמופעל רק אם האור דולק במשך עשר דקות.
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
משך הזמן יכול להיות בין דקה אחת ל-30 דקות.
צמתי פעולה
בצומת הפעולה מתבצעת העבודה של האוטומציה.
בדוגמה הזו, הפעולה מפעילה את הפקודה AssistantBroadcastTrait's
broadcast():
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}