Update to site
1
source/CNAME
Normal file
|
@ -0,0 +1 @@
|
|||
home-assistant.io
|
5
source/_includes/after_footer.html
Normal 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 %}
|
8
source/_includes/archive_post.html
Normal 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 %}
|
29
source/_includes/article.html
Normal 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 %}
|
15
source/_includes/aside.html
Normal 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>
|
17
source/_includes/asides/delicious.html
Normal 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 %}
|
19
source/_includes/asides/github.html
Normal 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 %}
|
3
source/_includes/asides/googleplus.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
{% comment %}
|
||||
This section intentionally blank.
|
||||
{% endcomment %}
|
17
source/_includes/asides/pinboard.html
Normal 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 %}
|
10
source/_includes/asides/recent_posts.html
Normal 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>
|
19
source/_includes/asides/social.html
Normal 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 %}
|
17
source/_includes/asides/twitter.html
Normal 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 %}
|
20
source/_includes/blog/archive_post.html
Normal 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>
|
32
source/_includes/blog/post/article.html
Normal 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 %}
|
15
source/_includes/blog/post/date.html
Normal 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 %}
|
1
source/_includes/blog/post/disqus_thread.html
Normal file
|
@ -0,0 +1 @@
|
|||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
17
source/_includes/blog/post/tags.html
Normal 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 %}
|
24
source/_includes/custom/after_footer.html
Normal 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>
|
4
source/_includes/custom/asides/about.html
Normal file
|
@ -0,0 +1,4 @@
|
|||
<section>
|
||||
<h1>About Me</h1>
|
||||
<p>A little something about me.</p>
|
||||
</section>
|
26
source/_includes/custom/category_feed.xml
Normal 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>
|
4
source/_includes/custom/footer.html
Normal 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>
|
14
source/_includes/custom/grid_item_left.html
Normal 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 & sensors</li>
|
||||
<li>Scanning network for connected devices</li>
|
||||
</ul>
|
6
source/_includes/custom/grid_item_middle.html
Normal 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>
|
10
source/_includes/custom/grid_item_right.html
Normal 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…</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>
|
11
source/_includes/custom/header.html
Normal 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>
|
7
source/_includes/custom/navigation.html
Normal 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>
|
5
source/_includes/custom/unused_head.html
Normal 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'>
|
9
source/_includes/custom/welcome.html
Normal 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>
|
21
source/_includes/disqus.html
Normal 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 %}
|
10
source/_includes/facebook_like.html
Normal 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 %}
|
1
source/_includes/footer.html
Normal file
|
@ -0,0 +1 @@
|
|||
{% include custom/footer.html %}
|
13
source/_includes/google_analytics.html
Normal 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 %}
|
9
source/_includes/google_plus_one.html
Normal 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 %}
|
1
source/_includes/header.html
Normal file
|
@ -0,0 +1 @@
|
|||
{% include custom/header.html %}
|
16
source/_includes/javascripts/delicious.html
Normal file
|
@ -0,0 +1,16 @@
|
|||
{% if site.delicious_user %}
|
||||
<script src="//feeds.delicious.com/v2/json/{{ site.delicious_user }}?count={{ site.delicious_count }}&sort=date&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 %}
|
20
source/_includes/javascripts/disqus.html
Normal 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 %}
|
21
source/_includes/javascripts/github.html
Normal 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 %}
|
8
source/_includes/javascripts/google_analytics.html
Normal 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 %}
|
12
source/_includes/javascripts/scripts.html
Normal 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 %}
|
19
source/_includes/navigation.html
Normal 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 %}
|
8
source/_includes/post/author.html
Normal 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 %}
|
10
source/_includes/post/categories.html
Normal 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 %}
|
15
source/_includes/post/date.html
Normal 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 %}
|
1
source/_includes/post/disqus_thread.html
Normal file
|
@ -0,0 +1 @@
|
|||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
11
source/_includes/post/sharing.html
Normal 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>
|
7
source/_includes/site/footer.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
<div class="grid-wrapper">
|
||||
<div class="grid">
|
||||
<div class="grid__item">
|
||||
{% include custom/footer.html %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
33
source/_includes/site/head.html
Normal 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>
|
7
source/_includes/site/header.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
<div class="grid-wrapper">
|
||||
<div class="grid">
|
||||
|
||||
{% include custom/header.html %}
|
||||
|
||||
</div>
|
||||
</div>
|
14
source/_includes/site/hero_unit.html
Normal 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>
|
3
source/_includes/site/navigation.html
Normal 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 %}
|
7
source/_includes/site/sidebar.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
<div class="grid">
|
||||
|
||||
{% include asides/social.html %}
|
||||
|
||||
{% include_array default_asides %}
|
||||
|
||||
</div>
|
11
source/_includes/twitter_sharing.html
Normal 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 %}
|
29
source/_includes/unused_head.html
Normal 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>
|
17
source/_layouts/category_index.html
Normal 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>
|
46
source/_layouts/default.html
Normal 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
|
@ -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
|
@ -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 %}
|
10
source/_posts/2014-12-18-website-launched.markdown
Normal 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.
|
39
source/architecture/index.markdown
Normal 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.
|
BIN
source/assets/jwplayer/glow/controlbar/background.png
Normal file
After Width: | Height: | Size: 141 B |
BIN
source/assets/jwplayer/glow/controlbar/blankButton.png
Normal file
After Width: | Height: | Size: 82 B |
BIN
source/assets/jwplayer/glow/controlbar/divider.png
Normal file
After Width: | Height: | Size: 118 B |
BIN
source/assets/jwplayer/glow/controlbar/fullscreenButton.png
Normal file
After Width: | Height: | Size: 203 B |
BIN
source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png
Normal file
After Width: | Height: | Size: 636 B |
BIN
source/assets/jwplayer/glow/controlbar/muteButton.png
Normal file
After Width: | Height: | Size: 343 B |
BIN
source/assets/jwplayer/glow/controlbar/muteButtonOver.png
Normal file
After Width: | Height: | Size: 835 B |
BIN
source/assets/jwplayer/glow/controlbar/normalscreenButton.png
Normal file
After Width: | Height: | Size: 210 B |
After Width: | Height: | Size: 664 B |
BIN
source/assets/jwplayer/glow/controlbar/pauseButton.png
Normal file
After Width: | Height: | Size: 170 B |
BIN
source/assets/jwplayer/glow/controlbar/pauseButtonOver.png
Normal file
After Width: | Height: | Size: 442 B |
BIN
source/assets/jwplayer/glow/controlbar/playButton.png
Normal file
After Width: | Height: | Size: 251 B |
BIN
source/assets/jwplayer/glow/controlbar/playButtonOver.png
Normal file
After Width: | Height: | Size: 553 B |
BIN
source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png
Normal file
After Width: | Height: | Size: 112 B |
BIN
source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png
Normal file
After Width: | Height: | Size: 94 B |
BIN
source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png
Normal file
After Width: | Height: | Size: 103 B |
BIN
source/assets/jwplayer/glow/controlbar/timeSliderProgress.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
source/assets/jwplayer/glow/controlbar/timeSliderRail.png
Normal file
After Width: | Height: | Size: 116 B |
BIN
source/assets/jwplayer/glow/controlbar/unmuteButton.png
Normal file
After Width: | Height: | Size: 264 B |
BIN
source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png
Normal file
After Width: | Height: | Size: 649 B |
BIN
source/assets/jwplayer/glow/display/background.png
Normal file
After Width: | Height: | Size: 686 B |
BIN
source/assets/jwplayer/glow/display/bufferIcon.png
Normal file
After Width: | Height: | Size: 816 B |
BIN
source/assets/jwplayer/glow/display/muteIcon.png
Normal file
After Width: | Height: | Size: 334 B |
BIN
source/assets/jwplayer/glow/display/playIcon.png
Normal file
After Width: | Height: | Size: 465 B |
BIN
source/assets/jwplayer/glow/dock/button.png
Normal file
After Width: | Height: | Size: 686 B |
115
source/assets/jwplayer/glow/glow.xml
Normal 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>
|
BIN
source/assets/jwplayer/glow/playlist/item.png
Normal file
After Width: | Height: | Size: 172 B |
BIN
source/assets/jwplayer/glow/playlist/itemOver.png
Normal file
After Width: | Height: | Size: 171 B |
BIN
source/assets/jwplayer/glow/playlist/sliderCapBottom.png
Normal file
After Width: | Height: | Size: 108 B |
BIN
source/assets/jwplayer/glow/playlist/sliderCapTop.png
Normal file
After Width: | Height: | Size: 105 B |
BIN
source/assets/jwplayer/glow/playlist/sliderRail.png
Normal file
After Width: | Height: | Size: 100 B |
BIN
source/assets/jwplayer/glow/playlist/sliderThumb.png
Normal file
After Width: | Height: | Size: 97 B |
BIN
source/assets/jwplayer/glow/sharing/embedIcon.png
Normal file
After Width: | Height: | Size: 749 B |
BIN
source/assets/jwplayer/glow/sharing/embedScreen.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
source/assets/jwplayer/glow/sharing/shareIcon.png
Normal file
After Width: | Height: | Size: 589 B |
BIN
source/assets/jwplayer/glow/sharing/shareScreen.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
source/assets/jwplayer/player.swf
Normal file
26
source/atom.xml
Normal 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>
|
17
source/blog/archives/index.html
Normal 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
|
@ -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}}">← Older</a>
|
||||
{% endif %}
|
||||
|
||||
{% if paginator.previous_page %}
|
||||
<a class="btn pull-right" href="{{paginator.previous_page_path}}">Newer →</a>
|
||||
{% endif %}
|
||||
</div>
|
66
source/contributing/index.markdown
Normal 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.
|