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

    到家自動化誤判的診斷手冊:先找出是哪個訊號在跳,再決定怎麼修

    [複製鏈接]

    !lvup!   100%

    384

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005889
    發表於 2026-9-21 02:06:49 | 顯示全部樓層 |閱讀模式
    「明明還在公司,家裡的燈自己開了」「回到家了,但自動化沒跑」—— 這兩句話背後有五種完全不同的成因,修法也完全不同。直接加訊號只解得掉其中一種。這一篇先教你從 Home Assistant 的歷史紀錄把兇手抓出來,再對症下藥。

    「明明還在公司,家裡的燈自己開了」「回到家了,但自動化沒跑」—— 這兩句話背後有五種完全不同的成因,修法也完全不同。直接加訊號只解得掉其中一

    先講一個順序問題

    多數人遇到誤判的第一個動作是去改設定 —— 改區域半徑、改條件、再加一個判斷。

    這是錯的順序。 因為你不知道是哪個訊號在跳,改了之後也不知道有沒有改對,下次誤判時你會回到同一個起點。

    正確的順序是:先取證 → 分類 → 對症修 → 回歸測試。 整篇就照這個順序走。

    這一篇做完你會有什麼


    • 一張時間軸圖,上面疊著你所有到家訊號,看得出誤判當下是哪一條在跳
    • 針對抓到的那一種,一份完整可貼的修法
    • 一套不用出門就能跑的回歸測試
    • 一個長期的誤判計數器,讓你知道改完之後到底有沒有變好


    步驟 1:取證

    1-1 把所有訊號疊在同一張時間軸上

    這是最快找出兇手的方法。


    • Home Assistant → 左側選單的歷史
    • 右上角選時間範圍,挑誤判發生的那一天
    • 上方的實體選擇器,一次把下面這幾類全部加進去:



    • person.你的名字 —— 最終結論
    • device_tracker. 開頭的全部 —— 每一個來源的原始判斷
    • sensor. 你的手機 _ssid(iPhone)或 _wifi_connection(Android)
    • binary_sensor. 你自己做的合成判斷(如果有的話)
    • 玄關的人體感應器、門磁


    你會看到:一張上下堆疊的橫條圖,每一列是一個實體,顏色變換的位置就是狀態改變的時刻。

    怎麼判讀:找到誤判發生的那個時間點,往左右各看十分鐘,看哪一列在那個時刻變了色。


    • 只有 device_tracker 的 GPS 那一列在跳,其他都沒動 → 是 GPS 漂移,走步驟 3
    • SSID 那一列有一個很短的空白,然後又回來 → 是 Wi-Fi 重連,走步驟 4
    • 藍牙那一列從頭到尾都是 not_home,一次都沒變 → 藍牙根本沒在工作,走步驟 5
    • 路由器型的 device_tracker 比別人晚很久才變 → 走步驟 6
    • 所有訊號都正常,只有自動化跑錯 → 走步驟 7


    歷史畫面上找不到那些實體 → 多數手機感測器預設是停用的。到手機的 Home Assistant App → 設定 → 同伴應用程式 → 管理感測器,把要用的打開。預設只有電量、充電狀態這幾個是開的。

    1-2 用日誌記錄看「誰動的」

    歷史看得到狀態變化,看不到原因。日誌記錄看得到。


    • 設定 → 系統 → 日誌記錄
    • 上方實體欄位填那盞誤開的燈
    • 找到誤判那一筆


    你會看到:那一筆後面寫著觸發來源,例如「被 到家開燈 觸發」。名字就是那條自動化。

    1-3 看那條自動化的追蹤


    • 設定 → 自動化與場景 → 點那條自動化
    • 右上角三個點 → 追蹤
    • 左上角的下拉選單可以切換最近幾次執行,選誤判那一次
    • 點步驟詳細資料


    你會看到:觸發器那一段會寫出實際的觸發資料,包含 `from_state` 和 `to_state`,以及當下的屬性值。GPS 漂移的話,這裡就會看到一個很誇張的 `gps_accuracy`。

    追蹤清單是空的 → Home Assistant 預設只保留最近幾次。想留久一點的話在自動化 YAML 最外層加 `trace: stored_traces: 25`。

    1-4 把結論寫下來

    繼續往下之前,你應該能填完這一句:

    「誤判發生在 __:__,當時 ______ 這個實體從 ______ 變成 ______,其他訊號沒有變化。」

    填不出來就回 1-1 再看一次。填不出來就往下改設定,是在賭。

    步驟 2:五種誤判的辨識特徵


    • A 型 GPS 漂移 —— 人明明沒動,`device_tracker` 卻在 home 和 not_home 之間跳。常見於大樓密集區、地下停車場出來的瞬間、手機剛開省電模式時
    • B 型 Wi-Fi 假離開 —— SSID 感測器出現一段幾十秒的空白(或變成 `<not connected>`),然後又回來。常見於 2.4G / 5G 換頻、Mesh 換節點、路由器重開
    • C 型 藍牙完全沒作用 —— 那一列從頭到尾都是 not_home。成因是寫死 MAC 位址,而現代手機的 BLE 位址會隨機變
    • D 型 路由器型追蹤器反應不對 —— 其他訊號都變了它卻慢十幾分鐘,或是反過來手機一睡著就被判離家。成因是那個整合的「判定離開等待時間」設得不對,或是路由器的 ARP 表更新慢
    • E 型 自動化自己的問題 —— 訊號全部正確,但自動化重複執行、或在不該跑的時候跑。成因是觸發器設計或 `mode` 設定


    步驟 3:修 A 型 —— GPS 漂移

    3-1 先看誤差值,不要先改半徑

    GPS 每一筆座標都附帶一個誤差半徑,Home Assistant 把它存在屬性裡。


    • 開發者工具 → 狀態
    • 搜尋 device_tracker. 你的手機
    • 看右邊的屬性區


    你會看到:
    1. source_type: gps
    2. latitude: 25.0330
    3. longitude: 121.5654
    4. gps_accuracy: 35
    5. battery_level: 68
    複製代碼

    gps_accuracy 是誤差公尺數。判讀:


    • 10 到 65 —— 正常。室內收訊差一點就是這個範圍
    • 65 到 150 —— 可疑。這種座標拿來判斷進出區域很容易錯
    • 超過 150 —— 垃圾資料,一定要過濾掉


    3-2 在自動化裡過濾掉爛座標

    這是最有效的一招,而且不會犧牲反應速度。

    加到 automations.yaml:
    1. - id: arrive_home_gps_filtered
    2.   alias: "到家開燈(已過濾 GPS 誤差)"
    3.   mode: single
    4.   triggers:
    5.     - trigger: zone
    6.       entity_id: person.charles
    7.       zone: zone.home
    8.       event: enter
    9.   conditions:
    10.     # 只接受誤差 100 公尺以內的座標
    11.     - condition: numeric_state
    12.       entity_id: device_tracker.charles_iphone
    13.       attribute: gps_accuracy
    14.       below: 100
    15.     # 天黑之後才開燈
    16.     - condition: sun
    17.       after: sunset
    18.       before: sunrise
    19.     # 燈還沒開才開,避免重複通知
    20.     - condition: state
    21.       entity_id: light.xuan_guan
    22.       state: "off"
    23.   actions:
    24.     - action: light.turn_on
    25.       target:
    26.         entity_id: light.xuan_guan
    27.       data:
    28.         brightness_pct: 70
    29.     - action: persistent_notification.create
    30.       data:
    31.         title: 到家開燈
    32.         message: >-
    33.           {{ now().strftime('%H:%M:%S') }} 觸發,
    34.           GPS 誤差 {{ state_attr('device_tracker.charles_iphone',
    35.                                  'gps_accuracy') }} 公尺
    複製代碼

    那則通知是刻意留的 —— 它會把每次觸發的誤差值記下來,一週之後你就有一份真實資料可以決定 100 這個門檻要不要調。穩定之後再把它刪掉。

    你會看到:真的觸發時右上角跳出「14:32:07 觸發,GPS 誤差 28 公尺」。

    完全不再觸發了 → 門檻設太嚴。看通知裡的歷史值,取一個比常見值大一點的數字。
    還是會誤觸發,但通知裡的誤差值很小 → 不是 A 型,回步驟 1 重新分類。

    3-3 把區域半徑放大


    • 設定 → 區域 → 點家
    • 地圖上把標記拖到你家屋頂正上方,不要用地址搜尋結果(地址通常落在路邊)
    • 半徑填 120 公尺


    為什麼是 120:手機在市區的 GPS 誤差常態就有 20 到 50 公尺,住大樓更差。半徑設 50 的話,你人在沙發上位置卻會一直在 home 和 not_home 之間跳。寧可範圍大一點、晚一點才判定離家。

    你會看到:開發者工具 → 狀態,搜尋 zone.home,它的狀態是目前在區域內的人數。

    3-4 手機端的四個設定

    這四個不設好,前面做的全部沒用。

    iPhone


    • 系統設定 → 往下找到 Home Assistant → 位置 → 選永遠(不能是「使用 App 期間」)
    • 同一頁的精確位置要打開。關掉的話 iOS 只給你一個誤差幾公里的模糊座標
    • 同一頁的行動數據要打開,不然離開家裡 Wi-Fi 之後回報不了
    • 系統設定 → 一般 → 背景 App 重新整理 → 確認 Home Assistant 是開的


    ⚠ 低耗電模式會直接停掉背景定位,而且沒有任何提示。 電量低的時候到家自動化就是不會動,這不是設定壞了。

    Android


    • Home Assistant App → 設定 → 同伴應用程式 → 管理感測器 → 位置感測器
    • 打開區域式追蹤與背景位置
    • 手機的系統設定 → 應用程式 → Home Assistant → 電池 → 選不受限制
    • 各廠自己的省電策略要另外關:關鍵字是「自動啟動」「背景活動」「電池最佳化」


    怎麼確認手機端真的在回報:開發者工具 → 狀態,搜尋你的手機名字加 last_update_trigger。

    你會看到:一個 sensor,狀態寫著上一次位置更新是被什麼觸發的,例如 Significant Location Update、Background Fetch、Manual。

    這個值好幾小時都沒變 → 背景定位被系統擋掉了,回頭檢查上面那四項。

    3-5 給離家判斷加延遲

    進家可以快,離家一定要慢 —— 誤判離家的代價(冷氣被關掉、警報被開啟)比誤判到家大得多。
    1. - id: leave_home_delayed
    2.   alias: "離家關冷氣(延遲 10 分鐘確認)"
    3.   mode: single
    4.   triggers:
    5.     - trigger: state
    6.       entity_id: person.charles
    7.       to: "not_home"
    8.       for:
    9.         minutes: 10
    10.   conditions:
    11.     - condition: numeric_state
    12.       entity_id: device_tracker.charles_iphone
    13.       attribute: gps_accuracy
    14.       below: 100
    15.   actions:
    16.     - action: climate.turn_off
    17.       target:
    18.         entity_id: climate.ke_ting_leng_qi
    複製代碼

    `for: minutes: 10` 的意思是「連續十分鐘都是 not_home 才算」。中間只要跳回 home 一次,計時就重來。這一行就能擋掉絕大多數的 A 型誤判。

    步驟 4:修 B 型 —— Wi-Fi 重連造成的假離開

    4-1 先確認你的感測器叫什麼

    兩個平台的名稱不一樣,這是很多人第一步就卡住的原因:


    • iPhone / Mac → sensor.<裝置名>_ssid,另外還有一個 _bssid 和一個連線類型感測器
    • Android → sensor.<裝置名>_wifi_connection,狀態值直接就是 SSID 名稱


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

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

    本版積分規則

    延伸閱讀

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

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

    GMT+8, 2026-9-30 15:27 , Processed in 0.136376 second(s), 25 queries .

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