הסבר על 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.
סקריפט אוטומציה
המפרט של תחביר הסקריפטים של Automations נקרא סכימה.
הסכימה של האוטומציות מגדירה כמה מבני נתונים:
- צמד מפתח/ערך יחיד נקרא שדה.
- אוסף של שדות שמוגדרים על ידי הסכימה נקרא Struct.
Struct
שפת הסקריפטים של האוטומציה מגדירה כמה 'בלוקים' רגילים או מבני נתונים, שנקראים Structs.
עיינו ב-Struct automation
, שמגדיר ארבעה שדות:
מפתח | סוג | תיאור |
---|---|---|
|
זה שינוי אופציונלי. השם של האוטומציה. המידע הזה לא מוצג למשתמשים, והוא מיועד למפתחים בלבד. |
|
|
[Starter] |
חובה. רשימה של התחלות. |
|
זה שינוי אופציונלי. תנאי. |
|
|
[פעולה] |
חובה. רשימה של פעולות. |
בקטע Reference מוצגות הגדרות הסכימה לכל ה-Structs הזמינים.
שמות המפתחות הם ייחודיים בתוך Struct נתון, והמערכת מבחינה בין אותיות רישיות לאותיות רגילות.
סוגי הערכים האפשריים הם:
- סוג פרימיטיבי: bool, number, string, time וכו'.
- סוג Struct: אוסף של שדות.
- מערך של סוג הנתונים. המערך מסומן ב-
[]
. לדוגמה,[string]
הוא מערך של מחרוזות ו-[Starter]
הוא מערך של Starter Structs. - סוגים מיוחדים אחרים: Entity, FieldPath.
בתיאור של כל שדה מופיע מידע חשוב, כולל:
- חובה או אופציונלי, כדי לציין אם השדה הוא חובה או שאפשר לדלג עליו.
- תלות בשדה. רק לשדות אופציונליים יש יחסי תלות. כאן מתוארות הבדיקות הנוספות שמתבצעות כשמשתמשים בשדה הזה, כמו שימוש בשדה ב' רק אם שדה א' מוגדר או כשמשתמשים בשדה א', לא מגדירים את השדה ב' או את השדה ג'.
- ערכים אפשריים. לדוגמה, קבוצת הערכים המוגבלת של שדה Enum מסוג מחרוזת, או טווח של מספרים שאפשר להשתמש בהם בשדה מסוג מספר.
Struct מוגדר
חלק מה-Structs יכולים לייצג אירועים להתחלת פעולה על סמך לוח זמנים או שינוי במצב המכשיר. כל סוג של 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
הוא מבנה נתונים (struct) עם טיפוס, שמורחב על ידי מבני נתונים אחרים (structs) של צאצאים בשדה type
, כמו time.schedule
או device.state.OnOff
, כדי לספק פונקציות שונות. גם המבנים condition
ו-action
הם מסוג Typed.
שדות נוספים ב-Struct חייבים לעמוד במפרט של Struct הצאצא (type
). לדוגמה, כשמשתמשים ב-device.state.OnOff
בתור type
, רקהשדות שצוינו לסוג הזה
הם חוקיים ב-Struct starter
.
מערך
ב-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](#time). אין תמיכה באזור זמן.
|
יום חול |
|
משך |
תקופת זמן.
|
ColorHex |
קוד הקסדצימלי בן שש ספרות שמייצג צבע. אין
|
טמפרטורה | נתוני טמפרטורה רגילים. תמיד מוסיפים את הערך
|
ColorTemperature |
טמפרטורת הצבע בקלווין.
|
צבע
אפשר לציין צבעים באחת משלוש דרכים – באמצעות הסוגים הפרימיטיביים ColorHex או ColorTemperature, או באמצעות הסוג המורכב SpectrumHSV.
SpectrumHSV
הסוג SpectrumHSV מציין צבע באמצעות שלושה שדות מספריים:
- הגוון תואם לאורך הגל של הצבע.
- הרוויה מציינת את עוצמת הצבע.
- ערך – מציין את הבהירות או החושך היחסיים של הצבע.
דינמית
לפעמים סוג הנתונים של מפתח לא קבוע. הוא יכול להיות אחד מהסוגים הפרימיטיביים, על סמך הערכים בשדות אחרים.
דוגמה לשדה מסוג נתונים דינמיים היא 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
פורמט מחרוזת מיוחד שמשמש לאיתור קטע נתונים בעומס הנתונים. בדוגמה הבאה, 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 ידרשו כמה רמות כדי להגיע לפריט הנדרש, והפורמט משתנה בין התחלה לפעולה.
ב-Starters נעשה שימוש בסימון נקודות, והנתיב כולו נמצא באותו שדה. הדבר נעשה בעיקר למטרות השוואה בלוגיקה של מודלים מוכנים. לדוגמה, כדי להשתמש בטמפרטורת הצבע בתור התחלה, צריך להשתמש ב-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