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

นี่คือภาพรวมของแนวคิดพื้นฐานของ Automation 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 รายการเปิดใช้งานการทำงานอัตโนมัติ
Expression ค่า Expression อาจเป็นค่าของแอตทริบิวต์ของลักษณะ ค่าคงที่ หรือค่าลิเทอรัล และต้องประเมินเป็นรายการ ตัวเลข บูลีน หรือสตริง

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

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

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

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

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

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

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

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

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

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

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

โฟลว์ของเงื่อนไข
รูปที่ 3: โฟลว์ของสภาพสินค้า

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

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

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

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

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

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

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

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

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

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

เมื่อคอมไพล์การทำงานอัตโนมัติ ตัวสร้างที่ปลอดภัยตามประเภทของ Kotlin จะสร้างคลาสข้อมูล 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