Hướng dẫn về DSL iOS cho các quy trình tự động hoá phức tạp

Bạn có thể dùng DSL tự động hoá để tạo các quy trình tự động hoá phức tạp hơn so với những quy trình được đề cập trong Hướng dẫn về DSL – các quy trình tự động hoá cơ bản trên iOS.

Tuần tự với nhiều hành động

Tuần tự với nhiều hành động

Một thao tác tự động có thể làm nhiều việc. Ví dụ: thay vì một nút action duy nhất, bạn có thể có nhiều nút action chạy theo thứ tự tuần tự:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  action {...}
  action {...}
  action {...}

}

Tuần tự với nhiều hành động song song

Tuần tự với nhiều hành động song song

Nếu bạn đặt nhiều nút action trong một nút parallel, các thao tác sẽ thực thi đồng thời.

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  starter(...)
  condition {...}
  parallel {
    action {...}
    action {...}
    action {...}
  }

}

Nếu có các nút action trong nút sequential xuất hiện sau nút parallel, thì các nút này sẽ đợi thực thi cho đến khi tất cả các nút trong nút parallel thực thi xong.

Các hoạt động gây trở ngại giao thông

Bạn có thể tạm dừng quy trình tự động hoá bằng phương thức delay(for:). Phương thức này nhận một đối số Duration biểu thị khoảng thời gian tạm dừng trước khi tiếp tục thực thi. Thời lượng tạm dừng có thể ngắn nhất là 5 giây hoặc dài nhất là 24 giờ.

Ví dụ: để bật/tắt đèn 4 lần, mỗi lần cách nhau 5 giây:

typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait

sequential {
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
  delay(for:.seconds(5))
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}

Chặn điều kiện kích hoạt

Tính năng ngăn chặn kích hoạt cho phép quy trình tự động hoá của bạn bỏ qua một starter trong một khoảng thời gian cụ thể sau sự kiện kích hoạt ban đầu. Ví dụ: nếu chế độ tự động hoá có starter được kích hoạt bằng tính năng phát hiện chuyển động và nếu bạn chỉ định thời lượng chặn kích hoạt là 5 phút, thì khi starter kích hoạt, chế độ này sẽ không kích hoạt lại trong 5 phút tiếp theo. Điều này ngăn quy trình tự động hoá kích hoạt liên tục và nhanh chóng.

Để áp dụng tính năng chặn kích hoạt cho quy trình tự động hoá, hãy sử dụng từ khoá suppress(for:) với đối số Duration biểu thị khoảng thời gian chờ trước khi phản hồi các sự kiện kích hoạt tiếp theo. Thời gian chặn có thể ngắn nhất là 5 giây hoặc dài nhất là 24 giờ.

typealias OccupancySensorDevice = Matter.OccupancySensorDeviceType
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias MotionDetectionTrait = Google.MotionDetectionTrait
typealias OnOffTrait = Matter.OnOffTrait

automation {
  let starterNode = starter(device, OccupancySensorDevice.self, MotionDetectionTrait.self)
  starterNode
  suppress(for: .seconds(30 * 60)  // 30 minutes
  action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}

Xin lưu ý rằng tính năng chặn sự kiện kích hoạt sẽ ảnh hưởng đến tất cả starters trong một quy trình tự động hoá diễn ra trước Suppression.

Đặt thuộc tính đặc điểm trong một hành động

Cách đặt giá trị cho một thuộc tính đặc điểm:

  1. Tạo một nút update trong nút action, bao gồm cả đặc điểm liên quan làm đối số cho nút update:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. Trong nút update, đối với mỗi thuộc tính cần sửa đổi, hãy dùng một hàm đột biến và truyền giá trị mới cho hàm đó. Cách đặt tên cho hàm sửa đổi:
    1. Viết hoa tên thuộc tính
    2. Thêm từ set vào trước tên hàm.
    Ví dụ: để cập nhật một thuộc tính có tên là defaultMoveRate, bạn sẽ sử dụng một hàm biến đổi có tên là setDefaultMoveRate.

Xin lưu ý rằng một nút update có thể có nhiều hàm đột biến. Sau đây là ví dụ về trường hợp cập nhật 2 thuộc tính:

typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait

action(fan, FanDeviceType.self) {
  update(FanControlTrait.self) {
    $0.setFanMode(.on)
  }
}