|
|
「家裡的人數歸零就關冷氣關燈」這個邏輯在單人住的家幾乎不會錯,但在多人住的家會三天兩頭出包。原因不是邏輯寫錯了,是 zone.home 這個數字的定義跟你以為的不一樣。
這篇先把「為什麼一定會出包」講清楚(那是機制上的必然,不是設定沒調好),然後給四層由淺到深的補強,每一層都有完整可貼的設定和驗收方法。第三層包含自己做一顆毫米波存在感應器的零件清單、逐腳位接線和完整的 ESPHome 設定檔。

━━ 步驟 1:先確認你現在的判斷有多不準 ━━
1-1 看清楚 zone.home 到底在數什麼
到 開發者工具 → 狀態,搜尋 zone.home。
你會看到什麼:
- zone.home 2
- 屬性:
- latitude: 25.0330
- longitude: 121.5654
- radius: 100
- persons:
- - person.charles
- - person.family_a
- editable: true
- icon: mdi:home
- friendly_name: 家
複製代碼
關鍵在那個 persons 清單。 zone.home 的狀態 = 那個清單的長度 = 「目前在家的、而且有被 person 實體追蹤的人數」。
它不是「家裡有幾個人」。 這兩件事的差距就是你所有誤判的來源。
1-2 列出誰有被追蹤、誰沒有
到 開發者工具 → 範本,貼上:
- --- 所有 person 實體與它們的來源 ---
- {% for p in states.person %}
- {{ p.name }}:{{ p.state }}
- 來源裝置:{{ p.attributes.device_trackers | default([]) | join(', ') }}
- 定位誤差:{{ p.attributes.gps_accuracy | default('無') }}
- {% endfor %}
- zone.home 現在數到:{{ states('zone.home') }} 人
複製代碼
你會看到什麼:
- --- 所有 person 實體與它們的來源 ---
- Charles:home
- 來源裝置:device_tracker.charles_iphone
- 定位誤差:12
- 家人A:not_home
- 來源裝置:device_tracker.family_a_phone
- 定位誤差:35
- zone.home 現在數到:1 人
複製代碼
三件事要確認:
- 「來源裝置」是空的 → 那個 person 永遠不會變成 home。到 設定 → 人員 → 點那個人 → 「選取要追蹤的裝置」勾起來
- 只有一個來源裝置 → 那個人的在家判定是單點依賴。步驟 2 會處理
- 家裡有人沒有出現在這個清單上(長輩、小孩、室友)→ 他們對 zone.home 完全不存在
1-3 三個失效模式,全部是同一個原因
- 不帶手機的人 —— 系統永遠認為他在家(如果手機留在家充電),或永遠認為他不在家(如果沒有 person 實體)。兩種都是單向的錯,而且不會自己恢復
- 手機沒電 —— device_tracker 變成 unknown 或 unavailable,而很多人的自動化把「不是 home」當成「not_home」,於是人在家裡燈自己關了
- 訪客 —— 完全不在 person 清單裡,zone.home 數不到他們
共同原因:zone.home 數的是「被追蹤的裝置」,不是「人」。 所以補強的方向不是「把 GPS 調準」,而是加上不依賴手機的證據。
━━ 步驟 2:第一層 —— 讓每個人有兩個獨立的追蹤來源 ━━
這一層不用買任何東西,解掉「手機沒電」和一部分「定位漂移」。
2-1 加上路由器的 device_tracker
手機連上家裡 Wi-Fi 這件事,是一個完全獨立於 GPS 的證據。
方法 A:路由器本身有整合
設定 → 裝置與服務 → 新增整合,搜尋你的路由器品牌(ASUS、Ubiquiti UniFi、TP-Link Omada、OpenWrt、MikroTik 都有官方整合)。
你會看到什麼:新增完成後到 開發者工具 → 狀態,搜尋 device_tracker.,會出現一堆你家裡連線裝置的實體,名稱多半是主機名稱或 MAC 位址。
方法 B:路由器沒有整合,用 Ping 整合
⚠ 這裡有一個會讓你白做一輪的陷阱:網路上大量教學教你在 configuration.yaml 寫 device_tracker: - platform: ping。那個寫法自 Home Assistant 2023.12 起已經不存在了。
Ping 整合已經改成從 UI 設定(config flow),沒有 YAML 寫法。而失敗的樣子非常惡劣:YAML 檢查會過(因為 HA 只是忽略它不認得的平台)、重啟不會報錯、但實體就是不會出現。你會以為是縮排寫錯,然後在那裡卡很久。
正確做法:
- 先到路由器的 DHCP 設定,把每支手機綁定固定 IP(用 MAC 位址保留)
- 到 設定 → 裝置與服務 → 新增整合 → 搜尋 Ping
- 主機名稱 填那支手機的固定 IP(例如 192.168.1.101)
- 送出。一支手機建一個項目,有幾個人就重複幾次
⚠ 第二個陷阱:建好之後 device_tracker 實體預設是「停用」的。
官方文件講得很清楚:ping 整合的 device tracker 預設停用。它預設只給你一個 binary_sensor(那台主機通不通),而你要的 device_tracker 要自己去打開。
怎麼打開:設定 → 裝置與服務 → 找到 Ping → 點那個項目 → 會看到「1 個實體」和「1 個已停用的實體」 → 點進停用的那個 → 右上角齒輪 → 把「已啟用」打開 → 確定。
你會看到什麼:到 開發者工具 → 狀態,搜尋 device_tracker.,會出現一個以那個 IP 或你取的名字命名的實體,狀態是 home 或 not_home。
搜尋不到 → 實體還是停用狀態。停用的實體不會出現在開發者工具的狀態清單裡,這也是很多人以為「整合壞了」的原因。
調整 Consider home:點那個 Ping 項目 → 設定(齒輪)→ 「Consider home」欄位。
- 官方預設是 180 秒(3 分鐘)
- 建議改成 300 秒(5 分鐘)。手機進入省電睡眠時會不回應 ping,三分鐘常常不夠,會造成「人在家裡卻被判定離家」的假離線
⚠ iPhone 有一個特性:它在省電模式下可能長時間不回 ping,而且預設會用隨機 MAC 位址。要讓這個方法可靠,必須到 iPhone 的「設定 → Wi-Fi → 你家的網路 → 私密 Wi-Fi 位址」把它關掉,否則每次重連 MAC 都會變,固定 IP 綁不住。
2-2 把兩個來源掛到同一個人身上
設定 → 人員 → 點那個人 → 「選取要追蹤的裝置」,把 App 的 tracker 和路由器/ping 的 tracker 都勾起來。
person 整合的合併規則:只要任何一個 tracker 說 home,這個人就是 home。GPS 類的優先順序高於路由器類,但路由器說 home 時 GPS 的 not_home 不會蓋過它。
2-3 你會看到什麼
回到步驟 1-2 那段範本重跑一次。
你會看到「來源裝置」那一行從一個變成兩個:
- Charles:home
- 來源裝置:device_tracker.charles_iphone, device_tracker.charles_phone_ping
複製代碼
測試:把手機的 Wi-Fi 關掉、行動網路也關掉(模擬沒電)。
- 五分鐘後,你會看到 ping 的那個 tracker 變成 not_home
- 但 App 的 tracker 會變成 unknown 而不是 not_home
- person 實體的狀態:這時候會變成 not_home。這正是問題所在,步驟 3 要處理
|
|