diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 7b5a0f1980ff..b366e24b0379 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,3 +1,5 @@
+Feature requests should go in the forum: https://community.home-assistant.io/c/feature-requests
+
**Home Assistant release (`hass --version`):**
diff --git a/.gitignore b/.gitignore
index 1e79f07b6630..e7d64517e172 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,5 @@
config/*
!config/home-assistant.conf.default
-homeassistant/components/frontend/www_static/polymer/bower_components/*
# There is not a better solution afaik..
!config/custom_components
diff --git a/config/configuration.yaml.example b/config/configuration.yaml.example
index fae945b05e47..899134b71a74 100644
--- a/config/configuration.yaml.example
+++ b/config/configuration.yaml.example
@@ -1,9 +1,9 @@
homeassistant:
- # Omitted values in this section will be auto detected using freegeoip.net
+ # Omitted values in this section will be auto detected using freegeoip.io
# Location required to calculate the time the sun rises and sets.
- # Cooridinates are also used for location for weather related components.
- # Google Maps can be used to determine more precise GPS cooridinates.
+ # Coordinates are also used for location for weather related components.
+ # Google Maps can be used to determine more precise GPS coordinates.
latitude: 32.87336
longitude: 117.22743
diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py
index a7476162265c..2ba0681c2d65 100644
--- a/homeassistant/bootstrap.py
+++ b/homeassistant/bootstrap.py
@@ -22,6 +22,7 @@ from homeassistant.const import (
CONF_CUSTOMIZE, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME,
CONF_TEMPERATURE_UNIT, CONF_TIME_ZONE, EVENT_COMPONENT_LOADED,
TEMP_CELCIUS, TEMP_FAHRENHEIT, PLATFORM_FORMAT, __version__)
+from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import (
event_decorators, service, config_per_platform, extract_domain_configs)
from homeassistant.helpers.entity import Entity
@@ -293,7 +294,10 @@ def from_config_file(config_path, hass=None, verbose=False, daemon=False,
enable_logging(hass, verbose, daemon, log_rotate_days)
- config_dict = config_util.load_yaml_config_file(config_path)
+ try:
+ config_dict = config_util.load_yaml_config_file(config_path)
+ except HomeAssistantError:
+ return None
return from_config_dict(config_dict, hass, enable_log=False,
skip_pip=skip_pip)
diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py
index f70da3d54ecb..e3bde441211d 100644
--- a/homeassistant/components/alarm_control_panel/__init__.py
+++ b/homeassistant/components/alarm_control_panel/__init__.py
@@ -12,6 +12,7 @@ from homeassistant.const import (
ATTR_CODE, ATTR_CODE_FORMAT, ATTR_ENTITY_ID, SERVICE_ALARM_TRIGGER,
SERVICE_ALARM_DISARM, SERVICE_ALARM_ARM_HOME, SERVICE_ALARM_ARM_AWAY)
from homeassistant.config import load_yaml_config_file
+from homeassistant.helpers.config_validation import PLATFORM_SCHEMA # noqa
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent
diff --git a/homeassistant/components/alarm_control_panel/mqtt.py b/homeassistant/components/alarm_control_panel/mqtt.py
index 0e86e0df8757..3bc7b860869a 100644
--- a/homeassistant/components/alarm_control_panel/mqtt.py
+++ b/homeassistant/components/alarm_control_panel/mqtt.py
@@ -6,43 +6,55 @@ https://home-assistant.io/components/alarm_control_panel.mqtt/
"""
import logging
+import voluptuous as vol
+
import homeassistant.components.alarm_control_panel as alarm
import homeassistant.components.mqtt as mqtt
from homeassistant.const import (
STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED,
- STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, STATE_UNKNOWN)
+ STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, STATE_UNKNOWN,
+ CONF_NAME)
+from homeassistant.components.mqtt import (
+ CONF_STATE_TOPIC, CONF_COMMAND_TOPIC, CONF_QOS)
+import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
-DEFAULT_NAME = "MQTT Alarm"
-DEFAULT_QOS = 0
-DEFAULT_PAYLOAD_DISARM = "DISARM"
-DEFAULT_PAYLOAD_ARM_HOME = "ARM_HOME"
-DEFAULT_PAYLOAD_ARM_AWAY = "ARM_AWAY"
-
DEPENDENCIES = ['mqtt']
+CONF_PAYLOAD_DISARM = 'payload_disarm'
+CONF_PAYLOAD_ARM_HOME = 'payload_arm_home'
+CONF_PAYLOAD_ARM_AWAY = 'payload_arm_away'
+CONF_CODE = 'code'
+
+DEFAULT_NAME = "MQTT Alarm"
+DEFAULT_DISARM = "DISARM"
+DEFAULT_ARM_HOME = "ARM_HOME"
+DEFAULT_ARM_AWAY = "ARM_AWAY"
+
+PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({
+ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
+ vol.Required(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic,
+ vol.Required(CONF_COMMAND_TOPIC): mqtt.valid_publish_topic,
+ vol.Optional(CONF_PAYLOAD_DISARM, default=DEFAULT_DISARM): cv.string,
+ vol.Optional(CONF_PAYLOAD_ARM_HOME, default=DEFAULT_ARM_HOME): cv.string,
+ vol.Optional(CONF_PAYLOAD_ARM_AWAY, default=DEFAULT_ARM_AWAY): cv.string,
+ vol.Optional(CONF_CODE): cv.string,
+})
+
def setup_platform(hass, config, add_devices, discovery_info=None):
"""Setup the MQTT platform."""
- if config.get('state_topic') is None:
- _LOGGER.error("Missing required variable: state_topic")
- return False
-
- if config.get('command_topic') is None:
- _LOGGER.error("Missing required variable: command_topic")
- return False
-
add_devices([MqttAlarm(
hass,
- config.get('name', DEFAULT_NAME),
- config.get('state_topic'),
- config.get('command_topic'),
- config.get('qos', DEFAULT_QOS),
- config.get('payload_disarm', DEFAULT_PAYLOAD_DISARM),
- config.get('payload_arm_home', DEFAULT_PAYLOAD_ARM_HOME),
- config.get('payload_arm_away', DEFAULT_PAYLOAD_ARM_AWAY),
- config.get('code'))])
+ config[CONF_NAME],
+ config[CONF_STATE_TOPIC],
+ config[CONF_COMMAND_TOPIC],
+ config[CONF_QOS],
+ config[CONF_PAYLOAD_DISARM],
+ config[CONF_PAYLOAD_ARM_HOME],
+ config[CONF_PAYLOAD_ARM_AWAY],
+ config.get(CONF_CODE))])
# pylint: disable=too-many-arguments, too-many-instance-attributes
@@ -62,7 +74,7 @@ class MqttAlarm(alarm.AlarmControlPanel):
self._payload_disarm = payload_disarm
self._payload_arm_home = payload_arm_home
self._payload_arm_away = payload_arm_away
- self._code = str(code) if code else None
+ self._code = code
def message_received(topic, payload, qos):
"""A new MQTT message has been received."""
diff --git a/homeassistant/components/automation/mqtt.py b/homeassistant/components/automation/mqtt.py
index db63d81e54b3..db0c1be7c2a2 100644
--- a/homeassistant/components/automation/mqtt.py
+++ b/homeassistant/components/automation/mqtt.py
@@ -4,26 +4,29 @@ Offer MQTT listening automation rules.
For more details about this automation rule, please refer to the documentation
at https://home-assistant.io/components/automation/#mqtt-trigger
"""
-import logging
+import voluptuous as vol
import homeassistant.components.mqtt as mqtt
+from homeassistant.const import CONF_PLATFORM
+import homeassistant.helpers.config_validation as cv
DEPENDENCIES = ['mqtt']
CONF_TOPIC = 'topic'
CONF_PAYLOAD = 'payload'
+TRIGGER_SCHEMA = vol.Schema({
+ vol.Required(CONF_PLATFORM): mqtt.DOMAIN,
+ vol.Required(CONF_TOPIC): mqtt.valid_subscribe_topic,
+ vol.Optional(CONF_PAYLOAD): cv.string,
+})
+
def trigger(hass, config, action):
"""Listen for state changes based on configuration."""
- topic = config.get(CONF_TOPIC)
+ topic = config[CONF_TOPIC]
payload = config.get(CONF_PAYLOAD)
- if topic is None:
- logging.getLogger(__name__).error(
- "Missing configuration key %s", CONF_TOPIC)
- return False
-
def mqtt_automation_listener(msg_topic, msg_payload, qos):
"""Listen for MQTT messages."""
if payload is None or payload == msg_payload:
diff --git a/homeassistant/components/binary_sensor/mqtt.py b/homeassistant/components/binary_sensor/mqtt.py
index 88cbceccc457..a381305691a5 100644
--- a/homeassistant/components/binary_sensor/mqtt.py
+++ b/homeassistant/components/binary_sensor/mqtt.py
@@ -6,43 +6,50 @@ https://home-assistant.io/components/binary_sensor.mqtt/
"""
import logging
+import voluptuous as vol
+
import homeassistant.components.mqtt as mqtt
from homeassistant.components.binary_sensor import (BinarySensorDevice,
SENSOR_CLASSES)
-from homeassistant.const import CONF_VALUE_TEMPLATE
+from homeassistant.const import CONF_NAME, CONF_VALUE_TEMPLATE
+from homeassistant.components.mqtt import CONF_STATE_TOPIC, CONF_QOS
from homeassistant.helpers import template
+import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
+DEPENDENCIES = ['mqtt']
+
+CONF_SENSOR_CLASS = 'sensor_class'
+CONF_PAYLOAD_ON = 'payload_on'
+CONF_PAYLOAD_OFF = 'payload_off'
+
DEFAULT_NAME = 'MQTT Binary sensor'
-DEFAULT_QOS = 0
DEFAULT_PAYLOAD_ON = 'ON'
DEFAULT_PAYLOAD_OFF = 'OFF'
-DEPENDENCIES = ['mqtt']
+PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({
+ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
+ vol.Optional(CONF_SENSOR_CLASS, default=None):
+ vol.Any(vol.In(SENSOR_CLASSES), vol.SetTo(None)),
+ vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string,
+ vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string,
+})
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None):
"""Add MQTT binary sensor."""
- if config.get('state_topic') is None:
- _LOGGER.error('Missing required variable: state_topic')
- return False
-
- sensor_class = config.get('sensor_class')
- if sensor_class not in SENSOR_CLASSES:
- _LOGGER.warning('Unknown sensor class: %s', sensor_class)
- sensor_class = None
-
add_devices([MqttBinarySensor(
hass,
- config.get('name', DEFAULT_NAME),
- config.get('state_topic', None),
- sensor_class,
- config.get('qos', DEFAULT_QOS),
- config.get('payload_on', DEFAULT_PAYLOAD_ON),
- config.get('payload_off', DEFAULT_PAYLOAD_OFF),
- config.get(CONF_VALUE_TEMPLATE))])
+ config[CONF_NAME],
+ config[CONF_STATE_TOPIC],
+ config[CONF_SENSOR_CLASS],
+ config[CONF_QOS],
+ config[CONF_PAYLOAD_ON],
+ config[CONF_PAYLOAD_OFF],
+ config.get(CONF_VALUE_TEMPLATE)
+ )])
# pylint: disable=too-many-arguments, too-many-instance-attributes
diff --git a/homeassistant/components/demo.py b/homeassistant/components/demo.py
index 1d3916844651..0570d20c262a 100644
--- a/homeassistant/components/demo.py
+++ b/homeassistant/components/demo.py
@@ -136,7 +136,7 @@ def setup(hass, config):
'Home Alone']},
'who_cooks': {'icon': 'mdi:panda',
'initial': 'Anne Therese',
- 'name': 'Who cooks today',
+ 'name': 'Cook today',
'options': ['Paulus', 'Anne Therese']}}})
# Set up input boolean
bootstrap.setup_component(
@@ -144,6 +144,11 @@ def setup(hass, config):
{'input_boolean': {'notify': {'icon': 'mdi:car',
'initial': False,
'name': 'Notify Anne Therese is home'}}})
+ # Set up weblink
+ bootstrap.setup_component(
+ hass, 'weblink',
+ {'weblink': {'entities': [{'name': 'Router',
+ 'url': 'http://192.168.1.1'}]}})
# Setup configurator
configurator_ids = []
diff --git a/homeassistant/components/device_tracker/__init__.py b/homeassistant/components/device_tracker/__init__.py
index 240ac532e5c8..1866e972e280 100644
--- a/homeassistant/components/device_tracker/__init__.py
+++ b/homeassistant/components/device_tracker/__init__.py
@@ -204,6 +204,7 @@ class DeviceTracker(object):
return
# If no device can be found, create it
+ dev_id = util.ensure_unique_string(dev_id, self.devices.keys())
device = Device(
self.hass, self.consider_home, self.home_range, self.track_new,
dev_id, mac, (host_name or dev_id).replace('_', ' '))
diff --git a/homeassistant/components/device_tracker/mqtt.py b/homeassistant/components/device_tracker/mqtt.py
index d754156f2173..0998e2278577 100644
--- a/homeassistant/components/device_tracker/mqtt.py
+++ b/homeassistant/components/device_tracker/mqtt.py
@@ -6,28 +6,27 @@ https://home-assistant.io/components/device_tracker.mqtt/
"""
import logging
+import voluptuous as vol
+
import homeassistant.components.mqtt as mqtt
-from homeassistant import util
+from homeassistant.components.mqtt import CONF_QOS
+import homeassistant.helpers.config_validation as cv
DEPENDENCIES = ['mqtt']
-CONF_QOS = 'qos'
CONF_DEVICES = 'devices'
-DEFAULT_QOS = 0
-
_LOGGER = logging.getLogger(__name__)
+PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({
+ vol.Required(CONF_DEVICES): {cv.string: mqtt.valid_subscribe_topic},
+})
+
def setup_scanner(hass, config, see):
"""Setup the MQTT tracker."""
- devices = config.get(CONF_DEVICES)
- qos = util.convert(config.get(CONF_QOS), int, DEFAULT_QOS)
-
- if not isinstance(devices, dict):
- _LOGGER.error('Expected %s to be a dict, found %s', CONF_DEVICES,
- devices)
- return False
+ devices = config[CONF_DEVICES]
+ qos = config[CONF_QOS]
dev_id_lookup = {}
diff --git a/homeassistant/components/device_tracker/netgear.py b/homeassistant/components/device_tracker/netgear.py
index 6b0cbc5f465f..b20e5aae60e6 100644
--- a/homeassistant/components/device_tracker/netgear.py
+++ b/homeassistant/components/device_tracker/netgear.py
@@ -9,14 +9,15 @@ import threading
from datetime import timedelta
from homeassistant.components.device_tracker import DOMAIN
-from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
+from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, \
+ CONF_PORT
from homeassistant.util import Throttle
# Return cached results if last scan was less then this time ago.
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
-REQUIREMENTS = ['pynetgear==0.3.2']
+REQUIREMENTS = ['pynetgear==0.3.3']
def get_scanner(hass, config):
@@ -25,12 +26,13 @@ def get_scanner(hass, config):
host = info.get(CONF_HOST)
username = info.get(CONF_USERNAME)
password = info.get(CONF_PASSWORD)
+ port = info.get(CONF_PORT)
if password is not None and host is None:
_LOGGER.warning('Found username or password but no host')
return None
- scanner = NetgearDeviceScanner(host, username, password)
+ scanner = NetgearDeviceScanner(host, username, password, port)
return scanner if scanner.success_init else None
@@ -38,7 +40,7 @@ def get_scanner(hass, config):
class NetgearDeviceScanner(object):
"""Queries a Netgear wireless router using the SOAP-API."""
- def __init__(self, host, username, password):
+ def __init__(self, host, username, password, port):
"""Initialize the scanner."""
import pynetgear
@@ -49,8 +51,10 @@ class NetgearDeviceScanner(object):
self._api = pynetgear.Netgear()
elif username is None:
self._api = pynetgear.Netgear(password, host)
- else:
+ elif port is None:
self._api = pynetgear.Netgear(password, host, username)
+ else:
+ self._api = pynetgear.Netgear(password, host, username, port)
_LOGGER.info("Logging in")
diff --git a/homeassistant/components/device_tracker/owntracks.py b/homeassistant/components/device_tracker/owntracks.py
index 0c67bb123b0d..eb41aec1ebc7 100644
--- a/homeassistant/components/device_tracker/owntracks.py
+++ b/homeassistant/components/device_tracker/owntracks.py
@@ -80,6 +80,11 @@ def setup_scanner(hass, config, see):
if not isinstance(data, dict) or data.get('_type') != 'transition':
return
+ if data.get('desc') is None:
+ _LOGGER.error(
+ "Location missing from `enter/exit` message - "
+ "please turn `Share` on in OwnTracks app")
+ return
# OwnTracks uses - at the start of a beacon zone
# to switch on 'hold mode' - ignore this
location = data['desc'].lstrip("-")
diff --git a/homeassistant/components/discovery.py b/homeassistant/components/discovery.py
index 7daf513316e9..f03fdf35929d 100644
--- a/homeassistant/components/discovery.py
+++ b/homeassistant/components/discovery.py
@@ -15,7 +15,7 @@ from homeassistant.const import (
EVENT_PLATFORM_DISCOVERED)
DOMAIN = "discovery"
-REQUIREMENTS = ['netdisco==0.6.1']
+REQUIREMENTS = ['netdisco==0.6.2']
SCAN_INTERVAL = 300 # seconds
diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py
index 26b08432ae6f..f923e425cbef 100644
--- a/homeassistant/components/frontend/version.py
+++ b/homeassistant/components/frontend/version.py
@@ -1,2 +1,2 @@
"""DO NOT MODIFY. Auto-generated by build_frontend script."""
-VERSION = "45956327284e66953bfbed5d172928b8"
+VERSION = "7baf9a2bf8d94448eeaa6a1ceaf8464e"
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/COPYRIGHT.txt b/homeassistant/components/frontend/www_static/fonts/roboto/COPYRIGHT.txt
new file mode 100644
index 000000000000..a7ef69930cbf
--- /dev/null
+++ b/homeassistant/components/frontend/www_static/fonts/roboto/COPYRIGHT.txt
@@ -0,0 +1 @@
+Copyright 2011 Google Inc. All Rights Reserved.
\ No newline at end of file
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/DESCRIPTION.en_us.html b/homeassistant/components/frontend/www_static/fonts/roboto/DESCRIPTION.en_us.html
new file mode 100644
index 000000000000..3a6834fd4c46
--- /dev/null
+++ b/homeassistant/components/frontend/www_static/fonts/roboto/DESCRIPTION.en_us.html
@@ -0,0 +1,17 @@
+
Roboto has a dual nature. It has a mechanical skeleton and the forms are
+largely geometric. At the same time, the font features friendly and open
+curves. While some grotesks distort their letterforms to force a rigid rhythm,
+Roboto doesn’t compromise, allowing letters to be settled into their natural
+width. This makes for a more natural reading rhythm more commonly found in
+humanist and serif types.
+
+
This is the normal family, which can be used alongside the
+Roboto Condensed family and the
+Roboto Slab family.
+
+
+Updated January 14 2015:
+Christian Robertson and the Material Design team unveiled the latest version of Roboto at Google I/O last year, and it is now available from Google Fonts.
+Existing websites using Roboto via Google Fonts will start using the latest version automatically.
+If you have installed the fonts on your computer, please download them again and re-install.
+
\ No newline at end of file
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/LICENSE.txt b/homeassistant/components/frontend/www_static/fonts/roboto/LICENSE.txt
new file mode 100644
index 000000000000..d64569567334
--- /dev/null
+++ b/homeassistant/components/frontend/www_static/fonts/roboto/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/METADATA.json b/homeassistant/components/frontend/www_static/fonts/roboto/METADATA.json
new file mode 100644
index 000000000000..061bc67688be
--- /dev/null
+++ b/homeassistant/components/frontend/www_static/fonts/roboto/METADATA.json
@@ -0,0 +1,129 @@
+{
+ "name": "Roboto",
+ "designer": "Christian Robertson",
+ "license": "Apache2",
+ "visibility": "External",
+ "category": "Sans Serif",
+ "size": 86523,
+ "fonts": [
+ {
+ "name": "Roboto",
+ "style": "normal",
+ "weight": 100,
+ "filename": "Roboto-Thin.ttf",
+ "postScriptName": "Roboto-Thin",
+ "fullName": "Roboto Thin",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "italic",
+ "weight": 100,
+ "filename": "Roboto-ThinItalic.ttf",
+ "postScriptName": "Roboto-ThinItalic",
+ "fullName": "Roboto Thin Italic",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "normal",
+ "weight": 300,
+ "filename": "Roboto-Light.ttf",
+ "postScriptName": "Roboto-Light",
+ "fullName": "Roboto Light",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "italic",
+ "weight": 300,
+ "filename": "Roboto-LightItalic.ttf",
+ "postScriptName": "Roboto-LightItalic",
+ "fullName": "Roboto Light Italic",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "normal",
+ "weight": 400,
+ "filename": "Roboto-Regular.ttf",
+ "postScriptName": "Roboto-Regular",
+ "fullName": "Roboto",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "italic",
+ "weight": 400,
+ "filename": "Roboto-Italic.ttf",
+ "postScriptName": "Roboto-Italic",
+ "fullName": "Roboto Italic",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "normal",
+ "weight": 500,
+ "filename": "Roboto-Medium.ttf",
+ "postScriptName": "Roboto-Medium",
+ "fullName": "Roboto Medium",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "italic",
+ "weight": 500,
+ "filename": "Roboto-MediumItalic.ttf",
+ "postScriptName": "Roboto-MediumItalic",
+ "fullName": "Roboto Medium Italic",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "normal",
+ "weight": 700,
+ "filename": "Roboto-Bold.ttf",
+ "postScriptName": "Roboto-Bold",
+ "fullName": "Roboto Bold",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "italic",
+ "weight": 700,
+ "filename": "Roboto-BoldItalic.ttf",
+ "postScriptName": "Roboto-BoldItalic",
+ "fullName": "Roboto Bold Italic",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "normal",
+ "weight": 900,
+ "filename": "Roboto-Black.ttf",
+ "postScriptName": "Roboto-Black",
+ "fullName": "Roboto Black",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto",
+ "style": "italic",
+ "weight": 900,
+ "filename": "Roboto-BlackItalic.ttf",
+ "postScriptName": "Roboto-BlackItalic",
+ "fullName": "Roboto Black Italic",
+ "copyright": "Copyright 2011 Google Inc. All Rights Reserved."
+ }
+ ],
+ "subsets": [
+ "cyrillic",
+ "cyrillic-ext",
+ "greek",
+ "greek-ext",
+ "latin",
+ "latin-ext",
+ "menu",
+ "vietnamese"
+ ],
+ "dateAdded": "2013-01-09"
+}
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Black.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Black.ttf
new file mode 100644
index 000000000000..fbde625d403c
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Black.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-BlackItalic.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-BlackItalic.ttf
new file mode 100644
index 000000000000..60f7782a2e4a
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-BlackItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Bold.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Bold.ttf
new file mode 100644
index 000000000000..a355c27cde02
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Bold.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-BoldItalic.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-BoldItalic.ttf
new file mode 100644
index 000000000000..3c9a7a37361b
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-BoldItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Italic.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Italic.ttf
new file mode 100644
index 000000000000..ff6046d5bfa7
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Italic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Light.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Light.ttf
new file mode 100644
index 000000000000..94c6bcc67e09
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Light.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-LightItalic.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-LightItalic.ttf
new file mode 100644
index 000000000000..04cc00230202
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-LightItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Medium.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Medium.ttf
new file mode 100644
index 000000000000..39c63d746179
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Medium.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-MediumItalic.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-MediumItalic.ttf
new file mode 100644
index 000000000000..dc743f0a66cf
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-MediumItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Regular.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Regular.ttf
new file mode 100644
index 000000000000..8c082c8de090
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Regular.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Thin.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Thin.ttf
new file mode 100644
index 000000000000..d69555029c3e
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Thin.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-ThinItalic.ttf b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-ThinItalic.ttf
new file mode 100644
index 000000000000..07172ff666ad
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-ThinItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/DESCRIPTION.en_us.html b/homeassistant/components/frontend/www_static/fonts/robotomono/DESCRIPTION.en_us.html
new file mode 100644
index 000000000000..eb6ba3a2e3cc
--- /dev/null
+++ b/homeassistant/components/frontend/www_static/fonts/robotomono/DESCRIPTION.en_us.html
@@ -0,0 +1,17 @@
+
+Roboto Mono is a monospaced addition to the Roboto type family.
+Like the other members of the Roboto family, the fonts are optimized for readability on screens across a wide variety of devices and reading environments.
+While the monospaced version is related to its variable width cousin, it doesn’t hesitate to change forms to better fit the constraints of a monospaced environment.
+For example, narrow glyphs like ‘I’, ‘l’ and ‘i’ have added serifs for more even texture while wider glyphs are adjusted for weight.
+Curved caps like ‘C’ and ‘O’ take on the straighter sides from Roboto Condensed.
+
+
+
+Special consideration is given to glyphs important for reading and writing software source code.
+Letters with similar shapes are easy to tell apart.
+Digit ‘1’, lowercase ‘l’ and capital ‘I’ are easily differentiated as are zero and the letter ‘O’.
+Punctuation important for code has also been considered.
+For example, the curly braces ‘{ }’ have exaggerated points to clearly differentiate them from parenthesis ‘( )’ and braces ‘[ ]’.
+Periods and commas are also exaggerated to identify them more quickly.
+The scale and weight of symbols commonly used as operators have also been optimized.
+
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/LICENSE.txt b/homeassistant/components/frontend/www_static/fonts/robotomono/LICENSE.txt
new file mode 100644
index 000000000000..d64569567334
--- /dev/null
+++ b/homeassistant/components/frontend/www_static/fonts/robotomono/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/METADATA.json b/homeassistant/components/frontend/www_static/fonts/robotomono/METADATA.json
new file mode 100644
index 000000000000..a2a212bfa8f0
--- /dev/null
+++ b/homeassistant/components/frontend/www_static/fonts/robotomono/METADATA.json
@@ -0,0 +1,111 @@
+{
+ "name": "Roboto Mono",
+ "designer": "Christian Robertson",
+ "license": "Apache2",
+ "visibility": "External",
+ "category": "Monospace",
+ "size": 51290,
+ "fonts": [
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-Thin",
+ "fullName": "Roboto Mono Thin",
+ "style": "normal",
+ "weight": 100,
+ "filename": "RobotoMono-Thin.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-ThinItalic",
+ "fullName": "Roboto Mono Thin Italic",
+ "style": "italic",
+ "weight": 100,
+ "filename": "RobotoMono-ThinItalic.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-Light",
+ "fullName": "Roboto Mono Light",
+ "style": "normal",
+ "weight": 300,
+ "filename": "RobotoMono-Light.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-LightItalic",
+ "fullName": "Roboto Mono Light Italic",
+ "style": "italic",
+ "weight": 300,
+ "filename": "RobotoMono-LightItalic.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-Regular",
+ "fullName": "Roboto Mono",
+ "style": "normal",
+ "weight": 400,
+ "filename": "RobotoMono-Regular.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-Italic",
+ "fullName": "Roboto Mono Italic",
+ "style": "italic",
+ "weight": 400,
+ "filename": "RobotoMono-Italic.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-Medium",
+ "fullName": "Roboto Mono Medium",
+ "style": "normal",
+ "weight": 500,
+ "filename": "RobotoMono-Medium.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-MediumItalic",
+ "fullName": "Roboto Mono Medium Italic",
+ "style": "italic",
+ "weight": 500,
+ "filename": "RobotoMono-MediumItalic.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-Bold",
+ "fullName": "Roboto Mono Bold",
+ "style": "normal",
+ "weight": 700,
+ "filename": "RobotoMono-Bold.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ },
+ {
+ "name": "Roboto Mono",
+ "postScriptName": "RobotoMono-BoldItalic",
+ "fullName": "Roboto Mono Bold Italic",
+ "style": "italic",
+ "weight": 700,
+ "filename": "RobotoMono-BoldItalic.ttf",
+ "copyright": "Copyright 2015 Google Inc. All Rights Reserved."
+ }
+ ],
+ "subsets": [
+ "cyrillic",
+ "cyrillic-ext",
+ "greek",
+ "greek-ext",
+ "latin",
+ "latin-ext",
+ "menu",
+ "vietnamese"
+ ],
+ "dateAdded": "2015-05-13"
+}
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Bold.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Bold.ttf
new file mode 100644
index 000000000000..c6a81a570c20
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Bold.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-BoldItalic.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-BoldItalic.ttf
new file mode 100644
index 000000000000..b2261d6649a2
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-BoldItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Italic.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Italic.ttf
new file mode 100644
index 000000000000..6e4001e19678
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Italic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Light.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Light.ttf
new file mode 100644
index 000000000000..5ca4889ebac1
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Light.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-LightItalic.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-LightItalic.ttf
new file mode 100644
index 000000000000..db7c368471cf
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-LightItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Medium.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Medium.ttf
new file mode 100644
index 000000000000..0bcdc740c66c
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Medium.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-MediumItalic.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-MediumItalic.ttf
new file mode 100644
index 000000000000..b4f5e20e3d95
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-MediumItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Regular.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Regular.ttf
new file mode 100644
index 000000000000..495a82ce92ed
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Regular.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Thin.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Thin.ttf
new file mode 100644
index 000000000000..1b5085eed8cc
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-Thin.ttf differ
diff --git a/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-ThinItalic.ttf b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-ThinItalic.ttf
new file mode 100644
index 000000000000..dfa1d139ba84
Binary files /dev/null and b/homeassistant/components/frontend/www_static/fonts/robotomono/RobotoMono-ThinItalic.ttf differ
diff --git a/homeassistant/components/frontend/www_static/frontend.html b/homeassistant/components/frontend/www_static/frontend.html
index 9097e43785e3..c28377696654 100644
--- a/homeassistant/components/frontend/www_static/frontend.html
+++ b/homeassistant/components/frontend/www_static/frontend.html
@@ -1,7 +1,7 @@
-