Home Assistant

Hass – Automation: tạo thanh trượt hẹn giờ trên giao diện

Hệ thống tưới tự động hẹn giờ tắt trong Home Assistant

Tạo thanh trượt hẹn giờ tắt trên Hass, dễ dàng điều khiển và cài đặt

Photo: www.realtylandscaping.com
14 phút để đọc hết nội dung

Bộ đếm giờ – timer là một chức năng được sử dụng thường ngày như hẹn giờ tắt hệ thống điều hoà không khí, TV sau một vài giờ; tự động tắt hệ thống tưới một thời gian sau khi được mở lên v.v..

Chuyển nhanh đến phần code Automation.

Trong Hass, bên cạnh tính năng hẹn giờ, thì tính năng đếm ngược giờ cũng rất hữu ích. Thông thường điều này được thực hiện tương đối đơn giản bằng cách sử dụng automation – tự động hoá với trigger – bộ kích hoạt bằng trạng thái – state có đếm thời gian (for:) hoặc sử dụng action – hành động delay:. Tuy nhiên cả 2 phương pháp trên chỉ thích hợp khi cài đặt một lần duy nhất rồi sử dụng mà không cần quan tâm đến giao diện điều khiển, không cần người dùng tác động và cũng không cho phép người dùng quan sát khoảng thời gian còn lại trước khi timer hết hạn.

! Lưu ý về action delay

Nếu có thể được thì tôi khuyến cáo bạn nên hạn chế sử dụng action delay. Đặc biệt là khi delay trong một khoảng thời gian dài (từ phút trở lên). Mặc dù delay trong Hass không phải là một blocking action – có khả năng khoá cứng các hoạt động khác, cách Hass xử lý các automation hay script liên quan đến delay rất kém ổn định. Đây là vấn đề về đánh đổi, không phải vấn đề kĩ thuật hay logic, do vậy rất khó để giải quyết trong tương lai gần. (cập nhật: Hass phiên bản 0.113 đã xử lý vấn đề này)
Chưa kể, một khi bạn đang ở trong một delay dài, khả năng xảy ra những sự kiện có thể ảnh hưởng là tương đối khó để dự đoán trước.

Ở bài viết này ta sẽ sử dụng một giải pháp phức tạp hơn một chút, bằng cách tạo một thanh trượt trên giao diện và bộ đếm thời gian sẽ được cài đặt cũng như thể hiện trên thanh trượt này. Giống với nguyên lý hoạt động và điều khiển của bộ hẹn giờ tắt quạt hay TV nhưng trực quan và dễ điều khiển hơn rất nhiều.

Hass Bộ Hẹn Giờ Bật Tắt
Giao diện điều khiển số phút thực hiện tưới

Cách hoạt động và điều khiển

Cách hoạt động mặc định của bộ điều khiển này như sau, giả định rằng ở đây ta sẽ điều khiển thủ công một bộ tưới thông minh, bật/tắt bằng công tắc Irrigation – tưới tiêu, đại diện trong Hass bởi entity có id switch.irrigation.

Bộ hẹn giờ tưới tự động, chống nước
Một bộ hẹn giờ tưới hoạt động bằng pin

Đầu tiên, bạn cần bật bộ tưới này thông qua nút trên giao diện (nút hình tia sét). Sau đó, bạn kéo thanh trượt Irrigation Timer để thiết lập số phút – min hẹn giờ.
Sau khi được thiết lập, chính xác sau mỗi phút, giá trị của thanh trượt đếm giờ sẽ tự động giảm đi 1 giá trị.

Ngay khi giá trị của thanh trượt giảm về 0, switch.irrigation sẽ bị tắt.

Trong suốt quá trình đó, nếu muốn, bạn có thể kéo thanh trượt để tăng/giảm thời gian hẹn giờ.

Nếu công tắc switch.irrigation bị tắt trước khi quá trình đếm kết thúc, thanh trượt sẽ ngừng giảm giá trị.
Việc bật lại công tắc switch.irrigation sẽ không kích hoạt lại bộ đếm giờ cho đến khi nào giá trị thanh trượt bị thay đổi.

Khi công tắc đang bật và bộ hẹn giờ đang hoạt động, ta vô hiệu hoá bộ hẹn giờ bằng cách kéo thanh trượt về giá trị 0.

Cách hoạt động được tóm tắt trong clip sau:

Lưu ý là với cách thiết lập mặc định, bộ hẹn giờ kích hoạt khi và chỉ khi bạn thay đổi thanh trượt sau khi đã bật công tắc.

Những thành phần cần thiết

Như bạn có thể thấy, về mặt giao diện, ta sẽ cần một thanh trượt, tạo bởi integration input_number, một switch để thực hiện bật/tắt. Bạn có thể thay switch bằng các entity/device khác như light, media_player v.v.. sau khi hiểu rõ cách thực hiện.

Bên cạnh đó, ta cũng sẽ cần thêm một timer để tự động đếm ngược từng bước trước khi thể hiện ra giao diện.
timer cũng có thể hiển thị được số thời gian còn lại ra giao diện Lovelace, tuy nhiên ở đây ta cần thể hiện từng bước (như từng phút) và cần điều chỉnh thời gian hẹn giờ.

Cấu hình mẫu của các thành phần này, trừ switch như sau:

input_number:
  irrigation_timer:
    min: 0
    max: 10
    step: 1
    unit_of_measurement: min
    mode: slider
    icon: mdi:camera-timer
    name: 'Irrigation Timer'
    
timer:
  irrigation_countdown:
    name: Irrigation Countdown
    icon: mdi:camera-timer

Chú giải:

  1. input_number.irrigation_timer: thanh trượt hẹn giờ tưới
    min: số nhỏ nhất, nên để mặc định là 0 vì ta sẽ sử dụng giá trị 0 này để xác định thời điểm timer hoàn tất.
    max: giá trị tối đa của bộ đếm, tương ứng với đơn vị. Ví dụ: 5 (hour – giờ).
    unit_of_measurement: đơn vị, bạn chọn tuỳ ý, tuy nhiên trong bài này thì ta sẽ sử dụng một trong ba giá trị hour, minsecond để xác định giá trị thời gian của thanh trượt.
    step: giá trị của một bước thay đổi trên thanh trượt. Bạn nên chọn giá trị phù hợp với các thông số min, max, unit_of_measurement và nhu cầu dễ điều khiển. Ví dụ, nếu bạn chọn khoảng min-max là từ 0-90 phút thì step có thể là 3 (phút) hoặc 5 hay 10. Nếu bạn chọn step quá nhỏ, việc kéo thanh trượt hẹn giờ sẽ khó còn chọn step quá lớn sẽ giảm tính linh hoạt của việc điều chỉnh.
  2. timer: đếm ngược giờ. Ở đây ta không cấu hình khoảng thời gian đếm ngược vì giá trị này sẽ được tạo tự động trong các bước sau.

Sau khi hoàn tất cấu hình 2 entity input_numbertimer trên, bạn khởi động lại Hass để khởi tạo các entity này.

Tạo automation điều khiển bộ hẹn giờ

Ta sẽ cần 2 automation để thực hiện các việc sau:

  1. Giảm giá trị của thanh trượt sau mỗi step, ví dụ 1 min
  2. Khi giá trị thanh trượt giảm về 0, tắt switch

Flow chart của 2 automation này thể hiện trong ảnh sau:

Hass Flow Chart Automation Điều khiển hẹn giờ
đường đứt màu đỏ thể hiện quan hệ “kích hoạt” giữa 2 automation

Cấu hình mẫu của 2 automation này như dưới đây:

- id: '1588495324298'
  alias: Irrigation Timer Control
  description: kích hoạt irrigation timer
  trigger:
  - entity_id: input_number.irrigation_timer
    platform: state
  condition:
  - condition: state
    entity_id: switch.irrigation
    state: 'on'
  - condition: numeric_state
    entity_id: input_number.irrigation_timer
    above: '0'
  action:
  - service: timer.cancel
    entity_id: timer.irrigation_countdown
  - service: timer.start
    entity_id: timer.irrigation_countdown
    data_template:
      duration: >
        {% set unit = state_attr('input_number.irrigation_timer','unit_of_measurement') %}
        {% set step = state_attr('input_number.irrigation_timer','step')|int %}
        {% if unit == 'hour' %}
        {{step*3600}}
        {% elif unit == 'min' %}
        {{step*60}}
        {% else %}
        {{step}}
        {% endif %}
- id: '1588502363558'
  alias: Irrigation Timer Slider Control
  description: giảm giá trị bộ đếm thời gian tưới và điều khiển công tắc
  trigger:
  - event_data:
      entity_id: timer.irrigation_countdown
    event_type: timer.finished
    platform: event
  condition:
  - condition: numeric_state
    entity_id: input_number.irrigation_timer
    above: '0'
  - condition: state
    entity_id: switch.irrigation
    state: 'on'
  action:
  - data: {}
    entity_id: input_number.irrigation_timer
    service: input_number.decrement
  - condition: numeric_state
    entity_id: input_number.irrigation_timer
    below: '1'
  - service: homeassistant.turn_off
    entity_id: switch.irrigation
    data: {}

Bạn chỉ cần thay đổi 3 entity_id là switch.irrigation, input_number.irrigation_timertimer.irrigation_countdown thành các entity tương ứng của mình vào cấu hình trên.

Chú giải:

  • duration: ta tính khoảng thời gian của timer bằng cách lấy giá trị unit_of_measurement nhân với giá trị step.
    Nếu unit là hour – giờ và step là 2 thì duration sẽ là 3600*2 = 7200 giây.
  • timer.canceltimer.start: cần huỷ bỏ timer trước khi khởi động nó để tránh trường hợp timer đang ở giữa quá trình đếm.
    Mỗi khi thay đổi thanh slider, timer sẽ được “reset” với giá trị duration mới.

Một số cách sử dụng khác

Tự động kích hoạt bộ hẹn giờ khi công tắc bật

Khi này, nếu switch.irrigation được bật lên và giá trị của input_number.irrigation_timer lớn hơn 0, timer sẽ được kích hoạt và bắt đầu đếm ngược.

- id: '1588495324298'
  alias: Irrigation Timer Control
  description: kích hoạt irrigation timer
  trigger:
  - entity_id: input_number.irrigation_timer
    platform: state
  - entity_id: switch.irrigation
    platform: state
    to: 'on'
  condition:
  - condition: state
    entity_id: switch.irrigation
    state: 'on'
  - condition: numeric_state
    entity_id: input_number.irrigation_timer
    above: '0'
  action:
  - service: timer.cancel
    entity_id: timer.irrigation_countdown
  - service: timer.start
    entity_id: timer.irrigation_countdown
    data_template:
      duration: >
        {% set unit = state_attr('input_number.irrigation_timer','unit_of_measurement') %}
        {% set step = state_attr('input_number.irrigation_timer','step')|int %}
        {% if unit == 'hour' %}
        {{step*3600}}
        {% elif unit == 'min' %}
        {{step*60}}
        {% else %}
        {{step}}
        {% endif %}
- id: '1588502363558'
  alias: Irrigation Timer Slider Control
  description: giảm giá trị bộ đếm thời gian tưới và điều khiển công tắc
  trigger:
  - event_data:
      entity_id: timer.irrigation_countdown
    event_type: timer.finished
    platform: event
  condition:
  - condition: numeric_state
    entity_id: input_number.irrigation_timer
    above: '0'
  - condition: state
    entity_id: switch.irrigation
    state: 'on'
  action:
  - data: {}
    entity_id: input_number.irrigation_timer
    service: input_number.decrement
  - condition: numeric_state
    entity_id: input_number.irrigation_timer
    below: '1'
  - service: homeassistant.turn_off
    entity_id: switch.irrigation
    data: {}

Dừng bộ hẹn giờ và chuyển thanh trượt về 0 khi tắt công tắc

Khi switch.irrigation chuyển sang trạng thái ‘off’, timer.irrigation_countdown sẽ bị huỷ và input_number.irrigation_timer sẽ bị chuyển giá trị về 0.

hoặc bạn cũng có thể thay đổi một chút để thanh trượt hẹn giờ tự động chuyển về một giá trị đặt trước mỗi khi công tắc bị tắt. Kết hợp với lựa chọn 4.1 sẽ tương đương với việc chỉ cho phép công tắc mở trong một khoảng thời gian cho trước mọi lúc nó được bật lên.

Ngoài các automation như trên, ta chỉ cần thêm một automation kích hoạt khi công tắc switch.irrigation chuyển sang trạng thái ‘off’ như bên dưới.

- id: '1588569631996'
  alias: Irrigation Stop Timer When Switch Off
  description: ngừng timer khi tắt công tắc tưới
  trigger:
  - entity_id: switch.irrigation
    platform: state
    to: 'off'
  condition: []
  action:
  - data:
      value: 0
    entity_id: input_number.irrigation_timer
    service: input_number.set_value
  - data: {}
    entity_id: timer.irrigation_countdown
    service: timer.cancel

Ứng dụng

Sau khi hiểu được cách hoạt động cũng như thiết lập bộ hẹn giờ (khá đơn giản) trong bài này, bạn có thể tuỳ chỉnh theo ý mình để áp dụng cho một số nhu cầu như:

  • Tạo giao diện trực quan để hẹn giờ bật tắt các thiết bị trong nhà, điển hình là điều khiển máy điều hoà nhiệt độ (máy lạnh), quạt hay loa.
  • Sử dụng templating để cải thiện độ linh hoạt của bộ đếm như cho phép dùng giao diện để lựa chọn áp dụng bộ đếm cho một công tắc bất kỳ hoặc một loạt công tắc.
  • Cho phép điều khiển bật tắt một số hệ thống đặc thù như đèn sưởi, bình nước nóng hoặc hệ thống tưới theo cả cách tự động và hẹn giờ tắt thủ công.
    Trong một vài bài tới, chúng tôi sẽ ứng dụng giải pháp này vào điều khiển hệ thống tưới thông minh đáp ứng môi trường có kiểm soát, mong các bạn đón đọc.

Về Bài viết

Bài viết chưa đầy đủ hoặc bạn còn có ý kiến khác? Bạn có thắc mắc và cần thêm thông tin. Vui lòng đăng ý kiến vào mục bình luận để tác giả và Team có thêm thông tin cải thiện chất lượng bài viết. Chúng tôi sẽ giải đáp các thắc mắc ngay trong mục bình luận để giúp được nhiều đọc giả với cùng vấn đề hơn hoặc chúng tôi sẽ trả lời trong một bài viết riêng. Trân trọng cảm ơn bạn!

Cảm ơn bạn đã xem bài viết này!

konnectED Team.

Lên Đầu
  • Đăng ký
Bạn quên mất mật khẩu? Vui lòng nhập tên đăng nhập và địa chỉ email đã đăng ký. Bạn sẽ nhận được liên kết tạo mật khẩu mới qua email (bạn nhớ kiểm tra hộp spam trong trường hợp email đi lạc).