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