Home Assistant

Home Assistant: trả lại trạng thái trước automation

Tự động hoá trong Automation Home Assistant

Cách để trả lại trạng thái ban đầu của thiết bị sau khi hoàn tất tự động hoá & scene trong Hass

9 phút để đọc hết nội dung

Automation – Tự động hoá được sử dụng rất nhiều trong Home Assistant (Hass) để khiến SmartHome trở nên “thông minh” bằng cách thực hiện các lịch trình cho trước hoặc đáp ứng lại các sự kiện và thay đổi khi chúng xảy ra.

Một trong các automation được sử dụng thường xuyên nhất chính là để thay đổi trạng thái của một hoặc một nhóm thiết bị – entity trong trường hợp:

  • Đến giờ định trước
  • Giá trị của cảm biến thay đổi: cảm biến chuyển động, cảm biến mở cửa, cảm biến độ sáng v.v..

Tuy nhiên, vấn đề muôn thuở của automation vẫn là:

làm sao phân biệt được lúc nào automation nên kích hoạt, lúc nào nên tôn trọng cài đặt của người dùng?

Nếu như trong bài viết Giải quyết xung đột giữa Automation và Người dùng, ta ưu tiên cho người dùng bằng cách vô hiệu hoá (override) tạm thời automation thì trong bài viết này ta sẽ:

vẫn thực hiện automation nhưng sau khi automation hoàn tất, trả lại trạng thái ban đầu của các thiết bị

Ứng dụng

Trả lại trạng thái ban đầu của các thiết bị – entity sau khi automation hoàn tất sẽ hữu ích với các automation:

  • Thay đổi trạng thái của nhiều thiết bị chỉ trong một khoảng thời gian nào đó hoặc chỉ khi một điều kiện nào đó còn đúng. Ví dụ, tắt toàn bộ đèn vào giờ nghỉ trưa, thay đổi âm lượng của loa chỉ trong thời gian phát các thông báo quan trọng v.v..
  • Thay đổi trạng thái của một thiết bị có nhiều hơn 2 trạng thái (không phải chỉ state) như đèn (bao gồm độ sáng, màu sắc, hiệu ứng), điều hoà không khí (cool, dry, temperature, fan_speed)

Với các dạng automation này, thông thường ta sẽ cần khôi phục lại trạng thái ban đầu của các thiết bị khi hết thời gian định trước hoặc khi điều kiện kích hoạt không còn đúng.

Sử dụng scene

Từ phiên bản Home Assistant 0.103.0, bạn đã có thể sử dụng dịch vụ scene.create để tạo ra một scene – ngữ cảnh mới hoặc cập nhật một ngữ cảnh sẵn có ngay khi cần mà không cần cấu hình trước (YAML/UI). Bạn có thể sử dụng serive này để lưu tạm thời trạng thái của một hoặc nhiều thực thể để sử dụng sau đó.

Cách thực hiện sẽ theo các bước như sau:

Hass Automation Trả lại trạng thái ban đầu
Trả lại trạng thái thiết bị sau khi hoàn tất Automation

Automation mẫu

Bật tắt đèn khi phát hiện chuyển động

Ở đây ta sẽ bật tất cả đèn trong một khu vực khi phát hiện chuyển động, sau 3 phút, trả lại trạng thái của các đèn này trước đó.

Philips Hue Garden Lighting
Ảnh: cnet.com

Cấu hình mẫu dạng YAML

- id: '21321312767'
  alias: 'Entrance lights on for 3mins after motion detected'
  description: 'Bật đèn cổng và vườn khi có chuyển động'
  mode: single
  trigger:
  - platform: state
    entity_id: binary_sensor.entrance_motion
    from: 'off'
    to: 'on' 
  condition: []
  action:
  - service: scene.create
    data:
      scene_id: entrance_light_motion
      snapshot_entities:
      - switch.entrance_light
      - switch.garden_reflector
      - switch.garden_led_panel
  - data: {}
    entity_id:
    - switch.entrance_light
    - switch.garden_reflector
    - switch.garden_led_panel
    service: homeassistant.turn_on
  - delay: 00:03:00
  - scene: scene.light_motion_automation

Chú thích

4 mode: single automation chạy ở chế độ single (yêu cầu Home Assistant 0.113 trở lên)

12 service: scene.create tạo scene lưu giữ trạng thái các công tắc đèn

14 scene_id: entrance_light_motion scene được tạo sẽ có entity_id là scene.entrance_light_motion, bạn có thể gọi scene này ở bất cứ đâu miễn là nó đã được tạo trước đó

15 snapshot_entities: danh sách các entity – thực thể sẽ được lưu giữ trạng thái

24 service: homeassistant.turn_on mở các công tắc đèn

25 delay: 00:03:00 chờ 3 phút trước khi trả lại trạng thái đèn và ngừng automation, lưu ý chỉ nên sử dụng action này với Home Assistant 0.113 trở lên

26 scene: scene.light_motion_automation kích hoạt scene đã tạo ở 14 để trả lại trạng thái đã lưu cho các công tắc

Phát các thông báo quan trọng

Automation này thực hiện:

  • Điều chỉnh âm lượng loa lên mức gần cực đại trước khi phát thông báo
  • Phát thông báo bằng giọng nói, sử dụng tts – chuyển văn bản thành lời nói
  • Trả loa lại mức âm lượng/trạng thái trước khi thực hiện điều chỉnh

Cấu hình mẫu dạng YAML

- id: '21321312767'
  alias: 'Notify if back door is left open for more than 10 mins'
  description: 'Thông báo khi cửa phụ mở quá 10 phút'
  mode: single
  trigger:
  - platform: state
    entity_id: binary_sensor.backdoor_contact
    from: 'off'
    to: 'on'
    for: '00:10:00'
  condition: []
  action:
    - data:
      scene_id: media_player_before_notification
      snapshot_entities:
      - media_player.livingroom_speaker
    service: scene.create
  - data:
      volume_level: 0.9
      entity_id: media_player.livingroom_speaker
    service: media_player.volume_set
  - data:
      entity_id: media_player.livingroom_speaker
      language: 'vi'
      message: 'Cửa sau đang để mở suốt 10 phút qua. Vui lòng kiểm tra!'
    service: tts.google_say
  - delay: 00:00:02
  - timeout: 00:02:00
    wait_template: '{{is_state(''media_player.livingroom_speaker'',''idle'')}}'
  - scene: scene.media_player_before_notification
  mode: single

Chú thích

29 wait_template: ... sau khi phát thông báo, chờ loa hoàn tất phát thông báo (trạng thái playing chuyển sang idle), thời gian tối đa 2 phút

27 delay: 00:00:02 giải pháp để wait_template không bị vô hiệu hoá do khoảng trễ khi thực hiện tts và chuyển trạng thái của loa

Một số lưu ý

Sự tồn tại của scene

scene được tạo theo cách trên sẽ bị xoá bỏ khi:

  • Khởi động lại Hass
  • reload scene (tải lại scene bằng giao diện UI hay service scene.reload)

scene tạo theo cách trên sẽ:

  • Bị ghi đè nếu đã được tạo
  • Báo lỗi nếu đã được tạo bởi cấu hình YAML/UI trước đó

Trước khi áp dụng một scene, bạn phải chắc chắn là nó đã được tạo ra trước rồi.

scene trong Home Assistant

Khi một scene được áp dụng, Home Assistant (Hass) sẽ cố gắng xác định các dịch vụ cần thiết để đưa mỗi entity trong scene về trạng thái đã cài đặt. Quá trình này có thể thất bại với các entity có trạng thái phức tạp tuy xác suất xảy ra không cao.

Bạn cũng có thể sử dụng scene để đưa một entity về trạng thái mong muốn một cách đơn giản và nhanh nhất thay vì sử dụng kết hợp thủ công nhiều service khác nhau. Sử dụng service scene.apply để thực hiện điều này mà không cần cấu hình scene trước đó.

Ví dụ về scene.apply:

service: scene.apply
data:
  entities:
    light.bedroom_ledstrip:
      state: "on"
      brightness: 100
      color_name: blue
    climate.bedroom_ac:
      state: "on"
      hvac_mode: "cool"
      temperature: "23"
      fan_modes: "medium"

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