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

Có thể sử dụng Automation DSL để tạo các hoạt động tự động hóa phức tạp hơn những hoạt động được thảo luận trong Hướng dẫn DSL - các hoạt động tự động hóa 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 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ự:

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, các thao tác 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 quá trình tự động hóa của mình bằng cách sử dụng từ khóa delayFor, từ khóa này sử dụng đố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, mỗi lần cách nhau 5 giây:

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()) }
}

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 quy trình tự động hoá 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 lượng chặn kích hoạt là 5 phút, thì khi starter kích hoạt, quy trình này 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 hoá kích hoạt nhanh chóng nhiều lần.

Để á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á suppressFor với đối số java.time.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ờ.

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

Lưu ý rằng việc ngăn chặn kích hoạt ảnh hưởng đến tất cả starters trong quá trình tự động hóa diễn ra trước suppressFor.

Hạn chế số lần thực hiện

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

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

Để thực hiện việc này, hãy đặt trường siêu dữ liệu maxExecutionCount của quy trình tự động hoá. Ví dụ sau đây là một lệnh tự động chỉ có thể thực hiện 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 hoá 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ập nhật ký của quy trình tự động hoá 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ị 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 dưới dạng một đố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 đó. Để tạo tên cho hàm biến đổ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 sửa đổ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:

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