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

    recorder 設定完全指南:exclude、purge、commit_interval

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    HA 用久了變慢,八成是資料庫的問題。
    這篇把 recorder 的設定一次講完,附一份可以直接抄的設定。



    先搞懂 recorder 在幹嘛

    每一次實體狀態變化,recorder 都會寫一筆進資料庫。
    一個溫度感測器每 10 秒回報一次,一天就是 8,640 筆。
    十個這種感測器,一年三千萬筆。

    資料庫大不是問題,問題是「大而無用」。
    你不會想看三個月前某一秒的溫度,但那筆資料還是會拖慢每一次查詢。

    第一步:先找出誰在狂寫

    不要憑感覺,先量。裝 SQLite Web 附加元件,執行:
    1. SELECT
    2.   sm.entity_id,
    3.   COUNT(*) AS 筆數
    4. FROM states s
    5. JOIN states_meta sm ON s.metadata_id = sm.metadata_id
    6. GROUP BY sm.entity_id
    7. ORDER BY 筆數 DESC
    8. LIMIT 25;
    複製代碼

    (HA 新版的資料表結構把 entity_id 搬到 states_meta 了,
    舊教學那種直接 GROUP BY states.entity_id 的寫法已經不適用。)

    跑出來通常會嚇一跳。我第一次查的時候,前三名是:


    • 某個電表的瞬時功率 —— 佔了 31%
    • 手機的電池電量 —— 佔 12%
    • 網路速度感測器 —— 佔 9%


    這三個加起來超過一半,而且我一個都沒在看。



    第二步:排除掉
    1. recorder:
    2.   # 保留 14 天。多數人不會看兩週前的曲線
    3.   purge_keep_days: 14
    4.   # 每 30 秒才真正寫入硬碟,降低 SD 卡/SSD 的寫入次數
    5.   commit_interval: 30
    6.   exclude:
    7.     domains:
    8.       - automation        # 自動化的開關狀態,沒什麼好記的
    9.       - updater
    10.       - camera
    11.       - media_player      # 播放進度每秒都在變
    12.     entity_globs:
    13.       - sensor.*_uptime
    14.       - sensor.*_linkquality      # Zigbee 訊號品質,一直在跳
    15.       - sensor.*_rssi
    16.       - sensor.*_battery_voltage
    17.       - sensor.clock_*
    18.     entities:
    19.       - sensor.date
    20.       - sensor.time
    21.       - sensor.手機_電池電量
    22.       - sensor.網路下載速度
    23.   include:
    24.     # 有 include 的話,只有這裡面的會被記錄(exclude 就沒意義了)
    25.     # 一般家庭建議「只用 exclude」,不要寫 include
    複製代碼

    exclude 和 include 不要同時用
    寫了 include 就變成白名單模式,你會不小心漏掉想記的東西。

    三個選項的意思


    • domains — 整個網域排除,最粗暴也最有效
    • entity_globs — 用萬用字元比對,適合「所有裝置的某個屬性」
    • entities — 指名道姓,最精確


    entity_globs 是我最愛用的
    Zigbee 裝置每個都有 linkquality,一次寫 sensor.*_linkquality 全部搞定。

    第三步:commit_interval 的取捨

    預設是 1 秒。改成 30 的話:


    • 好處:寫入次數少 30 倍,SD 卡/SSD 壽命明顯拉長,系統也順
    • 壞處:突然斷電會遺失最多 30 秒的資料


    對家用來說這個交換很划算。我用 30,跑了很久沒遇過問題。

    如果你很在意歷史資料完整性,用 5 或 10。不要留 1。

    第四步:確認 purge 有在動

    purge 每天凌晨 4:12 自動執行,會刪掉超過 purge_keep_days 的資料。

    刪掉不等於檔案變小 —— SQLite 刪資料只是標記成可重用。
    要讓檔案真的縮小需要 repack,這個預設是開的(每週一次)。

    想立刻做一次:開發者工具 → 動作,找 recorder.purge
    1. action: recorder.purge
    2. data:
    3.   keep_days: 14
    4.   repack: true
    複製代碼

    repack 會鎖住資料庫幾分鐘,期間 HA 介面會卡。晚上做比較好。

    第五步:長期數據另外存

    排除掉的東西不是不重要,是不該用 recorder 存

    真正要看長期趨勢的(用電量、溫度日均),做法有兩種:


    • 用 HA 內建的長期統計 —— 有 state_class 的感測器會自動每小時存一筆摘要,
        這個不受 purge_keep_days 影響,能存很多年
    • 丟到 InfluxDB —— 要另外架,但可以配 Grafana 做很漂亮的圖


    很多人不知道第一點:能源儀表板的資料本來就不會被 purge 掉
    所以你大膽設 purge_keep_days: 7 也不會失去用電歷史。



    實際效果

    我自己做完這幾件事:


    • 資料庫從 2.1 GB 降到 240 MB
    • 歷史頁面載入從 8 秒變成 1 秒以內
    • HA 重啟時間從 90 秒降到 40 秒


    最有感的是排除那三個狂寫的感測器,其他都是加分。

    改完怎麼驗證
    1. 設定 → 系統 → 儲存空間
    複製代碼

    看資料庫大小。改完不會立刻變小(要等 purge + repack),
    但可以先看寫入筆數有沒有降 —— 隔天再查一次那段 SQL 就知道了。

    ---

    順帶提醒:改 recorder 設定要重啟 HA
    不像範本可以熱重載。所以一次改完再重啟。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

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

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