def test_purge_old_states(self): """Test deleting old states.""" self._add_test_states() # make sure we start with 5 states states = recorder.query_states('SELECT * FROM states') self.assertEqual(len(states), 5) # run purge_old_data() recorder._INSTANCE.purge_days = 4 recorder._INSTANCE._purge_old_data() # we should only have 2 states left after purging states = recorder.query_states('SELECT * FROM states') self.assertEqual(len(states), 2)
def get_significant_states(start_time, end_time=None, entity_id=None): """Return states changes during UTC period start_time - end_time. Significant states are all states where there is a state change, as well as all states from certain domains (for instance thermostat so that we get current temperature in our graphs). """ where = """ (domain in ({}) or last_changed=last_updated) AND last_updated > ? """.format(",".join(["'%s'" % x for x in SIGNIFICANT_DOMAINS])) data = [start_time] if end_time is not None: where += "AND last_updated < ? " data.append(end_time) if entity_id is not None: where += "AND entity_id = ? " data.append(entity_id.lower()) query = ("SELECT * FROM states WHERE {} " "ORDER BY entity_id, last_updated ASC").format(where) states = recorder.query_states(query, data) return states_to_json(states, start_time, entity_id)
def get_states(utc_point_in_time, entity_ids=None, run=None): """ Returns the states at a specific point in time. """ if run is None: run = recorder.run_information(utc_point_in_time) # History did not run before utc_point_in_time if run is None: return [] where = run.where_after_start_run + "AND created < ? " where_data = [utc_point_in_time] if entity_ids is not None: where += "AND entity_id IN ({}) ".format( ",".join(['?'] * len(entity_ids))) where_data.extend(entity_ids) query = """ SELECT * FROM states INNER JOIN ( SELECT max(state_id) AS max_state_id FROM states WHERE {} GROUP BY entity_id) WHERE state_id = max_state_id """.format(where) return recorder.query_states(query, where_data)
def state_changes_during_period(start_time, end_time=None, entity_id=None): """ Return states changes during UTC period start_time - end_time. """ where = "last_changed=last_updated AND last_changed > ? " data = [start_time] if end_time is not None: where += "AND last_changed < ? " data.append(end_time) if entity_id is not None: where += "AND entity_id = ? " data.append(entity_id.lower()) query = ("SELECT * FROM states WHERE {} " "ORDER BY entity_id, last_changed ASC").format(where) states = recorder.query_states(query, data) result = defaultdict(list) entity_ids = [entity_id] if entity_id is not None else None # Get the states at the start time for state in get_states(start_time, entity_ids): state.last_changed = start_time result[state.entity_id].append(state) # Append all changes to it for entity_id, group in groupby(states, lambda state: state.entity_id): result[entity_id].extend(group) return result
def get_states(utc_point_in_time, entity_ids=None, run=None): """ Returns the states at a specific point in time. """ if run is None: run = recorder.run_information(utc_point_in_time) # History did not run before utc_point_in_time if run is None: return [] where = run.where_after_start_run + "AND created < ? " where_data = [utc_point_in_time] if entity_ids is not None: where += "AND entity_id IN ({}) ".format(",".join(['?'] * len(entity_ids))) where_data.extend(entity_ids) query = """ SELECT * FROM states INNER JOIN ( SELECT max(state_id) AS max_state_id FROM states WHERE {} GROUP BY entity_id) WHERE state_id = max_state_id """.format(where) return recorder.query_states(query, where_data)
def state_changes_during_period(start_time, end_time=None, entity_id=None): """ Return states changes during UTC period start_time - end_time. """ where = "last_changed=last_updated AND last_changed > ? " data = [start_time] if end_time is not None: where += "AND last_changed < ? " data.append(end_time) if entity_id is not None: where += "AND entity_id = ? " data.append(entity_id.lower()) query = ("SELECT * FROM states WHERE {} " "ORDER BY entity_id, last_changed ASC").format(where) states = recorder.query_states(query, data) result = defaultdict(list) entity_ids = [entity_id] if entity_id is not None else None # Get the states at the start time for state in get_states(start_time, entity_ids): state.last_changed = start_time result[state.entity_id].append(state) # Append all changes to it for entity_id, group in groupby(states, lambda state: state.entity_id): result[entity_id].extend(group) return result
def get_significant_states(start_time, end_time=None, entity_id=None): """Return states changes during UTC period start_time - end_time. Significant states are all states where there is a state change, as well as all states from certain domains (for instance thermostat so that we get current temperature in our graphs). """ where = """ (domain in ({}) or last_changed=last_updated) AND last_updated > ? """.format(",".join(["'%s'" % x for x in SIGNIFICANT_DOMAINS])) data = [start_time] if end_time is not None: where += "AND last_updated < ? " data.append(end_time) if entity_id is not None: where += "AND entity_id = ? " data.append(entity_id.lower()) query = ("SELECT * FROM states WHERE {} " "ORDER BY entity_id, last_updated ASC").format(where) states = recorder.query_states(query, data) return states_to_json(states, start_time, entity_id)
def last_5_states(entity_id): """ Return the last 5 states for entity_id. """ entity_id = entity_id.lower() query = """ SELECT * FROM states WHERE entity_id=? AND last_changed=last_updated ORDER BY state_id DESC LIMIT 0, 5 """ return recorder.query_states(query, (entity_id, ))
def last_5_states(entity_id): """ Return the last 5 states for entity_id. """ entity_id = entity_id.lower() query = """ SELECT * FROM states WHERE entity_id=? AND last_changed=last_updated ORDER BY state_id DESC LIMIT 0, 5 """ return recorder.query_states(query, (entity_id, ))
def test_purge_disabled(self): """Test leaving purge_days disabled.""" self._add_test_states() self._add_test_events() # make sure we start with 5 states and events states = recorder.query_states('SELECT * FROM states') events = recorder.query_events('SELECT * FROM events WHERE ' 'event_type LIKE "EVENT_TEST%"') self.assertEqual(len(states), 5) self.assertEqual(len(events), 5) # run purge_old_data() recorder._INSTANCE.purge_days = None recorder._INSTANCE._purge_old_data() # we should have all of our states still states = recorder.query_states('SELECT * FROM states') events = recorder.query_events('SELECT * FROM events WHERE ' 'event_type LIKE "EVENT_TEST%"') self.assertEqual(len(states), 5) self.assertEqual(len(events), 5)
def test_saving_state(self): """Test saving and restoring a state.""" entity_id = 'test.recorder' state = 'restoring_from_db' attributes = {'test_attr': 5, 'test_attr_10': 'nice'} self.hass.states.set(entity_id, state, attributes) self.hass.pool.block_till_done() recorder._INSTANCE.block_till_done() states = recorder.query_states('SELECT * FROM states') self.assertEqual(1, len(states)) self.assertEqual(self.hass.states.get(entity_id), states[0])
def state_changes_during_period(start_time, end_time=None, entity_id=None): """Return states changes during UTC period start_time - end_time.""" where = "last_changed=last_updated AND last_changed > ? " data = [start_time] if end_time is not None: where += "AND last_changed < ? " data.append(end_time) if entity_id is not None: where += "AND entity_id = ? " data.append(entity_id.lower()) query = ("SELECT * FROM states WHERE {} " "ORDER BY entity_id, last_changed ASC").format(where) states = recorder.query_states(query, data) return states_to_json(states, start_time, entity_id)
def state_changes_during_period(start_time, end_time=None, entity_id=None): """Return states changes during UTC period start_time - end_time.""" where = "last_changed=last_updated AND last_changed > ? " data = [start_time] if end_time is not None: where += "AND last_changed < ? " data.append(end_time) if entity_id is not None: where += "AND entity_id = ? " data.append(entity_id.lower()) query = ("SELECT * FROM states WHERE {} " "ORDER BY entity_id, last_changed ASC").format(where) states = recorder.query_states(query, data) return states_to_json(states, start_time, entity_id)