Đây là thông tin tổng quan về các khái niệm cơ bản của DSL tự động hoá.
Thành phần tự động hoá
Một quy trình tự động hoá bao gồm các thành phần cơ bản sau, thường được đánh giá theo thứ tự này:
- Trình khởi động – Xác định các điều kiện ban đầu kích hoạt tính năng 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 quy tắc 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 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 chế độ tự động làm mờ đèn trong phòng khi TV trong phòng đó được bật từ lúc hoàng hôn đến lúc bình minh. Trong ví dụ này:
- Starter (Bắt đầu) – TV đã được bật, đây là một thay đổi về trạng thái trên một đặc điểm của TV.
- Điều kiện – Hệ thống sẽ đánh giá thời gian hiện tại tại nhà của người dùng.
- Thao tác – Đèn trong cùng phòng với TV bị giảm độ sáng.
Quy trình tự động sẽ được kích hoạt khi TV trong phòng được bật, nhưng quy trình tự động này chỉ thực thi nếu đáp ứng điều kiện "thời gian nằm giữa hoàng hôn và bình minh".
Ngoài cấu trúc cơ bản, các quy trình tự động trong API Home cũng chứa siêu dữ liệu, chẳng hạn như tên và nội dung 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 cho nhà phát triển và người dùng.
Nút
Trong API Home, cấu trúc logic của một quy trình tự động hoá bao gồm các nodes. Nút là các đơn vị trừu tượng, có thể sử dụng lại, đại diện cho 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ả |
---|---|---|---|
Bắt đầu | Hành vi |
StarterNodeDsl
|
Bắt đầu quá 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 đ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 thuộc tính. |
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 song song các nút hành động lồng nhau. |
Tình trạng | Luồng thực thi |
ConditionNodeDsl
|
Thay đổi điều kiện luồng thực thi 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 một trình khởi động (điều kiện cụ thể của trình khởi động) hoặc có thể là toàn cục (áp dụng cho tất cả trình khởi động). |
Chọn | Luồng thực thi |
SelectFlow
|
Cho phép nhiều trình khởi động kích hoạt mộ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, hằng số hoặc giá trị cố định của một đặc điểm, đồng thời 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. Trình khởi động kích hoạt một quy trình tự động hoá dựa trên các thay đổi về thuộc tính thiết bị. Thao tác đưa ra lệnh 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 để sử dụng làm dữ liệu đầu vào trong các nút khác.
Nút luồng thực thi
Một số nút đại diện cho 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 tính năng tự động hoá.
Ví dụ: luồng tuần tự có thể chứa các nút thực thi theo thứ tự tuần tự. Thông thường, đây sẽ là trình 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 một lúc, chẳng hạn như bật nhiều đèn cùng một 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 kết thúc.
Một loại luồng thực thi khác là luồng điều kiện. Luồng này có thể thay đổi luồng thực thi dựa trên việc đánh giá một biểu thức.
Ví dụ: có thể bạn có một quy trình tự động hoá thực hiện một 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 kết quả đánh giá đó.
Luồng chọn sẽ hữu ích khi bạn muốn có nhiều trình khởi động có thể kích hoạt tính năng tự động hoá. Khi bạn bao gồm hai hoặc nhiều trình khởi động trong một luồng select
, bất kỳ trình khởi động nào cũng có thể kích hoạt tính năng tự động hoá.
Ví dụ: bạn có thể viết một quy trình tự động hạ rèm khi mặt trời lặ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á ngưỡng. Ba trình khởi động riêng biệt xử lý từng tình huống trong số này và cả ba sẽ được gói trong một 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. Ví dụ: bạn có thể có một luồng tuần tự thực thi một luồng song song.
Bạn có thể lồng và kết hợp các nút DSL theo nhiều cách để đáp ứng nhu cầu cụ thể của mình, theo các quy tắ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 kiểu Kotlin, trong đó nêu chi tiết những nội dung được phép sử dụng trong mỗi loại nút.
Nút | Trình tạo | 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 |
---|---|---|---|
Bắt đầu |
AutomationBuilder
|
Cụm từ | Chọn, Tuần tự |
ManualStarter |
AutomationBuilder
|
Chọn, Tuần tự | |
StateReader |
AutomationBuilder
|
Biểu thức (thường bao gồm một giá trị thuộc tính đặc điểm) | Hành động, Điều kiện |
Hành động |
ActionBuilder
|
Lệnh, Thực thể, Biểu thức | Song song, Chọn, Tuần tự |
Tuần tự |
SequentialFlowBuilder
|
Song song, Chọn, Tuần tự | |
Song song |
ParallelFlowBuilder
|
Hành động | Tuần tự |
Tình trạng | ConditionBuilder |
Cụm từ | Song song, Tuần tự |
Chọn |
AutomationBuilder
|
Condition, Sequential, Starter, ManualStarter | Tuần tự và phải là nút đầu tiên trong luồng |
DSL tự động hoá
Trong API Home, các quy trình tự động hoá được xác định bằng cách sử dụng Automation DSL (Ngôn ngữ chuyên biệt theo miền). DSL tự động hoá được triển khai dưới dạng Kotlin DSL (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 một quy trình tự động hoá được biên dịch, các 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 vùng đệm giao thức JSON. Vùng đệm này được dùng để thực hiện lệnh gọi đến Dịch vụ tự động hoá của Google.
DSL tự động hoá đơn giản hoá và tinh giản quy trình tạo các quy trình tự động hoá. API này sử dụng cùng một mô hình dữ liệu của các đặc điểm tiêu chuẩn Matter và các đặc điểm smart home có trong API Thiết bị.
DSL tự động hoá cũng xác định logic của một 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. API này cho phép nhà phát triển cung cấp các tham số đầu vào có thể được sử 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, nhưng quy trình tự động hoá được viết bằng DSL tự động hoá đơn giản và ngắn gọn hơn so với quy trình tự động hoá tương tự được viết bằng Kotlin thuần tuý.
Ví dụ:
Sau đây là ví dụ về quy trình tự động bật thiết bị, được viết bằng 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()) }
}
}
Quy trình tự động hoá này rất cơ bản: khi device1
, một đèn, bật (thuộc tính onOff
thay đổi thành true
), sau đó gửi lệnh on()
để bật device2
.
Quá trình tự động hoá sử dụng nút sequential
, cho biết các nút của nó sẽ chạy theo thứ tự tuần 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
.