Các khái niệm về DSL

Đâ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:

  1. 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.
  2. Đ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.
  3. 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:

  1. 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.
  2. Đ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.
  3. 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ênnộ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.

Bảng: Các loại nút tự động hoá
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 thực thi tuần tự
Hình 1: Quy trình tự động hoá tuần tự

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.

Luồng thực thi song song
Hình 2: Luồng tự động hoá song song

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 điều kiện
Hình 3: Luồng điều kiện

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.

Chọn luồng
Hình 4: Chọn luồng

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.

Luồng thực thi lồng nhau
Hình 5: Luồng thực thi lồng nhau

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.

Bảng: Cách kết hợp các 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, conditionaction. Đầu ra của nút starter được gán cho một biến để sử dụng trong nút condition.