def test_exclude_removed_entities(self): """Test if events are excluded on last update.""" entity_id = 'sensor.bla' entity_id2 = 'sensor.blu' pointA = dt_util.utcnow() pointB = pointA + timedelta(minutes=logbook.GROUP_BY_MINUTES) eventA = self.create_state_changed_event(pointA, entity_id, 10) eventB = self.create_state_changed_event(pointB, entity_id2, 20) eventA.data['new_state'] = None events = logbook._exclude_events( (ha.Event(EVENT_HOMEASSISTANT_STOP), eventA, eventB), self.EMPTY_CONFIG) entries = list(logbook.humanify(events)) self.assertEqual(2, len(entries)) self.assert_entry(entries[0], name='Home Assistant', message='stopped', domain=ha.DOMAIN) self.assert_entry(entries[1], pointB, 'blu', domain='sensor', entity_id=entity_id2)
def _logbook_filtering(hass, last_changed, last_updated): from homeassistant.components import logbook entity_id = 'test.entity' old_state = {'entity_id': entity_id, 'state': 'off'} new_state = { 'entity_id': entity_id, 'state': 'on', 'last_updated': last_updated, 'last_changed': last_changed } event = core.Event(EVENT_STATE_CHANGED, { 'entity_id': entity_id, 'old_state': old_state, 'new_state': new_state }) events = [event] * 10**5 start = timer() # pylint: disable=protected-access events = logbook._exclude_events(events, {}) list(logbook.humanify(events)) return timer() - start
def test_exclude_new_entities(self): """Test if events are excluded on first update.""" entity_id = 'sensor.bla' entity_id2 = 'sensor.blu' pointA = dt_util.utcnow() pointB = pointA + timedelta(minutes=logbook.GROUP_BY_MINUTES) eventA = self.create_state_changed_event(pointA, entity_id, 10) eventB = self.create_state_changed_event(pointB, entity_id2, 20) eventA.data['old_state'] = None events = logbook._exclude_events( (ha.Event(EVENT_HOMEASSISTANT_STOP), eventA, eventB), logbook._generate_filter_from_config({})) entries = list(logbook.humanify(self.hass, events)) assert 2 == len(entries) self.assert_entry(entries[0], name='Home Assistant', message='stopped', domain=ha.DOMAIN) self.assert_entry(entries[1], pointB, 'blu', domain='sensor', entity_id=entity_id2)
def test_include_events_domain(self): """Test if events are filtered if domain is included in config.""" entity_id = 'switch.bla' entity_id2 = 'sensor.blu' pointA = dt_util.utcnow() pointB = pointA + timedelta(minutes=logbook.GROUP_BY_MINUTES) eventA = self.create_state_changed_event(pointA, entity_id, 10) eventB = self.create_state_changed_event(pointB, entity_id2, 20) config = logbook.CONFIG_SCHEMA({ ha.DOMAIN: {}, logbook.DOMAIN: { logbook.CONF_INCLUDE: { logbook.CONF_DOMAINS: [ 'sensor', ] } } }) events = logbook._exclude_events( (ha.Event(EVENT_HOMEASSISTANT_START), eventA, eventB), config[logbook.DOMAIN]) entries = list(logbook.humanify(events)) self.assertEqual(2, len(entries)) self.assert_entry(entries[0], name='Home Assistant', message='started', domain=ha.DOMAIN) self.assert_entry(entries[1], pointB, 'blu', domain='sensor', entity_id=entity_id2)
def _logbook_filtering(hass, last_changed, last_updated): from homeassistant.components import logbook entity_id = "test.entity" old_state = {"entity_id": entity_id, "state": "off"} new_state = { "entity_id": entity_id, "state": "on", "last_updated": last_updated, "last_changed": last_changed, } event = core.Event( EVENT_STATE_CHANGED, { "entity_id": entity_id, "old_state": old_state, "new_state": new_state }, ) def yield_events(event): # pylint: disable=protected-access entities_filter = logbook._generate_filter_from_config({}) for _ in range(10**5): if logbook._keep_event(event, entities_filter): yield event start = timer() list(logbook.humanify(None, yield_events(event))) return timer() - start
def _logbook_filtering(hass, last_changed, last_updated): from homeassistant.components import logbook entity_id = 'test.entity' old_state = {'entity_id': entity_id, 'state': 'off'} new_state = { 'entity_id': entity_id, 'state': 'on', 'last_updated': last_updated, 'last_changed': last_changed } event = core.Event(EVENT_STATE_CHANGED, { 'entity_id': entity_id, 'old_state': old_state, 'new_state': new_state }) def yield_events(event): # pylint: disable=protected-access entities_filter = logbook._generate_filter_from_config({}) for _ in range(10**5): if logbook._keep_event(event, entities_filter): yield event start = timer() list(logbook.humanify(None, yield_events(event))) return timer() - start
def test_include_events_entity(self): """Test if events are filtered if entity is included in config.""" entity_id = 'sensor.bla' entity_id2 = 'sensor.blu' pointA = dt_util.utcnow() pointB = pointA + timedelta(minutes=logbook.GROUP_BY_MINUTES) eventA = self.create_state_changed_event(pointA, entity_id, 10) eventB = self.create_state_changed_event(pointB, entity_id2, 20) config = logbook.CONFIG_SCHEMA({ ha.DOMAIN: {}, logbook.DOMAIN: {logbook.CONF_INCLUDE: { logbook.CONF_ENTITIES: [entity_id2, ]}}}) events = logbook._exclude_events( (ha.Event(EVENT_HOMEASSISTANT_STOP), eventA, eventB), logbook._generate_filter_from_config(config[logbook.DOMAIN])) entries = list(logbook.humanify(self.hass, events)) assert 2 == len(entries) self.assert_entry( entries[0], name='Home Assistant', message='stopped', domain=ha.DOMAIN) self.assert_entry( entries[1], pointB, 'blu', domain='sensor', entity_id=entity_id2)
def test_exclude_events_hidden(self): """Test if events are excluded if entity is hidden.""" entity_id = 'sensor.bla' entity_id2 = 'sensor.blu' pointA = dt_util.utcnow() pointB = pointA + timedelta(minutes=logbook.GROUP_BY_MINUTES) eventA = self.create_state_changed_event(pointA, entity_id, 10, {ATTR_HIDDEN: 'true'}) eventB = self.create_state_changed_event(pointB, entity_id2, 20) events = logbook._exclude_events( (ha.Event(EVENT_HOMEASSISTANT_STOP), eventA, eventB), {}) entries = list(logbook.humanify(events)) self.assertEqual(2, len(entries)) self.assert_entry(entries[0], name='Home Assistant', message='stopped', domain=ha.DOMAIN) self.assert_entry(entries[1], pointB, 'blu', domain='sensor', entity_id=entity_id2)
def test_home_assistant_start_stop_grouped(self): """Test if HA start and stop events are grouped. Events that are occurring in the same minute. """ entries = list( logbook.humanify(( ha.Event(EVENT_HOMEASSISTANT_STOP), ha.Event(EVENT_HOMEASSISTANT_START), ))) self.assertEqual(1, len(entries)) self.assert_entry(entries[0], name='Home Assistant', message='restarted', domain=ha.DOMAIN)
def test_exclude_automation_events(self): """Test if automation entries can be excluded by entity_id.""" name = 'My Automation Rule' message = 'has been triggered' domain = 'automation' entity_id = 'automation.my_automation_rule' entity_id2 = 'automation.my_automation_rule_2' entity_id2 = 'sensor.blu' eventA = ha.Event( logbook.EVENT_LOGBOOK_ENTRY, { logbook.ATTR_NAME: name, logbook.ATTR_MESSAGE: message, logbook.ATTR_DOMAIN: domain, logbook.ATTR_ENTITY_ID: entity_id, }) eventB = ha.Event( logbook.EVENT_LOGBOOK_ENTRY, { logbook.ATTR_NAME: name, logbook.ATTR_MESSAGE: message, logbook.ATTR_DOMAIN: domain, logbook.ATTR_ENTITY_ID: entity_id2, }) config = logbook.CONFIG_SCHEMA({ ha.DOMAIN: {}, logbook.DOMAIN: { logbook.CONF_EXCLUDE: { logbook.CONF_ENTITIES: [ entity_id, ] } } }) events = logbook._exclude_events( (ha.Event(EVENT_HOMEASSISTANT_STOP), eventA, eventB), config) entries = list(logbook.humanify(events)) self.assertEqual(2, len(entries)) self.assert_entry(entries[0], name='Home Assistant', message='stopped', domain=ha.DOMAIN) self.assert_entry(entries[1], name=name, domain=domain, entity_id=entity_id2)
def test_eq(self): now = dt_util.utcnow() data = {'some': 'attr'} event1, event2 = [ ha.Event('some_type', data, time_fired=now) for _ in range(2) ] self.assertEqual(event1, event2)
async def test_humanify_alexa_event(hass): """Test humanifying Alexa event.""" hass.states.async_set('light.kitchen', 'on', {'friendly_name': 'Kitchen Light'}) results = list( logbook.humanify(hass, [ ha.Event(EVENT_ALEXA_SMART_HOME, { 'request': { 'namespace': 'Alexa.Discovery', 'name': 'Discover', } }), ha.Event( EVENT_ALEXA_SMART_HOME, { 'request': { 'namespace': 'Alexa.PowerController', 'name': 'TurnOn', 'entity_id': 'light.kitchen' } }), ha.Event( EVENT_ALEXA_SMART_HOME, { 'request': { 'namespace': 'Alexa.PowerController', 'name': 'TurnOn', 'entity_id': 'light.non_existing' } }), ])) event1, event2, event3 = results assert event1['name'] == 'Amazon Alexa' assert event1['message'] == 'send command Alexa.Discovery/Discover' assert event1['entity_id'] is None assert event2['name'] == 'Amazon Alexa' assert event2['message'] == \ 'send command Alexa.PowerController/TurnOn for Kitchen Light' assert event2['entity_id'] == 'light.kitchen' assert event3['name'] == 'Amazon Alexa' assert event3['message'] == \ 'send command Alexa.PowerController/TurnOn for light.non_existing' assert event3['entity_id'] == 'light.non_existing'
def test_from_event(self): """Test converting event to db state.""" state = ha.State('sensor.temperature', '18') event = ha.Event(EVENT_STATE_CHANGED, { 'entity_id': 'sensor.temperature', 'old_state': None, 'new_state': state, }, context=state.context) assert state == States.from_event(event).to_native()
def test_event_eq(): """Test events.""" now = dt_util.utcnow() data = {"some": "attr"} context = ha.Context() event1, event2 = [ ha.Event("some_type", data, time_fired=now, context=context) for _ in range(2) ] assert event1 == event2
async def test_event_to_db_model(): """Test we can round trip Event conversion.""" event = ha.Event("state_changed", {"some": "attr"}, ha.EventOrigin.local, dt_util.utcnow()) native = Events.from_event(event).to_native() assert native == event native = Events.from_event(event, event_data="{}").to_native() event.data = {} assert native == event
def test_include_exclude_events(self): """Test if events are filtered if include and exclude is configured.""" entity_id = 'switch.bla' entity_id2 = 'sensor.blu' entity_id3 = 'sensor.bli' pointA = dt_util.utcnow() pointB = pointA + timedelta(minutes=logbook.GROUP_BY_MINUTES) eventA1 = self.create_state_changed_event(pointA, entity_id, 10) eventA2 = self.create_state_changed_event(pointA, entity_id2, 10) eventA3 = self.create_state_changed_event(pointA, entity_id3, 10) eventB1 = self.create_state_changed_event(pointB, entity_id, 20) eventB2 = self.create_state_changed_event(pointB, entity_id2, 20) config = logbook.CONFIG_SCHEMA({ ha.DOMAIN: {}, logbook.DOMAIN: { logbook.CONF_INCLUDE: { logbook.CONF_DOMAINS: [ 'sensor', ], logbook.CONF_ENTITIES: [ 'switch.bla', ] }, logbook.CONF_EXCLUDE: { logbook.CONF_DOMAINS: [ 'switch', ], logbook.CONF_ENTITIES: [ 'sensor.bli', ] } } }) events = logbook._exclude_events( (ha.Event(EVENT_HOMEASSISTANT_START), eventA1, eventA2, eventA3, eventB1, eventB2), config) entries = list(logbook.humanify(events)) self.assertEqual(3, len(entries)) self.assert_entry(entries[0], name='Home Assistant', message='started', domain=ha.DOMAIN) self.assert_entry(entries[1], pointA, 'blu', domain='sensor', entity_id=entity_id2) self.assert_entry(entries[2], pointB, 'blu', domain='sensor', entity_id=entity_id2)
def test_eq(self): """Test events.""" now = dt_util.utcnow() data = {'some': 'attr'} context = ha.Context() event1, event2 = [ ha.Event('some_type', data, time_fired=now, context=context) for _ in range(2) ] assert event1 == event2
def create_state_changed_event(self, event_time_fired, entity_id, state): """Create state changed event.""" # Logbook only cares about state change events that # contain an old state but will not actually act on it. state = ha.State(entity_id, state).as_dict() return ha.Event(EVENT_STATE_CHANGED, { 'entity_id': entity_id, 'old_state': state, 'new_state': state, }, time_fired=event_time_fired)
async def test_humanify_automation_triggered_event(hass): """Test humanifying Automation Trigger event.""" event1, event2 = list(logbook.humanify(hass, [ ha.Event(EVENT_AUTOMATION_TRIGGERED, { ATTR_ENTITY_ID: 'automation.hello', ATTR_NAME: 'Hello Automation', }), ha.Event(EVENT_AUTOMATION_TRIGGERED, { ATTR_ENTITY_ID: 'automation.bye', ATTR_NAME: 'Bye Automation', }), ])) assert event1['name'] == 'Hello Automation' assert event1['domain'] == 'automation' assert event1['message'] == 'has been triggered' assert event1['entity_id'] == 'automation.hello' assert event2['name'] == 'Bye Automation' assert event2['domain'] == 'automation' assert event2['message'] == 'has been triggered' assert event2['entity_id'] == 'automation.bye'
async def test_humanify_script_started_event(hass): """Test humanifying Script Run event.""" event1, event2 = list(logbook.humanify(hass, [ ha.Event(EVENT_SCRIPT_STARTED, { ATTR_ENTITY_ID: 'script.hello', ATTR_NAME: 'Hello Script' }), ha.Event(EVENT_SCRIPT_STARTED, { ATTR_ENTITY_ID: 'script.bye', ATTR_NAME: 'Bye Script' }), ])) assert event1['name'] == 'Hello Script' assert event1['domain'] == 'script' assert event1['message'] == 'started' assert event1['entity_id'] == 'script.hello' assert event2['name'] == 'Bye Script' assert event2['domain'] == 'script' assert event2['message'] == 'started' assert event2['entity_id'] == 'script.bye'
async def test_humanify_homekit_changed_event(hass, hk_driver): """Test humanifying HomeKit changed event.""" with patch("homeassistant.components.homekit.HomeKit"): assert await async_setup_component(hass, "homekit", {"homekit": {}}) event1, event2 = list( logbook.humanify( hass, [ ha.Event( EVENT_HOMEKIT_CHANGED, { ATTR_ENTITY_ID: "lock.front_door", ATTR_DISPLAY_NAME: "Front Door", ATTR_SERVICE: "lock", }, ), ha.Event( EVENT_HOMEKIT_CHANGED, { ATTR_ENTITY_ID: "cover.window", ATTR_DISPLAY_NAME: "Window", ATTR_SERVICE: "set_cover_position", ATTR_VALUE: 75, }, ), ], )) assert event1["name"] == "HomeKit" assert event1["domain"] == DOMAIN_HOMEKIT assert event1["message"] == "send command lock for Front Door" assert event1["entity_id"] == "lock.front_door" assert event2["name"] == "HomeKit" assert event2["domain"] == DOMAIN_HOMEKIT assert event2[ "message"] == "send command set_cover_position to 75 for Window" assert event2["entity_id"] == "cover.window"
def test_include_events_domain(self): """Test if events are filtered if domain is included in config.""" entity_id = 'switch.bla' entity_id2 = 'sensor.blu' pointA = dt_util.utcnow() pointB = pointA + timedelta(minutes=logbook.GROUP_BY_MINUTES) event_alexa = ha.Event(EVENT_ALEXA_SMART_HOME, {'request': { 'namespace': 'Alexa.Discovery', 'name': 'Discover', }}) event_homekit = ha.Event(EVENT_HOMEKIT_CHANGED, { ATTR_ENTITY_ID: 'lock.front_door', ATTR_DISPLAY_NAME: 'Front Door', ATTR_SERVICE: 'lock', }) eventA = self.create_state_changed_event(pointA, entity_id, 10) eventB = self.create_state_changed_event(pointB, entity_id2, 20) config = logbook.CONFIG_SCHEMA({ ha.DOMAIN: {}, logbook.DOMAIN: {logbook.CONF_INCLUDE: { logbook.CONF_DOMAINS: ['sensor', 'alexa', DOMAIN_HOMEKIT]}}}) entities_filter = logbook._generate_filter_from_config( config[logbook.DOMAIN]) events = [e for e in (ha.Event(EVENT_HOMEASSISTANT_START), event_alexa, event_homekit, eventA, eventB) if logbook._keep_event(e, entities_filter)] entries = list(logbook.humanify(self.hass, events)) assert 4 == len(entries) self.assert_entry(entries[0], name='Home Assistant', message='started', domain=ha.DOMAIN) self.assert_entry(entries[1], name='Amazon Alexa', domain='alexa') self.assert_entry(entries[2], name='HomeKit', domain=DOMAIN_HOMEKIT) self.assert_entry(entries[3], pointB, 'blu', domain='sensor', entity_id=entity_id2)
def test_from_event_to_db_state(): """Test converting event to db state.""" state = ha.State("sensor.temperature", "18") event = ha.Event( EVENT_STATE_CHANGED, { "entity_id": "sensor.temperature", "old_state": None, "new_state": state }, context=state.context, ) assert state == States.from_event(event).to_native()
def test_as_dict(self): event_type = 'some_type' now = dt_util.utcnow() data = {'some': 'attr'} event = ha.Event(event_type, data, ha.EventOrigin.local, now) expected = { 'event_type': event_type, 'data': data, 'origin': 'LOCAL', 'time_fired': dt_util.datetime_to_str(now), } self.assertEqual(expected, event.as_dict())
def test_from_event_to_db_state_attributes(): """Test converting event to db state attributes.""" attrs = {"this_attr": True} state = ha.State("sensor.temperature", "18", attrs) event = ha.Event( EVENT_STATE_CHANGED, { "entity_id": "sensor.temperature", "old_state": None, "new_state": state }, context=state.context, ) assert StateAttributes.from_event(event).to_native() == attrs
def test_from_event_to_delete_state(self): """Test converting deleting state event to db state.""" event = ha.Event(EVENT_STATE_CHANGED, { 'entity_id': 'sensor.temperature', 'old_state': ha.State('sensor.temperature', '18'), 'new_state': None, }) db_state = States.from_event(event) assert db_state.entity_id == 'sensor.temperature' assert db_state.domain == 'sensor' assert db_state.state == '' assert db_state.last_changed == event.time_fired assert db_state.last_updated == event.time_fired
def create_state_changed_event(self, event_time_fired, entity_id, state, attributes=None, last_changed=None, last_updated=None): \ # pylint: disable=no-self-use """Create state changed event.""" # Logbook only cares about state change events that # contain an old state but will not actually act on it. state = ha.State(entity_id, state, attributes, last_changed, last_updated).as_dict() return ha.Event(EVENT_STATE_CHANGED, { 'entity_id': entity_id, 'old_state': state, 'new_state': state, }, time_fired=event_time_fired)
def test_from_event_to_delete_state(): """Test converting deleting state event to db state.""" event = ha.Event( EVENT_STATE_CHANGED, { "entity_id": "sensor.temperature", "old_state": ha.State("sensor.temperature", "18"), "new_state": None, }, ) db_state = States.from_event(event) assert db_state.entity_id == "sensor.temperature" assert db_state.state == "" assert db_state.last_changed == event.time_fired assert db_state.last_updated == event.time_fired
def test_from_event_to_db_state(): """Test converting event to db state.""" state = ha.State("sensor.temperature", "18") event = ha.Event( EVENT_STATE_CHANGED, { "entity_id": "sensor.temperature", "old_state": None, "new_state": state }, context=state.context, ) # We don't restore context unless we need it by joining the # events table on the event_id for state_changed events state.context = ha.Context(id=None) assert state == States.from_event(event).to_native()
def test_home_assistant_start(self): """Test if HA start is not filtered or converted into a restart.""" entity_id = 'switch.bla' pointA = dt_util.utcnow() entries = list(logbook.humanify(self.hass, ( ha.Event(EVENT_HOMEASSISTANT_START), self.create_state_changed_event(pointA, entity_id, 10) ))) self.assertEqual(2, len(entries)) self.assert_entry( entries[0], name='Home Assistant', message='started', domain=ha.DOMAIN) self.assert_entry(entries[1], pointA, 'bla', domain='switch', entity_id=entity_id)