นี่คือภาพรวมของแนวคิดพื้นฐานของ Automation DSL ใน Android
ส่วนประกอบการทำงานอัตโนมัติ
ระบบอัตโนมัติประกอบด้วยคอมโพเนนต์พื้นฐานต่อไปนี้ ซึ่งโดยทั่วไปจะได้รับการประเมินตามลำดับนี้
- เงื่อนไขเริ่มต้น — กำหนดเงื่อนไขเริ่มต้นที่เปิดใช้งานการทำงานอัตโนมัติ เช่น การเปลี่ยนแปลงลักษณะ การทำงานอัตโนมัติต้องมีเงื่อนไขเริ่มต้น
- เงื่อนไข - ข้อจํากัดเพิ่มเติมใดๆ ที่จะประเมินหลังจากเปิดใช้งานการทำงานอัตโนมัติ
แล้ว นิพจน์ในเงื่อนไขต้องประเมินเป็น
trueเพื่อให้การดำเนินการของการทำงานอัตโนมัติดำเนินต่อไปได้ - การดำเนินการ - คำสั่งหรือการอัปเดตสถานะที่ดำเนินการเมื่อเป็นไปตามเงื่อนไขทั้งหมด
เช่น คุณอาจมีการทำงานอัตโนมัติที่หรี่ไฟในห้องเมื่อ เปิดทีวีในห้องนั้นระหว่างพระอาทิตย์ตกและขึ้น ในตัวอย่างนี้
- เริ่มต้น - เปิดทีวี ซึ่งเป็นการเปลี่ยนแปลงสถานะในลักษณะทีวี
- เงื่อนไข - ระบบจะประเมินเวลาปัจจุบันของบ้านที่ทีวีอยู่
- การดำเนินการ - ไฟในห้องเดียวกับทีวีจะหรี่ลง
การทำงานอัตโนมัติจะเปิดใช้งานเมื่อเปิดทีวีในห้อง แต่จะทำงานก็ต่อเมื่อเป็นไปตามเงื่อนไข "เวลาอยู่ระหว่างพระอาทิตย์ตกและพระอาทิตย์ขึ้น" เท่านั้น
นอกเหนือจากโครงสร้างพื้นฐานแล้ว การทำงานอัตโนมัติใน Home API ยังมีข้อมูลเมตา เช่น name และ description ซึ่งใช้เพื่อระบุ การทำงานอัตโนมัติสำหรับนักพัฒนาแอปและผู้ใช้ได้
โหนด
ใน Home API โครงสร้างเชิงตรรกะของการทำงานอัตโนมัติประกอบด้วยโหนด โหนดคือหน่วยนามธรรมที่ใช้ซ้ำได้ซึ่งแสดงพฤติกรรมของเอนทิตีหรือโฟลว์การดำเนินการ แต่ละโหนดจะมีตัวแปรอินพุต รวมถึงตัวแปรเอาต์พุตที่โหนดอื่นๆ อาจใช้ได้
| โหนด | ประเภทโหนด | การใช้งาน Kotlin | คำอธิบาย |
|---|---|---|---|
| Starter | เชิงพฤติกรรม |
StarterNodeDsl
|
เริ่มการทำงานอัตโนมัติเมื่อสถานะของลักษณะ (แอตทริบิวต์ใดก็ได้) เปลี่ยนแปลง |
| StateReader | เชิงพฤติกรรม |
StateReaderNodeDsl
|
อ่านแอตทริบิวต์ลักษณะและช่วยให้คุณบันทึกค่าเพื่อใช้ใน โหนดเงื่อนไข |
| การดำเนินการ | เชิงพฤติกรรม |
ActionNodeDsl
|
เรียกใช้คำสั่งลักษณะ |
| ตามลำดับ | ขั้นตอนการดำเนินการ |
SequentialFlow
|
เรียกใช้โหนดการดำเนินการที่ซ้อนกันตามลำดับ นี่คือลักษณะการทำงานเริ่มต้น |
| Parallel | ขั้นตอนการดำเนินการ |
ParallelFlow
|
เรียกใช้โหนดการดำเนินการที่ซ้อนกันแบบขนาน |
| Condition | ขั้นตอนการดำเนินการ |
ConditionNodeDsl
|
เปลี่ยนโฟลว์การดำเนินการแบบมีเงื่อนไขตามการประเมินนิพจน์เชิงตรรกะ เงื่อนไขอาจเชื่อมโยงกับเงื่อนไขเริ่มต้น (เงื่อนไขเฉพาะของเงื่อนไขเริ่มต้น) หรือเป็นแบบส่วนกลาง (ใช้กับเงื่อนไขเริ่มต้นทั้งหมด) |
| เลือก | ขั้นตอนการดำเนินการ |
SelectFlow
|
อนุญาตให้เงื่อนไขเริ่มต้นมากกว่า 1 รายการเปิดใช้งานการทำงานอัตโนมัติ |
| Expression | ค่า |
Expression
|
อาจเป็นค่าของแอตทริบิวต์ของลักษณะ ค่าคงที่ หรือค่าลิเทอรัล และต้องประเมินเป็นรายการ ตัวเลข บูลีน หรือสตริง |
โหนดพฤติกรรม
โหนดต่างๆ เช่น เงื่อนไขเริ่มต้นและการดำเนินการ คือโหนดเชิงพฤติกรรม เงื่อนไขเริ่มต้นจะเปิดใช้งานการทำงานอัตโนมัติโดยอิงตามการเปลี่ยนแปลงแอตทริบิวต์ของอุปกรณ์ การดำเนินการจะออกคำสั่งของอุปกรณ์หรืออัปเดตแอตทริบิวต์
โดยปกติแล้วโหนดพฤติกรรมจะเชื่อมโยงกับลักษณะของอุปกรณ์และสถานะลักษณะเอาต์พุตเพื่อ ใช้เป็นอินพุตในโหนดอื่นๆ
โหนดโฟลว์การดำเนินการ
โหนดบางโหนดแสดงถึงโฟลว์การดำเนินการ เช่น แบบลำดับและแบบขนาน โหนดแต่ละโหนดเหล่านี้มีโหนดลักษณะการทำงานที่กำหนดการทำงานอัตโนมัติ
เช่น โฟลว์ตามลําดับอาจมีโหนดที่ทํางานตามลําดับ โดยปกติแล้ว โหนดเหล่านี้จะเป็นเงื่อนไขเริ่มต้น เงื่อนไข และการดําเนินการ
โฟลว์แบบขนานอาจมีโหนดการดำเนินการหลายรายการที่ทำงานพร้อมกัน เช่น การเปิดไฟหลายดวงพร้อมกัน โหนดที่อยู่หลังโฟลว์แบบขนานจะไม่ทำงานจนกว่ากิ่งก้านทั้งหมดของโฟลว์แบบขนานจะเสร็จสิ้น
โฟลว์การดำเนินการอีกประเภทหนึ่งคือโฟลว์เงื่อนไข ซึ่งสามารถเปลี่ยน โฟลว์การดำเนินการตามการประเมินนิพจน์
เช่น คุณอาจมีการทำงานอัตโนมัติที่ดำเนินการตาม เวลาว่าเป็นกลางคืนหรือไม่ โหนดเงื่อนไขจะตรวจสอบช่วงเวลาของวัน จากนั้นจะทำตาม เส้นทางการดำเนินการที่เหมาะสมตามการประเมินนั้น
โฟลว์การเลือกมีประโยชน์เมื่อคุณต้องการมีเงื่อนไขเริ่มต้นมากกว่า 1 รายการที่สามารถเปิดใช้งานการทำงานอัตโนมัติได้ เมื่อคุณใส่เงื่อนไขเริ่มต้น 2 รายการขึ้นไปในโฟลว์ select เงื่อนไขเริ่มต้นใดก็ได้จะเปิดใช้งานการทำงานอัตโนมัติได้
เช่น คุณเขียนการทำงานอัตโนมัติที่ลดมู่ลี่เมื่อพระอาทิตย์ตกได้ หาก
อุณหภูมิสูงกว่าเกณฑ์ที่กำหนด หรือหากความสว่างเกิน
เกณฑ์ โดยมีตัวเริ่มต้น 3 รายการแยกกันจัดการแต่ละสถานการณ์ และทั้ง 3 รายการ
จะรวมอยู่ในselectโฟลว์
โฟลว์ที่ซ้อนกัน
ในระบบอัตโนมัติที่ซับซ้อน คุณยังซ้อนโหนดโฟลว์การดำเนินการได้ด้วย เช่น คุณอาจมีโฟลว์ตามลําดับที่เรียกใช้โฟลว์แบบขนาน
คุณซ้อนและรวมโหนด 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