นี่คือภาพรวมของแนวคิดพื้นฐานของ DSL การทำงานอัตโนมัติใน Android
คอมโพเนนต์การทำงานอัตโนมัติ
การทำงานอัตโนมัติประกอบด้วยองค์ประกอบพื้นฐานต่อไปนี้ ซึ่งโดยปกติจะประเมินตามลำดับนี้
- เงื่อนไขเริ่มต้น — กำหนดเงื่อนไขเริ่มต้นที่จะเปิดใช้งานการทำงานอัตโนมัติ เช่น การเปลี่ยนแปลงลักษณะ การทำงานอัตโนมัติต้องมีเงื่อนไขเริ่มต้น
- เงื่อนไข — ข้อจำกัดเพิ่มเติมที่ต้องประเมินหลังจากเปิดใช้งานการทำงานอัตโนมัติ นิพจน์ในเงื่อนไขต้องประเมินเป็น
trueเพื่อให้การดำเนินการของการทำงานอัตโนมัติดำเนินต่อไปได้ - การดำเนินการ — คำสั่งหรือการอัปเดตสถานะที่จะดำเนินการเมื่อเป็นไปตามเงื่อนไขทั้งหมด
ตัวอย่างเช่น คุณอาจมีการทำงานอัตโนมัติที่หรี่ไฟในห้องเมื่อทีวีในห้องนั้นเปิดขึ้นระหว่างพระอาทิตย์ตกและพระอาทิตย์ขึ้น ในตัวอย่างนี้
- เงื่อนไขเริ่มต้น — ทีวีเปิดอยู่ ซึ่งเป็นการเปลี่ยนแปลงสถานะในลักษณะทีวี
- เงื่อนไข - ระบบจะประเมินเวลาปัจจุบันของบ้านที่มีทีวีอยู่
- การดำเนินการ — ไฟในห้องเดียวกับทีวีจะหรี่ลง
การทำงานอัตโนมัติจะเปิดใช้งานเมื่อทีวีในห้องเปิดอยู่ แต่การทำงานอัตโนมัติจะทำงานก็ต่อเมื่อเป็นไปตามเงื่อนไข "เวลาอยู่ระหว่างพระอาทิตย์ตกและพระอาทิตย์ขึ้น" เท่านั้น
นอกเหนือจากโครงสร้างพื้นฐานแล้ว การทำงานอัตโนมัติใน Home API ยังมีข้อมูลเมตา เช่น name และ description ซึ่งสามารถใช้เพื่อระบุข้อมูลสำหรับนักพัฒนาซอฟต์แวร์และผู้ใช้
โหนด
ใน Home API โครงสร้างเชิงตรรกะของการทำงานอัตโนมัติจะประกอบด้วยโหนด โหนดเป็นหน่วยนามธรรมที่นำกลับมาใช้ใหม่ได้ ซึ่งแสดงถึงลักษณะการทำงานหรือขั้นตอนการดำเนินการของเอนทิตี แต่ละโหนดสามารถมีตัวแปรอินพุต รวมถึงตัวแปรเอาต์พุตที่โหนดอื่นๆ อาจใช้
| โหนด | ประเภทโหนด | การใช้งาน Kotlin | คำอธิบาย |
|---|---|---|---|
| Starter | พฤติกรรม |
StarterNodeDsl
|
เริ่มการทำงานอัตโนมัติเมื่อสถานะของลักษณะ (แอตทริบิวต์ใดๆ) มีการเปลี่ยนแปลง |
| StateReader | พฤติกรรม |
StateReaderNodeDsl
|
อ่านแอตทริบิวต์ลักษณะและให้คุณบันทึกค่าเพื่อใช้ในโหนดเงื่อนไข |
| การดำเนินการ | พฤติกรรม |
ActionNodeDsl
|
เรียกใช้คำสั่งลักษณะ |
| ตามลำดับ | ขั้นตอนการดำเนินการ |
SequentialFlow
|
เรียกใช้โหนดการดำเนินการที่ฝังอยู่ตามลำดับ ซึ่งเป็นลักษณะการทำงานเริ่มต้นของการดำเนินการ |
| Parallel | ขั้นตอนการดำเนินการ |
ParallelFlow
|
เรียกใช้โหนดการดำเนินการที่ฝังอยู่พร้อมกัน |
| Condition | ขั้นตอนการดำเนินการ |
ConditionNodeDsl
|
เปลี่ยนขั้นตอนการดำเนินการตามเงื่อนไขโดยอิงตามการประเมินนิพจน์เชิงตรรกะ เงื่อนไขอาจเชื่อมโยงกับเงื่อนไขเริ่มต้น (เงื่อนไขเฉพาะของเงื่อนไขเริ่มต้น) หรือเป็นแบบส่วนกลาง (ใช้กับเงื่อนไขเริ่มต้นทั้งหมด) |
| เลือก | ขั้นตอนการดำเนินการ |
SelectFlow
|
อนุญาตให้มีเงื่อนไขเริ่มต้นมากกว่า 1 รายการเพื่อเปิดใช้งานการทำงานอัตโนมัติ |
| IfFlow | ขั้นตอนการดำเนินการ |
IfFlowDsl
|
เรียกใช้การดำเนินการ (หรือสาขา) อย่างมาก 1 รายการโดยอิงตามเงื่อนไข (หากมี) ที่ประเมินเป็นจริง (คล้ายกับคำสั่ง if-then-else) |
| Expression | ค่า |
Expression
|
อาจเป็นค่าของแอตทริบิวต์ของลักษณะ ค่าคงที่ หรือค่าลิเทอรัล และต้องประเมินเป็นรายการ ตัวเลข บูลีน หรือสตริง |
โหนดพฤติกรรม
โหนด เช่น เงื่อนไขเริ่มต้นและการดำเนินการ เป็นโหนดเชิงพฤติกรรม เงื่อนไขเริ่มต้นจะเปิดใช้งานการทำงานอัตโนมัติตามการเปลี่ยนแปลงแอตทริบิวต์ของอุปกรณ์ การดำเนินการจะออกคำสั่งอุปกรณ์หรืออัปเดตแอตทริบิวต์
โดยทั่วไปแล้ว โหนดลักษณะการทำงานจะเชื่อมโยงกับลักษณะของอุปกรณ์และแสดงสถานะลักษณะเพื่อใช้เป็นอินพุตในโหนดอื่นๆ
โหนดโฟลว์การดำเนินการ
โหนดบางโหนดแสดงถึงโฟลว์การดำเนินการ เช่น แบบตามลำดับและแบบขนาน แต่ละโหนดเหล่านี้มีโหนดลักษณะการทำงานที่กำหนดการทำงานอัตโนมัติ
ตัวอย่างเช่น โฟลว์ตามลำดับอาจมีโหนดที่ดำเนินการตามลำดับ โดยปกติแล้วจะเป็นเงื่อนไขเริ่มต้น เงื่อนไข และการดำเนินการ
โฟลว์แบบขนานอาจมีโหนดการดำเนินการหลายโหนดที่ทำงานพร้อมกัน เช่น การเปิดไฟหลายดวงพร้อมกัน โหนดที่ตามหลังโฟลว์แบบขนานจะไม่ทำงานจนกว่าสาขาทั้งหมดของโฟลว์แบบขนานจะเสร็จสิ้น
โฟลว์การดำเนินการอีกประเภทหนึ่งคือโฟลว์เงื่อนไข ซึ่งสามารถเปลี่ยนโฟลว์การดำเนินการตามการประเมินนิพจน์ได้
ตัวอย่างเช่น คุณอาจมีการทำงานอัตโนมัติที่ดำเนินการตามช่วงเวลาว่าเป็นเวลากลางคืนหรือไม่ โหนดเงื่อนไขจะตรวจสอบเวลาของวัน จากนั้นจะทำตามเส้นทางการดำเนินการที่เหมาะสมตามการประเมินนั้น
ขั้นตอนการเลือกจะมีประโยชน์เมื่อคุณต้องการมีเงื่อนไขเริ่มต้นมากกว่า 1 รายการที่สามารถเปิดใช้งานการทำงานอัตโนมัติได้ เมื่อคุณใส่เงื่อนไขเริ่มต้นตั้งแต่ 2 รายการขึ้นไปในโฟลว์ select เงื่อนไขเริ่มต้นรายการใดรายการหนึ่งจะเปิดใช้งานการทำงานอัตโนมัติได้
ตัวอย่างเช่น คุณสามารถเขียนการทำงานอัตโนมัติที่ลดม่านลงเมื่อพระอาทิตย์ตก หากอุณหภูมิสูงกว่าเกณฑ์ที่กำหนด หรือหากความสว่างเกินเกณฑ์ เงื่อนไขเริ่มต้น 3 รายการที่แยกกันจะจัดการแต่ละสถานการณ์เหล่านี้ และทั้ง 3 รายการจะรวมอยู่ในขั้นตอน select
โฟลว์ if-then-else (IfFlow) ช่วยให้สามารถแยกสาขาการดำเนินการตามเงื่อนไขภายในการทำงานอัตโนมัติได้ โหนด if-then-else ต่างจากโหนด condition ซึ่งจะหยุดการทำงานอัตโนมัติทั้งหมดหากเงื่อนไขเป็น false โดยโหนด if-then-else จะดำเนินการบางอย่างตามเงื่อนไขเมื่อเงื่อนไขเป็นจริง และสามารถกลับไปใช้เงื่อนไขสำรองหรือการดำเนินการสำรอง หรือไปยังโหนดถัดไปในการทำงานอัตโนมัติได้ ดูรายละเอียดเพิ่มเติมได้ที่การดำเนินการตามเงื่อนไข
โฟลว์ที่ซ้อนกัน
ในการทำงานอัตโนมัติที่ซับซ้อน โหนดขั้นตอนการดำเนินการยังฝังได้ด้วย ตัวอย่างเช่น คุณอาจมีโฟลว์ตามลำดับที่เรียกใช้โฟลว์แบบขนาน
โหนด DSL สามารถซ้อนกันและรวมกันได้หลายวิธีเพื่อให้ตรงกับความต้องการเฉพาะของคุณ โดยเป็นไปตามข้อจำกัดที่ระบุไว้ในตารางต่อไปนี้ คอลัมน์ Builder จะลิงก์ไปยังเอกสารประกอบของ Kotlin Typesafe Builder ซึ่งจะอธิบายรายละเอียดเกี่ยวกับสิ่งที่อนุญาตให้ใช้ในโหนดแต่ละประเภท
| โหนด | อาจมีประเภทโหนดและข้อมูลต่อไปนี้ | ต้องอยู่ภายในโหนดประเภทใดประเภทหนึ่งต่อไปนี้ |
|---|---|---|
| Starter | นิพจน์ | เลือกตามลำดับ |
| ManualStarter | เลือกตามลำดับ | |
| StateReader | นิพจน์ (โดยทั่วไปประกอบด้วยค่าแอตทริบิวต์ลักษณะ) | IfFlow, Parallel, Sequential |
| การดำเนินการ | คำสั่ง เอนทิตี นิพจน์ | IfFlow, Parallel, Select, Sequential |
| ตามลำดับ | IfFlow, Parallel, Select, Sequential | |
| Parallel | การดำเนินการ | IfFlow, ตามลำดับ |
| Condition | นิพจน์ | IfFlow, Parallel, Sequential |
| เลือก | Condition, Sequential, Starter, ManualStarter | ตามลำดับ และต้องเป็นโหนดแรกในโฟลว์ |
| IfFlow | Action, Condition, Delay, IfFlow, Parallel, Sequential, StateReader, Suppression | ตามลำดับ |
DSL ของการทำงานอัตโนมัติ
ใน Home API ระบบจะกำหนดการทำงานอัตโนมัติโดยใช้ DSL (Domain-Specific Language) ของการทำงานอัตโนมัติ DSL การทำงานอัตโนมัติจะใช้เป็น Kotlin DSL (ภาษาเฉพาะโดเมน) โดยใช้เครื่องมือสร้างที่ปลอดภัยในการกำหนดประเภทของ Kotlin และออกแบบมาเพื่อกำหนดเทมเพลตการทำงานอัตโนมัติโดยเฉพาะ
เมื่อคอมไพล์การทำงานอัตโนมัติแล้ว Kotlin Type-Safe Builder จะสร้างคลาสข้อมูล 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