Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 26 additions & 16 deletions homeassistant/components/history.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,19 @@
from homeassistant.components.http import HomeAssistantView
from homeassistant.const import ATTR_HIDDEN
from homeassistant.components.recorder.util import session_scope, execute
import homeassistant.helpers.config_validation as cv

_LOGGER = logging.getLogger(__name__)

DOMAIN = 'history'
DEPENDENCIES = ['recorder', 'http']

CONF_ORDER = 'use_include_order'

CONFIG_SCHEMA = vol.Schema({
DOMAIN: recorder.FILTER_SCHEMA,
DOMAIN: recorder.FILTER_SCHEMA.extend({
vol.Optional(CONF_ORDER, default=False): cv.boolean,
})
}, extra=vol.ALLOW_EXTRA)

SIGNIFICANT_DOMAINS = ('thermostat', 'climate')
Expand Down Expand Up @@ -242,8 +247,9 @@ def async_setup(hass, config):
if include:
filters.included_entities = include[CONF_ENTITIES]
filters.included_domains = include[CONF_DOMAINS]
use_include_order = config[DOMAIN].get(CONF_ORDER)

hass.http.register_view(HistoryPeriodView(filters))
hass.http.register_view(HistoryPeriodView(filters, use_include_order))
yield from hass.components.frontend.async_register_built_in_panel(
'history', 'history', 'mdi:poll-box')

Expand All @@ -257,9 +263,10 @@ class HistoryPeriodView(HomeAssistantView):
name = 'api:history:view-period'
extra_urls = ['/api/history/period/{datetime}']

def __init__(self, filters):
def __init__(self, filters, use_include_order):
"""Initialize the history period view."""
self.filters = filters
self.use_include_order = use_include_order

@asyncio.coroutine
def get(self, request, datetime=None):
Expand Down Expand Up @@ -305,19 +312,22 @@ def get(self, request, datetime=None):
_LOGGER.debug(
'Extracted %d states in %fs', sum(map(len, result)), elapsed)

# Reorder the result to respect the ordering given by any
# entities explicitly included in the configuration.

sorted_result = []
for order_entity in self.filters.included_entities:
for state_list in result:
if state_list[0].entity_id == order_entity:
sorted_result.append(state_list)
result.remove(state_list)
break
sorted_result.extend(result)

return self.json(sorted_result)
# Optionally reorder the result to respect the ordering given
# by any entities explicitly included in the configuration.

if self.use_include_order:
result = list(result)
sorted_result = []
for order_entity in self.filters.included_entities:
for state_list in result:
if state_list[0].entity_id == order_entity:
sorted_result.append(state_list)
result.remove(state_list)
break
sorted_result.extend(result)
result = sorted_result

return self.json(result)


class Filters(object):
Expand Down