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

    「到家」偵測:五種訊號的準確度比較與組合做法

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    「我回到家了」這件事,比想像中難判斷。

    這篇比較五種訊號,以及怎麼組合起來。



    為什麼難

    理想的「到家自動化」應該是:


    • 你走到門口的時候,燈已經亮了、冷氣已經涼了
    • 不能太早(還在路上就開冷氣是浪費)
    • 不能太晚(進門還要等,就沒意義)
    • 不能誤判(沒回家卻觸發)


    五種訊號

    一、手機 GPS 定位


    • 優點:距離遠就知道,可以提前準備
    • 缺點:誤差大(尤其大樓多的地方)、省電模式會延遲、耗電


    實際的問題


    • 住大樓的話,GPS 誤差可能讓你在家裡被判定離開
    • iOS 的省電模式會大幅降低定位更新頻率
    • Android 各廠牌的省電策略不同,有些會直接殺掉背景定位


    設定建議


    • HA App 的「位置」設定裡把精確度調高
    • 區域(zone)半徑設大一點(100-150 公尺),減少邊界抖動
    • Android 要把 HA App 加入電池最佳化的白名單


    二、路由器偵測手機連上 Wi-Fi(最實用)


    • 優點非常快(進門幾秒內)、非常準、不耗手機電
    • 缺點:只有「已經到家」,不能提前


    怎麼做


    • 路由器的整合(OpenWrt、UniFi、AsusWRT 等)
    • 或者用 Ping 整合直接 ping 手機的固定 IP
    • 或者用 Nmap Tracker 掃描網段


    重要:MAC 位址隨機化會破壞這個

    手機要關閉「私密 Wi-Fi 位址」(iOS)或
    「使用隨機 MAC」(Android),而且用 DHCP 保留固定 IP

    三、藍牙信標(BLE)


    • 優點:範圍可控(可以做到「進入某個房間」)
    • 缺點:要額外的硬體、設定麻煩


    用 ESPHome 的 bluetooth_proxyble_rssi
    1. esp32_ble_tracker:
    2.   scan_parameters:
    3.     active: false
    4. sensor:
    5.   - platform: ble_rssi
    6.     mac_address: AA:BB:CC:DD:EE:FF
    7.     name: "charles 手機 RSSI"
    8.     filters:
    9.       - sliding_window_moving_average:
    10.           window_size: 5
    11.           send_every: 5
    複製代碼

    2026 年的好消息:ESPHome 在 8 月的版本把 BLE 層改成平台中立,
    現在 Raspberry Pi Pico W、BK72xx、LN882H 也能跑藍牙代理 ——
    更便宜的板子也能當 BLE 偵測節點。

    四、車輛訊號(有車的話最準)


    • CarPlay / Android Auto 連線狀態(用 iOS 捷徑或 Android 的 Tasker)
    • 車庫門開啟
    • 車輛的位置 API(如果車子有)


    「連上 CarPlay」是很強的訊號 ——
    代表你真的在車上,而且準備出發或剛到。

    五、實體訊號(最確定但最晚)


    • 大門開啟(門磁)
    • 門鎖被開啟(而且知道是誰)
    • 玄關人體感應


    這些是「確定到家」的訊號,但那時候你已經進門了。



    組合做法:分階段觸發

    階段一:接近中(GPS,距離 1 公里)
    1. alias: 接近家裡
    2. triggers:
    3.   - trigger: zone
    4.     entity_id: person.charles
    5.     zone: zone.home_wide      # 半徑 1 公里的大區域
    6.     event: enter
    7. conditions:
    8.   - condition: state
    9.     entity_id: input_select.house_mode
    10.     state: 外出
    11. actions:
    12.   # 只做「需要時間」的事
    13.   - condition: numeric_state
    14.     entity_id: sensor.living_room_temperature
    15.     above: 29
    16.   - action: climate.set_temperature
    17.     target: {entity_id: climate.living_room}
    18.     data: {temperature: 26, hvac_mode: cool}
    19. mode: single
    複製代碼

    這個階段只做「需要預熱時間」的事(冷氣、暖氣、熱水器)。

    不要在這個階段開燈 —— 誤判的話燈會白開很久。

    階段二:到家了(Wi-Fi 連線)
    1. alias: 到家
    2. triggers:
    3.   - trigger: state
    4.     entity_id: device_tracker.charles_phone_wifi
    5.     to: "home"
    6. conditions:
    7.   - condition: state
    8.     entity_id: input_select.house_mode
    9.     state: 外出
    10. actions:
    11.   - action: input_select.select_option
    12.     target: {entity_id: input_select.house_mode}
    13.     data:
    14.       option: >
    15.         {{ '在家-夜間' if (now().hour >= 18 or now().hour < 6)
    16.            else '在家-日間' }}
    17. mode: single
    複製代碼

    階段三:進門了(門磁 / 玄關感應)
    1. alias: 進門
    2. triggers:
    3.   - trigger: state
    4.     entity_id: binary_sensor.front_door
    5.     to: "on"
    6. conditions:
    7.   - condition: state
    8.     entity_id: input_select.house_mode
    9.     state_not: 睡覺
    10. actions:
    11.   - action: light.turn_on
    12.     target: {entity_id: light.entrance}
    13.     data:
    14.       brightness_pct: >
    15.         {{ 30 if (now().hour >= 22 or now().hour < 6) else 80 }}
    16.   - delay: "00:03:00"
    17.   - action: light.turn_off
    18.     target: {entity_id: light.entrance}
    19. mode: restart
    複製代碼

    這個分階段的設計解決了「太早 vs 太晚」的矛盾


    • 需要時間的事(冷氣)→ 用不太準但夠早的訊號
    • 瞬間的事(開燈)→ 用很準但比較晚的訊號




    多人家庭的處理

    不要用「某個人回家」當觸發,會有這些問題:


    • A 已經在家,B 回家 → 又觸發一次「回家模式」
    • A 出門但 B 在家 → 被誤判成「沒人在家」


    正確做法:用「人數從 0 變成 1」當觸發
    1. template:
    2.   - sensor:
    3.       - name: 家裡人數
    4.         state: >
    5.           {{ states.person
    6.              | selectattr('state','eq','home')
    7.              | list | count }}
    複製代碼
    1. alias: 第一個人回家
    2. triggers:
    3.   - trigger: numeric_state
    4.     entity_id: sensor.家裡人數
    5.     above: 0
    6.     from: 0
    7. actions:
    8.   - action: script.turn_on
    9.     target: {entity_id: script.回家模式}
    10. mode: single
    複製代碼

    反過來「最後一個人離家」
    1. triggers:
    2.   - trigger: numeric_state
    3.     entity_id: sensor.家裡人數
    4.     below: 1
    5.     for: "00:10:00"
    複製代碼

    for: 10 分鐘避免定位短暫跳動造成誤判。

    訪客的問題

    家裡有客人但主人都出門了,
    「沒人在家」的判斷就錯了。

    解法:加一個「實體證據」層(前面那篇講過):
    1. template:
    2.   - binary_sensor:
    3.       - name: 家裡真的有人
    4.         device_class: occupancy
    5.         delay_off: "00:30:00"
    6.         state: >
    7.           {{ states('sensor.家裡人數') | int(0) > 0
    8.              or is_state('binary_sensor.客廳感應','on')
    9.              or is_state('binary_sensor.走道感應','on')
    10.              or states('sensor.電視功率') | float(0) > 20 }}
    複製代碼

    準確度的實際體感

    我自己跑了一年多的觀察:


    • 只用 GPS:一週誤判 2-3 次
    • GPS + Wi-Fi:一個月誤判 1-2 次
    • GPS + Wi-Fi + 人體感應 + 電視功率幾乎沒有誤判


    誤判的成本不對稱


    • 該觸發沒觸發 —— 只是不方便,你自己開燈就好
    • 不該觸發卻觸發 —— 冷氣白開、燈亮一整天、家人被吵


    所以我的設定偏保守:寧可晚一點觸發,也不要誤觸發。

    ---

    最後一個建議:

    「到家自動化」的價值其實沒有想像中高。

    因為你回到家的時候手是空的、人是清醒的
    開個燈根本不麻煩。

    真正有價值的是「離家自動化」 ——
    因為那時候你已經走了,不可能回頭關燈。

    如果時間有限,先把離家做好,再做回家。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

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

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