Repack DB: ridurre le dimensioni del file database

Come in molti avrete visto il database, di seguito DB, di Home Assistant che si trova nella cartella /config di Hassio cresce costantemente perché contiene lo stato di tutti sensori, interruttori, luci, automazioni etc del nostro Home Assistant.
Con il passare del tempo il DB, se non si effettuano delle configurazioni ad hoc, può diventare molto ingombrante con dimensioni nell’ordine dei gigabytes e rallentare il funzionamento di Home Assistant.
Per porre rimedio a questa situazione occorre agire in due modi:
- attraverso un “fine tuning” della configurazione del componente “recorder”
- attraverso un’automazione che effettua il “repack” del Db cioè una ottimizzazione in termini di spazio occupato
Vediamo come funziona il salvataggio dei dati su Home Assistant.
Il motore di database predefinito di HA è SQLite che non richiede alcuna configurazione. Il database è memorizzato nella directory di configurazione Home Assistant (.homeassistant o /config) ed è chiamato home-assistant_v2.db.
Per modificare i valori predefiniti per il componente “recorder” occorre aggiungere quanto segue al file configuration.yaml.
1 |
recorder: |
I principali parametri del componente recorder sono i seguenti:
db_url: URL che punta al tuo database, normalmente nel caso di utilizzo del DB standard non è configurato.
purge_keep_days: specifica il numero di giorni di cronologia da conservare nel database
purge_interval: frequenza (in giorni) con la quale viene eseguita l’operazione di eliminazione.
commit_interval indica ogni quanto tempo (in secondi) i dati sono inviati al DB
exclude: indica quale entità sono da escludere dalle registrazioni su DB
include: indica quale entità sono da includere nelle registrazioni su DB
Di seguito ho inserito una configurazione del componente recorder che salva solo quattro componenti principali (sensors, binary_sensors, climate, light) e mantiene gli ultimi 3 giorni di registrazioni, in questo modo il DB non dovrebbe crescere oltre qualche centinaia di MB. Per chi volesse mantenere lo stato di altri domini questi vanno aggiunti nella sezione include/domains (ad esempio si può aggiungere il dominio automation) ed escludere quelle particolari entità che non interessano nella sezione exclude/entities.
La configurazione prevedere anche un commit_interval a 60 secondi (il default è 1 sec) in modo da ridurre le scritture su scheda SD o su altro sistema di memorizzazione.
Questa logica in pratica registra solo quello che ci interessa, ma è possibile configurare anche la logica contraria e cioè registrare tutto ad esclusione di quello che viene specificato.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
############################################################################ #https://home-assistant.io/components/recorder/ recorder: purge_interval: 1 purge_keep_days: 3 commit_interval: 60 include: domains: - sensor - climate - binary_sensor - light exclude: entities: - sensor.last_boot - sensor.date - sensor.time - sensor.workday - sun.sun - sensor.moon - sensor.fasi_lunari - sensor.stagioni - sensor.season ############################################################################ |
Oltre al tuning dei dati da salvare sul DB l’altra strategia è di effettuare il “repack” del DB in modo da ottimizzare lo spazio occupato.
Il package si basa sul servizio “recorder.purge” ed è personalizzabile con l’orario in cui effettuare il “repack” e il numero di giorni da mantenere nel DB.
Veniamo ora al package e al dettaglio delle sue componenti:
input_boolean.repack_db:
se attivo parte il repack ogni giorno all’orario indicato
input_datetime.repack_time
: orario in cui parte il repack del DB
input_number.day_to_keep:
numero di giorni con gli stati da mantenere
input_text.repack_status:
indica lo stato del repack
input_text.previous_dimension_db:
indica le dimensioni del DB alla partenza dell’automazione
sensor.home_assistant_v2_db:
dimensioni del DB di HA
script.repack_db:
script “nudo e crudo” che effettua il repack
Ed ora alcune avvertenze:
- alcuni componenti hanno uno stato iniziale preimpostato, se si desidera cambiarlo occorre agire di propria iniziativa sul package andando a modificare dove è di interesse o in alternativa eliminando lo stato iniziale
- il sensore “
sensor.time
” è obbligatorio per poter avviare l’automazione - occorre cambiare a proprio piacimento il servizio di notifica telegram
- per il sensore che monitora la grandezza del DB di HA occorre aggiungere anche nel file configuration.yaml. sotto la sezione
whitelist_external_dirs
la cartella/config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
################################################################# # # # Packages/Repack DB # # # ################################################################# ################################################################# # # # Customize # # # ################################################################# homeassistant: customize: ################################################ ## Node Anchors ################################################ package.node_anchors: customize: &customize package: 'repack_db' expose: &expose <<: *customize haaska_hidden: false homebridge_hidden: false ################################################ ## input ################################################ input_boolean.repack_db: <<: *customize friendly_name: "Repack DB HA" icon: mdi:database input_datetime.repack_time: <<: *customize icon: mdi:clock-outline input_text.repack_status: <<: *customize icon: mdi:database-check input_text.previous_dimension_db: <<: *customize icon: mdi:database-check friendly_name: "Dim. precedenti HA DB" ################################################ ## script / sensor ################################################ script.repack_db: <<: *customize friendly_name: Repack DB sensor.home_assistant_v2_db: <<: *customize friendly_name: "Dimensioni HA DB" icon: mdi:database ######################################################### # # # GROUP # # # ######################################################### group: repackdb_package: name: Repack DB Package entities: - input_boolean.repack_db - input_datetime.repack_time - input_number.day_to_keep - input_text.repack_status - input_text.previous_dimension_db - script.repack_db - sensor.home_assistant_v2_db ######################################################### # # # SENSOR # # # ######################################################### sensor: #https://www.home-assistant.io/components/sensor.filesize/ platform: filesize file_paths: - /config/home-assistant_v2.db ######################################################### # # # SCRIPT # # # ######################################################### script: repack_db: alias: Repack DB sequence: - service: recorder.purge data_template: keep_days: "{{ states('input_number.day_to_keep') | int }}" repack: true ######################################################### # # # INPUT # # # ######################################################### input_boolean: repack_db: name: "Repack DB HA" initial: 'on' icon: mdi:refresh ######################################################### input_datetime: repack_time: name: "Orario Repack" has_date: false has_time: true initial: '01:32' icon: mdi:clock-outline ######################################################### input_text: repack_status: name: "Stato Repack" initial: "-" icon: mdi:database-check previous_dimension_db: name: "Dim. precedenti HA DB" initial: "-" ######################################################### input_number: day_to_keep: name: "Giorni da mantenere" min: 1 max: 15 step: 1 initial: 3 mode: box icon: mdi:calendar-today ######################################################### # # # AUTOMAZIONI # # # ######################################################### automation: ######################################################### # pulisce il DB una volta al giorno nell'orario scelto # NB sensor.time è obbligatorio # cambiare a proprio piacimento il servizio # di notifica telegram ######################################################### - alias: purge DB initial_state: true trigger: platform: template value_template: >- {{ states('sensor.time') == (states.input_datetime.repack_time.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }} condition: - condition: state entity_id: input_boolean.repack_db state: 'on' action: - service: input_text.set_value data_template: entity_id: input_text.repack_status value: "Avviato repack su DB alle {{states('sensor.time')}}" - service: input_text.set_value data_template: entity_id: input_text.previous_dimension_db value: "{{ states('sensor.home_assistant_v2_db') }}" - service: script.turn_on entity_id: script.repack_db - wait_template: "{{ (states('sensor.home_assistant_v2_db') |float ) < (states('input_text.previous_dimension_db') |float) }}" timeout: '00:30:00' continue_on_timeout: 'false' - service: notify.telegram data_template: title: '*-- Repack DB Home Assistant --*' message: > Repack DB completato alle {{ states('sensor.time') }}, dimensione precedente DB: {{ states('input_text.previous_dimension_db') }}, dimensione attuale DB: {{ states('sensor.home_assistant_v2_db') }} Ridotto del {{ ((states('input_text.previous_dimension_db')|float / (states('sensor.home_assistant_v2_db')|float))*100 - 100) | round(2) }}% - service: input_text.set_value data_template: entity_id: input_text.repack_status value: DB ridotto del {{ ((states('input_text.previous_dimension_db')|float / (states('sensor.home_assistant_v2_db')|float))*100 - 100) | round(2) }}% ######################################################### # # # END # # # ######################################################### |
Di seguito la configurazione Lovelace:
1 2 3 4 5 6 7 8 9 10 11 |
- type: entities title: Repack DB show_header_toggle: false entities: - input_boolean.repack_db - input_number.day_to_keep - sensor.home_assistant_v2_db - input_text.previous_dimension_db - input_datetime.repack_time - input_text.repack_status - script.repack_db |
26 risposte
“Per il sensore che monitora la grandezza del DB di HA occorre aggiungere anche nel file configuration.yaml. sotto la sezione whitelist_external_dirs la cartella /config”
Ciao,mi sono perso a questo punto?Nel configuration.yaml dove trovo la sezione whitelist?
grazie
guarda qui: https://www.home-assistant.io/docs/configuration/basic/
Ciao,
essendo passato a maria db
questo sensore:
sensor:
#https://www.home-assistant.io/components/sensor.filesize/
– platform: filesize
file_paths:
– /config/home-assistant_v2.db
come va configurato? ovvero la path qiale sarà?
grazie
qualcosa del genere:
#https://www.home-assistant.io/components/sensor.sql/
– platform: sql
db_url: !secret mariadb_url
scan_interval: 300
queries:
– name: DB size
query: ‘SELECT table_schema “database”, Round(Sum(data_length + index_length) / 1048576, 1) “value” FROM information_schema.tables WHERE table_schema=”homeassistant” GROUP BY table_schema;’
column: ‘value’
unit_of_measurement: MB
Salve, stavo leggendo la guida su come realizzare il db repack, si parla di uno script. Non ho capito pero’ dove si recupera.
Grazie e complimenti ancora per le ottime guide che pubblicate
Gabriele
nel package pubblicato c’è tutto quello che ti serve.
Salve.. ragazzi conoscete se è possibile effettuare un purge di un solo sensore specifico nella base di dati ?? Grazie
Che io sappia no.
ma purge_keep_days cancella anche i dati specificati sotto recorder: include?
Ho un piccolo problema col package. L’ho installato e configurato, funziona come previsto (mi arrivano le notifiche del repack con le dimensioni e tutto).
Nell’interfaccia, però, i campi “Dim. precedenti HA DB” e “Stato Repack” rimangono sempre vuoti (o meglio, sono valorizzati con “-“). Come detto questo non inficia la funzionalità, ma essendo un ossessivo compulsivo mi da fastidio. 😀
By(t)e
E’ un articolo di 2-3 anni fa, c’è sicuramente da rivedere il codice
strano a me funzionano perfettamente, non è che devi fare il passaggio:
aggiungere anche nel file configuration.yaml. sotto la sezione whitelist_external_dirs la cartella /config
Complimenti per il packege molto utile, volevo sapere: – se imposti in lovelace card,
Giorni da mantenere” 8
e il configuration.yaml è
recorder:
purge_interval: 1
purge_keep_days: 3
commit_interval: 60
vale a dire 3 giorni da mantenere quale prevale?
Scusami ho un’altra cosa, ho eseguito repack e inserito in configuration
recorder:
purge_interval: 4
questo è il log che esce, è trascurabile o cosa bisogna fare?
The ‘purge_interval’ option near /config/configuration.yaml:9 is deprecated, please remove it from your configuration
L’articolo é datato ma i principi sono sempre validi cmq purge_interval é deprecato e va rimosso. L’auto purge é effettuato di default ogni notte, dai un’occhiata alla documentazione ufficiale.
https://www.home-assistant.io/integrations/recorder/
Ok grazie della risposta, ma mi sono perso:
– Se di default il servizio auto-purge è ogni notte, quando auto-purge si attiva (ore 4:12 di notte di default) interroga il packege e definisce così i paramatri impostati?
– oppure il packege è escluso da questo purge e agisce in altro modo e altro tempo e a questo punto quando?
Scusa mi rispondo da solo:
– l’auto-purge è un servizio di semplice pulizia meno profondo di repack e di default è aogni notte;
– il pakage si basa su repack un servizio più pesante che riscrive l’intero database (se si usaSQLite o PostgreSQL) e se ” input_boolean.repack_db: è attivo parte il repack ogni giorno all’orario indicato”
Essendo una attività di riscrittura ogni quanto conviene attivarlo secondo te?
il package è stato fatto quando non c’era il purge automatico e:
– il package si basa sul servizio “recorder.purge”
– dalla doc ufficiale: If you disable auto_purge it is recommended that you create an automation to call the “recorder.purge” periodically.
quindi scegli te cosa vuoi fare, tenendo a mente che su SD cmq avrai dei problemi alla lunga
Come volevasi dimostrare non ho capito una mazza 🙂 –
Problema SD in effetti ho già provveduto a spostare su SSD disco esterno, spero regga a lungo.
Come si fa a disabilitare auto-purge?
Grazie.
auto-purge: false
https://www.home-assistant.io/integrations/recorder
Scusa hai ragione, adesso ho capito una cosa preziosa: il dato fra parentesi – auto_purge boolean (optional, default: true); non ho dimestichezza con il codice ma incomincio ad orientarmi.
da qualche giorno mi appare il seguente errore:
Logger: homeassistant.helpers.template
Source: helpers/template.py:1292
First occurred: 11:38:13 (4 occurrences)
Last logged: 11:38:13
Template warning: ‘float’ got invalid input ‘unknown’ when rendering template ‘{{ (states(‘sensor.home_assistant_v2_db’) |float ) automazioni ed il servizio è oscurato, posizionando il cursore sopra mi dice: solo le automazioni che hanno assegnato un ID univoco sono debuggabili”
gentilmente potresti darmi una mano? grazie
E’ un articolo di diversi anni fa, devi seguire gli ultimi aggiornamenti e inserire i valori di default
la configurazione lovelace è ancora valida?
Va bene anche se si usa MariaDB?
si, ma guarda la guida ufficiale di HA sul recorder, questo articolo è di 4 anni fa.