Hãy tham khảo hướng dẫn sau đây để hiểu cách sử dụng nhiều nút DSL tự động hoá để tạo một quy trình tự động hoá.
Tất cả DSL tự động hoá được đặt trong một nút automation
. Nút automation
tạo thành ranh giới giữa ngữ cảnh ngôn ngữ Swift bên ngoài và ngữ cảnh DSL nhúng.
Luồng tuần tự
Quy trình tuần tự là loại quy trình tự động hoá mặc định.
Dưới đây là một mẫu DSL tự động hoá rất cơ bản sử dụng một luồng tuần tự bao gồm một trình khởi động, một điều kiện và một hành động:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
Bạn có thể tinh chỉnh điều này bằng cách thêm các nút khác.
Starter
Các nút 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 phải có ít nhất một trình khởi động, nếu không quy trình đó sẽ không xác thực được. Để thêm nhiều trình khởi động vào một thao tác tự động, bạn phải sử dụng nút select
.
Trình khởi động dựa trên thuộc tính đặc điểm
Khi khai báo nút 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,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
Bạn phải có tham số loại thiết bị vì tham số này cho phép bạn chỉ định loại thiết bị trong một thiết bị mà tính năng tự động hoá sẽ xử lý. Ví dụ: một thiết bị có thể bao gồm FanDeviceType
và HeatingCoolingUnitDeviceType
, cả hai đều chứa đặc điểm OnOffTrait
. Bằng cách chỉ định loại thiết bị, bạn sẽ không còn mơ hồ về việc phần nào của thiết bị kích hoạt tính năng tự động hoá.
Trình khởi động dựa trên sự kiện
Khi khai báo nút khởi động dựa trên một 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,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
Trình khởi động dựa trên cấu trúc và sự kiện, có các thông số
Một số sự kiện có thể có tham số, vì vậy, bạn cũng cần đưa các tham số này vào trình khởi động.
Ví dụ: trình khởi động này sử dụng ScheduledEvent
của TimeTrait
để kích hoạt tính năng tự động hoá lúc 7:00 sáng:
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
Trình khởi động thủ công
Trình khởi động thủ công là một loại trình 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 trình khởi động thủ công:
- Không chỉ định một đặc điểm hoặc loại thiết bị.
- Cung cấp một phần tử giao diện người dùng gọi
Automation.execute()
.
Khi đặt trình khởi động thủ công trong luồng select
cùng với một trình khởi động khác, trình khởi động thủ công sẽ ghi đè trình khởi động khác:
select {
manualStarter()
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
}
Xin lưu ý rằng mọi nút condition
theo sau trình khởi động thủ công sẽ được đánh giá và có thể chặn quá trình thực thi quá trình tự động hoá, tuỳ thuộc vào biểu thức condition
.
Một cách để thiết lập cấu trúc tự động hoá sao cho các nút condition
không chặn một quy trình tự động hoá được kích hoạt bằng trình khởi động thủ công là đặt trình khởi động khác vào một luồng tuần tự riêng biệt cùng với condition
:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
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
:
typealias TimeTrait = Google.TimeTrait
let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime
Với starter
:
typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait
let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
Nút điều kiện và biểu thức
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ộ quá 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 cách sử dụ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ị thu được là true
, thì điều kiện đã được đáp ứng và quá trình tự động hoá sẽ tiếp tục thực thi nút tiếp theo. Nếu là false
, quá trình tự động hoá sẽ ngừng thực thi tại thời điểm đó.
Biểu thức được tạo tương tự như biểu thức trong Swift và có thể chứa các giá trị gốc 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 đó.
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 {
let exp1 = starterNode.lockState.equals(.unlocked)
let exp2 = stateReaderNode.lockState.equals(true)
let exp3 = occupancySensingDevice.occupied.notEquals(0)
(exp1.and(exp2)).or(exp3)
}
Bạn có thể tham chiếu giá trị của một đặc điểm được truy cập thông qua trình khởi động:
typealias OnOffTrait = Matter.OnOffTrait
let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
Một cách khác để tham chiếu giá trị thuộc tính đặc điểm trong nút condition
là sử dụng nút stateReader
.
Để làm việc này, trước tiên, hãy ghi lại 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ố:
typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait
let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)
Sau đó, tham chiếu stateReader
trong nút condition
:
condition {
filterMonitoringState.changeIndication.equals(.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 một nút condition
:
typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait
let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
let exp1 = armState.armState
let exp2 = doorLockState.lockState
exp1.and(exp2)
}
Thời lượng của điều kiện
Ngoài biểu thức boolean trong một điều kiện, bạn có thể chỉ định một khung thời gian trong đó biểu thức phải đúng để chạy quy trình tự động. 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 10 phút.
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
Thời lượng có thể từ 1 đến 30 phút.
Nút hành động
Nút hành động là nơi diễn ra công việc của quy trình tự động hoá.
Trong ví dụ này, thao tác gọi lệnh broadcast()
của AssistantBroadcastTrait
:
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}