יסודות השפה

הסבר על 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

ערכים מרובים

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

  1. לפעולה אוטומטית יכולים להיות כמה starters ולכן הסימן הראשון לתחילת פעולה מתחיל במקף וברווח.
  2. ל-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 Struct, שמגדיר ארבעה שדות:

Key סוג תיאור

name

מחרוזת

אופציונלי.

שם האוטומציה.

המידע הזה לא גלוי למשתמשים, הוא מיועד רק למפתחים.

starters

[Starter]

חובה.

רשימה של התחלות שיחה.

condition

מצב

אופציונלי.

תנאי.

actions

[Action]

חובה.

רשימה של פעולות.

בקטע Reference מוצגות הגדרות סכימה לכל המבנים הזמינים.

שמות המפתחות הם ייחודיים בתוך מבנה נתונים מסוים, והם תלויי אותיות רישיות.

סוגי הערכים האפשריים הם:

  • סוג פרימיטיבי: bool,‏ number,‏ string,‏ time וכו'.
  • סוג Struct: אוסף של שדות.
  • מערך של סוג הנתונים. מערך מסומן על ידי []. לדוגמה, [string] הוא מערך של מחרוזות, ו-[Starter] הוא מערך של מבני נתונים מסוג Starter.
  • סוגים מיוחדים אחרים: Entity, ‏ FieldPath.

התיאור של כל שדה מכיל מידע חשוב, כולל:

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

Typed Struct

מבנים מסוימים יכולים לייצג סימנים לתחילת פעולה שמבוססים על לוח זמנים או על שינוי במצב המכשיר. לכל סוג של 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 הוא מבנה מוקלד, שמוכלל על ידי מבני צאצא אחרים ב-Field‏ type, כמו time.schedule או device.state.OnOff, כדי לספק פונקציות שונות. גם המבנים condition ו-action הם מוקלדים.

שדות נוספים ב-Struct צריכים להיות בהתאם למפרט של ה-Struct המשני (type). לדוגמה, אם משתמשים ב-device.state.OnOff כ-type, רק השדותשצוינו עבור הסוג הזה והשדה תקפים במבנה 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

פרימיטיבי

סוגי הנתונים הפרימיטיביים הבאים נתמכים בסכימת הסקריפט של האוטומציות:

בוליאני

  • true
  • false

מספר

מספר שלם או מספר עשרוני

מחרוזת

טקסט רגיל

אין צורך להוסיף מרכאות למחרוזות, אלא במקרים ספציפיים.

תאריך

חודש ויום. הפורמט הוא MM-DD או MM/DD.

  • 09/01
  • 09-01

שעה

השעה ביום. יכול להיות שזה יהיה זמן שעון או זמן שמש. לגבי השעה, אפשר להשתמש בפורמט AM/PM או בפורמט של 24 שעות. השניות הן אופציונליות. בזמן השמש, sunrise ו-sunset הן מילות מפתח, ואפשר להוסיף להן היסט (במונחים של משך).

  • 12:30 am
  • 13:00:01
  • sunrise / sunset
  • sunset+30min / sunset-1hour

DateTime

שנה, חודש, יום ושעה ביום. צריך להוסיף רווח בין החלק של התאריך לבין החלק של השעה. פורמט התאריך הוא YYYY-MM-DD או YYYY/MM/DD. פורמט השעה זהה לפורמט של [Time](#time). אזור הזמן לא נתמך.

  • 2022/01/01 14:00
  • 2022-12-31 sunrise+30min

יום חול

  • MONDAY (או MON)
  • TUESDAY (או TUE)
  • WEDNESDAY (או WED)
  • THURSDAY (או THU)
  • FRIDAY (או FRI)
  • SATURDAY (או SAT)
  • SUNDAY (או SUN)

משך

תקופת זמן.

  • 30min
  • 1hour
  • 20sec
  • 1hour10min20sec

ColorHex

קוד הקסדצימלי בן שש ספרות שמייצג צבע.

אין # בתחילת המספר.

  • FFFFFF
  • B5D2A1
  • DFA100

טמפרטורה

נתונים של טמפרטורה רגילה. תמיד מוסיפים 'C' או 'F' לערך כדי לציין מדידת טמפרטורה.

  • 20.5C
  • 90F

ColorTemperature

טמפרטורת צבע בקלווין.

  • 5000K

משתמש

כתובת האימייל של המשתמש.

צבע

אפשר לציין צבעים באחת משלוש דרכים – באמצעות טיפוסי הנתונים הפרימיטיביים 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

יכול להיות שיידרשו כמה רמות כדי להגיע לפריט הנדרש ב-FieldPaths אחרים, והפורמט שונה בין starter לבין action.

ההתחלות מופיעות בסימון נקודות, והנתיב כולו מופיע באותו השדה. הפעולה הזו מתבצעת בעיקר למטרות השוואה בלוגיקה של סימנים לתחילת פעולה. לדוגמה, כדי להשתמש בטמפרטורת הצבע כהתחלה, צריך להשתמש ב-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