Hãy sử dụng hướng dẫn sau đây để hiểu cách sử dụng nhiều nút Automation DSL (Ngôn ngữ dành riêng cho miền tự động hoá) để xây dựng một quy trình tự động hoá.
Tất cả Automation DSL đều được đặt trong một nút automation duy nhất. Nút automation tạo thành ranh giới giữa ngữ cảnh ngôn ngữ Kotlin bên ngoài và ngữ cảnh DSL nhúng.
Luồng tuần tự
Luồng tuần tự là loại luồng tự động hoá mặc định.
Dưới đây là một mẫu Automation DSL rất cơ bản sử dụng luồng tuần tự bao gồm một điều kiện khởi động, một điều kiện và một hành động:
import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.sequential
import com.google.home.automation.starter
...
automation {
sequential {
starter<_>(...)
condition {...}
action {...}
}
}
Bạn có thể tinh chỉnh mẫu này bằng cách thêm các nút khác.
Điều kiện khởi động
Các nút điều kiện khởi động xác định các trường hợp ban đầu kích hoạt một quy trình tự động hoá. Ví dụ: thay đổi trạng thái hoặc giá trị. Một quy trình tự động hoá phải có ít nhất một điều kiện khởi động, nếu không, quy trình đó sẽ không vượt qua được quá trình xác thực. Để thêm nhiều điều kiện khởi động vào một quy trình tự động hoá, bạn phải sử dụng nút select.
Điều kiện khởi động dựa trên thuộc tính đặc điểm
Khi khai báo một nút điều kiện khởi động dựa trên thuộc tính đặc điểm, hãy chỉ định:
- thiết bị
- loại thiết bị mà đặc điểm thuộc về
- đặc điểm
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
Tham số loại thiết bị là bắt buộc vì tham số này cho phép bạn chỉ định loại thiết bị trong một thiết bị mà quy trình tự động hoá giải quyết. Ví dụ: một thiết bị có thể bao gồm
một
FanDevice
và một
HeatingCoolingUnitDevice,
cả hai đều chứa đặc điểm
OnOff. Bằng cách chỉ định loại thiết bị, bạn sẽ không gặp phải tình trạng mơ hồ về phần nào của thiết bị kích hoạt quy trình tự động hoá.
Điều kiện khởi động dựa trên sự kiện
Khi khai báo một nút điều kiện khởi động dựa trên sự kiện, hãy chỉ định:
- thiết bị
- loại thiết bị mà đặc điểm thuộc về
- sự kiện
starter<_>(doorBell, GoogleDoorbellDevice, DoorbellPressed)
Điều kiện khởi động dựa trên cấu trúc và sự kiện, có các tham số
Một số sự kiện có thể có các tham số, vì vậy, bạn cũng cần đưa các tham số này vào điều kiện khởi động.
Ví dụ: điều kiện khởi động này sử dụng
Time của đặc điểm ScheduledTimeEvent để kích hoạt quy trình tự động hoá vào lúc 7:00:
val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(
LocalTime.of(7, 0, 0, 0)))
}
Điều kiện khởi động dựa trên thời tiết
Bạn có thể chỉ định điều kiện thời tiết hiện tại hoặc dự báo trong điều kiện khởi động bằng cách sử dụng đặc điểm Thời tiết:
val weatherState = starter<_>(structure, trait = Weather)
Xem phần Đóng rèm nếu có khả năng trời mưa trên trang Ví dụ về quy trình tự động hoá.
Điều kiện khởi động thủ công
Điều kiện khởi động thủ công là một loại điều kiện khởi động đặc biệt cho phép người dùng chạy quy trình tự động hoá theo cách thủ công.
Khi khai báo điều kiện khởi động thủ công:
- Không chỉ định đặc điểm hoặc loại thiết bị.
- Cung cấp một phần tử trên giao diện người dùng gọi
Automation.execute().
Khi đặt điều kiện khởi động thủ công trong luồng select cùng với một điều kiện khởi động khác, điều kiện khởi động thủ công sẽ ghi đè điều kiện khởi động khác:
select {
manualStarter()
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
}
Xin lưu ý rằng mọi nút condition theo sau điều kiện khởi động thủ công sẽ được đánh giá và có thể chặn quá trình thực thi quy trình tự động hoá, tuỳ thuộc vào biểu thức condition.
Một cách để cấu trúc quy trình tự động hoá sao cho các nút condition không chặn quy trình tự động hoá được kích hoạt bằng điều kiện khởi động thủ công là đặt điều kiện khởi động khác trong một luồng tuần tự riêng biệt cùng với condition của điều kiện khởi động đó:
automation_graph {
sequential {
select {
sequential {
starter<_>(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
}
Tham chiếu giá trị của một thuộc tính
Để sử dụng giá trị của một thuộc tính trong biểu thức, hãy sử dụng cú pháp sau.
Với stateReader:
val time = stateReader<_>(structure, Structure, Time)
val currTime = time.currentTime
Với starter:
val starterNode = starter<_>(device1, LaundryWasherDevice, OnOff)
condition() {
expression = starterNode.onOff equals true
}
Nút và biểu thức điều kiện
Nút điều kiện đại diện cho một điểm quyết định xác định xem quy trình tự động hoá có tiếp tục hay không. Một quy trình tự động hoá có thể có nhiều nút condition.
Nếu biểu thức của bất kỳ nút condition nào đánh giá thành false, thì quá trình thực thi toàn bộ quy trình tự động hoá sẽ kết thúc.
Trong nút condition, bạn có thể kết hợp nhiều tiêu chí điều kiện bằng
nhiều toán tử, miễn là biểu thức
đánh giá thành một
giá trị boolean duy nhất. Nếu giá trị kết quả là true, thì điều kiện sẽ được đáp ứng và quy trình tự động hoá sẽ tiếp tục thực thi nút tiếp theo. Nếu giá trị là false, thì quy trình tự động hoá sẽ ngừng thực thi tại thời điểm đó.
Các biểu thức được hình thành tương tự như các biểu thức trong Kotlin và có thể chứa các giá trị nguyên thuỷ như số, ký tự, chuỗi và boolean, cũng như các giá trị Enum. Việc nhóm các biểu thức con bằng dấu ngoặc đơn cho phép bạn kiểm soát thứ tự đánh giá các biểu thức con.
Dưới đây là ví dụ về condition kết hợp nhiều biểu thức con thành một biểu thức duy nhất:
condition() {
val expr1 = starterNode.lockState equals DlLockState.Unlocked
val expr2 = stateReaderNode.lockState equals true
val expr3 = occupancySensingDevice.occupied notEquals 0
val expr4 = timeStateReaderNode
.currentTime
.between(
timeStateReaderNode.sunsetTime,
timeStateReaderNode.sunriseTime)
expression = (expr1 and expr2) or (expr3 and expr4)
}
Bạn có thể tham chiếu giá trị của một đặc điểm được truy cập thông qua điều kiện khởi động:
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
Cách khác để tham chiếu các giá trị thuộc tính đặc điểm trong nút condition là sử dụng nút stateReader.
Để thực hiện việc này, trước tiên, hãy nắm bắt giá trị thuộc tính đặc điểm trong nút stateReader. stateReader lấy structure và đặc điểm làm đối số:
import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)
Sau đó, tham chiếu stateReader trong nút condition:
condition() {
expression =
filterMonitoringState.changeIndication
.equals(ChangeIndicationEnum.Warning)
}
Khi sử dụng toán tử so sánh và
toán tử logic, bạn có thể sử dụng nhiều
stateReaders trong nút condition:
val armState = stateReader<_>(doorLock, DoorLockDevice, ArmDisarm )
val doorLockState = stateReader<_>(doorLock, DoorLockDevice, DoorLock)
condition() {
expression =
(armState.armState equals true)
and
(doorLockState.lockState equals true)
}
Thời lượng điều kiện
Ngoài biểu thức boolean trong điều kiện, bạn có thể chỉ định khoảng thời gian mà biểu thức phải đúng để chạy quy trình tự động hoá. Ví dụ: bạn có thể xác định một điều kiện chỉ kích hoạt nếu đèn đã bật trong mười phút.
condition {
expression(lightStateReader.onOff == true)
forDuration(Duration.ofMinutes(10))
}
Thời lượng có thể từ 5 giây đến 24 giờ.
Nút hành động
Nút hành động là nơi diễn ra hoạt động của quy trình tự động hoá.
Trong ví dụ này, hành động gọi lệnh
broadcast() của đặc điểm
AssistantBroadcast:
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
Câu lệnh nhập
Khi phát triển quy trình tự động hoá, bạn không phải lúc nào cũng biết cách nhập nhiều thành phần của Home API vào mã của mình.
Các thuộc tính đặc điểm được nhập từ đối tượng Companion của đặc điểm:
import com.google.home.matter.standard.OnOff.Companion.onOff
Các cấu trúc dữ liệu do một đặc điểm xác định được nhập từ lớp đặc điểm có tên kết thúc bằng "-Trait":
import com.google.home.matter.standard.MediaPlaybackTrait.PlaybackStateEnum
Các lệnh đặc điểm được nhập từ đối tượng Companion của đặc điểm:
import com.google.home.matter.standard.Thermostat.Companion.setTemperatureSetpointHold