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