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

    完整專案:做一套真的準的「有沒有人在家」偵測

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    手機定位不準,人體感應器不動就失效。

    答案是:全部一起用,然後投票。



    為什麼單一來源都不準


    • 手機 GPS —— 省電模式會延遲、在家充電時可能飄出去
    • Wi-Fi 連線偵測 —— 手機睡眠會斷開
    • 藍牙 / BLE —— 範圍小,穿牆差
    • 人體感應器(PIR) —— 不動就偵測不到
    • 毫米波 —— 準,但會被電風扇、窗簾誤觸發


    每一種都有它失效的情況。

    但它們失效的情況不一樣 ——
    這就是可以組合的理由。

    設計:三層判斷


    1. 第一層:誰在家(person)
    2.   → 手機定位 + Wi-Fi + 藍牙,HA 內建的 person 會自動合併
    3. 第二層:哪個房間有人(room presence)
    4.   → 人體感應器 + 毫米波 + 裝置使用狀態
    5. 第三層:在做什麼(activity)
    6.   → 用電、媒體播放、門窗狀態推論
    複製代碼

    大部分人只做第一層,然後抱怨不準。

    第一層:加強 person 的準確度

    HA 的 person 可以綁多個 device_tracker


    • 設定 → 人員 → 點那個人
    • 選擇要用的裝置追蹤器


    建議綁三個


    • HA 手機 App 的 GPS(最準但耗電)
    • 路由器的 Wi-Fi 追蹤(本地、即時)
    • 藍牙信標(選配)


    HA 的合併邏輯


    • 任何一個說「在家」就是在家
    • GPS 的優先度比較高


    設定路由器的 Wi-Fi 追蹤

    很多路由器有 HA 整合


    • ASUS Router
    • OpenWrt / Ubiquiti / Mikrotik
    • 通用的 Nmap Tracker(掃描網段)
    • 通用的 Ping


    Nmap 的設定
    1. device_tracker:
    2.   - platform: nmap_tracker
    3.     hosts: 192.168.1.0/24
    4.     home_interval: 10
    5.     consider_home: 300
    複製代碼

    consider_home: 300 很重要 ——
    手機睡眠時會斷 Wi-Fi,五分鐘的緩衝可以避免誤判離家。

    手機一定要關掉「Wi-Fi 隨機 MAC」

    Android 和 iOS 現在預設會用隨機的 MAC 位址連 Wi-Fi ——
    這樣路由器追蹤就永遠認不出你。

    做法


    • Android:Wi-Fi 設定 → 那個網路 → 隱私 → 使用裝置 MAC
    • iOS:Wi-Fi → 那個網路的 (i) → 關閉「私密 Wi-Fi 位址」


    只對你家的 Wi-Fi 關掉就好。



    第二層:房間層級的存在偵測

    這是最有價值、也最麻煩的一層。

    用「多個訊號投票」
    1. template:
    2.   - binary_sensor:
    3.       - name: 客廳有人
    4.         unique_id: livingroom_occupied
    5.         device_class: occupancy
    6.         delay_off: "00:03:00"
    7.         state: >
    8.           {% set 動作 = is_state('binary_sensor.客廳人體', 'on') %}
    9.           {% set 存在 = is_state('binary_sensor.客廳毫米波', 'on') %}
    10.           {% set 電視 = is_state('media_player.客廳電視', 'playing') %}
    11.           {% set 燈 = is_state('light.客廳', 'on') %}
    12.           {{ 動作 or 存在 or 電視 or (燈 and is_state('person.charles', 'home')) }}
    複製代碼

    delay_off 是關鍵


    • 它的意思是「變成 off 之後要維持三分鐘才真的算 off」
    • 避免「人坐著沒動 → 判定沒人 → 關燈 → 揮揮手 → 又開燈」的抖動
    • 這一個設定就解決了八成的感應燈抱怨


    注意delay_off 只對「從 on 變 off」有效
    變成 on 是立即的(這正是你要的)。

    用房間的「使用中」訊號

    除了感應器,這些也代表有人


    • 電視在播放
    • 電腦在用(功率監測或網路活動)
    • 咖啡機剛用過
    • 浴室濕度剛上升
    • 門剛被開過


    這些「間接證據」在人不動的時候特別有用。

    第三層:推論「正在做什麼」



    用一個 input_select 表示家裡的狀態
    1. input_select:
    2.   家庭狀態:
    3.     name: 家庭狀態
    4.     options:
    5.       - 無人
    6.       - 在家
    7.       - 睡覺
    8.       - 看電影
    9.       - 外出中
    10.       - 度假
    11.     initial: 在家
    12.     icon: mdi:home-account
    複製代碼

    然後用自動化維護它
    1. automation:
    2.   - alias: 狀態 - 睡覺
    3.     triggers:
    4.       - trigger: state
    5.         entity_id: binary_sensor.主臥有人
    6.         to: "on"
    7.       - trigger: time
    8.         at: "23:30:00"
    9.     conditions:
    10.       - condition: time
    11.         after: "22:00:00"
    12.         before: "05:00:00"
    13.       - condition: state
    14.         entity_id: binary_sensor.客廳有人
    15.         state: "off"
    16.         for: "00:20:00"
    17.       - condition: state
    18.         entity_id: input_select.家庭狀態
    19.         state: 在家
    20.     actions:
    21.       - action: input_select.select_option
    22.         target:
    23.           entity_id: input_select.家庭狀態
    24.         data:
    25.           option: 睡覺
    複製代碼

    好處


    • 所有自動化都可以參考這一個狀態
    • 邏輯集中,不會散在三十個自動化裡
    • 可以在儀表板上直接手動切換
    • 出錯的時候很好排查


    實用技巧:用「最後活動時間」
    1. template:
    2.   - sensor:
    3.       - name: 家裡最後活動
    4.         unique_id: last_activity
    5.         device_class: timestamp
    6.         state: >
    7.           {% set 感測器 = [
    8.             'binary_sensor.客廳有人',
    9.             'binary_sensor.廚房有人',
    10.             'binary_sensor.主臥有人',
    11.             'binary_sensor.浴室有人'
    12.           ] %}
    13.           {{ 感測器 | map('states') | select('eq', 'on') | list | count > 0
    14.              and now().isoformat()
    15.              or states('sensor.家裡最後活動') }}
    複製代碼

    用途


    • 「三小時沒有任何活動」→ 可能是離家忘了關東西
    • 獨居長輩的關懷提醒




    常見的問題與解法

    問題一:明明在家卻顯示離家


    • 手機的省電模式限制了定位 → 把 HA App 加入白名單
    • Wi-Fi 隨機 MAC → 關掉(上面講過)
    • consider_home 太短 → 調長到 300 秒
    • 家的範圍太小 → 設定 → 區域 → 把家的半徑調大(100-150 公尺)


    問題二:一直在「離家」和「到家」之間跳

    這叫 GPS 漂移。


    • 把「家」的半徑調大
    • 加上「持續 N 分鐘」的條件

    1.     triggers:
    2.       - trigger: state
    3.         entity_id: person.charles
    4.         to: not_home
    5.         for: "00:05:00"
    複製代碼

    問題三:最後一個人離開了但沒觸發

    用 zone 而不是 person
    1.     triggers:
    2.       - trigger: numeric_state
    3.         entity_id: zone.home
    4.         below: 1
    複製代碼

    zone.home 的狀態是「裡面有幾個人」 ——
    這比逐一檢查每個 person 好寫太多。

    問題四:訪客不被算進去


    • 加一個 input_boolean「有訪客」
    • 或者用「家裡有活動但沒有已知的人在家」來推論


    問題五:離家自動化在你還沒走遠時就觸發


    • 用一個更大的 zone(例如「社區」)
    • 或者加時間條件


    一個實用的離家自動化
    1. automation:
    2.   - alias: 最後一人離家
    3.     mode: single
    4.     triggers:
    5.       - trigger: numeric_state
    6.         entity_id: zone.home
    7.         below: 1
    8.         for: "00:05:00"
    9.     conditions:
    10.       # 確認真的沒人(雙重保險)
    11.       - condition: state
    12.         entity_id: binary_sensor.客廳有人
    13.         state: "off"
    14.         for: "00:10:00"
    15.       - condition: state
    16.         entity_id: input_boolean.有訪客
    17.         state: "off"
    18.     actions:
    19.       - action: light.turn_off
    20.         target:
    21.           entity_id: all
    22.       - action: climate.turn_off
    23.         target:
    24.           entity_id: all
    25.       - action: input_select.select_option
    26.         target:
    27.           entity_id: input_select.家庭狀態
    28.         data:
    29.           option: 外出中
    30.       # 回報做了什麼
    31.       - action: notify.mobile_app_phone
    32.         data:
    33.           title: 離家模式已啟動
    34.           message: >
    35.             已關閉所有燈和空調。
    36.             門窗狀態:{{ states('binary_sensor.所有門窗') }}
    複製代碼

    最後那個通知很重要 ——
    自動化做了什麼要讓你知道,不然它默默做錯你不會發現。

    建議的實作順序


    • 先把 person 弄準(關隨機 MAC、加 Wi-Fi 追蹤、調 zone 半徑)
    • 一個房間一個房間加存在偵測,每個都設 delay_off
    • 建立 input_select 的家庭狀態
    • 把現有的自動化改成參考那個狀態
    • 最後才做複雜的推論


    不要一次全做 —— 每一層都要調校,一次做完你會分不清是哪裡出問題。

    ---

    下一篇:十個最常見的自動化失敗模式
    以及每一個的正確寫法。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

    GMT+8, 2026-9-24 12:20 , Processed in 0.424634 second(s), 24 queries .

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