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

    ESPHome 除錯:連不上、一直重開、記憶體不足

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    ESPHome 用久了一定會遇到這三種問題。

    這篇整理成速查。



    先講三個除錯工具

    一、序列埠日誌(最可靠)

    接 USB 線,在 ESPHome 裡點 LOGS。


    • 這是唯一能看到「開機過程」的方法
    • 裝置連不上 Wi-Fi、一直重開的時候只能靠這個
    • 記得 logger 的 baud_rate 不能設 0


    二、無線日誌

    裝置正常連線的話,在 ESPHome 裡點 LOGS 會用 Wi-Fi 連。

    方便,但裝置有問題的時候通常也連不上。

    三、web_server
    1. web_server:
    2.   port: 80
    3.   local: true
    複製代碼

    直接用瀏覽器開 http://裝置IP,可以看狀態、按按鈕。

    除錯階段很好用。

    症狀一:連不上 Wi-Fi



    接 USB 看日誌,會有明確的訊息。

    常見原因


    • ESP32 / ESP8266 只支援 2.4GHz —— 不支援 5GHz
    • SSID 有中文或特殊字元 —— 改成純英數
    • 密碼打錯 —— 檢查 secrets.yaml
    • 路由器開了「隱藏 SSID」 —— 要加設定:

    1. wifi:
    2.   ssid: !secret wifi_ssid
    3.   password: !secret wifi_password
    4.   fast_connect: true        # 隱藏 SSID 要開這個
    複製代碼


    • 路由器的 MAC 過濾 —— 把裝置的 MAC 加進白名單
    • 訊號太弱 —— 日誌會顯示 RSSI,低於 -80dBm 就很勉強
    • DHCP 沒 IP 可以發
    • 路由器同時連線數滿了(有些便宜路由器上限很低)


    訊號弱的對策
    1. wifi:
    2.   # 指定用哪個 AP(多個 AP 時避免亂跳)
    3.   networks:
    4.     - ssid: !secret wifi_ssid
    5.       password: !secret wifi_password
    6.       bssid: "AA:BB:CC:DD:EE:FF"    # 指定某一台 AP
    7.   # 提高輸出功率(ESP32)
    8.   output_power: 20dB
    複製代碼

    或者加外接天線的板子。

    症狀二:一直重開機



    接 USB 看日誌,開機訊息裡會有「重開原因」。
    1. [I][app:029]: Running through setup()...
    2. rst:0xc (SW_CPU_RESET)
    複製代碼

    常見的重開原因


    • SW_CPU_RESET —— 軟體要求重開(正常的 OTA 或按鈕)
    • POWERON_RESET —— 電源重新接上
    • RTCWDT_RTC_RESET / TG0WDT —— 看門狗逾時
        通常是程式卡住了
    • Brownout detector —— 電壓不足


    最常見的兩個原因

    原因一:電源不足(Brownout)

    症狀:日誌出現 Brownout detector was triggered


    • USB 線太細或太長 —— 換一條短的、粗的
    • 充電器輸出不夠 —— ESP32 峰值電流可能到 500mA,
        用 1A 以上的充電器
    • 接了太多東西 —— 繼電器、LED 都吃電
    • 從 ESP32 的 3.3V 腳位供電給大耗電的模組 ——
        那個腳位輸出有限


    這是最常見的原因,而且很多人第一時間會懷疑是程式問題。

    原因二:記憶體不足

    症狀:日誌出現 Guru Meditation Error
    abort() was called at PC ...

    (下面詳細講。)

    其他原因


    • reboot_timeout 觸發 —— Wi-Fi 或 API 連不上
        (檢查你的 reboot_timeout 設定)
    • 某個元件的 bug —— 試著把可疑的元件註解掉,逐一排除


    症狀三:記憶體不足



    怎麼看還剩多少記憶體
    1. sensor:
    2.   - platform: template
    3.     name: "可用記憶體"
    4.     lambda: 'return ESP.getFreeHeap();'
    5.     unit_of_measurement: B
    6.     update_interval: 60s
    7.     entity_category: diagnostic
    複製代碼

    健康的數字


    • ESP32:剩 100KB 以上算健康,低於 40KB 開始危險
    • ESP8266:剩 20KB 以上算健康,低於 10KB 就會出事


    最吃記憶體的東西


    • web_server(尤其 local: true) —— 幾十 KB
    • 大量的 Raw 紅外線碼
    • 中文字體的 glyphs —— 每個字都要空間
    • 藍牙(BLE) —— 很吃
    • 大量的 text_sensor
    • arduino framework(比 esp-idf 吃很多)


    省記憶體的方法(依效果排序)

    一、改用 esp-idf framework
    1. esp32:
    2.   framework:
    3.     type: esp-idf
    複製代碼

    這個效果最大,通常能省幾十 KB。

    二、關掉 web_server

    除錯完就關掉,或者不要用 local: true。

    三、降低 logger 等級
    1. logger:
    2.   level: INFO         # 不要用 DEBUG 或 VERBOSE
    複製代碼

    四、減少字體 glyphs

    只列出真正會用到的字。

    五、關掉用不到的東西
    1. mdns:
    2.   disabled: true      # 用手動 IP 的話可以關
    3. # 不需要的話拿掉
    4. # captive_portal:
    5. # web_server:
    複製代碼

    六、藍牙和 Wi-Fi 一起用要小心

    ESP32 的藍牙和 Wi-Fi 共用同一個無線電
    而且藍牙很吃記憶體。

    建議:藍牙代理就專門做藍牙代理,不要在同一片板子上接一堆感測器。

    症狀四:OTA 更新失敗


    • 記憶體不足 —— OTA 需要空間存新韌體
    • Wi-Fi 訊號太弱 —— 傳到一半斷掉
    • 分割表(partition table)空間不夠


    分割表的問題

    如果你上次用序列埠燒錄是在很久以前
    (esp-idf 早於 2022.12.0、arduino 早於 2026.4.0),
    你的分割表可能是舊的,NVS 分割區太小

    解法:用 USB 線重新燒錄一次(不是 OTA),
    ESPHome 會更新分割表。

    症狀五:感測器讀不到值(一直是 unknown)


    • 接線錯 —— I2C 的話用 scan: true 確認
    • 位址不對 —— 同型號的模組可能有不同位址
    • 供電不對 —— 3.3V 和 5V 搞錯
    • TX / RX 接反(UART 裝置)
    • 鮑率不對(UART 裝置,例如 LD2410 是 256000)


    除錯的萬用流程


    • 接 USB 線看日誌 —— 90% 的問題這裡就有答案
    • 看開機訊息 —— 重開原因、記憶體、元件初始化
    • 把可疑的元件註解掉,逐一排除
    • 恢復到一個「最小可用」的設定,然後一個一個加回來


    最後一招最有效
    1. # 最小設定
    2. esphome:
    3.   name: test-device
    4. esp32:
    5.   board: esp32dev
    6.   framework: {type: esp-idf}
    7. logger:
    8. api:
    9.   encryption: {key: !secret api_key}
    10. ota:
    11.   - platform: esphome
    12.     password: !secret ota_password
    13. wifi:
    14.   ssid: !secret wifi_ssid
    15.   password: !secret wifi_password
    複製代碼

    這個燒進去能跑的話,代表硬體沒問題,是設定的問題。

    然後一個元件一個元件加回去,加到壞掉就知道是誰。

    一個實用的診斷組合

    每台裝置都加上這些(放在 common/base.yaml 裡):
    1. sensor:
    2.   - platform: wifi_signal
    3.     name: "Wi-Fi 訊號"
    4.     update_interval: 300s
    5.     entity_category: diagnostic
    6.   - platform: uptime
    7.     name: "運行時間"
    8.     update_interval: 300s
    9.     entity_category: diagnostic
    10.   - platform: template
    11.     name: "可用記憶體"
    12.     lambda: 'return ESP.getFreeHeap();'
    13.     unit_of_measurement: B
    14.     update_interval: 300s
    15.     entity_category: diagnostic
    16. binary_sensor:
    17.   - platform: status
    18.     name: "連線狀態"
    19.     entity_category: diagnostic
    20. text_sensor:
    21.   - platform: version
    22.     name: "ESPHome 版本"
    23.     entity_category: diagnostic
    複製代碼

    然後在 HA 做一個「ESPHome 裝置健康」的儀表板頁面


    • 哪台的訊號最弱
    • 哪台的記憶體在下降(記憶體洩漏的徵兆)
    • 哪台一直在重開(運行時間一直歸零)


    entity_category: diagnostic 讓這些實體被歸到「診斷」區
    不會出現在主要的裝置控制介面裡。

    ---

    ESPHome 系列到這裡。

    下一篇開始講 Zigbee 深入
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

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

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