Cấu trúc yaml hassio

Templating – khuôn mẫu – hình mẫu, là một trong những tính năng nâng cao rất hữu dụng của Hass. Hiểu đơn giản, templating sẽ giúp bạn “chế biến” thông tin trong Hass, vào Hass và ra khỏi Hass theo ý mình, như:

Di chuyển nhanh: các filter và cấu trúc thường dùng

  • Tuỳ chỉnh các thông điệp – message trong thông báo – notification, cả bằng chữ và lời nói.
  • Trích xuất và thay đổi các thông tin mà Hass nhận được từ nguồn bên ngoài như mqtt, websocket, rest.
  • Điều khiển tự động hoá – automation thông qua các cấu trúc rẽ nhánh, vòng lặp.
  • Tuỳ chỉnh giao diện theo thông tin trong Hass hay ngữ cảnh.

CHIA SẺTWEETCHIA SẺEMAILBÌNH LUẬN

Templating – khuôn mẫu – hình mẫu, là một trong những tính năng nâng cao rất hữu dụng của Hass. Hiểu đơn giản, templating sẽ giúp bạn “chế biến” thông tin trong Hass, vào Hass và ra khỏi Hass theo ý mình, như:

Di chuyển nhanh: các filter và cấu trúc thường dùng

  • Tuỳ chỉnh các thông điệp – message trong thông báo – notification, cả bằng chữ và lời nói.
  • Trích xuất và thay đổi các thông tin mà Hass nhận được từ nguồn bên ngoài như mqtt, websocket, rest.
  • Điều khiển tự động hoá – automation thông qua các cấu trúc rẽ nhánh, vòng lặp.
  • Tuỳ chỉnh giao diện theo thông tin trong Hass hay ngữ cảnh.
States Object – đối tượng cơ bản để lấy thông tin từ các Thực thể – Entity

Để sử dụng Template hiệu quả, bạn cần nắm được cấu trúc cơ bản của một đối tượng States, chứa thông tin của tất cả các entity trong Hass. Đối tượng States có các attribute – thuộc tính cơ bản như ảnh trên.
Ví dụ, states của entity home thuộc domain zone bao gồm:

– entity_id: zone.home
– domain: zone
– name (hay friendly_name): my home (tên bạn tuỳ chọn)
– state: zoning (mặc định)
– attributes: [‘hidden’, ‘latitude’, ‘longitude’, ‘radius’, ‘passive’, ‘editable’, ‘friendly_name’, ‘icon’]
– last_changed
– last_updated

Ta có thể truy xuất từng thuộc tính này bằng . (dấu chấm) hay []. Để truy xuất trạng thái – state của một entity, ta dùng cấu trúc states.entity_id.state hoặc state.domain.entity[‘state’] (với một chút khác biệt nhưng không quá quan trọng). Ví dụ, truy xuất trạng thái của entity_id zone.home, ta dùng cấu trúc states.zone.home.state.

Hoặc ta cũng có thể truy xuất state và attributes bằng cấu trúc mở rộng riêng của Hass là states(‘entity_id’) và state_attr(‘entity_id’,’attributes_name’). Nên sử dụng cấu trúc này nếu được để tránh một số thông báo lỗi khi vì lí do nào đó, States của các entity_id này chưa có sẵn.

NHƯ VẬY:

Để lấy trạng thái của entity zone.home ta có thể sử dụngstates.zone.home.state hoặc states.zone.home['state'] hoặc states('zone.home') (khuyên dùng).

Để lấy thuộc tính attributes icon của entity zone.home ta có thể sử dụng states.zone.home.attributes.icon hoặc states.zone.home.attributes['icon'] hoặc state_attr('zone.home','icon') (khuyên dùng).

!

 Lưu ý về .

LÀM SAO HASS PHÂN BIỆT ĐƯỢC GIỮA CÂU TỪ THÔNG THƯỜNG VÀ TEMPLATE?

Bằng cả 2 yếu tố:

  1. Thứ nhất, trong hầu hết trường hợp, bạn phải báo trước cho Hass rằng từ thời điểm này, cần sử dụng Templating bằng cách sử dụng từ khoá data_template: hoặc value_template: (tuỳ vào tình huống sử dụng) thay vì data: hoặc value: như bình thường.
  2. Đặt các dấu định nghĩa – delimiters khi muốn Hass thực hiện template. Bao gồm:
    – {{ ... }} khi muốn hiển thị giá trị của biểu thức bên trong. Bạn không thể chỉ dùng cấu trúc states(‘zone.home’) để lấy giá trị state của entity zone.home mà phải đặt nó bên trong như {{ states('zone.home') }}
    – {% ... %} khi muốn thực hiện một câu lệnh, có thể là các cấu trúc điều khiển như if hay for.

Kết hợp 2 điều trên, ta có ví dụ kiểu như sau cho ra giá trị ở nhà nếu entity person.me có trạng thái home và vắng nhà từ lúc <thời điểm> khi person.me có bất cứ trạng thái nào mà không phải là home (có thể là away, not_home hay tên một zone nào đó). <thời điểm> vắng nhà được lấy từ mốc thời gian cuối cùng sensor này chuyển trạng thái. Đây chỉ là ví dụ mẫu nên ta không xử lý tất cả các trường hợp có thể xảy ra mà chỉ lấy tương đối.

TRÍCH DỮ LIỆU ĐẾN DẠNG JSON

JSON là một dạng cấu trúc dữ liệu mở, đặc trưng bởi cụm key:value (khoá:dữ liệu). Json được dùng khá phổ biến trong Hass và các dịch vụ bên thứ 3 có liên quan (như Tasmota, các Web API).

Nếu bạn có dữ liệu dạng: {"abc":123,"xyz":"789"} thì 99% nó là chính là dạng JSON. Bạn có thể kiểm tra một JSON có hợp lệ hay không và xem các key:value ở dạng đơn thuần bằng trang web này: https://jsonparseronline.com.

JSON từ mqtt payload thể hiện cấu hình của Zigbee2mqtt addon trong Hass

Với JSON trên ta có các key “version”, “commit” hay “coordinator”, “log_level” v.v…

Để trích xuất dữ liệu dạng này trong Hass sử dụng template, ta sẽ dùng từ khoá value_json thay vì value. Ví dụ để hiển thị data của key “permit_join” ta sẽ dùng cấu trúc: {{ value_json.permit_join }}. Còn với key mà data lại là dạng JSON (JSON trong JSON) như key “coordinator”, ta sẽ dùng cấu trúc như sau {{ value_json.coordinator.meta.revision }} để lấy data của key “revision” bên trong data của key “meta” bên trong data của key “coordinator”.

FILTER VÀ FORMAT

Nếu bạn có thể lấy thông tin của một entity bằng dấu . thì bạn có thể thay đổi thông tin này bằng các bộ lọc – filter hay bằng cách định dạng – format. Để sử dụng, ta đặt bộ lọc đằng sau kí tự | (pipe). Ở dưới ta sẽ tìm hiểu rõ hơn về filter.

CÁC CẤU TRÚC, FILTER, FORMAT, METHOD THÔNG DỤNG TRONG HASS

CHUNG
  1. {{ states(‘entity_id’) }}
    – thể hiện (thường có nghĩa là in ra, đọc ra) ra trạng thái của entity.
  2. {{ state_attr(‘entity_id’,’xyz’ }}
    – thể hiện thuộc tính xyz của entity.
  3. {{ is_state(‘entity_id’,’123′) }}
    – thể hiện kết quả so sánh state của entity và giá trị ‘123’ (lần nữa bạn cần chú ý đây là chuỗi kí tự).
  4. {{ is_state_attr(‘entity_id’,’xyz’,’123′) }}
    – thể hiện kết quả so sánh thuộc tính ‘xyz’ với giá trị ‘123’.
THỜI GIAN
  1. now()
    – trả về thời gian hiện tại theo múi giờ địa phương.
  2. now().hour, now().min, now().second
    – trả về giờ, phút, giây hiện tại.
  3. now().year, now().month, now().day
     trả về năm, tháng, ngày hiện tại.
  4. now().weekday
     trả về ngày trong tuần (CN = 0).
  5. utcnow()
    – trả về thời gian theo múi giờ 0.
  6. utcnow().hour, utcnow().min v.v..
    – như mục 2, 3 và 4.
  7. as_timestamp(now())
    – trả về số giây từ hiện tại lùi về thời điểm 00:00:00 01/01/1970 – Unix Timestamp hay Epoch time (1).
  8. as_timestamp(‘thời gian’)
    – như trên nhưng có thể dùng với bất cứ thời gian nào theo chuẩn ISO 8601.
  9. now().strftime(‘%a %A %b %B %d %H %I %m %M %y %Y %j %p %S %U %w %W %z %Z’)
    – cần ít nhất một trong các tham số bên trong cặp dấu ‘ ‘, thể hiện một thông số theo thời gian hiện tại.
    %a – thứ rút gọn, %A – thứ đầy đủ, %b – tháng rút gọn, %B – tháng đầy đủ, %d – ngày dạng số, %H – giờ 24, %I – giờ 12, %m – tháng dạng số, %M – phút, %y – năm 2 số cuối, %Y – năm đầy đủ, %j – ngày trong năm, %p – AM/PM, %S – giây (lưu ý là từ 0 -61), %U – tuần trong năm (CN = 0), %w – thứ dạng số, %W – tuần trong năm (T2 = 0), %z – số giờ bù trừ của múi giờ, %Z – tên múi giờ.
     (2)
  10. ‘thời gian’.strftime()
    – như trên, cho bất cứ thời gian nào theo chuẩn ISO 8601.

Ví dụ sau sẽ in ra giờ, phút giây hiện tại bằng cả 2 cách khác nhau, và cũng in ra số giây từ lúc entity sun.sun thay đổi lần cuối đến hiện tại:YAML

1

Giờ: {{now().hour}} Phút: {{now().min}} Giây: {{now().second}}

2

Thời gian hiện tại: {{now().strftime('%H:%M:%S')}}

3

Lần cuối cảm biến thay đổi: {{as_timestamp(now()) - as_timestamp(states.sun.sun.last_changed)}} giây trước
FILTER
  1. int, float
    – chuyển sang dạng số nguyên, thâp phân.
  2. round(x)
    – làm tròn đến x số sau dấu thập phân.
  3. random()
    – lấy ngẫu nhiên.
  4. sum(), max(), min()
    – lấy tổng, số lớn nhất, số nhỏ nhất.
  5. length()
    – số kí tự của chuỗi hay số phần tử của một danh sách.
  6. upper(), lower(), capitalize()
    – viết hoa, thường hay hoa chữ cái đầu.
  7. replace(‘abc’,’xyz’)
    – thay tất cả ‘abc’ bằng ‘xyz’ trong chuỗi kí tự.
LỆNH – STATEMENT
  1. {% if <điều kiện 1> %}
    kết quả 1
    {% elif <điều kiện 2> %}
    kết quả 2
    {% else %}
    kết quả 3
    {% endif %}

    Nguyên tắc:
    – chỉ có duy nhất 1 if, 1 else và 1 endif
    – if và endif là bắt buộc
  1. {% set var1 = <giá trị> %} – tạo biến var1 có <giá trị> để dùng lặp lại nhiều lần trong cùng 1 template.
  2. {% for biến1 in <chuỗi> %} – lặp một vòng từ đầu đến cuối một chuỗi (danh sách)
    kết quả
    {% endfor %}

    Ví dụ, in ra entity_id của tất cả sensor hiện có, cùng với thứ tự:

YAML

1

{% for cambien in states.sensor %}

2

  {{loop.index}}: {{ cambien.entity_id }}

3

{% endfor %}

Như trên nhưng loại bỏ tất cả dấu xuống dòng cùng khoảng trắng thừa và khi kết thúc vòng lặp, in ra tổng số sensor hiện có:YAML

1

{%- for cambien in states.sensor -%}

2

{{loop.index0}}: {{ cambien.entity_id }}

3

{% if loop.last %}Tổng số: {{loop.length}}{% endif %}

4

{%- endfor -%}
!

 Vẫn còn rất nhiềuNguồ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!

Duy Trương

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *