diff --git a/homeassistant/components/recorder.py b/homeassistant/components/recorder.py index 05a95ee27b4..d5dd3ea1205 100644 --- a/homeassistant/components/recorder.py +++ b/homeassistant/components/recorder.py @@ -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."""