找回密碼
 立即註冊
    查看: 118|回覆: 0

    範本進階:用 selectattr、expand 與區域標籤,一次問出「哪些燈還開著」

    [複製鏈接]

    !lvup!   100%

    386

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22006063
    發表於 2026-9-21 08:37:32 | 顯示全部樓層 |閱讀模式
    範本入門教的是 states() 和 state_attr(),那是「問一個實體」。這一篇教的是「問一整群實體」—— 哪些燈還開著、哪些電池快沒電、哪些裝置已經掉線。全部在瀏覽器裡就能練,不用重啟、不會弄壞任何東西。

    範本入門教的是 states() 和 state_attr(),那是「問一個實體」。這一篇教的是「問一整群實體」—— 哪些燈還開著、哪些電池

    這篇會從「打開工具」開始,一段一段把一條查詢管線疊出來,每一步都告訴你畫面上該出現什麼。最後把它接進一條真的會動的自動化。

    步驟 1:找到範本工具(它搬家過,而且改過名字)

    很多兩年前的教學會叫你去側邊欄的「開發者工具」。那個項目已經不在側邊欄了。

    現行路徑是:設定 → 工具 → 範本。


    • 2026.2 把它從側邊欄搬進「設定」底下
    • 2026.8 再把名字從「開發者工具」改成「工具」


    所以舊教學會錯兩次:位置錯一次、名字錯一次。找不到的話還有一條捷徑:在任何頁面按鍵盤的 C,會跳出命令面板,輸入「範本」或「template」就能直接跳過去。

    你會看到:畫面分成兩半,左邊是可以打字的編輯區,右邊(或下方)是結果區,中間那條分隔線可以拖。左邊預設就有一段範例文字,右邊同步顯示它算出來的結果。

    看不到「工具」這一項,代表你登入的帳號不是管理員。到 設定 → 人員 確認自己的帳號有勾「管理員」。

    步驟 2:先確認這個工具真的在算

    把左邊的內容全部刪掉,貼上這一行:
    1. {{ now() }}
    複製代碼

    你會看到右邊出現一個完整的時間,像這樣:
    1. 2026-09-25 14:07:33.481290+08:00
    複製代碼

    右邊沒變、或還停在原本的範例文字,代表你貼上後沒有離開輸入框,或瀏覽器沒連上。重新整理一次頁面再試。

    時間不是台灣時間 → 到 設定 → 系統 → 一般,把時區改成 Asia/Taipei。這會影響後面所有跟時間有關的判斷。

    步驟 3:第一段管線 —— 把一整個網域抓出來

    刪掉剛剛那行,改貼:
    1. {{ states.light | list | count }}
    複製代碼

    你會看到一個數字,就是你家 light 網域裡實體的總數,例如 12。

    這裡有個新手一定要弄懂的分別:


    • states('light.客廳') 有括號,是函式,問一個實體,回傳一個字串
    • states.light 沒有括號,是物件,可以拿來迭代,每一個項目是一個狀態物件


    狀態物件身上帶著這些東西:state、entity_id、name、object_id、domain、attributes、last_changed、last_updated、last_reported。後面每一段都是在對這些欄位做篩選。

    數字是 0 → 你家真的沒有 light 網域的實體(全部是 switch 也有可能)。把 light 換成 switch 或 sensor 再試一次,確認工具本身是好的。

    步驟 4:加上篩選(selectattr)

    一次只加一段管線,加完就看結果。 這是這篇最重要的一句話 —— 一口氣寫完六段然後報錯,你不會知道是哪一段的問題。
    1. {{ states.light | selectattr('state', 'eq', 'on') | list | count }}
    複製代碼

    你會看到一個比剛才小的數字,就是現在開著的燈的數量。

    驗證方法:隨便關掉一盞燈,右邊的數字會立刻減一(不用按任何按鈕,它是即時的)。這一步能確認你篩的是活的資料,不是快取。

    數字永遠等於總數 → 你把 'eq' 打成 'ne' 了,或 'on' 寫成大寫的 'ON'(狀態值是小寫)。

    步驟 5:把物件換成看得懂的字(map / join)
    1. {{ states.light
    2.    | selectattr('state', 'eq', 'on')
    3.    | map(attribute='name')
    4.    | list | join('、') }}
    複製代碼

    你會看到一串用頓號分隔的名字,例如:
    1. 客廳燈、玄關燈、陽台燈
    複製代碼

    每一段在做的事:

    以下還有約 81% 的內容
    登入後即可閱讀完整教學

    登入繼續閱讀使用 Google 登入
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    延伸閱讀

    加入惟家 LINE 群 QR Code加入惟家 LINE 群

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-11-10 00:36 , Processed in 0.132217 second(s), 25 queries .

    快速回覆 返回頂部 返回列表