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.
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.
Đầ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:
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, min và second để 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.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_number và timer 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:
- Giảm giá trị của thanh trượt sau mỗi step, ví dụ 1 min
- 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:
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_timer và timer.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.cancel
vàtimer.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.
Nguồn/Tham khảo:
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.