แนวคิดเกี่ยวกับ DSL

นี่คือภาพรวมของแนวคิดพื้นฐานของ Automation DSL

คอมโพเนนต์การทำงานอัตโนมัติ

ระบบอัตโนมัติประกอบด้วยคอมโพเนนต์พื้นฐานต่อไปนี้ ซึ่งมักจะได้รับการประเมินตามลําดับนี้

  1. เงื่อนไขเริ่มต้น - กำหนดเงื่อนไขเริ่มต้นที่เปิดใช้งานการทำงานอัตโนมัติ เช่น การเปลี่ยนแปลงลักษณะ การทำงานอัตโนมัติต้องมีเงื่อนไขเริ่มต้น
  2. เงื่อนไข — ข้อจำกัดเพิ่มเติมที่จะประเมินหลังจากเปิดใช้งานการทำงานอัตโนมัติ นิพจน์ในเงื่อนไขต้องประเมินเป็น true เพื่อให้การดําเนินการของการทำงานอัตโนมัติดําเนินการต่อ
  3. การดำเนินการ — คําสั่งหรือการอัปเดตสถานะที่ดำเนินการเมื่อตรงตามเงื่อนไขทั้งหมด

เช่น คุณอาจตั้งค่าการทำงานอัตโนมัติให้หรี่ไฟในห้องเมื่อทีวีในห้องนั้นเปิดอยู่ในช่วงพระอาทิตย์ตกถึงพระอาทิตย์ขึ้น ในตัวอย่างนี้

  1. เงื่อนไขเริ่มต้น — ทีวีเปิดอยู่ ซึ่งเป็นการเปลี่ยนแปลงสถานะของลักษณะทีวี
  2. เงื่อนไข - ระบบจะประเมินเวลาปัจจุบันของบ้านที่มีทีวีอยู่
  3. การดำเนินการ — หรี่ไฟในห้องเดียวกับทีวี

การทำงานอัตโนมัติจะเปิดใช้งานเมื่อทีวีในห้องเปิดอยู่ แต่การทำงานอัตโนมัติจะทำงานก็ต่อเมื่อตรงกับเงื่อนไข "เวลาอยู่ระหว่างพระอาทิตย์ตกและพระอาทิตย์ขึ้น" เท่านั้น

นอกจากโครงสร้างพื้นฐานแล้ว การทำงานอัตโนมัติใน Home API ยังมีข้อมูลเมตา เช่น ชื่อและคำอธิบาย ซึ่งสามารถใช้เพื่อระบุการทำงานอัตโนมัติสำหรับนักพัฒนาซอฟต์แวร์และผู้ใช้

โหนด

ใน Home API โครงสร้างเชิงตรรกะของการทำงานอัตโนมัติประกอบด้วยnodes โหนดคือหน่วยนามธรรมที่นํากลับมาใช้ซ้ำได้ ซึ่งแสดงถึงลักษณะการทํางานของเอนทิตีหรือขั้นตอนการดําเนินการ แต่ละโหนดอาจมีตัวแปรอินพุต รวมถึงตัวแปรเอาต์พุตที่โหนดอื่นๆ อาจใช้

ตาราง: ประเภทของโหนดการทำงานอัตโนมัติ
โหนด ประเภทโหนด การใช้งาน Kotlin คำอธิบาย
เงื่อนไขเริ่มต้น พฤติกรรม StarterNodeDsl เริ่มการทำงานอัตโนมัติเมื่อสถานะของลักษณะ (แอตทริบิวต์ใดก็ได้) เปลี่ยนแปลง
StateReader พฤติกรรม StateReaderNodeDsl อ่านแอตทริบิวต์ลักษณะและให้คุณบันทึกค่าของแอตทริบิวต์เพื่อใช้ในโหนดเงื่อนไข
การดำเนินการ พฤติกรรม ActionNodeDsl เรียกใช้คําสั่งลักษณะ
ตามลำดับ ขั้นตอนการดําเนินการ SequentialFlow เรียกใช้โหนดการดำเนินการที่ฝังตามลําดับ ซึ่งเป็นลักษณะการทํางานเริ่มต้น
Parallel ขั้นตอนการดําเนินการ ParallelFlow เรียกใช้โหนดการดำเนินการที่ฝังอยู่พร้อมกัน
Condition ขั้นตอนการดําเนินการ ConditionNodeDsl เปลี่ยนลำดับการดำเนินการแบบมีเงื่อนไขตามการประเมินนิพจน์เชิงตรรกะ เงื่อนไขอาจเชื่อมโยงกับเงื่อนไขเริ่มต้น (เงื่อนไขที่เจาะจงของเงื่อนไขเริ่มต้น) หรือเป็นเงื่อนไขส่วนกลาง (มีผลกับเงื่อนไขเริ่มต้นทั้งหมด)
เลือก ขั้นตอนการดำเนินการ SelectFlow อนุญาตให้เงื่อนไขเริ่มต้นมากกว่า 1 รายการเปิดใช้งานการทำงานอัตโนมัติ
นิพจน์ ค่า Expression อาจเป็นค่าของแอตทริบิวต์ คงที่ หรือค่าลิเทอรัลของลักษณะ และจะต้องประเมินเป็นลิสต์ ตัวเลข บูลีน หรือสตริง

โหนดพฤติกรรม

โหนด เช่น เงื่อนไขเริ่มต้นและการดําเนินการคือโหนดลักษณะการทํางาน เงื่อนไขเริ่มต้นจะเปิดใช้งานการทำงานอัตโนมัติตามการเปลี่ยนแปลงแอตทริบิวต์ของอุปกรณ์ การดำเนินการจะออกคำสั่งอุปกรณ์หรืออัปเดตแอตทริบิวต์

โดยปกติแล้วโหนดลักษณะการทำงานจะเชื่อมโยงกับลักษณะของอุปกรณ์และสถานะลักษณะเอาต์พุตเพื่อใช้เป็นอินพุตในโหนดอื่นๆ

โหนดลำดับการดำเนินการ

โหนดบางโหนดแสดงถึงขั้นตอนการดําเนินการ เช่น การดำเนินการตามลําดับและการดำเนินการพร้อมกัน โหนดแต่ละโหนดเหล่านี้มีโหนดลักษณะการทำงานที่กำหนดการทำงานอัตโนมัติ

เช่น ขั้นตอนตามลําดับอาจมีโหนดที่ทํางานตามลําดับ โดยปกติแล้ว เงื่อนไขเริ่มต้น เงื่อนไข และการดำเนินการ

ขั้นตอนการดําเนินการตามลําดับ
รูปที่ 1: ลำดับการทำงานอัตโนมัติ

ขั้นตอนขนานอาจมีโหนดการดำเนินการหลายรายการที่ทำงานพร้อมกัน เช่น การเปิดไฟหลายดวงพร้อมกัน โหนดตามเวิร์กโฟลว์แบบขนานจะไม่ทํางานจนกว่าสาขาทั้งหมดของเวิร์กโฟลว์แบบขนานจะเสร็จสิ้น

ขั้นตอนการดําเนินการแบบขนาน
รูปที่ 2: ขั้นตอนการทํางานอัตโนมัติแบบขนาน

ลำดับการดำเนินการอีกประเภทหนึ่งคือลำดับเงื่อนไข ซึ่งสามารถเปลี่ยนลำดับการดำเนินการตามการประเมินนิพจน์

ตัวอย่างเช่น คุณอาจมีการทำงานอัตโนมัติที่ดำเนินการตามเวลากลางคืน โหนดเงื่อนไขจะตรวจสอบเวลาของวัน จากนั้นจะทําตามเส้นทางการดําเนินการที่เหมาะสมตามการประเมินนั้น

เงื่อนไขของโฟลว์
รูปที่ 3: เงื่อนไข

โฟลว์แบบเลือกจะมีประโยชน์เมื่อคุณต้องการเงื่อนไขเริ่มต้นมากกว่า 1 รายการที่เปิดใช้งานการทำงานอัตโนมัติได้ เมื่อคุณใส่เงื่อนไขเริ่มต้นอย่างน้อย 2 รายการในโฟลว์ select เงื่อนไขเริ่มต้นรายการใดรายการหนึ่งจะเปิดใช้งานการทำงานอัตโนมัติได้

เช่น คุณอาจเขียนการทำงานอัตโนมัติที่ลดม่านลงเมื่อพระอาทิตย์ตก หากอุณหภูมิสูงกว่าเกณฑ์ที่กำหนด หรือหากความสว่างเกินเกณฑ์ เงื่อนไขเริ่มต้น 3 รายการแยกกันจะจัดการสถานการณ์เหล่านี้แต่ละรายการ และทั้ง 3 รายการจะรวมอยู่ในโฟลว์ select

เลือกขั้นตอน
รูปที่ 4: เลือกโฟลว์

ขั้นตอนที่ซ้อนกัน

ในงานอัตโนมัติที่ซับซ้อน คุณยังฝังโหนดลำดับการดำเนินการได้ด้วย เช่น คุณอาจมีขั้นตอนตามลําดับที่ดําเนินการขั้นตอนขนานกัน

ขั้นตอนการดําเนินการที่ซ้อนกัน
รูปที่ 5: โฟลว์การดำเนินการที่ฝัง

คุณฝังและรวมโหนด DSL เข้าด้วยกันได้หลายวิธีเพื่อตอบสนองความต้องการเฉพาะของคุณตามข้อจำกัดที่ระบุไว้ในตารางต่อไปนี้ คอลัมน์ Builder จะลิงก์ไปยังเอกสารประกอบเกี่ยวกับเครื่องมือสร้างแบบปลอดภัยของ Kotlin ซึ่งจะแสดงรายละเอียดเกี่ยวกับสิ่งที่อนุญาตให้ใช้ในโหนดแต่ละประเภท

ตาราง: วิธีรวมโหนด
โหนด ช่างก่อสร้าง อาจมีประเภทโหนดและข้อมูลต่อไปนี้ ต้องอยู่ภายในประเภทโหนดอย่างใดอย่างหนึ่งต่อไปนี้
เงื่อนไขเริ่มต้น AutomationBuilder นิพจน์ เลือกตามลําดับ
ManualStarter AutomationBuilder เลือกตามลําดับ
StateReader AutomationBuilder นิพจน์ (โดยทั่วไปประกอบด้วยค่าแอตทริบิวต์ลักษณะ) การดำเนินการ เงื่อนไข
การดำเนินการ ActionBuilder คําสั่ง เอนทิตี นิพจน์ คู่ขนาน เลือก ตามลําดับ
ตามลำดับ SequentialFlowBuilder คู่ขนาน เลือก ตามลําดับ
Parallel ParallelFlowBuilder การดำเนินการ ตามลำดับ
Condition ConditionBuilder นิพจน์ คู่ขนาน ตามลําดับ
เลือก AutomationBuilder Condition, Sequential, Starter, ManualStarter เป็นไปตามลําดับและต้องเป็นโหนดแรกในขั้นตอน

DSL การทำงานอัตโนมัติ

ใน Home API ระบบจะกำหนดการทำงานอัตโนมัติโดยใช้ Automation DSL (ภาษาเฉพาะโดเมน) ระบบจะใช้ Automation DSL เป็น Kotlin DSL (ภาษาเฉพาะโดเมน) โดยใช้บิลเดอร์ที่ปลอดภัยตามประเภทของ Kotlin และออกแบบมาเพื่อกำหนดเทมเพลตการทำงานอัตโนมัติโดยเฉพาะ

เมื่อคอมไพล์การทำงานอัตโนมัติแล้ว ตัวสร้างที่ปลอดภัยต่อประเภทของ Kotlin จะสร้างคลาสข้อมูล Kotlin ซึ่งจะแปลงเป็น JSON บัฟเฟอร์โปรโตคอล จากนั้นระบบจะใช้เพื่อเรียกใช้บริการการทำงานอัตโนมัติของ Google

Automation DSL ช่วยลดความซับซ้อนและเพิ่มประสิทธิภาพให้กับกระบวนการสร้างการทำงานอัตโนมัติ โดยจะใช้โมเดลข้อมูลเดียวกันกับลักษณะมาตรฐาน Matter และลักษณะ smart home ที่แสดงใน Device API

นอกจากนี้ Automation DSL ยังกำหนดตรรกะของระบบการทำงานอัตโนมัติในแง่ของประเภทอุปกรณ์นามธรรม ซึ่งต่างจากอินสแตนซ์อุปกรณ์ที่เฉพาะเจาะจงซึ่งอยู่ในบ้านของผู้ใช้ ซึ่งช่วยให้นักพัฒนาแอประบุพารามิเตอร์อินพุตที่อาจใช้ในรันไทม์เพื่อระบุอินสแตนซ์อุปกรณ์จริง รวมถึงค่าพารามิเตอร์อื่นๆ ที่สำคัญได้

ไวยากรณ์ DSL จะคล้ายกับของ Kotlin และเป็นแบบ Type Safe เช่นเดียวกัน แต่การทำงานอัตโนมัติที่เขียนใน Automation DSL จะเรียบง่ายและกระชับกว่าการทำงานอัตโนมัติแบบเดียวกันที่เขียนใน Kotlin ล้วนๆ

ตัวอย่าง

ต่อไปนี้คือตัวอย่างการทำงานอัตโนมัติที่เปิดอุปกรณ์ ซึ่งเขียนโดยใช้ Automation DSL

val automation = automation {
  name = "MyFirstAutomation"
  description = "If light1 is on, turn on light2."
  isActive = true
  sequential {
    val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
    condition() { expression = onOffTrait.onOff equals true }
    action(device2, OnOffLightDevice) { command(OnOff.on()) }
  }
}

การทำงานอัตโนมัตินี้เป็นแบบพื้นฐานมาก เมื่อ device1 หลอดไฟจะเปิดขึ้น (แอตทริบิวต์ onOff จะเปลี่ยนเป็น true) จากนั้นส่งคําสั่ง on() เพื่อเปิด device2

ระบบอัตโนมัติใช้โหนด sequential ซึ่งบ่งบอกว่าโหนดจะทํางานตามลําดับ

ภายในโหนด sequential คือโหนดลักษณะการทำงาน เช่น starter, condition และ action ระบบจะกําหนดเอาต์พุตของโหนด starter ให้กับตัวแปรเพื่อใช้ในโหนด condition