Đây là tổng quan về các khái niệm cơ bản của DSL Tự động hoá trên Android.
Thành phần tự động hoá
Quy trình tự động hoá bao gồm các thành phần cơ bản sau đây, thường được đánh giá theo thứ tự này:
- Điều kiện khởi động – Xác định các điều kiện ban đầu kích hoạt quy trình tự động hoá, chẳng hạn như thay đổi đối với một đặc điểm. Quy trình tự động hoá phải có điều kiện khởi động.
- Điều kiện – Mọi ràng buộc bổ sung cần đánh giá sau khi quy trình tự động hoá được kích hoạt. Biểu thức trong Điều kiện phải đánh giá thành
trueđể các hành động của quy trình tự động hoá có thể tiếp tục. - Hành động – Các lệnh hoặc nội dung cập nhật trạng thái được thực hiện khi tất cả điều kiện đã được đáp ứng.
Ví dụ: có thể bạn có một quy trình tự động hoá làm mờ đèn trong phòng khi TV trong phòng đó bật giữa lúc hoàng hôn và bình minh. Trong ví dụ này:
- Điều kiện khởi động – TV đã bật, đây là sự thay đổi trạng thái trên đặc điểm TV.
- Điều kiện – Thời gian hiện tại của nhà có TV được đánh giá.
- Hành động – Đèn trong cùng phòng với TV bị mờ đi.
Quy trình tự động hoá sẽ được kích hoạt khi TV trong phòng bật, nhưng quy trình tự động hoá chỉ thực thi nếu điều kiện "thời gian là giữa lúc hoàng hôn và bình minh" được đáp ứng.
Ngoài cấu trúc cơ bản, quy trình tự động hoá trong API Home cũng chứa siêu dữ liệu, chẳng hạn như name (tên) và description (mô tả). Bạn có thể dùng các siêu dữ liệu này để xác định quy trình tự động hoá cho nhà phát triển và người dùng.
Nút
Trong API Home, cấu trúc logic của quy trình tự động hoá bao gồm các nút. Các nút là đơn vị trừu tượng, có thể dùng lại, biểu thị hành vi của thực thể hoặc luồng thực thi. Mỗi nút có thể có các biến đầu vào, cũng như các biến đầu ra mà các nút khác có thể sử dụng.
| Nút | Kiểu Nút | Triển khai Kotlin | Mô tả |
|---|---|---|---|
| Điều kiện khởi động | Hành vi |
StarterNodeDsl
|
Bắt đầu quy trình tự động hoá khi trạng thái của một đặc điểm (bất kỳ thuộc tính nào) thay đổi. |
| StateReader | Hành vi |
StateReaderNodeDsl
|
Đọc thuộc tính của một đặc điểm và cho phép bạn ghi lại giá trị của thuộc tính đó để sử dụng trong các nút điều kiện. |
| Hành động | Hành vi |
ActionNodeDsl
|
Gọi(các) lệnh của đặc điểm. |
| Tuần tự | Luồng thực thi |
SequentialFlow
|
Thực thi các nút hành động lồng nhau theo trình tự. Đây là hành vi thực thi mặc định. |
| Song song | Luồng thực thi |
ParallelFlow
|
Thực thi các nút hành động lồng nhau song song. |
| Tình trạng | Luồng thực thi |
ConditionNodeDsl
|
Thay đổi luồng thực thi có điều kiện dựa trên việc đánh giá các biểu thức logic. Các điều kiện có thể được liên kết với điều kiện khởi động (các điều kiện cụ thể của điều kiện khởi động ) hoặc là điều kiện chung (áp dụng cho tất cả điều kiện khởi động). |
| Chọn | Luồng thực thi |
SelectFlow
|
Cho phép nhiều điều kiện khởi động kích hoạt quy trình tự động hoá. |
| Biểu thức | Giá trị |
Expression
|
Có thể là giá trị của thuộc tính của một đặc điểm, hằng số hoặc giá trị cố định, và phải đánh giá thành danh sách, số, boolean hoặc chuỗi. |
Nút hành vi
Các nút như điều kiện khởi động và hành động là các nút hành vi. Điều kiện khởi động kích hoạt quy trình tự động hoá dựa trên các thay đổi về thuộc tính của thiết bị. Hành động đưa ra các lệnh cho thiết bị hoặc cập nhật thuộc tính.
Các nút hành vi thường được liên kết với các đặc điểm của thiết bị và trạng thái đặc điểm đầu ra để dùng làm đầu vào trong các nút khác.
Nút luồng thực thi
Một số nút biểu thị luồng thực thi, chẳng hạn như tuần tự và song song. Mỗi nút này chứa các nút hành vi xác định quy trình tự động hoá.
Ví dụ: luồng tuần tự có thể chứa các nút thực thi theo trình tự. Thông thường, đây sẽ là điều kiện khởi động, điều kiện và hành động.
Luồng song song có thể có nhiều nút hành động thực thi cùng lúc, chẳng hạn như bật nhiều đèn cùng lúc. Các nút theo luồng song song sẽ không thực thi cho đến khi tất cả các nhánh của luồng song song hoàn tất.
Một loại luồng thực thi khác là luồng điều kiện, có thể thay đổi luồng thực thi dựa trên việc đánh giá biểu thức.
Ví dụ: có thể bạn có một quy trình tự động hoá thực hiện hành động dựa trên việc có phải là ban đêm hay không. Nút điều kiện kiểm tra thời gian trong ngày, sau đó tuân theo đường dẫn thực thi thích hợp dựa trên việc đánh giá đó.
Luồng chọn rất hữu ích khi bạn muốn có nhiều điều kiện khởi động có thể kích hoạt quy trình tự động hoá. Khi bạn đính kèm 2 hoặc nhiều điều kiện khởi động trong luồng select, bất kỳ điều kiện khởi động nào trong số đó cũng có thể kích hoạt quy trình tự động hoá.
Ví dụ: bạn có thể viết một quy trình tự động hoá hạ rèm vào lúc hoàng hôn, nếu nhiệt độ tăng lên trên một ngưỡng nhất định hoặc nếu độ sáng vượt quá một ngưỡng. 3 điều kiện khởi động riêng biệt xử lý từng trường hợp này và cả 3 điều kiện khởi động sẽ được gói trong luồng select.
Luồng lồng nhau
Trong các quy trình tự động hoá phức tạp, các nút luồng thực thi cũng có thể được lồng nhau. Ví dụ: bạn có thể có một luồng tuần tự thực thi luồng song song.
Các nút DSL có thể được lồng và kết hợp theo nhiều cách để đáp ứng nhu cầu cụ thể của bạn, theo các ràng buộc được nêu trong bảng sau. Cột Trình tạo liên kết đến tài liệu về trình tạo an toàn về kiểu Kotlin, trong đó nêu chi tiết những nội dung được phép sử dụng trong từng loại nút.
| Nút | Có thể chứa loại nút và dữ liệu sau | Phải nằm trong một trong các loại nút sau |
|---|---|---|
| Điều kiện khởi động | Biểu thức | Chọn, Tuần tự |
| ManualStarter | Chọn, Tuần tự | |
| StateReader | Biểu thức (thường bao gồm giá trị thuộc tính của một đặc điểm) | Hành động, Điều kiện |
| Hành động | Lệnh, Thực thể, Biểu thức | Song song, Chọn, Tuần tự |
| Tuần tự | Song song, Chọn, Tuần tự | |
| Song song | Hành động | Tuần tự |
| Tình trạng | Biểu thức | Song song, Tuần tự |
| Chọn | Điều kiện, Tuần tự, Điều kiện khởi động, ManualStarter | Tuần tự và phải là nút đầu tiên trong luồng |
DSL Tự động hoá
Trong API Home, quy trình tự động hoá được xác định bằng DSL Tự động hoá (Ngôn ngữ dành riêng cho miền). DSL Tự động hoá được triển khai dưới dạng DSL Kotlin (ngôn ngữ dành riêng cho miền), sử dụng trình tạo an toàn về kiểu Kotlin và được thiết kế riêng để xác định các mẫu tự động hoá.
Khi quy trình tự động hoá được biên dịch, trình tạo an toàn về kiểu Kotlin sẽ tạo các lớp dữ liệu Kotlin, sau đó được chuyển đổi tuần tự thành JSON vùng đệm giao thức. JSON này được dùng để gọi các Dịch vụ tự động hoá của Google.
DSL Tự động hoá giúp đơn giản hoá và hợp lý hoá quy trình tạo quy trình tự động hoá. DSL này sử dụng nguyên bản cùng một mô hình dữ liệu của Matter đặc điểm tiêu chuẩn và smart home đặc điểm có trong Device API.
DSL Tự động hoá cũng xác định logic của quy trình tự động hoá theo các loại thiết bị trừu tượng, thay vì các thực thể thiết bị cụ thể nằm trong nhà của người dùng. DSL này cho phép nhà phát triển cung cấp các tham số đầu vào có thể được dùng trong thời gian chạy để chỉ định các thực thể thiết bị thực tế, cũng như các giá trị tham số quan trọng khác.
Cú pháp DSL tương tự như cú pháp của Kotlin và cũng an toàn về kiểu. Tuy nhiên, quy trình tự động hoá được viết bằng DSL Tự động hoá sẽ đơn giản và ngắn gọn hơn so với cùng một quy trình tự động hoá được viết bằng Kotlin thuần tuý.
Ví dụ
Sau đây là ví dụ về quy trình tự động hoá bật thiết bị, được viết bằng DSL Tự động hoá:
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()) }
}
}
Quy trình tự động hoá này rất cơ bản: khi device1 (đèn) bật (thuộc tính onOff thay đổi thành true), sau đó gửi lệnh on() để bật device2.
Quy trình tự động hoá sử dụng nút sequential, cho biết rằng các nút của quy trình này sẽ chạy theo trình tự.
Trong nút sequential là các nút hành vi như starter, condition và action. Đầu ra của nút starter được gán cho một biến để sử dụng trong nút condition.