Khái niệm về DSL Android

Sau đây là thông tin 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á

Một 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:

  1. Đ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.
  2. Điều kiện — Mọi quy tắc ràng buộc bổ sung cần đánh giá sau khi một quy trình tự động hoá được kích hoạt. Biểu thức trong Điều kiện phải có giá trị là true để các hành động của một quy trình tự động hoá có thể tiếp tục.
  3. Hành động — Các lệnh hoặc bản cập nhật trạng thái được thực hiện khi tất cả điều kiện đều được đáp ứng.

Ví dụ: có thể bạn có một quy trình tự động làm mờ đèn trong phòng khi TV trong phòng đó được bật trong khoảng thời gian từ lúc hoàng hôn đến lúc bình minh. Trong ví dụ này:

  1. Trình khởi động — 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 – Đánh giá thời gian hiện tại của ngôi nhà có TV.
  3. Hành động — Đèn trong cùng phòng với TV sẽ mờ đi.

Quy trình tự động hoá sẽ được kích hoạt khi TV trong phòng được bật, nhưng quy trình tự động hoá chỉ thực thi nếu đáp ứng điều kiện "thời gian nằm trong khoảng từ lúc hoàng hôn đến lúc bình minh".

Ngoài cấu trúc cơ bản, các quy trình tự động hoá trong Home API cũng chứa siêu dữ liệu, chẳng hạn như tên và mô tả, có thể dùng để xác định các quy trình đó cho nhà phát triển và người dùng.

Nút

Trong Home API, cấu trúc logic của một quy trình tự động hoá bao gồm các nút. 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ả
Starter Hành vi StarterNodeDsl Bắt đầu một 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 một 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 đặc điểm.
Tuần tự Quy trình 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 Quy trình thực thi ParallelFlow Thực thi các nút hành động lồng nhau song song.
Tình trạng Quy trình thực thi ConditionNodeDsl Thay đổi luồng thực thi có điều kiện dựa trên kết quả đánh giá biểu thức logic. Điều kiện có thể liên kết với một điều kiện khởi động (điều kiện cụ thể của điều kiện khởi động) hoặc có thể là điều kiện chung (áp dụng cho tất cả điều kiện khởi động).
Chọn Quy trình thực thi SelectFlow Cho phép nhiều điều kiện khởi động kích hoạt một quy trình tự động hoá.
IfFlow Quy trình thực thi IfFlowDsl Chạy tối đa một hành động (hoặc nhánh) dựa trên điều kiện (nếu có) được đánh giá là đúng (tương tự như câu lệnh if-then-else).
Expression 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à 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 của thiết bị. Hành động đưa ra 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 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 quy trình tự động hoá.

Ví dụ: một 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, các thành phần này sẽ là điều kiện khởi động, điều kiện và hành động.

Quy trình thực thi tuần tự
Hình 1: Quy trình tự động hoá tuần tự

Một quy trình 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 sau một 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.

Quy trình 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, 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 đó đi 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

Quy trình 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 quy trình tự động hoá. Khi bạn đưa hai hoặc nhiều điều kiện khởi động vào một quy trình select, bất kỳ điều kiện khởi động nào 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 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á một ngưỡng. Ba trình khởi động riêng biệt xử lý từng trường hợp này và cả ba trình khởi động sẽ được gói trong một quy trình select.

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

Luồng nếu-thì-nếu không (IfFlow) cho phép thực thi có điều kiện phân nhánh trong một quy trình tự động hoá. Không giống như nút condition (dừng toàn bộ quy trình tự động hoá nếu điều kiện là false), quy trình if-then-else thực thi có điều kiện các hành động cụ thể khi một điều kiện là đúng và có thể quay lại các điều kiện thay thế hoặc hành động dự phòng, hoặc tiếp tục đến các nút tiếp theo trong quy trình tự động hoá. Để biết thêm thông tin, hãy xem phần Thực thi có điều kiện.

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ào nhau. Ví dụ: bạn có thể có một quy trình tuần tự thực thi một quy trình 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 gì được phép sử dụng trong từng loại nút.

Bảng: Cách kết hợp các 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
Starter 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 điểm) IfFlow, Parallel, Sequential
Hành động Lệnh, Thực thể, Biểu thức IfFlow, Parallel, Select, Sequential
Tuần tự IfFlow, Parallel, Select, Sequential
Song song Hành động IfFlow, Tuần tự
Tình trạng Biểu thức IfFlow, Parallel, Sequential
Chọn Condition, Sequential, Starter, ManualStarter Tuần tự và phải là nút đầu tiên trong quy trình
IfFlow Action, Condition, Delay, IfFlow, Parallel, Sequential, StateReader, Suppression Tuần tự

DSL tự động hoá

Trong Home API, quy trình tự động hoá được xác định bằng DSL (Ngôn ngữ dành riêng cho miền) của quy trình tự động hoá. 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 của 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, trình tạo an toàn về kiểu của 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, đượ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á giúp đơn giản hoá và hợp lý hoá quy trình xây dựng 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 đ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 phiên bản thiết bị cụ thể trong nhà của người dùng. Tệp 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 phiên bản 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 một 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ề một 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 (một đèn) bật (thuộc tính onOff thay đổi thành true), thì lệnh on() sẽ được gửi để bật device2.

Quy trình tự động hoá này sử dụng nút sequential, cho biết các nút của quy trình 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. Kết quả của nút starter được gán cho một biến để sử dụng trong nút condition.