Home Assistant

Home Assistant: rèm và cửa cuốn thông minh

Rèm cửa thông minh

Thêm cửa cuốn, rèm tự động vào Home Assistant, ước lượng vị trí mở và tự động điều khiển

Photo: tiltsmarthome.com
18 phút để đọc hết nội dung

Trong Home Assistant, các loại rèm tự động, cửa tự động, mái che tự động, cửa sổ tự động v.v.. đều được đặt chung dưới cùng một domain: cover. Domain này có 3 đặc điểm chính: open (mở), close (đóng) và position (vị trí – % đóng/mở). Các đặc điểm này chỉ mang tính tương đối và phụ thuộc vào loại thiết bị thực tế, ví dụ với cửa cuốn thì open – mở cũng được gọi là up – lên, và close – đóng tương đương với down – xuống.

Cửa cuốn, rèm thông minh trong Home Assistant
Cover trong Home Assistant

Position – vị trí là tính năng quan trọng khi cho phép người dùng biết được cửa đã hoàn toàn đóng hay hoàn toàn mở và mức độ cửa mở. Dựa trên postition, trong Home Assistant, ta cũng dễ dàng thiết lập các automation mở/đóng cover đến một vị trí nhất định theo thời gian, độ sáng v.v.. mà không bị hạn chế phải đóng hết hoặc mở hết.

Trong bài này, để đơn giản, các thiết bị trên trong Home Assistant sẽ được gọi chung là cover.

Các thiết bị cover được hỗ trợ sẵn

Khá nhiều các loại cover (tức bao gồm rèm cửa, cửa gara, tấm che gió, cửa sổ v.v..) thông minh được hỗ trợ sẵn trong Home Assistant như:

  • Aqara thông qua Xiaomi gateway (Aqara)
  • KNX thông qua KNX integration
  • IKEA Tradfri thông qua gateway
  • Fibaro thông qua Fibaro hub
  • Các công tắc rèm từ SonOFF, Tuya v.v.. thông qua firmware Tasmota
  • và nhiều nữa

Hỗ trợ sẵn có nghĩa là một khi liên kết thành công vào Home Assistant, ít nhất các chức năng open/closeset_position (đóng/mở đến một vị trí) phải hoạt động. Các thiết bị này cũng thông báo vị trí đóng/mở mà không cần thao tác đặc biệt gì trên Home Assistant.

Các thiết bị cover không được hỗ trợ sẵn

Các cover dạng này trong Home Assistant

Các thiết bị này có thể đang được liên kết vào Home Assistant ở hai dạng:

  1. Dưới cùng domain cover nhưng không có thông tin position và không hỗ trợ dịch vụ đưa cover đến vị trí nhất định như cover hỗ trợ bởi Tuya integration.
  2. Chỉ là các switch – công tắc để thao tác với cover, không thể xác định vị trí và không thể đóng/mở đến vị trí chính xác mà không thao tác và quan sát thủ công.
    Nếu bạn sử dụng công tắc rèm/cửa cuốn từ Tuya, SonOFF được flash Tasmota để liên kết vào Home Assistant nhưng không được cấu hình đúng thì sẽ rơi vào trường hợp này.

Các thiết bị rèm/cửa cuốn điều khiển bằng sóng RF/IR (thông qua Broadlink/Tuya/Xiaomi Universal Remote v.v..) cũng thuộc nhóm này.

Cách xác định và điều khiển vị trí của cover loại này

Nếu không sử dụng các thiết bị phụ trợ (như cảm biến khoảng cách, cảm biến tiệm cận, cảm biến encoder, cảm biến đo góc .v..) thì vị trí của cover chỉ có thể được xác định gián tiếp, do vậy chỉ tương đối chứ không hoàn toàn chính xác. Còn nếu đã sử dụng thiết bị phụ trợ thì có lẽ sử dụng luôn các cover được hỗ trợ chính thức sẽ nhanh, đẹp và rẻ hơn.

Để tránh bối rối thì ở đây, vị trí:

  • 0Đóng hoàn toàn
  • 100Mở hoàn toàn
Rèm đóng và mở
Minh hoạ: vị trí Đóng và Mở

Điều kiện cần và đủ

Để xác định được vị trí của cover dạng này trong Home Assistant thì thiết bị vật lý (rèm, cửa cuốn v.v..) phải đạt mấy yêu cầu sau:

  • Có thời gian đóng hoàn toàn (0) từ vị trí mở hoàn toàn (100) tương đối ổn định
  • Có thời gian mở hoàn toàn (100) từ vị trí đóng hoàn toàn (0) tương đối ổn định

Để đặt được vị trí cho cover (thông qua dịch vụ cover.set_cover_position) thì thiết bị bắt buộc phải hỗ trợ thao tác Dừng – Stop và phải điều khiển được thao tác này trong Home Assistant.

Tích hợp đầy đủ cover dạng này vào Home Assistant

Tích hợp đầy đủ nghĩa là thiết bị sẽ được thể hiện dưới domain cover với đầy đủ vị trí và hỗ trợ dịch vụ cài đặt vị trí.

Các hướng dẫn bên dưới giả định rằng bạn đã điều khiển được các thao tác open/close/stop từ Home Assistant.

Cài đặt custom component

Để thêm cover dạng này vào Home Assistant, ta sẽ sử dụng custom_component Cover Time Based RF (trigger script) của tác giả nagyrobi. Bạn có thể cài đặt component này qua HACS hoặc tải về thủ công tại github repo của nó.

RF Time Based Cover
Tìm và cài đặt component này trong HACS
! Về custom componentcustom card

Là các component hay Lovelace card/module được phát triển bởi cộng đồng nhưng không/chưa được thông qua chính thức bởi nhóm phát triển Home Assistant. Việc cập nhật hay hỗ trợ hoàn toàn phụ thuộc vào tác giả và cộng đồng người dùng.
Bạn cũng sẽ phải tự chịu trách nhiệm và tự quản lý các custom component/custom card này.

Chúng tôi khuyến nghị bạn chỉ cài đặt những component hay card thực sự cần thiết để tránh lỗi, giảm nguy cơ bảo mật và đảm bảo hiệu suất máy chủ Hass. Trên một số thiết bị hay trình duyệt, các custom card có thể gây lỗi hoặc làm chậm đáng kể hiệu suất tải giao diện.
Hãy thận trọng khi cài đặt một custom mới trên máy chủ Hass chính của bạn vì có thể gây ra lỗi nghiêm trọng làm gián đoạn hoạt động bình thường của máy chủ và các thiết bị khác.

Cấu hình component

Cấu hình mẫu của component này như bên dưới, bạn thay đổi tên cover và các thông số khác cho phù hợp. Cấu hình mẫu này có thể được thêm vào file cấu hình chính /config/configuration.yaml của Home Assistant hoặc vào một file riêng nếu bạn có nhiều cover và muốn giữ file configuration.yaml gọn gàng.

cover:
  - platform: cover_rf_time_based
    devices:
      office_cover_time_based:
        name: Office Cover
        travelling_time_up: 96
        travelling_time_down: 69
        close_script_entity_id: script.office_cover_close
        open_script_entity_id: script.office_cover_open
        stop_script_entity_id: script.office_cover_stop
        send_stop_at_ends: false
Giải thích cấu hình trên

Các cấu hình bắt buộc:

  • platform: cover_rf_time_based không thay đổi
  • office_cover_time_based bắt đầu cấu hình của một cover dạng rf_time_based, lưu ý rằng khác với một số component khác, lựa chọn này sẽ không được sử dụng làm entity_id
  • name: tên của cover, nên đặt tên gợi nhớ và ngắn gọn, đây cũng sẽ là nội dung được chọn làm entity_id trừ phi cấu hình alias:
  • travelling_time_up: thời gian cover open – mở hoàn toàn (0 -> 100), tính bằng giây (xem ở dưới: cân chỉnh cover)
  • travelling_time_down: thời gian cover close – đóng hoàn toàn (100 -> 0), tính bằng giây (xem ở dưới: cân chỉnh cover)
  • close/open/stop_script_entity_id: entity_id của các script dùng cho các chức năng tương ứng
    Mặc dù cả tên component và cấu hình đều dùng script, bạn có thể dùng switch thay thế

Cấu hình tuỳ chọn:

  • send_stop_at_ends: có kích hoạt lệnh stop (stop_script_entity_id:) khi rèm đạt position 0 hoặc 100 hay không?
    Một số cover/switch như Tasmota, Tuya sẽ giữ nguyên trạng thái relay sau khi kích hoạt mà không ngắt (nhờ tính năng an toàn, động cơ sẽ tự ngắt ở điểm đầu/cuối) khi đã hoàn tất dẫn đến trạng thái switch bị sai trên Home Assistant (switch luôn ‘on’). Tuỳ chọn true sẽ kích hoạt lệnh stop và do vậy trả về trạng thái đúng của các switch còn lại
    Tuy nhiên, gửi lệnh Stop ở cuối có thể khiến khả năng cân chỉnh “tự động” của cover bị vô hiệu hoá (xem ở dưới: cân chỉnh cover)
  • aliases: sử dụng tuỳ chọn này làm entity_id thay vì tạo ra từ name:
Tạo các script

Trong cấu hình component trên yêu cầu sử dụng các script để đóng, mở và dừng cover. Nếu bạn đang có các script hay switch này trong Home Assistant thì có thể dùng ngay mà không cần bước này.

Ở đây ta ví dụ một số cấu hình tạo script thường thấy.

Script mẫu gửi lệnh IR/RF từ Broadlink:

office_cover_open:
  alias: Open Office Cover
  sequence:
  - service: broadlink.send_command
    data:
      host: 192.168.1.100
      packet: 'sgBKAgsZGAwYDBcNCxkMGBgMDBkLGQsZFw0XDQsZFw0LGQsZGAwMGBgMDBgMGQsYDB'

Script mẫu gửi lệnh đến thiết bị qua giao thức MQTT:

basement_cover_close:
  alias: Close Basement Roller Shutter
  sequence:
  - service: mqtt.publish
    data:
      topic: 'cmnd/basement_shutter/POWER1'
      payload: 'OFF'
Cân chỉnh cover
Cân chỉnh trước khi hoàn tất cấu hình

Trước khi hoàn tất cấu hình, cần đo thời gian open/close hoàn toàn của cover. Bạn có thể sử dụng đồng hồ bấm giờ hoặc ứng dụng bấm giờ trên điện thoại để đo:

  • Thời gian cần để cover từ mở hoàn toàn (động cơ dừng) đến lúc đóng hoàn toàn (động cơ dừng)
  • Thời gian cần để cover từ đóng hoàn toàn đến khi mở hoàn toàn

Lưu ý rằng thời gian này tính từ khi ấn nút/gọi script điều khiển trên Home Assistant đến khi động cơ dừng hoàn toàn. Với nhiều loại cover, thời gian đóng và mở sẽ khác nhau (thường thời gian thả xuống sẽ ngắn hơn kéo lên).

Cân chỉnh trong quá trình hoạt động

Trong quá trình hoạt động có thể vị trí ước lượng của cover sẽ bị sai khác với thực tế do cover được thao tác thủ công (gọi script/switch thay vì cover, ấn nút thủ công, kéo thủ công), do đo đạc và do biến động của động cơ (nhanh hơn/chậm hơn do điện áp). Thông thường vị trí này sẽ được cân chỉnh lại khi cover đóng hoặc mở hoàn toàn (vị trí 0 & 100) bởi Home Assistant nếu tuỳ chọn send_stop_at_ends: false không được mở.

Nếu bạn mở tuỳ chọn trên, cần gọi thủ công script/switch đóng hoặc mở cover và để cover hoàn toàn đóng/mở, sau đó đặt vị trí tương ứng của cover tạo ở trên bằng giao diện hoặc dịch vụ cover.set_cover_position. Xem phần automation cân chỉnh cover ở dưới.

Về vị trí cover

Lưu ý rằng vị trí này chỉ được ước lượng qua thời gian nên có thể có sai số và sẽ kém chính xác trong một số trường hợp như:

  • Một số cửa cần có thời gian để khởi động motor sau khi bấm nút
  • Với loại cửa cuốn & rèm cuốn, khi mới xuống ít thì tốc độ sẽ nhanh hơn khi gần hết (do chu vi của roller) do vậy vị trí trong Home Assistant so với thực tế sẽ sai lệch

Tasmota Shutter

Nếu bạn đang sử dụng Tasmota firmware trên thiết bị điều khiển cửa cuốn/rèm có tích hợp vào Home Assistant, có thể cấu hình Tasmota để sử dụng shutter có sẵn thay vì sử dụng component trên.

Ưu điểm của shutter trong Tasmota:

  • Kiểm soát an toàn trực tiếp trên thiết bị (công tắc điều khiển)
  • Có nhiều điểm mốc để nội suy vị trí hơn thay vì chỉ có 2 điểm 0 & 100 do vậy vị trí sẽ chính xác hơn
  • Không bị sai lệch vị trí khi gọi switch/script trên Home Assistant mà không qua cover
Một mẫu công tắc WiFi điều khiển rèm trên thị trường

Không dùng custom component

Nếu bạn không thể cài đặt component ở bước trên hoặc không muốn dùng, bạn có thể sử dụng một bộ các thành phần bao gồm: template_cover, input_number, timer và automation để ước lượng và điều khiển cover mà không cần phụ thuộc component bên ngoài.

Đây là bộ cấu hình yaml được phát triển bởi chúng tôi trước khi có component trên. Ưu điểm là hoàn toàn sử dụng các thành phần trong Home Assistant, dễ dàng cải tiến & và phát triển thêm, không bị sai lệch vị trí do thao tác không qua cover trên Home Assistant, là ví dụ khá hay về automation trong Home Assistant. Nhược điểm là khá khó để cấu hình và nhân rộng.

Bạn có thể xem và tải về từ đây: github.com/konnectedvn

Thao tác với cover

Hiển thị trên Lovelace

Cover có thể được hiển thị trên Lovelace nhờ entities card. Khi đó bạn có thể biết trạng thái đóng mở và thao tác với cover bằng cách ấn vào biểu tượng trên card.

Nếu thích “màu mè” (với nghĩa tốt), bạn có thể sử dụng shutter-card để thể hiện cover. Shutter card có thể được cài đặt qua HACS hoặc tải về thủ công từ github.

Cả 2 card này hiển thị trong Lovelace như ảnh dưới, bên trên là entities card, dưới là shutter-card.

Lovelace cover card in Home Assistant
Cover trong Lovelace

Để hiển thị thanh vị trí, bạn có thể sử dụng input_numberautomation hoặc sử dụng slider-entity-row (cài đặt qua HACS) như bên dưới.

Cover với Slider trong Home Assistant
Hiển thị position slider với slider-entity-row
type: entities
entities:
  - entity: cover.office_cover
  - type: 'custom:slider-entity-row'
    entity: cover.office_cover
    full_row: true

Một số automation với cover

Đóng cover khi mặt trời lên cao

Automation sau sẽ đóng cover đến 80% (tức mở 20%) khi mặt trời lên quá độ cao 15° (còn gọi là elevation – góc thiên đỉnh). Ngoài ra còn có góc phương vị – azimuth xác định hướng chiếu của mặt trời so với phương Bắc la bàn. Kết hợp giữa 2 góc này sẽ tạo ra nhiều automation rất thú vị.

- id: '15932505423430863'
  alias: Office close cover when sun high
  description: Đóng rèm 80% khi mặt trời lên cao quá 15 độ
  trigger:
  - platform: template
    value_template: '{{ state_attr(''sun.sun'',''elevation'')|int > 15 }}'
  condition:
  - condition: template
    value_template: '{{ state_attr(''cover.office_cover'',''current_position'')|int
      > 20 }}'
  action:
  - data:
      position: 20
    entity_id: cover.office_cover
    service: cover.set_cover_position

Tương tự thì bạn có thể áp dụng cho cảm biến ánh sáng thay vì mặt trời.

Cân chỉnh rèm mỗi đêm

Để cân chỉnh rèm mỗi đêm (hoặc ngày tuỳ bạn), ta sẽ cho Home Assistant tự đóng rèm (cover) lại dù có đang đóng hay không rồi gọi thủ công script/switch đóng rèm tương ứng để đảm bảo là rèm thật sự đóng lại hoàn toàn.

Bạn có thể đổi ngược lại cân chỉnh khi mở và thời gian khác tuỳ ý.

- id: '1593251237854'
  alias: Office cover calibrate at 2300
  description: Tự cân chỉnh rèm (đóng) vào lúc 23g
  trigger:
  - at: '23:00:00'
    platform: time
  condition: []
  action:
  - data:
      position: 0
    entity_id: cover.office_cover
    service: cover.set_cover_position
  - timeout: 00:05:00
    wait_template: '{{ is_state(''cover.office_cover'',''close'') }}'
  - data: {}
    service: script.office_cover_close

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).