找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 0|回覆: 0

    做一個「家裡有幾個人」的感測器(template sensor 實戰)

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    很多自動化的條件其實是「家裡有沒有人」,
    但大家常常直接寫 person.charles == home
    結果自己出門、家人還在家,冷氣就被關了。

    這篇做一個真的能用的人數感測器。



    先講為什麼不能只靠手機定位

    手機定位(GPS + Wi-Fi)有三個問題:


    • 省電模式會讓定位更新變慢,到家五分鐘後才變 home
    • 在家但手機沒電、關機、放在包包裡 → 判定不在家
    • 住大樓的話,GPS 誤差可能讓你在家裡被判定離開


    所以正確做法是多來源綜合判斷

    第一層:把 device_tracker 綁到 person

    設定 → 使用者與人員 → 點那個人,把所有能代表他的追蹤器都選進去:


    • 手機 App 的 GPS(mobile_app_xxx)
    • 路由器的 Wi-Fi 連線偵測(很多路由器整合都有)
    • 藍牙信標(如果有的話)


    HA 會自動取「最可靠的那個」。一般來說路由器偵測到手機連上 Wi-Fi,
    就會立刻判定 home,比 GPS 快很多。

    第二層:做人數感測器

    configuration.yaml 加:
    1. template:
    2.   - sensor:
    3.       - name: 家裡人數
    4.         unique_id: home_occupancy_count
    5.         state: >
    6.           {{ states.person
    7.              | selectattr('state', 'eq', 'home')
    8.              | list | count }}
    9.         icon: mdi:account-group
    10.         attributes:
    11.           在家的人: >
    12.             {{ states.person
    13.                | selectattr('state', 'eq', 'home')
    14.                | map(attribute='name') | list | join('、') }}
    15.   - binary_sensor:
    16.       - name: 家裡有人
    17.         unique_id: home_occupied
    18.         device_class: occupancy
    19.         state: >
    20.           {{ states.person
    21.              | selectattr('state', 'eq', 'home')
    22.              | list | count > 0 }}
    複製代碼

    改完重新載入:開發者工具 → YAML → 範本實體(不用重啟整個 HA)。



    第三層:加上「實體證據」

    上面那版只看手機。再加一層「家裡有動靜」會更穩:
    1.   - binary_sensor:
    2.       - name: 家裡真的有人
    3.         unique_id: home_really_occupied
    4.         device_class: occupancy
    5.         delay_off: "00:30:00"
    6.         state: >
    7.           {{ is_state('binary_sensor.家裡有人', 'on')
    8.              or is_state('binary_sensor.客廳感應', 'on')
    9.              or is_state('binary_sensor.走道感應', 'on')
    10.              or states('sensor.客廳電視功率') | float(0) > 20 }}
    複製代碼

    三個重點:

    1. delay_off: 30 分鐘

    這行是關鍵。人體感應器是「有動作才 on」,你坐著看電視不動的時候它是 off。
    delay_off 讓感測器在最後一次偵測後再撐 30 分鐘才轉 off,避免誤判成沒人。

    2. 用電視功率當證據

    電視開著代表有人。這種「用電器狀態反推有沒有人」的技巧很好用,
    洗衣機、電腦、遊戲主機都可以。

    3. float(0) 的預設值不能省

    感測器不可用的時候 states() 回傳的是字串 unavailable,
    沒給預設值會整個範本炸掉,連帶讓這個 binary_sensor 變成 unavailable。

    怎麼用

    原本寫成這樣的自動化:
    1. conditions:
    2.   - condition: state
    3.     entity_id: person.charles
    4.     state: not_home
    複製代碼

    改成:
    1. conditions:
    2.   - condition: state
    3.     entity_id: binary_sensor.家裡真的有人
    4.     state: "off"
    5.     for: "00:10:00"
    複製代碼

    多加一個 for: 10 分鐘。這樣就算判斷短暫跳掉,也不會馬上關冷氣。

    進階:分辨「誰在家」

    有時候你要的不是人數,是「只有小孩在家」這種條件:
    1.   - binary_sensor:
    2.       - name: 只有小孩在家
    3.         state: >
    4.           {{ is_state('person.小孩', 'home')
    5.              and is_state('person.charles', 'not_home')
    6.              and is_state('person.太太', 'not_home') }}
    複製代碼

    拿來做「放學到家推播」很實用。

    除錯

    範本寫壞的時候,實體會變成 unavailableunknown
    而且不一定會有錯誤訊息

    查法:開發者工具 → 範本,把 state 那段貼進去看結果。
    會直接顯示錯在哪一行。

    ---

    我自己這套跑了很久,誤判大概一個月一次,通常是手機定位延遲。
    加上人體感應和電視功率之後就幾乎沒有了。

    大家還有用什麼來判斷「有沒有人」?門磁的開關次數我也試過,但不太準。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

    GMT+8, 2026-9-24 10:32 , Processed in 0.084839 second(s), 26 queries .

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