From be7013a239cd83fbc31d3a46a30327fa88aaa4f5 Mon Sep 17 00:00:00 2001 From: amigian74 Date: Tue, 16 May 2017 15:44:55 +0200 Subject: [PATCH 1/7] add exclude filter for event types to recorder component --- homeassistant/components/recorder/__init__.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 7e31523f7d152a..33d5d2f0aca8ce 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -42,6 +42,7 @@ CONF_DB_URL = 'db_url' CONF_PURGE_DAYS = 'purge_days' +CONF_EVENT_TYPES = 'event_types' CONNECT_RETRY_WAIT = 3 @@ -49,6 +50,8 @@ vol.Optional(CONF_EXCLUDE, default={}): vol.Schema({ vol.Optional(CONF_ENTITIES, default=[]): cv.entity_ids, vol.Optional(CONF_DOMAINS, default=[]): + vol.All(cv.ensure_list, [cv.string]), + vol.Optional(CONF_EVENT_TYPES, default=[]): vol.All(cv.ensure_list, [cv.string]) }), vol.Optional(CONF_INCLUDE, default={}): vol.Schema({ @@ -142,6 +145,7 @@ def __init__(self, hass: HomeAssistant, purge_days: int, uri: str, self.include_d = include.get(CONF_DOMAINS, []) self.exclude = exclude.get(CONF_ENTITIES, []) + \ exclude.get(CONF_DOMAINS, []) + self.exclude_t = exclude.get(CONF_EVENT_TYPES, []) self.get_session = None @@ -267,10 +271,12 @@ def do_purge(now): continue with session_scope(session=self.get_session()) as session: - dbevent = Events.from_event(event) - session.add(dbevent) + dbevent = None + if event.event_type not in self.exclude_t: + dbevent = Events.from_event(event) + session.add(dbevent) - if event.event_type == EVENT_STATE_CHANGED: + if event.event_type == EVENT_STATE_CHANGED and EVENT_STATE_CHANGED not in self.exclude_t: dbstate = States.from_event(event) dbstate.event_id = dbevent.event_id session.add(dbstate) From 6dd665e68f1d0b0240aa7b55971217daf1f6cb9b Mon Sep 17 00:00:00 2001 From: amigian74 Date: Wed, 17 May 2017 11:35:16 +0200 Subject: [PATCH 2/7] corrected long line (279) --- homeassistant/components/recorder/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 33d5d2f0aca8ce..c27066c9fbca18 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -276,7 +276,8 @@ def do_purge(now): dbevent = Events.from_event(event) session.add(dbevent) - if event.event_type == EVENT_STATE_CHANGED and EVENT_STATE_CHANGED not in self.exclude_t: + if event.event_type == EVENT_STATE_CHANGED and \ + EVENT_STATE_CHANGED not in self.exclude_t: dbstate = States.from_event(event) dbstate.event_id = dbevent.event_id session.add(dbstate) From 31a32feb973b8ba834ba8214921252bd75bdaf7f Mon Sep 17 00:00:00 2001 From: amigian74 Date: Fri, 19 May 2017 08:21:01 +0200 Subject: [PATCH 3/7] change source code structure add test for exclude event types --- homeassistant/components/recorder/__init__.py | 23 ++++++++++++------- tests/components/recorder/test_init.py | 20 ++++++++++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index c27066c9fbca18..b8aaad2d59261f 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -270,16 +270,23 @@ def do_purge(now): self.queue.task_done() continue - with session_scope(session=self.get_session()) as session: - dbevent = None - if event.event_type not in self.exclude_t: - dbevent = Events.from_event(event) - session.add(dbevent) - - if event.event_type == EVENT_STATE_CHANGED and \ - EVENT_STATE_CHANGED not in self.exclude_t: + dbevent = None + dbstate = None + # Exclude event types + if event.event_type not in self.exclude_t: + dbevent = Events.from_event(event) + if event.event_type == EVENT_STATE_CHANGED: dbstate = States.from_event(event) dbstate.event_id = dbevent.event_id + + if dbevent is None and dbstate is None: + self.queue.task_done() + continue + + with session_scope(session=self.get_session()) as session: + if dbevent is not None: + session.add(dbevent) + if dbstate is not None: session.add(dbstate) self.queue.task_done() diff --git a/tests/components/recorder/test_init.py b/tests/components/recorder/test_init.py index c43caefb67cda9..f9d06ae798f1ab 100644 --- a/tests/components/recorder/test_init.py +++ b/tests/components/recorder/test_init.py @@ -114,6 +114,18 @@ def _add_entities(hass, entity_ids): return [st.to_native() for st in session.query(States)] +def _add_events(hass, events): + with session_scope(hass=hass) as session: + session.query(Events).delete(synchronize_session=False) + for event_type, event_data in events.items(): + hass.bus.fire(event_type) + hass.block_till_done() + hass.data[DATA_INSTANCE].block_till_done() + + with session_scope(hass=hass) as session: + return [ev.to_native() for ev in session.query(Events)] + + # pylint: disable=redefined-outer-name,invalid-name def test_saving_state_include_domains(hass_recorder): """Test saving and restoring a state.""" @@ -131,6 +143,14 @@ def test_saving_state_incl_entities(hass_recorder): assert hass.states.get('test2.recorder') == states[0] +def test_saving_event_exclude_event_type(hass_recorder): + """Test saving and restoring an event.""" + hass = hass_recorder({'exclude': {'event_types': 'test'}}) + events = _add_events(hass, {'test': 'nothing', 'test2': 'something'}) + assert len(events) == 1 + #assert hass.e.get('test2.recorder') == states[0] + + def test_saving_state_exclude_domains(hass_recorder): """Test saving and restoring a state.""" hass = hass_recorder({'exclude': {'domains': 'test'}}) From 481f917a4c1d03bf869979b1be10c931fab00202 Mon Sep 17 00:00:00 2001 From: amigian74 Date: Fri, 19 May 2017 08:22:01 +0200 Subject: [PATCH 4/7] code cleanup --- tests/components/recorder/test_init.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/components/recorder/test_init.py b/tests/components/recorder/test_init.py index f9d06ae798f1ab..65032e7c9c9373 100644 --- a/tests/components/recorder/test_init.py +++ b/tests/components/recorder/test_init.py @@ -148,7 +148,6 @@ def test_saving_event_exclude_event_type(hass_recorder): hass = hass_recorder({'exclude': {'event_types': 'test'}}) events = _add_events(hass, {'test': 'nothing', 'test2': 'something'}) assert len(events) == 1 - #assert hass.e.get('test2.recorder') == states[0] def test_saving_state_exclude_domains(hass_recorder): From 95708c225d3af6e772a5e16587e642f2593f2b8d Mon Sep 17 00:00:00 2001 From: amigian74 Date: Wed, 24 May 2017 08:52:17 +0200 Subject: [PATCH 5/7] change source code structure --- homeassistant/components/recorder/__init__.py | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index b8aaad2d59261f..bdb1d9b768a81b 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -250,6 +250,11 @@ def do_purge(now): self.queue.task_done() continue + # Exclude event types + if event.event_type in self.exclude_t: + self.queue.task_done() + continue + if ATTR_ENTITY_ID in event.data: entity_id = event.data[ATTR_ENTITY_ID] domain = split_entity_id(entity_id)[0] @@ -270,23 +275,13 @@ def do_purge(now): self.queue.task_done() continue - dbevent = None - dbstate = None - # Exclude event types - if event.event_type not in self.exclude_t: + with session_scope(session=self.get_session()) as session: dbevent = Events.from_event(event) + session.add(dbevent) + if event.event_type == EVENT_STATE_CHANGED: dbstate = States.from_event(event) dbstate.event_id = dbevent.event_id - - if dbevent is None and dbstate is None: - self.queue.task_done() - continue - - with session_scope(session=self.get_session()) as session: - if dbevent is not None: - session.add(dbevent) - if dbstate is not None: session.add(dbstate) self.queue.task_done() From 53546256e554ff14c0df6d3fbcb47a6ccdb198eb Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 24 May 2017 15:02:07 -0700 Subject: [PATCH 6/7] Update __init__.py --- homeassistant/components/recorder/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 0045557b29d3e9..997c79f6975c55 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -249,9 +249,7 @@ def do_purge(now): elif event.event_type == EVENT_TIME_CHANGED: self.queue.task_done() continue - - # Exclude event types - if event.event_type in self.exclude_t: + elif event.event_type in self.exclude_t: self.queue.task_done() continue From 43e2662946a3083b6f2cf7a269315b6fab7ba8bf Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 24 May 2017 15:05:16 -0700 Subject: [PATCH 7/7] Update test_init.py --- tests/components/recorder/test_init.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/components/recorder/test_init.py b/tests/components/recorder/test_init.py index 65032e7c9c9373..539b80f50d00d0 100644 --- a/tests/components/recorder/test_init.py +++ b/tests/components/recorder/test_init.py @@ -117,7 +117,7 @@ def _add_entities(hass, entity_ids): def _add_events(hass, events): with session_scope(hass=hass) as session: session.query(Events).delete(synchronize_session=False) - for event_type, event_data in events.items(): + for event_type in events: hass.bus.fire(event_type) hass.block_till_done() hass.data[DATA_INSTANCE].block_till_done() @@ -146,8 +146,9 @@ def test_saving_state_incl_entities(hass_recorder): def test_saving_event_exclude_event_type(hass_recorder): """Test saving and restoring an event.""" hass = hass_recorder({'exclude': {'event_types': 'test'}}) - events = _add_events(hass, {'test': 'nothing', 'test2': 'something'}) + events = _add_events(hass, ['test', 'test2']) assert len(events) == 1 + assert events[0].event_type == 'test2' def test_saving_state_exclude_domains(hass_recorder):