Exemple #1
0
    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)
Exemple #2
0
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
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
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
Exemple #6
0
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
Exemple #7
0
    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)
Exemple #8
0
    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)
Exemple #9
0
    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)
Exemple #11
0
    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)
Exemple #12
0
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'
Exemple #13
0
 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()
Exemple #14
0
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)
Exemple #17
0
    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
Exemple #18
0
    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)
Exemple #19
0
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'
Exemple #20
0
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"
Exemple #22
0
    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)
Exemple #23
0
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()
Exemple #24
0
    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())
Exemple #25
0
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
Exemple #26
0
    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)
Exemple #28
0
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()
Exemple #30
0
    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)