הסבר על YAML
YAML היא שפה פופולרית לציון הגדרות התוכנה. היא מספקת דרך ברורה וקריאה אנושית לייצוג מידע מובנה. יש כמה דברים בסיסיים שצריך להבין לגבי YAML לפני שיוצרים סקריפטים לפעולות אוטומטיות. מידע נוסף על YAML באופן כללי זמין במפרט של גרסה 1.1.
צמדי מפתח/ערך
מסמכי YAML הם בעצם אוסף של צמדי מפתח/ערך. בדוגמה הבאה, המפתח הוא name
והערך הוא TV on lights off
. המפתח והערך מופרדים בנקודתיים, ואחריהם רווח. שני התווים נדרשים ל-YAML בפורמט תקין.
name: TV on lights off
ערכים
הערך המשויך למפתח יכול להיות בסיסי כמו מחרוזת, מספר או תאריך, או מורכב כמו אוסף אחר של צמדי מפתח/ערך.
מחרוזת
אם ערך מחרוזת מתחיל באחד מהתווים הבאים: [
, {
, "
, '
או #
, או שהמחרוזת מכילה :
(נקודתיים ואחריה רווחים), צריך להקיף אותה.
ניתן להשתמש גם במירכאות יחידות וגם במירכאות כפולות, אבל המירכאות הסוגרות צריכות להתאים לגרש הפותח.
ציטוט נכון:
name: 'TV on lights off'
name: "TV on lights off"
ציטוט שגוי (מירכאות לא תואמות):
name: 'TV on lights off"
לא חובה להוסיף מירכאות לכל סוגי המחרוזות האחרים.
אם אתם צריכים מחרוזת מרובת שורות, עיינו בקטע של מפרט YAML בנושא סקלרים מרובי שורות.
name: "[1] TV"
name: '{1} TV'
name: '#TV'
name: '"1" TV'
name: "'1' TV"
name: "\"1\" TV"
name: "TV: bedroom"
צמדי מפתח/ערך מקוננים
כאן הערך של המפתח metadata
הוא רשימה של שני צמדי מפתח/ערך (name
ו-description
):
metadata:
name: TV on lights off
description: Turn off lights when TV turns on
כניסת פיסקה
הפונקציה YAML משתמשת בכניסת פיסקה כדי לציין מבנה. בדוגמה הקודמת, name
ו-description
כניסות (בשני רווחים) כדי לציין שאלו הם הצאצאים של המפתח metadata
.
כניסת הפיסקה מחמירה ב-YAML. למבנה צאצא חייבת להיות כניסה עמוקה יותר מזו של ההורה, ולצמדים של מפתח/ערך ברמה זהה חייבת להיות אותה כניסה.
metadata:
name:
en: TV on lights off
description:
en: Turn off lights when TV turns on
ערכים מרובים
אם למפתח נתון יש כמה ערכים, כל ערך מופיע בשורה חדשה וכל שורה מתחילה, מקף ורווח. בדוגמה הבאה יש שתי רשימות:
- פעולה אוטומטית יכולה לכלול כמה
starters
, ולכן הסימן הראשון לתחילת פעולה מתחיל במקף וברווח. - בשדה
weekday
יכולים להיות כמה ערכים, ולכן כל ערך מוחרג עוד יותר ומתחיל במקף וברווח.
starters:
- type: time.schedule
at: SUNSET
weekday:
- MONDAY
- THURSDAY
state: on
תגובות
טקסט שמופיע אחרי #
נחשב כתגובה, ומנוע האוטומציה מתעלם ממנו.
שורה שמתחילה ב-#
היא הערה.
ייתכן שהתגובה תופיע באותה השורה שבה מופיע תוכן הסקריפט, אבל חובה להוסיף רווח לפני השדה #
.
# This is a comment. It will be ignored.
name: chromecast #This is a TV.
סקריפט אוטומציה
המפרט של תחביר הסקריפט 'פעולות אוטומטיות' נקרא סכימה.
הסכימה של האוטומציות מגדירה כמה מבני נתונים:
- צמד מפתח/ערך יחיד נקרא שדה.
- אוסף של שדות שמוגדרים על ידי הסכימה נקרא Struct.
Struct
שפת הסקריפט של האוטומציה מגדירה כמה 'בלוקים' או מבני נתונים סטנדרטיים, שנקראים Structs.
כדאי לבדוק את המבנה automation
, שמגדיר ארבעה שדות:
מפתח | סוג | תיאור |
---|---|---|
|
זה שינוי אופציונלי. השם של הפעולה האוטומטית. לא מוצג למשתמשים, הוא מיועד למפתחים בלבד. |
|
|
[Starter] |
חובה. רשימה של סימנים לתחילת פעולה. |
|
זה שינוי אופציונלי. תנאי. |
|
|
[פעולה] |
חובה. רשימה של פעולות. |
הקטע קובץ העזר מספק הגדרות של סכימה לכל ה-Structs הזמינים.
שמות המפתחות הם ייחודיים בתוך Struct נתון והם תלויי אותיות רישיות.
סוגי הערכים האפשריים:
- טיפוס פרימיטיבי: בוליאני, מספר, מחרוזת, זמן וכן הלאה.
- סוג Struct: אוסף של שדות.
- מערך של סוג הנתונים. המערך מסומן על ידי
[]
. לדוגמה,[string]
הוא מערך של מחרוזות ו-[Starter]
הוא מערך של Structs למתחילים. - סוגים מיוחדים אחרים: Entity, FieldPath.
התיאור של כל שדה מכיל מידע חשוב, כולל:
- שדה חובה לעומת אופציונלי, שמציין אם השדה הוא חובה או אם אפשר לדלג עליו.
- תלות של שדה. רק לשדות אופציונליים יש יחסי תלות. תיאור זה מתאר את הבדיקות הנוספות כשמשתמשים בשדה הזה, כמו יש להשתמש בשדה ב' רק אם מוגדר שדה א' או כשמשתמשים בשדה א', אין להגדיר את שדה ב' או את שדה ג'.
- ערכים אפשריים. לדוגמה, קבוצת הערכים המוגבלת של מחרוזת סוג של שדה Enum, או טווח של מספרים שאפשר להשתמש בהם בשדה Field of type.
מבנה מוקלד
חלק מהסטרקטורים יכולים לייצג סימנים לתחילת פעולה על סמך לוח זמנים או שינוי במצב המכשיר. כל סוג של starter
חייב לספק קבוצה ייחודית של שדות.
# A time schedule starter.
starter:
type: time.schedule
at: 10:00
# A device state change starter.
starter:
type: device.state.OnOff
device: TV - Living Room
state: on
is: true
starter
הוא מבנה מוקלד, שהורחב על ידי מבני צאצא אחרים בשדה type
, כמו time.schedule
או device.state.OnOff
, כדי לספק פונקציות שונות. מתבצע גם הקלדה של המבנים condition
ו-action
.
שדות נוספים ב-Struct צריכים להתאים למפרט הצאצא של Struct (type
). לדוגמה, כשמשתמשים ב-device.state.OnOff
בתור type
, רק
השדותהשדות שצוינו לסוג הזה
חוקיים
ב-Struct הזה של starter
.
Array
ב-YAML, מערך ערכים מתחיל ב--
(מקף ואחריו רווח). המערך יכול להכיל כמה ערכי Struct או כמה ערכים פרימיטיביים. עם זאת, הערכים במערך חייבים להיות מאותו סוג.
כשהמערך מכיל פריט יחיד, אפשר להשמיט את המקף והרווח:
# The starters field accepts an array of Starter Structs.
# This is the standard format.
starters:
- type: time.schedule
at: sunset
- type: time.schedule
at: sunrise
# The dash can be omitted if the array only has one item.
# This is also valid.
starters:
type: time.schedule
at: sunset
מערכים רב-ממדיים, כמו [[1, 2], [3, 4]]
, לא נתמכים בסקריפטים של אוטומציה. מנתח השפה ישטח מערך רב-ממדי באופן אוטומטי למערך חד-ממדי, במקרה הזה, [1, 2, 3, 4]
.
# INVALID: multi-dimensional array
- - 1
- 2
- - 3
- 4
פרימיטיבי
סכימת הסקריפטים האוטומטית תומכת בסוגי הנתונים הפרמיטיביים הבאים:
בוליאני |
|
מספרים |
מספר שלם או מספר עשרוני |
מחרוזת |
טקסט פשוט אין צורך לצטט מחרוזות, למעט במקרים ספציפיים. |
תאריך |
חודש ויום. הפורמט הוא MM-DD או MM/DD.
|
שעה |
השעה ביום. ניתן לציין את השעה בשעון או שעון סולארי.
אפשר לציין את השעה בפורמט AM/PM או בפורמט 24H. שניות
הן אופציונליות.
בזמן סולארי,
|
DateTime |
שנה, חודש, יום ושעה ביום. נדרש רווח לבן בין החלק 'תאריך' לחלק 'שעה'. פורמט התאריך הוא YYYY-MM-DD או YYYY/MM/DD. פורמט השעה זהה לערך [שעה](#time). אזור הזמן אינו נתמך.
|
יום חול |
|
משך הקורס |
תקופת זמן מסוימת.
|
ColorHex |
קוד הקסדצימלי בן 6 ספרות שמייצג צבע. אין
|
טמפרטורה | נתוני טמפרטורה רגילים. צריך תמיד להוסיף
|
ColorTemperature |
טמפרטורת הצבע בקלווין.
|
צבע
אפשר לציין את הצבעים באחת משלוש דרכים – באמצעות הסוגים הפרימיטיביים ColorHex או ColorTemperature, או באמצעות הסוג המורכב SpectrumHSV.
SpectrumHSV
הסוג SpectrumHSV מציין צבע באמצעות שלושה שדות מספריים:
- Hue מייצג את אורך הגל של הצבע.
- רוויה מציינת את עוצמת הצבע.
- ערך מציין את הבהירות או הכהות היחסית של הצבע.
דינמית
לפעמים סוג הנתונים של מפתח לא קבוע. הוא יכול להיות אחד מהסוגים הפרימיטיביים, על סמך הערכים משדות אחרים.
דוגמה לשדה מסוג נתונים דינמי: is
. הסוג בפועל נקבע לפי הערכים של השדה type
ושל השדה state
.
# The 'is' field accepts a number type.
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 1
# The 'is' field accepts a boolean type.
type: device.state.OnOff
device: My TV - Living Room
state: on
is: false
ישות
פורמט מחרוזת מיוחד, שמשמש לזיהוי ייחודי של ישות בבעלות משתמש, כמו מכשיר או חדר.
'מכשיר' הוא הישות הנפוצה ביותר שנעשה בה שימוש ב'פעולות אוטומטיות'. הפורמט של מחרוזת הישות הוא device name - room name
.
# The device field accepts a Device Entity type.
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 1
FieldPath
פורמט מחרוזת מיוחד המשמש לאיתור קטע נתונים במטען ייעודי (payload) של נתונים. בדוגמה הבאה, currentVolume
הוא FieldPath עבור השדה state
.
# The state field accepts a FieldPath type.
starters:
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 5
ב-FieldPath אחרים עשויים להידרש כמה רמות כדי להגיע לפריט הנדרש, והפורמט שונה בין הסימן לתחילת פעולה לבין הפעולה.
המתחילים משתמשים בסימון נקודה, כאשר כל הנתיב מופיע באותו שדה. הפעולה הזו מתבצעת בעיקר למטרות השוואה בלוגיקה למתחילים. לדוגמה, כדי להשתמש בטמפרטורת הצבע בתור סימן לתחילת פעולה, משתמשים בפונקציה color.colorTemperature
למצב:
starters:
- type: device.state.ColorSetting
device: My Device - Room Name
state: color.colorTemperature
is: 2000K
לעומת זאת, בפעולות נעשה שימוש בשדות מקננים. כדי לשנות את צבע הנורה לכחול, במקום color.name
ו-is: blue
, צריך לבצע את הפעולות הבאות:
actions:
- type: device.command.ColorAbsolute
devices: My Device - Room Name
color:
name: blue