diff --git a/.gitignore b/.gitignore index ec8fbb301ae..af2fb1769b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ config/* !config/home-assistant.conf.default homeassistant/components/http/www_static/polymer/bower_components/* +homeassistant/components/http/www_static/polymer/build.htm # There is not a better solution afaik.. !config/custom_components diff --git a/homeassistant/components/http/__init__.py b/homeassistant/components/http/__init__.py index 6c06283a336..b5bf8900356 100644 --- a/homeassistant/components/http/__init__.py +++ b/homeassistant/components/http/__init__.py @@ -190,6 +190,7 @@ class RequestHandler(BaseHTTPRequestHandler): PATHS = [ # debug interface ('GET', URL_ROOT, '_handle_get_root'), + ('POST', URL_ROOT, '_handle_get_root'), # /api - for validation purposes ('GET', rem.URL_API, '_handle_get_api'), @@ -236,6 +237,9 @@ class RequestHandler(BaseHTTPRequestHandler): """ Does some common checks and calls appropriate method. """ url = urlparse(self.path) + if url.path.startswith('/api/'): + self.use_json = True + # Read query input data = parse_qs(url.query) @@ -248,14 +252,19 @@ class RequestHandler(BaseHTTPRequestHandler): if content_length: body_content = self.rfile.read(content_length).decode("UTF-8") - try: - data.update(json.loads(body_content)) - except ValueError: - self.server.logger.exception( - "Exception parsing JSON: {}".format(body_content)) - self.send_response(HTTP_UNPROCESSABLE_ENTITY) - return + if self.use_json: + try: + data.update(json.loads(body_content)) + except ValueError: + self.server.logger.exception( + "Exception parsing JSON: {}".format(body_content)) + + self.send_response(HTTP_UNPROCESSABLE_ENTITY) + return + else: + data.update({key: value[-1] for key, value in + parse_qs(body_content).items()}) api_password = self.headers.get(rem.AUTH_HEADER) @@ -265,9 +274,6 @@ class RequestHandler(BaseHTTPRequestHandler): if '_METHOD' in data: method = data.pop('_METHOD') - if url.path.startswith('/api/'): - self.use_json = True - # Var to keep track if we found a path that matched a handler but # the method was different path_matched_but_not_method = False @@ -342,22 +348,19 @@ class RequestHandler(BaseHTTPRequestHandler): self.wfile.write(( "" "Home Assistant" - "" "" "" "" "" - "
" - "
" + "
" + "" - "" - "" + "" "" "
" @@ -375,208 +378,23 @@ class RequestHandler(BaseHTTPRequestHandler): self.send_header('Content-type', 'text/html; charset=utf-8') self.end_headers() + # TODO let's be able to switch this based on env + app_url = "build.htm" if False else "home-assistant-main.html" + write(("" "Home Assistant" - "" "" "" - "" + "" + "" "" - "" - "
" - "")) - - # Flash message support - if self.server.flash_message: - write(("
" - "
" - "{}
").format(self.server.flash_message)) - - self.server.flash_message = None - - # Describe state machine: - write(("
" - "
" - "
" - "

" - " States

" - "
" - "" - "" - "" - "" - "").format(self.server.api_password)) - - for state in \ - sorted(self.server.hass.states.all(), - key=lambda item: item.entity_id.lower()): - - domain = util.split_entity_id(state.entity_id)[0] - - attributes = "
".join( - "{}: {}".format(attr, val) - for attr, val in state.attributes.items()) - - write("".format( - attributes, util.datetime_to_str(state.last_changed))) - - # Change state form - write(("" - "" - "" - "" - - "
Entity IDStateAttributesLast Changed
{}{}{}".format( - _get_domain_icon(domain), state.entity_id, state.state)) - - if state.state == STATE_ON or state.state == STATE_OFF: - if state.state == STATE_ON: - action = SERVICE_TURN_OFF - else: - action = SERVICE_TURN_ON - - write(("").format(action, state.entity_id)) - - write("{}{}
" - - "
")) - - # Describe bus/services: - write(("
" - "
" - "
" - "

" - " Services

" - "" - "")) - - for domain, services in sorted( - self.server.hass.services.services.items()): - write("") - - write(("
DomainService
{}{}".format( - _get_domain_icon(domain), domain)) - - write(", ".join( - "{1}".format( - domain, service) for service in sorted(services))) - - write("
" - - "
" - "
" - "

" - " Call Service

" - "
" - "
" - "" - - "
" - " " - "
" - " " - "
" - "
" - - "
" - " " - "
" - " " - "
" - "
" - - "
" - " " - "
" - " " - "
" - "
" - - "
" - "
" - " " - "
" - "
" - "
" - "
" - "
").format(self.server.api_password)) - - # Describe bus/events: - write(("
" - "
" - "
" - "

" - " Events

" - "" - "")) - - for event, listener_count in sorted( - self.server.hass.bus.listeners.items()): - write("".format( - event, listener_count)) - - write(("
EventListeners
{}{}
" - - "
" - "
" - "

" - " Fire Event

" - "
" - "
" - "" - - "
" - " " - "
" - " " - "
" - "
" - - "
" - " " - "
" - " " - "
" - "
" - - "
" - "
" - " " - "
" - "
" - "
" - "
" - "
").format(self.server.api_password)) - - write("
") + "" + "" + "").format(app_url, self.server.api_password)) # pylint: disable=unused-argument def _handle_get_api(self, path_match, data): diff --git a/homeassistant/components/http/www_static/polymer/bower.json b/homeassistant/components/http/www_static/polymer/bower.json index f83f815face..c75a94dc894 100644 --- a/homeassistant/components/http/www_static/polymer/bower.json +++ b/homeassistant/components/http/www_static/polymer/bower.json @@ -25,6 +25,10 @@ "paper-toast": "Polymer/paper-toast#~0.4.2", "paper-dialog": "Polymer/paper-dialog#~0.4.2", "paper-button": "Polymer/paper-button#~0.4.2", - "core-tooltip": "Polymer/core-tooltip#~0.4.2" + "core-tooltip": "Polymer/core-tooltip#~0.4.2", + "moment": "~2.8.3", + "paper-input": "Polymer/paper-input#~0.4.2", + "core-menu": "Polymer/core-menu#~0.4.2", + "core-item": "Polymer/core-item#~0.4.2" } } diff --git a/homeassistant/components/http/www_static/polymer/index.htm b/homeassistant/components/http/www_static/polymer/index.htm new file mode 100644 index 00000000000..57eb29f3057 --- /dev/null +++ b/homeassistant/components/http/www_static/polymer/index.htm @@ -0,0 +1,15 @@ + + + + + + + + + + +