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

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

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

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

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

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

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

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

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

โหนด

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

เลือกโฟลว์
รูปที่ 4: โฟลว์การเลือก

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

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

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

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

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

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

Automation DSL

ใน Home API การทำงานอัตโนมัติจะกำหนดโดยใช้ Automation DSL (Domain-Specific Language) Automation DSL ได้รับการติดตั้งใช้งานเป็น Kotlin DSL (Domain-Specific Language), โดยใช้ Kotlin Type-Safe Builder และได้รับการออกแบบมาโดยเฉพาะสำหรับการกำหนด เทมเพลตการทำงานอัตโนมัติ

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

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

นอกจากนี้ Automation 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