第 18 章

歷史數據、Recorder 與資料導出

你家的每一次開燈、每一度電、每一次門被打開,Home Assistant 其實都默默記下來了。這章帶你看懂那些資料存在哪、能留多久、怎麼把它變成一個 CSV 檔丟進試算表,還有怎麼在資料庫把你的記憶卡寫爆之前先動手瘦身。

為什麼要學這個

前面幾章你已經把裝置接上、把自動化跑起來了。接下來會發生兩件事,而且幾乎一定會發生:

第一件:某天你想知道「上禮拜三晚上到底是誰把陽台的燈開了一整晚」,或是「這個月冷氣到底吃了多少電」。你點進去看,發現三天前的資料還在,三個月前的卻不見了 —— 但奇怪的是,用電量卻看得到去年的。這不是壞掉,是設計,這章會講清楚為什麼。

第二件:某天你的 Home Assistant 突然變得超慢,點一個燈要等三秒,重開機要跑十分鐘。八成是資料庫肥到不行了。如果你跑在 Raspberry Pi 的記憶卡上,再放著不管,下一步就是記憶卡直接掛掉,整台重灌。

觀念:Home Assistant 不是只有「現在」,它還有「過去」。管好那個「過去」,是從玩具進化成穩定系統的分水嶺。

讀完這一章,你會有這些能力:

  • 分得清「歷史(History)」跟「活動(Activity,舊稱 Logbook)」該去哪一個找答案。
  • 知道記錄器(Recorder)把資料放在哪個檔案、預設留幾天、大概會長到多大。
  • 會用 include / exclude 把吵死人的實體踢出資料庫。
  • 能從畫面上按幾下就下載 CSV,丟進 Excel 或 Google 試算表畫圖。
  • 知道資料庫肥了怎麼清、壞了怎麼救、要長期保存該搬去哪。

備份的通則已經在 第 9 章 講過,這裡只補「備份跟資料庫的糾纏」那一段。實體命名與 entity_id 的規矩請看 第 4 章,這章的排除設定會大量用到。

歷史與活動:兩個側欄項目,兩種問題

側欄上會看到兩個長得有點像的東西:歷史(History)活動(Activity)。很多人以為是同一個,其實回答的是完全不同的問題。

注意:「活動(Activity)」在 Home Assistant 2025.10 之前叫做「日誌(Logbook)」。官方在那一版把介面上的字改成 Activity,但底層的整合名稱、YAML 設定區塊還是 logbook。你如果在網路上看到舊教學寫「Logbook」,講的就是它。
你想問的問題去哪裡看為什麼
「客廳溫度這三天的曲線長怎樣?」歷史歷史會把數值畫成折線圖,適合看趨勢
「玄關的燈昨天總共開了幾小時?」歷史開關類實體在歷史裡是色塊時間軸,一眼看得出佔多久
「剛剛到底是誰把冷氣關掉的?」活動活動會寫出「被誰/被哪個自動化觸發」
「半夜三點發生了什麼事?」活動活動是一條倒序的事件流水帳,由新到舊往下捲
「這個自動化真的有跑嗎?」活動自動化被觸發會在活動留下一筆

用生活化的講法:歷史是體檢報告的曲線圖,活動是護理站的交班紀錄。前者告訴你「數字怎麼變的」,後者告訴你「誰做了什麼」。

還有一個實務上很重要的差別:活動預設會自動略過帶單位的感測器。溫度、濕度、功率這種每隔幾秒就跳一次數字的東西,如果全丟進活動,畫面會被洗版到完全沒法看,所以官方直接把「有單位的 sensor」排除在活動之外。想看它們就去歷史。

提示:這兩個頁面共用同一份資料來源(記錄器)。所以你在記錄器把某個實體排除掉,它在歷史和活動都會一起消失,不是只消失一邊。

記錄器(Recorder):所有歷史的源頭

歷史和活動自己不存資料,它們只是「顯示器」。真正在背後把每一次狀態變化寫進硬碟的,是叫做 記錄器(Recorder) 的整合。

你沒有裝過它,因為它一開始就開著了。官方文件寫得很清楚:歷史整合要靠記錄器來存資料、而且兩邊共用同一個資料庫設定;而只要你的 configuration.yaml 裡有那行 default_config:(全新安裝預設就有),這些東西就自動啟用。所以「我從來沒設定過,為什麼會有歷史?」的答案就是這一行。

資料存在哪個檔案

預設情況下,Home Assistant 用的是 SQLite,資料庫就是設定資料夾裡的一個檔案:

/config/home-assistant_v2.db

就這麼一個檔案,你全部的歷史都在裡面。它跟著 configuration.yaml 躺在同一個資料夾,也因此會被完整備份一起包走(後面會講這件事的麻煩)。

預設留幾天

記錄器有一個叫 purge_keep_days 的設定,預設值是 10 天。也就是說,超過 10 天的「逐筆狀態變化」會被自動刪掉。

配合它的還有兩個預設開著的開關:

選項預設值它在做什麼
purge_keep_days10逐筆歷史保留幾天
auto_purgetrue每天凌晨自動清掉過期資料,官方文件寫的執行時間是當地時間 04:12
auto_repacktrue每隔一週的星期日,清理完之後重整資料庫、把空間真的還給硬碟
commit_interval5每隔幾秒把累積的變化寫進資料庫一次
觀念:commit_interval 是個很有意思的設計。如果每有一筆變化就寫一次硬碟,記憶卡很快就陣亡;所以 Home Assistant 先在記憶體攢 5 秒,再一次寫下去。把它調大(例如 30)可以明顯減少寫入次數,代價是萬一斷電,最多會掉那段時間的資料。

資料庫會長多大

沒有標準答案,因為它完全取決於你有多少實體、以及那些實體多吵。但可以給你一個抓感覺的方式:

情境大概的規模合理的預期
剛入住,幾顆燈加一個溫濕度計20~50 個實體幾十 MB 等級,完全不用擔心
一般家庭,加了門窗、人體、幾台家電100~300 個實體數百 MB 是常態
裝了智慧電表/太陽能/逐秒功率監測含高頻率數值感測器可能衝到數 GB,而且成長很快

關鍵不是「幾個實體」,而是「每個實體每天寫幾筆」。一顆燈一天可能只變化 6 次;一個逐秒回報的功率插座,一天可以寫進去好幾萬筆。單一個這種插座就足以讓資料庫比其他所有東西加起來還大。

想看自己現在多大,官方文件給了兩條路:

你想看的怎麼走看到什麼
整台機器的磁碟還剩多少設定 → 系統 → 儲存空間把滑鼠移到那條狀態條上,會顯示剩餘空間的細節
資料庫本身多大設定 → 系統 → 修復(Repairs)→ 右上角三個點 → 系統資訊往下捲找到 Recorder(記錄器)那一區,裡面有「估算的資料庫大小(Estimated database size)」,單位是 MiB

後面的「SQL 整合」那節還會教你把這個數字做成一個感測器,直接釘在儀表板上盯著它,不用每次都翻進系統資訊。

注意:不同版本這幾個頁面的位置和欄位名稱會微調,請以你自己畫面上看到的為準。找不到就直接在設定頁上方的搜尋框打「儲存」或「system」。

長期統計:為什麼去年的電費看得到,去年的開關看不到

這是整章最容易讓人困惑、也最值得搞懂的一段。

剛剛說預設只留 10 天。但你打開能源儀表板,去年的用電量明明還在。這不是 bug,是因為 Home Assistant 同時在存兩種完全不同的東西

短期歷史(狀態)長期統計(Statistics)
存什麼每一次狀態變化,一筆不漏每小時彙整成一筆
解析度原汁原味,幾點幾分幾秒都在每小時的最小/最大/平均,或該小時的累積量
保留多久預設 10 天,之後刪掉不會被清除
誰會有所有沒被排除的實體只有具備狀態類別(state class)的實體
一天幾筆看它多吵,可能上萬筆固定 24 筆

官方的資料文件把它講得很直白:狀態表是「把發生的事原樣記下來」,統計則是把資料壓成固定間隔的摘要,所以一天只產生 24 筆,用一點點空間就能存好幾年。

哪些實體會有長期統計

只有帶「狀態類別(state_class)」的實體才會進統計表。三種狀態類別分別代表什麼、怎麼設,第 17 章 已經整理成一張表講得很細了,這裡只講跟「留多久」有關的那一面:

狀態類別統計裡幫你存什麼家裡的例子
measurement每小時的最小、最大、平均客廳溫度、房間濕度、冷氣當下功率
total / total_increasing那段期間增加了多少電表的累計度數、水表的累計噸數
沒有狀態類別什麼都不存,只有近 10 天的逐筆紀錄燈的開/關、門窗的開/關、人在不在家

所以答案就出來了:電表有 total_increasing,所以去年的用電活著;一顆燈的「開/關」不是數值、沒有狀態類別,所以它只活 10 天。

觀念:系統其實還會每 5 分鐘先照一張「短期統計」的快照,再彙整成每小時的長期統計。短期那份跟一般狀態一樣會被定期清掉,長久留下的是每小時那份。

這也解釋了另一個常被誤會的現象:在歷史頁面把時間往回拉很遠的時候,曲線會突然變得又平又鈍,該有的尖峰都不見了。官方文件說明得很明確 —— 最近 10 天內是從記錄器讀完整解析度的原始資料,超過 10 天的部分改從長期統計來,而長期統計是每小時取樣平均一次。所以你看到的數字跟當年那一瞬間的實際讀數不會完全一樣,這是正常的。官方甚至在圖上做了區分:解析度高的那段線條顏色會比較深。

提示:如果某個數值你「將來一定會想看好幾年」,例如自製的水錶或瓦斯錶,那重點不是把 purge_keep_days 拉長,而是確認那個實體有正確的狀態類別和單位。有了統計,10 天以外的資料自動會留下來。

動手做:把歷史下載成 CSV

Home Assistant 內建就能把歷史匯出成 CSV,不用裝任何東西。步驟如下。

  1. 打開側欄的「歷史(History)」

    如果側欄上看不到,點側欄最下面自己的名字進個人資料頁,確認它有沒有被藏起來;或者最快的辦法 —— 直接在網址列後面接 /historyEnter

  2. 選出你要的區域、裝置或實體

    頁面上方有選擇器,可以按區域(Area)、按裝置(Device),也可以直接指名實體。一次選一整個區域很方便 —— 例如把「客廳」整包選起來,就會拉出客廳所有東西的曲線。前提是你在 第 3 章 有好好分區域。

  3. 設定時間範圍

    用時間區間選擇器挑「今天」「本週」或自訂起訖日。這一步決定 CSV 裡有多少列,範圍拉太大會等很久,建議先用一天試水溫。

  4. 按右上角的「下載資料(Download data)」

    按鈕就在頁面右上角,英文介面寫 Download data,中文介面是「下載資料」之類的字樣。按下去瀏覽器就直接存一個 CSV 檔到你的下載資料夾,不會跳出什麼設定視窗。

    歷史頁的下載入口
    圖 18-1側欄的「歷史(History)」頁:先在左側「Add target」加入區域/裝置/實體,右上角就會出現「下載資料」鍵。
  5. 丟進試算表

    用 Excel、Numbers 或 Google 試算表打開。如果中文變成亂碼,用「匯入」而不是直接雙擊開啟,並在編碼選 UTF-8。

注意:下載的內容跟你在畫面上看到的是同一份,所以同樣受「10 天以外只有每小時統計」的限制。你不可能靠這個按鈕拿到三個月前的逐秒資料 —— 那些資料早就被清掉了,不存在了。
提示:要做作業或報告的話,這招很好用:選一個溫度感測器、範圍抓一週、下載 CSV,貼進試算表就能畫出「一週室溫變化圖」。要抓長期趨勢就選有統計的數值型感測器,時間拉一年,得到的是每小時平均值,畫出來反而更好看。

活動頁也能下載了

以前想匯出「誰在幾點做了什麼」這種事件流水帳,只能自己抄。Home Assistant 2026.8 之後,活動(Activity)頁面也多了 CSV 下載,以及一個「清空並重置」的動作。所以現在兩邊各有各的匯出:

你要的資料從哪裡下載拿到的東西
數值的變化曲線(溫度、用電、濕度)歷史頁右上角「下載資料」時間 + 數值,適合畫圖
事件流水帳(誰開的、哪個自動化跑的)活動頁的 CSV 下載一條一條的事件紀錄,適合追查
注意:官方釋出說明只提到活動頁多了「清空並重置」這個動作,沒有細講它到底清掉什麼,按之前務必看清楚畫面上的確認提示。想清資料庫請優先用本章後面講的 recorder.purge,那條路你會很清楚自己刪掉了哪些東西。
活動頁的事件流水帳
圖 18-2側欄的「活動(Logbook)」頁:文字化的事件流水,包含誰、什麼時候、觸發了什麼。

工具 → 統計:修正那些歪掉的數字

從側欄進 設定 → 工具(Tools),裡面有好幾個分頁:YAML、狀態(States)、動作(Actions)、範本(Template)、事件(Events)、統計(Statistics)、Assist。

注意:這個頁面改過兩次名字跟位置。它本來叫「開發者工具(Developer tools)」,而且直接掛在側欄上;Home Assistant 2026.2 把它搬進設定底下,2026.8 又把名字縮短成工具(Tools)。所以網路上舊教學叫你「點側欄的開發者工具」時,現在要走 設定 → 工具。內容完全一樣,只是搬家加改名。
工具下的統計分頁
圖 18-3設定 → 工具 → 統計:有問題的長期統計實體會直接列出來,每一列右邊都有「Fix issue」連結。

統計這一頁只做兩件事,但兩件都很關鍵。

一、它會列出有問題的統計實體

頁面會把所有「有長期統計」的實體列出來,並且對出問題的那幾個標上「修復問題(Fix issue)」的連結,點下去會告訴你偵測到什麼毛病。最常見的兩種是:

症狀白話解釋通常怎麼處理
單位改變了這個感測器本來報 W,後來變成 kW,統計表對不起來依畫面提示決定要沿用舊單位還是清掉舊統計重來
狀態類別不再支援統計整合更新後,這個實體不再產生統計了依提示把殘留的統計資料刪掉,避免它永遠掛在那
實體已經不存在裝置拆了、改名了,但統計還留著確認真的不要了再清除

二、它可以直接改某一小時的數值

這是救場神器。最典型的災難情境:智慧電表在某一刻回報了一個離譜的數字(例如瞬間跳到 999999 度),結果第 17 章那個能源儀表板整個月的長條圖,被那一根爆表的柱子壓成一條貼著地面的線,什麼都看不到。

官方文件描述的操作是:在統計頁點該實體旁邊的圖示,用日期與時間欄位找到那個資料點,然後把值改掉。

  1. 先在能源或歷史圖上找出出問題的時間點

    把滑鼠移到那根不合理的柱子上,記下日期跟小時。

  2. 進 設定 → 工具 → 統計,找到那個實體

    用上面的搜尋框打實體名字比較快。

  3. 打開調整介面,用日期時間定位到那一筆

    它會顯示那個小時記錄到的數值。

  4. 改成合理的值,存檔後回去看圖

    圖表通常需要重新整理頁面才會反映。

危險:這裡改的是已經寫進資料庫的歷史紀錄,改了就回不去,也不會有「復原」按鈕。動手之前先做一次備份(第 9 章)。另外,累計型的感測器改一筆有可能影響後面的計算結果,改完務必回去確認整條曲線是不是合理。

用 include / exclude 精簡資料

資料庫變大的元凶,通常不是你天天在用的那幾顆燈,而是一堆你根本不會回頭看的雜訊。要瘦身,第一件事就是叫記錄器別再記它們。

這組設定要寫在 configuration.yaml,改完需要重新啟動 Home Assistant 才會生效。

做法 A:黑名單(exclude)—— 推薦新手用

預設全記,只把吵的踢掉。心理負擔小,不會不小心漏掉重要東西。

recorder:
  purge_keep_days: 10
  exclude:
    domains:
      - automation
      - update
    entity_globs:
      - sensor.sun*
      - weather.*
    entities:
      - sensor.date
      - sensor.last_boot
    event_types:
      - my_custom_event

做法 B:白名單(include)—— 資料庫已經失控時用

反過來:預設什麼都不記,只記你點名的。效果最猛,但很容易把重要東西一起關掉,之後才發現「咦我要的歷史怎麼沒了」。

recorder:
  include:
    domains:
      - sensor
      - switch
      - media_player
  exclude:
    entities:
      - sensor.last_boot
      - sensor.date
    entity_globs:
      - sensor.weather_*

兩種可以混用:先用 include 圈出大範圍,再用 exclude 把裡面幾顆討厭鬼挑掉。官方文件列了完整的優先順序規則,大原則是越精確的設定越優先 —— 明確寫在 entities 的贏過萬用字元,萬用字元贏過整個 domain。

四種過濾條件

條件作用範圍寫法範例
domains整個類別- automation
entities指名單一實體- sensor.last_boot
entity_globs萬用字元批次比對- sensor.phone_*
event_types事件(不是實體)- call_service

哪些是常見的吵鬼

類型為什麼吵要不要排除
手機 App 回傳的電量、方位、步數幾乎不停在變,而且你不會回去看強烈建議排除
逐秒回報的功率插座單一實體就能佔掉大半資料庫看需求,可改用只留幾天
update 類(韌體更新提示)沒什麼歷史價值建議排除
太陽方位角、天氣預報的細項連續變化,用不到歷史建議排除
自動化實體本身的狀態你要的是「有沒有跑」,那在活動裡可以排除
門窗、人體感測、燈、鎖變化次數少,但事後超需要千萬不要排除
注意:排除設定只影響「從現在開始」要不要寫進去,不會回頭刪掉已經存在資料庫裡的舊資料。要清掉舊的,得用下一節的 recorder.purge,而且要把 apply_filter 打開。
危險:把某個實體排除掉,代表它在歷史、活動、能源儀表板全都會斷掉,連長期統計都不會產生。能源相關的電表絕對不要排除,排掉之後那段期間的用電就永遠補不回來了。

清理(Purge):把已經存進去的垃圾倒掉

設好過濾只能止血,已經肥起來的資料庫還是得手動清。記錄器提供這幾個動作(Action,舊稱服務/Service):

動作做什麼
recorder.purge清掉超過指定天數的舊資料
recorder.purge_entities只針對指定的實體/類別/萬用字元清
recorder.disable暫停記錄
recorder.enable恢復記錄
recorder.get_statistics讀出長期統計資料

recorder.purge 的三個參數

參數預設意思
keep_days沿用設定檔的值從今天往回算,要留幾天
repackfalse整個資料庫重寫一次,把空間真的還給硬碟
apply_filterfalse連同設定檔裡的 include / exclude 一起套用到舊資料

最常用的「大掃除」組合:剛剛在上一節加好排除規則、重開機之後,跑一次這個把過去的殘骸也一起清掉。

action: recorder.purge
data:
  keep_days: 7
  repack: true
  apply_filter: true

執行方式:設定 → 工具(Tools)→ 動作,找到 recorder.purge,切到 YAML 模式貼上,按執行。(這個頁面舊版叫「開發者工具」,而且掛在側欄上,2026.2 之後搬進設定裡。)

注意:官方明講 repack 是很吃資源的操作,執行期間系統可能會明顯變慢,而且過程中會暫時佔用更多磁碟空間。文件建議隨時保留至少跟資料庫一樣大的可用空間。硬碟快滿的時候硬跑 repack,有機率把事情搞得更糟 —— 先刪舊備份騰出空間再說。

只清某一個吵死人的實體

如果只有一個功率插座在爆量,不需要把全部歷史陪葬。recorder.purge_entities 可以指定 entity_iddomainsentity_globs,其中 keep_days 預設是 0,也就是「符合的資料全部立刻刪掉」。

官方文件裡有一個很實用的自動化範例:每天凌晨只保留這顆插座最近 5 天的資料。

alias: 每天清掉吵鬧功率感測器的舊資料
triggers:
  - trigger: time
    at: "04:15:00"
actions:
  - action: recorder.purge_entities
    data:
      keep_days: 5
      entity_id: sensor.power_sensor_0
mode: single

這個寫法的好處是:你既保留了看最近幾天曲線的能力,又不讓它無限累積。而且因為長期統計不受影響,這顆感測器如果有狀態類別,年度趨勢照樣看得到。

提示:執行動作需要管理員權限。如果你是用 第 5 章 建立的一般使用者登入,會找不到這些動作,切回管理員帳號就好。

另外,預設的自動清理(auto_purge)每天凌晨 04:12 就會跑,所以正常情況下你根本不需要手動 purge。手動只有在兩種時候用:剛改完過濾規則要套用到舊資料,或是資料庫已經失控要緊急瘦身。

備份含不含資料庫?資料庫壞掉怎麼救?

備份會把資料庫一起包走

因為 home-assistant_v2.db 就躺在設定資料夾裡,完整備份自然會把它一起收進去。這帶來一個很現實的副作用:資料庫多大,每一份備份就跟著多大。資料庫 2 GB,你存三份備份就是 6 GB 憑空消失。

官方那篇「清出空間(Clear up storage)」的建議其實很單純,就三件事:把資料庫清一清(purge)、用記錄器的過濾少記一點、以及把 purge_keep_days 調小。備份那邊則是叫你設好保留幾份的規則,別讓備份檔在機器上一直堆,並且盡量把備份存到 Home Assistant 以外的地方。

注意:內建備份介面能讓你勾選要不要納入媒體、共享資料夾這類項目,但「單獨把資料庫排除在備份之外」這個選項不同版本的狀況不一樣,請以你自己畫面上實際出現的勾選項為準。與其在備份設定裡繞,不如先把資料庫本身瘦下來 —— 那是不管哪個版本都有效的做法。

順序上建議這樣做:先設好 exclude → 重開機 → 跑一次 recorder.purge 帶 repack → 再建立備份。這樣備份檔會小非常多。

換資料庫等於放棄舊歷史

危險:官方文件白紙黑字寫著:更換記錄器使用的資料庫,可能導致既有歷史全部消失,而且官方不支援資料遷移。所以從 SQLite 換到 MariaDB 這件事,等於「歷史從今天開始重新算」。要換就趁早換,不要等累積兩年才換。

資料庫壞掉的症狀與處理

SQLite 損毀最常見的原因是「寫到一半斷電」或「記憶卡老化」。你會看到的症狀通常是:Home Assistant 開得起來,但歷史一片空白、活動也是空的,日誌裡出現一堆資料庫相關的錯誤。

  1. 先確認是不是真的壞了

    設定 → 系統 → 日誌 看有沒有 sqlitedatabase 相關的錯誤訊息。

  2. 知道 Home Assistant 會自己自救

    官方文件說明:當 SQLite 遇到無法修復的損毀時,系統會自動把壞掉的資料庫移到旁邊,然後開一個全新的。你的設定、自動化、裝置都不會不見,不見的只有歷史。

  3. 確認磁碟空間夠

    官方特別提到,處理損毀的 SQLite 資料庫時,準備約 2.5 倍資料庫大小的可用空間是必要的。空間不夠的話連自救都做不到。

  4. 接受歷史損失,然後找根因

    與其花幾小時搶救那個 .db 檔(官方也只是指向 SQLite 官方的復原說明),不如把那個舊檔案刪掉騰出空間,去處理真正的問題:記憶卡是不是該換了?是不是常常直接拔電?

提示:資料庫壞掉幾乎不會讓你的家「不能用」,燈還是會亮、自動化還是會跑。它只是把記憶清空。所以真的不用太慌張。

進階一:從 SQLite 換成 MariaDB

SQLite 是單一檔案的資料庫,簡單、零設定,但在實體數量多、寫入頻繁的時候會顯得吃力。這時候可以換成正規的資料庫伺服器。

官方文件列出支援的版本下限:

資料庫最低版本適合誰
SQLite3.40.1預設,絕大多數人不用動
MariaDB10.3裝在同一台上最常見的升級路線
MySQL8.0你家已經有 MySQL 伺服器的話
PostgreSQL12偏好 PostgreSQL 的人

如果你跑的是 Home Assistant OS,最省事的路線是裝官方倉庫裡的 MariaDB App。路徑是 設定 → Apps —— 沒錯,Home Assistant 2026.2 把介面上的「附加元件(Add-ons)」全面改名成「Apps」,官方的說法是「大家都知道 app 是什麼,打開手機商店挑一個裝起來就對了」。舊教學裡的「Add-on 商店」講的就是它。(順帶一提,Apps 只有 Home Assistant OS 的安裝方式才有。)裝好之後在 configuration.yaml 加上:

recorder:
  db_url: mysql://homeassistant:你的密碼@core-mariadb/homeassistant?charset=utf8mb4
  purge_keep_days: 14

其中 core-mariadb 是那個 App 在內部網路上的主機名稱,帳號密碼和資料庫名稱要跟你在 App 設定裡填的一致。連到別台機器的話,官方文件給的通用格式是:

mysql://user:password@SERVER_IP/DB_NAME?charset=utf8mb4
postgresql://user:password@SERVER_IP/DB_NAME
注意:資料庫的密碼會明文寫在 configuration.yaml 裡,而這個檔案會被完整備份包走。習慣好一點的作法是在同一個資料夾建一個 secrets.yaml,裡面寫 mariadb_url: mysql://homeassistant:真正的密碼@core-mariadb/homeassistant?charset=utf8mb4,設定檔裡就只寫 db_url: !secret mariadb_url。這樣把設定檔貼到論壇求救時,才不會連密碼一起貼出去。
觀念:換到 MariaDB 主要解決的是「寫入效能」和「大資料量下的查詢速度」,不會自動幫你留更久的歷史 —— purge_keep_days 該設幾天還是幾天。如果你的目的是「想留三年的資料」,換 MariaDB 不是答案,下一節的 InfluxDB 才是。

進階二:InfluxDB + Grafana 長期存放與繪圖

這是「玩真的」路線。概念很簡單:

角色負責什麼比喻
Home Assistant控制家裡、產生資料指揮中心
InfluxDB專門存時間序列資料,存好幾年也不喘倉庫
Grafana把倉庫裡的資料畫成漂亮儀表板展示廳

Home Assistant 官方有 InfluxDB 整合,會把狀態變化額外再寫一份到 InfluxDB。注意是「額外」—— 本地的 recorder 照樣跑,兩邊是獨立的。所以你可以在 recorder 那邊只留 7 天保持輕巧,同時在 InfluxDB 留 3 年。

設定上的重點:

  • InfluxDB 1.x 用的是網址、帳號密碼、資料庫名稱那一組,而且驗證是選配的(預設不開)。
  • InfluxDB 2.x 與 3.x 改用組織(organization)、儲存桶(bucket)與存取權杖(token),驗證是必填的,設定裡還要多寫一個 api_version: 2 告訴整合「我是新版」。官方整合文件目前 1.x/2.x/3.x 三種都有寫。
  • 不管哪一版,都一定要設過濾。它同樣支援 domainsentitiesentity_globs 的 include / exclude 寫法。把家裡所有東西無差別往 InfluxDB 灌,只是把肥大問題換個地方發生。
注意:InfluxDB 各大版本之間的設定參數差異相當大,連查詢語言都換過。網路教學八成是舊版寫的,貼上去不會動很正常。動手前務必先確認你裝的是哪一版,再對照官方整合文件上對應那一版的參數表照抄。

安裝方面,InfluxDB 與 Grafana 都有社群維護的 App(hassio-addons 那個「Home Assistant Community Apps」倉庫,舊名 Community Add-ons),不是官方出品的,安裝前要先把那個社群倉庫加進 App 商店。怎麼加第三方倉庫 第 20 章附錄 A 已經講過,這裡不重複。另外提醒一句:App(原本叫 Add-on)只有 Home Assistant OS 的安裝方式才有,用 Docker 或 Core 裝的人要自己另外架 InfluxDB 和 Grafana。

提示:這條路線的門檻不低,牽涉到三套軟體各自的設定。如果你只是想看去年的用電,內建的長期統計加能源儀表板就夠了。真的需要 InfluxDB 的情境通常是:想做很客製的圖表、想跟非 Home Assistant 的資料源混在一起看、或是想保留高解析度的原始資料好幾年。

進階三:用 SQL 整合把查詢變成感測器

SQL 整合可以讓你寫一句 SQL 查詢,把結果變成一個實體,然後就能放上儀表板、拿來觸發自動化。官方文件說明它可以透過設定流程(UI)加入,也可以寫 YAML。

最經典的用途只有一個:把資料庫大小做成感測器,直接顯示在儀表板上盯著它。

  1. 設定 → 裝置與服務 → 新增整合

    右下角的按鈕,搜尋「SQL」。

  2. 資料庫網址留空

    官方文件說 db_url 是選填的,留空就會用記錄器現在用的那個資料庫。你不用知道路徑。

  3. 貼上查詢語句

    SQLite 版本官方給的範例是這一句:

    SELECT ROUND(page_count * page_size / 1024 / 1024, 1) as size
    FROM pragma_page_count(), pragma_page_size();
  4. 欄位填 size

    對應查詢裡 as size 那個名字。查詢必須只回傳一列結果。

  5. 設好名稱與單位

    名稱可以取「資料庫大小」,結果的單位是 MiB。官方提到可以把裝置類別設成資料量(Data size),讓介面自動幫你換算單位。

做好之後,把它丟到儀表板上(第 6 章),甚至可以搭一個自動化:超過某個門檻就推播通知給你(第 7 章)。

alias: 資料庫太肥就通知我
triggers:
  - trigger: numeric_state
    entity_id: sensor.database_size
    above: 2000
    for: "01:00:00"
conditions: []
actions:
  - action: notify.persistent_notification
    data:
      title: 資料庫警告
      message: 資料庫已經超過 2000 MiB(大約 2 GB),該去看看是誰在灌水了。
mode: single

上面用的 notify.persistent_notification 只會在 Home Assistant 介面裡跳一則常駐通知,不用先設定任何東西,最適合拿來測試。想改成推到手機上,把那一行換成 第 7 章 建立的通知動作就好。for: "01:00:00" 的意思是「連續超過一小時才通知」,避免它在門檻附近抖來抖去一直吵你。

注意:上面那句查詢是給 SQLite 用的。如果你已經換成 MariaDB 或 PostgreSQL,語法完全不同,要去對應資料庫的文件找相等的查詢,不要照抄。
危險:SQL 整合是直接對資料庫下指令。只跑 SELECT 查詢就好,永遠不要在這裡寫 DELETEUPDATEDROP。要刪資料請乖乖用 recorder.purge,那才是有安全檢查的正規路徑。

常見卡關

  1. Home Assistant 整個變超慢,點什麼都要等

    先懷疑資料庫。到設定 → 系統 → 儲存空間看看磁碟剩多少,再去修復頁看資料庫估算大小。如果是幾 GB 等級,照這個順序處理:先找出吵鬼(通常是手機 App 的感測器、逐秒回報的功率插座),加進 exclude,重新啟動,然後跑一次 recorder.purgerepack: trueapply_filter: true。跑 repack 之前記得確認磁碟空間夠。

  2. 記憶卡壞了、系統開不起來

    Home Assistant 每 commit_interval 秒就寫一次硬碟,資料庫又是持續在長的檔案,這對消費級的 microSD 卡是相當重的負擔。這件事沒有官方的規格數字可以引用,但在社群裡是公認最常見的死法之一。務實的做法有三個,效果由弱到強:把 commit_interval 調大、把吵鬧實體排除掉、以及最根本的 —— 改用 SSD 或工業級儲存裝置開機。真的要長期穩定跑,換掉記憶卡是唯一根治的辦法。

  3. 重開機之後歷史全部不見了

    兩個可能。一是資料庫損毀,Home Assistant 自動把壞的移開、開了一個新的空白資料庫,這時候日誌裡會有明顯的錯誤訊息可以佐證。二是你剛剛從 SQLite 換到了 MariaDB —— 官方不支援資料遷移,換了就是重新開始,這是預期行為不是故障。先去看日誌就能分辨是哪一種。

  4. 某個實體在歷史裡完全查不到

    依序檢查:(1) 它是不是被 exclude 掉了,或是被 include 白名單漏掉了;(2) 它是不是在 第 11 章 講的地方被停用了;(3) 如果只是在「活動」看不到但歷史看得到,那是正常的 —— 帶單位的感測器本來就會被活動自動略過。

  5. 清理跑完了,硬碟空間卻沒有變多

    這是正常的。官方文件講得很明白:purge 不會立刻把空間還給作業系統,要 repack 才會真的重寫檔案釋放空間。而預設的 auto_repack 是每隔一週的星期日才跑一次,所以等個幾天空間也會自己回來。急的話就手動跑一次帶 repack: true 的清理。

  6. 能源圖表被一根爆表的柱子壓扁

    去 設定 → 工具 → 統計,找到那個實體,用日期時間定位到那一筆離譜的數值改掉。改之前先備份。詳細步驟看本章「工具 → 統計」那一節。

  7. 下載的 CSV 打開是亂碼

    不要用雙擊直接開。在 Excel 用「資料 → 從文字/CSV」匯入,編碼選 UTF-8;Google 試算表則是「檔案 → 匯入」,通常會自動判斷正確。

  8. 找不到 recorder 的動作,或是按了沒反應

    先確認你走對路:現在是 設定 → 工具 → 動作,不是側欄上的「開發者工具」(2026.2 之後那個位置已經沒有了)。再來,記錄器的動作需要管理員權限才能執行,用一般使用者帳號登入時整個設定區都進不去。切換回管理員帳號再試。

常見問題

把 purge_keep_days 改成 365,是不是就能永久保存所有歷史?
技術上可以,實務上非常不建議。逐筆狀態資料的成長是線性的,留 365 天等於資料庫變成 36 倍大,查詢會越來越慢,備份會大到難以管理,記憶卡的壽命也會被加速消耗。

正確的思路是分開處理:數值型資料靠長期統計(有狀態類別的實體會自動留下每小時彙整,而且不會被清除),需要高解析度長期資料的才另外送去 InfluxDBpurge_keep_days 只是決定「我想看多細的近期資料」,多數人設 7 到 14 天就很夠了。
為什麼我三個月前的溫度曲線看起來很平滑,跟當時看到的不太一樣?
因為那不是原始資料了。官方文件寫得很清楚:最近 10 天內是從記錄器讀完整解析度,超過的部分改從長期統計讀,而長期統計是每小時取樣平均一次。所以尖峰和瞬間的抖動都被平均掉了,曲線自然變平滑。

這不是誤差,是刻意的取捨 —— 用平滑換來「用極小的空間存好幾年」。如果你真的需要三個月前的逐分鐘資料,那只能靠 InfluxDB 這種外部長期儲存,內建機制做不到。
我把一個實體加進 exclude 了,為什麼舊資料還在?
因為過濾規則只管「從現在開始要不要寫」,不會回頭刪東西。要清掉已經存在的舊資料有兩個做法:

一是執行 recorder.purge 並把 apply_filter 設成 true,它會把設定檔裡的過濾規則套用到舊資料上。二是用 recorder.purge_entities 直接指名那個 entity_id,它的 keep_days 預設是 0,意思是符合條件的資料全部立刻刪掉。

要注意設定檔改完必須先重新啟動 Home Assistant,讓新的過濾規則生效之後,apply_filter 才有正確的規則可以套用。
換成 MariaDB 之後,以前的歷史會跟著搬過去嗎?
不會。官方文件明確說明:更換記錄器使用的資料庫可能導致既有歷史消失,而且官方不支援資料遷移。網路上有人寫過自製的搬移腳本,但那是自行承擔風險的行為,出事沒人負責。

所以決策原則很簡單:要換就趁早換。剛裝好一兩週就換,損失的只是幾天的歷史;累積兩年才換,等於把兩年的記憶丟掉。如果你已經累積很久又真的需要換,至少先把重要的部分用歷史頁的「下載資料」匯出成 CSV 存起來。
我只是想把某個感測器的資料倒進 Excel 做作業,最快的方法是什麼?
側欄「歷史」→ 選那個實體 → 設好時間範圍 → 右上角「下載資料(Download data)」→ 得到 CSV。整個流程不用裝任何東西,也不用寫任何程式。

兩個小提醒:範圍別一次拉太大,先用一天測試檔案長怎樣再決定;還有記得 10 天以外拿到的會是每小時平均值,不是原始逐筆資料。要做「一天之內的細部變化」就選最近幾天,要做「長期趨勢」就放心拉長,反正拿到的本來就是彙整值。
備份檔越來越大,是不是因為資料庫?可以只備份設定不備份歷史嗎?
是,資料庫檔案就在設定資料夾裡,完整備份會把它一起包進去。官方在「清出空間」那頁對備份給的建議是:設好保留幾份的規則別讓備份堆積,還有盡量把備份存到 Home Assistant 以外的地方。

內建的備份介面可以選擇要不要納入媒體、共享資料夾等項目,但「單獨排除資料庫」這個選項在不同版本上的狀況不一樣,請以你畫面上實際出現的勾選項為準。

不管有沒有那個選項,最有效的做法都一樣:先讓資料庫瘦下來,備份自然就小了。順序是設好 exclude → 重開機 → 跑一次帶 repack 的 purge → 再建立備份。
「歷史」和「活動」可以從側欄拿掉嗎?我用不到。
側欄上既有的項目可以個別隱藏或重新排序,作法是在側欄上長按(手機)或按住不放來進入編輯模式,這個設定是跟著使用者帳號走的,你藏起來不影響家裡其他人。不同版本的操作細節略有出入,以你畫面上的提示為準。

順帶一提,這個編輯模式只能整理「已經在側欄上的東西」,沒辦法把 2026.2 搬進設定裡的工具(Tools)拉回側欄 —— 官方說完整的側欄自訂還在規劃中。

但要提醒一件事:把側欄項目藏起來只是眼不見為淨,資料照樣在記錄,資料庫該多大還是多大。想省空間得靠這章的 exclude 和 purge,藏側欄一點幫助都沒有。而且真的出事要查「昨天半夜是誰開的門」時,你會很想念它們。
我怎麼知道到底是哪個實體在把資料庫灌爆?
最直覺的判斷法:去歷史頁面,一個一個看誰的曲線最密。更新頻率高、數值連續變動的一定是主嫌,通常跑不掉這幾類 —— 手機 App 回傳的電量與定位、逐秒回報的功率/電流插座、太陽方位角、網路速度測試。

想要更精確的數字,社群有各種直接統計資料庫各實體筆數的 SQL 查詢,可以搭配本章的 SQL 整合來跑。不過那些查詢寫法會隨著資料庫結構調整而失效,網路上找到的舊語法不一定還能用,抓不準的話就回到「看誰曲線最密」這個土法煉鋼但永遠有效的辦法。