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

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

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

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

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

automation {
  sequential {
    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, thì các hành động sẽ thực thi đồng thời.

automation {
  sequential {
    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 trong các quy trình tự động bằng cách sử dụng từ khoá delayFor . Từ khoá này nhận một đối số java.time.Duration biểu thị thời gian tạm dừng trước khi tiếp tục thực thi. Thời gian 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 với thời gian tạm dừng 5 giây giữa mỗi lần bật/tắt:

sequential {
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}

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

Ngăn chặn trình kích hoạt là một tính năng cho phép quy trình tự động của bạn bỏ qua một starter trong một khoảng thời gian được chỉ định sau sự kiện kích hoạt ban đầu. Ví dụ: nếu quy trình tự động hóa có một 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 gian ngăn chặn trình kích hoạt là 5 phút, thì khi starter kích hoạt, trình kích hoạt sẽ không kích hoạt lại trong 5 phút tiếp theo. Điều này giúp ngăn quy trình tự động kích hoạt nhanh nhiều lần.

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

automation {
  sequential {
    val starterNode = starter<_>(device, OccupancySensor, MotionDetection)
    suppressFor(Duration.ofMinutes(30))
    action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}

Xin lưu ý rằng tính năng ngăn chặn điều kiện kích hoạt ảnh hưởng đến tất cả starters trong một quy trình tự động hoá xuất hiện trước suppressFor.

Giới hạn số lần thực thi

Bạn có thể giới hạn số lần được phép chạy một quy trình tự động.

Ví dụ: bạn có thể muốn thiết lập một quy trình tự động một lần chạy máy hút bụi khi bạn đi Vắng nhà cả ngày.

Để thực hiện việc này, hãy đặt trường siêu dữ liệu của quy trình tự động maxExecutionCount. Ví dụ sau đây là một quy trình tự động hoá chỉ có thể thực thi một lần:

automation {
  // The automation can only be executed once.
  maxExecutionCount = 1
  // When the door lock state changes
  sequential {
    val doorLockEvent = starter<_>(doorLock, DoorLockDevice, LockOperationEvent)
    // if the door is unlocked
    condition() {
      expression = (doorLockEvent.lockOperationType equals LockOperationTypeEnum.Unlock)
    }
    // turn the light on
    action(light, DimmableLightDevice) { command(OnOff.on()) }
  }
}

Quy trình tự động sẽ bị xoá ngay sau khi hoàn tất lần thực thi cuối cùng và đạt đến maxExecutionCount. Mục nhật ký của quy trình tự động vẫn còn trong thẻ Google Home app (GHA) Hoạt động, bao gồm cả automation_id.

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

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

  1. Tạo một nút update trong một nút action, bao gồm cả đặc điểm có liên quan dưới dạng đố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 sử dụng một hàm biến đổi và truyền giá trị mới cho hàm đó. Cách tạo tên của hàm biến đổi:
    1. Viết hoa tên của thuộc tính
    2. Thêm từ set vào trước tên thuộc tính.
    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 biến đổi. Sau đây là một ví dụ về cách cập nhật 2 thuộc tính:

action(device, Fan) {
  update(FanControl) {
    setPercentSetting(50u)
    setRockSetting(FanControlCluster.RockBitmap.rockUpDown)
  }
}