Add 'purge_days' option to the history/recorder component

Issue https://github.com/balloob/home-assistant/issues/1337

When purge_days is set under the history component, recorder.py will
delete all events and states that are older than purge_days days ago.

Currently, this is only done once at start up.   A vacuum command is
also run to free up the disk space sqlite would still use after deleting
records.
This commit is contained in:
Justyn Shull 2016-04-01 19:47:32 -05:00
parent e7520ef401
commit c89cd6a68c

View File

@ -13,7 +13,7 @@ import logging
import queue
import sqlite3
import threading
from datetime import date, datetime
from datetime import date, datetime, timedelta
import homeassistant.util.dt as dt_util
from homeassistant.const import (
@ -102,14 +102,13 @@ def setup(hass, config):
"""Setup the recorder."""
# pylint: disable=global-statement
global _INSTANCE
_INSTANCE = Recorder(hass)
_INSTANCE = Recorder(hass, config.get('history', {}))
return True
class RecorderRun(object):
"""Representation of arecorder run."""
"""Representation of a recorder run."""
def __init__(self, row=None):
"""Initialize the recorder run."""
@ -169,11 +168,12 @@ class Recorder(threading.Thread):
"""A threaded recorder class."""
# pylint: disable=too-many-instance-attributes
def __init__(self, hass):
def __init__(self, hass, config):
"""Initialize the recorder."""
threading.Thread.__init__(self)
self.hass = hass
self.config = config
self.conn = None
self.queue = queue.Queue()
self.quit_object = object()
@ -194,6 +194,7 @@ class Recorder(threading.Thread):
"""Start processing events to save."""
self._setup_connection()
self._setup_run()
self._purge_old_data()
while True:
event = self.queue.get()
@ -475,6 +476,33 @@ class Recorder(threading.Thread):
"UPDATE recorder_runs SET end=? WHERE start=?",
(dt_util.utcnow(), self.recording_start))
def _purge_old_data(self):
"""Purge events and states older than purge_days ago."""
purge_days = self.config.get('purge_days', -1)
if purge_days < 1:
_LOGGER.debug("purge_days set to %s, will not purge any old data.",
purge_days)
return
purge_before = dt_util.utcnow() - timedelta(days=purge_days)
_LOGGER.info("Purging events created before %s", purge_before)
deleted_rows = self.query(
sql_query="DELETE FROM events WHERE created < ?;",
data=(int(purge_before.timestamp()),),
return_value=RETURN_ROWCOUNT)
_LOGGER.debug("Deleted %s events", deleted_rows)
_LOGGER.info("Purging states created before %s", purge_before)
deleted_rows = self.query(
sql_query="DELETE FROM states WHERE created < ?;",
data=(int(purge_before.timestamp()),),
return_value=RETURN_ROWCOUNT)
_LOGGER.debug("Deleted %s states", deleted_rows)
# Execute sqlite vacuum command to free up space on disk
self.query("VACUUM;")
def _adapt_datetime(datetimestamp):
"""Turn a datetime into an integer for in the DB."""