ทําความเข้าใจ YAML
YAML เป็นภาษายอดนิยมที่ใช้ระบุการกำหนดค่าซอฟต์แวร์ ซึ่งแสดงข้อมูลที่มีโครงสร้างได้อย่างชัดเจนและมนุษย์อ่านได้ ต่อไปนี้คือข้อมูลเบื้องต้นบางประการที่คุณจําเป็นต้องเข้าใจเกี่ยวกับ YAML ก่อนที่จะสร้างระบบการทำงานอัตโนมัติที่ใช้สคริปต์รายการแรก ดูข้อมูลเพิ่มเติมเกี่ยวกับ YAML โดยทั่วไปได้ที่ข้อกำหนดของเวอร์ชัน 1.1
คู่คีย์-ค่า
เอกสาร YAML โดยทั่วไปคือคอลเล็กชันคู่คีย์-ค่า ในตัวอย่างนี้ คีย์คือ name
และค่าคือ TV on lights off
คีย์และค่าจะคั่นด้วยโคลอนตามด้วยการเว้นวรรค ต้องใช้อักขระทั้ง 2 รายการเพื่อให้ 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
คือรายการคู่คีย์-ค่า 2 คู่ (name
และ description
)
metadata:
name: TV on lights off
description: Turn off lights when TV turns on
การเยื้อง
YAML ใช้การเยื้องเพื่อระบุโครงสร้าง ในตัวอย่างก่อนหน้านี้ name
และ
description
มีการเยื้อง (โดยการเว้นวรรค 2 ช่อง) เพื่อระบุว่าเป็นรายการย่อยของคีย์ metadata
การเยื้องต้องเป็นไปตามข้อกำหนดอย่างเคร่งครัดใน YAML โครงสร้างย่อยต้องมีการเยื้องมากกว่าโครงสร้างหลัก และคู่คีย์-ค่าในระดับเดียวกันต้องมีการเยื้องเดียวกัน
metadata:
name:
en: TV on lights off
description:
en: Turn off lights when TV turns on
หลายค่า
หากคีย์หนึ่งๆ มีหลายค่า ระบบจะแสดงค่าแต่ละค่าในบรรทัดใหม่ โดยแต่ละบรรทัดจะขึ้นต้นด้วยขีดกลางและเว้นวรรค ในตัวอย่างต่อไปนี้ มีรายการ 2 รายการดังนี้
- การทำงานอัตโนมัติอาจมี
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.
สคริปต์การทำงานอัตโนมัติ
ข้อกําหนดสําหรับไวยากรณ์สคริปต์การทํางานอัตโนมัติเรียกว่าสคีมา
สคีมาการทำงานอัตโนมัติจะกำหนดโครงสร้างข้อมูล 2 รายการดังนี้
- คู่คีย์-ค่าเดี่ยวเรียกว่าช่อง
- คอลเล็กชันช่องที่กําหนดโดยสคีมาเรียกว่า Struct
โครงสร้าง
ภาษาสคริปต์การทำงานอัตโนมัติจะกำหนด "บล็อก" หรือโครงสร้างข้อมูลมาตรฐานหลายรายการ ซึ่งเรียกว่า Structs
มาดู automation
Struct ซึ่งกำหนดช่อง 4 ช่อง ได้แก่
คีย์ | ประเภท | คำอธิบาย |
---|---|---|
|
ไม่บังคับ ชื่อการทำงานอัตโนมัติ ซึ่งไม่ได้แสดงต่อผู้ใช้ แต่มีไว้สำหรับนักพัฒนาแอปเท่านั้น |
|
|
[Starter] |
ต้องระบุ รายการเงื่อนไขเริ่มต้น |
|
ไม่บังคับ สภาพ |
|
|
ต้องระบุ รายการการดำเนินการ |
ส่วน ข้อมูลอ้างอิง จะแสดงคำจำกัดความสคีมาสำหรับ Struct ทั้งหมดที่ใช้ได้
ชื่อคีย์ต้องไม่ซ้ำกันภายใน Struct หนึ่งๆ และคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
ประเภทค่าที่เป็นไปได้มีดังนี้
- ประเภทพื้นฐาน: bool, ตัวเลข, สตริง, เวลา และอื่นๆ
- ประเภท Struct: ชุดฟิลด์
- อาร์เรย์ของประเภทข้อมูล อาร์เรย์จะแสดงด้วย
[]
เช่น[string]
คืออาร์เรย์สตริง และ[Starter]
คืออาร์เรย์ของสตรูคเจอร์เงื่อนไขเริ่มต้น - ประเภทพิเศษอื่นๆ: เอนทิตี, FieldPath
คําอธิบายของช่องแต่ละช่องจะมีข้อมูลสําคัญต่อไปนี้
- ต้องระบุหรือไม่บังคับ ซึ่งระบุว่าช่องต้องระบุหรือไม่หรือข้ามได้
- การพึ่งพาฟิลด์ เฉพาะช่องที่ไม่บังคับเท่านั้นที่มีข้อมูลพึ่งพา ข้อมูลนี้อธิบายการตรวจสอบเพิ่มเติมเมื่อใช้ฟิลด์นี้ เช่น ใช้ฟิลด์ B เฉพาะในกรณีที่ตั้งค่าฟิลด์ A หรือเมื่อใช้ฟิลด์ A อย่าตั้งค่าฟิลด์ B หรือฟิลด์ C
- ค่าที่เป็นไปได้ เช่น ชุดค่าที่จำกัดของช่อง Enum ประเภทสตริง หรือช่วงตัวเลขที่อาจใช้ในช่องประเภทตัวเลข
โครงสร้างที่มีการจัดประเภท
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 ที่มีประเภท ซึ่งขยายโดย Struct ย่อยอื่นๆ ในช่อง type
เช่น time.schedule
หรือ device.state.OnOff
เพื่อให้บริการฟังก์ชันต่างๆ โครงสร้าง condition
และ action
เป็นแบบมีการกำหนดประเภทด้วย
ช่องเพิ่มเติมใน 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) ไม่รองรับเขตเวลา
|
ตั๋ววันธรรมดา |
|
ระยะเวลา |
ระยะเวลา
|
ColorHex |
รหัสเลขฐานสิบหก 6 หลักที่ใช้แทนสีหนึ่งๆ จะไม่มี
|
อุณหภูมิ | ข้อมูลอุณหภูมิปกติ เติม
|
ColorTemperature |
อุณหภูมิสีในหน่วยเคลวิน
|
สี
คุณระบุสีได้ 3 วิธี ได้แก่ การใช้ประเภทพื้นฐาน ColorHex หรือ ColorTemperature หรือประเภทคอมโพเนนต์ SpectrumHSV
SpectrumHSV
ประเภท SpectrumHSV จะระบุสีโดยใช้ช่องตัวเลข 3 ช่อง ได้แก่
- 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
รูปแบบสตริงพิเศษที่ใช้เพื่อค้นหาข้อมูลบางส่วนในเพย์โหลดข้อมูล ในตัวอย่างต่อไปนี้ 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