|
|
先更正一個流傳很廣的說法:「IoT 裝置的韌體是單向的,更新了就回不去」。這句話在 2026 年只對了一半 —— Zigbee2MQTT 已經有一整組專門的降版指令,預設的韌體索引也保留了前一版。真正該小心的變成另外幾件事。這篇把四條更新路線從頭到尾寫完:更新前要留什麼、指令怎麼下、進行中會看到什麼、卡住了怎麼判斷、以及每一層各自真正能回去到哪裡。

這篇涵蓋的四條路線:
- Zigbee2MQTT 管的 Zigbee 裝置(燈泡、感應器、開關)
- ZHA 管的 Zigbee 裝置
- ESPHome 管的自製裝置(ESP32 / ESP8266)
- Home Assistant 本體(Core、作業系統、應用程式)
四條路線的「能不能回去」差很多,先看這張表,它決定你每一條要多小心:
- Zigbee2MQTT → 可以降一版。它有專屬的 downgrade 主題,而且預設的韌體索引倉庫同時維護「最新」與「次新」兩份索引檔。再更舊的要自己提供檔案。但裝置韌體自己可能拒絕比較舊的版本,而且 Zigbee 規格不允許刷成「同一版」,這兩點 Zigbee2MQTT 都強制不了
- ZHA → 沒有對應的降版指令。有一條從本機 .ota 檔刷的路(第九步),同樣受裝置端的版本檢查限制,不保證刷得回去
- ESPHome → 完全可以回去,因為韌體是你自己編的,YAML 在你手上
- Home Assistant Core / OS → 可以回去,但要靠備份還原,不是按一個「降版」鈕
既然可以降版了,那還要小心什麼? 三件事,而且都比「回不去」更容易咬人:
- 官方文件明講「無法備份目前安裝的版本」。你能降到的版本是索引裡有的那一版,不是「你現在這一版」
- Zigbee2MQTT 在更新完成後會自動重新訪查(re-interview)並重新設定裝置,而這可能把你自訂的回報間隔改回預設值。溫度感應器原本設成每 5 分鐘回報一次,更新後可能變回每小時
- 裝置更新完會重開機,而重開機會觸發它的「通電行為」。官方特別提醒:半夜更新燈泡,它可能重開之後就亮了
第一步:更新前先做備份(Home Assistant 那一側)
這一步不管你要更新哪一條路線都要做,因為 Zigbee 的配對資訊、實體 ID、自動化全在 Home Assistant 裡。
到 設定 → 系統 → 備份,右下角 建立備份,選 完整備份。
⚠ 2025.1 之後備份系統整個重做了,有兩件事和舊教學不同:
- 舊的「備份密碼」現在叫 加密金鑰。它是在你第一次建立備份時自動產生的一串英數字
- 這串金鑰存在緊急工具包(emergency kit)裡。Nabu Casa 不會幫你保存,遺失就沒有任何方法解開你的備份
所以第一次做備份時,畫面會要你下載緊急工具包。一定要下載,而且不要只存在這台機器上(機器壞掉時你就是要用這個檔案)。
你會看到什麼:備份清單裡多一筆,大小通常是數百 MB 到數 GB,狀態顯示完成時間。點進去可以看到它包含哪些部分(Home Assistant Core 設定、每個應用程式的資料、媒體、共享資料夾)。
- 備份卡在「建立中」超過十五分鐘 → 多半是某個應用程式的資料很大(Frigate 的錄影、recorder 的資料庫)。到 設定 → 系統 → 記錄 看有沒有錯誤
- 大小只有幾 MB → 你選到的是部分備份,不是完整備份
第二步:建立更新前的基準線
「更新後有沒有壞掉」這個問題,只有在你知道更新前長什麼樣的時候才回答得出來。
到 開發者工具 → 模板,把左邊的內容整個換成下面這段:
- 目前不可用的實體({{ states | selectattr('state','in',['unavailable','unknown']) | list | count }} 個):
- {% for s in states | selectattr('state','in',['unavailable','unknown']) | list %}
- {{ s.entity_id }}
- {%- endfor %}
- Zigbee 裝置數:{{ states.sensor | selectattr('attributes.friendly_name','defined') | list | count }}
- 自動化清單:
- {% for a in states.automation %}
- {{ a.entity_id }} = {{ a.state }} / 最後觸發 {{ a.attributes.last_triggered }}
- {%- endfor %}
複製代碼
你會看到什麼:右邊立刻跑出結果,例如:
- 目前不可用的實體(2 個):
- sensor.yang_tai_wen_du
- binary_sensor.che_ku_men
- 自動化清單:
- automation.li_jia_duan_dian = on / 最後觸發 2026-09-24 08:12:41+00:00
- automation.gan_ying_deng = on / 最後觸發 2026-09-25 06:33:02+00:00
複製代碼
把這段輸出整個複製起來貼到記事本。 更新之後再跑一次同一段,兩份一比就知道少了什麼。
這一步是整篇最值錢的一步,而且只要三十秒。沒有它的話,更新三天後你發現某個感應器不見了,你完全無法確定是不是更新造成的。
第三步(Zigbee2MQTT):先把 OTA 的行為設對
Zigbee2MQTT 預設會回應裝置自己發起的更新檢查。也就是說,就算你不做任何事,裝置也可能自己來問有沒有新版。要不要讓它自己來,由你決定。
打開 Zigbee2MQTT 的 configuration.yaml(HA OS 的話在 應用程式 → Zigbee2MQTT → 設定分頁,或用 File Editor 開 /config/zigbee2mqtt/configuration.yaml),加上或修改 ota: 這一段:
- ota:
- # true = 不回應裝置自己發起的檢查,只有你手動按才會更新
- disable_automatic_update_check: true
- # 兩次檢查之間至少間隔幾分鐘,預設 1440(一天)
- update_check_interval: 2880
- # 傳一個區塊之後等多久再傳下一個,預設 250 毫秒,最小 50
- # 調大 = 更新更慢但更不會塞住整個 Zigbee 網路
- image_block_response_delay: 500
- # 每個區塊多大,預設 50 bytes,範圍 10-100
- # 有些裝置對大區塊會失敗,卡住的話往下調
- default_maximum_data_size: 50
- # 等裝置來要區塊的逾時,預設 150000 毫秒
- image_block_request_timeout: 150000
- # 自訂索引檔(本機路徑或網址)。不填就用官方的 zigbee-OTA 倉庫
- # zigbee_ota_override_index_location: my_index.json
複製代碼
|
|