Update to site

This commit is contained in:
Paulus Schoutsen 2014-12-21 12:17:37 -08:00
parent 3345fa5897
commit b0bdfe2fe9
244 changed files with 11618 additions and 12 deletions

1
source/CNAME Normal file
View file

@ -0,0 +1 @@
home-assistant.io

View file

@ -0,0 +1,5 @@
{% include disqus.html %}
{% include facebook_like.html %}
{% include google_plus_one.html %}
{% include twitter_sharing.html %}
{% include custom/after_footer.html %}

View file

@ -0,0 +1,8 @@
{% capture category %}{{ post.categories | size }}{% endcapture %}
<h1><a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a></h1>
<time datetime="{{ post.date | datetime | date_to_xmlschema }}" pubdate>{{ post.date | date: "<span class='month'>%b</span> <span class='day'>%d</span> <span class='year'>%Y</span>"}}</time>
{% if category != '0' %}
<footer>
<span class="categories">posted in {{ post.categories | category_links }}</span>
</footer>
{% endif %}

View file

@ -0,0 +1,29 @@
{% unless page.no_header %}
<header>
{% if index %}
<h1 class="entry-title"><a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a></h1>
{% else %}
<h1 class="entry-title">{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %}</h1>
{% endif %}
{% unless page.meta == false %}
<p class="meta">
{% include post/date.html %}{{ time }}
{% if site.disqus_short_name and page.comments != false and post.comments != false and site.disqus_show_comment_count == true %}
| <a href="{% if index %}{{ root_url }}{{ post.url }}{% endif %}#disqus_thread"
data-disqus-identifier="{% if post.meta.disqus_id %}{{ post.meta.disqus_id }}{% else %}{{ site.url }}{{ post.url }}{% endif %}">Comments</a>
{% endif %}
</p>
{% endunless %}
</header>
{% endunless %}
{% if index %}
<div class="entry-content">{{ content | excerpt }}</div>
{% capture excerpted %}{{ content | has_excerpt }}{% endcapture %}
{% if excerpted == 'true' %}
<footer>
<a rel="full-article" href="{{ root_url }}{{ post.url }}">{{ site.excerpt_link }}</a>
</footer>
{% endif %}
{% else %}
<div class="entry-content">{{ content }}</div>
{% endif %}

View file

@ -0,0 +1,15 @@
<aside class="sidebar">
{% if site.simple_search %}
<form action="{{ site.simple_search }}" method="get">
<fieldset role="search">
<input type="hidden" name="q" value="site:{{ site.url | shorthand_url }}" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
{% endif %}
{% if site.blog_index_asides.size %}
{% include_array blog_index_asides %}
{% else %}
{% include_array default_asides %}
{% endif %}
</aside>

View file

@ -0,0 +1,17 @@
{% if site.delicious_user %}
<section class="aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">
Delicious
<small class="pull-right">
<a class="btn" href="//delicious.com/{{ site.delicious_user }}" title="@{{ site.delicious_user }} on Delicious" target="_blank">
<i class="icon-external-link"></i>
</a>
</small>
</h1>
<div id="delicious">
<span class="loading">
<i class="icon-spinner icon-spin"></i>
</span>
</div>
</section>
{% endif %}

View file

@ -0,0 +1,19 @@
{% if site.social.github.user %}
<section id="github-repos" class="aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">
GitHub Repos
{% if site.social.github.show_profile_link or site.github_show_profile_link %}
<small class="pull-right">
<a class="btn" href="//github.com/{{ site.social.github.user }}" title="@{{ site.social.github.user }} on GitHub" target="_blank">
<i class="icon-external-link"></i>
</a>
</small>
{% endif %}
</h1>
<ul id="gh_repos" class="divided">
<li class="loading">
<i class="icon-spinner icon-spin"></i>
</li>
</ul>
</section>
{% endif %}

View file

@ -0,0 +1,3 @@
{% comment %}
This section intentionally blank.
{% endcomment %}

View file

@ -0,0 +1,17 @@
{% if site.pinboard_user %}
<section id="pinboard" class="aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">
My Pinboard
<small class="pull-right">
<a class="btn" href="//pinboard.in/u:{{ site.pinboard_user }}" title="My Pinboard Bookmarks" target="_blank">
<i class="icon-external-link"></i>
</a>
</small>
</h1>
<ul class="divided" id="pinboard_linkroll">
<li class="loading">
<i class="icon-spinner icon-spin"></i>
</li>
</ul>
</section>
{% endif %}

View file

@ -0,0 +1,10 @@
<section id="recent-posts" class="aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">Recent Posts</h1>
<ul class="divided">
{% for post in site.posts limit: site.recent_posts %}
<li class="post">
<a href="{{ root_url }}{{ post.url }}">{{ post.title }}</a>
</li>
{% endfor %}
</ul>
</section>

View file

@ -0,0 +1,19 @@
{% unless site.social.visible == false %}
<section class="social aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">
{% if site.social.title %}{{ site.social.title }}{% else %}Follow me!{% endif %}
</h1>
<ul class="unstyled">
{% if site.social.adn %}<li><a class="adn" rel="me" href="//alpha.app.net/{{ site.social.adn }}"><i class="icon-adn"></i> App.net</a></li>{% endif %}
{% if site.social.dribbble %}<li><a class="dribbble" href="//dribbble.com/{{ site.social.dribbble }}"><i class="icon-dribbble"></i> Dribbble</a></li>{% endif %}
{% if site.social.github.user %}<li><a class="github" href="//github.com/{{ site.social.github.user }}"><i class="icon-github"></i> Github</a></li>{% endif %}
{% if site.social.facebook.user %}<li><a class="facebook" href="//facebook.com/{{ site.social.facebook.user }}"><i class="icon-facebook-sign"></i> Facebook</a></li>{% endif %}
{% if site.social.googleplus %}<li><a class="gplus" href="//plus.google.com/{{ site.social.googleplus }}"><i class="icon-google-plus-sign"></i> Google+</a></li>{% endif %}
{% if site.social.linkedin %}<li><a class="linkedin" href="//linkedin.com/in/{{ site.social.linkedin }}"><i class="icon-linkedin-sign"></i> LinkedIn</a></li>{% endif %}
{% if site.social.pinterest %}<li><a class="pinterest" href="//pinterest.com/{{ site.social.pinterest }}"><i class="icon-pinterest"></i> Pinterest</a></li>{% endif %}
{% if site.social.stackoverflow %}<li><a class="stackoverflow" href="//stackoverflow.com/users/{{ site.social.stackoverflow }}"><i class="icon-stackexchange"></i> StackOverflow</a></li>{% endif %}
{% if site.social.twitter.user %}<li><a class="twitter" href="//twitter.com/{{ site.social.twitter.user }}"><i class="icon-twitter"></i> Twitter</a></li>{% endif %}
{% if site.social.youtube %}<li><a class="youtube" href="//youtube.com/user/{{ site.social.youtube }}"><i class="icon-youtube"></i> YouTube</a></li>{% endif %}
</ul>
</section>
{% endunless %}

View file

@ -0,0 +1,17 @@
{% if site.social.twitter.user and site.social.twitter.widget.is_shown %}
<section id="twitter-timeline" class="aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">
Latest Tweets
{% if site.social.twitter.widget.show_profile_link %}
<small class="pull-right">
<a class="btn" href="//twitter.com/{{ site.social.twitter.user }}" title="@{{ site.social.twitter.user }} on Twitter" target="_blank">
<i class="icon-external-link"></i>
</a>
</small>
{% endif %}
</h1>
<a class="twitter-timeline" data-dnt="true" href="//twitter.com/{{ site.social.twitter.user }}" data-widget-id="{{ site.social.twitter.widget.widget_id }}" data-link-color="#049cdb" data-tweet-limit="{{ site.social.twitter.widget.tweet_count }}" data-chrome="noheader nofooter transparent noscrollbar">Tweets by @{{ site.social.twitter.user }}</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
</section>
{% endif %}

View file

@ -0,0 +1,20 @@
{% capture category %}{{ post.categories | size }}{% endcapture %}
<div class="grid">
<div class="grid__item one-fifth palm-one-whole">
<time datetime="{{ post.date | datetime | date_to_xmlschema }}" pubdate>
{{ post.date | date: "<span class='month'>%b</span> <span class='day'>%d</span>"}}
</time>
</div>
<div class="grid__item four-fifths palm-one-whole">
<h1 class="gamma"><a href="{{ root_url }}{{ post.url }}">{{post.title}}</a></h1>
{% if category != '0' %}
<footer class="meta">
{% include blog/post/tags.html %}
</footer>
{% endif %}
<hr class="divider">
</div>
</div>

View file

@ -0,0 +1,32 @@
<header>
{% if index %}
<h1 class="beta">
<a href="{{ root_url }}{{ post.url }}">{{ post.title }}</a>
</h1>
{% else %}
<h1 class="title indent">{{ page.title }}</h1>
{% endif %}
{% unless post.meta == false %}
<div class="meta clearfix">
{% include blog/post/date.html %}{{ time }}
{% include blog/post/tags.html %}
{% if site.disqus_short_name and page.comments != false and post.comments != false and site.disqus_show_comment_count == true %}
<a class="pull-right" href="{% if index %}{{ site.url }}{{ root_url }}{{ post.url }}{% endif %}#disqus_thread">
Comments <i class="icon-comment"></i>
</a>
{% endif %}
</div>
{% endunless %}
</header>
{% capture excerpted %}{{ content | has_excerpt }}{% endcapture %}
{% if excerpted == 'true' and index %}
<div class="entry-content clearfix">
{{ content | excerpt }}
<a class="btn pull-right" href="{{ root_url }}{{ post.url }}">{{ site.excerpt_link }}</a>
</div>
{% else %}
{{ content }}
{% endif %}

View file

@ -0,0 +1,15 @@
{% capture date %}{{ page.date }}{{ post.date }}{% endcapture %}
{% capture date_formatted %}{{ page.date_formatted }}{{ post.date_formatted }}{% endcapture %}
{% capture has_date %}{{ date | size }}{% endcapture %}
{% capture updated %}{{ page.updated }}{{ post.updated }}{% endcapture %}
{% capture updated_formatted %}{{ page.updated_formatted }}{{ post.updated_formatted }}{% endcapture %}
{% capture was_updated %}{{ updated | size }}{% endcapture %}
{% if has_date != '0' %}
{% capture time %}<time class="pull-left" datetime="{{ date | datetime | date_to_xmlschema }}" pubdate{% if updated %} data-updated="true"{% endif %}><i class="icon-calendar"></i> {{ date_formatted }}</time>{% endcapture %}
{% endif %}
{% if was_updated != '0' %}
{% capture updated %}<time class="pull-left" datetime="{{ updated | datetime | date_to_xmlschema }}" class="updated">Updated {{ updated_formatted }}</time>{% endcapture %}
{% else %}{% assign updated = false %}{% endif %}

View file

@ -0,0 +1 @@
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>

View file

@ -0,0 +1,17 @@
{% capture category %}{% if post %}{{ post.categories | category_links | size }}{% else %}{{ page.categories | category_links | size }}{% endif %}{% endcapture %}
{% unless category == '0' %}
<div class="pull-left">
<i class="icon-tags"></i>
<ul class="tags unstyled">
{% if post %}
{% for item in post.categories %}
<li>{{ item | category_link }}</li>
{% endfor %}
{% else %}
{% for item in page.categories %}
<li>{{ item | category_link }}</li>
{% endfor %}
{% endif %}
</ul>
</div>
{% endunless %}

View file

@ -0,0 +1,24 @@
{% comment %}
Add content to be output at the bottom of each page. (You might use this for analytics scripts, for example)
{% endcomment %}
<script>
$(document).ready(function() {
var stickyNavTop = $('nav').offset().top;
var stickyNav = function(){
var scrollTop = $(window).scrollTop();
if (scrollTop > stickyNavTop) {
$('nav').addClass('sticky');
} else {
$('nav').removeClass('sticky');
}
};
stickyNav();
$(window).scroll(function() {
stickyNav();
});
});
</script>

View file

@ -0,0 +1,4 @@
<section>
<h1>About Me</h1>
<p>A little something about me.</p>
</section>

View file

@ -0,0 +1,26 @@
---
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[{{ page.title }} | {{ site.title }}]]></title>
<link href="{{ site.url }}/{{ page.feed_url }}" rel="self"/>
<link href="{{ site.url }}/"/>
<updated>{{ site.time | date_to_xmlschema }}</updated>
<id>{{ site.url }}/</id>
<author>
<name><![CDATA[{{ site.author | strip_html }}]]></name>
{% if site.email %}<email><![CDATA[{{ site.email }}]]></email>{% endif %}
</author>
<generator uri="http://octopress.org/">Octopress</generator>
{% for post in site.categories[page.category] limit: 5 %}
<entry>
<title type="html"><![CDATA[{{ post.title | cdata_escape }}]]></title>
<link href="{{ site.url }}{{ post.url }}"/>
<updated>{{ post.date | date_to_xmlschema }}</updated>
<id>{{ site.url }}{{ post.id }}</id>
<content type="html"><![CDATA[{{ post.content | expand_urls: site.url | markdownify | cdata_escape }}]]></content>
</entry>
{% endfor %}
</feed>

View file

@ -0,0 +1,4 @@
<p class="copyright">
All content by {{ site.author }} and licenced under <a href="//creativecommons.org/licenses/by-nc-sa/3.0/ie/">Creative Commons</a>.<br>
Code under <a href="//github.com/coogie/oscailte/blob/master/README.md">MIT Licence</a>. <span class="credit">Site powered by <a href="http://octopress.org">Octopress</a></span>
</p>

View file

@ -0,0 +1,14 @@
<h2 class="title">Observe</h2>
<hr>
<p>
Home Assistant will track the state of all the devices in your home, so you don't have to.
</p>
<p>The following devices are supported:</p>
<ul>
<li>Philips Hue</li>
<li>Belkin WeMo</li>
<li>Google Chromecast</li>
<li>Netgear, Tomato and OpenWRT routers</li>
<li>Tellstick devices &amp; sensors</li>
<li>Scanning network for connected devices</li>
</ul>

View file

@ -0,0 +1,6 @@
<h2 class="title">Control</h2>
<hr>
<p>Control all your devices from a single, mobile-friendly, interface.</p>
<p>
Home Assistant allows you to control all your devices without storing any of your data in the cloud. We like to keep your privacy private.
</p>

View file

@ -0,0 +1,10 @@
<h2 class="title">Automate</h2>
<hr>
<p>Setup advanced rules to control devices and bring your home alive.</p>
<p>Do you want to have&hellip;</p>
<ul>
<li>the lights turn on when the sun sets and you are home?</li>
<li>the lights turn on when anyome comes home and it is dark?</li>
<li>dim the lights when you start watching Netflix on your Chromecast?</li>
</ul>
<p>We've got you covered.</p>

View file

@ -0,0 +1,11 @@
<div class="grid__item three-tenths lap-four-sixths palm-one-whole ha-title">
<a href="{{ root_url }}/" class="site-title">
<img width='40' src='{{ root_url }}/images/favicon-192x192.png'> {{ site.title }}
</a>
</div>
<div class="grid__item seven-tenths lap-two-sixths palm-one-whole">
<nav>
{% include site/navigation.html %}
</nav>
</div>

View file

@ -0,0 +1,7 @@
<ul class="menu pull-right">
<li><a href="{{ root_url }}/getting-started/">Getting started</a></li>
<li><a href="{{ root_url }}/architecture/">Architecture</a></li>
<li><a href="{{ root_url }}/contributing/">Contributing</a></li>
<li><a href="{{ root_url }}/blog/2014/12/18/website-launched/">Blog</a></li>
<li><a href="https://groups.google.com/forum/#!forum/home-assistant-dev">Need help?</a></li>
</ul>

View file

@ -0,0 +1,5 @@
<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
<link href='https://fonts.googleapis.com/css?family=Noto+Serif:400,700' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel='shortcut icon' href='/static/favicon.ico' />
<link rel='icon' type='image/png' href='/static/favicon-192x192.png' sizes='192x192'>

View file

@ -0,0 +1,9 @@
<h1>Awaken your home</h1>
<hr>
<p class="lead">
Home Assistant is an open-source home automation platform running on Python 3. Track and control all devices at home and automate control. Installation in less then a minute.
</p>
<p>
<a href='{{ root_url }}/getting-started' class='btn' style='margin: 0 50px 10px 0;'>Get started</a>
<a href='https://www.github.com/balloob/home-assistant' class='btn'>Browse code on GitHub</a>
</p>

View file

@ -0,0 +1,21 @@
{% comment %} Load script if disquss comments are enabled and `page.comments` is either empty (index) or set to true {% endcomment %}
{% if site.disqus_short_name and page.comments != false %}
<script type="text/javascript">
var disqus_shortname = '{{ site.disqus_short_name }}';
{% if page.comments == true %}
{% comment %} `page.comments` can be only be set to true on pages/posts, so we embed the comments here. {% endcomment %}
// var disqus_developer = 1;
var disqus_identifier = '{{ site.url }}{{ page.url }}';
var disqus_url = '{{ site.url }}{{ page.url }}';
var disqus_script = 'embed.js';
{% else %}
{% comment %} As `page.comments` is empty, we must be on the index page. {% endcomment %}
var disqus_script = 'count.js';
{% endif %}
(function () {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/' + disqus_script;
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
}());
</script>
{% endif %}

View file

@ -0,0 +1,10 @@
{% if site.facebook_like %}
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js#appId=212934732101925&xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
{% endif %}

View file

@ -0,0 +1 @@
{% include custom/footer.html %}

View file

@ -0,0 +1,13 @@
{% if site.google_analytics_tracking_id %}
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '{{ site.google_analytics_tracking_id }}']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
{% endif %}

View file

@ -0,0 +1,9 @@
{% if site.google_plus_one %}
<script type="text/javascript">
(function() {
var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
script.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
})();
</script>
{% endif %}

View file

@ -0,0 +1 @@
{% include custom/header.html %}

View file

@ -0,0 +1,16 @@
{% if site.delicious_user %}
<script src="//feeds.delicious.com/v2/json/{{ site.delicious_user }}?count={{ site.delicious_count }}&amp;sort=date&amp;callback=renderDeliciousLinks"></script>
{% endif %}
{% if site.pinboard_user %}
<script>
var linkroll = 'pinboard_linkroll'; //id target for pinboard list
var pinboard_user = "{{ site.pinboard_user }}"; //id target for pinboard list
var pinboard_count = {{ site.pinboard_count }}; //id target for pinboard list
(function(){
var pinboardInit = document.createElement('script');
pinboardInit.async = true;
pinboardInit.src = '{{ root_url }}/javascripts/pinboard.js';
document.getElementsByTagName('head')[0].appendChild(pinboardInit);
})();
</script>
{% endif %}

View file

@ -0,0 +1,20 @@
{% if site.disqus_short_name and page.comments != false %}
<script>
var disqus_shortname = '{{ site.disqus_short_name }}';
{% if page.comments == true %}
{% comment %} `page.comments` can be only be set to true on pages/posts, so we embed the comments here. {% endcomment %}
// var disqus_developer = 1;
var disqus_identifier = '{{ site.url }}{{ page.url }}';
var disqus_url = '{{ site.url }}{{ page.url }}';
var disqus_script = 'embed.js';
{% else %}
{% comment %} As `page.comments` is empty, we must be on the index page. {% endcomment %}
var disqus_script = 'count.js';
{% endif %}
(function () {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/' + disqus_script;
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
}());
</script>
{% endif %}

View file

@ -0,0 +1,21 @@
{% if site.github_user %}
<script>
$(document).ready(function(){
if (!window.jXHR){
var jxhr = document.createElement('script');
jxhr.type = 'text/javascript';
jxhr.src = '{{ root_url}}/javascripts/libs/jXHR.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jxhr, s);
}
github.showRepos({
user: '{{site.github_user}}',
count: {{site.github_repo_count}},
skip_forks: {{site.github_skip_forks}},
target: '#gh_repos'
});
});
</script>
<script src="{{ root_url }}/javascripts/github.js"></script>
{% endif %}

View file

@ -0,0 +1,8 @@
{% if site.google_analytics_tracking_id %}
<script>
var _gaq=[['_setAccount','{{ site.google_analytics_tracking_id }}'],['_trackPageview']];
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
s.parentNode.insertBefore(g,s)}(document,'script'));
</script>
{% endif %}

View file

@ -0,0 +1,12 @@
{% comment %}
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script defer src="{{ root_url }}/javascripts/octopress.js"></script>
{% endcomment %}
{% include javascripts/google_analytics.html %}
{% include javascripts/disqus.html %}
{% if page.sidebar != false %}
{% include javascripts/github.html %}
{% include javascripts/delicious.html %}
{% endif %}

View file

@ -0,0 +1,19 @@
<ul class="subscription" data-subscription="rss{% if site.subscribe_email %} email{% endif %}">
{% comment %}
<li><a href="{{ site.subscribe_rss }}" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
{% endcomment %}
{% if site.subscribe_email %}
<li><a href="{{ site.subscribe_email }}" rel="subscribe-email" title="subscribe via email">Email</a></li>
{% endif %}
</ul>
{% comment %}
{% if site.simple_search %}
<form action="{{ site.simple_search }}" method="get">
<fieldset role="search">
<input type="hidden" name="q" value="site:{{ site.url | shorthand_url }}" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
{% endif %}
{% endcomment %}
{% include custom/navigation.html %}

View file

@ -0,0 +1,8 @@
{% if post.author %}
{% assign author = post.author %}
{% elsif page.author %}
{% assign author = page.author %}
{% else %}
{% assign author = site.author %}
{% endif %}
{% if author %}<span class="byline author vcard">Posted by <span class="fn">{{ author }}</span></span>{% endif %}

View file

@ -0,0 +1,10 @@
{% capture category %}{% if post %}{{ post.categories | category_links | size }}{% else %}{{ page.categories | category_links | size }}{% endif %}{% endcapture %}
{% unless category == '0' %}
<span class="categories">
{% if post %}
{{ post.categories | category_links }}
{% else %}
{{ page.categories | category_links }}
{% endif %}
</span>
{% endunless %}

View file

@ -0,0 +1,15 @@
{% capture date %}{{ page.date }}{{ post.date }}{% endcapture %}
{% capture date_formatted %}{{ page.date_formatted }}{{ post.date_formatted }}{% endcapture %}
{% capture has_date %}{{ date | size }}{% endcapture %}
{% capture updated %}{{ page.updated }}{{ post.updated }}{% endcapture %}
{% capture updated_formatted %}{{ page.updated_formatted }}{{ post.updated_formatted }}{% endcapture %}
{% capture was_updated %}{{ updated | size }}{% endcapture %}
{% if has_date != '0' %}
{% capture time %}<time datetime="{{ date | datetime | date_to_xmlschema }}" pubdate{% if updated %} data-updated="true"{% endif %}>{{ date_formatted }}</time>{% endcapture %}
{% endif %}
{% if was_updated != '0' %}
{% capture updated %}<time datetime="{{ updated | datetime | date_to_xmlschema }}" class="updated">Updated {{ updated_formatted }}</time>{% endcapture %}
{% else %}{% assign updated = false %}{% endif %}

View file

@ -0,0 +1 @@
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>

View file

@ -0,0 +1,11 @@
<div class="sharing">
{% if site.twitter_tweet_button %}
<a href="//twitter.com/share" class="twitter-share-button" data-url="{{ site.url }}{{ page.url }}" data-via="{{ site.twitter_user }}" data-counturl="{{ site.url }}{{ page.url }}" >Tweet</a>
{% endif %}
{% if site.google_plus_one %}
<div class="g-plusone" data-size="{{ site.google_plus_one_size }}"></div>
{% endif %}
{% if site.facebook_like %}
<div class="fb-like" data-send="true" data-width="450" data-show-faces="false"></div>
{% endif %}
</div>

View file

@ -0,0 +1,7 @@
<div class="grid-wrapper">
<div class="grid">
<div class="grid__item">
{% include custom/footer.html %}
</div>
</div>
</div>

View file

@ -0,0 +1,33 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->
{% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
{% if page.description %} {% capture fb_description %}{{ page.description }}{% endcapture %} {% else %} {% capture fb_description %}{{ content | raw_content }}{% endcapture %} {% endif %}
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>{% if page.title %}{{ page.title }} - {% endif %}{{ site.title }}</title>
<meta name="author" content="{{ site.author }}">
{% capture description %}{% if page.description %}{{ page.description }}{% elsif site.description %}{{ site.description }}{% else %}{{ content | raw_content }}{% endif %}{% endcapture %}
<meta name="description" content="{{ description | strip_html | condense_spaces | truncate:150 }}">
{% if page.keywords %}<meta name="keywords" content="{{ page.keywords }}">{% endif %}
<meta name="viewport" content="width=device-width">
<link rel="canonical" href="https://home-assistant.io">
{% if site.social.facebook.app_id %}
<meta property="fb:admins" content="{{ site.social.facebook.app_id }}">
<meta property="og:title" content="{% if post.title %}{{ post.title }}{% elsif page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}">
<meta property="og:site_name" content="{{ site.title }}">
<meta property="og:url" content="{% if canonical %}{{ canonical }}{% else %}{{ site.url }}{% endif %}/">
<meta property="og:type" content="{% if page.facebook.type %}{{ page.facebook.type }}{% else %}website{% endif %}">
<meta property="og:description" content="{{ fb_description | strip_html | condense_spaces | truncate:200 }}">
{% if site.social.facebook.user %}<meta property="og:author" content="https://facebook.com/{{ site.social.facebook.user }}">{% endif %}
{% if page.facebook.image %}<meta property="og:image" content="{{ page.facebook.image }}">{% endif %}
{% endif %}
<link href="{{ root_url }}/stylesheets/screen.css" media="screen, projection" rel="stylesheet">
<link href="{{ root_url }}{{ site.subscribe_rss }}" rel="alternate" title="{{ site.title }}" type="application/atom+xml">
<link rel='shortcut icon' href='{{ root_url }}/images/favicon.ico' />
<link rel='icon' type='image/png' href='{{ root_url }}/images/favicon-192x192.png' sizes='192x192' />
</head>

View file

@ -0,0 +1,7 @@
<div class="grid-wrapper">
<div class="grid">
{% include custom/header.html %}
</div>
</div>

View file

@ -0,0 +1,14 @@
<div class="hero" style="background-color: rgb(0, 178, 255); /* background-image: url('/images/cliffs_of_moher.jpg');*/">
<div class="grid-wrapper">
<div class="grid flex">
<div class="grid__item flex__item two-fifths palm-one-whole">
<a href='{{ root_url }}/images/screenshots/screenshot-devices.png'>
<img src="{{ root_url }}/images/hero_screenshot.png" alt="Home Assistant screenshot">
</a>
</div>
<div class="grid__item flex__item three-fifths palm-one-whole">
{% include custom/welcome.html %}
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,3 @@
<input type="checkbox" id="toggle">
<label for="toggle" class="toggle" data-open="Main Menu" data-close="Close Menu"></label>
{% include custom/navigation.html %}

View file

@ -0,0 +1,7 @@
<div class="grid">
{% include asides/social.html %}
{% include_array default_asides %}
</div>

View file

@ -0,0 +1,11 @@
{% if site.twitter_follow_button or site.twitter_tweet_button %}
<script type="text/javascript">
(function(){
var twitterWidgets = document.createElement('script');
twitterWidgets.type = 'text/javascript';
twitterWidgets.async = true;
twitterWidgets.src = '//platform.twitter.com/widgets.js';
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
})();
</script>
{% endif %}

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>{% if page.title %}{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %} - {% endif %}{{ site.title }}</title>
<meta name="author" content="{{ site.author }}">
{% capture description %}{% if page.description %}{{ page.description }}{% else %}{{ content | raw_content }}{% endif %}{% endcapture %}
<meta name="description" content="{{ description | strip_html | condense_spaces | truncate:150 }}">
{% if page.keywords %}<meta name="keywords" content="{{ page.keywords }}">{% endif %}
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
{% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
<link rel="canonical" href="{{ canonical }}">
<link href="{{ root_url }}/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<link href="{{ site.subscribe_rss }}" rel="alternate" title="{{site.title}}" type="application/atom+xml">
<script src="{{ root_url }}/javascripts/modernizr-2.0.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="./javascripts/libs/jquery.min.js"%3E%3C/script%3E'))</script>
<script src="{{ root_url }}/javascripts/octopress.js" type="text/javascript"></script>
{% include custom/head.html %}
{% include google_analytics.html %}
</head>

View file

@ -0,0 +1,17 @@
---
layout: page
title: "Blog index"
---
<div id="archive-list">
{% for post in site.categories[page.category] %}
{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
{% unless year == this_year %}
{% assign year = this_year %}
<h2>{{ year }}</h2>
{% endunless %}
<article>
{% include blog/archive_post.html %}
</article>
{% endfor %}
</div>

View file

@ -0,0 +1,46 @@
{% capture root_url %}{{ site.root | strip_slash }}{% endcapture %}{% include site/head.html %}
<body {% if page.body_id %} id="{{ page.body_id }}"{% endif %}>
<header>
{% include site/header.html %}
</header>
{% if page.hero_unit %}
{% include site/hero_unit.html %}
{% endif %}
<div class="grid-wrapper">
<div class="grid grid-center">
{% if page.is_post and page.sidebar == false %}
<div class="grid__item four-fifths lap-one-whole palm-one-whole">
{% elsif page.is_homepage %}
<div class="grid__item one-whole">
{% else %}
<div class="grid__item two-thirds lap-one-whole palm-one-whole">
{% endif %}
{{ content | expand_urls: root_url }}
</div>
{% unless page.sidebar == false %}
<aside id="sidebar" class="grid__item one-third lap-one-whole palm-one-whole">
{% include site/sidebar.html %}
</aside>
{% endunless %}
</div>
</div>
<footer>
{% include site/footer.html %}
</footer>
<!--[if lt IE 7]>
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
<![endif]-->
{% include javascripts/scripts.html %}
</body>
</html>

18
source/_layouts/page.html Normal file
View file

@ -0,0 +1,18 @@
---
layout: default
---
<article class="page">
{% if page.title and page.show_title != false %}
<header>
<h1 class="title indent">
{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %}
</h1>
</header>
<hr class="divider">
{% endif %}
{{ content }}
</article>

15
source/_layouts/post.html Normal file
View file

@ -0,0 +1,15 @@
---
layout: default
is_post: true
---
<article class="post">
{% include blog/post/article.html %}
</article>
{% if site.disqus_short_name and page.comments == true %}
<section id="disqus">
<h1 class="indent title">Comments</h1>
<div id="disqus_thread" aria-live="polite">{% include blog/post/disqus_thread.html %}</div>
</section>
{% endif %}

View file

@ -0,0 +1,10 @@
---
layout: post
title: "Website launched!"
date: 2014-12-18 23:24:45 -0800
comments: true
categories: website
author: Paulus
---
I finally took the time to setup a simple website to help people getting started with Home Assistant. This will make sure that the README on GitHub can be purely focussed on developers.

View file

@ -0,0 +1,39 @@
---
layout: page
title: "architecture"
date: 2014-12-18 21:49
sidebar: false
comments: true
sharing: true
footer: true
---
<img src='{{ root_url }}/images/ha_architecture.png' style='background-color: white'/>
The core of Home Assistant exists of the following parts.
The <b>Event Bus</b> facilitates the firing and listening of events. This is the beating heart of Home Assistant.
The <b>State Machine</b> keeps track of the states of things. Fires a state_changed event when a state has been changed.
The <b>Service Registry</b> listens on the event bus for call_service events and allows other code to register services.
The <b>Timer</b> will send every 10 seconds a time_changed event on the event bus.
Take for example the device_tracker component. This component is responsible for keeping track which devices are home. It checks which devices are home every time a time_changed event is fired on the event bus. It will then update the state machine with the information for each device.
This setup allows us to create simple yet powerful logic for controlling your home:
In the event that the state of device 'Paulus Nexus 5' changes to the 'Home' state:
If the sun has set and the lights are not on:
Turn on the lights
In the event that the combined state of all tracked devices changes to 'Not Home':
If the lights are on:
Turn off the lights
In the event of the sun setting:
If the lights are off and the combined state of all tracked device equals 'Home':
Turn on the lights
By using the Bus as a central communication hub between components it is easy to replace components or add functionality. If you would want to change the way devices are detected you only have to write a component that updates the device states in the State Machine.

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

View file

@ -0,0 +1,115 @@
<?xml version="1.0"?>
<skin version="1.1" name="Glow" author="LongTail Video">
<settings>
<setting name="backcolor" value="0x000000" />
<setting name="frontcolor" value="0xeeeeee" />
<setting name="lightcolor" value="0xeeeeee" />
<setting name="screencolor" value="0x000000" />
</settings>
<components>
<component name="controlbar">
<settings>
<setting name="margin" value="0" />
<setting name="fontsize" value="11" />
<setting name="fontcolor" value="0xEEEEEE" />
<setting name="buttoncolor" value="0xEEEEEE" />
</settings>
<layout>
<group position="left">
<button name="play" />
<text name="elapsed" />
</group>
<group position="center">
<slider name="time" />
</group>
<group position="right">
<text name="duration" />
<button name="blank" />
<button name="mute" />
<button name="fullscreen" />
</group>
</layout>
<elements>
<element name="background" src="background.png" />
<element name="capLeft" src="divider.png" />
<element name="capRight" src="divider.png" />
<element name="divider" src="divider.png" />
<element name="blankButton" src="blankButton.png" />
<element name="fullscreenButton" src="fullscreenButton.png" />
<element name="fullscreenButtonOver" src="fullscreenButtonOver.png" />
<element name="muteButton" src="muteButton.png" />
<element name="muteButtonOver" src="muteButtonOver.png" />
<element name="pauseButton" src="pauseButton.png" />
<element name="pauseButtonOver" src="pauseButtonOver.png" />
<element name="playButton" src="playButton.png" />
<element name="playButtonOver" src="playButtonOver.png" />
<element name="timeSliderBuffer" src="timeSliderBuffer.png" />
<element name="timeSliderCapLeft" src="timeSliderCapLeft.png" />
<element name="timeSliderCapRight" src="timeSliderCapRight.png" />
<element name="timeSliderProgress" src="timeSliderProgress.png" />
<element name="timeSliderRail" src="timeSliderRail.png" />
<element name="normalscreenButton" src="normalscreenButton.png" />
<element name="normalscreenButtonOver" src="normalscreenButtonOver.png" />
<element name="unmuteButton" src="unmuteButton.png" />
<element name="unmuteButtonOver" src="unmuteButtonOver.png" />
<element name="volumeSliderRail" src="divider.png" />
<element name="volumeSliderProgress" src="divider.png" />
</elements>
</component>
<component name="display">
<settings>
<setting name="bufferinterval" value="250" />
<setting name="bufferrotation" value="90" />
</settings>
<elements>
<element name="background" src="background.png" />
<element name="playIcon" src="playIcon.png" />
<element name="muteIcon" src="muteIcon.png" />
<element name="errorIcon" src="bufferIcon.png" />
<element name="bufferIcon" src="bufferIcon.png" />
</elements>
</component>
<component name="dock">
<settings>
<setting name="fontcolor" value="0xFFFFFF" />
</settings>
<elements>
<element name="button" src="button.png" />
</elements>
</component>
<component name="playlist">
<settings>
<setting name="fontcolor" value="0xEEEEEE" />
<setting name="overcolor" value="0xFFFFFF" />
<setting name="activecolor" value="0xFFFFFF" />
<setting name="backgroundcolor" value="0x333333" />
</settings>
<elements>
<element name="item" src="item.png" />
<element name="itemOver" src="itemOver.png" />
<element name="sliderCapBottom" src="sliderCapBottom.png" />
<element name="sliderCapTop" src="sliderCapTop.png" />
<element name="sliderRail" src="sliderRail.png" />
<element name="sliderThumb" src="sliderThumb.png" />
</elements>
</component>
<component name="sharing">
<elements>
<element name="embedIcon" src="embedIcon.png" />
<element name="embedScreen" src="embedScreen.png" />
<element name="shareIcon" src="shareIcon.png" />
<element name="shareScreen" src="shareScreen.png" />
</elements>
</component>
</components>
</skin>

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

26
source/atom.xml Normal file
View file

@ -0,0 +1,26 @@
---
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[{{ site.title }}]]></title>
<link href="{{ site.url }}/atom.xml" rel="self"/>
<link href="{{ site.url }}/"/>
<updated>{{ site.time | date_to_xmlschema }}</updated>
<id>{{ site.url }}/</id>
<author>
<name><![CDATA[{{ site.author | strip_html }}]]></name>
{% if site.email %}<email><![CDATA[{{ site.email }}]]></email>{% endif %}
</author>
<generator uri="http://octopress.org/">Octopress</generator>
{% for post in site.posts limit: 20 %}
<entry>
<title type="html"><![CDATA[{{ post.title | cdata_escape }}]]></title>
<link href="{{ site.url }}{{ post.url }}"/>
<updated>{{ post.date | date_to_xmlschema }}</updated>
<id>{{ site.url }}{{ post.id }}</id>
<content type="html"><![CDATA[{{ post.content | expand_urls: site.url | cdata_escape }}]]></content>
</entry>
{% endfor %}
</feed>

View file

@ -0,0 +1,17 @@
---
layout: page
title: "Blog index"
---
<div id="archive-list">
{% for post in site.posts reverse %}
{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
{% unless year == this_year %}
{% assign year = this_year %}
<h2>{{ year }}</h2>
{% endunless %}
<article>
{% include blog/archive_post.html %}
</article>
{% endfor %}
</div>

21
source/blog/index.html Normal file
View file

@ -0,0 +1,21 @@
---
layout: default
---
{% assign index = true %}
{% for post in paginator.posts %}
{% assign content = post.content %}
<article class="listing">
{% include blog/post/article.html %}
</article>
<hr>
{% endfor %}
<div class="pagination">
{% if paginator.next_page %}
<a class="btn pull-left" href="{{paginator.next_page_path}}">&larr; Older</a>
{% endif %}
{% if paginator.previous_page %}
<a class="btn pull-right" href="{{paginator.previous_page_path}}">Newer &rarr;</a>
{% endif %}
</div>

View file

@ -0,0 +1,66 @@
---
layout: page
title: "contributing"
date: 2014-12-18 22:57
sidebar: false
comments: true
sharing: true
footer: true
---
You've probably came here beacuse you noticed that your favorite device is not supported and want to add it.
First step is to decide under which component the device has to reside. Each component is responsible for a specific domain within Home Assistant. An example is the switch component, which is responsible for interaction with different types of switches. The switch component consists of the following files:
**homeassistant/components/switch/\_\_init\_\_.py**<br />
Contains the Switch component code.
**homeassistant/components/switch/wemo.py**<br />
Contains the code to interact with WeMo switches. Called if platform=wemo in switch config.
**homeassistant/components/switch/tellstick.py**
Contains the code to interact with Tellstick switches. Called if platform=tellstick in switch config.
If a component exists, your job is easy. Have a look at how the component works with other platforms and create a similar file for the platform that you would like to add. If you cannot find a suitable component, you'll have to add it yourself. When writing a component try to structure it after the Switch component to maximize reusability.
Communication between Home Assistant and devices should happen via third-party libraries that implement the device API. This will make sure the platform support code stays as small as possible.
For help on building your component, please see the See the documentation on [further customizing Home Assistant](https://github.com/balloob/home-assistant#further-customizing-home-assistant).
After you finish adding support for your device:
- update the supported devices in README.md.
- add any new dependencies to requirements.txt.
- Make sure all your code passes Pylint, flake8 (PEP8 and some more) validation. To generate reports, run `pylint homeassistant > pylint.txt` and `flake8 homeassistant --exclude bower_components,external > flake8.txt`.
If you've added a component:
- update the file [`domain-icon.html`](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/http/www_static/polymer/domain-icon.html) with an icon for your domain ([pick from this list](https://www.polymer-project.org/components/core-icons/demo.html))
- update the demo component with two states that it provides
- Add your component to home-assistant.conf.example
Since you've updated domain-icon.html, you've made changes to the frontend:
- run `build_frontend`. This will build a new version of the frontend. Make sure you add the changed files `frontend.py` and `frontend.html` to the commit.
## Setting states
It is the responsibility of the component to maintain the states of the devices in your domain. Each device should be a single state and, if possible, a group should be provided that tracks the combined state of the devices.
A state can have several attributes that will help the frontend in displaying your state:
- `friendly_name`: this name will be used as the name of the device
- `entity_picture`: this picture will be shown instead of the domain icon
- `unit_of_measurement`: this will be appended to the state in the interface
These attributes are defined in [homeassistant.components](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/__init__.py#L25).
## Working on the frontend
The frontend is composed of Polymer web-components and compiled into the file `frontend.html`. During development you do not want to work with the compiled version but with the seperate files. To have Home Assistant serve the seperate files, set `development=1` for the http-component in your config.
When you are done with development and ready to commit your changes, run `build_frontend`, set `development=0` in your config and validate that everything still works.
## Notes on PyLint and PEP8 validation
In case a PyLint warning cannot be avoided, add a comment to disable the PyLint check for that line. This can be done using the format `# pylint: disable=YOUR-ERROR-NAME`. Example of an unavoidable PyLint warning is if you do not use the passed in datetime if you're listening for time change.

Some files were not shown because too many files have changed in this diff Show more