แนวคิดเกี่ยวกับ DSL ของ Android

นี่คือภาพรวมของแนวคิดพื้นฐานของ DSL การทำงานอัตโนมัติใน Android

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

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

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

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

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

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

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

โหนด

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

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

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

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

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

โหนดโฟลว์การดำเนินการ

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

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

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

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

โฟลว์การดำเนินการพร้อมกัน
รูปที่ 2: ขั้นตอนการทำงานอัตโนมัติแบบขนาน

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

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

โฟลว์เงื่อนไข
รูปที่ 3: ขั้นตอนการทำงานของเงื่อนไข

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

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

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

โฟลว์ if-then-else (IfFlow) ช่วยให้สามารถแยกสาขาการดำเนินการตามเงื่อนไขภายในการทำงานอัตโนมัติได้ โหนด if-then-else ต่างจากโหนด condition ซึ่งจะหยุดการทำงานอัตโนมัติทั้งหมดหากเงื่อนไขเป็น false โดยโหนด if-then-else จะดำเนินการบางอย่างตามเงื่อนไขเมื่อเงื่อนไขเป็นจริง และสามารถกลับไปใช้เงื่อนไขสำรองหรือการดำเนินการสำรอง หรือไปยังโหนดถัดไปในการทำงานอัตโนมัติได้ ดูรายละเอียดเพิ่มเติมได้ที่การดำเนินการตามเงื่อนไข

โฟลว์ที่ซ้อนกัน

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

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

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

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

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

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

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

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

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

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

ตัวอย่าง

ต่อไปนี้คือตัวอย่างการทำงานอัตโนมัติที่เปิดอุปกรณ์ ซึ่งเขียนโดยใช้ 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