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