Home Assistant

Home Assistant: Tạo báo động bằng Automation

Bảo vệ gia đình bạn với Smart Home

Ứng dụng tính năng mới của Home Assistant 0.113 để tạo báo động khi phát hiện bất cứ cửa nào mở

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

Với loạt tính năng mới ra mắt trong phiên bản Home Assistant 0.113, automation trong Hass giờ trở nên mạnh mẽ hơn bao giờ hết. Trong bài này ta sẽ thử sử dụng tính năng mới repeat của Hass để tạo một báo động, gần tương tự với báo động tạo bởi alert trước đây.

Yêu cầu: Home Assistant phiên bản 0.113 trở lên

Cách báo động này hoạt động

Ở đây ta sẽ dùng automation để liên tục gửi tin nhắn đến điện thoại di động, sử dụng thông báo của ứng dụng Home Assistant (iOS/Android) cho đến khi điều kiện được cho ban đầu không còn đúng. Bên cạnh gửi tin nhắn, ta cũng sẽ phát ra một đoạn âm thanh được ghi âm trước đến một loa (media_player) nào đó. Cụ thể các thành phần như trong mô tả bên dưới.

Kích hoạt – triggers

Báo động sẽ được kích hoạt khi một cửa nào đó được mở ra. Ở đây ta xác định trạng thái mở cửa bằng cảm biến mở cửa. Một trong các cảm biến mở cửa hay dùng là Xiaomi Mijia Door Sensor như loại trong bài viết này: Home Assistant: kết nối thiết bị Zigbee qua zigbee2mqtt.

Cảm biến mở cửa Zigbee Xiaomi (retina)
Các cảm biến cửa từ Aqara và Mijia (Xiaomi)

Ngoài các cảm biến cửa thì bạn cũng có thể sử dụng trạng thái đóng/mở của cửa cuốn, cửa nâng (cover) hay trạng thái của bất cứ entity nào khác trong Home Assistant.

Điều kiện kích hoạt – conditions

Chỉ kích hoạt báo động (automation) này khi cửa được mở ra vào khoảng thời gian từ 23g đêm hôm trước đến 5g sáng hôm sau.

Hành động – actions

Các hành động sẽ được Hass thực hiện khi báo động được kích hoạt và thoả mãn điều kiện trên:

  • Lập tức gửi thông báo đến ứng dụng trên điện thoại và lặp lại sau mỗi 1 phút cho đến khi điều kiện kích hoạt không còn đúng (cửa đóng lại hoặc đã qua khỏi 5g)
  • Mỗi 30 giây, phát một đoạn âm thanh có sẵn đến loa (thường là Google Home Mini)

Automation YAML

Do các tính năng automation mới, ngoại trừ running modes, hiện chưa thể chỉnh sửa qua UI (trình soạn thảo trực quan), bạn sẽ phải dùng trình soạn thảo YAML đơn thuần rồi reload automation trong Hass để áp dụng.

Để reload automation, bạn cần:

  • Kích hoạt chế độ Nâng cao của người dùng hiện tại, kể cả là owner (xem owner: thiết lập cơ bản Home Assistant) bằng cách truy cập trang quản lý user hiện tại (dưới cùng thanh menu bên trái)
  • Truy cập Cấu hình > Điều khiển máy chủ > Tải lại Tự động hoá

Mã ví dụ automation thực hiện báo động:

- id: '159553420903672729'
  alias: Door Open Alert
  description: Báo động nếu cửa mở giữa đêm
  trigger:
  - entity_id: binary_sensor.door
    platform: state
    from: 'off'
    to: 'on'
  condition: []
  mode: single
  action:
  - repeat:
      while:
        - condition: template
          value_template: "{{is_state(trigger.to_state.entity_id,'on')}}"
        - after: '23:00:00'
          before: '05:00:00'
          condition: time
      sequence:
      - data:
          media_content_id: https://konnected.duckdns.org:8123/local/bell/door_bell.mp3
          media_content_type: music
          entity_id: media_player.bedroom_speaker
        service: media_player.play_media
      - data_template:
          message: "⚠️ Door {{trigger.to_state.attributes.friendly_name}} is Open"
        service: notify.mobileapp_myphone
      - delay:
          minutes: 1

Chú thích:

  • 5 entity_id: binary_sensor.door cảm biến cửa
  • 10 mode: single chế độ hoạt động đơn, khi đang chạy, bỏ qua tất cả các lần kích hoạt tương lai
  • 12 repeat: sử dụng chế độ lặp lại
  • 13 while: lặp lại chừng nào điều kiện bên dưới còn đúng
  • 14 condition: and tất cả các điều kiện bên trong phải đúng (cập nhật 31/07/2020: do một lỗi trong Home Assistant 0.113.0 đã được khắc phục trong 0.113.2, condition trong while không sử dụng AND làm logic mặc định)
  • 15 value_template: trạng thái của entity kích hoạt automation (ở đây là binary_sensor.door) phải là ‘on’ (tham khảo: template trong Hass)
  • 16 điều kiện về thời gian như đã mô tả ở trên
  • 19 sequence: chuỗi hành động lặp lại khi điều kiện còn đúng
  • 21 media_content_id: đường dẫn đến file âm thanh sẽ phát (1: xem ở dưới)
  • 23 entity_id: media_player.bedroom_speaker (các) loa mà bạn sẽ phát ra âm thanh ở trên
  • 27 service: notify.mobileapp_myphone dịch vụ gửi thông báo
  • 29 minutes: 1 tạm dừng 1 phút giữa mỗi lần thực hiện chuỗi hành động

Bạn sẽ phải thay đổi ít nhất ở các dòng số 5, 21, 2327 để automation trên hoạt động được với cấu hình Hass của bạn.

(1) Bạn có thể sử dụng file trên internet hoặc file lưu trữ trên máy chủ Hass. Xem thêm cách lưu và phát các file này trong bài viết Home Assistant: phát file âm thanh ngẫu nhiên đến loa.

Automation với nhiều cảm biến kích hoạt

Automation trên được kích hoạt bởi 1 cảm biến duy nhất là binary_sensor.door. Vậy nếu bạn muốn sử dụng với nhiều cảm biến thì sao?

Sử dụng group

Group là một integration – tích hợp có sẵn của Home Assistant, dùng để nhóm nhiều entity lại với nhau, dùng cho mục đích quản lý.

Trong bài này, ta sẽ nhóm tất cả các cảm biến mà mình muốn sử dụng để kích hoạt automation trên (ví dụ: tất cả các cảm biến cửa chính, cửa sổ v.v..) thành một nhóm, gọi là group.door.

Cách này dựa trên nguyên lý bên dưới và bạn phải chú ý nguyên lý này:

Mặc định, trạng thái của một group sẽ là ‘on’ khi ít nhất 1 entity trong group có trạng thái ‘on’

Cấu hình group như sau:

door:
  icon: mdi:door
  entities:
    - binary_sensor.front_door
    - binary_sensor.front_window
    - binary_sensor.shutter

Lưu ý:

  • Bạn có thể nhóm bao nhiêu entity tuỳ ý nhưng các entity này phải có trạng thái state và ý nghĩa của trạng thái tương đồng (ví dụ, với cảm biến cửa thì on nghĩa là mở và off nghĩa là đóng). Đây là yêu cầu bắt buộc khi dùng cho automation này, không phải yêu cầu của việc tạo group nói chung.
  • Bạn phải chỉnh sửa group này mỗi lần muốn thêm, bớt entity và phải reload group sau khi chỉnh sửa (tương tự cách reload automation).

Sau khi cấu hình và Tải lại Nhóm – Reload Group, một entity mới group.door sẽ được tạo ra là bạn có thể thay thế entity này vào dòng số 5 của cấu hình automation mẫu bên trên.

Sử dụng template binary_sensor

Ưu điểm

So với cách dùng group bên trên thì cách này có ưu điểm:

  • Không cần chỉnh sửa thủ công group mỗi khi bạn lắp thêm hay bỏ bớt cảm biến
  • Có thể cấu hình tuỳ ý mà không bị ràng buộc bởi nguyên lý trạng thái của group

Nhược điểm

Nhược điểm của cách này:

  • Cấu hình phức tạp, bạn phải biết chút ít về template (đừng lo, hãy đọc qua về template đủ để có khái niệm cơ bản đã)
  • Bạn phải cấu hình các entity “chuẩn“, ví dụ: cảm biến cửa phải có device_classdoor trong khi cảm biến cửa sổ sẽ có device_classwindows
    Hầu hết các cảm biến liên kết qua Integration (như zigbee2mqtt) đều có các thông tin cơ bản này
  • Bạn phải nắm rõ các state và ý nghĩa của state của từng loại entity sẽ dùng

Cấu hình YAML

Bên dưới là cấu hình binary_sensor cho trạng thái ‘on‘ khi một trong bất cứ entity nào thuộc một trong các device_class door, windows, garage_door có trạng thái là on (lưu ý rằng ngoài onoff, các entity luôn có thể có trạng thái unknown – không rõ và unavailable – không khả dụng).

Nếu bạn muốn thực hiện báo động cả khi các entity có trạng thái unknownunavailable, bạn sẽ phải chỉnh sửa cấu hình bên dưới.

update red icon Cập nhật trên Home Assistant 0.115

Tuỳ chọn entity_id dưới đây đã bị loại bỏ trong Home Assistant 0.115. Bạn cần đưa nó vào bên trong template như sau nếu đang sử dụng phiên bản 0.115 trở lên:

value_template: >
  {% set force_render = as_local(states.sensor.uptime.last_changed) %}
  {% set open_bsensors = ...

binary_sensor:
- platform: template
  sensors:
    open_door:
      friendly_name: 'Cửa mở'
      entity_id: sensor.uptime
      value_template: >
        {% set open_bsensors = states.binary_sensor|selectattr('state','eq','on')|list %}
        {% set open_door  = open_bsensors|selectattr('attributes.device_class','eq','door')|list|count %}
        {% set open_door  = open_door + open_bsensors|selectattr('attributes.device_class','eq','window')|list|count %}
        {% set open_door  = open_door + open_bsensors|selectattr('attributes.device_class','eq','garage_door')|list|count %}
        {{ open_door > 0 }}

Bạn sẽ phải khởi động lại Home Assistant để khởi tạo binary_sensor trên. Sau khi được tạo ra, sensor này có entity_idbinary_sensor.open_door và có thể được sử dụng thay cho binary_sensor.door trong cấu hình automation mẫu.

Lưu ý Quan trọng

Cảm biến bên trên dựa vào sensor.uptime (dòng 6) để cập nhật trạng thái, do vậy có khoảng trễ khi cập nhật trạng thái (khoảng vài chục giây). Có nghĩa là, nếu một cửa nào đó mở ra rồi đóng lại ngay trong vài giây, có thể cảm biến sẽ không kịp thay đổi. Nếu chưa có cảm biến sensor.uptime, bạn tạo ra nó bằng cấu hình ở bên dưới.

sensor:
  - platform: uptime
    unit_of_measurement: minutes

Để cải thiện, bạn có thể thay sensor.uptime bằng một entity khác có tần suất cập nhật cao hơn hoặc sử dụng automation mẫu ở dưới để cập nhật cảm biến này mỗi 3 giây.

- id: '159557276810'
  alias: Hass Update Door Open Sensor Every 3 Seconds
  description: Cập nhật cảm biến open_door mỗi 3 giây
  trigger:
  - platform: time_pattern
    seconds: '/3'
  condition: []
  action:
  - data: {}
    entity_id: binary_sensor.open_door
    service: homeassistant.update_entity

Tóm tắt

Để tạo báo động kiểu này trong Hass, bạn sẽ cần:

  • Home Assistant 0.113 trở lên
  • Một hoặc nhiều cảm biến hay entity để kích hoạt báo động
  • Một group hoặc binary sensor để kích hoạt trong trường hợp nhiều cảm biến
  • Ít nhất một phương thức để nhận báo động như: điện thoại, loa, đèn, 🐶 (🤣 – j/k)
  • Một automation để liên kết tất cả các thứ trên
  • Thêm một automation nữa để cập nhật ‘cưỡng bức’ binary_sensor nếu muố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).