|
|
很多自動化的條件其實是「家裡有沒有人」,
但大家常常直接寫 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 加:
- template:
- - sensor:
- - name: 家裡人數
- unique_id: home_occupancy_count
- state: >
- {{ states.person
- | selectattr('state', 'eq', 'home')
- | list | count }}
- icon: mdi:account-group
- attributes:
- 在家的人: >
- {{ states.person
- | selectattr('state', 'eq', 'home')
- | map(attribute='name') | list | join('、') }}
- - binary_sensor:
- - name: 家裡有人
- unique_id: home_occupied
- device_class: occupancy
- state: >
- {{ states.person
- | selectattr('state', 'eq', 'home')
- | list | count > 0 }}
複製代碼
改完重新載入:開發者工具 → YAML → 範本實體(不用重啟整個 HA)。

第三層:加上「實體證據」
上面那版只看手機。再加一層「家裡有動靜」會更穩:
- - binary_sensor:
- - name: 家裡真的有人
- unique_id: home_really_occupied
- device_class: occupancy
- delay_off: "00:30:00"
- state: >
- {{ is_state('binary_sensor.家裡有人', 'on')
- or is_state('binary_sensor.客廳感應', 'on')
- or is_state('binary_sensor.走道感應', 'on')
- 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。
怎麼用
原本寫成這樣的自動化:
- conditions:
- - condition: state
- entity_id: person.charles
- state: not_home
複製代碼
改成:
- conditions:
- - condition: state
- entity_id: binary_sensor.家裡真的有人
- state: "off"
- for: "00:10:00"
複製代碼
多加一個 for: 10 分鐘。這樣就算判斷短暫跳掉,也不會馬上關冷氣。
進階:分辨「誰在家」
有時候你要的不是人數,是「只有小孩在家」這種條件:
- - binary_sensor:
- - name: 只有小孩在家
- state: >
- {{ is_state('person.小孩', 'home')
- and is_state('person.charles', 'not_home')
- and is_state('person.太太', 'not_home') }}
複製代碼
拿來做「放學到家推播」很實用。
除錯
範本寫壞的時候,實體會變成 unavailable 或 unknown,
而且不一定會有錯誤訊息。
查法:開發者工具 → 範本,把 state 那段貼進去看結果。
會直接顯示錯在哪一行。
---
我自己這套跑了很久,誤判大概一個月一次,通常是手機定位延遲。
加上人體感應和電視功率之後就幾乎沒有了。
大家還有用什麼來判斷「有沒有人」?門磁的開關次數我也試過,但不太準。 |
|