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

    把 HA 的感測器餵給 HomeKit:哪些能用、哪些會失敗

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    HomeKit 支援的感測器類型比你想的少很多

    很多人把一堆感測器橋接過去,
    結果不是沒出現、就是變成奇怪的東西。

    這篇列清楚。



    HomeKit 原生支援的感測器類型

    Binary sensor 類(開/關)


    • 移動偵測(motion)
    • 門窗接觸(door / window / garage_door / opening)
    • 佔用偵測(occupancy / presence)
    • 煙霧偵測(smoke)
    • 一氧化碳(carbon_monoxide)
    • 漏水(moisture)
    • 低電量(battery)—— 會變成配件的電量屬性,不是獨立感測器


    數值 sensor 類


    • 溫度(temperature)
    • 濕度(humidity)
    • 光照(illuminance)
    • 空氣品質(aqi / pm25 / pm10)
    • 二氧化碳(carbon_dioxide)
    • 一氧化碳(carbon_monoxide)
    • 揮發性有機物(volatile_organic_compounds)


    就這些。

    完全不支援的(送過去會失敗或變成怪東西)


    • 功率、電壓、電流、用電量
    • 氣壓
    • 風速、風向、雨量
    • 距離、重量、流量
    • 訊號強度(rssi、linkquality)
    • 任何文字狀態的感測器(例如「洗衣機:脫水中」)
    • input_number、input_select、input_text
    • counter、timer


    HA 的 HomeKit 整合遇到不支援的類型,通常會直接跳過並在日誌記一筆。

    所以症狀是「它就是沒出現」,而且你不會收到明顯的錯誤。



    關鍵:device_class 決定一切

    HomeKit 整合是看 device_class 來決定怎麼處理一個感測器的。

    沒有設 device_class 的感測器,就算數值是溫度,也不會被認出來。

    怎麼修

    方法一:在實體設定裡改

    點那個實體 → 齒輪 → 顯示為 → 選正確的類型。

    方法二:在 YAML 裡指定
    1. template:
    2.   - sensor:
    3.       - name: 客廳溫度
    4.         unique_id: living_temp
    5.         device_class: temperature       # ← 這行不能少
    6.         state_class: measurement
    7.         unit_of_measurement: "°C"
    8.         state: "{{ states('sensor.raw_temp') | float(0) }}"
    複製代碼

    方法三:在 homekit 設定裡強制指定類型
    1. homekit:
    2.   - name: HA Bridge
    3.     port: 21063
    4.     entity_config:
    5.       binary_sensor.front_door:
    6.         type: door
    7.       switch.bathroom_fan:
    8.         type: fan
    9.       switch.water_pump:
    10.         type: valve
    11.         valve_type: irrigation
    複製代碼

    常見的轉換技巧

    技巧一:把「不支援的東西」變成 binary_sensor

    你想在「家庭」App 看到「洗衣機好了沒」,
    sensor.washer_state(文字狀態)不支援。

    做一個 binary_sensor
    1. template:
    2.   - binary_sensor:
    3.       - name: 洗衣機運轉中
    4.         unique_id: washer_running
    5.         device_class: running        # HomeKit 不認識 running
    6.         state: >
    7.           {{ states('sensor.washer_power') | float(0) > 10 }}
    複製代碼

    但 device_class: running 在 HomeKit 裡不支援

    改成 occupancymotion,就會變成「偵測到 / 未偵測到」:
    1.       - name: 洗衣機運轉中
    2.         device_class: occupancy      # ← 借用一個 HomeKit 認得的類型
    3.         state: >
    4.           {{ states('sensor.washer_power') | float(0) > 10 }}
    複製代碼

    這是「借用類型」的技巧,語意上不完美,但能用。

    技巧二:把數值門檻變成 binary_sensor

    想在 HomeKit 收到「電量低於 20%」的提醒:
    1. template:
    2.   - binary_sensor:
    3.       - name: 有裝置電量低
    4.         unique_id: any_low_battery
    5.         device_class: battery        # HomeKit 支援,會顯示為低電量
    6.         state: >
    7.           {{ states.sensor
    8.              | selectattr('attributes.device_class','defined')
    9.              | selectattr('attributes.device_class','eq','battery')
    10.              | map(attribute='state') | map('int', 100)
    11.              | select('lt', 20) | list | count > 0 }}
    複製代碼

    技巧三:用 problem 類型做通用警報

    HA 的 device_class: problem 在 HomeKit 裡對應不到,
    但你可以借用 smokecarbon_monoxide
    把它變成會發出警報的東西。

    注意:這會在「家庭」App 裡顯示成煙霧警報,可能造成誤會。

    我的建議是不要這樣做,重要警報用 HA 的推播通知比較清楚。

    技巧四:用虛擬開關代替 input_boolean

    input_boolean 不能橋接到 HomeKit。

    但你可以做一個 template switch 包住它:
    1. switch:
    2.   - platform: template
    3.     switches:
    4.       vacation_mode:
    5.         friendly_name: 度假模式
    6.         value_template: "{{ is_state('input_boolean.vacation','on') }}"
    7.         turn_on:
    8.           action: input_boolean.turn_on
    9.           target: {entity_id: input_boolean.vacation}
    10.         turn_off:
    11.           action: input_boolean.turn_off
    12.           target: {entity_id: input_boolean.vacation}
    複製代碼

    switch 是 HomeKit 支援的網域,這樣就過得去了。

    技巧五:用 script 做「按鈕」

    想在「家庭」App 放一個「執行某個場景」的按鈕:


    • HA 的 scene → 會變成 HomeKit 的場景 ✓
    • HA 的 script → 會變成一個開關(按下去執行,然後自己關掉)✓
    • input_button → 不支援


    script 那個很好用,記得在 script 裡設:
    1. 睡前模式:
    2.   alias: 睡前模式
    3.   icon: mdi:weather-night
    4.   mode: single
    5.   sequence: ...
    複製代碼



    其他常見的坑

    坑一:單位不對

    HomeKit 預期溫度是攝氏或華氏、光照是 lux。
    單位設錯的話數字會很奇怪。

    確認 unit_of_measurement 是標準單位。

    坑二:狀態是 unknown 或 unavailable

    橋接的當下如果實體是 unavailable,
    HomeKit 可能不會建立那個配件

    解法:確認實體正常之後再重啟 HA。

    坑三:改了之後「家庭」App 沒更新

    HomeKit 的配件清單是在配對時建立的。

    之後增減實體的話:


    • 增加:通常會自動出現
    • 刪除:可能會留下一個「無回應」的殭屍配件
    • 改類型:常常不會生效


    改類型的話最可靠的做法是重新配對(刪掉橋接器重加)。

    坑四:名稱有特殊字元

    HomeKit 對配件名稱有限制。
    含有 emoji特殊符號的名稱可能會出問題。

    建議用純中文或英文,不要加符號。

    坑五:太多實體導致啟動很慢

    前面那篇講過橋接器上限。
    感測器是最容易爆量的,因為一個裝置可能有五六個感測器實體。

    用 exclude_entity_globs 大量排除是最有效的做法。

    除錯:看日誌
    1. # configuration.yaml
    2. logger:
    3.   default: warning
    4.   logs:
    5.     homeassistant.components.homekit: debug
    複製代碼

    重啟後看日誌,會告訴你:


    • 哪些實體被橋接了
    • 哪些被跳過,以及原因
    • 配件總數


    「被跳過」那幾行最有價值,直接告訴你哪個類型不支援。

    ---

    我的建議是不要想把所有東西都送進 HomeKit

    「家庭」App 適合快速操作和簡單查看
    複雜的資訊和邏輯留在 HA。

    我橋接過去的感測器只有:


    • 每個房間的溫濕度(6 個)
    • 門窗接觸(4 個)
    • 移動偵測(3 個)
    • 漏水(3 個)
    • 煙霧和瓦斯(2 個)


    總共 18 個,剛好是家人真的會看的那些。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

    GMT+8, 2026-9-24 11:14 , Processed in 0.084790 second(s), 24 queries .

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