diff --git a/homeassistant/components/logbook.py b/homeassistant/components/logbook.py index c7a403f12ec..b653d0f76f2 100644 --- a/homeassistant/components/logbook.py +++ b/homeassistant/components/logbook.py @@ -12,9 +12,10 @@ from homeassistant.core import State, DOMAIN as HA_DOMAIN from homeassistant.const import ( EVENT_STATE_CHANGED, STATE_HOME, STATE_ON, STATE_OFF, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, HTTP_BAD_REQUEST) +from homeassistant import util import homeassistant.util.dt as dt_util -import homeassistant.components.recorder as recorder -import homeassistant.components.sun as sun +from homeassistant.components import recorder, sun + DOMAIN = "logbook" DEPENDENCIES = ['recorder', 'http'] @@ -25,8 +26,29 @@ QUERY_EVENTS_BETWEEN = """ SELECT * FROM events WHERE time_fired > ? AND time_fired < ? """ +EVENT_LOGBOOK_ENTRY = 'LOGBOOK_ENTRY' + GROUP_BY_MINUTES = 15 +ATTR_NAME = 'name' +ATTR_MESSAGE = 'message' +ATTR_DOMAIN = 'domain' +ATTR_ENTITY_ID = 'entity_id' + + +def log_entry(hass, name, message, domain=None, entity_id=None): + """ Adds an entry to the logbook. """ + data = { + ATTR_NAME: name, + ATTR_MESSAGE: message + } + + if domain is not None: + data[ATTR_DOMAIN] = domain + if entity_id is not None: + data[ATTR_ENTITY_ID] = entity_id + hass.bus.fire(EVENT_LOGBOOK_ENTRY, data) + def setup(hass, config): """ Listens for download events to download files. """ @@ -175,6 +197,20 @@ def humanify(events): event.time_fired, "Home Assistant", action, domain=HA_DOMAIN) + elif event.event_type == EVENT_LOGBOOK_ENTRY: + domain = event.data.get(ATTR_DOMAIN) + entity_id = event.data.get(ATTR_ENTITY_ID) + if domain is None and entity_id is not None: + try: + domain = util.split_entity_id(str(entity_id))[0] + except IndexError: + pass + + yield Entry( + event.time_fired, event.data.get(ATTR_NAME), + event.data.get(ATTR_MESSAGE), domain, + entity_id) + def _entry_message_from_state(domain, state): """ Convert a state to a message for the logbook. """ diff --git a/tests/components/test_logbook.py b/tests/components/test_logbook.py index 16f6ba8aa33..8b394559512 100644 --- a/tests/components/test_logbook.py +++ b/tests/components/test_logbook.py @@ -63,6 +63,25 @@ class TestComponentHistory(unittest.TestCase): entries[0], name='Home Assistant', message='restarted', domain=ha.DOMAIN) + def test_process_custom_logbook_entries(self): + """ Tests if custom log book entries get added as an entry. """ + name = 'Nice name' + message = 'has a custom entry' + entity_id = 'sun.sun' + + entries = list(logbook.humanify(( + ha.Event(logbook.EVENT_LOGBOOK_ENTRY, { + logbook.ATTR_NAME: name, + logbook.ATTR_MESSAGE: message, + logbook.ATTR_ENTITY_ID: entity_id, + }), + ))) + + self.assertEqual(1, len(entries)) + self.assert_entry( + entries[0], name=name, message=message, + domain='sun', entity_id=entity_id) + def assert_entry(self, entry, when=None, name=None, message=None, domain=None, entity_id=None): """ Asserts an entry is what is expected """