แนวคิดเกี่ยวกับ 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 เปลี่ยนโฟลว์การดำเนินการแบบมีเงื่อนไขตามการประเมินนิพจน์เชิงตรรกะ เงื่อนไขอาจเชื่อมโยงกับเงื่อนไขเริ่มต้น (starter specific conditions) หรือเป็นเงื่อนไขส่วนกลาง (ใช้กับเงื่อนไขเริ่มต้นทั้งหมด)
เลือก ขั้นตอนการดำเนินการ SelectFlow อนุญาตให้เงื่อนไขเริ่มต้นมากกว่า 1 รายการเปิดใช้งานการทำงานอัตโนมัติ
นิพจน์ ค่า 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 (Domain-Specific Language) Automation DSL ได้รับการติดตั้งใช้งานเป็น Kotlin DSL (ภาษาเฉพาะโดเมน) โดยใช้ตัวสร้างที่ปลอดภัยต่อประเภทของ Kotlin และออกแบบมาเพื่อกำหนด เทมเพลตการทำงานอัตโนมัติโดยเฉพาะ

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

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

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

ไวยากรณ์ DSL คล้ายกับของ Kotlin และมีความปลอดภัยของประเภทเท่ากัน แต่ การทำงานอัตโนมัติที่เขียนใน 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