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