|
|
把實體丟進 HomeKit Bridge 之後,結果通常是三種之一:
出現而且正常、出現但變成奇怪的東西、完全沒出現。
這一篇把三種情況各自的原因、怎麼判斷、怎麼修,一次講完。
讀完你會知道手上任何一個實體會變成什麼,以及不滿意的話怎麼改。

先建立正確的心智模型:HomeKit 看的是網域和 device_class
Home Assistant 的 HomeKit 整合在啟動時,會對每一個要橋接的實體做兩件事:
- 看它的網域(entity_id 的第一段,light / switch / sensor / binary_sensor…)決定大方向
- 看它的device_class 與單位決定變成哪一種 HomeKit 配件
兩件事都對,才會變成你想要的東西。
很多人只改了其中一個,然後對著「怎麼還是不對」發呆。
對照表一:開關類(這些都支援,而且很多人以為不支援)
下面這些網域全部以「開關」的形式出現在「家庭」App:
- switch —— 一般開關
- input_boolean —— 輔助元件的開關,支援
- input_button、button —— 按鈕,按下去執行然後自己彈回,支援
- script —— 腳本,按下去執行,支援
- scene —— 場景,支援
- automation —— 自動化,變成一個可以開關的開關(開關的是「啟用/停用」)
- vacuum —— 掃地機,變成一個開關(只能開始/停止,看不到狀態)
- lawn_mower —— 割草機
- remote —— 遙控器(不支援「活動」的那種)
網路上很多教學說 input_boolean 和 input_button 不能橋接,那是舊資訊。
現在直接收進 filter 就會出現,不需要用 template switch 包一層。
input_select 和 select 也支援,不過型態特別:它會變成一個
延長線型的配件(power strip),每一個選項是上面的一個插座按鈕。
按下「看電影」那個按鈕就等於把 input_select 切到「看電影」。
對照表二:感測器類
binary_sensor(只有開/關兩種狀態的),支援這十種 device_class:
- door、window、garage_door、opening —— 門窗接觸
- motion —— 動作偵測
- occupancy —— 佔用偵測
- smoke —— 煙霧
- gas —— 可燃氣體
- co2 —— 二氧化碳
- moisture —— 漏水
這裡有一個很關鍵、而且跟直覺相反的行為:
不在清單裡的 device_class,不會被跳過,而是會被當成 occupancy(佔用偵測)。
所以一個 device_class: running 的 binary_sensor,送過去之後
會出現,只是「家庭」App 裡顯示成「偵測到/未偵測到」。
這件事的實務意義是:binary_sensor 沒出現的話,原因絕對不是 device_class,
去查 filter 有沒有把它收進來、實體當下是不是 unavailable。
很多人在這裡浪費一整個晚上去改 device_class。
數值型 sensor,只有六種對得上,而且每一種都有明確的判定條件:
- 溫度 —— device_class 是 temperature而且單位是 °C 或 °F
- 濕度 —— device_class 是 humidity而且單位是 %
- 光照 —— 單位是 lx 或 lm,或者 device_class 是 illuminance
- 空氣品質 —— device_class 是 gas / pm10 / pm25 / nitrogen_dioxide / volatile_organic_compounds,或者 entity_id 裡含有 gas / pm10 / pm25 字樣
- 二氧化碳 —— device_class 是 carbon_dioxide,或者 entity_id 裡含有 co2
- 一氧化碳 —— device_class 是 carbon_monoxide
溫度和濕度是「兩個條件都要成立」,這是最常中的坑:
device_class 設對了但單位寫成 "C" 而不是 "°C",它就不會出現,而且日誌不會特別講。
空氣品質和二氧化碳則寬鬆很多,連 entity_id 裡有那幾個字都算。
所以一個叫 sensor.bedroom_pm25_raw 的東西就算沒設 device_class 也會被當成空氣品質感測器 ——
這也解釋了某些「我明明沒設定它為什麼跑出來」的情況。
對照表三:其他網域
- light —— 燈,支援開關、亮度、RGB 色彩
- cover —— device_class 是 garage 或 gate 的變成車庫門;支援 set_cover_position 的變成窗簾;device_class 是 door 的變成門
- climate —— 冷暖氣。有兩段以上風速或可關閉的擺葉,會變成 Heater Cooler 型態(模式、溫度、風速、擺葉在同一張卡);其他變成 Thermostat
- fan —— 風扇。綁了 PM2.5 感測器的話會自動變成空氣清淨機
- humidifier —— 加濕機與除濕機
- water_heater —— 熱水器
- valve —— 閥門
- alarm_control_panel —— 保全系統
- media_player —— 會變成一組開關(開關機、播放暫停、播放停止、靜音),要在 entity_config 裡用 feature_list 指定要哪幾個
- device_tracker、person —— 變成佔用偵測(occupancy)感測器
- 裝置觸發(device_automation) —— 支援觸發的裝置(例如 Zigbee 無線按鈕)會變成 HomeKit 的「可程式化開關」,能直接拿來當 HomeKit 自動化的觸發來源
真正完全不支援的
- 文字狀態的 sensor(例如「洗衣機:脫水中」)
- 功率、電壓、電流、用電量、氣壓、風速、雨量、距離、重量、流量
- input_number、number、input_text、text
- counter、timer
這些不會出現,而且不會有紅字錯誤,症狀就是「它就是沒有」。

步驟 1:先確認實體現在到底是什麼樣子
動手改之前先看清楚,不然你會改錯東西。
- 設定 → 工具 → 狀態
- 在「實體」欄位輸入你的實體 ID
- 看右邊的屬性區塊
你會看到什麼:類似這樣的屬性清單。
- device_class: temperature
- state_class: measurement
- unit_of_measurement: °C
- friendly_name: 客廳溫度
複製代碼
屬性裡沒有 device_class 這一行,就是它不會被 HomeKit 認出來的原因,
往下走步驟 2。
有 device_class 但單位不對(例如溫度的單位是 C 而不是 °C),走步驟 3。
步驟 2:補上 device_class(三種改法,由簡到難)
改法 A:在介面上改(最快,適合單一實體)
- 設定 → 裝置與服務 → 實體
- 找到那個實體點進去 → 右上角齒輪
- 展開「進階設定」,找到「顯示為」,選正確的類型
- 單位也在同一頁可以改
你會看到什麼:存檔之後回「設定 → 工具 → 狀態」,屬性裡會多出 device_class 那一行。
這個下拉選單是灰色的、點不動,代表這個實體的整合沒有開放讓使用者改,
走改法 B。
改法 B:用 template 包一層鏡射實體
原本的實體不動,另外做一個帶正確 device_class 的新實體,橋接新的那個。
- # configuration.yaml
- template:
- - sensor:
- - name: Living Room Temperature
- unique_id: living_room_temperature_hk
- device_class: temperature
- state_class: measurement
- unit_of_measurement: "°C"
- state: "{{ states('sensor.raw_temp_reading') | float(0) }}"
- availability: "{{ states('sensor.raw_temp_reading') not in ['unknown', 'unavailable'] }}"
複製代碼
三件事不能省:
- unique_id —— 沒有它就不能在介面上改設定,而且 HomeKit 的配件編號是從 entity_id 算的,將來改名會掉設定
- availability —— 來源掛掉時讓這個實體也變成不可用。不寫的話來源變 unknown 時,float(0) 會讓它變成 0 度,「家庭」App 裡就是一個永遠顯示 0 度的感測器
- name 用英文 —— 原因看下面
⚠ name 寫中文的話,entity_id 會變成你認不出來的東西
Home Assistant 產生 entity_id 時會把名稱轉成小寫英數字。
中文會被音譯成拼音 —— 寫 name: 建議色溫,實際產生的可能是
sensor.jian_yi_se_wen 這種東西。
然後你在自動化裡寫 states('sensor.建議色溫'),它永遠回傳 unknown,
而且不會報錯,因為「查詢一個不存在的實體」在 Home Assistant 裡是合法的。
所以 name 一律用英文,要中文顯示名稱的話另外設:
在介面上改「顯示名稱」,或是在 HomeKit 的 entity_config 裡設 name。
確認的方法:存檔重啟後去「設定 → 工具 → 狀態」,
在實體欄位打 sensor. 然後往下捲,看實際產生的 entity_id 是什麼,不要用猜的。
改法 C:在 HomeKit 的 entity_config 裡直接指定型別
這個不是改 device_class,是改「變成哪一種 HomeKit 配件」。
只對 switch、fan、climate 三個網域有效。
|
|