diff --git a/.gitignore b/.gitignore index e124ea450ed..bc734ac2e59 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ source/_stash source/stylesheets/screen.css vendor node_modules +source/.jekyll-metadata diff --git a/Gemfile b/Gemfile index c9910e1cc53..f213d9565a3 100644 --- a/Gemfile +++ b/Gemfile @@ -2,10 +2,8 @@ source "https://rubygems.org" group :development do gem 'rake', '~> 10.0' - gem 'jekyll', '~> 2.0' - gem 'octopress-hooks', '~> 2.2' - gem 'octopress-date-format', '~> 2.0' - gem 'jekyll-sitemap' + gem 'jekyll', '~> 3.0' + gem 'pygments.rb', '~> 0.6.3' gem 'rdiscount', '~> 2.0' gem 'RedCloth', '~> 4.2.9' gem 'haml', '~> 4.0' @@ -14,9 +12,18 @@ group :development do gem 'rubypants', '~> 0.2.0' gem 'rb-fsevent', '~> 0.9' gem 'stringex', '~> 1.4.0' - gem 'jekyll-time-to-read' gem 'execjs' gem 'therubyracer', :platforms => :ruby + gem 'coderay' +end + +group :jekyll_plugins do + gem 'jekyll-paginate' + gem 'jekyll-sitemap' + gem 'jekyll-time-to-read' + gem 'octopress', '~> 3.0' + gem 'octopress-filters' + gem 'octopress-include-tag' end gem 'sinatra', '~> 1.4.2' diff --git a/Gemfile.lock b/Gemfile.lock index 32a21b3b48f..a31cd5b321c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,43 +2,27 @@ GEM remote: https://rubygems.org/ specs: RedCloth (4.2.9) - blankslate (2.1.2.4) - chunky_png (1.3.4) - classifier-reborn (2.0.3) - fast-stemmer (~> 1.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.9.1.1) + chunky_png (1.3.5) + coderay (1.1.0) colorator (0.1) compass (0.12.7) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.2.19) execjs (2.6.0) - fast-stemmer (1.0.2) ffi (1.9.10) fssm (0.2.10) haml (4.0.7) tilt - jekyll (2.5.3) - classifier-reborn (~> 2.0) + jekyll (3.0.0) colorator (~> 0.1) - jekyll-coffeescript (~> 1.0) - jekyll-gist (~> 1.0) - jekyll-paginate (~> 1.0) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 1.1) kramdown (~> 1.3) - liquid (~> 2.6.1) + liquid (~> 3.0) mercenary (~> 0.3.3) - pygments.rb (~> 0.6.0) - redcarpet (~> 3.1) + rouge (~> 1.7) safe_yaml (~> 1.0) - toml (~> 0.1.0) - jekyll-coffeescript (1.0.1) - coffee-script (~> 2.2) - jekyll-gist (1.3.5) jekyll-paginate (1.1.0) jekyll-sass-converter (1.3.0) sass (~> 3.2) @@ -49,18 +33,35 @@ GEM listen (~> 3.0) kramdown (1.9.0) libv8 (3.16.14.13) - liquid (2.6.3) + liquid (3.0.6) listen (3.0.3) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) mercenary (0.3.5) - octopress-date-format (2.0.2) - jekyll (~> 2.0) + octopress (3.0.11) + jekyll (>= 2.0) + mercenary (~> 0.3.2) + octopress-deploy + octopress-escape-code (~> 2.0) octopress-hooks (~> 2.0) + redcarpet (~> 3.0) + titlecase + octopress-deploy (1.3.0) + colorator + octopress-escape-code (2.0.6) + octopress-hooks (~> 2.0) + octopress-filters (1.4.0) + jekyll + octopress-hooks (~> 2.0) + rubypants-unicode + titlecase octopress-hooks (2.6.1) jekyll (>= 2.0) - parslet (1.5.0) - blankslate (~> 2.0) + octopress-include-tag (1.1.3) + jekyll (>= 2.0) + octopress-tag-helpers (~> 1.0) + octopress-tag-helpers (1.0.8) + jekyll (>= 2.0) posix-spawn (0.3.11) pygments.rb (0.6.3) posix-spawn (~> 0.3.6) @@ -75,7 +76,9 @@ GEM rdiscount (2.1.8) redcarpet (3.3.3) ref (2.0.0) + rouge (1.10.1) rubypants (0.2.0) + rubypants-unicode (0.2.5) safe_yaml (1.0.4) sass (3.2.19) sass-globbing (1.0.0) @@ -89,8 +92,7 @@ GEM libv8 (~> 3.16.14.0) ref tilt (2.0.1) - toml (0.1.2) - parslet (~> 1.5.0) + titlecase (0.1.1) yajl-ruby (1.2.1) PLATFORMS @@ -98,14 +100,18 @@ PLATFORMS DEPENDENCIES RedCloth (~> 4.2.9) + coderay compass (~> 0.12.2) execjs haml (~> 4.0) - jekyll (~> 2.0) + jekyll (~> 3.0) + jekyll-paginate jekyll-sitemap jekyll-time-to-read - octopress-date-format (~> 2.0) - octopress-hooks (~> 2.2) + octopress (~> 3.0) + octopress-filters + octopress-include-tag + pygments.rb (~> 0.6.3) rake (~> 10.0) rb-fsevent (~> 0.9) rdiscount (~> 2.0) diff --git a/Rakefile b/Rakefile index 947b2a4bf15..9c4ee48c118 100644 --- a/Rakefile +++ b/Rakefile @@ -65,7 +65,7 @@ task :watch do raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) puts "Starting to watch source with Jekyll and Compass." system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css") - jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll build --watch") + jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll build --watch --incremental") compassPid = Process.spawn("compass watch") trap("INT") { @@ -81,7 +81,7 @@ task :preview do raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) puts "Starting to watch source with Jekyll and Compass. Starting Rack on port #{server_port}" system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css") - jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll build --watch") + jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll build --watch --incremental") compassPid = Process.spawn("compass watch") rackupPid = Process.spawn("rackup --port #{server_port}") @@ -252,7 +252,7 @@ desc "deploy public directory to github pages" multitask :push do puts "## Deploying branch to Github Pages " puts "## Pulling any updates from Github Pages " - cd "#{deploy_dir}" do + cd "#{deploy_dir}" do Bundler.with_clean_env { system "git pull" } end (Dir["#{deploy_dir}/*"]).each { |f| rm_rf(f) } diff --git a/_config.yml b/_config.yml index 119a41a4ed1..be2c843ca6e 100644 --- a/_config.yml +++ b/_config.yml @@ -26,24 +26,38 @@ email: # Jekyll & Plugins # # ----------------------- # -# If publishing to a subdirectory as in http://site.com/project set 'root: /project' -root: / permalink: /blog/:year/:month/:day/:title/ source: source destination: public/ -plugins: plugins +plugins_dir: plugins code_dir: downloads/code category_dir: blog/categories -markdown: rdiscount -rdiscount: - extensions: - - autolink - - footnotes - - smart -highlighter: pygments # default python pygments have been replaced by pygments.rb +markdown: kramdown + +kramdown: + input: GFM + auto_ids: false + footnote_nr: 1 + entity_output: as_char + toc_levels: 1..6 + smart_quotes: lsquo,rsquo,ldquo,rdquo + parse_block_html: true + enable_coderay: true + + coderay: + coderay_wrap: div + coderay_line_numbers: nil + coderay_line_number_start: 1 + coderay_tab_width: 4 + coderay_bold_every: 10 + coderay_css: class + +highlighter: rouge gems: - jekyll-time-to-read + - octopress-filters + - octopress-include-tag paginate: 10 # Posts per page on the blog index paginate_path: "blog/posts/:num" # Directory base for pagination URLs eg. /posts/2/ diff --git a/config.ru b/config.ru index 8e3dc08a771..4c56b416a9f 100644 --- a/config.ru +++ b/config.ru @@ -16,7 +16,7 @@ class SinatraStaticServer < Sinatra::Base def send_sinatra_file(path, &missing_file_block) file_path = File.join(File.dirname(__FILE__), 'public', path) - file_path = File.join(file_path, 'index.html') unless file_path =~ /\.[a-z]+$/i + file_path = File.join(file_path, 'index.html') if File.directory?(file_path) File.exist?(file_path) ? send_file(file_path) : missing_file_block.call end diff --git a/generate-redirect.py b/generate-redirect.py new file mode 100644 index 00000000000..617ed8e922c --- /dev/null +++ b/generate-redirect.py @@ -0,0 +1,163 @@ +import os + +dirs = ['components', 'getting-started', 'developers'] + +template = "" + +for check_dir in dirs: + for path in os.listdir(os.path.join('public', check_dir)): + check_path = os.path.join('public', check_dir, path) + + if os.path.isdir(check_path): + new_path = os.path.join('source', check_dir, "{}.html".format(path)) + # print(template.format(check_dir, path)) + # print(new_path) + with open(new_path, 'w') as outp: + outp.write(template.format(check_dir, path)) + +# Generated +# source/components/alarm_control_panel.html +# source/components/alarm_control_panel.manual.html +# source/components/alarm_control_panel.mqtt.html +# source/components/arduino.html +# source/components/automation.html +# source/components/browser.html +# source/components/camera.foscam.html +# source/components/camera.generic.html +# source/components/configurator.html +# source/components/conversation.html +# source/components/device_sun_light_trigger.html +# source/components/device_tracker.html +# source/components/device_tracker.actiontec.html +# source/components/device_tracker.aruba.html +# source/components/device_tracker.asuswrt.html +# source/components/device_tracker.ddwrt.html +# source/components/device_tracker.geofancy.html +# source/components/device_tracker.luci.html +# source/components/device_tracker.mqtt.html +# source/components/device_tracker.netgear.html +# source/components/device_tracker.nmap_scanner.html +# source/components/device_tracker.owntracks.html +# source/components/device_tracker.snmp.html +# source/components/device_tracker.thomson.html +# source/components/device_tracker.tomato.html +# source/components/device_tracker.tplink.html +# source/components/device_tracker.ubus.html +# source/components/discovery.html +# source/components/downloader.html +# source/components/group.html +# source/components/history.html +# source/components/ifttt.html +# source/components/ifttt.manything.html +# source/components/introduction.html +# source/components/isy994.html +# source/components/keyboard.html +# source/components/light.html +# source/components/light.blinksticklight.html +# source/components/light.hue.html +# source/components/light.hyperion.html +# source/components/light.limitlessled.html +# source/components/light.rfxtrx.html +# source/components/light.tellstick.html +# source/components/light.vera.html +# source/components/light.wink.html +# source/components/logbook.html +# source/components/media_player.html +# source/components/media_player.cast.html +# source/components/media_player.denon.html +# source/components/media_player.firetv.html +# source/components/media_player.itunes.html +# source/components/media_player.kodi.html +# source/components/media_player.mpd.html +# source/components/media_player.plex.html +# source/components/media_player.sonos.html +# source/components/media_player.squeezebox.html +# source/components/modbus.html +# source/components/mqtt.html +# source/components/notify.html +# source/components/notify.file.html +# source/components/notify.instapush.html +# source/components/notify.nma.html +# source/components/notify.pushbullet.html +# source/components/notify.pushover.html +# source/components/notify.slack.html +# source/components/notify.smtp.html +# source/components/notify.syslog.html +# source/components/notify.telegram.html +# source/components/notify.xmpp.html +# source/components/rfxtrx.html +# source/components/scene.html +# source/components/script.html +# source/components/sensor.html +# source/components/sensor.arduino.html +# source/components/sensor.arest.html +# source/components/sensor.bitcoin.html +# source/components/sensor.command_sensor.html +# source/components/sensor.cpuspeed.html +# source/components/sensor.dht.html +# source/components/sensor.efergy.html +# source/components/sensor.forecast.html +# source/components/sensor.glances.html +# source/components/sensor.modbus.html +# source/components/sensor.mqtt.html +# source/components/sensor.mysensors.html +# source/components/sensor.openweathermap.html +# source/components/sensor.rest.html +# source/components/sensor.rfxtrx.html +# source/components/sensor.rpi_gpio.html +# source/components/sensor.sabnzbd.html +# source/components/sensor.swiss_public_transport.html +# source/components/sensor.systemmonitor.html +# source/components/sensor.tellstick.html +# source/components/sensor.temper.html +# source/components/sensor.time_date.html +# source/components/sensor.transmission.html +# source/components/sensor.vera.html +# source/components/sensor.wink.html +# source/components/sensor.worldclock.html +# source/components/shell_command.html +# source/components/simple_alarm.html +# source/components/sun.html +# source/components/switch.html +# source/components/switch.arduino.html +# source/components/switch.arest.html +# source/components/switch.command_switch.html +# source/components/switch.edimax.html +# source/components/switch.hikvision.html +# source/components/switch.modbus.html +# source/components/switch.mqtt.html +# source/components/switch.rest.html +# source/components/switch.rfxtrx.html +# source/components/switch.rpi_gpio.html +# source/components/switch.tellstick.html +# source/components/switch.transmission.html +# source/components/switch.vera.html +# source/components/switch.wemo.html +# source/components/switch.wink.html +# source/components/tellstick.html +# source/components/thermostat.html +# source/components/thermostat.heat_control.html +# source/components/thermostat.nest.html +# source/components/thermostat.radiotherm.html +# source/components/vera.html +# source/components/verisure.html +# source/components/wink.html +# source/components/zone.html +# source/components/zwave.html +# source/getting-started/android.html +# source/getting-started/automation.html +# source/getting-started/autostart.html +# source/getting-started/configuration.html +# source/getting-started/devices.html +# source/getting-started/presence-detection.html +# source/getting-started/troubleshooting.html +# source/getting-started/troubleshooting-configuration.html +# source/developers/add_new_platform.html +# source/developers/api.html +# source/developers/architecture.html +# source/developers/creating_components.html +# source/developers/credits.html +# source/developers/frontend.html +# source/developers/python_api.html +# source/developers/rest_api.html +# source/developers/website.html diff --git a/plugins/backtick_code_block.rb b/plugins/backtick_code_block.rb deleted file mode 100644 index ae4a0472671..00000000000 --- a/plugins/backtick_code_block.rb +++ /dev/null @@ -1,42 +0,0 @@ -require './plugins/pygments_code' - -module BacktickCodeBlock - AllOptions = /([^\s]+)\s+(.+?)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i - LangCaption = /([^\s]+)\s*(.+)?/i - def self.render_code_block(input) - @options = nil - @caption = nil - @lang = nil - @url = nil - @title = nil - input.gsub(/^`{3} *([^\n]+)?\n(.+?)\n`{3}/m) do - @options = $1 || '' - str = $2 - - if @options =~ AllOptions - @lang = $1 - @caption = "
#{$2}#{$4 || 'link'}
" - elsif @options =~ LangCaption - @lang = $1 - @caption = "
#{$2}
" - end - - if str.match(/\A( {4}|\t)/) - str = str.gsub(/^( {4}|\t)/, '') - end - if @lang.nil? || @lang == 'plain' - code = HighlightCode::tableize_code(str.gsub('<','<').gsub('>','>')) - "
#{@caption}#{code}
" - else - if @lang.include? "-raw" - raw = "``` #{@options.sub('-raw', '')}\n" - raw += str - raw += "\n```\n" - else - code = HighlightCode::highlight(str, @lang) - "
#{@caption}#{code}
" - end - end - end - end -end diff --git a/plugins/blockquote.rb b/plugins/blockquote.rb deleted file mode 100644 index ebdc0e892b1..00000000000 --- a/plugins/blockquote.rb +++ /dev/null @@ -1,82 +0,0 @@ -# -# Author: Brandon Mathis -# A full rewrite based on the work of: Josediaz Gonzalez - https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/blockquote.rb -# -# Outputs a string with a given attribution as a quote -# -# {% blockquote Bobby Willis http://google.com/search?q=pants the search for bobby's pants %} -# Wheeee! -# {% endblockquote %} -# ... -#
-#

Wheeee!

-#
-# -require './plugins/titlecase.rb' - -module Jekyll - - class Blockquote < Liquid::Block - FullCiteWithTitle = /(\S.*)\s+(https?:\/\/)(\S+)\s+(.+)/i - FullCite = /(\S.*)\s+(https?:\/\/)(\S+)/i - AuthorTitle = /([^,]+),([^,]+)/ - Author = /(.+)/ - - def initialize(tag_name, markup, tokens) - @by = nil - @source = nil - @title = nil - if markup =~ FullCiteWithTitle - @by = $1 - @source = $2 + $3 - @title = $4.titlecase.strip - elsif markup =~ FullCite - @by = $1 - @source = $2 + $3 - elsif markup =~ AuthorTitle - @by = $1 - @title = $2.titlecase.strip - elsif markup =~ Author - @by = $1 - end - super - end - - def render(context) - quote = paragraphize(super) - author = "#{@by.strip}" if @by - if @source - url = @source.match(/https?:\/\/(.+)/)[1].split('/') - parts = [] - url.each do |part| - if (parts + [part]).join('/').length < 32 - parts << part - end - end - source = parts.join('/') - source << '/…' unless source == @source - end - if !@source.nil? - cite = " #{(@title || source)}" - elsif !@title.nil? - cite = " #{@title}" - end - blockquote = if @by.nil? - quote - elsif cite - "#{quote}" - else - "#{quote}" - end - "
#{blockquote}
" - end - - def paragraphize(input) - "

#{input.lstrip.rstrip.gsub(/\n\n/, '

').gsub(/\n/, '
')}

" - end - end -end - -Liquid::Template.register_tag('blockquote', Jekyll::Blockquote) diff --git a/plugins/code_block.rb b/plugins/code_block.rb deleted file mode 100644 index 539a3475e69..00000000000 --- a/plugins/code_block.rb +++ /dev/null @@ -1,92 +0,0 @@ -# Title: Simple Code Blocks for Jekyll -# Author: Brandon Mathis http://brandonmathis.com -# Description: Write codeblocks with semantic HTML5
and
elements and optional syntax highlighting — all with a simple, intuitive interface. -# -# Syntax: -# {% codeblock [title] [url] [link text] %} -# code snippet -# {% endcodeblock %} -# -# For syntax highlighting, put a file extension somewhere in the title. examples: -# {% codeblock file.sh %} -# code snippet -# {% endcodeblock %} -# -# {% codeblock Time to be Awesome! (awesome.rb) %} -# code snippet -# {% endcodeblock %} -# -# Example: -# -# {% codeblock Got pain? painreleif.sh http://site.com/painreleief.sh Download it! %} -# $ rm -rf ~/PAIN -# {% endcodeblock %} -# -# Output: -# -#
-#
Got pain? painrelief.sh Download it! -#

-# -- nicely escaped highlighted code --
-# 
-#
-# -# Example 2 (no syntax highlighting): -# -# {% codeblock %} -# Ooooh, sarcasm... How original! -# {% endcodeblock %} -# -#
-#
<sarcasm> Ooooh, sarcasm... How original!</sarcasm>
-#
-# -require './plugins/pygments_code' -require './plugins/raw' - -module Jekyll - - class CodeBlock < Liquid::Block - CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i - Caption = /(\S[\S\s]*)/ - def initialize(tag_name, markup, tokens) - @title = nil - @caption = nil - @filetype = nil - @highlight = true - if markup =~ /\s*lang:(\S+)/i - @filetype = $1 - markup = markup.sub(/\s*lang:(\S+)/i,'') - end - if markup =~ CaptionUrlTitle - @file = $1 - @caption = "
#{$1}#{$3 || 'link'}
" - elsif markup =~ Caption - @file = $1 - @caption = "
#{$1}
\n" - end - if @file =~ /\S[\S\s]*\w+\.(\w+)/ && @filetype.nil? - @filetype = $1 - end - super - end - - def render(context) - output = super - code = super - source = "
" - source += @caption if @caption - if @filetype - source += "#{HighlightCode::highlight(code, @filetype)}
" - else - source += "#{HighlightCode::tableize_code(code.lstrip.rstrip.gsub(/" - end - source = TemplateWrapper::safe_wrap(source) - source = context['pygments_prefix'] + source if context['pygments_prefix'] - source = source + context['pygments_suffix'] if context['pygments_suffix'] - source - end - end -end - -Liquid::Template.register_tag('codeblock', Jekyll::CodeBlock) diff --git a/plugins/config_tag.rb b/plugins/config_tag.rb deleted file mode 100644 index 92d1f63c819..00000000000 --- a/plugins/config_tag.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'json' - -class ConfigTag < Liquid::Tag - def initialize(tag_name, options, tokens) - super - options = options.split(' ').map {|i| i.strip } - @key = options.slice!(0) - @tag = nil - @classname = nil - options.each do |option| - @tag = $1 if option =~ /tag:(\S+)/ - @classname = $1 if option =~ /classname:(\S+)/ - end - end - - def render(context) - config_tag(context.registers[:site].config, @key, @tag, @classname) - end -end - -def config_tag(config, key, tag=nil, classname=nil) - options = key.split('.').map { |k| config[k] }.last #reference objects with dot notation - tag ||= 'div' - classname ||= key.sub(/_/, '-').sub(/\./, '-') - output = "<#{tag} class='#{classname}'" - - if options.respond_to? 'keys' - options.each do |k,v| - unless v.nil? - v = v.join ',' if v.respond_to? 'join' - v = v.to_json if v.respond_to? 'keys' - output += " data-#{k.sub'_','-'}='#{v}'" - end - end - elsif options.respond_to? 'join' - output += " data-value='#{config[key].join(',')}'" - else - output += " data-value='#{config[key]}'" - end - output += ">" -end - -Liquid::Template.register_tag('config_tag', ConfigTag) - diff --git a/plugins/directory_tag.rb b/plugins/directory_tag.rb deleted file mode 100644 index bfe032f3cb7..00000000000 --- a/plugins/directory_tag.rb +++ /dev/null @@ -1,113 +0,0 @@ -# Title: Dynamic directories for Jekyll -# Author: Tommy Sullivan http://superawesometommy.com, Robert Park http://exolucere.ca -# Description: The directory tag lets you iterate over files at a particular path. If files conform to the standard Jekyll format, YYYY-MM-DD-file-title, then those attributes will be populated on the yielded file object. The `forloop` object maintains [its usual context](http://wiki.shopify.com/UsingLiquid#For_loops). -# -# Syntax: -# -# {% directory path: path/from/source [reverse] [exclude] %} -# {{ file.url }} -# {{ file.name }} -# {{ file.date }} -# {{ file.slug }} -# {{ file.title }} -# {% enddirectory %} -# -# Options: -# -# - `reverse` - Defaults to 'false', ordering files the same way `ls` does: 0-9A-Za-z. -# - `exclude` - Defaults to '.html$', a Regexp of files to skip. -# -# File Attributes: -# -# - `url` - The absolute path to the published file -# - `name` - The basename -# - `date` - The date extracted from the filename, otherwise the file's creation time -# - `slug` - The basename with date and extension removed -# - `title` - The titlecase'd slug -# - -module Jekyll - - class DirectoryTag < Liquid::Block - include Convertible - - MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ - - attr_accessor :content, :data - - def initialize(tag_name, markup, tokens) - attributes = {} - - # Parse parameters - markup.scan(Liquid::TagAttributes) do |key, value| - attributes[key] = value - end - - @path = attributes['path'] || '.' - @exclude = Regexp.new(attributes['exclude'] || '.html$', Regexp::EXTENDED | Regexp::IGNORECASE) - @rev = attributes['reverse'].nil? - - super - end - - def render(context) - context.registers[:directory] ||= Hash.new(0) - - source_dir = context.registers[:site].source - directory_files = File.join(source_dir, @path, "*") - - files = Dir.glob(directory_files).reject{|f| f =~ @exclude } - files.sort! {|x,y| @rev ? x <=> y : y <=> x } - - length = files.length - result = [] - - context.stack do - files.each_with_index do |filename, index| - basename = File.basename(filename) - - filepath = [@path, basename] - ['.'] - path = filepath.join '/' - url = '/' + filepath.join('/') - - m, cats, date, slug, ext = *basename.match(MATCHER) - - if m - date = Time.parse(date) - ext = ext - slug = slug - else - date = File.ctime(filename) - ext = basename[/\.[a-z]+$/, 0] - slug = basename.sub(ext, '') - end - - context['file'] = { - 'date' => date, - 'name' => basename, - 'slug' => slug, - 'url' => url - } - - context['forloop'] = { - 'name' => 'directory', - 'length' => length, - 'index' => index + 1, - 'index0' => index, - 'rindex' => length - index, - 'rindex0' => length - index - 1, - 'first' => (index == 0), - 'last' => (index == length - 1) - } - - result << render_all(@nodelist, context) - end - end - result - end - - end - -end - -Liquid::Template.register_tag('directory', Jekyll::DirectoryTag) diff --git a/plugins/gist_tag.rb b/plugins/gist_tag.rb deleted file mode 100644 index 5120115621a..00000000000 --- a/plugins/gist_tag.rb +++ /dev/null @@ -1,130 +0,0 @@ -# A Liquid tag for Jekyll sites that allows embedding Gists and showing code for non-JavaScript enabled browsers and readers. -# by: Brandon Tilly -# Source URL: https://gist.github.com/1027674 -# Post http://brandontilley.com/2011/01/31/gist-tag-for-jekyll.html -# -# Example usage: {% gist 1027674 gist_tag.rb %} //embeds a gist for this plugin - -require 'cgi' -require 'digest/md5' -require 'net/https' -require 'uri' - -module Jekyll - class GistTag < Liquid::Tag - def initialize(tag_name, text, token) - super - @text = text - @cache_disabled = false - @cache_folder = File.expand_path "../.gist-cache", File.dirname(__FILE__) - FileUtils.mkdir_p @cache_folder - end - - def render(context) - if parts = @text.match(/([a-zA-Z\d]*) (.*)/) - gist, file = parts[1].strip, parts[2].strip - else - gist, file = @text.strip, "" - end - if gist.empty? - "" - else - script_url = script_url_for gist, file - code = get_cached_gist(gist, file) || get_gist_from_web(gist, file) - html_output_for script_url, code - end - end - - def html_output_for(script_url, code) - code = CGI.escapeHTML code - <<-HTML -
-
- HTML - end - - def script_url_for(gist_id, filename) - url = "https://gist.github.com/#{gist_id}.js" - url = "#{url}?file=#{filename}" unless filename.nil? or filename.empty? - url - end - - def get_gist_url_for(gist, file) - "https://gist.githubusercontent.com/raw/#{gist}/#{file}" - end - - def cache(gist, file, data) - cache_file = get_cache_file_for gist, file - File.open(cache_file, "w") do |io| - io.write data - end - end - - def get_cached_gist(gist, file) - return nil if @cache_disabled - cache_file = get_cache_file_for gist, file - File.read cache_file if File.exist? cache_file - end - - def get_cache_file_for(gist, file) - bad_chars = /[^a-zA-Z0-9\-_.]/ - gist = gist.gsub bad_chars, '' - file = file.gsub bad_chars, '' - md5 = Digest::MD5.hexdigest "#{gist}-#{file}" - File.join @cache_folder, "#{gist}-#{file}-#{md5}.cache" - end - - def get_gist_from_web(gist, file) - gist_url = get_gist_url_for(gist, file) - data = get_web_content(gist_url) - - locations = Array.new - while (data.code.to_i == 301 || data.code.to_i == 302) - data = handle_gist_redirecting(data) - break if locations.include? data.header['Location'] - locations << data.header['Location'] - end - - if data.code.to_i != 200 - raise RuntimeError, "Gist replied with #{data.code} for #{gist_url}" - end - - cache(gist, file, data.body) unless @cache_disabled - data.body - end - - def handle_gist_redirecting(data) - redirected_url = data.header['Location'] - if redirected_url.nil? || redirected_url.empty? - raise ArgumentError, "GitHub replied with a 302 but didn't provide a location in the response headers." - end - - get_web_content(redirected_url) - end - - def get_web_content(url) - raw_uri = URI.parse url - proxy = ENV['http_proxy'] - if proxy - proxy_uri = URI.parse(proxy) - https = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port).new raw_uri.host, raw_uri.port - else - https = Net::HTTP.new raw_uri.host, raw_uri.port - end - https.use_ssl = true - https.verify_mode = OpenSSL::SSL::VERIFY_NONE - request = Net::HTTP::Get.new raw_uri.request_uri - data = https.request request - end - end - - class GistTagNoCache < GistTag - def initialize(tag_name, text, token) - super - @cache_disabled = true - end - end -end - -Liquid::Template.register_tag('gist', Jekyll::GistTag) -Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache) diff --git a/plugins/haml.rb b/plugins/haml.rb deleted file mode 100644 index 7e548dec973..00000000000 --- a/plugins/haml.rb +++ /dev/null @@ -1,24 +0,0 @@ -module Jekyll - require 'haml' - class HamlConverter < Converter - safe true - priority :low - - def matches(ext) - ext =~ /haml/i - end - - def output_ext(ext) - ".html" - end - - def convert(content) - begin - engine = Haml::Engine.new(content) - engine.render - rescue StandardError => e - puts "!!! HAML Error: " + e.message - end - end - end -end diff --git a/plugins/image_tag.rb b/plugins/image_tag.rb deleted file mode 100644 index 4567000707c..00000000000 --- a/plugins/image_tag.rb +++ /dev/null @@ -1,50 +0,0 @@ -# Title: Simple Image tag for Jekyll -# Authors: Brandon Mathis http://brandonmathis.com -# Felix Schäfer, Frederic Hemberger -# Description: Easily output images with optional class names, width, height, title and alt attributes -# -# Syntax {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | "title text" ["alt text"]] %} -# -# Examples: -# {% img /images/ninja.png Ninja Attack! %} -# {% img left half http://site.com/images/ninja.png Ninja Attack! %} -# {% img left half http://site.com/images/ninja.png 150 150 "Ninja Attack!" "Ninja in attack posture" %} -# -# Output: -# -# Ninja Attack! -# Ninja in attack posture -# - -module Jekyll - - class ImageTag < Liquid::Tag - @img = nil - - def initialize(tag_name, markup, tokens) - attributes = ['class', 'src', 'width', 'height', 'title'] - - if markup =~ /(?\S.*\s+)?(?(?:https?:\/\/|\/|\S+\/)\S+)(?:\s+(?\d+))?(?:\s+(?\d+))?(?\s+.+)?/i - @img = attributes.reduce({}) { |img, attr| img[attr] = $~[attr].strip if $~[attr]; img } - if /(?:"|')(?<title>[^"']+)?(?:"|')\s+(?:"|')(?<alt>[^"']+)?(?:"|')/ =~ @img['title'] - @img['title'] = title - @img['alt'] = alt - else - @img['alt'] = @img['title'].gsub!(/"/, '"') if @img['title'] - end - @img['class'].gsub!(/"/, '') if @img['class'] - end - super - end - - def render(context) - if @img - "<img #{@img.collect {|k,v| "#{k}=\"#{v}\"" if v}.join(" ")}>" - else - "Error processing input, expected syntax: {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | \"title text\" [\"alt text\"]] %}" - end - end - end -end - -Liquid::Template.register_tag('img', Jekyll::ImageTag) diff --git a/plugins/include_code.rb b/plugins/include_code.rb deleted file mode 100644 index a61d06cf6aa..00000000000 --- a/plugins/include_code.rb +++ /dev/null @@ -1,71 +0,0 @@ -# Title: Include Code Tag for Jekyll -# Author: Brandon Mathis http://brandonmathis.com -# Description: Import files on your filesystem into any blog post as embedded code snippets with syntax highlighting and a download link. -# Configuration: You can set default import path in _config.yml (defaults to code_dir: downloads/code) -# -# Syntax {% include_code path/to/file %} -# -# Example 1: -# {% include_code javascripts/test.js %} -# -# This will import test.js from source/downloads/code/javascripts/test.js -# and output the contents in a syntax highlighted code block inside a figure, -# with a figcaption listing the file name and download link -# -# Example 2: -# You can also include an optional title for the <figcaption> -# -# {% include_code Example 2 javascripts/test.js %} -# -# will output a figcaption with the title: Example 2 (test.js) -# - -require './plugins/pygments_code' -require './plugins/raw' -require 'pathname' - -module Jekyll - - class IncludeCodeTag < Liquid::Tag - def initialize(tag_name, markup, tokens) - @title = nil - @file = nil - if markup.strip =~ /\s*lang:(\S+)/i - @filetype = $1 - markup = markup.strip.sub(/lang:\S+/i,'') - end - if markup.strip =~ /(.*)?(\s+|^)(\/*\S+)/i - @title = $1 || nil - @file = $3 - end - super - end - - def render(context) - code_dir = (context.registers[:site].config['code_dir'].sub(/^\//,'') || 'downloads/code') - code_path = (Pathname.new(context.registers[:site].source) + code_dir).expand_path - file = code_path + @file - - if File.symlink?(code_path) - return "Code directory '#{code_path}' cannot be a symlink" - end - - unless file.file? - return "File #{file} could not be found" - end - - Dir.chdir(code_path) do - code = file.read - @filetype = file.extname.sub('.','') if @filetype.nil? - title = @title ? "#{@title} (#{file.basename})" : file.basename - url = "/#{code_dir}/#{@file}" - source = "<figure class='code'><figcaption><span>#{title}</span> <a href='#{url}'>download</a></figcaption>\n" - source += "#{HighlightCode::highlight(code, @filetype)}</figure>" - TemplateWrapper::safe_wrap(source) - end - end - end - -end - -Liquid::Template.register_tag('include_code', Jekyll::IncludeCodeTag) diff --git a/plugins/jsfiddle.rb b/plugins/jsfiddle.rb deleted file mode 100644 index 815910e24d5..00000000000 --- a/plugins/jsfiddle.rb +++ /dev/null @@ -1,40 +0,0 @@ -# Title: jsFiddle tag for Jekyll -# Author: Brian Arnold (@brianarn) -# Description: -# Given a jsFiddle shortcode, outputs the jsFiddle iframe code. -# Using 'default' will preserve defaults as specified by jsFiddle. -# -# Syntax: {% jsfiddle shorttag [tabs] [skin] [height] [width] %} -# -# Examples: -# -# Input: {% jsfiddle ccWP7 %} -# Output: <iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/ccWP7/embedded/js,resources,html,css,result/light/"></iframe> -# -# Input: {% jsfiddle ccWP7 js,html,result %} -# Output: <iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/ccWP7/embedded/js,html,result/light/"></iframe> -# - -module Jekyll - class JsFiddle < Liquid::Tag - def initialize(tag_name, markup, tokens) - if /(?<fiddle>\w+\/?\d?)(?:\s+(?<sequence>[\w,]+))?(?:\s+(?<skin>\w+))?(?:\s+(?<height>\w+))?(?:\s+(?<width>\w+))?/ =~ markup - @fiddle = fiddle - @sequence = (sequence unless sequence == 'default') || 'js,resources,html,css,result' - @skin = (skin unless skin == 'default') || 'light' - @width = width || '100%' - @height = height || '300px' - end - end - - def render(context) - if @fiddle - "<iframe style=\"width: #{@width}; height: #{@height}\" frameborder=\"0\" seamless=\"seamless\" src=\"http://jsfiddle.net/#{@fiddle}/embedded/#{@sequence}/#{@skin}/\"></iframe>" - else - "Error processing input, expected syntax: {% jsfiddle shorttag [tabs] [skin] [height] [width] %}" - end - end - end -end - -Liquid::Template.register_tag('jsfiddle', Jekyll::JsFiddle) diff --git a/plugins/octopress_filters.rb b/plugins/octopress_filters.rb deleted file mode 100644 index 9c7fa6c5877..00000000000 --- a/plugins/octopress_filters.rb +++ /dev/null @@ -1,142 +0,0 @@ -#custom filters for Octopress -require './plugins/backtick_code_block' -require 'octopress-hooks' -require 'jekyll-sitemap' -require 'octopress-date-format' -require './plugins/raw' -require 'rubypants' - -module OctopressFilters - def self.pre_filter(page) - if page.ext.match('html|textile|markdown|md|haml|slim|xml') - input = BacktickCodeBlock::render_code_block(page.content) - page.content = input.gsub /(<figure.+?>.+?<\/figure>)/m do - TemplateWrapper::safe_wrap($1) - end - end - end - def self.post_filter(page) - if page.ext.match('html|textile|markdown|md|haml|slim|xml') - page.output = TemplateWrapper::unwrap(page.output) - end - - page.output = RubyPants.new(page.output).to_html - end - - class PageFilters < Octopress::Hooks::Page - def pre_render(page) - OctopressFilters::pre_filter(page) - end - - def post_render(page) - OctopressFilters::post_filter(page) - end - end - - class PostFilters < Octopress::Hooks::Post - def pre_render(post) - OctopressFilters::pre_filter(post) - end - - def post_render(post) - OctopressFilters::post_filter(post) - end - end -end - - -module OctopressLiquidFilters - - # Used on the blog index to split posts on the <!--more--> marker - def excerpt(input) - if input.index(/<!--\s*more\s*-->/i) - input.split(/<!--\s*more\s*-->/i)[0] - else - input - end - end - - # Checks for excerpts (helpful for template conditionals) - def has_excerpt(input) - input =~ /<!--\s*more\s*-->/i ? true : false - end - - # Summary is used on the Archive pages to return the first block of content from a post. - def summary(input) - if input.index(/\n\n/) - input.split(/\n\n/)[0] - else - input - end - end - - # Extracts raw content DIV from template, used for page description as {{ content }} - # contains complete sub-template code on main page level - def raw_content(input) - /<div class="entry-content">(?<content>[\s\S]*?)<\/div>\s*<(footer|\/article)>/ =~ input - return (content.nil?) ? input : content - end - - # Escapes CDATA sections in post content - def cdata_escape(input) - input.gsub(/<!\[CDATA\[/, '<![CDATA[').gsub(/\]\]>/, ']]>') - end - - # Replaces relative urls with full urls - def expand_urls(input, url='') - url ||= '/' - input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\/>]{1}[^\"'>]*)/ do - $1+url+$3 - end - end - - # Improved version of Liquid's truncate: - # - Doesn't cut in the middle of a word. - # - Uses typographically correct ellipsis (…) insted of '...' - def truncate(input, length) - if input.length > length && input[0..(length-1)] =~ /(.+)\b.+$/im - $1.strip + ' …' - else - input - end - end - - # Improved version of Liquid's truncatewords: - # - Uses typographically correct ellipsis (…) insted of '...' - def truncatewords(input, length) - truncate = input.split(' ') - if truncate.length > length - truncate[0..length-1].join(' ').strip + ' …' - else - input - end - end - - # Condenses multiple spaces and tabs into a single space - def condense_spaces(input) - input.gsub(/\s{2,}/, ' ') - end - - # Removes trailing forward slash from a string for easily appending url segments - def strip_slash(input) - if input =~ /(.+)\/$|^\/$/ - input = $1 - end - input - end - - # Returns a url without the protocol (http://) - def shorthand_url(input) - input.gsub /(https?:\/\/)(\S+)/ do - $2 - end - end - - # Returns a title cased string based on John Gruber's title case http://daringfireball.net/2008/08/title_case_update - def titlecase(input) - input.titlecase - end - -end -Liquid::Template.register_filter OctopressLiquidFilters - diff --git a/plugins/pullquote.rb b/plugins/pullquote.rb deleted file mode 100644 index 3c65e66e88d..00000000000 --- a/plugins/pullquote.rb +++ /dev/null @@ -1,45 +0,0 @@ -# -# Author: Brandon Mathis -# Based on the semantic pullquote technique by Maykel Loomans at http://miekd.com/articles/pull-quotes-with-html5-and-css/ -# -# Outputs a span with a data-pullquote attribute set from the marked pullquote. Example: -# -# {% pullquote %} -# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful. -# It is important to note, {" pullquotes are merely visual in presentation and should not appear twice in the text. "} That is why it is prefered -# to use a CSS only technique for styling pullquotes. -# {% endpullquote %} -# ...will output... -# <p> -# <span data-pullquote="pullquotes are merely visual in presentation and should not appear twice in the text."> -# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful. -# It is important to note, pullquotes are merely visual in presentation and should not appear twice in the text. This is why a CSS only approach -# for styling pullquotes is prefered. -# </span> -# </p> -# -# {% pullquote left %} will create a left-aligned pullquote instead. -# -# Note: this plugin now creates pullquotes with the class of pullquote-right by default - -module Jekyll - - class PullquoteTag < Liquid::Block - def initialize(tag_name, markup, tokens) - @align = (markup =~ /left/i) ? "left" : "right" - super - end - - def render(context) - output = super - if output =~ /\{"\s*(.+?)\s*"\}/m - @quote = RubyPants.new($1).to_html - "<span class='pullquote-#{@align}' data-pullquote='#{@quote}'>#{output.gsub(/\{"\s*|\s*"\}/, '')}</span>" - else - return "Surround your pullquote like this {\" text to be quoted \"}" - end - end - end -end - -Liquid::Template.register_tag('pullquote', Jekyll::PullquoteTag) diff --git a/plugins/pygments_code.rb b/plugins/pygments_code.rb deleted file mode 100644 index c0f4de9220f..00000000000 --- a/plugins/pygments_code.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'pygments' -require 'fileutils' -require 'digest/md5' - -PYGMENTS_CACHE_DIR = File.expand_path('../../.pygments-cache', __FILE__) -FileUtils.mkdir_p(PYGMENTS_CACHE_DIR) - -module HighlightCode - def self.highlight(str, lang) - lang = 'ruby' if lang == 'ru' - lang = 'objc' if lang == 'm' - lang = 'perl' if lang == 'pl' - lang = 'yaml' if lang == 'yml' - str = pygments(str, lang).match(/<pre>(.+)<\/pre>/m)[1].to_s.gsub(/ *$/, '') #strip out divs <div class="highlight"> - tableize_code(str, lang) - end - - def self.pygments(code, lang) - if defined?(PYGMENTS_CACHE_DIR) - path = File.join(PYGMENTS_CACHE_DIR, "#{lang}-#{Digest::MD5.hexdigest(code)}.html") - if File.exist?(path) - highlighted_code = File.read(path) - else - begin - highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true}) - rescue MentosError - raise "Pygments can't parse unknown language: #{lang}." - end - File.open(path, 'w') {|f| f.print(highlighted_code) } - end - else - highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true}) - end - highlighted_code - end - def self.tableize_code (str, lang = '') - table = '<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers">' - code = '' - str.lines.each_with_index do |line,index| - table += "<span class='line-number'>#{index+1}</span>\n" - code += "<span class='line'>#{line}</span>" - end - table += "</pre></td><td class='code'><pre><code class='#{lang}'>#{code}</code></pre></td></tr></table></div>" - end -end diff --git a/plugins/raw.rb b/plugins/raw.rb deleted file mode 100644 index e97c9459bba..00000000000 --- a/plugins/raw.rb +++ /dev/null @@ -1,40 +0,0 @@ -# Author: Brandon Mathis -# Description: Provides plugins with a method for wrapping and unwrapping input to prevent Markdown and Textile from parsing it. -# Purpose: This is useful for preventing Markdown and Textile from being too aggressive and incorrectly parsing in-line HTML. -module TemplateWrapper - # Wrap input with a <div> - def self.safe_wrap(input) - "<div class='bogus-wrapper'><notextile>#{input}</notextile></div>" - end - # This must be applied after the - def self.unwrap(input) - input.gsub /<div class='bogus-wrapper'><notextile>(.+?)<\/notextile><\/div>/m do - $1 - end - end -end - -# Author: phaer, https://github.com/phaer -# Source: https://gist.github.com/1020852 -# Description: Raw tag for jekyll. Keeps liquid from parsing text betweeen {% raw %} and {% endraw %} - -module Jekyll - class RawTag < Liquid::Block - def parse(tokens) - @nodelist ||= [] - @nodelist.clear - - while token = tokens.shift - if token =~ FullToken - if block_delimiter == $1 - end_tag - return - end - end - @nodelist << token if not token.empty? - end - end - end -end - -Liquid::Template.register_tag('raw', Jekyll::RawTag) diff --git a/plugins/render_partial.rb b/plugins/render_partial.rb deleted file mode 100644 index b6ebfe8b549..00000000000 --- a/plugins/render_partial.rb +++ /dev/null @@ -1,69 +0,0 @@ -# Title: Render Partial Tag for Jekyll -# Author: Brandon Mathis http://brandonmathis.com -# Description: Import files on your filesystem into any blog post and render them inline. -# Note: Paths are relative to the source directory, if you import a file with yaml front matter, the yaml will be stripped out. -# -# Syntax {% render_partial path/to/file %} -# -# Example 1: -# {% render_partial about/_bio.markdown %} -# -# This will import source/about/_bio.markdown and render it inline. -# In this example I used an underscore at the beginning of the filename to prevent Jekyll -# from generating an about/bio.html (Jekyll doesn't convert files beginning with underscores) -# -# Example 2: -# {% render_partial ../README.markdown %} -# -# You can use relative pathnames, to include files outside of the source directory. -# This might be useful if you want to have a page for a project's README without having -# to duplicated the contents -# -# - -require 'pathname' -require './plugins/octopress_filters' - -module Jekyll - - class RenderPartialTag < Liquid::Tag - include OctopressFilters - def initialize(tag_name, markup, tokens) - @file = nil - @raw = false - if markup =~ /^(\S+)\s?(\w+)?/ - @file = $1.strip - @raw = $2 == 'raw' - end - super - end - - def render(context) - file_dir = (context.registers[:site].source || 'source') - file_path = Pathname.new(file_dir).expand_path - file = file_path + @file - - unless file.file? - return "File #{file} could not be found" - end - - Dir.chdir(file_path) do - contents = file.read - if contents =~ /\A-{3}.+[^\A]-{3}\n(.+)/m - contents = $1.lstrip - end - contents = pre_filter(contents) - if @raw - contents - else - partial = Liquid::Template.parse(contents) - context.stack do - partial.render(context) - end - end - end - end - end -end - -Liquid::Template.register_tag('render_partial', Jekyll::RenderPartialTag) diff --git a/plugins/rubypants.rb b/plugins/rubypants.rb deleted file mode 100644 index e4f4502f57c..00000000000 --- a/plugins/rubypants.rb +++ /dev/null @@ -1,489 +0,0 @@ -# -# = RubyPants -- SmartyPants ported to Ruby -# -# Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com> -# Copyright (C) 2004 Christian Neukirchen -# -# Incooporates ideas, comments and documentation by Chad Miller -# Copyright (C) 2004 Chad Miller -# -# Original SmartyPants by John Gruber -# Copyright (C) 2003 John Gruber -# - -# -# = RubyPants -- SmartyPants ported to Ruby -# -# == Synopsis -# -# RubyPants is a Ruby port of the smart-quotes library SmartyPants. -# -# The original "SmartyPants" is a free web publishing plug-in for -# Movable Type, Blosxom, and BBEdit that easily translates plain ASCII -# punctuation characters into "smart" typographic punctuation HTML -# entities. -# -# -# == Description -# -# RubyPants can perform the following transformations: -# -# * Straight quotes (<tt>"</tt> and <tt>'</tt>) into "curly" quote -# HTML entities -# * Backticks-style quotes (<tt>``like this''</tt>) into "curly" quote -# HTML entities -# * Dashes (<tt>--</tt> and <tt>---</tt>) into en- and em-dash -# entities -# * Three consecutive dots (<tt>...</tt> or <tt>. . .</tt>) into an -# ellipsis entity -# -# This means you can write, edit, and save your posts using plain old -# ASCII straight quotes, plain dashes, and plain dots, but your -# published posts (and final HTML output) will appear with smart -# quotes, em-dashes, and proper ellipses. -# -# RubyPants does not modify characters within <tt><pre></tt>, -# <tt><code></tt>, <tt><kbd></tt>, <tt><math></tt> or -# <tt><script></tt> tag blocks. Typically, these tags are used to -# display text where smart quotes and other "smart punctuation" would -# not be appropriate, such as source code or example markup. -# -# -# == Backslash Escapes -# -# If you need to use literal straight quotes (or plain hyphens and -# periods), RubyPants accepts the following backslash escape sequences -# to force non-smart punctuation. It does so by transforming the -# escape sequence into a decimal-encoded HTML entity: -# -# \\ \" \' \. \- \` -# -# This is useful, for example, when you want to use straight quotes as -# foot and inch marks: 6'2" tall; a 17" iMac. (Use <tt>6\'2\"</tt> -# resp. <tt>17\"</tt>.) -# -# -# == Algorithmic Shortcomings -# -# One situation in which quotes will get curled the wrong way is when -# apostrophes are used at the start of leading contractions. For -# example: -# -# 'Twas the night before Christmas. -# -# In the case above, RubyPants will turn the apostrophe into an -# opening single-quote, when in fact it should be a closing one. I -# don't think this problem can be solved in the general case--every -# word processor I've tried gets this wrong as well. In such cases, -# it's best to use the proper HTML entity for closing single-quotes -# ("<tt>’</tt>") by hand. -# -# -# == Bugs -# -# To file bug reports or feature requests (except see above) please -# send email to: mailto:chneukirchen@gmail.com -# -# If the bug involves quotes being curled the wrong way, please send -# example text to illustrate. -# -# -# == Authors -# -# John Gruber did all of the hard work of writing this software in -# Perl for Movable Type and almost all of this useful documentation. -# Chad Miller ported it to Python to use with Pyblosxom. -# -# Christian Neukirchen provided the Ruby port, as a general-purpose -# library that follows the *Cloth API. -# -# -# == Copyright and License -# -# === SmartyPants license: -# -# Copyright (c) 2003 John Gruber -# (http://daringfireball.net) -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# * Neither the name "SmartyPants" nor the names of its contributors -# may be used to endorse or promote products derived from this -# software without specific prior written permission. -# -# This software is provided by the copyright holders and contributors -# "as is" and any express or implied warranties, including, but not -# limited to, the implied warranties of merchantability and fitness -# for a particular purpose are disclaimed. In no event shall the -# copyright owner or contributors be liable for any direct, indirect, -# incidental, special, exemplary, or consequential damages (including, -# but not limited to, procurement of substitute goods or services; -# loss of use, data, or profits; or business interruption) however -# caused and on any theory of liability, whether in contract, strict -# liability, or tort (including negligence or otherwise) arising in -# any way out of the use of this software, even if advised of the -# possibility of such damage. -# -# === RubyPants license -# -# RubyPants is a derivative work of SmartyPants and smartypants.py. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# This software is provided by the copyright holders and contributors -# "as is" and any express or implied warranties, including, but not -# limited to, the implied warranties of merchantability and fitness -# for a particular purpose are disclaimed. In no event shall the -# copyright owner or contributors be liable for any direct, indirect, -# incidental, special, exemplary, or consequential damages (including, -# but not limited to, procurement of substitute goods or services; -# loss of use, data, or profits; or business interruption) however -# caused and on any theory of liability, whether in contract, strict -# liability, or tort (including negligence or otherwise) arising in -# any way out of the use of this software, even if advised of the -# possibility of such damage. -# -# -# == Links -# -# John Gruber:: http://daringfireball.net -# SmartyPants:: http://daringfireball.net/projects/smartypants -# -# Chad Miller:: http://web.chad.org -# -# Christian Neukirchen:: http://kronavita.de/chris -# - - -class RubyPants < String - - # Create a new RubyPants instance with the text in +string+. - # - # Allowed elements in the options array: - # - # 0 :: do nothing - # 1 :: enable all, using only em-dash shortcuts - # 2 :: enable all, using old school en- and em-dash shortcuts (*default*) - # 3 :: enable all, using inverted old school en and em-dash shortcuts - # -1 :: stupefy (translate HTML entities to their ASCII-counterparts) - # - # If you don't like any of these defaults, you can pass symbols to change - # RubyPants' behavior: - # - # <tt>:quotes</tt> :: quotes - # <tt>:backticks</tt> :: backtick quotes (``double'' only) - # <tt>:allbackticks</tt> :: backtick quotes (``double'' and `single') - # <tt>:dashes</tt> :: dashes - # <tt>:oldschool</tt> :: old school dashes - # <tt>:inverted</tt> :: inverted old school dashes - # <tt>:ellipses</tt> :: ellipses - # <tt>:convertquotes</tt> :: convert <tt>"</tt> entities to - # <tt>"</tt> for Dreamweaver users - # <tt>:stupefy</tt> :: translate RubyPants HTML entities - # to their ASCII counterparts. - # - def initialize(string, options=[2]) - super string - @options = [*options] - end - - # Apply SmartyPants transformations. - def to_html - do_quotes = do_backticks = do_dashes = do_ellipses = do_stupify = nil - convert_quotes = false - - if @options.include? 0 - # Do nothing. - return self - elsif @options.include? 1 - # Do everything, turn all options on. - do_quotes = do_backticks = do_ellipses = true - do_dashes = :normal - elsif @options.include? 2 - # Do everything, turn all options on, use old school dash shorthand. - do_quotes = do_backticks = do_ellipses = true - do_dashes = :oldschool - elsif @options.include? 3 - # Do everything, turn all options on, use inverted old school - # dash shorthand. - do_quotes = do_backticks = do_ellipses = true - do_dashes = :inverted - elsif @options.include?(-1) - do_stupefy = true - else - do_quotes = @options.include? :quotes - do_backticks = @options.include? :backticks - do_backticks = :both if @options.include? :allbackticks - do_dashes = :normal if @options.include? :dashes - do_dashes = :oldschool if @options.include? :oldschool - do_dashes = :inverted if @options.include? :inverted - do_ellipses = @options.include? :ellipses - convert_quotes = @options.include? :convertquotes - do_stupefy = @options.include? :stupefy - end - - # Parse the HTML - tokens = tokenize - - # Keep track of when we're inside <pre> or <code> tags. - in_pre = false - - # Here is the result stored in. - result = "" - - # This is a cheat, used to get some context for one-character - # tokens that consist of just a quote char. What we do is remember - # the last character of the previous text token, to use as context - # to curl single- character quote tokens correctly. - prev_token_last_char = nil - - tokens.each { |token| - if token.first == :tag - result << token[1] - if token[1] =~ %r!<(/?)(?:pre|code|kbd|script|math)[\s>]! - in_pre = ($1 != "/") # Opening or closing tag? - end - else - t = token[1] - - # Remember last char of this token before processing. - last_char = t[-1].chr - - unless in_pre - t = process_escapes t - - t.gsub!(/"/, '"') if convert_quotes - - if do_dashes - t = educate_dashes t if do_dashes == :normal - t = educate_dashes_oldschool t if do_dashes == :oldschool - t = educate_dashes_inverted t if do_dashes == :inverted - end - - t = educate_ellipses t if do_ellipses - - # Note: backticks need to be processed before quotes. - if do_backticks - t = educate_backticks t - t = educate_single_backticks t if do_backticks == :both - end - - if do_quotes - if t == "'" - # Special case: single-character ' token - if prev_token_last_char =~ /\S/ - t = "’" - else - t = "‘" - end - elsif t == '"' - # Special case: single-character " token - if prev_token_last_char =~ /\S/ - t = "”" - else - t = "“" - end - else - # Normal case: - t = educate_quotes t - end - end - - t = stupefy_entities t if do_stupefy - end - - prev_token_last_char = last_char - result << t - end - } - - # Done - result - end - - protected - - # Return the string, with after processing the following backslash - # escape sequences. This is useful if you want to force a "dumb" quote - # or other character to appear. - # - # Escaped are: - # \\ \" \' \. \- \` - # - def process_escapes(str) - str.gsub('\\\\', '\'). - gsub('\"', '"'). - gsub("\\\'", '''). - gsub('\.', '.'). - gsub('\-', '-'). - gsub('\`', '`') - end - - # The string, with each instance of "<tt>--</tt>" translated to an - # em-dash HTML entity. - # - def educate_dashes(str) - str.gsub(/--/, '—') - end - - # The string, with each instance of "<tt>--</tt>" translated to an - # en-dash HTML entity, and each "<tt>---</tt>" translated to an - # em-dash HTML entity. - # - def educate_dashes_oldschool(str) - str.gsub(/---/, '—').gsub(/--/, '–') - end - - # Return the string, with each instance of "<tt>--</tt>" translated - # to an em-dash HTML entity, and each "<tt>---</tt>" translated to - # an en-dash HTML entity. Two reasons why: First, unlike the en- and - # em-dash syntax supported by +educate_dashes_oldschool+, it's - # compatible with existing entries written before SmartyPants 1.1, - # back when "<tt>--</tt>" was only used for em-dashes. Second, - # em-dashes are more common than en-dashes, and so it sort of makes - # sense that the shortcut should be shorter to type. (Thanks to - # Aaron Swartz for the idea.) - # - def educate_dashes_inverted(str) - str.gsub(/---/, '–').gsub(/--/, '—') - end - - # Return the string, with each instance of "<tt>...</tt>" translated - # to an ellipsis HTML entity. Also converts the case where there are - # spaces between the dots. - # - def educate_ellipses(str) - str.gsub('...', '…').gsub('. . .', '…') - end - - # Return the string, with "<tt>``backticks''</tt>"-style single quotes - # translated into HTML curly quote entities. - # - def educate_backticks(str) - str.gsub("``", '“').gsub("''", '”') - end - - # Return the string, with "<tt>`backticks'</tt>"-style single quotes - # translated into HTML curly quote entities. - # - def educate_single_backticks(str) - str.gsub("`", '‘').gsub("'", '’') - end - - # Return the string, with "educated" curly quote HTML entities. - # - def educate_quotes(str) - punct_class = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]' - - str = str.dup - - # Special case if the very first character is a quote followed by - # punctuation at a non-word-break. Close the quotes by brute - # force: - str.gsub!(/^'(?=#{punct_class}\B)/, '’') - str.gsub!(/^"(?=#{punct_class}\B)/, '”') - - # Special case for double sets of quotes, e.g.: - # <p>He said, "'Quoted' words in a larger quote."</p> - str.gsub!(/"'(?=\w)/, '“‘') - str.gsub!(/'"(?=\w)/, '‘“') - - # Special case for decade abbreviations (the '80s): - str.gsub!(/'(?=\d\ds)/, '’') - - close_class = %![^\ \t\r\n\\[\{\(\-]! - dec_dashes = '–|—' - - # Get most opening single quotes: - str.gsub!(/(\s| |--|&[mn]dash;|#{dec_dashes}|ȁ[34];)'(?=\w)/, - '\1‘') - # Single closing quotes: - str.gsub!(/(#{close_class})'/, '\1’') - str.gsub!(/'(\s|s\b|$)/, '’\1') - # Any remaining single quotes should be opening ones: - str.gsub!(/'/, '‘') - - # Get most opening double quotes: - str.gsub!(/(\s| |--|&[mn]dash;|#{dec_dashes}|ȁ[34];)"(?=\w)/, - '\1“') - # Double closing quotes: - str.gsub!(/(#{close_class})"/, '\1”') - str.gsub!(/"(\s|s\b|$)/, '”\1') - # Any remaining quotes should be opening ones: - str.gsub!(/"/, '“') - - str - end - - # Return the string, with each RubyPants HTML entity translated to - # its ASCII counterpart. - # - # Note: This is not reversible (but exactly the same as in SmartyPants) - # - def stupefy_entities(str) - str. - gsub(/–/, '-'). # en-dash - gsub(/—/, '--'). # em-dash - - gsub(/‘/, "'"). # open single quote - gsub(/’/, "'"). # close single quote - - gsub(/“/, '"'). # open double quote - gsub(/”/, '"'). # close double quote - - gsub(/…/, '...') # ellipsis - end - - # Return an array of the tokens comprising the string. Each token is - # either a tag (possibly with nested, tags contained therein, such - # as <tt><a href="<MTFoo>"></tt>, or a run of text between - # tags. Each element of the array is a two-element array; the first - # is either :tag or :text; the second is the actual value. - # - # Based on the <tt>_tokenize()</tt> subroutine from Brad Choate's - # MTRegex plugin. <http://www.bradchoate.com/past/mtregex.php> - # - # This is actually the easier variant using tag_soup, as used by - # Chad Miller in the Python port of SmartyPants. - # - def tokenize - tag_soup = /([^<]*)(<[^>]*>)/ - - tokens = [] - - prev_end = 0 - scan(tag_soup) { - tokens << [:text, $1] if $1 != "" - tokens << [:tag, $2] - - prev_end = $~.end(0) - } - - if prev_end < size - tokens << [:text, self[prev_end..-1]] - end - - tokens - end -end diff --git a/plugins/video_tag.rb b/plugins/video_tag.rb deleted file mode 100644 index c6e67b77ca2..00000000000 --- a/plugins/video_tag.rb +++ /dev/null @@ -1,56 +0,0 @@ -# Title: Simple Video tag for Jekyll -# Author: Brandon Mathis http://brandonmathis.com -# Description: Easily output MPEG4 HTML5 video with a flash backup. -# -# Syntax {% video url/to/video [width height] [url/to/poster] %} -# -# Example: -# {% video http://site.com/video.mp4 720 480 http://site.com/poster-frame.jpg %} -# -# Output: -# <video width='720' height='480' preload='none' controls poster='http://site.com/poster-frame.jpg'> -# <source src='http://site.com/video.mp4' type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'/> -# </video> -# - -module Jekyll - - class VideoTag < Liquid::Tag - @video = nil - @poster = '' - @height = '' - @width = '' - - def initialize(tag_name, markup, tokens) - if markup =~ /(https?:\S+)(\s+(https?:\S+))?(\s+(https?:\S+))?(\s+(\d+)\s(\d+))?(\s+(https?:\S+))?/i - @video = [$1, $3, $5].compact - @width = $7 - @height = $8 - @poster = $10 - end - super - end - - def render(context) - output = super - type = { - 'mp4' => "type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'", - 'ogv' => "type='video/ogg; codecs=theora, vorbis'", - 'webm' => "type='video/webm; codecs=vp8, vorbis'" - } - if @video.size > 0 - video = "<video width='#{@width}' height='#{@height}' preload='none' controls poster='#{@poster}'>" - @video.each do |v| - t = v.match(/([^\.]+)$/)[1] - video += "<source src='#{v}' #{type[t]}>" - end - video += "</video>" - else - "Error processing input, expected syntax: {% video url/to/video [url/to/video] [url/to/video] [width height] [url/to/poster] %}" - end - end - end -end - -Liquid::Template.register_tag('video', Jekyll::VideoTag) - diff --git a/sass/_partials.scss b/sass/_partials.scss index 99c28b6378c..4336c71cdba 100644 --- a/sass/_partials.scss +++ b/sass/_partials.scss @@ -2,7 +2,7 @@ @import "partials/navigation"; @import "partials/blog"; @import "partials/sharing"; -@import "partials/syntax"; +// @import "partials/syntax"; @import "partials/archive"; @import "partials/sidebar"; @import "partials/footer"; diff --git a/sass/custom/_coderay.scss b/sass/custom/_coderay.scss new file mode 100644 index 00000000000..a3417c31bec --- /dev/null +++ b/sass/custom/_coderay.scss @@ -0,0 +1,144 @@ +code { + background: #fff; + font-size: .8em; + line-height: 1.5em; + color: #555; + border: 1px solid #ddd; + @include border-radius(.4em); + padding: 0 .3em; +} + +.CodeRay { + background-color: #FFF; + border: 1px solid #CCC; + font-family: Monaco, "Courier New", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace; + color: #000; + padding: 1em 0px 1em 1em; + font-size: 12px; + margin-bottom: 16px; +} + +.CodeRay pre { + margin: 0px; +} + +div.CodeRay { } +span.CodeRay { white-space: pre; border: 0px; padding: 2px } + +table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px } +table.CodeRay td { + padding: 1em 0.5em; + vertical-align: top; +} + +.CodeRay .line-numbers, .CodeRay .no { + background-color: #ECECEC; + color: #AAA; + text-align: right; +} + +.CodeRay .line-numbers a { + color: #AAA; +} + +.CodeRay .line-numbers tt { font-weight: bold } +.CodeRay .line-numbers .highlighted { color: red } +.CodeRay .line { display: block; float: left; width: 100%; } +.CodeRay span.line-numbers { padding: 0px 4px } +.CodeRay .code { width: 100% } + +ol.CodeRay { font-size: 10pt } +ol.CodeRay li { white-space: pre } + +.CodeRay .code pre { overflow: auto } +.CodeRay .debug { color:white ! important; background:blue ! important; } + +.CodeRay .annotation { color:#007 } +.CodeRay .attribute-name { color:#f08 } +.CodeRay .attribute-value { color:#700 } +.CodeRay .binary { color:#509; font-weight:bold } +.CodeRay .comment { color:#998; font-style: italic;} +.CodeRay .char { color:#04D } +.CodeRay .char .content { color:#04D } +.CodeRay .char .delimiter { color:#039 } +.CodeRay .class { color:#458; font-weight:bold } +.CodeRay .complex { color:#A08; font-weight:bold } +.CodeRay .constant { color:teal; } +.CodeRay .color { color:#0A0 } +.CodeRay .class-variable { color:#369 } +.CodeRay .decorator { color:#B0B; } +.CodeRay .definition { color:#099; font-weight:bold } +.CodeRay .directive { color:#088; font-weight:bold } +.CodeRay .delimiter { color:black } +.CodeRay .doc { color:#970 } +.CodeRay .doctype { color:#34b } +.CodeRay .doc-string { color:#D42; font-weight:bold } +.CodeRay .escape { color:#666; font-weight:bold } +.CodeRay .entity { color:#800; font-weight:bold } +.CodeRay .error { color:#F00; background-color:#FAA } +.CodeRay .exception { color:#C00; font-weight:bold } +.CodeRay .filename { color:#099; } +.CodeRay .function { color:#900; font-weight:bold } +.CodeRay .global-variable { color:teal; font-weight:bold } +.CodeRay .hex { color:#058; font-weight:bold } +.CodeRay .integer { color:#099; } +.CodeRay .include { color:#B44; font-weight:bold } +.CodeRay .inline { color: black } +.CodeRay .inline .inline { background: #ccc } +.CodeRay .inline .inline .inline { background: #bbb } +.CodeRay .inline .inline-delimiter { color: #D14; } +.CodeRay .inline-delimiter { color: #D14; } +.CodeRay .important { color:#f00; } +.CodeRay .interpreted { color:#B2B; font-weight:bold } +.CodeRay .instance-variable { color:teal } +.CodeRay .label { color:#970; font-weight:bold } +.CodeRay .local-variable { color:#963 } +.CodeRay .octal { color:#40E; font-weight:bold } +.CodeRay .operator { } +.CodeRay .predefined-constant { font-weight:bold } +.CodeRay .predefined { color:#369; font-weight:bold } +.CodeRay .preprocessor { color:#579; } +.CodeRay .pseudo-class { color:#00C; font-weight:bold } +.CodeRay .predefined-type { color:#074; font-weight:bold } +.CodeRay .reserved, .keyword { color:#000; font-weight:bold } + +.CodeRay .key { color: #808; } +.CodeRay .key .delimiter { color: #606; } +.CodeRay .key .char { color: #80f; } +.CodeRay .value { color: #088; } + +.CodeRay .regexp { background-color:#fff0ff } +.CodeRay .regexp .content { color:#808 } +.CodeRay .regexp .delimiter { color:#404 } +.CodeRay .regexp .modifier { color:#C2C } +.CodeRay .regexp .function { color:#404; font-weight: bold } + +.CodeRay .string { color: #D20; } +.CodeRay .string .string { } +.CodeRay .string .string .string { background-color:#ffd0d0 } +.CodeRay .string .content { color: #D14; } +.CodeRay .string .char { color: #D14; } +.CodeRay .string .delimiter { color: #D14; } + +.CodeRay .shell { color:#D14 } +.CodeRay .shell .content { } +.CodeRay .shell .delimiter { color:#D14 } + +.CodeRay .symbol { color:#990073 } +.CodeRay .symbol .content { color:#A60 } +.CodeRay .symbol .delimiter { color:#630 } + +.CodeRay .tag { color:#070 } +.CodeRay .tag-special { color:#D70; font-weight:bold } +.CodeRay .type { color:#339; font-weight:bold } +.CodeRay .variable { color:#036 } + +.CodeRay .insert { background: #afa; } +.CodeRay .delete { background: #faa; } +.CodeRay .change { color: #aaf; background: #007; } +.CodeRay .head { color: #f8f; background: #505 } + +.CodeRay .insert .insert { color: #080; font-weight:bold } +.CodeRay .delete .delete { color: #800; font-weight:bold } +.CodeRay .change .change { color: #66f; } +.CodeRay .head .head { color: #f4f; } \ No newline at end of file diff --git a/sass/custom/_paulus.scss b/sass/custom/_paulus.scss index 64d75d36edc..946093b68db 100644 --- a/sass/custom/_paulus.scss +++ b/sass/custom/_paulus.scss @@ -16,14 +16,18 @@ } .front-install { + border: none; + font-size: 1em; background-color: #333; margin-bottom: 16px; display: inline-block; padding: 8px; color: #DDD; - .sh { + div:before { + content: '$'; color: #c82829; + margin-right: 6px; } } } @@ -360,4 +364,4 @@ p.note { max-height: 97px; } } -} \ No newline at end of file +} diff --git a/sass/oscailte/base/_solarized.scss b/sass/oscailte/base/_solarized.scss index 255880157ce..086044990ec 100644 --- a/sass/oscailte/base/_solarized.scss +++ b/sass/oscailte/base/_solarized.scss @@ -1,333 +1,333 @@ -// This file is just a butchered version fo the one included in the default Octopress theme. -// It could most definitely do with some cleaning up in the future. +// // This file is just a butchered version fo the one included in the default Octopress theme. +// // It could most definitely do with some cleaning up in the future. -@mixin selection($bg, $color: inherit, $text-shadow: none){ - * { - &::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; } - &::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; } - &::selection { background: $bg; color: $color; text-shadow: $text-shadow; } - } -} +// @mixin selection($bg, $color: inherit, $text-shadow: none){ +// * { +// &::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; } +// &::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; } +// &::selection { background: $bg; color: $color; text-shadow: $text-shadow; } +// } +// } -$base03: #002b36 !default; //darkest blue -$base02: #073642 !default; //dark blue -$base01: #586e75 !default; //darkest gray -$base00: #657b83 !default; //dark gray -$base0: #839496 !default; //medium gray -$base1: #93a1a1 !default; //medium light gray -$base2: #eee8d5 !default; //cream -$base3: #fdf6e3 !default; //white -$solar-yellow: #b58900 !default; -$solar-orange: #cb4b16 !default; -$solar-red: #dc322f !default; -$solar-magenta: #d33682 !default; -$solar-violet: #6c71c4 !default; -$solar-blue: #268bd2 !default; -$solar-cyan: #2aa198 !default; -$solar-green: #859900 !default; +// $base03: #002b36 !default; //darkest blue +// $base02: #073642 !default; //dark blue +// $base01: #586e75 !default; //darkest gray +// $base00: #657b83 !default; //dark gray +// $base0: #839496 !default; //medium gray +// $base1: #93a1a1 !default; //medium light gray +// $base2: #eee8d5 !default; //cream +// $base3: #fdf6e3 !default; //white +// $solar-yellow: #b58900 !default; +// $solar-orange: #cb4b16 !default; +// $solar-red: #dc322f !default; +// $solar-magenta: #d33682 !default; +// $solar-violet: #6c71c4 !default; +// $solar-blue: #268bd2 !default; +// $solar-cyan: #2aa198 !default; +// $solar-green: #859900 !default; -$solarized: dark !default; +// $solarized: dark !default; -@if $solarized == light { +// @if $solarized == light { - $_base03: $base03; - $_base02: $base02; - $_base01: $base01; - $_base00: $base00; - $_base0: $base0; - $_base1: $base1; - $_base2: $base2; - $_base3: $base3; +// $_base03: $base03; +// $_base02: $base02; +// $_base01: $base01; +// $_base00: $base00; +// $_base0: $base0; +// $_base1: $base1; +// $_base2: $base2; +// $_base3: $base3; - $base03: $_base3; - $base02: $_base2; - $base01: $_base1; - $base00: $_base0; - $base0: $_base00; - $base1: $_base01; - $base2: $_base02; - $base3: $_base03; -} +// $base03: $_base3; +// $base02: $_base2; +// $base01: $_base1; +// $base00: $_base0; +// $base0: $_base00; +// $base1: $_base01; +// $base2: $_base02; +// $base3: $_base03; +// } -/* non highlighted code colors */ -$pre-bg: $base03 !default; -$pre-border: darken($base02, 5) !default; -$pre-color: $base1 !default; +// /* non highlighted code colors */ +// $pre-bg: $base03 !default; +// $pre-border: darken($base02, 5) !default; +// $pre-color: $base1 !default; -$noise-bg: image-url('noise.png') top left !default; -$sans: "Helvetica Neue", Arial, sans-serif !default; -$mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace !default; -.sans { font-family: $sans; } -.mono { font-family: $mono; } +// $noise-bg: image-url('noise.png') top left !default; +// $sans: "Helvetica Neue", Arial, sans-serif !default; +// $mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace !default; +// .sans { font-family: $sans; } +// .mono { font-family: $mono; } -.highlight { - table {margin-bottom: 0;} - .gutter, .code { - padding: 0; - } - .gutter { - .line-number { - display: block; - } - } -} +// .highlight { +// table {margin-bottom: 0;} +// .gutter, .code { +// padding: 0; +// } +// .gutter { +// .line-number { +// display: block; +// } +// } +// } -.highlight, html .gist .gist-file .gist-syntax .gist-highlight { - table td.code { width: 100%; } - border: 1px solid $pre-border !important; -} -.highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers { - text-align: right; - font-size: 13px; - line-height: 1.45em; - @if $solarized == light { - background: lighten($base03, 1) $noise-bg !important; - border-right: 1px solid darken($base02, 2) !important; - @include box-shadow(lighten($base03, 2) -1px 0 inset); - text-shadow: lighten($base02, 2) 0 -1px; - } @else { - background: $base02 $noise-bg !important; - border-right: 1px solid darken($base03, 2) !important; - @include box-shadow(lighten($base02, 2) -1px 0 inset); - text-shadow: darken($base02, 10) 0 -1px; - } - span { color: $base01 !important; } - padding: .8em !important; - @include border-radius(0); -} +// .highlight, html .gist .gist-file .gist-syntax .gist-highlight { +// table td.code { width: 100%; } +// border: 1px solid $pre-border !important; +// } +// .highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers { +// text-align: right; +// font-size: 13px; +// line-height: 1.45em; +// @if $solarized == light { +// background: lighten($base03, 1) $noise-bg !important; +// border-right: 1px solid darken($base02, 2) !important; +// @include box-shadow(lighten($base03, 2) -1px 0 inset); +// text-shadow: lighten($base02, 2) 0 -1px; +// } @else { +// background: $base02 $noise-bg !important; +// border-right: 1px solid darken($base03, 2) !important; +// @include box-shadow(lighten($base02, 2) -1px 0 inset); +// text-shadow: darken($base02, 10) 0 -1px; +// } +// span { color: $base01 !important; } +// padding: .8em !important; +// @include border-radius(0); +// } -figure.code, .gist-file, pre { - @include box-shadow(rgba(#000, .06) 0 0 10px); - .highlight pre { @include box-shadow(none); } -} +// figure.code, .gist-file, pre { +// @include box-shadow(rgba(#000, .06) 0 0 10px); +// .highlight pre { @include box-shadow(none); } +// } -.gist .highlight, figure.code .highlight { - @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px); -} -html .gist .gist-file { - margin-bottom: 1.8em; - position: relative; - border: none; - padding-top: image-height("code_bg.png") !important; - .highlight { - margin-bottom: 0; - } - .gist-syntax { - border-bottom: 0 !important; - background: none !important; - .gist-highlight { - background: $base03 !important; - } - .highlight pre { - @extend .pre-code; - padding: 0; - } - } - .gist-meta { - padding: .6em 0.8em; - border: 1px solid lighten($base02, 2) !important; - color: $base01; - font-size: .7em !important; - @if $solarized == light { - background: lighten($base03, 2) $noise-bg; - border: 1px solid $pre-border !important; - border-top: 1px solid lighten($base03, 2) !important; - } @else { - background: $base02 $noise-bg; - } - @extend .sans; - line-height: 1.5em; - a { - color: mix($base1, $base01) !important; - &:hover { color: $base1 !important; } - } - a[href*='#file'] { - position: absolute; top: 0; left:0; right:-10px; - color: #474747 !important; - @extend .code-title; - &:hover { color: $link-color !important; } - } - a[href*=raw]{ - @extend .download-source; - top: .4em; - } - } -} -pre { - background: $pre-bg $noise-bg; - @include border-radius(.4em); - @extend .mono; - border: 1px solid $pre-border; - line-height: 1.45em; - font-size: 13px; - margin-bottom: 2.1em; - padding: .8em 1em; - color: $pre-color; - overflow: auto; -} -h3.filename { - @extend .code-title; - + pre { @include border-radius(0px); } -} +// .gist .highlight, figure.code .highlight { +// @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px); +// } +// html .gist .gist-file { +// margin-bottom: 1.8em; +// position: relative; +// border: none; +// padding-top: image-height("code_bg.png") !important; +// .highlight { +// margin-bottom: 0; +// } +// .gist-syntax { +// border-bottom: 0 !important; +// background: none !important; +// .gist-highlight { +// background: $base03 !important; +// } +// .highlight pre { +// @extend .pre-code; +// padding: 0; +// } +// } +// .gist-meta { +// padding: .6em 0.8em; +// border: 1px solid lighten($base02, 2) !important; +// color: $base01; +// font-size: .7em !important; +// @if $solarized == light { +// background: lighten($base03, 2) $noise-bg; +// border: 1px solid $pre-border !important; +// border-top: 1px solid lighten($base03, 2) !important; +// } @else { +// background: $base02 $noise-bg; +// } +// @extend .sans; +// line-height: 1.5em; +// a { +// color: mix($base1, $base01) !important; +// &:hover { color: $base1 !important; } +// } +// a[href*='#file'] { +// position: absolute; top: 0; left:0; right:-10px; +// color: #474747 !important; +// @extend .code-title; +// &:hover { color: $link-color !important; } +// } +// a[href*=raw]{ +// @extend .download-source; +// top: .4em; +// } +// } +// } +// pre { +// background: $pre-bg $noise-bg; +// @include border-radius(.4em); +// @extend .mono; +// border: 1px solid $pre-border; +// line-height: 1.45em; +// font-size: 13px; +// margin-bottom: 2.1em; +// padding: .8em 1em; +// color: $pre-color; +// overflow: auto; +// } +// h3.filename { +// @extend .code-title; +// + pre { @include border-radius(0px); } +// } -p, li { - code { - @extend .mono; - display: inline-block; - white-space: no-wrap; - background: #fff; - font-size: .8em; - line-height: 1.5em; - color: #555; - border: 1px solid #ddd; - @include border-radius(.4em); - padding: 0 .3em; - margin: -1px 0; - } - pre code { font-size: 1em !important; background: none; border: none; } -} +// p, li { +// code { +// @extend .mono; +// display: inline-block; +// white-space: no-wrap; +// background: #fff; +// font-size: .8em; +// line-height: 1.5em; +// color: #555; +// border: 1px solid #ddd; +// @include border-radius(.4em); +// padding: 0 .3em; +// margin: -1px 0; +// } +// pre code { font-size: 1em !important; background: none; border: none; } +// } -.pre-code { - font-family: $mono !important; - overflow: scroll; - overflow-y: hidden; - display: block; - padding: .8em; - overflow-x: auto; - line-height: 1.45em; - background: $base03 $noise-bg !important; - color: $base1 !important; - span { color: $base1 !important; } - span { font-style: normal !important; font-weight: normal !important; } +// .pre-code { +// font-family: $mono !important; +// overflow: scroll; +// overflow-y: hidden; +// display: block; +// padding: .8em; +// overflow-x: auto; +// line-height: 1.45em; +// background: $base03 $noise-bg !important; +// color: $base1 !important; +// span { color: $base1 !important; } +// span { font-style: normal !important; font-weight: normal !important; } - .c { color: $base01 !important; font-style: italic !important; } /* Comment */ - .cm { color: $base01 !important; font-style: italic !important; } /* Comment.Multiline */ - .cp { color: $base01 !important; font-style: italic !important; } /* Comment.Preproc */ - .c1 { color: $base01 !important; font-style: italic !important; } /* Comment.Single */ - .cs { color: $base01 !important; font-weight: bold !important; font-style: italic !important; } /* Comment.Special */ - .err { color: $solar-red !important; background: none !important; } /* Error */ - .k { color: $solar-orange !important; } /* Keyword */ - .o { color: $base1 !important; font-weight: bold !important; } /* Operator */ - .p { color: $base1 !important; } /* Operator */ - .ow { color: $solar-cyan !important; font-weight: bold !important; } /* Operator.Word */ - .gd { color: $base1 !important; background-color: mix($solar-red, $base03, 25%) !important; display: inline-block; } /* Generic.Deleted */ - .gd .x { color: $base1 !important; background-color: mix($solar-red, $base03, 35%) !important; display: inline-block; } /* Generic.Deleted.Specific */ - .ge { color: $base1 !important; font-style: italic !important; } /* Generic.Emph */ - //.gr { color: #aa0000 } /* Generic.Error */ - .gh { color: $base01 !important; } /* Generic.Heading */ - .gi { color: $base1 !important; background-color: mix($solar-green, $base03, 20%) !important; display: inline-block; } /* Generic.Inserted */ - .gi .x { color: $base1 !important; background-color: mix($solar-green, $base03, 40%) !important; display: inline-block; } /* Generic.Inserted.Specific */ - //.go { color: #888888 } /* Generic.Output */ - //.gp { color: #555555 } /* Generic.Prompt */ - .gs { color: $base1 !important; font-weight: bold !important; } /* Generic.Strong */ - .gu { color: $solar-violet !important; } /* Generic.Subheading */ - //.gt { color: #aa0000 } /* Generic.Traceback */ - .kc { color: $solar-green !important; font-weight: bold !important; } /* Keyword.Constant */ - .kd { color: $solar-blue !important; } /* Keyword.Declaration */ - .kp { color: $solar-orange !important; font-weight: bold !important; } /* Keyword.Pseudo */ - .kr { color: $solar-magenta !important; font-weight: bold !important; } /* Keyword.Reserved */ - .kt { color: $solar-cyan !important; } /* Keyword.Type */ - .n { color: $solar-blue !important; } - .na { color: $solar-blue !important; } /* Name.Attribute */ - .nb { color: $solar-green !important; } /* Name.Builtin */ - .nc { color: $solar-magenta !important;} /* Name.Class */ - .no { color: $solar-yellow !important; } /* Name.Constant */ - //.ni { color: #800080 } /* Name.Entity */ - .nl { color: $solar-green !important; } - .ne { color: $solar-blue !important; font-weight: bold !important; } /* Name.Exception */ - .nf { color: $solar-blue !important; font-weight: bold !important; } /* Name.Function */ - .nn { color: $solar-yellow !important; } /* Name.Namespace */ - .nt { color: $solar-blue !important; font-weight: bold !important; } /* Name.Tag */ - .nx { color: $solar-yellow !Important; } - //.bp { color: #999999 } /* Name.Builtin.Pseudo */ - //.vc { color: #008080 } /* Name.Variable.Class */ - .vg { color: $solar-blue !important; } /* Name.Variable.Global */ - .vi { color: $solar-blue !important; } /* Name.Variable.Instance */ - .nv { color: $solar-blue !important; } /* Name.Variable */ - //.w { color: #bbbbbb } /* Text.Whitespace */ - .mf { color: $solar-cyan !important; } /* Literal.Number.Float */ - .m { color: $solar-cyan !important; } /* Literal.Number */ - .mh { color: $solar-cyan !important; } /* Literal.Number.Hex */ - .mi { color: $solar-cyan !important; } /* Literal.Number.Integer */ - //.mo { color: #009999 } /* Literal.Number.Oct */ - .s { color: $solar-cyan !important; } /* Literal.String */ - //.sb { color: #d14 } /* Literal.String.Backtick */ - //.sc { color: #d14 } /* Literal.String.Char */ - .sd { color: $solar-cyan !important; } /* Literal.String.Doc */ - .s2 { color: $solar-cyan !important; } /* Literal.String.Double */ - .se { color: $solar-red !important; } /* Literal.String.Escape */ - //.sh { color: #d14 } /* Literal.String.Heredoc */ - .si { color: $solar-blue !important; } /* Literal.String.Interpol */ - //.sx { color: #d14 } /* Literal.String.Other */ - .sr { color: $solar-cyan !important; } /* Literal.String.Regex */ - .s1 { color: $solar-cyan !important; } /* Literal.String.Single */ - //.ss { color: #990073 } /* Literal.String.Symbol */ - //.il { color: #009999 } /* Literal.Number.Integer.Long */ - div { .gd, .gd .x, .gi, .gi .x { display: inline-block; width: 100%; }} -} +// .c { color: $base01 !important; font-style: italic !important; } /* Comment */ +// .cm { color: $base01 !important; font-style: italic !important; } /* Comment.Multiline */ +// .cp { color: $base01 !important; font-style: italic !important; } /* Comment.Preproc */ +// .c1 { color: $base01 !important; font-style: italic !important; } /* Comment.Single */ +// .cs { color: $base01 !important; font-weight: bold !important; font-style: italic !important; } /* Comment.Special */ +// .err { color: $solar-red !important; background: none !important; } /* Error */ +// .k { color: $solar-orange !important; } /* Keyword */ +// .o { color: $base1 !important; font-weight: bold !important; } /* Operator */ +// .p { color: $base1 !important; } /* Operator */ +// .ow { color: $solar-cyan !important; font-weight: bold !important; } /* Operator.Word */ +// .gd { color: $base1 !important; background-color: mix($solar-red, $base03, 25%) !important; display: inline-block; } /* Generic.Deleted */ +// .gd .x { color: $base1 !important; background-color: mix($solar-red, $base03, 35%) !important; display: inline-block; } /* Generic.Deleted.Specific */ +// .ge { color: $base1 !important; font-style: italic !important; } /* Generic.Emph */ +// //.gr { color: #aa0000 } /* Generic.Error */ +// .gh { color: $base01 !important; } /* Generic.Heading */ +// .gi { color: $base1 !important; background-color: mix($solar-green, $base03, 20%) !important; display: inline-block; } /* Generic.Inserted */ +// .gi .x { color: $base1 !important; background-color: mix($solar-green, $base03, 40%) !important; display: inline-block; } /* Generic.Inserted.Specific */ +// //.go { color: #888888 } /* Generic.Output */ +// //.gp { color: #555555 } /* Generic.Prompt */ +// .gs { color: $base1 !important; font-weight: bold !important; } /* Generic.Strong */ +// .gu { color: $solar-violet !important; } /* Generic.Subheading */ +// //.gt { color: #aa0000 } /* Generic.Traceback */ +// .kc { color: $solar-green !important; font-weight: bold !important; } /* Keyword.Constant */ +// .kd { color: $solar-blue !important; } /* Keyword.Declaration */ +// .kp { color: $solar-orange !important; font-weight: bold !important; } /* Keyword.Pseudo */ +// .kr { color: $solar-magenta !important; font-weight: bold !important; } /* Keyword.Reserved */ +// .kt { color: $solar-cyan !important; } /* Keyword.Type */ +// .n { color: $solar-blue !important; } +// .na { color: $solar-blue !important; } /* Name.Attribute */ +// .nb { color: $solar-green !important; } /* Name.Builtin */ +// .nc { color: $solar-magenta !important;} /* Name.Class */ +// .no { color: $solar-yellow !important; } /* Name.Constant */ +// //.ni { color: #800080 } /* Name.Entity */ +// .nl { color: $solar-green !important; } +// .ne { color: $solar-blue !important; font-weight: bold !important; } /* Name.Exception */ +// .nf { color: $solar-blue !important; font-weight: bold !important; } /* Name.Function */ +// .nn { color: $solar-yellow !important; } /* Name.Namespace */ +// .nt { color: $solar-blue !important; font-weight: bold !important; } /* Name.Tag */ +// .nx { color: $solar-yellow !Important; } +// //.bp { color: #999999 } /* Name.Builtin.Pseudo */ +// //.vc { color: #008080 } /* Name.Variable.Class */ +// .vg { color: $solar-blue !important; } /* Name.Variable.Global */ +// .vi { color: $solar-blue !important; } /* Name.Variable.Instance */ +// .nv { color: $solar-blue !important; } /* Name.Variable */ +// //.w { color: #bbbbbb } /* Text.Whitespace */ +// .mf { color: $solar-cyan !important; } /* Literal.Number.Float */ +// .m { color: $solar-cyan !important; } /* Literal.Number */ +// .mh { color: $solar-cyan !important; } /* Literal.Number.Hex */ +// .mi { color: $solar-cyan !important; } /* Literal.Number.Integer */ +// //.mo { color: #009999 } /* Literal.Number.Oct */ +// .s { color: $solar-cyan !important; } /* Literal.String */ +// //.sb { color: #d14 } /* Literal.String.Backtick */ +// //.sc { color: #d14 } /* Literal.String.Char */ +// .sd { color: $solar-cyan !important; } /* Literal.String.Doc */ +// .s2 { color: $solar-cyan !important; } /* Literal.String.Double */ +// .se { color: $solar-red !important; } /* Literal.String.Escape */ +// //.sh { color: #d14 } /* Literal.String.Heredoc */ +// .si { color: $solar-blue !important; } /* Literal.String.Interpol */ +// //.sx { color: #d14 } /* Literal.String.Other */ +// .sr { color: $solar-cyan !important; } /* Literal.String.Regex */ +// .s1 { color: $solar-cyan !important; } /* Literal.String.Single */ +// //.ss { color: #990073 } /* Literal.String.Symbol */ +// //.il { color: #009999 } /* Literal.Number.Integer.Long */ +// div { .gd, .gd .x, .gi, .gi .x { display: inline-block; width: 100%; }} +// } -.highlight, .gist-highlight { - pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; } - margin-bottom: 1.8em; - background: $base03; - overflow-y: hidden; - overflow-x: auto; -} +// .highlight, .gist-highlight { +// pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; } +// margin-bottom: 1.8em; +// background: $base03; +// overflow-y: hidden; +// overflow-x: auto; +// } -$solar-scroll-bg: rgba(#fff, .15); -$solar-scroll-thumb: rgba(#fff, .2); -@if $solarized == light { - $solar-scroll-bg: rgba(#000, .15); - $solar-scroll-thumb: rgba(#000, .15); -} +// $solar-scroll-bg: rgba(#fff, .15); +// $solar-scroll-thumb: rgba(#fff, .2); +// @if $solarized == light { +// $solar-scroll-bg: rgba(#000, .15); +// $solar-scroll-thumb: rgba(#000, .15); +// } -pre, .highlight, .gist-highlight { - &::-webkit-scrollbar { height: .5em; background: $solar-scroll-bg; } - &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb; -webkit-border-radius: 4px; border-radius: 4px } -} +// pre, .highlight, .gist-highlight { +// &::-webkit-scrollbar { height: .5em; background: $solar-scroll-bg; } +// &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb; -webkit-border-radius: 4px; border-radius: 4px } +// } -.highlight code { - @extend .pre-code; background: #000; -} -figure.code { - background: none; - padding: 0; - border: 0; - margin-bottom: 1.5em; - pre { margin-bottom: 0; } - figcaption { - position: relative; - @extend .code-title; - a { @extend .download-source; } - } - .highlight { - margin-bottom: 0; - } -} +// .highlight code { +// @extend .pre-code; background: #000; +// } +// figure.code { +// background: none; +// padding: 0; +// border: 0; +// margin-bottom: 1.5em; +// pre { margin-bottom: 0; } +// figcaption { +// position: relative; +// @extend .code-title; +// a { @extend .download-source; } +// } +// .highlight { +// margin-bottom: 0; +// } +// } -.code-title { - text-align: center; - font-size: 13px; - line-height: 2em; - text-shadow: #cbcccc 0 1px 0; - color: #474747; - font-weight: normal; - margin-bottom: 0; - @include border-radius(5px 5px 0 0); - font-family: "Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif; - background: #aaaaaa image-url("code_bg.png") top repeat-x; - border: 1px solid #565656; - border-top-color: #cbcbcb; - border-left-color: #a5a5a5; - border-right-color: #a5a5a5; - border-bottom: 0; -} +// .code-title { +// text-align: center; +// font-size: 13px; +// line-height: 2em; +// text-shadow: #cbcccc 0 1px 0; +// color: #474747; +// font-weight: normal; +// margin-bottom: 0; +// @include border-radius(5px 5px 0 0); +// font-family: "Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif; +// background: #aaaaaa image-url("code_bg.png") top repeat-x; +// border: 1px solid #565656; +// border-top-color: #cbcbcb; +// border-left-color: #a5a5a5; +// border-right-color: #a5a5a5; +// border-bottom: 0; +// } -.download-source { - position: absolute; right: .8em; - color: #666 !important; - z-index: 1; - font-size: 13px; - text-shadow: #cbcccc 0 1px 0; - padding-left: 3em; -} +// .download-source { +// position: absolute; right: .8em; +// color: #666 !important; +// z-index: 1; +// font-size: 13px; +// text-shadow: #cbcccc 0 1px 0; +// padding-left: 3em; +// } diff --git a/sass/screen.scss b/sass/screen.scss index 9390e0e72de..0e8bb2c8e1f 100644 --- a/sass/screen.scss +++ b/sass/screen.scss @@ -1,2 +1,3 @@ @import 'oscailte/oscailte'; @import 'custom/paulus'; +@import 'custom/coderay'; diff --git a/source/_components/alarm_control_panel.markdown b/source/_components/alarm_control_panel.markdown index 07afeef3139..ec617fa3e9a 100644 --- a/source/_components/alarm_control_panel.markdown +++ b/source/_components/alarm_control_panel.markdown @@ -12,7 +12,7 @@ footer: true Home Assistant can give you an interface with is similar to a classic alarm system. There are several panels supported: -- [Manual](/components/alarm_control_panel.manual.html) -- [MQTT](/components/alarm_control_panel.mqtt.html) -- [Verisure](/components/verisure.html) +- [Manual](/components/alarm_control_panel.manual/) +- [MQTT](/components/alarm_control_panel.mqtt/) +- [Verisure](/components/verisure/) diff --git a/source/_components/alarm_control_panel.mqtt.markdown b/source/_components/alarm_control_panel.mqtt.markdown index 712b68b7ac6..4bf7c911cd7 100644 --- a/source/_components/alarm_control_panel.mqtt.markdown +++ b/source/_components/alarm_control_panel.mqtt.markdown @@ -12,10 +12,7 @@ ha_category: Alarm --- -This platform enables the possibility to control an MQTT alarm. The alarm will only change state after -receiving the a new state from `state_topic`. If these messages are published with RETAIN flag, the MQTT -alarm will receive an instant state update after subscription and will start with correct state. Otherwise, -the initial state will be `unknown`. +This platform enables the possibility to control an MQTT alarm. The alarm will only change state after receiving the a new state from `state_topic`. If these messages are published with RETAIN flag, the MQTT alarm will receive an instant state update after subscription and will start with correct state. Otherwise, the initial state will be `unknown`. ```yaml # Example configuration.yaml entry diff --git a/source/_components/arduino.markdown b/source/_components/arduino.markdown index ab44fb2745e..d72730e5470 100644 --- a/source/_components/arduino.markdown +++ b/source/_components/arduino.markdown @@ -35,7 +35,7 @@ Configuration variables: - **port** (*Required*): The port where your board is connected to your Home Assistant host. If you are using an original Arduino the port will be named `ttyACM*`. The exact number can be determined with `ls /dev/ttyACM*`. ```bash -ls /dev/ttyACM* +$ ls /dev/ttyACM* ``` If that is not working, check your `dmesg` or `journalctl -f` output. Keep in mind that Arduino clones are often using a different name for the port (e.g. `/dev/ttyUSB*`). @@ -46,6 +46,6 @@ A word of caution: The Arduino boards are not storing states. This means that wi ## Building on top of the Arduino component - - [Arduino Sensor](/components/sensor.arduino.html) - - [Arduino Switch](/components/switch.arduino.html) + - [Arduino Sensor](/components/sensor.arduino/) + - [Arduino Switch](/components/switch.arduino/) diff --git a/source/_components/automation.markdown b/source/_components/automation.markdown index e51ba2c39a4..444ca60ab25 100644 --- a/source/_components/automation.markdown +++ b/source/_components/automation.markdown @@ -10,12 +10,9 @@ footer: true ha_category: Automation --- -This page will go into more detail about the various options the `automation` component offers. If -you haven't yet, read the [getting started page on automation](/getting-started/automation.html). +This page will go into more detail about the various options the `automation` component offers. If you haven't yet, read the [getting started page on automation](/getting-started/automation/). -A configuration section of an automation requires a `trigger` and an `action` section. `condition` and -`condition_type` are optional. To keep this page compact, all following sections will not show the -full configuration but only the relevant part. +A configuration section of an automation requires a `trigger` and an `action` section. `condition` and `condition_type` are optional. To keep this page compact, all following sections will not show the full configuration but only the relevant part. ```yaml # Example of entry in configuration.yaml @@ -77,13 +74,10 @@ automation: ## {% linkable_title Triggers %} -Triggers are what starts the processing of an automation rule. It is possible to specify multiple -triggers for the same rule. Once a trigger starts, Home Assistant will validate the conditions, if any, -and call the action. +Triggers are what starts the processing of an automation rule. It is possible to specify multiple triggers for the same rule. Once a trigger starts, Home Assistant will validate the conditions, if any, and call the action. #### {% linkable_title Event trigger %} -Triggers when an event is being processed. Events are the raw building blocks of Home Assistant. -You can match events on just the event name or also require specific event data to be present. +Triggers when an event is being processed. Events are the raw building blocks of Home Assistant. You can match events on just the event name or also require specific event data to be present. ```yaml automation: @@ -96,8 +90,7 @@ automation: ``` #### {% linkable_title MQTT trigger %} -Triggers when a specific message is received on given topic. Optionally can match on the payload -being sent over the topic. +Triggers when a specific message is received on given topic. Optionally can match on the payload being sent over the topic. ```yaml automation: @@ -109,8 +102,7 @@ automation: ``` #### {% linkable_title Numeric state trigger %} -On state change of a specified entity, attempts to parse the state as a number and triggers if value -is above and/or below a threshold. +On state change of a specified entity, attempts to parse the state as a number and triggers if value is above and/or below a threshold. ```yaml automation: @@ -123,6 +115,7 @@ automation: ``` #### {% linkable_title State trigger %} + Triggers when the state of an entity changes. If only entity_id given will match all state changes. ```yaml @@ -136,13 +129,11 @@ automation: ``` <p class='note warning'> - Use quotes around your values for <code>from</code> and <code>to</code> to avoid the YAML parser - interpreting some values as booleans. + Use quotes around your values for `from` and `to` to avoid the YAML parser interpreting values as booleans. </p> #### {% linkable_title Sun trigger %} -Trigger when the sun is setting or rising. An optional time offset can be given to have it trigger for -example 45 minutes before sunset, when dusk is setting in. +Trigger when the sun is setting or rising. An optional time offset can be given to have it trigger for example 45 minutes before sunset, when dusk is setting in. ```yaml automation: @@ -155,10 +146,8 @@ automation: ``` #### {% linkable_title Time trigger %} -Time can be triggered in many ways. The most common is to specify `after` and trigger at a specific -point in time each day. Alternatively, you can also match if the hour, minute or second of the current -time has a specific value. For example, by only setting minutes in the config to 5 it will trigger every -hour when it is 5 minutes past whole. You cannot use `after` together with hour, minute or second. + +Time can be triggered in many ways. The most common is to specify `after` and trigger at a specific point in time each day. Alternatively, you can also match if the hour, minute or second of the current time has a specific value. For example, by only setting minutes in the config to 5 it will trigger every hour when it is 5 minutes past whole. You cannot use `after` together with hour, minute or second. ```yaml automation: @@ -176,16 +165,13 @@ automation: - sun ``` -You can use `weekday` to limit the trigger times to speific days as well (also available in conditions). -Valid values for `weekday` are (`sun`, `mon`, `tue`, `wed`, `thu`, `fri` & `sat`) +You can use `weekday` to limit the trigger times to speific days as well (also available in conditions). Valid values for `weekday` are (`sun`, `mon`, `tue`, `wed`, `thu`, `fri` & `sat`) The above example will trigger on Saturday and Sunday every hour on the 5 (2:05, 3:05, 4:05, etc). - #### {% linkable_title Zone trigger %} -Zone triggers can trigger when an entity is entering or leaving the zone. For zone automation to work, -you need to have setup a device tracker platform that supports reporting GPS coordinates. Currently -this is limited to the [OwnTracks platform](/components/device_tracker.owntracks.html). + +Zone triggers can trigger when an entity is entering or leaving the zone. For zone automation to work, you need to have setup a device tracker platform that supports reporting GPS coordinates. Currently this is limited to the [OwnTracks platform](/components/device_tracker.owntracks/). ```yaml automation: @@ -199,15 +185,9 @@ automation: ## {% linkable_title Conditions %} -Conditions are an optional part of an automation rule and be used to prevent an action from happening -when triggered. Conditions look very familiar to triggers but are very different. A trigger will look -at events happening at the system while a condition only looks at how the system looks right now. -A trigger can observe that a switch is being turned on. A condition can only see if a switch is on -or off. +Conditions are an optional part of an automation rule and be used to prevent an action from happening when triggered. Conditions look very familiar to triggers but are very different. A trigger will look at events happening at the system while a condition only looks at how the system looks right now. A trigger can observe that a switch is being turned on. A condition can only see if a switch is on or off. -An automation rule can have mulitiple triggers. By default the action will only fire if all conditions -pass. An optional key `condition_type: 'or'` can be set on the automation rule to fire action if any -condition matches. In the example below, the automation would trigger if the time is before 05:00 _OR_ after 20:00. +An automation rule can have mulitiple triggers. By default the action will only fire if all conditions pass. An optional key `condition_type: 'or'` can be set on the automation rule to fire action if any condition matches. In the example below, the automation would trigger if the time is before 05:00 _OR_ after 20:00. ```yaml automation: @@ -219,16 +199,16 @@ automation: after: '20:00' ``` -If your triggers and conditions are exactly the same, you can use a shortcut to specify conditions. -In this case, triggers that are not valid conditions will be ignored. +If your triggers and conditions are exactly the same, you can use a shortcut to specify conditions. In this case, triggers that are not valid conditions will be ignored. + ```yaml automation: condition: use_trigger_values ``` #### {% linkable_title Numeric state condition %} -Attempts to parse the state of specified entity as a number and triggers if value is above and/or -below a threshold. + +Attempts to parse the state of specified entity as a number and triggers if value is above and/or below a threshold. ```yaml automation: @@ -241,6 +221,7 @@ automation: ``` #### {% linkable_title State condition %} + Tests if an entity is a specified state. ```yaml @@ -252,8 +233,8 @@ automation: ``` #### {% linkable_title Time condition %} -The time condition can test if it is after a specified time, before a specified time or if it is a -certain day of the week + +The time condition can test if it is after a specified time, before a specified time or if it is a certain day of the week ```yaml automation: @@ -268,12 +249,11 @@ automation: - fri ``` -Valid values for `weekday` are (sun, mon, tue, wed, thu, fri & sat) +Valid values for `weekday` are (`sun`, `mon`, `tue`, `wed`, `thu`, `fri` & `sat`) #### {% linkable_title Zone condition %} -Zone conditions test if an entity is in a certain zone. For zone automation to work, -you need to have setup a device tracker platform that supports reporting GPS coordinates. Currently -this is limited to the [OwnTracks platform](/components/device_tracker.owntracks.html). + +Zone conditions test if an entity is in a certain zone. For zone automation to work, you need to have setup a device tracker platform that supports reporting GPS coordinates. Currently this is limited to the [OwnTracks platform](/components/device_tracker.owntracks/). ```yaml automation: @@ -285,8 +265,7 @@ automation: ## {% linkable_title Actions %} -When an automation rule fires, it calls a service. For this service you can specify an entity id it -should apply to and optional service parameters (to specify for example the brightness). +When an automation rule fires, it calls a service. For this service you can specify an entity id it should apply to and optional service parameters (to specify for example the brightness). ```yaml automation: @@ -310,23 +289,19 @@ automation: message: Something just happened, better take a look! ``` -If you want to specify multiple services to be called or include a delay, have a look at the -[script component](/components/script.html). If you want to describe how certain entities should look, -check out the [scene component](/components/scene.html). +If you want to specify multiple services to be called or include a delay, have a look at the [script component](/components/script/). If you want to describe how certain entities should look, check out the [scene component](/components/scene/). ## {% linkable_title Troubleshooting %} -You can verify that your automation rules are being initialized correctly by watching both the realtime -logs and also the logbook. The realtime logs will show the rules being initialized (once for each trigger): +You can verify that your automation rules are being initialized correctly by watching both the realtime logs and also the logbook. The realtime logs will show the rules being initialized (once for each trigger): -```bash +```plain INFO [homeassistant.components.automation] Initialized rule Rainy Day INFO [homeassistant.components.automation] Initialized rule Rainy Day INFO [homeassistant.components.automation] Initialized rule Rainy Day INFO [homeassistant.components.automation] Initialized rule Rain is over ``` -The Logbook component will show a line entry when an automation is triggered. You can look at the -previous entry to determine which trigger in the rule triggered the event. +The Logbook component will show a line entry when an automation is triggered. You can look at the previous entry to determine which trigger in the rule triggered the event. ![Logbook example](/images/components/automation/logbook.png) diff --git a/source/_components/browser.markdown b/source/_components/browser.markdown index 0a31cfca145..6bf017554fb 100644 --- a/source/_components/browser.markdown +++ b/source/_components/browser.markdown @@ -15,7 +15,8 @@ The browser component provides a service to open urls in the default browser on To load this component, add the following lines to your `configuration.yaml`: -``` +```yaml +# Example configuration.yaml entry browser: ``` diff --git a/source/_components/camera.generic.markdown b/source/_components/camera.generic.markdown index 63729d80ac2..065207f37b8 100644 --- a/source/_components/camera.generic.markdown +++ b/source/_components/camera.generic.markdown @@ -16,6 +16,7 @@ This component allows you to integrate any IP camera into Home Assistant. It sup Home Assistant will serve the images via its server, making it possible to view your IP camera's while outside of your network. As part of the basic support the following features will be provided: + - MJPEG video streaming - Saving a snapshot - Recording(JPEG frame capture) diff --git a/source/_components/configurator.markdown b/source/_components/configurator.markdown index 9757234f2f3..eaa14aae299 100644 --- a/source/_components/configurator.markdown +++ b/source/_components/configurator.markdown @@ -20,6 +20,6 @@ The configurator component allows components to request information from the use - Input fields can be defined with a description, and optional type - It will trigger a callback when the button is pressed -The Hue component in [the demo](/demo) and Plex are implemented using the configurator. See [the source of the demo component](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/demo.py#L72) for a simple example. +The Hue component in [the demo](/demo) and Plex are implemented using the configurator. See [the source of the demo component](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/demo.py#L132) for a simple example. See [the source](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/configurator.py#L39) for more details on how to use the configurator component. diff --git a/source/_components/conversation.markdown b/source/_components/conversation.markdown index aea3972f39d..7ca6eb0147a 100644 --- a/source/_components/conversation.markdown +++ b/source/_components/conversation.markdown @@ -15,7 +15,8 @@ The conversation component can process sentences into commands for Home Assistan To enable the conversion option in your installation, add the following to your `configuration.yaml` file: -``` +```yaml +# Example configuration.yaml entry conversation: ``` diff --git a/source/_components/device_sun_light_trigger.markdown b/source/_components/device_sun_light_trigger.markdown index e566c7ea3cc..391b475c531 100644 --- a/source/_components/device_sun_light_trigger.markdown +++ b/source/_components/device_sun_light_trigger.markdown @@ -16,7 +16,7 @@ Home Assistant has a built-in component called `device_sun_light_trigger` to hel * Turn on the lights when people get home after the sun has set * Turn off the lights when all people leave the house -This component requires the components [sun](/components/sun.html), [device_tracker](/components/device_tracker.html) and [light](/components/light.html) to be enabled. +This component requires the components [sun](/components/sun/), [device_tracker](/components/device_tracker/) and [light](/components/light/) to be enabled. To enable this component, add the following lines to your `configuration.yaml` file: diff --git a/source/_components/device_tracker.actiontec.markdown b/source/_components/device_tracker.actiontec.markdown index 818c82d9224..6e23ceb6577 100644 --- a/source/_components/device_tracker.actiontec.markdown +++ b/source/_components/device_tracker.actiontec.markdown @@ -39,5 +39,5 @@ Configuration variables: - **password** (*Required*): The password for your given admin account. - **home_interval** (*Optional*): If the home_interval is set then the component will not let a device be AWAY if it has been HOME in the last home_interval minutes. This is in addition to the 3 minute wait built into the device_tracker component. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.aruba.markdown b/source/_components/device_tracker.aruba.markdown index 56f11c2f43b..463034bb2e6 100644 --- a/source/_components/device_tracker.aruba.markdown +++ b/source/_components/device_tracker.aruba.markdown @@ -37,5 +37,5 @@ Configuration variables: - **username** *Required*: The username of an user with administrative privileges, usually *admin*. - **password** *Required*: The password for your given admin account. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.asuswrt.markdown b/source/_components/device_tracker.asuswrt.markdown index 21a090edefa..9b518a28719 100644 --- a/source/_components/device_tracker.asuswrt.markdown +++ b/source/_components/device_tracker.asuswrt.markdown @@ -35,4 +35,4 @@ Configuration variables: - **username** (*Required*: The username of an user with administrative privileges, usually *admin*. - **password** (*Required*): The password for your given admin account. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.ddwrt.markdown b/source/_components/device_tracker.ddwrt.markdown index cd4f644c929..741959d19e1 100644 --- a/source/_components/device_tracker.ddwrt.markdown +++ b/source/_components/device_tracker.ddwrt.markdown @@ -31,4 +31,4 @@ Configuration variables: - **username** (*Required*: The username of an user with administrative privileges, usually *admin*. - **password** (*Required*): The password for your given admin account. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.luci.markdown b/source/_components/device_tracker.luci.markdown index 84becfbaba0..06b276c7d17 100644 --- a/source/_components/device_tracker.luci.markdown +++ b/source/_components/device_tracker.luci.markdown @@ -11,7 +11,7 @@ logo: openwrt.png ha_category: Presence Detection --- -_This is one of the two ways we support OpenWRT. If you encounter problems, try [ubus](/components/device_tracker.ubus.html)._ +_This is one of the two ways we support OpenWRT. If you encounter problems, try [ubus](/components/device_tracker.ubus/)._ This is a presence detection scanner for OpenWRT using [luci](http://wiki.openwrt.org/doc/techref/luci). @@ -36,4 +36,4 @@ Configuration variables: - **username** (*Required*): The username of an user with administrative privileges, usually *admin*. - **password** (*Required*): The password for your given admin account. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.markdown b/source/_components/device_tracker.markdown index 171c80ff43f..e5b5c81da5f 100644 --- a/source/_components/device_tracker.markdown +++ b/source/_components/device_tracker.markdown @@ -11,7 +11,7 @@ footer: true Home Assistant can get information from your wireless router to track which devices are connected. Please check the sidebar for a list of brands of supported wireless routers. -There are also trackers available which uses different technologies like [MQTT](/components/mqtt.html) or [nmap](/components/device_tracker.nmap_scanner.html) to scan the network for devices +There are also trackers available which uses different technologies like [MQTT](/components/mqtt/) or [nmap](/components/device_tracker.nmap_scanner/) to scan the network for devices To get started add the following lines to your `configuration.yaml` (example for Netgear): diff --git a/source/_components/device_tracker.mqtt.markdown b/source/_components/device_tracker.mqtt.markdown index b6619412fde..a8369e5c47b 100644 --- a/source/_components/device_tracker.mqtt.markdown +++ b/source/_components/device_tracker.mqtt.markdown @@ -12,8 +12,7 @@ ha_category: Presence Detection --- -This platform allows you to detect presence by monitoring an MQTT topic for new locations. To use this -platform, you specify a unique topic for each device. +This platform allows you to detect presence by monitoring an MQTT topic for new locations. To use this platform, you specify a unique topic for each device. ```yaml # Example configuration.yaml entry diff --git a/source/_components/device_tracker.netgear.markdown b/source/_components/device_tracker.netgear.markdown index a35a4c58509..bdad7e7ca38 100644 --- a/source/_components/device_tracker.netgear.markdown +++ b/source/_components/device_tracker.netgear.markdown @@ -29,4 +29,4 @@ Configuration variables: - **username** (*Required*: The username of an user with administrative privileges, usually *admin*. - **password** (*Required*): The password for your given admin account. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.nmap_scanner.markdown b/source/_components/device_tracker.nmap_scanner.markdown index 6bfeddd0c1a..25676566e60 100644 --- a/source/_components/device_tracker.nmap_scanner.markdown +++ b/source/_components/device_tracker.nmap_scanner.markdown @@ -12,12 +12,9 @@ featured: true --- -As an alternative to the router-based device tracking, it is possible to directly scan the network -for devices by using Nmap. The IP addresses to scan can be specified in any format that Nmap understands, -including the network-prefix notation (`192.168.1.1/24`) and the range notation (`192.168.1.1-255`). +As an alternative to the router-based device tracking, it is possible to directly scan the network for devices by using Nmap. The IP addresses to scan can be specified in any format that Nmap understands, including the network-prefix notation (`192.168.1.1/24`) and the range notation (`192.168.1.1-255`). -If you're on Debian or Ubuntu, you might have to install the packages for arp and nmap. Do so by -running `apt-get install net-tools nmap`. +If you're on Debian or Ubuntu, you might have to install the packages for arp and nmap. Do so by running `apt-get install net-tools nmap`. ```yaml # Example configuration.yaml entry @@ -27,8 +24,6 @@ device_tracker: home_interval: 10 ``` -`home_interval` is an optional value set in minutes. This will be the number of minutes nmap will not -scan this device, assuming it is home, in order to preserve the device battery. +`home_interval` is an optional value set in minutes. This will be the number of minutes nmap will not scan this device, assuming it is home, in order to preserve the device battery. -See the [device tracker component page](/components/device_tracker.html) for instructions how to -configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.owntracks.markdown b/source/_components/device_tracker.owntracks.markdown index 60778ff9cd5..68281a87146 100644 --- a/source/_components/device_tracker.owntracks.markdown +++ b/source/_components/device_tracker.owntracks.markdown @@ -13,12 +13,9 @@ featured: true --- -This platform allows you to detect presence using [Owntracks](http://owntracks.org/). OwnTracks allows -users to track their location on Android and iOS phones and publish it to an MQTT broker. This platform -will connect to the broker and monitor for new locations. +This platform allows you to detect presence using [Owntracks](http://owntracks.org/). OwnTracks allows users to track their location on Android and iOS phones and publish it to an MQTT broker. This platform will connect to the broker and monitor for new locations. -This component requires [the MQTT component](/components/mqtt.html) to be set up and works very well -together with [the zone component](/components/zone.html). +This component requires [the MQTT component](/components/mqtt/) to be set up and works very well together with [the zone component](/components/zone/). To integrate Owntracks in Home Assistant, add the following section to your `configuration.yaml` file: diff --git a/source/_components/device_tracker.snmp.markdown b/source/_components/device_tracker.snmp.markdown index 65d6f09c7a3..367041fbf8c 100644 --- a/source/_components/device_tracker.snmp.markdown +++ b/source/_components/device_tracker.snmp.markdown @@ -39,4 +39,4 @@ Configuration variables: - **baseoid** (*Required*): The OID prefix where wireless client registrations can be found, usually vendor specific. It's advised to use the numerical notation. To find this base OID, check vendor documentation or check the MIB file for your device. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.thomson.markdown b/source/_components/device_tracker.thomson.markdown index 6d640b9deb9..7847240d4b3 100644 --- a/source/_components/device_tracker.thomson.markdown +++ b/source/_components/device_tracker.thomson.markdown @@ -31,4 +31,4 @@ Configuration variables: - **username** (*Required*: The username of an user with administrative privileges, usually *admin*. - **password** (*Required*): The password for your given admin account. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.tomato.markdown b/source/_components/device_tracker.tomato.markdown index 886fd5ca88f..7f33d06d52e 100644 --- a/source/_components/device_tracker.tomato.markdown +++ b/source/_components/device_tracker.tomato.markdown @@ -30,4 +30,4 @@ Configuration variables: - **password** (*Required*): The password for your given admin account. - **http_id** (*Required*): The value can be obtained by logging in to the Tomato admin interface and search for `http_id` in the page source code. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.tplink.markdown b/source/_components/device_tracker.tplink.markdown index 5bae2e37865..a95022d65a2 100644 --- a/source/_components/device_tracker.tplink.markdown +++ b/source/_components/device_tracker.tplink.markdown @@ -38,4 +38,4 @@ For Archer C9 models running firmware version 150811 or later please use the enc 5. Type ```document.getElementById("login-password").value;```. 6. Copy the returned value to your Home Assistant configuration as password. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/device_tracker.ubus.markdown b/source/_components/device_tracker.ubus.markdown index 42543fa4ad7..0847e358630 100644 --- a/source/_components/device_tracker.ubus.markdown +++ b/source/_components/device_tracker.ubus.markdown @@ -11,7 +11,7 @@ logo: openwrt.png ha_category: Presence Detection --- -_This is one of the two ways we support OpenWRT. If you encounter problems, try [luci](/components/device_tracker.luci.html)._ +_This is one of the two ways we support OpenWRT. If you encounter problems, try [luci](/components/device_tracker.luci/)._ This is a presence detection scanner for OpenWRT using [ubus](http://wiki.openwrt.org/doc/techref/ubus). @@ -55,4 +55,4 @@ Configuration variables: - **username** (*Required*): The username of an user with administrative privileges, usually *admin*. - **password** (*Required*): The password for your given admin account. -See the [device tracker component page](/components/device_tracker.html) for instructions how to configure the people to be tracked. +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_components/discovery.markdown b/source/_components/discovery.markdown index 0f490ffce1e..45ff84806ca 100644 --- a/source/_components/discovery.markdown +++ b/source/_components/discovery.markdown @@ -28,7 +28,7 @@ To load this component, add the following lines to your `configuration.yaml`: discovery: ``` -If you are developing a new platform, please read [how to make your platform discoverable]({{site_root}}/developers/add_new_platform.html#discovery). +If you are developing a new platform, please read [how to make your platform discoverable]({{site_root}}/developers/add_new_platform/#discovery). <p class='note warning'> There is currently a <a href='https://bitbucket.org/al45tair/netifaces/issues/17/dll-fails-to-load-windows-81-64bit'>known issue</a> with running this playform on a 64-bit version of Python. diff --git a/source/_components/ifttt.manything.markdown b/source/_components/ifttt.manything.markdown index 77a295be55b..dd9b53751fa 100644 --- a/source/_components/ifttt.manything.markdown +++ b/source/_components/ifttt.manything.markdown @@ -11,11 +11,9 @@ logo: manything.png ha_category: Camera --- -[Manything](https://manything.com) is a smart app that turns your iPhone, iPod, or iPad into a wifi -camera for monitoring your home, your pets, anything! Comes with live streaming, motion activated alerts, cloud video recording, and more. +[Manything](https://manything.com) is a smart app that turns your iPhone, iPod, or iPad into a wifi camera for monitoring your home, your pets, anything! Comes with live streaming, motion activated alerts, cloud video recording, and more. -To get manything support, HA will use IFTTT's [Maker Channel](https://ifttt.com/maker) and the [ManyThing Channel](https://ifttt.com/manything). -Use the [IFTTT Setup instructions](/components/ifttt.html) to activate the IFTTT Platform. +To get manything support, HA will use IFTTT's [Maker Channel](https://ifttt.com/maker) and the [ManyThing Channel](https://ifttt.com/manything). Use the [IFTTT Setup instructions](/components/ifttt/) to activate the IFTTT Platform. After setting up IFTTT, Maker Channel and ManyThing Channel, you can use the following examples to configure Home Assistant. @@ -62,7 +60,7 @@ automation: <p class='img'> <img src='/images/components/ifttt/IFTTT_manything_trigger.png' /> You need to setup a unique trigger for each event you sent to IFTTT. -For ManyThing support, you need to set up an <code>on</code> and <code>off</code> event. +For ManyThing support, you need to set up an `on` and `off` event. </p> ### {% linkable_title Testing your trigger %} diff --git a/source/_components/ifttt.markdown b/source/_components/ifttt.markdown index 27d9c4cce0e..67d3dcb42e2 100644 --- a/source/_components/ifttt.markdown +++ b/source/_components/ifttt.markdown @@ -12,10 +12,7 @@ ha_category: Automation featured: true --- -[IFTTT](https://ifttt.com) is a web service that allows users to create chains of simple conditional -statements, so called "recipes". With the ifttt component you can trigger recipes through the "maker" -channel. See the [announcement blog post](/blog/2015/09/13/home-assistant-meets-ifttt/) for examples -how to use it. +[IFTTT](https://ifttt.com) is a web service that allows users to create chains of simple conditional statements, so called "recipes". With the IFTTT component you can trigger recipes through the "maker" channel. See the [announcement blog post](/blog/2015/09/13/home-assistant-meets-ifttt/) for examples how to use it. ```yaml # Example configuration.yaml entry @@ -60,10 +57,7 @@ You need to setup a unique trigger for each event you sent to IFTTT. ### {% linkable_title Sending events from IFTTT to Home Assistant %} -To be able to receive events from IFTTT, your Home Assistant instance needs to be accessible from -the web. This can be achieved by forwarding port 8123 from your router to the device running Home -Assistant. If your ISP is giving you a new IP address from time to time, consider using -[DuckDNS][duck-dns]. +To be able to receive events from IFTTT, your Home Assistant instance needs to be accessible from the web. This can be achieved by forwarding port 8123 from your router to the device running Home Assistant. If your ISP is giving you a new IP address from time to time, consider using [DuckDNS][duck-dns]. [duck-dns]: https://duckdns.org @@ -72,8 +66,9 @@ Assistant. If your ISP is giving you a new IP address from time to time, conside </p> ### {% linkable_title Additional Channel Examples %} + Additional examples of using IFTTT channels can be found below. Channel | Description ----- | ----- -[Manything](/components/ifttt.manything.html) | Automates turning recording ON and OFF based on Home Assistant AWAY and HOME values. +[Manything](/components/ifttt.manything/) | Automates turning recording ON and OFF based on Home Assistant AWAY and HOME values. diff --git a/source/_components/keyboard.markdown b/source/_components/keyboard.markdown index 5eb147d6919..4bf2672e14b 100644 --- a/source/_components/keyboard.markdown +++ b/source/_components/keyboard.markdown @@ -22,7 +22,7 @@ The `keyboard` component simulates key presses on the host machine. It currently To load this component, add the following lines to your `configuration.yaml`: -``` +```yaml keyboard: ``` @@ -30,8 +30,8 @@ keyboard: You may need to install platform-specific [dependencies for PyUserInput](https://github.com/SavinaRoja/PyUserInput#dependencies) in order to use the keyboard component. In most cases this can be done by running: -``` -pip3 install [package name] +```bash +$ pip3 install [package name] ``` #### {% linkable_title Windows %} diff --git a/source/_components/light.hue.markdown b/source/_components/light.hue.markdown index 5622d1aa5e1..3ba5156cb5d 100644 --- a/source/_components/light.hue.markdown +++ b/source/_components/light.hue.markdown @@ -14,7 +14,7 @@ featured: true -Philips Hue support is integrated into Home Assistant as a light platform. The preferred way to setup the Philips Hue platform is by enabling the [the discovery component]({{site_root}}/components/discovery.html). +Philips Hue support is integrated into Home Assistant as a light platform. The preferred way to setup the Philips Hue platform is by enabling the [the discovery component]({{site_root}}/components/discovery/). If you want to enable the light component directly, add the following lines to your `configuration.yaml`: diff --git a/source/_components/light.markdown b/source/_components/light.markdown index 0c3f44c2d1b..f9eeb35758c 100644 --- a/source/_components/light.markdown +++ b/source/_components/light.markdown @@ -18,7 +18,7 @@ It supports the following platforms: * `hue` for Philips Hue * `wink` for Wink -Preferred way to setup the Philips Hue platform is through the [the discovery component]({{site_root}}/components/discovery.html). For the Wink light platform enable [the wink component]({{site_root}}/components/wink.html). +Preferred way to setup the Philips Hue platform is through the [the discovery component]({{site_root}}/components/discovery/). For the Wink light platform enable [the wink component]({{site_root}}/components/wink/). If you want to enable the light component directly, add the following lines to your `configuration.yaml`: @@ -33,7 +33,7 @@ The light component supports multiple entries in <code>configuration.yaml</code> ### Service `light.turn_on` -Turns one light on or multiple lights on using [groups]({{site_root}}/components/group.html). +Turns one light on or multiple lights on using [groups]({{site_root}}/components/group/). | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | diff --git a/source/_components/light.wink.markdown b/source/_components/light.wink.markdown index 9f12c36a2e8..d4d86298a7e 100644 --- a/source/_components/light.wink.markdown +++ b/source/_components/light.wink.markdown @@ -14,4 +14,4 @@ ha_category: Light The wink sensor platform allows you to use your [Wink](http://www.wink.com/) lights. -The requirement is that you have setup your [Wink hub](/components/light.wink.html). +The requirement is that you have setup your [Wink hub](/components/light.wink/). diff --git a/source/_components/logbook.markdown b/source/_components/logbook.markdown index 903039d26ae..6ac779cd1e4 100644 --- a/source/_components/logbook.markdown +++ b/source/_components/logbook.markdown @@ -10,10 +10,7 @@ footer: true ha_category: "History" --- -<img src='/images/screenshots/logbook.png' style='margin-left:10px; float: right;' height="100" /> -The logbook component provides a different perspective on the history of your house by showing all -the changes that happened to your house in reverse chronological order. -[See the demo for a live example](/demo/). +<img src='/images/screenshots/logbook.png' style='margin-left:10px; float: right;' height="100" /> The logbook component provides a different perspective on the history of your house by showing all the changes that happened to your house in reverse chronological order. [See the demo for a live example](/demo/). To enable the logbook in your installation, add the following to your `configuration.yaml` file: diff --git a/source/_components/media_player.cast.markdown b/source/_components/media_player.cast.markdown index d8383286dad..d20d7648412 100644 --- a/source/_components/media_player.cast.markdown +++ b/source/_components/media_player.cast.markdown @@ -13,7 +13,7 @@ featured: true --- -Google Cast devices will be automatically discovered if you enable [the discovery component]({{site_root}}/components/discovery.html). There is a issue where Chromecasts can only be discovered if your device is connected to the same subnet as your Chromecast. +Google Cast devices will be automatically discovered if you enable [the discovery component]({{site_root}}/components/discovery/). There is a issue where Chromecasts can only be discovered if your device is connected to the same subnet as your Chromecast. Chromecast platform can also be forced to load by adding the following lines to your `configuration.yaml`: diff --git a/source/_components/media_player.plex.markdown b/source/_components/media_player.plex.markdown index 1d945509d21..b5494fc5d1c 100644 --- a/source/_components/media_player.plex.markdown +++ b/source/_components/media_player.plex.markdown @@ -13,11 +13,9 @@ featured: true --- -The Plex platform allows you to connect a [Plex Media Server](https://plex.tv) to Home Assistant. It will allow you to control media playback and see the current playing item. -The preferred way to setup the Plex platform is by enabling the the [the discovery component]({{site_root}}/components/discovery.html) and requires GDM to be enabled. - -If local authentication is enabled or multiple users are defined, HASS requires an authentication token to be entered in the webinterface. See <A TARGET="_new" HREF=https://support.plex.tv/hc/en-us/articles/204059436>Finding your account token / X-Plex-Token</A>. +The Plex platform allows you to connect a [Plex Media Server](https://plex.tv) to Home Assistant. It will allow you to control media playback and see the current playing item. The preferred way to setup the Plex platform is by enabling the the [the discovery component](/components/discovery/) and requires GDM to be enabled. +If local authentication is enabled or multiple users are defined, HASS requires an authentication token to be entered in the webinterface. See [Finding your account token / X-Plex-Token](https://support.plex.tv/hc/en-us/articles/204059436). If you want to enable the plex platform directly, add the following lines to your `configuration.yaml`: @@ -27,14 +25,14 @@ media_player: - platform: plex ``` -You may also need to create the file `plex.conf`. +You may also need to create the file `plex.conf`. -``` -{'IP_ADDRESS:PORT': {'token': 'TOKEN'}} +```json +{"<IP_ADDRESS>:<PORT>": {"token": "<TOKEN>"}} ``` -- **IP_ADDRESS** *Required*: IP address of the Plex Media Server -- **PORT** *required*: Default is 32400 -- **TOKEN** *Optional*: Only is authentication is required. Set to `None` (without quotes) otherwise. +- `<IP_ADDRESS>` *Required*: IP address of the Plex Media Server +- `<PORT>` *required*: Default is 32400 +- `<TOKEN>` *Optional*: Only if authentication is required. Set to `None` (without quotes) otherwise. At this moment, the Plex platform only supports one Plex Media Server. diff --git a/source/_components/modbus.markdown b/source/_components/modbus.markdown index 0d5b3da93e7..f33ca58ca30 100644 --- a/source/_components/modbus.markdown +++ b/source/_components/modbus.markdown @@ -18,6 +18,7 @@ To add modbus to your installation, add the following to your `configuration.yam For a network connection: +```yaml #Modbus TCP modbus: type: tcp @@ -57,6 +58,6 @@ Configuration variables: ## {% linkable_title Building on top of Modbus %} - - [Modbus Sensor](/components/sensor.modbus.html) - - [Modbus Switch](/components/switch.modbus.html) + - [Modbus Sensor](/components/sensor.modbus/) + - [Modbus Switch](/components/switch.modbus/) diff --git a/source/_components/mqtt.markdown b/source/_components/mqtt.markdown index fea71e1ed41..e01d5016cec 100644 --- a/source/_components/mqtt.markdown +++ b/source/_components/mqtt.markdown @@ -40,14 +40,11 @@ Configuration variables: ## {% linkable_title Picking a broker %} -The MQTT component needs you to run an MQTT broker for Home Assistant to connect to. - -There are three options, each with various degrees of ease of setup and privacy. +The MQTT component needs you to run an MQTT broker for Home Assistant to connect to. There are three options, each with various degrees of ease of setup and privacy. #### {% linkable_title Run your own %} -Most private option but requires a bit more work. There are two free and open-source brokers to pick -from: [Mosquitto](http://mosquitto.org/) and [Mosca](http://www.mosca.io/). +Most private option but requires a bit more work. There are two free and open-source brokers to pick from: [Mosquitto](http://mosquitto.org/) and [Mosca](http://www.mosca.io/). ```yaml # Example configuration.yaml entry @@ -62,9 +59,7 @@ mqtt: #### {% linkable_title Public MQTT %} -The Mosquitto project runs a [public broker](http://test.mosquitto.org). Easiest to setup but there -is 0 privacy as all messages are public. Use this only for testing purposes and not for real tracking -of your devices. +The Mosquitto project runs a [public broker](http://test.mosquitto.org). Easiest to setup but there is 0 privacy as all messages are public. Use this only for testing purposes and not for real tracking of your devices. ```yaml mqtt: @@ -80,9 +75,7 @@ mqtt: #### {% linkable_title CloudMQTT %} -[CloudMQTT](https://www.cloudmqtt.com) is a hosted private MQTT instance that is free up to 10 -connected devices. This is enough to get started with for example -[OwnTracks](/components/device_tracker.owntracks.html) and give you a taste of what is possible. +[CloudMQTT](https://www.cloudmqtt.com) is a hosted private MQTT instance that is free up to 10 connected devices. This is enough to get started with for example [OwnTracks](/components/device_tracker.owntracks/) and give you a taste of what is possible. <p class='note'> Home Assistant is not affiliated with CloudMQTT nor will receive any kickbacks. @@ -97,35 +90,35 @@ Home Assistant is not affiliated with CloudMQTT nor will receive any kickbacks. a. Under manage users, fill in username, password and click add b. Under ACLs, select user, topic `#`, check 'read access' and 'write access' 5. Copy the instance info to your configuration.yaml: + ```yaml - mqtt: - broker: <Server> - port: <SSL Port> - username: <User> - password: <Password> +mqtt: + broker: <Server> + port: <SSL Port> + username: <User> + password: <Password> ``` <p class='note'> -Home Assistant will automatically load the correct certificate if you connect to an encrypted channel -of CloudMQTT (port range 20 000 - 30 000). +Home Assistant will automatically load the correct certificate if you connect to an encrypted channel of CloudMQTT (port range 20 000 - 30 000). </p> ## {% linkable_title Building on top of MQTT %} - - [MQTT Sensor](/components/sensor.mqtt.html) - - [MQTT Switch](/components/switch.mqtt.html) - - [MQTT Device Tracker](/components/device_tracker.mqtt.html) - - [OwnTracks Device Tracker](/components/device_tracker.owntracks.html) - - [MQTT automation rule](/components/automation.html#mqtt-based-automation) - - [MQTT alarm](/components/alarm_control_panel.mqtt.html) - - Integrating it into a component. See the [MQTT example component](https://github.com/balloob/home-assistant/blob/dev/config/custom_components/mqtt_example.py) how to do this. + - [MQTT Sensor](/components/sensor.mqtt/) + - [MQTT Switch](/components/switch.mqtt/) + - [MQTT Device Tracker](/components/device_tracker.mqtt/) + - [OwnTracks Device Tracker](/components/device_tracker.owntracks/) + - [MQTT automation rule](/components/automation/#mqtt-based-automation) + - [MQTT alarm](/components/alarm_control_panel.mqtt/) + - Integrating it into own component. See the [MQTT example component](https://github.com/balloob/home-assistant/blob/dev/config/custom_components/mqtt_example.py) how to do this. ## {% linkable_title Testing your setup %} For debugging purposes `mosquitto` is shipping commandline tools to send and recieve MQTT messages. For sending test messages to a broker running on localhost: ```bash -mosquitto_pub -h 127.0.0.1 -t home-assistant/switch/1/on -m "Switch is ON" +$ mosquitto_pub -h 127.0.0.1 -t home-assistant/switch/1/on -m "Switch is ON" ``` Another way to send MQTT messages by hand is to use the "Developer Tools" in the Frontend. Choose "Call Service" and then `mqtt/mqtt_send` under "Available Services". Enter something similar to the example below into the "Service Data" field. @@ -146,5 +139,5 @@ The message should appear on the bus: For reading all messages sent on the topic `home-assistant` to a broker running on localhost: ```bash -mosquitto_sub -h 127.0.0.1 -v -t "home-assistant/#" +$ mosquitto_sub -h 127.0.0.1 -v -t "home-assistant/#" ``` diff --git a/source/_components/notify.file.markdown b/source/_components/notify.file.markdown index 2d8a38208cf..da02630853f 100644 --- a/source/_components/notify.file.markdown +++ b/source/_components/notify.file.markdown @@ -30,4 +30,4 @@ Configuration variables: - **filename** (*Required*): Name of the file to use. The file will be created if it doesn't exist and saved in your `config/` folder. - **timestamp** (*Optional*): Setting `timestamp` to 1 adds a timestamp to every entry. -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.instapush.markdown b/source/_components/notify.instapush.markdown index 238d1bad05c..9160a0ea649 100644 --- a/source/_components/notify.instapush.markdown +++ b/source/_components/notify.instapush.markdown @@ -49,4 +49,4 @@ curl -X POST \ ``` For further details, please check the [API](https://instapush.im/developer/rest). -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.markdown b/source/_components/notify.markdown index eecd3eccf7f..abc80e8631c 100644 --- a/source/_components/notify.markdown +++ b/source/_components/notify.markdown @@ -40,4 +40,4 @@ automation: service_data: {"message":"YAY"} ``` -For more automation examples, see the [getting started with automation page]({{site_root}}/components/automation.html). +For more automation examples, see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.nma.markdown b/source/_components/notify.nma.markdown index 69f1a4bff81..ccd634f28c7 100644 --- a/source/_components/notify.nma.markdown +++ b/source/_components/notify.nma.markdown @@ -31,4 +31,4 @@ Configuration variables: Details for the API : https://www.notifymyandroid.com/api.jsp -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.pushbullet.markdown b/source/_components/notify.pushbullet.markdown index 87e73452448..5e1ae322e9b 100644 --- a/source/_components/notify.pushbullet.markdown +++ b/source/_components/notify.pushbullet.markdown @@ -30,4 +30,4 @@ Configuration variables: - **name** (*Optional*): Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. - **api_key** (*Required*): Enter the API key for PushBullet. Go to https://www.pushbullet.com/ to retrieve your API key. -For more automation examples, see the [getting started with automation page]({{site_root}}/components/automation.html). +For more automation examples, see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.pushover.markdown b/source/_components/notify.pushover.markdown index 0a76bf6e0c1..02aa891990a 100644 --- a/source/_components/notify.pushover.markdown +++ b/source/_components/notify.pushover.markdown @@ -32,9 +32,9 @@ Configuration variables: - **user_key** (*Required*): To retrieve this value log into your account at https://pushover.net This is a quote from the pushover website regarding free/open source apps: -> "If you are creating a client-side library, application, or open source project that will be redistributed and installed by end-users, you may want to require each of your users to register their own application rather than including your own API token with the software." + +<blockquote> + If you are creating a client-side library, application, or open source project that will be redistributed and installed by end-users, you may want to require each of your users to register their own application rather than including your own API token with the software. +</blockquote> When setting up the application you can use this [icon](https://home-assistant.io/images/favicon-192x192.png). - -For more automation examples, see the [getting started with automation page]({{site_root}}/components/automation.html). - diff --git a/source/_components/notify.slack.markdown b/source/_components/notify.slack.markdown index f4e75c5d621..df0d51888e0 100644 --- a/source/_components/notify.slack.markdown +++ b/source/_components/notify.slack.markdown @@ -33,5 +33,5 @@ Configuration variables: - **api_key** (*Required*): The slack API token to use for sending slack messages. You can get your slack API token here https://api.slack.com/web?sudo=1 - **default_channel** (*Required*): The default channel to post to if no channel is explicitly specified when sending the notification message. -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.smtp.markdown b/source/_components/notify.smtp.markdown index 17ec4056024..f90671994fc 100644 --- a/source/_components/notify.smtp.markdown +++ b/source/_components/notify.smtp.markdown @@ -51,4 +51,4 @@ Keep in mind that if the password contains a colon, it needs to be wrapped in ap For Google Mail (smtp.gmail.com) an additional step in the setup process is needed. Google has some extra layers of protection which need special attention. By default, the usage by external applications, especially scripts, is limited. Visit the [Less secure apps](https://www.google.com/settings/security/lesssecureapps) page and enable it. -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.syslog.markdown b/source/_components/notify.syslog.markdown index e4dc1e0bd8d..9ff602d809c 100644 --- a/source/_components/notify.syslog.markdown +++ b/source/_components/notify.syslog.markdown @@ -57,4 +57,4 @@ The table contains values to use in your `configuration.yaml` file. For details about facility, option, and priority please consult the [wikpedia article](http://en.wikipedia.org/wiki/Syslog) and [RFC 3164](http://tools.ietf.org/html/rfc3164). -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.telegram.markdown b/source/_components/notify.telegram.markdown index 4be8021609a..3f963cbc011 100644 --- a/source/_components/notify.telegram.markdown +++ b/source/_components/notify.telegram.markdown @@ -48,4 +48,4 @@ The default value is `notify`. The notifier will bind to the service - **api_key** (*Required*): The API token of your bot. - **chat_id** (*Required*: The chat ID of your user. -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/notify.xmpp.markdown b/source/_components/notify.xmpp.markdown index 258c9b97be6..d381fd0fca1 100644 --- a/source/_components/notify.xmpp.markdown +++ b/source/_components/notify.xmpp.markdown @@ -34,4 +34,4 @@ Configuration variables: All Jabber IDs (JID) must include the domain. Make sure that the password matches the account provided as sender. -To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation.html). +To use notifications, please see the [getting started with automation page]({{site_root}}/components/automation/). diff --git a/source/_components/scene.markdown b/source/_components/scene.markdown index b1072178a01..a887ecc06a0 100644 --- a/source/_components/scene.markdown +++ b/source/_components/scene.markdown @@ -10,25 +10,14 @@ footer: true ha_category: Organization --- -A user can create scenes that capture the states you want certain entities to be. For example a scene -can contain that light A should be turned on and light B should be bright red. +A user can create scenes that capture the states you want certain entities to be. For example a scene can contain that light A should be turned on and light B should be bright red. -A scene is active if all states of the scene match the actual states. An optional `fuzzy_match` option -can be given to allow entities to match if attributes are not exact but are in range of the preferred -state. - -If a scene is manually activated it will store the previous state of the entities. These will be -restored when the state is deactivated manually. If one of the enties that are being tracked change -state on its own, the old state will not be restored when it is being deactivated. - -Scenes can be activated using the service `scene.turn_on` and deactivated using the service `scene.turn_off`. +Scenes can be activated using the service `scene.turn_on`. ```yaml # Example configuration.yaml entry scene: - name: Romantic - # Optional, allow fuzzy matching number atttributes to check if scene is on - fuzzy_match: 0.2 entities: light.tv_back_light: on light.ceiling: diff --git a/source/_components/script.markdown b/source/_components/script.markdown index 205098fcb86..7031ae1b495 100644 --- a/source/_components/script.markdown +++ b/source/_components/script.markdown @@ -10,8 +10,7 @@ footer: true ha_category: Automation --- -The script component allows users to create a sequence of service calls and delays. Scripts can be -started using the service `script/turn_on` and interrupted using the service `script/turn_off`. +The script component allows users to create a sequence of service calls and delays. Scripts can be started using the service `script/turn_on` and interrupted using the service `script/turn_off`. ```yaml # Example configuration.yaml entry diff --git a/source/_components/sensor.command_sensor.markdown b/source/_components/sensor.command_sensor.markdown index 0255f920356..37acffe19ce 100644 --- a/source/_components/sensor.command_sensor.markdown +++ b/source/_components/sensor.command_sensor.markdown @@ -43,7 +43,7 @@ In this section you find some real life examples of how to use this sensor. There are several ways to get the temperature of your hard drive. A simple solution is to use [hddtemp](https://savannah.nongnu.org/projects/hddtemp/). ```bash -hddtemp -n /dev/sda +$ hddtemp -n /dev/sda ``` To use those information, the entry for a sensor in the `configuration.yaml` file will look like this. @@ -59,8 +59,7 @@ sensor: ### {% linkable_title CPU temperature %} -Thanks to the [`proc`](https://en.wikipedia.org/wiki/Procfs) file system, various details about a system can be retrieved. Here the CPU temperature -is of interest. Add something similar to your `configuration.yaml` file: +Thanks to the [`proc`](https://en.wikipedia.org/wiki/Procfs) file system, various details about a system can be retrieved. Here the CPU temperature is of interest. Add something similar to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry @@ -75,19 +74,18 @@ The `correction_factor` will make sure that the value is shown in a useful forma ### {% linkable_title Use an external script %} -The example is doing the same as the [aREST sensor](/components/sensor.arest.html) but with an external Python script. It should give you an idea about interacting with devices which are exposing a RESTful API. +The example is doing the same as the [aREST sensor](/components/sensor.arest/) but with an external Python script. It should give you an idea about interacting with devices which are exposing a RESTful API. The one-line script to retrieve a value is shown below. Of course would it be possible to use this directly in the `configuration.yaml` file but need extra care about the quotation marks. -```python -python3 -c "import requests; print(requests.get('http://10.0.0.48/analog/2').json()['return_value'])" +```bash +$ python3 -c "import requests; print(requests.get('http://10.0.0.48/analog/2').json()['return_value'])" ``` The script (saved as `arest-value.py`) that is used looks like the example below. ```python #!/usr/bin/python3 -# from requests import get response = get('http://10.0.0.48/analog/2') print(response.json()['return_value']) diff --git a/source/_components/sensor.forecast.markdown b/source/_components/sensor.forecast.markdown index 536248c5cf8..0cc7f2aa96b 100644 --- a/source/_components/sensor.forecast.markdown +++ b/source/_components/sensor.forecast.markdown @@ -14,7 +14,7 @@ featured: true The forecast platform uses the [Forecast.io](https://forecast.io/) web service as a source for meteorological data for your location. The location is based on the Longitude and Latitude cooridinates configured in `configuration.yaml`. The cooridinates are auto detected but to take advantage of the hyper-local weather reported by forecast.io, you can refine them down to your exact home address. GPS cooridinates can be found by using Google Maps and clicking on your home. -You need an API key which is free but requires a [registration](https://developer.forecast.io/register). You can make 1000 requests per day. This means that you could create approximately every 1.4 minute one. +You need an API key which is free but requires a [registration](https://developer.forecast.io/register). You can make 1000 requests per day. This means that you could create one approximately every 1.4 minutes. To add Forecast.io to your installation, add the following to your `configuration.yaml` file: @@ -45,7 +45,7 @@ sensor: Configuration variables: -- **api_key** (*Required*): Your API key for http://forecast.io/. +- **api_key** (*Required*): Your API key for http://forecast.io/. - **monitored_conditions** array (*Required*): Conditions to display in the frontend. - **summary**: A human-readable text summary. - **precip_type**: The type of precipitation occurring. @@ -59,7 +59,7 @@ Configuration variables: - **pressure**: The sea-level air pressure in millibars. - **visibility**: The average visibility. - **ozone**: The columnar density of total atmospheric ozone in Dobson. -- **units** (*Optional*): Specify the unit system. Default to `si` or `us` based on the temperature preference in Home Assistant. Other options are auto, us, si, ca, and uk2. +- **units** (*Optional*): Specify the unit system. Default to `si` or `us` based on the temperature preference in Home Assistant. Other options are `auto`, `us`, `si`, `ca`, and `uk2`. `auto` will let forecast.io decide the unit system based on location. Details about the API are available in the [Forecast.io documentation](https://developer.forecast.io/docs/v2). diff --git a/source/_components/sensor.mysensors.markdown b/source/_components/sensor.mysensors.markdown index acdcc355040..d4580c676fb 100644 --- a/source/_components/sensor.mysensors.markdown +++ b/source/_components/sensor.mysensors.markdown @@ -35,6 +35,6 @@ Configuration variables: If you are using an original Arduino the port will be named `ttyACM*`. The exact number can be determined with the command shown below. ```bash -ls /dev/ttyACM* +$ ls /dev/ttyACM* ``` diff --git a/source/_components/sensor.rest.markdown b/source/_components/sensor.rest.markdown index fd8801af944..5418981fff9 100644 --- a/source/_components/sensor.rest.markdown +++ b/source/_components/sensor.rest.markdown @@ -86,7 +86,7 @@ To display the IP address, the entry for a sensor in the `configuration.yaml` fi ### {% linkable_title Single value from a local Glances instance %} -The [glances](/components/sensor.glances.html) sensor is doing the exact same thing for all exposed values. +The [glances](/components/sensor.glances/) sensor is doing the exact same thing for all exposed values. Add something similar to the entry below to your `configuration.yaml` file: diff --git a/source/_components/sensor.wink.markdown b/source/_components/sensor.wink.markdown index a44bef59345..5238e0d8cdc 100644 --- a/source/_components/sensor.wink.markdown +++ b/source/_components/sensor.wink.markdown @@ -14,5 +14,5 @@ ha_category: Sensor The wink sensor platform allows you to get data from your [Wink](http://www.wink.com/) sensors. -The requirement is that you have setup your [Wink hub](/components/light.wink.html). +The requirement is that you have setup your [Wink hub](/components/light.wink/). diff --git a/source/_components/shell_command.markdown b/source/_components/shell_command.markdown index dec04c801ca..08b116f090f 100644 --- a/source/_components/shell_command.markdown +++ b/source/_components/shell_command.markdown @@ -10,9 +10,7 @@ footer: true ha_category: Automation --- - -This component can expose regular shell commands as services. Services can be called from a script -or in automation. +This component can expose regular shell commands as services. Services can be called from a script or in automation. ```yaml # Example configuration.yaml entry diff --git a/source/_components/simple_alarm.markdown b/source/_components/simple_alarm.markdown index 9590158f08a..726d3edea2e 100644 --- a/source/_components/simple_alarm.markdown +++ b/source/_components/simple_alarm.markdown @@ -11,9 +11,9 @@ ha_category: Alarm --- -The component `simple_alarm` is capable of detecting intruders. It does so by checking if lights are being turned on while there is no one at home. When this happens it will turn the lights red, flash them for 30 seconds and send a message via [the notifiy component]({{site_root}}/components/notify.html). It will also flash a specific light when a known person comes home. +The component `simple_alarm` is capable of detecting intruders. It does so by checking if lights are being turned on while there is no one at home. When this happens it will turn the lights red, flash them for 30 seconds and send a message via [the notifiy component]({{site_root}}/components/notify/). It will also flash a specific light when a known person comes home. -This component depends on the components [device_tracker]({{site_root}}/components/device_tracker.html) and [light]({{site_root}}/components/light.html) being setup. +This component depends on the components [device_tracker]({{site_root}}/components/device_tracker/) and [light]({{site_root}}/components/light/) being setup. To set it up, add the following lines to your `configuration.yaml` file: diff --git a/source/_components/sun.markdown b/source/_components/sun.markdown index 3dd6b29b5ff..b4e66dc1e93 100644 --- a/source/_components/sun.markdown +++ b/source/_components/sun.markdown @@ -10,11 +10,9 @@ footer: true ha_category: Weather --- +The sun component will use your current location to track if the sun is above or below the horizon.The sun can be used within automation as [a trigger with an optional offset to simulate dawn/dusk][automation-trigger]. -The `sun` component will use your current location to track if the sun is above or below the horizon. -The sun can be used within automation as [a trigger with an optional offset to simulate dawn/dusk][automation-trigger]. - -[automation-trigger]: /components/automation.html#sun-trigger +[automation-trigger]: /components/automation/#sun-trigger ```yaml # Example configuration.yaml entry diff --git a/source/_components/switch.command_switch.markdown b/source/_components/switch.command_switch.markdown index cb6bbf04608..1407b512214 100644 --- a/source/_components/switch.command_switch.markdown +++ b/source/_components/switch.command_switch.markdown @@ -38,7 +38,7 @@ In this section you find some real life examples of how to use this switch. ### {% linkable_title aREST device %} -The example below is doing the same as the [aREST switch](/components/switch.arest.html). The commandline tool `[curl](http://curl.haxx.se/)` is used to toogle a pin which is controllable through REST. +The example below is doing the same as the [aREST switch](/components/switch.arest/). The commandline tool [`curl`](http://curl.haxx.se/) is used to toogle a pin which is controllable through REST. ```yaml # Example configuration.yaml entry diff --git a/source/_components/switch.mqtt.markdown b/source/_components/switch.mqtt.markdown index 26d81154b25..0abacd12517 100644 --- a/source/_components/switch.mqtt.markdown +++ b/source/_components/switch.mqtt.markdown @@ -12,11 +12,9 @@ ha_category: Switch --- -In an ideal scenario, the MQTT device will have a state topic to publish state changes. If these messages are published with RETAIN flag, the MQTT switch will receive an instant state update after subscription and will -start with correct state. Otherwise, the initial state of the switch will be false/off. +In an ideal scenario, the MQTT device will have a state topic to publish state changes. If these messages are published with RETAIN flag, the MQTT switch will receive an instant state update after subscription and will start with correct state. Otherwise, the initial state of the switch will be false/off. -When a state topic is not available, the switch will work in optimistic mode. In this mode, the switch will immediately change state after every command. Otherwise, the switch will wait for state confirmation from device -(message from `state_topic`). +When a state topic is not available, the switch will work in optimistic mode. In this mode, the switch will immediately change state after every command. Otherwise, the switch will wait for state confirmation from device (message from `state_topic`). Optimistic mode can be forced, even if state topic is available. Try to enable it, if experiencing incorrect switch operation. @@ -44,5 +42,5 @@ Configuration variables: - **optimistic** (*Optional*): Flag that defines if switch works in optimistic mode. Default is true if no state topic defined, else false. <p class='note warning'> -Make sure that your topics match exact. <code>some-topic/</code> and <code>some-topic</code> are different topics. + Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. </p> diff --git a/source/_components/switch.wink.markdown b/source/_components/switch.wink.markdown index f24ef16fb8c..29ca5b82106 100644 --- a/source/_components/switch.wink.markdown +++ b/source/_components/switch.wink.markdown @@ -14,5 +14,5 @@ ha_category: Switch The wink switch platform allows you to control your [Wink](http://www.wink.com/) switches. -The requirement is that you have setup your [Wink hub](/components/light.wink.html). +The requirement is that you have setup your [Wink hub](/components/light.wink/). diff --git a/source/_components/tellstick.markdown b/source/_components/tellstick.markdown index 7ff9fd47440..913415ece60 100644 --- a/source/_components/tellstick.markdown +++ b/source/_components/tellstick.markdown @@ -12,8 +12,7 @@ ha_category: Hub --- -The tellstick component integrates [TellStick](http://www.telldus.se/products/tellstick) devices into Home Assistant. This integration allows users to add switches, lights, and sensors which are communicating with 433 Mhz. There are couple of vendors (Capidi -Elro, Intertechno, Nexa, Proove, Sartano, and Viking) how are selling products which works with TellStick. For more details, please check the TellStick [compatibility list](http://telldus.se/products/compability). +The tellstick component integrates [TellStick](http://www.telldus.se/products/tellstick) devices into Home Assistant. This integration allows users to add switches, lights, and sensors which are communicating with 433 Mhz. There are couple of vendors (Capidi Elro, Intertechno, Nexa, Proove, Sartano, and Viking) how are selling products which works with TellStick. For more details, please check the TellStick [compatibility list](http://telldus.se/products/compability). To get started, add the devices to your `configuration.yaml` file. @@ -28,6 +27,5 @@ sensor: # All dimmers will be picked up as lights. light: platform: tellstick - ``` diff --git a/source/_components/vera.markdown b/source/_components/vera.markdown index 51a98d5ffd3..4ceee75d400 100644 --- a/source/_components/vera.markdown +++ b/source/_components/vera.markdown @@ -16,6 +16,6 @@ The [Vera](http://getvera.com) ecosystem is using Z-Wave for communication betwe ## {% linkable_title Building on top of Vera %} - - [Vera Sensor](/components/sensor.vera.html) - - [Vera Switch](/components/switch.vera.html) - - [Vera Light](/components/light.vera.html) + - [Vera Sensor](/components/sensor.vera/) + - [Vera Switch](/components/switch.vera/) + - [Vera Light](/components/light.vera/) diff --git a/source/_components/wink.markdown b/source/_components/wink.markdown index e0c02aa0ba4..5f7ecf0cbe3 100644 --- a/source/_components/wink.markdown +++ b/source/_components/wink.markdown @@ -12,14 +12,15 @@ ha_category: Hub featured: true --- - [Wink](http://www.wink.com/) is a home automation hub that can control a whole wide range of devices on the market. Or, as they say in their own words: -<blockquote>Wink offers one, quick and simple way to connect people with the products they rely on every day in their home.</blockquote> +<blockquote> + Wink offers one, quick and simple way to connect people with the products they rely on every day in their home. +</blockquote> Home Assistant integrates the Wink hub and allows you to get the status and control connected switches, lights and sensors. -To get started with the Wink API, you will first need to get yourself an API access token. Because it is very difficult right now to get access to their API, John McLaughlin has created the form below to get you one. +To get started with the Wink API, you will first need to get yourself an API access token. Because it is very difficult right now to get access to their API, John McLaughlin has created the form below to get you one. <iframe src="https://winkbearertoken.appspot.com" style='width: 100%; height: 200px; border: 0; margin: 0 auto 15px; border-left: 2px solid #049cdb; padding-left: 15px;'></iframe> @@ -38,5 +39,5 @@ Configuration variables: This will connect to the Wink hub and automatically set up any lights, switches and sensors that it finds. <p class='note'> -The Wink hub can only be accessed via the cloud. This means it requires an active internet connection and you will experience delays when controlling devices (~3s) and getting an updated device state (~15s). +The Wink hub can only be accessed via the cloud. This means it requires an active internet connection and you will experience delays when controlling devices (~3s) and getting an updated device state (~15s). </p> diff --git a/source/_components/zone.markdown b/source/_components/zone.markdown index 9a0674113f0..bce45416b23 100644 --- a/source/_components/zone.markdown +++ b/source/_components/zone.markdown @@ -10,10 +10,7 @@ footer: true ha_category: Organization --- -Zones allow you to specify certain regions on earth (for now). When a device tracker sees a device -to be within a zone, the state will take the name from the zone. Zones can also be used as a -[trigger](/components/automation.html#zone-trigger) or [condition](/components/automation.html#zone-condition) -inside automation setups. +Zones allow you to specify certain regions on earth (for now). When a device tracker sees a device to be within a zone, the state will take the name from the zone. Zones can also be used as a [trigger](/components/automation/#zone-trigger) or [condition](/components/automation/#zone-condition) inside automation setups. Zones support the usual method to specify multiple zones, use keys `zone:`, `zone 2:` etc. @@ -44,18 +41,12 @@ zone 3: #### {% linkable_title Home zone %} -If no configuration is given, the zone component will create a zone for home. This zone will use -location given in the `configuration.yaml` file and have a radius of 100 meters. To override this, -create a zone configuration and name it 'Home'. +If no configuration is given, the zone component will create a zone for home. This zone will use location given in the `configuration.yaml` file and have a radius of 100 meters. To override this, create a zone configuration and name it 'Home'. #### {% linkable_title Icons %} -It is preferred to pick an icon to use for your zone. By default, Home Assistant includes most of the -[material icons](https://www.google.com/design/icons/). See [the source][icon-source] for a specific list which -categories are included. +It is preferred to pick an icon to use for your zone. By default, Home Assistant includes most of the [material icons](https://www.google.com/design/icons/). See [the source][icon-source] for a specific list which categories are included. -For all but the action category you will need to prefix the icon name with its category. For example -`social:people` or `av:radio`. For the action category, you will not need to do this, examples are -`home`, `work,`, `group-work` and `shopping-cart`. +For all but the action category you will need to prefix the icon name with its category. For example `social:people` or `av:radio`. For the action category, you will not need to do this, examples are `home`, `work,`, `group-work` and `shopping-cart`. [icon-source]: https://github.com/balloob/home-assistant-polymer/blob/master/src/resources/home-assistant-icons.html#L3 diff --git a/source/_components/zwave.markdown b/source/_components/zwave.markdown index 132d033772e..ac3b720bbe7 100644 --- a/source/_components/zwave.markdown +++ b/source/_components/zwave.markdown @@ -19,9 +19,9 @@ To allow Home Assistant to talk to your Z-Wave USB stick you will have to compil Please make sure you have the correct dependencies installed: -``` -apt-get install cython3 libudev-dev python-sphinx python3-setuptools -pip3 install "cython<0.23" +```bash +$ apt-get install cython3 libudev-dev python-sphinx python3-setuptools +$ pip3 install "cython<0.23" ``` As an alternative, the Home Assistant docker image has support for Z-Wave built-in. @@ -36,6 +36,8 @@ Configuration variables: - **usb_path** (*Required*): The port where your device is connected to your Home Assistant host. +To find the path of your Z-Wave stick, run: + ```bash -ls /dev/ttyUSB* +$ ls /dev/ttyUSB* ``` diff --git a/source/_cookbook/automation_for_rainy_days.markdown b/source/_cookbook/automation_for_rainy_days.markdown index 8af1d009292..4447f4cc386 100644 --- a/source/_cookbook/automation_for_rainy_days.markdown +++ b/source/_cookbook/automation_for_rainy_days.markdown @@ -11,7 +11,7 @@ footer: true ### Rainy Day Light ### -This requires a [forecast.io](components/sensor.forecast.html) sensor with the condition `weather_precip` that tells if it's raining or not. +This requires a [forecast.io](components/sensor.forecast/) sensor with the condition `weather_precip` that tells if it's raining or not. Turn on a light in the living room when it starts raining, someone is home, and it's afternoon or later. @@ -40,6 +40,7 @@ automation: And then of course turn off the lamp when it stops raining but only if it's within an hour before sunset. ```yaml +automation 2: alias: 'Rain is over' trigger: - platform: state diff --git a/source/_cookbook/automation_sun.markdown b/source/_cookbook/automation_sun.markdown index 81cd31059e1..fb8201f9e35 100644 --- a/source/_cookbook/automation_sun.markdown +++ b/source/_cookbook/automation_sun.markdown @@ -27,7 +27,9 @@ automation: ``` #### Natural wake up light + _Note, Philips Hue is currently the only light platform that support transitions._ + ```yaml automation: trigger: diff --git a/source/_includes/article.html b/source/_includes/article.html index 842799773e8..b7a6e0e2edb 100644 --- a/source/_includes/article.html +++ b/source/_includes/article.html @@ -17,9 +17,15 @@ </header> {% endunless %} {% if index %} - <div class="entry-content">{{ content | excerpt }}</div> - {% capture excerpted %}{{ content | has_excerpt }}{% endcapture %} - {% if excerpted == 'true' %} + <div class="entry-content"> + {% if post.excerpted %} + {{ post.excerpt }} + <a href="{{ post.url }}"Continue reading →</a> + {% else %} + {{ post.content }} + {% endif %} + </div> + {% if post.excerpted %} <footer> <a rel="full-article" href="{{ root_url }}{{ post.url }}">{{ site.excerpt_link }}</a> </footer> diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html index e61ff281e44..9a040bf2658 100644 --- a/source/_includes/asides/component_navigation.html +++ b/source/_includes/asides/component_navigation.html @@ -7,11 +7,12 @@ </div> {% assign file_parts = page.url | split: '/' | last | split: '.' %} - {% if file_parts.size == 3 %} + + {% if file_parts.size == 2 %} {% assign is_platform = true %} {% assign imp_name = file_parts[1] %} {% assign parent_name = file_parts[0] %} - {% assign parent_url = parent_name | prepend: '/components/' | append: '.html' %} + {% assign parent_url = parent_name | prepend: '/components/' | append: '/' %} {% assign parent_component = components | where: 'url', parent_url | first %} {% else %} {% assign is_platform = false %} @@ -54,8 +55,8 @@ {% for component in components %} {% if component.url != page.url %} {% assign comp_file_parts = component.url | split: '/' | last | split: '.' %} - {% if comp_file_parts.size == 3 %} - {% assign comp_imp_name = comp_file_parts[1] %} + {% if comp_file_parts.size == 2 %} + {% assign comp_imp_name = comp_file_parts | last %} {% else %} {% assign comp_imp_name = comp_file_parts | first %} {% endif %} diff --git a/source/_includes/blog/post/article.html b/source/_includes/blog/post/article.html index 0423ce6bfa3..2cef69f00ea 100644 --- a/source/_includes/blog/post/article.html +++ b/source/_includes/blog/post/article.html @@ -22,13 +22,13 @@ {% 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 }}#read-more">{{ site.excerpt_link }}</a> -</div> +{% if index %} + <div class="entry-content clearfix"> + {{ post.excerpt }} + {% if post.content contains site.excerpt_separator %} + <a class="btn pull-right" href="{{ post.url }}#read-more">{{ site.excerpt_link }}</a> + {% endif %} + </div> {% else %} - {{ content | replace: site.excerpt_separator, '<a name="read-more"></a>' }} -{% endif %} \ No newline at end of file + {{ post.content | replace: site.excerpt_separator, '<a name="read-more"></a>' }} +{% endif %} diff --git a/source/_includes/blog/post/date.html b/source/_includes/blog/post/date.html index 34b93846492..247baa7526a 100644 --- a/source/_includes/blog/post/date.html +++ b/source/_includes/blog/post/date.html @@ -1,5 +1,5 @@ {% capture date %}{{ page.date }}{{ post.date }}{% endcapture %} -{% capture date_formatted %}{{ page.date_formatted }}{{ post.date_formatted }}{% endcapture %} +{% capture date_formatted %}{{ post.date_formatted }}{% endcapture %} {% capture has_date %}{{ date | size }}{% endcapture %} {% capture updated %}{{ page.updated }}{{ post.updated }}{% endcapture %} diff --git a/source/_includes/custom/footer.html b/source/_includes/custom/footer.html index 4ada6f071fc..9c22951a2ff 100644 --- a/source/_includes/custom/footer.html +++ b/source/_includes/custom/footer.html @@ -1,3 +1,3 @@ <p class="copyright"> - <span class="credit">Powered by <a href="http://octopress.org">Octopress</a>, <a href='http://jekyllrb.com/'>Jekyll</a> and the <a href='https://github.com/coogie/oscailte'>Oscalite theme</a>. Hosted by <a href='https://pages.github.com/'>GitHub</a> and served by <a href='https://cloudflare.com'>CloudFlare</a>.</span> + <span class="credit">Powered by <a href='http://jekyllrb.com/'>Jekyll</a> and the <a href='https://github.com/coogie/oscailte'>Oscalite theme</a>. Hosted by <a href='https://pages.github.com/'>GitHub</a> and served by <a href='https://cloudflare.com'>CloudFlare</a>.</span> </p> \ No newline at end of file diff --git a/source/_includes/custom/grid_item_left.html b/source/_includes/custom/grid_item_left.html index c4ea1b9a922..c756f093443 100644 --- a/source/_includes/custom/grid_item_left.html +++ b/source/_includes/custom/grid_item_left.html @@ -2,46 +2,46 @@ <hr> <p>Home Assistant will track the state of all the devices in your home, so you don't have to.</p> <div class='supported-brands clearfix'> - <a href='/components/thermostat.nest.html'> + <a href='/components/thermostat.nest/'> <img src='/images/supported_brands/nest_thermostat.png' /> </a> - <a href='/components/light.hue.html'> + <a href='/components/light.hue/'> <img src='/images/supported_brands/philips_hue.png' /> </a> - <a href='/components/mqtt.html'> + <a href='/components/mqtt/'> <img src='/images/supported_brands/mqtt.png' /> </a> - <a href='/components/media_player.cast.html'> + <a href='/components/media_player.cast/'> <img src='/images/supported_brands/google_cast.png' /> </a> - <a href='/components/switch.wemo.html'> + <a href='/components/switch.wemo/'> <img src='/images/supported_brands/belkin_wemo.png' /> </a> - <a href='/components/notify.pushbullet.html'> + <a href='/components/notify.pushbullet/'> <img src='/images/supported_brands/pushbullet.png' /> </a> - <a href='/components/ifttt.html'> + <a href='/components/ifttt/'> <img src='/images/supported_brands/ifttt.png' /> </a> - <a href='/components/wink.html'> + <a href='/components/wink/'> <img src='/images/supported_brands/wink.png' /> </a> - <a href='/components/arduino.html'> + <a href='/components/arduino/'> <img src='/images/supported_brands/arduino.png' /> </a> - <a href='/components/device_tracker.netgear.html'> + <a href='/components/device_tracker.netgear/'> <img src='/images/supported_brands/netgear.png' /> </a> - <a href='/components/media_player.kodi.html'> + <a href='/components/media_player.kodi/'> <img src='/images/supported_brands/kodi.png' /> </a> - <a href='/components/media_player.plex.html'> + <a href='/components/media_player.plex/'> <img src='/images/supported_brands/plex.png' /> </a> - <a href='/components/device_tracker.luci.html'> + <a href='/components/device_tracker.luci/'> <img src='/images/supported_brands/openwrt.png' /> </a> - <a href='/components/vera.html'> + <a href='/components/vera/'> <img src='/images/supported_brands/vera.png' /> </a> </div> diff --git a/source/_includes/custom/navigation.html b/source/_includes/custom/navigation.html index 4d9eac4af00..5da7853c2e5 100644 --- a/source/_includes/custom/navigation.html +++ b/source/_includes/custom/navigation.html @@ -3,10 +3,10 @@ <a href="{{ root_url }}/getting-started/">Getting started</a> <ul> <li><a href='/getting-started/'>Installing Home Assistant</a></li> - <li><a href='/getting-started/configuration.html'>Configuration basics</a></li> - <li><a href='/getting-started/devices.html'>Adding devices</a></li> - <li><a href='/getting-started/presence-detection.html'>Presence detection</a></li> - <li><a href='/getting-started/automation.html'>Automation</a></li> + <li><a href='/getting-started/configuration/'>Configuration basics</a></li> + <li><a href='/getting-started/devices/'>Adding devices</a></li> + <li><a href='/getting-started/presence-detection/'>Presence detection</a></li> + <li><a href='/getting-started/automation/'>Automation</a></li> <li><a href='/cookbook'>Configuration cookbook</a></li> </ul> </li> @@ -14,16 +14,16 @@ <li> <a href="{{ root_url }}/developers/">Developers</a> <ul> - <li><a href="{{ root_url }}/developers/architecture.html">Architecture</a></li> - <li><a href="{{ root_url}}/developers/frontend.html">Frontend development</a></li> - <li><a href="{{ root_url}}/developers/creating_components.html"> + <li><a href="{{ root_url }}/developers/architecture/">Architecture</a></li> + <li><a href="{{ root_url}}/developers/frontend/">Frontend development</a></li> + <li><a href="{{ root_url}}/developers/creating_components/"> Creating components </a></li> - <li><a href="{{ root_url}}/developers/add_new_platform.html"> + <li><a href="{{ root_url}}/developers/add_new_platform/"> Adding platform support </a></li> - <li><a href="{{ root_url }}/developers/api.html">API</a></li> - <li><a href="{{ root_url }}/developers/credits.html">Credits</a></li> + <li><a href="{{ root_url }}/developers/api/">API</a></li> + <li><a href="{{ root_url }}/developers/credits/">Credits</a></li> </ul> </li> <li><a href="{{ root_url }}/blog/">Blog</a></li> diff --git a/source/_includes/custom/welcome.html b/source/_includes/custom/welcome.html index 0edba7be7df..d4d6aa18b44 100644 --- a/source/_includes/custom/welcome.html +++ b/source/_includes/custom/welcome.html @@ -3,8 +3,8 @@ 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 than a minute. </p> <code class='front-install'> -<span class='sh'>$</span> pip3 install homeassistant<br /> -<span class='sh'>$</span> hass --open-ui +<div>pip3 install homeassistant</div> +<div>hass --open-ui</div> </code> <p class='hero-buttons'> <a href='{{ root_url }}/demo/' target='_blank'>View demo</a> diff --git a/source/_includes/post/time_to_read.html b/source/_includes/post/time_to_read.html index 4c72aa0700a..bdd98c5981f 100644 --- a/source/_includes/post/time_to_read.html +++ b/source/_includes/post/time_to_read.html @@ -1 +1 @@ -<span><i class='icon-time'></i> {{ content | reading_time_as_s }} reading time</span> \ No newline at end of file +<span><i class='icon-time'></i> {{ post.content | reading_time_as_s }} reading time</span> \ No newline at end of file diff --git a/source/_includes/site/head.html b/source/_includes/site/head.html index c1b47ce8709..15024e3c1ed 100644 --- a/source/_includes/site/head.html +++ b/source/_includes/site/head.html @@ -4,8 +4,6 @@ <!--[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' }}{% 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"> @@ -16,12 +14,12 @@ <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="{{ canonical }}"> + <link rel="canonical" href="{{ page.url | canonical_url }}"> {% if site.social.facebook.app_id %} <meta property="fb:app_id" 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:url" content="{{ page.url | canonical_url }}"> <meta property="og:type" content="{% if page.categories %}article{% else %}website{% endif %}"> <meta property="og:description" content="{{ fb_description | strip_html | condense_spaces | truncate:200 }}"> <meta property="og:image" content="{% if page.og_image %}{{ page.og_image | prepend: site.url }}{% else %}https://home-assistant.io/images/home-assistant-logo-2164x2164.png{% endif %}"> diff --git a/source/_includes/site/sidebar.html b/source/_includes/site/sidebar.html index f14f78a5f85..5cb593d902e 100644 --- a/source/_includes/site/sidebar.html +++ b/source/_includes/site/sidebar.html @@ -1,7 +1,7 @@ <div class="grid"> {% assign url_parts = page.url | split: '/' %} {% if url_parts[1] == 'components' %} - {% include asides/component_navigation.html %} + {% include asides/component_navigation.html | compact_newlines %} {% else %} {% include asides/social.html %} {% include_array default_asides %} diff --git a/source/_layouts/default.html b/source/_layouts/default.html index 5869ebe920b..1991e6ec968 100644 --- a/source/_layouts/default.html +++ b/source/_layouts/default.html @@ -20,7 +20,7 @@ <div class="grid__item two-thirds lap-one-whole palm-one-whole"> {% endif %} - {{ content | expand_urls: root_url }} + {{ content }} </div> diff --git a/source/_layouts/post.html b/source/_layouts/post.html index a34d4bde268..9d5c8e41ad5 100644 --- a/source/_layouts/post.html +++ b/source/_layouts/post.html @@ -4,10 +4,11 @@ is_post: true --- <article class="post"> + {% assign post = page %} {% include blog/post/article.html %} </article> -{% if site.disqus_short_name and page.comments == true %} +{% if site.disqus_short_name and page.comments == true %} <section id="disqus"> <h3 class="indent title">Comments</h3> <div id="disqus_thread" aria-live="polite">{% include blog/post/disqus_thread.html %}</div> diff --git a/source/_posts/2015-01-04-hey-pushbullet-nice-talking-to-you.markdown b/source/_posts/2015-01-04-hey-pushbullet-nice-talking-to-you.markdown index 2df775edf5d..74f864dec63 100644 --- a/source/_posts/2015-01-04-hey-pushbullet-nice-talking-to-you.markdown +++ b/source/_posts/2015-01-04-hey-pushbullet-nice-talking-to-you.markdown @@ -25,7 +25,7 @@ Read on to learn how to enable the notify component and integrate it with other To enable the new notify component, add the following to your `home-assistant.conf`: -``` +```conf [notify] platform=pushbullet api_key=ABCDEFGHJKLMNOPQRSTUVXYZ diff --git a/source/_posts/2015-01-11-bootstrapping-your-setup-with-discovery.markdown b/source/_posts/2015-01-11-bootstrapping-your-setup-with-discovery.markdown index 9c673720a09..828b9c44b69 100644 --- a/source/_posts/2015-01-11-bootstrapping-your-setup-with-discovery.markdown +++ b/source/_posts/2015-01-11-bootstrapping-your-setup-with-discovery.markdown @@ -16,8 +16,8 @@ Most devices still require some sort of interaction from the user after being di To enable the discovery component, add the following to your `home-assistant.conf`: -``` +```conf [discovery] ``` -A new [discovery section]({{site_root}}/developers/add_new_platform.html#discovery) has been added to the Adding a new platform page with instructions how to make your platform discoverable. +A new [discovery section]({{site_root}}/developers/add_new_platform/#discovery) has been added to the Adding a new platform page with instructions how to make your platform discoverable. diff --git a/source/_posts/2015-01-13-nest-in-da-house.markdown b/source/_posts/2015-01-13-nest-in-da-house.markdown index c074aa7c0c0..a4ef36a9f90 100644 --- a/source/_posts/2015-01-13-nest-in-da-house.markdown +++ b/source/_posts/2015-01-13-nest-in-da-house.markdown @@ -18,7 +18,7 @@ The new integration exists out of two parts: a generic thermostat component and If you own a Nest thermostat, add the following lines to your `home-assistant.conf`: -``` +```conf [thermostat] platform=nest username=YOUR_USERNAME diff --git a/source/_posts/2015-02-24-streaming-updates.markdown b/source/_posts/2015-02-24-streaming-updates.markdown index 8385fc10999..5be909ceeca 100644 --- a/source/_posts/2015-02-24-streaming-updates.markdown +++ b/source/_posts/2015-02-24-streaming-updates.markdown @@ -18,7 +18,7 @@ A new toggle has been added ot the sidebar to turn streaming updates on and off. Streaming updates has been implemented using the HTML5 `EventSource` tag. Implementation is pretty straight forward as all the reconnection logic will be handled by the event source tag. The [server-side code](https://github.com/balloob/home-assistant/blob/master/homeassistant/components/api.py#L90) is 50 lines and the [client-side code](https://github.com/balloob/home-assistant-js/blob/master/src/actions/stream.js) is 80 lines of code. -All events that happen on the server will now also be sent to the browser. This turns any browser running the UI into a fully functioning [slave instance](https://home-assistant.io/developers/architecture.html#multiple-connected-instances) of Home Assistant. This opens up new possibilities for Home Assistant components that live completely client-side. +All events that happen on the server will now also be sent to the browser. This turns any browser running the UI into a fully functioning [slave instance](https://home-assistant.io/developers/architecture/#multiple-connected-instances) of Home Assistant. This opens up new possibilities for Home Assistant components that live completely client-side. Implementing EventSource was not without challenges. Here are some of the issues that had to be solved: diff --git a/source/_posts/2015-02-28-home-assistant-migrating-to-yaml.markdown b/source/_posts/2015-02-28-home-assistant-migrating-to-yaml.markdown index 37aee5eef18..b3fc0b1554c 100644 --- a/source/_posts/2015-02-28-home-assistant-migrating-to-yaml.markdown +++ b/source/_posts/2015-02-28-home-assistant-migrating-to-yaml.markdown @@ -9,8 +9,7 @@ comments: true categories: core --- -Home Assistant is now using [YAML](http://yaml.org/) for it's configuration file. -YAML allows the use of lists, which should make the configuration file a bit more flexible and useful. The new configuration file format is backwards compatible with existing components. Because of this, there is no need for component developers to update their components. +Home Assistant is now using [YAML](http://yaml.org/) for it's configuration file. YAML allows the use of lists, which should make the configuration file a bit more flexible and useful. The new configuration file format is backwards compatible with existing components. Because of this, there is no need for component developers to update their components. The new file is named configuration.yaml and if it can't be found in your config directory, Home Assistant will instead try to find the old configuration file, home-assistant.conf. diff --git a/source/_posts/2015-03-22-release-notes.markdown b/source/_posts/2015-03-22-release-notes.markdown index 39320e1314b..fd729755652 100644 --- a/source/_posts/2015-03-22-release-notes.markdown +++ b/source/_posts/2015-03-22-release-notes.markdown @@ -9,7 +9,7 @@ categories: release-notes --- A new version of Home Assistant has just been pushed out. It contains bugfixes contributed by [jamespcole](https://github.com/jamespcole), [andythigpen](https://github.com/andythigpen), [trainman419](https://github.com/trainman419) and [me](https://github.com/balloob). It also adds a bunch of great new features: -__Script__<br> +__Script__ Andythigpen has contributed a script component. This allows users to create a sequence of service calls and delays. Scripts can be started using the service `script/turn_on` and interrupted using the service `script/turn_off`. A separate page has been added to the frontend to see the status of your scripts. ```yaml @@ -34,7 +34,7 @@ script: <!--more--> -__Scene__<br> +__Scene__ I (Paulus) have contributed a scene component. A user can create scenes that capture the states you want certain entities to be. For example a scene can contain that light A should be turned on and light B should be bright red. Deactivating a scene will restore the previous state from before the scene was activated. Just like scripts, scenes have their own separate page to see which scenes are on. ```yaml @@ -50,9 +50,8 @@ scene: ``` <a name='sabnzbd'></a> -__SABnzbd__<br> -<img src='/images/supported_brands/sabnzbd.png' style='border:none; box-shadow: none; float: right;' height='50' /> -James Cole has contributed support to integrate SABnzbd. This will allow you to monitor your downloads from within Home Assistant and setup automation based on the information. +__SABnzbd__ +<img src='/images/supported_brands/sabnzbd.png' style='border:none; box-shadow: none; float: right;' height='50' /> James Cole has contributed support to integrate SABnzbd. This will allow you to monitor your downloads from within Home Assistant and setup automation based on the information. ```yaml # Example configuration.yaml entry @@ -72,9 +71,8 @@ sensor: ``` <a name='pushover'></a> -__PushOver__<br> -<img src='/images/supported_brands/pushover.png' style='border:none; box-shadow: none; float: right;' height='50' /> -James Cole has also contributed support for <a href='https://pushover.net/'>the PushOver service</a> as a platform for the notify component. This allows components to send messages to the user using PushOver. +__PushOver__ +<img src='/images/supported_brands/pushover.png' style='border:none; box-shadow: none; float: right;' height='50' /> James Cole has also contributed support for <a href='https://pushover.net/'>the PushOver service</a> as a platform for the notify component. This allows components to send messages to the user using PushOver. ```yaml # Example configuration.yaml entry diff --git a/source/_posts/2015-04-25-release-notes.markdown b/source/_posts/2015-04-25-release-notes.markdown index 36fa309a29c..e1f35b1ce3f 100644 --- a/source/_posts/2015-04-25-release-notes.markdown +++ b/source/_posts/2015-04-25-release-notes.markdown @@ -10,27 +10,25 @@ categories: release-notes It's been a month since the latest update and a lot has happened again. Here a quick overview of the new things. -__Line Charts__<br> +__Line Charts__ [James](https://github.com/jamespcole) has upgraded the history in the frontend to support line graphs. Line graphs will be shown for any entity that has a unit of measurement. The line graphs will also be shown in the more info card of an entity. [See the demo for a live example.](/demo/) <p class='img'> <img src='/images/screenshots/history-line-graphs.png'> </p> -__ISY994 hub support__<br> -<img src='/images/supported_brands/universal_devices.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[Ryan](https://github.com/rmkraus) has contributed support to integrate the ISY994 hub by Universal Devices. This allows you to integrate your X10/Insteon sensors, switches and lights. +__ISY994 hub support__ +<img src='/images/supported_brands/universal_devices.png' style='border:none; box-shadow: none; float: right;' height='50' /> [Ryan](https://github.com/rmkraus) has contributed support to integrate the ISY994 hub by Universal Devices. This allows you to integrate your X10/Insteon sensors, switches and lights. -He has created an extensive getting started guide which can be found on [the ISY994 component page](/components/isy994.html). +He has created an extensive getting started guide which can be found on [the ISY994 component page](/components/isy994/). ```yaml # Example configuration.yaml entry isy994: ``` -__Logbook__<br> -<img src='/images/screenshots/logbook.png' style='margin-left:10px; float: right;' height="100" /> -I (Paulus) have added a logbook component. The logbook component provides a different perspective on the history of your house by showing all the changes that happened to your house in chronological order. [See the demo for a live example.](/demo/) +__Logbook__ +<img src='/images/screenshots/logbook.png' style='margin-left:10px; float: right;' height="100" /> I (Paulus) have added a logbook component. The logbook component provides a different perspective on the history of your house by showing all the changes that happened to your house in chronological order. [See the demo for a live example.](/demo/) <span class='clearfix'></span> ```yaml @@ -40,9 +38,8 @@ logbook: <!--more--> -__Transmission support__<br> -<img src='/images/supported_brands/transmission.png' style='border:none; box-shadow: none; float: right;' height='50' /> -James has also contributed support for integrating Transmission into Home Assistant. +__Transmission support__ +<img src='/images/supported_brands/transmission.png' style='border:none; box-shadow: none; float: right;' height='50' /> James has also contributed support for integrating Transmission into Home Assistant. ```yaml # Example configuration.yaml entry @@ -59,7 +56,7 @@ sensor: - type: 'upload_speed' ``` -__Modbus support__<br> +__Modbus support__ [Kixam](https://github.com/kixam) has contributed support for modbus, a serial communication protocol to control PLCs. It currently supports sensors and switches which can be controlled over serial, TCP and UDP connections. ```yaml diff --git a/source/_posts/2015-05-14-release-notes.markdown b/source/_posts/2015-05-14-release-notes.markdown index 286106f52ec..67be7543c83 100644 --- a/source/_posts/2015-05-14-release-notes.markdown +++ b/source/_posts/2015-05-14-release-notes.markdown @@ -20,7 +20,7 @@ To update to the latest version, run <code>scripts/update</code>. Please report <!--more--> -__Overwriting Entity Attributes__<br> +__Overwriting Entity Attributes__ Before diving into the newly supported devices and services, I want to highlight an awesome configuration enhancement by [rmkraus](https://github.com/rmkraus): overwriting entity attributes. These new configuration settings allow you to overwrite entity state attributes. The main usage for this is being able to overwrite attributes that influence how an entity is shown in the interface. @@ -37,9 +37,8 @@ homeassistant: entity_picture: http://graph.facebook.com/schoutsen/picture ``` -__MySensors__<br> -<img src='/images/supported_brands/mysensors.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[Andythigpen](https://github.com/andythigpen) and [Theolind](https://github.com/theolind) have added support for the [MySensors platform](http://www.mysensors.org) to Home Assistant. +__MySensors__ +<img src='/images/supported_brands/mysensors.png' style='border:none; box-shadow: none; float: right;' height='50' /> [Andythigpen](https://github.com/andythigpen) and [Theolind](https://github.com/theolind) have added support for the [MySensors platform](http://www.mysensors.org) to Home Assistant. ```yaml # Example configuration.yaml entry @@ -48,9 +47,8 @@ sensor: port: /dev/ttyACM0 ``` -__OpenWeatherMap__<br> -<img src='/images/supported_brands/openweathermap.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[Fabaff](https://github.com/fabaff) has contributed support for [OpenWeatherMap](http://openweathermap.org). This will allow you to integrate local meteorological data into Home Assistant. +__OpenWeatherMap__ +<img src='/images/supported_brands/openweathermap.png' style='border:none; box-shadow: none; float: right;' height='50' /> [Fabaff](https://github.com/fabaff) has contributed support for [OpenWeatherMap](http://openweathermap.org). This will allow you to integrate local meteorological data into Home Assistant. ```yaml # Example configuration.yaml entry @@ -68,9 +66,8 @@ sensor: - type: 'snow' ``` -__InstaPush__<br> -<img src='/images/supported_brands/instapush.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[Fabaff](https://github.com/fabaff) has contributed support for [InstaPush](https://instapush.im). This will allow you send messages from Home Assistant to your iOS and Android devices. +__InstaPush__ +<img src='/images/supported_brands/instapush.png' style='border:none; box-shadow: none; float: right;' height='50' /> [Fabaff](https://github.com/fabaff) has contributed support for [InstaPush](https://instapush.im). This will allow you send messages from Home Assistant to your iOS and Android devices. ```yaml # Example configuration.yaml entry @@ -83,9 +80,8 @@ notify: tracker: ABCDEFGHJKLMNOPQRSTUVXYZ ``` -__XMPP__<br> -<img src='/images/supported_brands/xmpp.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[Fabaff](https://github.com/fabaff) has contributed support for Jabber/XMPP. This will allow you send messages from Home Assistant to anyone on Jabber/XMPP. +__XMPP__ +<img src='/images/supported_brands/xmpp.png' style='border:none; box-shadow: none; float: right;' height='50' /> [Fabaff](https://github.com/fabaff) has contributed support for Jabber/XMPP. This will allow you send messages from Home Assistant to anyone on Jabber/XMPP. ```yaml # Example configuration.yaml entry @@ -96,9 +92,8 @@ notify: recipient: YOUR_RECIPIENT ``` -__Notify My Android__<br> -<img src='/images/supported_brands/nma.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[Fabaff](https://github.com/fabaff) has contributed support for [Notify My Android](http://www.notifymyandroid.com/). This will allow you to send messages from Home Assistant to your Android device. +__Notify My Android__ +<img src='/images/supported_brands/nma.png' style='border:none; box-shadow: none; float: right;' height='50' /> [Fabaff](https://github.com/fabaff) has contributed support for [Notify My Android](http://www.notifymyandroid.com/). This will allow you to send messages from Home Assistant to your Android device. ```yaml # Example configuration.yaml entry @@ -108,7 +103,7 @@ notify: api_key: ABCDEFGHJKLMNOPQRSTUVXYZ ``` -__Time & Date sensor__<br> +__Time & Date sensor__ [Fabaff](https://github.com/fabaff) has contributed a time & date sensor. This will allow you to show the current time/date on the dashboard. ```yaml diff --git a/source/_posts/2015-06-10-release-notes.markdown b/source/_posts/2015-06-10-release-notes.markdown index 8f4f82bef1e..942ab82f099 100644 --- a/source/_posts/2015-06-10-release-notes.markdown +++ b/source/_posts/2015-06-10-release-notes.markdown @@ -15,8 +15,7 @@ This release sets a record for the amount of people involved: 8! [Andythigpen](h A big improvement has been brought this release by wind-rider. He took the time to revive the Chromecast support and started improving the media player integration. This triggered other people to join in resulting in a revamped media player experience and support for the Music Player Daemon. <p class='img'> - <img src='/images/screenshots/media_player-card.png' /> - Example of the new media player cards + <img src='/images/screenshots/media_player-card.png' /> Example of the new media player cards </p> <p class='note'> @@ -39,9 +38,8 @@ Before jumping into the newly supported platforms, here are the other improvemen * Fix the device tracker getting in a deadlock by @balloob * Update documentation by @fabaff -__Music Player Daemon__<br> -<img src='/images/supported_brands/mpd.png' style='border:none; box-shadow: none; float: right;' height='50' /> -Fabaff has contributed MusicPlayerDaemon support. The mpd platform allows you to control a [Music Player Daemon](http://www.musicpd.org/) from Home Assistant. Right now, only playback is supported and not playlist manipulation. +__Music Player Daemon__ +<img src='/images/supported_brands/mpd.png' style='border:none; box-shadow: none; float: right;' height='50' /> Fabaff has contributed MusicPlayerDaemon support. The mpd platform allows you to control a [Music Player Daemon](http://www.musicpd.org/) from Home Assistant. Right now, only playback is supported and not playlist manipulation. ```yaml # Example configuration.yaml entry @@ -52,7 +50,7 @@ media_player: location: bedroom ``` -__Command line switch__<br> +__Command line switch__ A switch platform that issues specific commands when it is turned on and off. This might very well become our most popular platform as it allows anyone to integrate any type of switch into Home Assistant that can be controlled from the command line, including calling other scripts! ```yaml @@ -65,7 +63,7 @@ switch: offcmd: switch_command off kitchen ``` -__LimitlessLED__<br> +__LimitlessLED__ This new platform can control your LimitlessLED lights from within Home Assistant. The lights are also known as EasyBulb, AppLight, AppLamp, MiLight, LEDme, dekolight or iLight. ```yaml @@ -80,9 +78,8 @@ light: ``` -__Bitcoin sensor__<br> -<img src='/images/supported_brands/bitcoin.png' style='border:none; box-shadow: none; float: right;' height='50' /> -The bitcoin platform displays various details about the [Bitcoin](https://bitcoin.org) network. If you have an online wallet from [Blockchain.info](https://blockchain.info/) the sensor is capable to show your current balance. +__Bitcoin sensor__ +<img src='/images/supported_brands/bitcoin.png' style='border:none; box-shadow: none; float: right;' height='50' /> The bitcoin platform displays various details about the [Bitcoin](https://bitcoin.org) network. If you have an online wallet from [Blockchain.info](https://blockchain.info/) the sensor is capable to show your current balance. ```yaml # Example configuration.yaml entry @@ -116,9 +113,8 @@ sensor: ``` -__SMTP notificatoin platform__<br> -<img src='/images/supported_brands/smtp.png' style='border:none; box-shadow: none; float: right;' height='50' /> -The smtp platform allows you to deliver notifications from Home Assistant to an e-mail recipient. +__SMTP notificatoin platform__ +<img src='/images/supported_brands/smtp.png' style='border:none; box-shadow: none; float: right;' height='50' /> The smtp platform allows you to deliver notifications from Home Assistant to an e-mail recipient. ```yaml # Example configuration.yaml entry @@ -134,7 +130,7 @@ notify: ``` -__Syslog notification platform__<br> +__Syslog notification platform__ The syslog platform allows you to deliver notifications from Home Assistant to the local syslog. ```yaml @@ -144,13 +140,12 @@ notify: ``` -__Swiss Public transport sensor__<br> -The swiss public transport sensor will give you the next two departure times from a given location to another one in Switzerland. See the [component page](/components/sensor.swiss_public_transport.html) for more information how to set it up. +__Swiss Public transport sensor__ +The swiss public transport sensor will give you the next two departure times from a given location to another one in Switzerland. See the [component page](/components/sensor.swiss_public_transport/) for more information how to set it up. -__Transmission turtle mode switch__<br> -<img src='/images/supported_brands/transmission.png' style='border:none; box-shadow: none; float: right;' height='50' /> -The transmission platform allows you to control your [Transmission](http://www.transmissionbt.com/) client from within Home Assistant. The platform enables you switch to your 'Alternative Speed Limits' (aka 'Turtle mode') setting. +__Transmission turtle mode switch__ +<img src='/images/supported_brands/transmission.png' style='border:none; box-shadow: none; float: right;' height='50' /> The transmission platform allows you to control your [Transmission](http://www.transmissionbt.com/) client from within Home Assistant. The platform enables you switch to your 'Alternative Speed Limits' (aka 'Turtle mode') setting. ```yaml # Example configuration.yaml entry @@ -164,7 +159,7 @@ switch: ``` -__Hikvision camera motion detection support__<br> +__Hikvision camera motion detection support__ This switch platform allows you to control your motion detection setting on your Hikvision camera. ```yaml diff --git a/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown b/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown index 711c72a21f8..cb010250f7b 100644 --- a/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown +++ b/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown @@ -12,7 +12,7 @@ Another month has passed and some great new features have landed in Home Assista This release includes some architectural changes by me. The first is that the frontend is now based on a [NuclearJS](http://optimizely.github.io/nuclear-js/) JavaScript backend. This has greatly helped to organize and optimize the frontend code. Another change is that Home Assistant will now install dependencies on-demand instead of installing dependencies for all supported devices. -__IP Camera Support__<br> +__IP Camera Support__ James has worked very hard to add support for IP cameras to Home Assistant which is included in this release. The initial release focusses on providing generic IP camera support. This means that any webcam that can exposes a JPEG image via a url can be integrated. Home Assistant will route the requests to your camera via the server allowing you to expose IP camera's inside your network via the Home Assistant app. @@ -33,9 +33,8 @@ To update to the latest version, run <code>scripts/update</code>. Please report <!--more--> -__Arduino__<br> -<img src='/images/supported_brands/arduino.png' style='border:none; box-shadow: none; float: right;' height='50' /> -Fabian has contributed support for interfacing with Arduinos. This makes it possible to connect your Arduino via USB and expose pins as sensor data and write to pins via switches. Have a look at [the docs](/components/arduino.html) for an extensive guide to get started. +__Arduino__ +<img src='/images/supported_brands/arduino.png' style='border:none; box-shadow: none; float: right;' height='50' /> Fabian has contributed support for interfacing with Arduinos. This makes it possible to connect your Arduino via USB and expose pins as sensor data and write to pins via switches. Have a look at [the docs](/components/arduino/) for an extensive guide to get started. ```yaml # Example configuration.yaml entry @@ -60,9 +59,8 @@ sensor: type: analog ``` -__Kodi (XBMC)__<br> -<img src='/images/supported_brands/kodi.png' style='border:none; box-shadow: none; float: right;' height='50' /> -Ettisan has contributed a Kodi (XBMC) platform for the media player component. This allows you to track all the media that you are playing and allow you to control it. +__Kodi (XBMC)__ +<img src='/images/supported_brands/kodi.png' style='border:none; box-shadow: none; float: right;' height='50' /> Ettisan has contributed a Kodi (XBMC) platform for the media player component. This allows you to track all the media that you are playing and allow you to control it. ```yaml # Example configuration.yaml entry @@ -74,9 +72,8 @@ media_player: password: my_secure_password ``` -__TP-Link__<br> -<img src='/images/supported_brands/tp-link.png' style='border:none; box-shadow: none; float: right;' width='150' /> -Michael has added TP-Link support to the device tracker. This allows you to now detect presence if you have a TP-Link router. +__TP-Link__ +<img src='/images/supported_brands/tp-link.png' style='border:none; box-shadow: none; float: right;' width='150' /> Michael has added TP-Link support to the device tracker. This allows you to now detect presence if you have a TP-Link router. ```yaml # Example configuration.yaml entry @@ -87,9 +84,8 @@ device_tracker: password: YOUR_ADMIN_PASSWORD ``` -__Efergy energy monitor__<br> -<img src='/images/supported_brands/efergy.png' style='border:none; box-shadow: none; float: right;' height='50' /> -Miniconfig has contributed support for the [Efergy energy meters](https://efergy.com). To get an app token, log in to your efergy account, go to the Settings page, click on App tokens, and click "Add token". +__Efergy energy monitor__ +<img src='/images/supported_brands/efergy.png' style='border:none; box-shadow: none; float: right;' height='50' /> Miniconfig has contributed support for the [Efergy energy meters](https://efergy.com). To get an app token, log in to your efergy account, go to the Settings page, click on App tokens, and click "Add token". ```yaml # Example configuration.yaml entry @@ -105,7 +101,7 @@ sensor: currency: $ ``` -__Forecast.io__<br> +__Forecast.io__ Fabian has added support for [Forecast.io](https://forecast.io/) to get weather forecasts for Home Assistant. You need an API key which is free but requires a [registration](https://developer.forecast.io/register). To add Forecast.io to your installation, add the following to your `configuration.yaml` file: ```yaml diff --git a/source/_posts/2015-08-09-mqtt-raspberry-pi-squeezebox-asuswrt-support.markdown b/source/_posts/2015-08-09-mqtt-raspberry-pi-squeezebox-asuswrt-support.markdown index 5591d5e4506..8cb94322f4a 100644 --- a/source/_posts/2015-08-09-mqtt-raspberry-pi-squeezebox-asuswrt-support.markdown +++ b/source/_posts/2015-08-09-mqtt-raspberry-pi-squeezebox-asuswrt-support.markdown @@ -10,13 +10,12 @@ categories: release-notes It's time for the August release and there is some serious good stuff this time. The core of Home Assistant has gone some serious clean up and a bump in test coverage thanks to [@balloob](https://github.com/balloob). If you're a developer, make sure you read up on [the deprecation notices](https://github.com/balloob/home-assistant/pull/251). [@fabaff](https://github.com/fabaff) did another great round of documentating all the various components. -__MQTT Support__<br> -<img src='/images/supported_brands/mqtt.png' style='border:none; box-shadow: none; float: right;' height='50' /> -The big new addition in this release is the support for the MQTT protocol by [@fabaff](https://github.com/fabaff) with some help from [@balloob](https://github.com/balloob). It will now be possible to integrate any IoT device that talks via MQTT. For the initial release we support connecting Home Assistant to a broker (no TLS yet). Components can now subscribe and publish to MQTT topics ([see the example][mqtt-example]) and also support for the automation component [has been added][mqtt-automation]. For more information, see [the MQTT component page][mqtt-component]. +__MQTT Support__ +<img src='/images/supported_brands/mqtt.png' style='border:none; box-shadow: none; float: right;' height='50' /> The big new addition in this release is the support for the MQTT protocol by [@fabaff](https://github.com/fabaff) with some help from [@balloob](https://github.com/balloob). It will now be possible to integrate any IoT device that talks via MQTT. For the initial release we support connecting Home Assistant to a broker (no TLS yet). Components can now subscribe and publish to MQTT topics ([see the example][mqtt-example]) and also support for the automation component [has been added][mqtt-automation]. For more information, see [the MQTT component page][mqtt-component]. [mqtt-example]: https://github.com/balloob/home-assistant/blob/dev/config/custom_components/mqtt_example.py -[mqtt-automation]: /components/automation.html#mqtt-based-automation -[mqtt-component]: /components/mqtt.html +[mqtt-automation]: /components/automation/#mqtt-based-automation +[mqtt-component]: /components/mqtt/ ```yaml # Example configuration.yaml entry @@ -32,9 +31,8 @@ mqtt: <!--more--> -__Raspberry PI GPIO Support__<br> -<img src='/images/supported_brands/raspberry-pi.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[@gbarba](https://github.com/gbarba) has contributed support to use the general purpose input and output pins on a Raspberry PI as switches inside Home Assistant. +__Raspberry PI GPIO Support__ +<img src='/images/supported_brands/raspberry-pi.png' style='border:none; box-shadow: none; float: right;' height='50' /> [@gbarba](https://github.com/gbarba) has contributed support to use the general purpose input and output pins on a Raspberry PI as switches inside Home Assistant. ```yaml # Example configuration.yaml entry @@ -45,9 +43,8 @@ switch: 12: Light Desk ``` -__ASUSWRT based routers__<br> -<img src='/images/supported_brands/asus.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[@persandstrom](https://github.com/persandstrom) has contributed support to do prescence detection using ASUSWRT based routers. +__ASUSWRT based routers__ +<img src='/images/supported_brands/asus.png' style='border:none; box-shadow: none; float: right;' height='50' /> [@persandstrom](https://github.com/persandstrom) has contributed support to do prescence detection using ASUSWRT based routers. ```yaml # Example configuration.yaml entry @@ -58,9 +55,8 @@ device_tracker: password: YOUR_ADMIN_PASSWORD ``` -__Logitech Squeezebox media player support__<br> -<img src='/images/supported_brands/logitech.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[@persandstrom](https://github.com/persandstrom) also contributed support for the Logitech Squeezebox media player. This allows you to control your Logitech Squeezebox from Home Assistant. +__Logitech Squeezebox media player support__ +<img src='/images/supported_brands/logitech.png' style='border:none; box-shadow: none; float: right;' height='50' /> [@persandstrom](https://github.com/persandstrom) also contributed support for the Logitech Squeezebox media player. This allows you to control your Logitech Squeezebox from Home Assistant. ```yaml # Example configuration.yaml entry @@ -72,9 +68,8 @@ media_player: password: password ``` -__Slack notification support__<br> -<img src='/images/supported_brands/slack.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[@jamespcole](https://github.com/jamespcole) has contributed a Slack platform for the notification platform. This allows you to deliver messages to any channel. +__Slack notification support__ +<img src='/images/supported_brands/slack.png' style='border:none; box-shadow: none; float: right;' height='50' /> [@jamespcole](https://github.com/jamespcole) has contributed a Slack platform for the notification platform. This allows you to deliver messages to any channel. ```yaml # Example configuration.yaml entry @@ -84,9 +79,8 @@ notify: default_channel: '#general' ``` -__Edimax Smart Switches support__<br> -<img src='/images/supported_brands/edimax.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[@rkabadi](https://github.com/rkabadi) has contributed support for integrating Edimax Smart Switches into Home Assistant. +__Edimax Smart Switches support__ +<img src='/images/supported_brands/edimax.png' style='border:none; box-shadow: none; float: right;' height='50' /> [@rkabadi](https://github.com/rkabadi) has contributed support for integrating Edimax Smart Switches into Home Assistant. ```yaml # Example configuration.yaml entry @@ -98,7 +92,7 @@ switch: name: Edimax Smart Plug ``` -__RFXtrx sensor support__<br> +__RFXtrx sensor support__ [@danielhiversen](https://github.com/danielhiversen) has contributed support for RFXtrx sensors. It supports sensors that communicate in the frequency range of 433.92 MHz. ```yaml @@ -110,7 +104,7 @@ sensor: The path to your device, e.g. `/dev/serial/by-id/usb-RFXCOM_RFXtrx433_A1Y0NJGR-if00-port0` -__TEMPer temperature sensor support__<br> +__TEMPer temperature sensor support__ Support for Temper temperature sensors has been contributed by [@rkabadi](https://github.com/rkabadi). ```yaml diff --git a/source/_posts/2015-08-17-verisure-and-modern-tp-link-router-support.markdown b/source/_posts/2015-08-17-verisure-and-modern-tp-link-router-support.markdown index 983d48d3370..9484565a1b7 100644 --- a/source/_posts/2015-08-17-verisure-and-modern-tp-link-router-support.markdown +++ b/source/_posts/2015-08-17-verisure-and-modern-tp-link-router-support.markdown @@ -17,9 +17,8 @@ As we didn't want to just push out bug fixes, this release includes a few additi - Support for modern TP-Link routers like the ArcherC9 line has been contributed by [@chrisvis](https://github.com/chrisvis). - Improved support for MQTT topic subscriptions has been contributed by [@qrtn](https://github.com/qrtn) -__Verisure Support__<br> -<img src='/images/supported_brands/verisure.png' style='border:none; box-shadow: none; float: right;' height='50' /> -Home Assistant support to integrate your [Verisure](https://www.verisure.com/) alarms, hygrometers, sensors and thermometers has been contributed by [@persandstrom](https://github.com/persandstrom). +__Verisure Support__ +<img src='/images/supported_brands/verisure.png' style='border:none; box-shadow: none; float: right;' height='50' /> Home Assistant support to integrate your [Verisure](https://www.verisure.com/) alarms, hygrometers, sensors and thermometers has been contributed by [@persandstrom](https://github.com/persandstrom). ```yaml # Example configuration.yaml entry diff --git a/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown b/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown index a2e4e564ec5..428fefd5ee9 100644 --- a/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown +++ b/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown @@ -14,7 +14,7 @@ _This is a guest post by Home Assistant user and contributor [Nolan Gilley](http In our house, laundry has been a struggle for quite some time. Our washer and dryer both lack a buzzer which leads to forgotten laundry, and stinky mess that needs to be rewashed. I decided to create a solution by monitoring the washer and dryer myself with some cheap electronics. -As an avid user of Home Assistant, I decided it would be the perfect application to manage the UI and notification system. Now all I needed was a way to monitor the washer and dryer. I tried using sound sensors but found them unreliable. I ended up opting for an accelerometer attached to the back of each appliance. I also added magnetic reed switches on the doors of the washer and dryer to detect if the doors are open or closed. I connected the accelerometers and reed switches to a [Moteino](https://lowpowerlab.com/moteino/), an arduino clone with an RF transceiver. The Moteino can perform the logic to figure out which state the appliances are in and wirelessly communicate that data with another Moteino that is connected via serial to my Raspberry Pi. The Raspberry Pi reads the serial data and repeats it over MQTT for Home Assistant to use. This is great because I don't have to run Home Assistant on the Raspberry Pi. I can run it on a faster machine and point the [MQTT component](/components/mqtt.html) to my Raspberry Pi. +As an avid user of Home Assistant, I decided it would be the perfect application to manage the UI and notification system. Now all I needed was a way to monitor the washer and dryer. I tried using sound sensors but found them unreliable. I ended up opting for an accelerometer attached to the back of each appliance. I also added magnetic reed switches on the doors of the washer and dryer to detect if the doors are open or closed. I connected the accelerometers and reed switches to a [Moteino](https://lowpowerlab.com/moteino/), an arduino clone with an RF transceiver. The Moteino can perform the logic to figure out which state the appliances are in and wirelessly communicate that data with another Moteino that is connected via serial to my Raspberry Pi. The Raspberry Pi reads the serial data and repeats it over MQTT for Home Assistant to use. This is great because I don't have to run Home Assistant on the Raspberry Pi. I can run it on a faster machine and point the [MQTT component](/components/mqtt/) to my Raspberry Pi. After taking some sample data from the accelerometers while each appliance was in operation, I decided to plot the data to help determine the proper thresholds of when the devices were running or off. I had to do this in order to get precise ranges so the dryer sensor wouldn't get tripped by the washer or vice versa. In the plot below you can see the acceleration in the x direction for the accelerometer connected to the washing machine. It's easy to see when the washing machine is in operation here. I used the same technique for the dryer's accelerometer. @@ -27,14 +27,14 @@ After taking some sample data from the accelerometers while each appliance was i <!--more--> -Next it was just a matter of integrating everything with Home Assistant. I was able to use the [MQTT component](/components/mqtt.html) to read the washer and dryer states from the Moteino and display it in Home Assistant. +Next it was just a matter of integrating everything with Home Assistant. I was able to use the [MQTT component](/components/mqtt/) to read the washer and dryer states from the Moteino and display it in Home Assistant. <p class='img'> <img src='/images/blog/2015-08-laundry-automation/screenshot-ha.png' /> Status of the dryer and washer in Home Assistant </p> -Next I wrote [scripts](/components/script.html) that are run whenever the washer or dryer completes a load. This is triggered by the [automation component](/components/automation.html). When the laundry is complete I have the lights in the house turn red and [notify me via PushBullet](/components/notify.pushbullet.html). Once the laundry is taken care of another script runs that sets the lights back to normal. So far it has been very helpful and very reliable. +Next I wrote [scripts](/components/script/) that are run whenever the washer or dryer completes a load. This is triggered by the [automation component](/components/automation/). When the laundry is complete I have the lights in the house turn red and [notify me via PushBullet](/components/notify.pushbullet/). Once the laundry is taken care of another script runs that sets the lights back to normal. So far it has been very helpful and very reliable. <p class='img'> <a href='/images/blog/2015-08-laundry-automation/moteino-and-sensors.jpg'> @@ -54,7 +54,7 @@ Materials used: Home Assistant Configuration: -``` +```yaml mqtt: broker: 192.168.1.100 port: 1883 diff --git a/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown b/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown index 0a4faf3a035..961a5eb0dec 100644 --- a/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown +++ b/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown @@ -9,31 +9,19 @@ categories: user-stories og_image: /images/screenshots/ui2015.png --- -As Home Assistant is gaining more and more users we started to feel the pain from not having a -proper release mechanism. We had no version numbering and required users to checkout the source -using Git to get started. On top of that, as the number of devices that we support keeps raising, so -did the number of dependencies that are used. That's why we decided to change the way we roll. From -now on: +As Home Assistant is gaining more and more users we started to feel the pain from not having a proper release mechanism. We had no version numbering and required users to checkout the source using Git to get started. On top of that, as the number of devices that we support keeps raising, so did the number of dependencies that are used. That's why we decided to change the way we roll. From now on: - - Each release will have a version number, starting with version 0.7. This was chosen because it - shows that we have been around for some time but are not considering ourselves to be fully - stable. + - Each release will have a version number, starting with version 0.7. This was chosen because it shows that we have been around for some time but are not considering ourselves to be fully stable. - Each release will be pushed to PyPi. This will be the only supported method of distribution. - Home Assistant is available after installation as a command-line utility `hass`. - - The default configuration location has been moved from `config` in the current working directory - to `~/.homeassistant` (`%APPDATA%/.homeassistant` on Windows). - - Requirements for components and platforms are no longer installed into the current Python - environment (being virtual or not) but will be installed in `<config-dir>/lib`. + - The default configuration location has been moved from `config` in the current working directory to `~/.homeassistant` (`%APPDATA%/.homeassistant` on Windows). + - Requirements for components and platforms are no longer installed into the current Python environment (being virtual or not) but will be installed in `<config-dir>/lib`. -A huge shout out to [Ryan Kraus](https://github.com/rmkraus) for making this all possible. Please -make sure you read [the full blog post][self] for details on how to migrate your existing setup. +A huge shout out to [Ryan Kraus](https://github.com/rmkraus) for making this all possible. Please make sure you read [the full blog post][self] for details on how to migrate your existing setup. [self]: /blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/#read-more -And while Ryan was fixing distribution, I have been hard at work in giving Home Assistant a face -lift. We already looked pretty good but lacked proper form of organization for users with many -devices. The new UI moves away from a card per entity and has cards per group and domain instead. -[The demo](/demo/) has been updated so give it a spin. +And while Ryan was fixing distribution, I have been hard at work in giving Home Assistant a face lift. We already looked pretty good but lacked proper form of organization for users with many devices. The new UI moves away from a card per entity and has cards per group and domain instead. [The demo](/demo/) has been updated so give it a spin. <p class='img'> <a href='/demo/'> @@ -46,35 +34,29 @@ devices. The new UI moves away from a card per entity and has cards per group an ### {% linkable_title Migration to version 0.7 %} -For this example, let's say we have an old Home Assistant installation in -`/home/paulus/home-assistant`. +For this example, let's say we have an old Home Assistant installation in `/home/paulus/home-assistant`. If you want to migrate your existing configuration to be used as the default configuration: ```bash -cp -r /home/paulus/home-assistant ~/.homeassistant +$ cp -r /home/paulus/home-assistant ~/.homeassistant ``` -It If you want to have the configuration in a different location, for example -`/home/paulus/home-assistant-config`, you will have to point Home Assistant at this configuration -folder when launching: +It If you want to have the configuration in a different location, for example `/home/paulus/home-assistant-config`, you will have to point Home Assistant at this configuration folder when launching: ```bash -hass --config /home/paulus/home-assistant-config +$ hass --config /home/paulus/home-assistant-config ``` ### {% linkable_title New platforms %} And last, but not least: new platforms! -__MQTT Sensors and Switches__<br> -<img src='/images/supported_brands/mqtt.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[@sfam](https://github.com/sfam) has blessed us with two more MQTT platforms to extend our -integration with MQTTT: [sensor][mqtt-sensor] and [switch][mqtt-switch]. Both platforms require the -MQTT component to be connected to a broker. +__MQTT Sensors and Switches__ +<img src='/images/supported_brands/mqtt.png' style='border:none; box-shadow: none; float: right;' height='50' /> [@sfam](https://github.com/sfam) has blessed us with two more MQTT platforms to extend our integration with MQTTT: [sensor][mqtt-sensor] and [switch][mqtt-switch]. Both platforms require the MQTT component to be connected to a broker. -[mqtt-sensor]: /components/sensor.mqtt.html -[mqtt-switch]: /components/switch.mqtt.html +[mqtt-sensor]: /components/sensor.mqtt/ +[mqtt-switch]: /components/switch.mqtt/ ```yaml # Example configuration.yml entr @@ -94,9 +76,8 @@ switch: optimistic: false ``` -__Actiontec MI424WR Verizon FIOS Wireless router__<br> -<img src='/images/supported_brands/actiontec.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[Nolan](https://github.com/nkgilley) has contributed support for Actiontec wireless routers. +__Actiontec MI424WR Verizon FIOS Wireless router__ +<img src='/images/supported_brands/actiontec.png' style='border:none; box-shadow: none; float: right;' height='50' /> [Nolan](https://github.com/nkgilley) has contributed support for Actiontec wireless routers. ```yaml # Example configuration.yaml entry @@ -107,10 +88,8 @@ device_tracker: password: YOUR_ADMIN_PASSWORD ``` -__DHT temperature and humidty sensors__<br> -[@MakeMeASandwich](https://github.com/makemeasandwich) has contributed support for DHT temperature -and humidity sensors. It allows you to get the current temperature and humidity from a DHT11, DHT22, -or AM2302 device. +__DHT temperature and humidty sensors__ +[@MakeMeASandwich](https://github.com/makemeasandwich) has contributed support for DHT temperature and humidity sensors. It allows you to get the current temperature and humidity from a DHT11, DHT22, or AM2302 device. ```yaml # Example configuration.yaml entry @@ -123,7 +102,7 @@ sensor: - humidity ``` -__Aruba device tracker__<br> +__Aruba device tracker__ [Michael Arnauts](https://github.com/michaelarnauts) has contributed support for Aruba wireless routers for presence detection. ```yaml diff --git a/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown b/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown index 49f336d48a9..16c614f0402 100644 --- a/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown +++ b/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown @@ -10,14 +10,16 @@ categories: how-to mqtt og_image: /images/blog/2015-09-mqtt/arduino.png --- -<img src='/images/supported_brands/mqtt.png' style='border:none; box-shadow: none; float: right;' height='80' /> -The [MQTT](https://en.wikipedia.org/wiki/MQTT) support was added to Home Assistant recently. The [MQTT component](https://home-assistant.io/components/mqtt.html) will enable you to do all sort of things. Most likely you will use it to communicate with your devices. But Home Assistant doesn't care where the data is coming from or is limited to real hardware as long as there is MQTT support. This means that it doesn't matter if the data is coming from a human, a web service, or a device. +{::options coderay_line_numbers="table" /} + +<img src='/images/supported_brands/mqtt.png' style='border:none; box-shadow: none; float: right;' height='80' /> [MQTT](https://en.wikipedia.org/wiki/MQTT) support was added to Home Assistant recently. The [MQTT component](https://home-assistant.io/components/mqtt/) will enable you to do all sort of things. Most likely you will use it to communicate with your devices. But Home Assistant doesn't care where the data is coming from or is limited to real hardware as long as there is MQTT support. This means that it doesn't matter if the data is coming from a human, a web service, or a device. A great example is shown in a [Laundry Automation](https://home-assistant.io/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/) post in this blog. This post will give you a small overview of some other possibilities on how to use MQTT with Home Assistant. <!--more--> + ### {% linkable_title Manual usage %} The simplest but not the coolest way as a human to interact with a Home Assistant sensor is launching a command manually. Let's create a "Mood" sensor. For simplicity Home Assistant and the MQTT broker are both running on the same host. The needed configuration snipplets to add to the `configuration.yaml` file consists of two parts: one for the broker and one for the sensor. @@ -32,12 +34,12 @@ sensor: state_topic: "home-assistant/fabian/mood" ``` -After a restart of Home Assistant the "Mood" sensor will show up in the frontend. For more details about the configuration of MQTT itself and the sensor, please refer to the [MQTT component](https://home-assistant.io/components/mqtt.html) or the [MQTT sensor](https://home-assistant.io/components/sensor.mqtt.html) documentation. +After a restart of Home Assistant the "Mood" sensor will show up in the frontend. For more details about the configuration of MQTT itself and the sensor, please refer to the [MQTT component](https://home-assistant.io/components/mqtt/) or the [MQTT sensor](https://home-assistant.io/components/sensor.mqtt/) documentation. Now we can set the mood. The commandline tool (`mosquitto_pub`) which is shipped with `mosquitto` is used to send an MQTT message. ```bash -mosquitto_pub -h 127.0.0.1 -t "home-assistant/fabian/mood" -m "bad" +$ mosquitto_pub -h 127.0.0.1 -t "home-assistant/fabian/mood" -m "bad" ``` <p class='img'> @@ -45,7 +47,7 @@ mosquitto_pub -h 127.0.0.1 -t "home-assistant/fabian/mood" -m "bad" The Mood sensor </p> -This is a really bad example. Don't do this in the real world because you won't be able to create diagrams of historical data. Better use a numerical value. +This is a really bad example. Don't do this in the real world because you won't be able to create diagrams of historical data. Better use a numerical value. ### {% linkable_title Python MQTT bindings %} diff --git a/source/_posts/2015-09-13-home-assistant-meets-ifttt.markdown b/source/_posts/2015-09-13-home-assistant-meets-ifttt.markdown index 636d75209c1..703a24d323e 100644 --- a/source/_posts/2015-09-13-home-assistant-meets-ifttt.markdown +++ b/source/_posts/2015-09-13-home-assistant-meets-ifttt.markdown @@ -10,13 +10,9 @@ categories: how-to release-notes og_image: /images/blog/2015-09-ifttt/og_facebook.png --- -Today we announce the release of Home Assistant v0.7.2 which includes brand new support by -[@sfam][github-sfam] to integrate with [IFTTT][ifttt]. IFTTT stands for If This, Then That and is a -webservice that integrates with almost every possible webservice out there. Adding Home -Assistant to this mix means Home Assistant can connect with all via IFTTT. +Today we announce the release of Home Assistant v0.7.2 which includes brand new support by [@sfam][github-sfam] to integrate with [IFTTT][ifttt]. IFTTT stands for If This, Then That and is a webservice that integrates with almost every possible webservice out there. Adding Home Assistant to this mix means Home Assistant can connect with all via IFTTT. -It is now possible to disable your irregation system if it is going to be cloudy tomorrow or tweet -if your smoke alarm goes off. +It is now possible to disable your irregation system if it is going to be cloudy tomorrow or tweet if your smoke alarm goes off. [github-sfam]: https://github.com/sfam [ifttt]: https://ifttt.com @@ -25,13 +21,11 @@ if your smoke alarm goes off. <img src='/images/blog/2015-09-ifttt/splash.png'> </p> -Head over to the [setup instructions](/components/ifttt.html) to get started with IFTTT. Click the -read more button for some example recipes. +Head over to the [setup instructions](/components/ifttt/) to get started with IFTTT. Click the read more button for some example recipes. <!--more--> -In each of the following examples, make sure to replace the XXX in the url with your correct -host address and api password. +In each of the following examples, make sure to replace the XXX in the url with your correct host address and api password. ## {% linkable_title Turn off irregation system when not needed %} @@ -54,9 +48,7 @@ Maker channel setup: <img src='/images/blog/2015-09-ifttt/recipe-twitter.png' /> </p> -This will tweet a message when an MQTT message is received that the smoke alarm has been triggered. -Setup Maker channel with event name `HA_FIRE_ALARM` and Twitter channel to tweet the message in -`value1`. +This will tweet a message when an MQTT message is received that the smoke alarm has been triggered. Setup Maker channel with event name `HA_FIRE_ALARM` and Twitter channel to tweet the message in `value1`. ```yaml # Configuration.yaml entry diff --git a/source/_posts/2015-09-18-monitoring-with-glances-and-home-assistant.markdown b/source/_posts/2015-09-18-monitoring-with-glances-and-home-assistant.markdown index 52853449ad8..545cf7ae4e6 100644 --- a/source/_posts/2015-09-18-monitoring-with-glances-and-home-assistant.markdown +++ b/source/_posts/2015-09-18-monitoring-with-glances-and-home-assistant.markdown @@ -11,33 +11,33 @@ og_image: /images/supported_brands/glances.png --- <img src='/images/supported_brands/glances.png' style='border:none; box-shadow: none; float: right;' height='80' /> -Inspried by a [feature requests](https://github.com/balloob/home-assistant/issues/310) I started looking into the available options to do monitoring of remote hosts. The feature request is about displaying system information in a similar way than the [systemmonitor](/components/sensor.systemmonitor.html) sensor does it for the local system. After a while I started to think that it would be a nice addition for a small home network where no full-blown system monitoring setup is present. +Inspried by a [feature requests](https://github.com/balloob/home-assistant/issues/310) I started looking into the available options to do monitoring of remote hosts. The feature request is about displaying system information in a similar way than the [systemmonitor](/components/sensor.systemmonitor/) sensor does it for the local system. After a while I started to think that it would be a nice addition for a small home network where no full-blown system monitoring setup is present. <!--more--> The basic problem is to get the data from the remote host. Starting with [psutil](https://pypi.python.org/pypi/psutil) that is used by the systemmonitor sensor, a possible solution is only a click away and named [Glances](https://github.com/nicolargo/glances). Glances has a nice curses-based interface and a [RESTful API](https://github.com/nicolargo/glances/wiki/The-Glances-RESTFULL-JSON-API). -The [Glances sensor](/components/sensor.glances.html) sensor uses that API to get all needed data. +The [Glances sensor](/components/sensor.glances/) sensor uses that API to get all needed data. In this post a default Fedora 22 Workstation installation is used on the host that should be monitored. In fact, it doesn't matter if the system is the local one or a remote one as long as Glances is available. With some adjustments it should work on your own systems too. The difference will be the package and the firewall management tools. First some extra packages are needed beside Glances, especially the [bottle](http://bottlepy.org/docs/dev/index.html) webserver. I guess that Glances is available for your distribution as well. Otherwise follow those [instructions](https://github.com/nicolargo/glances#installation). -``` -sudo dnf -y install glances python-bottle +```bash +$ sudo dnf -y install glances python-bottle ``` On Fedora the Firewall settings are strict. Let's open port 61208 to allow other hosts to connect to that port. This is not needed if you just want to observe your local machine. ```bash -sudo firewall-cmd --permanent --add-port=61208/tcp -sudo firewall-cmd --reload +$ sudo firewall-cmd --permanent --add-port=61208/tcp +$ sudo firewall-cmd --reload ``` Launch `glances` and keep an eye on the output. ```bash -glances -w +$ glances -w Glances web server started on http://0.0.0.0:61208/ ``` @@ -51,11 +51,11 @@ Now browse to http://IP_ADRRESS:61208/. You should see the webified view of Glan Another check is to access the API located at http://IP_ADRRESS:61208/api/2/mem/used and to confirm that a detail about your memory usage is provided as a JSON response. If so, you are good to proceed. ```bash -curl -X GET http://IP_ADDRESS:61208/api/2/mem/used +$ curl -X GET http://IP_ADDRESS:61208/api/2/mem/used {"used": 203943936} ``` -Add the [glances sensor](/components/sensor.glances.html) entry to your `configuration.yaml` file and restart Home Assistant then. +Add the [glances sensor](/components/sensor.glances/) entry to your `configuration.yaml` file and restart Home Assistant then. ```yaml # Example configuration.yaml entry diff --git a/source/_posts/2015-09-19-alarm-sonos-and-itunes-support.markdown b/source/_posts/2015-09-19-alarm-sonos-and-itunes-support.markdown index 462dc8f0812..0f5eaa51447 100644 --- a/source/_posts/2015-09-19-alarm-sonos-and-itunes-support.markdown +++ b/source/_posts/2015-09-19-alarm-sonos-and-itunes-support.markdown @@ -9,24 +9,17 @@ comments: true categories: release-notes --- -It's like someone opened a can of rock solid developers and emptied it above our -[chat channel](https://gitter.im/balloob/home-assistant) because it exploded with -great conversations and solid contributions. Featured in release 0.7.3: Sonos, iTunes, Alarm component and Automation upgrade. +It's like someone opened a can of rock solid developers and emptied it above our [chat channel](https://gitter.im/balloob/home-assistant) because it exploded with great conversations and solid contributions. Featured in release 0.7.3: Sonos, iTunes, Alarm component and Automation upgrade. See [GitHub](https://github.com/balloob/home-assistant/releases/tag/0.7.3) for more detailed release notes. _Migration note: the `scheduler` component has been removed in favor of the `automation` component._ -__Sonos__<br> -<img src='/images/supported_brands/sonos.png' style='border:none; box-shadow: none; float: right;' height='50' /> -Sonos support has been added by [@rhooper](https://github.com/rhooper) and [@SEJeff](https://github.com/SEJeff). Home Assistant is now able to automatically -detect Sonos devices in your network and set them up for you. It will allow you to control music -playing on your Sonos and change the volume. +__Sonos__ +<img src='/images/supported_brands/sonos.png' style='border:none; box-shadow: none; float: right;' height='50' /> Sonos support has been added by [@rhooper](https://github.com/rhooper) and [@SEJeff](https://github.com/SEJeff). Home Assistant is now able to automatically detect Sonos devices in your network and set them up for you. It will allow you to control music playing on your Sonos and change the volume. -__iTunes and airplay speakers__<br> -<img src='/images/supported_brands/itunes.png' style='border:none; box-shadow: none; float: right;' height='50' /> -[@maddox](https://github.com/maddox) has contributed support for controlling iTunes and airplay speakers. For this to work you will -have to run [itunes-api](https://github.com/maddox/itunes-api) on your Mac as middleware. +__iTunes and airplay speakers__ +<img src='/images/supported_brands/itunes.png' style='border:none; box-shadow: none; float: right;' height='50' /> [@maddox](https://github.com/maddox) has contributed support for controlling iTunes and airplay speakers. For this to work you will have to run [itunes-api](https://github.com/maddox/itunes-api) on your Mac as middleware. ```yaml # Example configuration.yaml entry @@ -39,10 +32,8 @@ media_player: <!--more--> -__Automation__<br> -Automation has gotten a lot of love. It now supports conditions, multiple triggers and new types of -triggers. The best to get started with it is to head over to the new -[getting started with automation](/getting-started/automation.html) page. +__Automation__ +Automation has gotten a lot of love. It now supports conditions, multiple triggers and new types of triggers. The best to get started with it is to head over to the new [getting started with automation](/getting-started/automation/) page. ```yaml # Example of entry in configuration.yaml @@ -67,7 +58,5 @@ automation: entity_id: group.living_room ``` -__Verisure Alarms__<br> -<img src='/images/supported_brands/verisure.png' style='border:none; box-shadow: none; float: right;' height='50' /> -We now support arming and disarming your verisure alarm from within Home Assistant thanks to added -support by [@persandstrom](https://github.com/persandstrom). +__Verisure Alarms__ +<img src='/images/supported_brands/verisure.png' style='border:none; box-shadow: none; float: right;' height='50' /> We now support arming and disarming your verisure alarm from within Home Assistant thanks to added support by [@persandstrom](https://github.com/persandstrom). diff --git a/source/_posts/2015-10-05-home-assistant-goes-geo-with-owntracks.markdown b/source/_posts/2015-10-05-home-assistant-goes-geo-with-owntracks.markdown index ba6f57cd781..e548fc3eff6 100644 --- a/source/_posts/2015-10-05-home-assistant-goes-geo-with-owntracks.markdown +++ b/source/_posts/2015-10-05-home-assistant-goes-geo-with-owntracks.markdown @@ -10,9 +10,7 @@ categories: release-notes og_image: /images/screenshots/map.png --- -A few weeks have past and it is time again for another release: version 0.7.4. This time we're very -glad to be able to introduce brand new integration with OwnTracks to allow tracking of people on a map. -The geo support consists of three different parts: +A few weeks have past and it is time again for another release: version 0.7.4. This time we're very glad to be able to introduce brand new integration with OwnTracks to allow tracking of people on a map. The geo support consists of three different parts: - [OwnTracks platform for the device tracker][platform-owntracks] to get locations for devices - Brand new [zone component][component-zone] to define zones to identify locations and [trigger automation][zone-automation] @@ -20,28 +18,27 @@ The geo support consists of three different parts: We have added a new [getting started section][start-presence] to get up and running. -[platform-owntracks]: /components/device_tracker.owntracks.html -[component-zone]: /components/zone.html -[zone-automation]: /components/automation.html#zone-trigger -[start-presence]: /getting-started/presence-detection.html +[platform-owntracks]: /components/device_tracker.owntracks/ +[component-zone]: /components/zone/ +[zone-automation]: /components/automation/#zone-trigger +[start-presence]: /getting-started/presence-detection/ <p class='img'> <img src='/images/screenshots/map.png' /> Map in Home Assistant showing two people and three zones (home, school, work) </p> -Ofcourse more things happened in the last three weeks. I'm moving away from my usual long post to a -short summary of highlights: +Ofcourse more things happened in the last three weeks. I'm moving away from my usual long post to a short summary of highlights: -<a href='/components/media_player.plex.html'> +<a href='/components/media_player.plex/'> <img src='/images/supported_brands/plex.png' style='border:none; box-shadow: none; float: right;' height='50' /> </a> - - Sensor: [rest platform](/components/sensor.rest.html) added ([@fabaff](https://github.com/fabaff)) - - Alarm Control Panel: [MQTT platform](/components/alarm_control_panel.mqtt.html) added ([@sfam](https://github.com/sfam)) - - Media Player: [Plex platform](/components/media_player.plex.html) added ([@miniconfig](https://github.com/miniconfig, [@adrienbrault](https://github.com/adrienbrault)) + - Sensor: [rest platform](/components/sensor.rest/) added ([@fabaff](https://github.com/fabaff)) + - Alarm Control Panel: [MQTT platform](/components/alarm_control_panel.mqtt/) added ([@sfam](https://github.com/sfam)) + - Media Player: [Plex platform](/components/media_player.plex/) added ([@miniconfig](https://github.com/miniconfig, [@adrienbrault](https://github.com/adrienbrault)) - Dev Tools: services can now show description of fields ([@balloob](https://github.com/balloob)) - MQTT: Support for certificates and improved error reporting ([@balloob](https://github.com/balloob)) - - Light: [limitlessled platform](/components/light.limitlessled.html) extended with white light support ([@auchter](https://github.com/auchter)) + - Light: [limitlessled platform](/components/light.limitlessled/) extended with white light support ([@auchter](https://github.com/auchter)) - Fuzzy matching for scenes ([@pavoni](https://github.com/pavoni)) - Scene support for media player ([@maddox](https://github.com/maddox)) diff --git a/source/_posts/2015-10-11-measure-temperature-with-esp8266-and-report-to-mqtt.markdown b/source/_posts/2015-10-11-measure-temperature-with-esp8266-and-report-to-mqtt.markdown index 64c7465ab34..f21c0145728 100644 --- a/source/_posts/2015-10-11-measure-temperature-with-esp8266-and-report-to-mqtt.markdown +++ b/source/_posts/2015-10-11-measure-temperature-with-esp8266-and-report-to-mqtt.markdown @@ -10,11 +10,11 @@ categories: how-to mqtt esp8266 og_image: /images/blog/2015-10-esp8266-temp/ha-sensor.png --- -I recently learned about the ESP8266, a $5 chip that includes WiFi and is Arduino compatible. This means -that all your DIY projects can now be done for a fraction of the price. +{::options coderay_line_numbers="table" /} -For this tutorial, I'll walk through how to get going with ESP8266, get the temperature and humidity and -report it to MQTT where Home Asssistant can pick it up. +I recently learned about the ESP8266, a $5 chip that includes WiFi and is Arduino compatible. This means that all your DIY projects can now be done for a fraction of the price. + +For this tutorial, I'll walk through how to get going with ESP8266, get the temperature and humidity and report it to MQTT where Home Asssistant can pick it up. <p class='img'> <img src='/images/blog/2015-10-esp8266-temp/setup.png' /> @@ -34,10 +34,9 @@ I've been using Adafruit for my shopping: - [Adafruit HUZZAH ESP8266 Breakout](http://www.adafruit.com/product/2471) ([assembly instructions](https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/assembly)) - [Adafruit HDC1008 Temperature & Humidity Sensor Breakout Board](http://www.adafruit.com/product/2635) ([assembly instructions](https://learn.adafruit.com/adafruit-hdc1008-temperature-and-humidity-sensor-breakout/assembly)) - - [MQTT server](/components/mqtt.html#picking-a-broker) + - [MQTT server](/components/mqtt/#picking-a-broker) -_Besides this, you will need the usual hardware prototype equipment: a breadboard, some wires, -soldering iron + wire, Serial USB cable._ +_Besides this, you will need the usual hardware prototype equipment: a breadboard, some wires, soldering iron + wire, Serial USB cable._ ### Connections @@ -54,11 +53,9 @@ _I picked `#2` and `14` myself, you can configure them in the sketch._ ### Preparing your IDE -Follow [these instructions](https://github.com/esp8266/Arduino#installing-with-boards-manager) on how -to install and prepare the Arduino IDE for ESP8266 development. +Follow [these instructions](https://github.com/esp8266/Arduino#installing-with-boards-manager) on how to install and prepare the Arduino IDE for ESP8266 development. -After you're done installing, open the Arduino IDE, in the menu click on `sketch` -> `include library` -> -`manage libraries` and install the following libraries: +After you're done installing, open the Arduino IDE, in the menu click on `sketch` -> `include library` -> `manage libraries` and install the following libraries: - PubSubClient by Nick 'O Leary - Adafruit HDC1000 @@ -71,16 +68,11 @@ If you have followed the previous steps, you're all set. - Copy and paste the below sketch to the Arduino IDE - Adjust the values line 6 - 14 to match your setup - Optional: If you want to connect to an MQTT server without a username or password, adjust line 63. - - To have the ESP8266 accept our new sketch, we have to put it in upload mode. On the ESP8266 device - keep the GPIO0 button pressed while pressing the reset button. The red led will glow half bright to - indicate it is in upload mode. + - To have the ESP8266 accept our new sketch, we have to put it in upload mode. On the ESP8266 device keep the GPIO0 button pressed while pressing the reset button. The red led will glow half bright to indicate it is in upload mode. - Press the upload button in Arduino IDE - Open the serial monitor (`Tools` -> `Serial Monitor`) to see the output from your device -This sketch will connect to your WiFi network and MQTT broker. It will read the temperature and humidity -from the sensor every second. It will report it to the MQTT server if the difference is > 1 since last -reported value. Reports to the MQTT broker are sent with retain set to `True`. This means that anyone -connecting to the MQTT topic will automatically be notified of the last reported value. +This sketch will connect to your WiFi network and MQTT broker. It will read the temperature and humidity from the sensor every second. It will report it to the MQTT server if the difference is > 1 since last reported value. Reports to the MQTT broker are sent with retain set to `True`. This means that anyone connecting to the MQTT topic will automatically be notified of the last reported value. ```cpp #include <ESP8266WiFi.h> @@ -196,8 +188,7 @@ void loop() { ### Configuring Home Assistant -The last step is to integrate the sensor values into Home Assistant. This can be done by setting up -Home Assistant to connect to the MQTT broker and subscribe to the sensor topics. +The last step is to integrate the sensor values into Home Assistant. This can be done by setting up Home Assistant to connect to the MQTT broker and subscribe to the sensor topics. ```yaml mqtt: diff --git a/source/_posts/2015-10-11-rfxtrx-blinkstick-and-snmp-support.markdown b/source/_posts/2015-10-11-rfxtrx-blinkstick-and-snmp-support.markdown index 9e0365b0697..63b445ea210 100644 --- a/source/_posts/2015-10-11-rfxtrx-blinkstick-and-snmp-support.markdown +++ b/source/_posts/2015-10-11-rfxtrx-blinkstick-and-snmp-support.markdown @@ -16,15 +16,12 @@ We discovered two issues annoying enough to warrent the release of 0.7.5: This release also includes some new platforms (because they keep coming!): -<img src='/images/supported_brands/blinkstick.png' style='border:none; box-shadow: none; float: right;' height='50' /> -<img src='/images/supported_brands/rfxtrx.png' style='border:none; box-shadow: none; float: right; clear: right;' height='50' /> -<img src='/images/supported_brands/telegram.png' style='border:none; box-shadow: none; float: right; clear: right;' height='50' /> +<img src='/images/supported_brands/blinkstick.png' style='border:none; box-shadow: none; float: right;' height='50' /><img src='/images/supported_brands/rfxtrx.png' style='border:none; box-shadow: none; float: right; clear: right;' height='50' /><img src='/images/supported_brands/telegram.png' style='border:none; box-shadow: none; float: right; clear: right;' height='50' /> - - Light: [blinkstick platform](/components/light.blinksticklight.html) added ([@alanbowman](https://github.com/alanbowman)) - - Device Tracker: [SNMP platform](/components/device_tracker.snmp.html) added ([@tomduijf](https://github.com/tomduijf)) - - Light: [rfxtrx platform](/components/light.rfxtrx.html) added ([@badele](https://github.com/badele)) - - Switch: [rfxtrx platform](/components/switch.rfxtrx.html) added ([@badele](https://github.com/badele)) - - Notify: [telegram platform](/components/notify.telegram.html) added ([@fabaff](https://github.com/fabaff)) + - Light: [blinkstick platform](/components/light.blinksticklight/) added ([@alanbowman](https://github.com/alanbowman)) + - Device Tracker: [SNMP platform](/components/device_tracker.snmp/) added ([@tomduijf](https://github.com/tomduijf)) + - Light: [rfxtrx platform](/components/light.rfxtrx/) added ([@badele](https://github.com/badele)) + - Switch: [rfxtrx platform](/components/switch.rfxtrx/) added ([@badele](https://github.com/badele)) + - Notify: [telegram platform](/components/notify.telegram/) added ([@fabaff](https://github.com/fabaff)) -Also, the media player was extended by [@maddox](https://github.com/maddox) to support the play media command. -This has been implemented for the [iTunes platform](/components/media_player.itunes.html). +Also, the media player was extended by [@maddox](https://github.com/maddox) to support the play media command. This has been implemented for the [iTunes platform](/components/media_player.itunes/). diff --git a/source/_posts/2015-10-26-firetv-and-radiotherm-now-supported.markdown b/source/_posts/2015-10-26-firetv-and-radiotherm-now-supported.markdown index efc86bbfb18..e9689665cf6 100644 --- a/source/_posts/2015-10-26-firetv-and-radiotherm-now-supported.markdown +++ b/source/_posts/2015-10-26-firetv-and-radiotherm-now-supported.markdown @@ -9,34 +9,28 @@ comments: true categories: release-notes --- -After two weeks of hard work I'm proud to announce the release of Home Assistant v0.7.6. For this release the main -focus was bugs, test coverage and documentation. And we exceeded expectations on all three fronts. Bugs have been -squashed, [test coverage increased to 85%](https://coveralls.io/builds/3946399) and thanks to the hard work by -[@fabaff](https://github.com/fabaff) and myself the [component section](/components/) on the website has gotten a -complete revamp. +After two weeks of hard work I'm proud to announce the release of Home Assistant v0.7.6. For this release the main focus was bugs, test coverage and documentation. And we exceeded expectations on all three fronts. Bugs have been squashed, [test coverage increased to 85%](https://coveralls.io/builds/3946399) and thanks to the hard work by [@fabaff](https://github.com/fabaff) and myself the [component section](/components/) on the website has gotten a complete revamp. #### Changes -<img src='/images/supported_brands/radiotherm.png' style='border:none; box-shadow: none; float: right; margin-bottom: 16px;' height='50' /> -<img src='/images/supported_brands/firetv.png' style='border:none; box-shadow: none; float: right; margin-bottom: 16px; clear: right;' height='50' /> -<img src='/images/supported_brands/geofancy.png' style='border:none; box-shadow: none; float: right; margin-bottom: 16px; clear: right;' height='50' /> +<img src='/images/supported_brands/radiotherm.png' style='border:none; box-shadow: none; float: right; margin-bottom: 16px;' height='50' /><img src='/images/supported_brands/firetv.png' style='border:none; box-shadow: none; float: right; margin-bottom: 16px; clear: right;' height='50' /><img src='/images/supported_brands/geofancy.png' style='border:none; box-shadow: none; float: right; margin-bottom: 16px; clear: right;' height='50' /> - - Device tracker: Newer [TP-Link routers](/components/device_tracker.tplink.html) now supported ([@mKeRix](https://github.com/mKeRix)) - - Alarm Control Panel: [Manual alarm](/components/alarm_control_panel.manual.html) added ([@sfam](https://github.com/sfam)) - - Thermostat: [Radiotherm](/components/thermostat.radiotherm.html) now supported ([@toddeye](https://github.com/toddeye)) - - Media Player: [Amazon FireTV](/components/media_player.firetv.html) now supported ([@happyleavesaoc](https://github.com/happyleavesaoc)) - - Device Tracker: [Geofancy](/components/device_tracker.geofancy.html) now supported ([@wind-rider](https://github.com/wind-rider)) - - New component [Shell Command](/components/shell_command.html) can expose shell commands as services ([@balloob](https://github.com/balloob)) - - [Scripts](/components/script.html) can now be customized using `customize` key in `configuration.yaml` ([@balloob](https://github.com/balloob)) - - Light: [Hyperion](/components/light.hyperion.html) now supported ([@MakeMeASandwich](https://github.com/MakeMeASandwich)) - - Sensor: [aRest](/components/sensor.arest.html) can now also read out pins ([@balloob](https://github.com/balloob)) - - Sensor: [Forecast.io](/components/sensor.forecast.html) now supports specifying units in `configuration.yaml` ([@balloob](https://github.com/balloob)) - - Thermostat: [Heat Control](/components/thermostat.heat_control.html) has been completely rewritten ([@balloob](https://github.com/balloob)) - - Switch: [Rest](/components/switch.rest.html) now supported ([@bachp](https://github.com/bachp)) - - Media Player: [Plex](/components/media_player.plex.html) can now be auto discovered and configure itself ([@tomduijf](https://github.com/tomduijf)) - - [Downloader](/components/downloader.html) will now treat relative paths based on config dir ([@tomduijf](https://github.com/tomduijf)) + - Device tracker: Newer [TP-Link routers](/components/device_tracker.tplink/) now supported ([@mKeRix](https://github.com/mKeRix)) + - Alarm Control Panel: [Manual alarm](/components/alarm_control_panel.manual/) added ([@sfam](https://github.com/sfam)) + - Thermostat: [Radiotherm](/components/thermostat.radiotherm/) now supported ([@toddeye](https://github.com/toddeye)) + - Media Player: [Amazon FireTV](/components/media_player.firetv/) now supported ([@happyleavesaoc](https://github.com/happyleavesaoc)) + - Device Tracker: [Geofancy](/components/device_tracker.geofancy/) now supported ([@wind-rider](https://github.com/wind-rider)) + - New component [Shell Command](/components/shell_command/) can expose shell commands as services ([@balloob](https://github.com/balloob)) + - [Scripts](/components/script/) can now be customized using `customize` key in `configuration.yaml` ([@balloob](https://github.com/balloob)) + - Light: [Hyperion](/components/light.hyperion/) now supported ([@MakeMeASandwich](https://github.com/MakeMeASandwich)) + - Sensor: [aRest](/components/sensor.arest/) can now also read out pins ([@balloob](https://github.com/balloob)) + - Sensor: [Forecast.io](/components/sensor.forecast/) now supports specifying units in `configuration.yaml` ([@balloob](https://github.com/balloob)) + - Thermostat: [Heat Control](/components/thermostat.heat_control/) has been completely rewritten ([@balloob](https://github.com/balloob)) + - Switch: [Rest](/components/switch.rest/) now supported ([@bachp](https://github.com/bachp)) + - Media Player: [Plex](/components/media_player.plex/) can now be auto discovered and configure itself ([@tomduijf](https://github.com/tomduijf)) + - [Downloader](/components/downloader/) will now treat relative paths based on config dir ([@tomduijf](https://github.com/tomduijf)) - Line Charts will use interpolation for sensor data and show current and target temperature for thermostats ([@balloob](https://github.com/balloob)) - - Device Tracker: [OpenWRT via ubus](/components/device_tracker.ubus.html) now supported ([@krzynio](https://github.com/krzynio)) + - Device Tracker: [OpenWRT via ubus](/components/device_tracker.ubus/) now supported ([@krzynio](https://github.com/krzynio)) <!--more--> @@ -44,17 +38,14 @@ complete revamp. As part of this release we did some cleanup which introduced backwards incompatible changes: -**Heat Control thermostat no longer includes scheduling features.**<br> -This feature has been removed completely. Use the [automation component](/components/automation.html) -instead to control target temperature. +**Heat Control thermostat no longer includes scheduling features.** +This feature has been removed completely. Use the [automation component](/components/automation/) instead to control target temperature. -**Config changed for calling a service from a script.**<br> -`execute_service:` has been replaced with `service:`. See [component page](/components/script.html) -for example. The old method will continue working for some time. +**Config changed for calling a service from a script.** +`execute_service:` has been replaced with `service:`. See [component page](/components/script/) for example. The old method will continue working for some time. -**Scenes can no longer be turned off.**<br> -It is no longer possible to turn a scene off after it has been activated. The way it worked was unpredictable -and causes a lot of confusion. +**Scenes can no longer be turned off.** +It is no longer possible to turn a scene off after it has been activated. The way it worked was unpredictable and causes a lot of confusion. -**Downloader treats relative paths now relative to the config dir instead of the current working dir.**<br> +**Downloader treats relative paths now relative to the config dir instead of the current working dir.** This makes more sense as most people run Home Assistant as a daemon diff --git a/source/atom.xml b/source/atom.xml index a4dba4f7634..609917eacd6 100644 --- a/source/atom.xml +++ b/source/atom.xml @@ -20,7 +20,7 @@ <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> + <content type="html"><![CDATA[{{ post.content | full_urls | cdata_escape }}]]></content> </entry> {% endfor %} </feed> diff --git a/source/blog/index.html b/source/blog/index.html index f79819923c1..54135face8f 100644 --- a/source/blog/index.html +++ b/source/blog/index.html @@ -1,10 +1,10 @@ --- layout: default sidebar: false +regenerate: true --- {% assign index = true %} {% for post in paginator.posts %} - {% assign content = post.content %} <article class="listing"> {% include blog/post/article.html %} </article> diff --git a/source/components/alarm_control_panel.html b/source/components/alarm_control_panel.html new file mode 100644 index 00000000000..4e7dc92e58f --- /dev/null +++ b/source/components/alarm_control_panel.html @@ -0,0 +1 @@ +<script>document.location = '/components/alarm_control_panel/';</script> \ No newline at end of file diff --git a/source/components/alarm_control_panel.manual.html b/source/components/alarm_control_panel.manual.html new file mode 100644 index 00000000000..8004e0bfb9b --- /dev/null +++ b/source/components/alarm_control_panel.manual.html @@ -0,0 +1 @@ +<script>document.location = '/components/alarm_control_panel.manual/';</script> \ No newline at end of file diff --git a/source/components/alarm_control_panel.mqtt.html b/source/components/alarm_control_panel.mqtt.html new file mode 100644 index 00000000000..5976b13cfcd --- /dev/null +++ b/source/components/alarm_control_panel.mqtt.html @@ -0,0 +1 @@ +<script>document.location = '/components/alarm_control_panel.mqtt/';</script> \ No newline at end of file diff --git a/source/components/arduino.html b/source/components/arduino.html new file mode 100644 index 00000000000..40dd799bd30 --- /dev/null +++ b/source/components/arduino.html @@ -0,0 +1 @@ +<script>document.location = '/components/arduino/';</script> \ No newline at end of file diff --git a/source/components/automation.html b/source/components/automation.html new file mode 100644 index 00000000000..5dd0835d22b --- /dev/null +++ b/source/components/automation.html @@ -0,0 +1 @@ +<script>document.location = '/components/automation/';</script> \ No newline at end of file diff --git a/source/components/browser.html b/source/components/browser.html new file mode 100644 index 00000000000..d3b874252cc --- /dev/null +++ b/source/components/browser.html @@ -0,0 +1 @@ +<script>document.location = '/components/browser/';</script> \ No newline at end of file diff --git a/source/components/camera.foscam.html b/source/components/camera.foscam.html new file mode 100644 index 00000000000..2de57153b01 --- /dev/null +++ b/source/components/camera.foscam.html @@ -0,0 +1 @@ +<script>document.location = '/components/camera.foscam/';</script> \ No newline at end of file diff --git a/source/components/camera.generic.html b/source/components/camera.generic.html new file mode 100644 index 00000000000..875741f0a0b --- /dev/null +++ b/source/components/camera.generic.html @@ -0,0 +1 @@ +<script>document.location = '/components/camera.generic/';</script> \ No newline at end of file diff --git a/source/components/configurator.html b/source/components/configurator.html new file mode 100644 index 00000000000..d1704d31e6a --- /dev/null +++ b/source/components/configurator.html @@ -0,0 +1 @@ +<script>document.location = '/components/configurator/';</script> \ No newline at end of file diff --git a/source/components/conversation.html b/source/components/conversation.html new file mode 100644 index 00000000000..6944176f8e4 --- /dev/null +++ b/source/components/conversation.html @@ -0,0 +1 @@ +<script>document.location = '/components/conversation/';</script> \ No newline at end of file diff --git a/source/components/device_sun_light_trigger.html b/source/components/device_sun_light_trigger.html new file mode 100644 index 00000000000..3f3f4e1c31f --- /dev/null +++ b/source/components/device_sun_light_trigger.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_sun_light_trigger/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.actiontec.html b/source/components/device_tracker.actiontec.html new file mode 100644 index 00000000000..7030a66d9fa --- /dev/null +++ b/source/components/device_tracker.actiontec.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.actiontec/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.aruba.html b/source/components/device_tracker.aruba.html new file mode 100644 index 00000000000..e24d79d3349 --- /dev/null +++ b/source/components/device_tracker.aruba.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.aruba/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.asuswrt.html b/source/components/device_tracker.asuswrt.html new file mode 100644 index 00000000000..1e6f981b5fd --- /dev/null +++ b/source/components/device_tracker.asuswrt.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.asuswrt/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.ddwrt.html b/source/components/device_tracker.ddwrt.html new file mode 100644 index 00000000000..df751ed8a0f --- /dev/null +++ b/source/components/device_tracker.ddwrt.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.ddwrt/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.geofancy.html b/source/components/device_tracker.geofancy.html new file mode 100644 index 00000000000..5ed570461b4 --- /dev/null +++ b/source/components/device_tracker.geofancy.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.geofancy/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.html b/source/components/device_tracker.html new file mode 100644 index 00000000000..e4cdb1106b2 --- /dev/null +++ b/source/components/device_tracker.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.luci.html b/source/components/device_tracker.luci.html new file mode 100644 index 00000000000..93e141733e0 --- /dev/null +++ b/source/components/device_tracker.luci.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.luci/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.mqtt.html b/source/components/device_tracker.mqtt.html new file mode 100644 index 00000000000..f8ac14d2c5f --- /dev/null +++ b/source/components/device_tracker.mqtt.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.mqtt/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.netgear.html b/source/components/device_tracker.netgear.html new file mode 100644 index 00000000000..73e5cd16cbe --- /dev/null +++ b/source/components/device_tracker.netgear.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.netgear/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.nmap_scanner.html b/source/components/device_tracker.nmap_scanner.html new file mode 100644 index 00000000000..d381123cd47 --- /dev/null +++ b/source/components/device_tracker.nmap_scanner.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.nmap_scanner/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.owntracks.html b/source/components/device_tracker.owntracks.html new file mode 100644 index 00000000000..41e6bb181a8 --- /dev/null +++ b/source/components/device_tracker.owntracks.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.owntracks/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.snmp.html b/source/components/device_tracker.snmp.html new file mode 100644 index 00000000000..2da50fb435d --- /dev/null +++ b/source/components/device_tracker.snmp.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.snmp/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.thomson.html b/source/components/device_tracker.thomson.html new file mode 100644 index 00000000000..3c24a5c2a21 --- /dev/null +++ b/source/components/device_tracker.thomson.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.thomson/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.tomato.html b/source/components/device_tracker.tomato.html new file mode 100644 index 00000000000..09ba8d7de27 --- /dev/null +++ b/source/components/device_tracker.tomato.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.tomato/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.tplink.html b/source/components/device_tracker.tplink.html new file mode 100644 index 00000000000..450eec195f2 --- /dev/null +++ b/source/components/device_tracker.tplink.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.tplink/';</script> \ No newline at end of file diff --git a/source/components/device_tracker.ubus.html b/source/components/device_tracker.ubus.html new file mode 100644 index 00000000000..ed9ff326bcd --- /dev/null +++ b/source/components/device_tracker.ubus.html @@ -0,0 +1 @@ +<script>document.location = '/components/device_tracker.ubus/';</script> \ No newline at end of file diff --git a/source/components/discovery.html b/source/components/discovery.html new file mode 100644 index 00000000000..dc1cfc60fbb --- /dev/null +++ b/source/components/discovery.html @@ -0,0 +1 @@ +<script>document.location = '/components/discovery/';</script> \ No newline at end of file diff --git a/source/components/downloader.html b/source/components/downloader.html new file mode 100644 index 00000000000..003f668dab7 --- /dev/null +++ b/source/components/downloader.html @@ -0,0 +1 @@ +<script>document.location = '/components/downloader/';</script> \ No newline at end of file diff --git a/source/components/group.html b/source/components/group.html new file mode 100644 index 00000000000..dd6801acdc5 --- /dev/null +++ b/source/components/group.html @@ -0,0 +1 @@ +<script>document.location = '/components/group/';</script> \ No newline at end of file diff --git a/source/components/history.html b/source/components/history.html new file mode 100644 index 00000000000..6260c6f7e6c --- /dev/null +++ b/source/components/history.html @@ -0,0 +1 @@ +<script>document.location = '/components/history/';</script> \ No newline at end of file diff --git a/source/components/ifttt.html b/source/components/ifttt.html new file mode 100644 index 00000000000..f59360d4bad --- /dev/null +++ b/source/components/ifttt.html @@ -0,0 +1 @@ +<script>document.location = '/components/ifttt/';</script> \ No newline at end of file diff --git a/source/components/ifttt.manything.html b/source/components/ifttt.manything.html new file mode 100644 index 00000000000..d0a4c9113e9 --- /dev/null +++ b/source/components/ifttt.manything.html @@ -0,0 +1 @@ +<script>document.location = '/components/ifttt.manything/';</script> \ No newline at end of file diff --git a/source/components/index.html b/source/components/index.html index a0f4b9d1c4d..14f582cd103 100644 --- a/source/components/index.html +++ b/source/components/index.html @@ -9,6 +9,7 @@ sharing: true footer: true is_homepage: true body_id: components-page +regenerate: true --- <p class='note'> @@ -16,21 +17,15 @@ Support for these components is provided by the Home Assistant community. </p> {% assign components = site.components | sort: 'title' %} -{% assign categories = components | sort: 'ha_category' | map: 'ha_category' %} +{% assign categories = components | sort: 'ha_category' | map: 'ha_category' | uniq %} <div class="filter-button-group"> <a href='#all' class="btn">All</a> <a href='#featured' class="btn">Featured</a> - {% comment %} Jekyll 2.5.2 does not support the uniq filter :/ {% endcomment %} - {% assign category_printed = '' %} - {% for category in categories %} {% if category and category != 'Other' %} - {% unless category_printed contains category %} - <a href='#{{ category | slugify }}' class="btn">{{ category }}</a> - {% assign category_printed = category_printed | append: ',' | append: category %} - {% endunless %} + <a href='#{{ category | slugify }}' class="btn">{{ category }}</a> {% endif %} {% endfor %} diff --git a/source/components/introduction.html b/source/components/introduction.html new file mode 100644 index 00000000000..4df7fb518df --- /dev/null +++ b/source/components/introduction.html @@ -0,0 +1 @@ +<script>document.location = '/components/introduction/';</script> \ No newline at end of file diff --git a/source/components/isy994.html b/source/components/isy994.html new file mode 100644 index 00000000000..bd5f2f5864b --- /dev/null +++ b/source/components/isy994.html @@ -0,0 +1 @@ +<script>document.location = '/components/isy994/';</script> \ No newline at end of file diff --git a/source/components/keyboard.html b/source/components/keyboard.html new file mode 100644 index 00000000000..b7ab22364e4 --- /dev/null +++ b/source/components/keyboard.html @@ -0,0 +1 @@ +<script>document.location = '/components/keyboard/';</script> \ No newline at end of file diff --git a/source/components/light.blinksticklight.html b/source/components/light.blinksticklight.html new file mode 100644 index 00000000000..06435b48bc8 --- /dev/null +++ b/source/components/light.blinksticklight.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.blinksticklight/';</script> \ No newline at end of file diff --git a/source/components/light.html b/source/components/light.html new file mode 100644 index 00000000000..b5b129b5434 --- /dev/null +++ b/source/components/light.html @@ -0,0 +1 @@ +<script>document.location = '/components/light/';</script> \ No newline at end of file diff --git a/source/components/light.hue.html b/source/components/light.hue.html new file mode 100644 index 00000000000..028862a4902 --- /dev/null +++ b/source/components/light.hue.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.hue/';</script> \ No newline at end of file diff --git a/source/components/light.hyperion.html b/source/components/light.hyperion.html new file mode 100644 index 00000000000..58c2c77e889 --- /dev/null +++ b/source/components/light.hyperion.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.hyperion/';</script> \ No newline at end of file diff --git a/source/components/light.limitlessled.html b/source/components/light.limitlessled.html new file mode 100644 index 00000000000..bea5a788187 --- /dev/null +++ b/source/components/light.limitlessled.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.limitlessled/';</script> \ No newline at end of file diff --git a/source/components/light.rfxtrx.html b/source/components/light.rfxtrx.html new file mode 100644 index 00000000000..b8d3d251f82 --- /dev/null +++ b/source/components/light.rfxtrx.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.rfxtrx/';</script> \ No newline at end of file diff --git a/source/components/light.tellstick.html b/source/components/light.tellstick.html new file mode 100644 index 00000000000..0a29b01a912 --- /dev/null +++ b/source/components/light.tellstick.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.tellstick/';</script> \ No newline at end of file diff --git a/source/components/light.vera.html b/source/components/light.vera.html new file mode 100644 index 00000000000..d118fa95095 --- /dev/null +++ b/source/components/light.vera.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.vera/';</script> \ No newline at end of file diff --git a/source/components/light.wink.html b/source/components/light.wink.html new file mode 100644 index 00000000000..3f890657bd7 --- /dev/null +++ b/source/components/light.wink.html @@ -0,0 +1 @@ +<script>document.location = '/components/light.wink/';</script> \ No newline at end of file diff --git a/source/components/logbook.html b/source/components/logbook.html new file mode 100644 index 00000000000..93feb93edf2 --- /dev/null +++ b/source/components/logbook.html @@ -0,0 +1 @@ +<script>document.location = '/components/logbook/';</script> \ No newline at end of file diff --git a/source/components/media_player.cast.html b/source/components/media_player.cast.html new file mode 100644 index 00000000000..06d1f5579b6 --- /dev/null +++ b/source/components/media_player.cast.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.cast/';</script> \ No newline at end of file diff --git a/source/components/media_player.denon.html b/source/components/media_player.denon.html new file mode 100644 index 00000000000..8438c61e47c --- /dev/null +++ b/source/components/media_player.denon.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.denon/';</script> \ No newline at end of file diff --git a/source/components/media_player.firetv.html b/source/components/media_player.firetv.html new file mode 100644 index 00000000000..401cbfacd6e --- /dev/null +++ b/source/components/media_player.firetv.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.firetv/';</script> \ No newline at end of file diff --git a/source/components/media_player.html b/source/components/media_player.html new file mode 100644 index 00000000000..1e8607f60ba --- /dev/null +++ b/source/components/media_player.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player/';</script> \ No newline at end of file diff --git a/source/components/media_player.itunes.html b/source/components/media_player.itunes.html new file mode 100644 index 00000000000..c9968cf30c7 --- /dev/null +++ b/source/components/media_player.itunes.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.itunes/';</script> \ No newline at end of file diff --git a/source/components/media_player.kodi.html b/source/components/media_player.kodi.html new file mode 100644 index 00000000000..4856a83db58 --- /dev/null +++ b/source/components/media_player.kodi.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.kodi/';</script> \ No newline at end of file diff --git a/source/components/media_player.mpd.html b/source/components/media_player.mpd.html new file mode 100644 index 00000000000..b710b11d672 --- /dev/null +++ b/source/components/media_player.mpd.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.mpd/';</script> \ No newline at end of file diff --git a/source/components/media_player.plex.html b/source/components/media_player.plex.html new file mode 100644 index 00000000000..8a022c23c8d --- /dev/null +++ b/source/components/media_player.plex.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.plex/';</script> \ No newline at end of file diff --git a/source/components/media_player.sonos.html b/source/components/media_player.sonos.html new file mode 100644 index 00000000000..e0a4f6dfc81 --- /dev/null +++ b/source/components/media_player.sonos.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.sonos/';</script> \ No newline at end of file diff --git a/source/components/media_player.squeezebox.html b/source/components/media_player.squeezebox.html new file mode 100644 index 00000000000..54460b611c2 --- /dev/null +++ b/source/components/media_player.squeezebox.html @@ -0,0 +1 @@ +<script>document.location = '/components/media_player.squeezebox/';</script> \ No newline at end of file diff --git a/source/components/modbus.html b/source/components/modbus.html new file mode 100644 index 00000000000..47252f00ef6 --- /dev/null +++ b/source/components/modbus.html @@ -0,0 +1 @@ +<script>document.location = '/components/modbus/';</script> \ No newline at end of file diff --git a/source/components/mqtt.html b/source/components/mqtt.html new file mode 100644 index 00000000000..e1810ea29d3 --- /dev/null +++ b/source/components/mqtt.html @@ -0,0 +1 @@ +<script>document.location = '/components/mqtt/';</script> \ No newline at end of file diff --git a/source/components/notify.file.html b/source/components/notify.file.html new file mode 100644 index 00000000000..ca6051ce256 --- /dev/null +++ b/source/components/notify.file.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.file/';</script> \ No newline at end of file diff --git a/source/components/notify.html b/source/components/notify.html new file mode 100644 index 00000000000..7843fe7cc26 --- /dev/null +++ b/source/components/notify.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify/';</script> \ No newline at end of file diff --git a/source/components/notify.instapush.html b/source/components/notify.instapush.html new file mode 100644 index 00000000000..3a564797231 --- /dev/null +++ b/source/components/notify.instapush.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.instapush/';</script> \ No newline at end of file diff --git a/source/components/notify.nma.html b/source/components/notify.nma.html new file mode 100644 index 00000000000..ae2fa842178 --- /dev/null +++ b/source/components/notify.nma.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.nma/';</script> \ No newline at end of file diff --git a/source/components/notify.pushbullet.html b/source/components/notify.pushbullet.html new file mode 100644 index 00000000000..562cab8d3e8 --- /dev/null +++ b/source/components/notify.pushbullet.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.pushbullet/';</script> \ No newline at end of file diff --git a/source/components/notify.pushover.html b/source/components/notify.pushover.html new file mode 100644 index 00000000000..32576002dcd --- /dev/null +++ b/source/components/notify.pushover.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.pushover/';</script> \ No newline at end of file diff --git a/source/components/notify.slack.html b/source/components/notify.slack.html new file mode 100644 index 00000000000..64fa3f78d9f --- /dev/null +++ b/source/components/notify.slack.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.slack/';</script> \ No newline at end of file diff --git a/source/components/notify.smtp.html b/source/components/notify.smtp.html new file mode 100644 index 00000000000..cfe9ab64a8a --- /dev/null +++ b/source/components/notify.smtp.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.smtp/';</script> \ No newline at end of file diff --git a/source/components/notify.syslog.html b/source/components/notify.syslog.html new file mode 100644 index 00000000000..bc7bea3cd92 --- /dev/null +++ b/source/components/notify.syslog.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.syslog/';</script> \ No newline at end of file diff --git a/source/components/notify.telegram.html b/source/components/notify.telegram.html new file mode 100644 index 00000000000..6edebc6a47a --- /dev/null +++ b/source/components/notify.telegram.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.telegram/';</script> \ No newline at end of file diff --git a/source/components/notify.xmpp.html b/source/components/notify.xmpp.html new file mode 100644 index 00000000000..ec0b681c0ee --- /dev/null +++ b/source/components/notify.xmpp.html @@ -0,0 +1 @@ +<script>document.location = '/components/notify.xmpp/';</script> \ No newline at end of file diff --git a/source/components/rfxtrx.html b/source/components/rfxtrx.html new file mode 100644 index 00000000000..27649f404bb --- /dev/null +++ b/source/components/rfxtrx.html @@ -0,0 +1 @@ +<script>document.location = '/components/rfxtrx/';</script> \ No newline at end of file diff --git a/source/components/scene.html b/source/components/scene.html new file mode 100644 index 00000000000..cc55e69a708 --- /dev/null +++ b/source/components/scene.html @@ -0,0 +1 @@ +<script>document.location = '/components/scene/';</script> \ No newline at end of file diff --git a/source/components/script.html b/source/components/script.html new file mode 100644 index 00000000000..e2959557e40 --- /dev/null +++ b/source/components/script.html @@ -0,0 +1 @@ +<script>document.location = '/components/script/';</script> \ No newline at end of file diff --git a/source/components/sensor.arduino.html b/source/components/sensor.arduino.html new file mode 100644 index 00000000000..508b41e5afa --- /dev/null +++ b/source/components/sensor.arduino.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.arduino/';</script> \ No newline at end of file diff --git a/source/components/sensor.arest.html b/source/components/sensor.arest.html new file mode 100644 index 00000000000..37ad8a77395 --- /dev/null +++ b/source/components/sensor.arest.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.arest/';</script> \ No newline at end of file diff --git a/source/components/sensor.bitcoin.html b/source/components/sensor.bitcoin.html new file mode 100644 index 00000000000..fd95c8d672d --- /dev/null +++ b/source/components/sensor.bitcoin.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.bitcoin/';</script> \ No newline at end of file diff --git a/source/components/sensor.command_sensor.html b/source/components/sensor.command_sensor.html new file mode 100644 index 00000000000..2f09f465328 --- /dev/null +++ b/source/components/sensor.command_sensor.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.command_sensor/';</script> \ No newline at end of file diff --git a/source/components/sensor.cpuspeed.html b/source/components/sensor.cpuspeed.html new file mode 100644 index 00000000000..97a219dee2b --- /dev/null +++ b/source/components/sensor.cpuspeed.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.cpuspeed/';</script> \ No newline at end of file diff --git a/source/components/sensor.dht.html b/source/components/sensor.dht.html new file mode 100644 index 00000000000..d178cb06431 --- /dev/null +++ b/source/components/sensor.dht.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.dht/';</script> \ No newline at end of file diff --git a/source/components/sensor.efergy.html b/source/components/sensor.efergy.html new file mode 100644 index 00000000000..92015d90f3b --- /dev/null +++ b/source/components/sensor.efergy.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.efergy/';</script> \ No newline at end of file diff --git a/source/components/sensor.forecast.html b/source/components/sensor.forecast.html new file mode 100644 index 00000000000..67059145c61 --- /dev/null +++ b/source/components/sensor.forecast.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.forecast/';</script> \ No newline at end of file diff --git a/source/components/sensor.glances.html b/source/components/sensor.glances.html new file mode 100644 index 00000000000..7082e33f2ff --- /dev/null +++ b/source/components/sensor.glances.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.glances/';</script> \ No newline at end of file diff --git a/source/components/sensor.html b/source/components/sensor.html new file mode 100644 index 00000000000..33a2e554cc3 --- /dev/null +++ b/source/components/sensor.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor/';</script> \ No newline at end of file diff --git a/source/components/sensor.modbus.html b/source/components/sensor.modbus.html new file mode 100644 index 00000000000..13cb5f75f4f --- /dev/null +++ b/source/components/sensor.modbus.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.modbus/';</script> \ No newline at end of file diff --git a/source/components/sensor.mqtt.html b/source/components/sensor.mqtt.html new file mode 100644 index 00000000000..7f1bd2795ef --- /dev/null +++ b/source/components/sensor.mqtt.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.mqtt/';</script> \ No newline at end of file diff --git a/source/components/sensor.mysensors.html b/source/components/sensor.mysensors.html new file mode 100644 index 00000000000..00c1cfbe815 --- /dev/null +++ b/source/components/sensor.mysensors.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.mysensors/';</script> \ No newline at end of file diff --git a/source/components/sensor.openweathermap.html b/source/components/sensor.openweathermap.html new file mode 100644 index 00000000000..4d74f06e1d7 --- /dev/null +++ b/source/components/sensor.openweathermap.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.openweathermap/';</script> \ No newline at end of file diff --git a/source/components/sensor.rest.html b/source/components/sensor.rest.html new file mode 100644 index 00000000000..132b4ca8fdc --- /dev/null +++ b/source/components/sensor.rest.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.rest/';</script> \ No newline at end of file diff --git a/source/components/sensor.rfxtrx.html b/source/components/sensor.rfxtrx.html new file mode 100644 index 00000000000..f2a44a8c968 --- /dev/null +++ b/source/components/sensor.rfxtrx.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.rfxtrx/';</script> \ No newline at end of file diff --git a/source/components/sensor.rpi_gpio.html b/source/components/sensor.rpi_gpio.html new file mode 100644 index 00000000000..1c5b2479dca --- /dev/null +++ b/source/components/sensor.rpi_gpio.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.rpi_gpio/';</script> \ No newline at end of file diff --git a/source/components/sensor.sabnzbd.html b/source/components/sensor.sabnzbd.html new file mode 100644 index 00000000000..7bd9a170c7b --- /dev/null +++ b/source/components/sensor.sabnzbd.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.sabnzbd/';</script> \ No newline at end of file diff --git a/source/components/sensor.swiss_public_transport.html b/source/components/sensor.swiss_public_transport.html new file mode 100644 index 00000000000..bf454be199e --- /dev/null +++ b/source/components/sensor.swiss_public_transport.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.swiss_public_transport/';</script> \ No newline at end of file diff --git a/source/components/sensor.systemmonitor.html b/source/components/sensor.systemmonitor.html new file mode 100644 index 00000000000..e89635dbb88 --- /dev/null +++ b/source/components/sensor.systemmonitor.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.systemmonitor/';</script> \ No newline at end of file diff --git a/source/components/sensor.tellstick.html b/source/components/sensor.tellstick.html new file mode 100644 index 00000000000..70849d27c18 --- /dev/null +++ b/source/components/sensor.tellstick.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.tellstick/';</script> \ No newline at end of file diff --git a/source/components/sensor.temper.html b/source/components/sensor.temper.html new file mode 100644 index 00000000000..d6722f37104 --- /dev/null +++ b/source/components/sensor.temper.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.temper/';</script> \ No newline at end of file diff --git a/source/components/sensor.time_date.html b/source/components/sensor.time_date.html new file mode 100644 index 00000000000..e5f05a957e1 --- /dev/null +++ b/source/components/sensor.time_date.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.time_date/';</script> \ No newline at end of file diff --git a/source/components/sensor.transmission.html b/source/components/sensor.transmission.html new file mode 100644 index 00000000000..e65c9ce775b --- /dev/null +++ b/source/components/sensor.transmission.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.transmission/';</script> \ No newline at end of file diff --git a/source/components/sensor.vera.html b/source/components/sensor.vera.html new file mode 100644 index 00000000000..5f65da829ef --- /dev/null +++ b/source/components/sensor.vera.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.vera/';</script> \ No newline at end of file diff --git a/source/components/sensor.wink.html b/source/components/sensor.wink.html new file mode 100644 index 00000000000..1f0b691d468 --- /dev/null +++ b/source/components/sensor.wink.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.wink/';</script> \ No newline at end of file diff --git a/source/components/sensor.worldclock.html b/source/components/sensor.worldclock.html new file mode 100644 index 00000000000..7fb35119e01 --- /dev/null +++ b/source/components/sensor.worldclock.html @@ -0,0 +1 @@ +<script>document.location = '/components/sensor.worldclock/';</script> \ No newline at end of file diff --git a/source/components/shell_command.html b/source/components/shell_command.html new file mode 100644 index 00000000000..f0f2a47827c --- /dev/null +++ b/source/components/shell_command.html @@ -0,0 +1 @@ +<script>document.location = '/components/shell_command/';</script> \ No newline at end of file diff --git a/source/components/simple_alarm.html b/source/components/simple_alarm.html new file mode 100644 index 00000000000..bceb0b2e45e --- /dev/null +++ b/source/components/simple_alarm.html @@ -0,0 +1 @@ +<script>document.location = '/components/simple_alarm/';</script> \ No newline at end of file diff --git a/source/components/sun.html b/source/components/sun.html new file mode 100644 index 00000000000..910ccf29b0c --- /dev/null +++ b/source/components/sun.html @@ -0,0 +1 @@ +<script>document.location = '/components/sun/';</script> \ No newline at end of file diff --git a/source/components/switch.arduino.html b/source/components/switch.arduino.html new file mode 100644 index 00000000000..45fcd1a854a --- /dev/null +++ b/source/components/switch.arduino.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.arduino/';</script> \ No newline at end of file diff --git a/source/components/switch.arest.html b/source/components/switch.arest.html new file mode 100644 index 00000000000..2a92540bb04 --- /dev/null +++ b/source/components/switch.arest.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.arest/';</script> \ No newline at end of file diff --git a/source/components/switch.command_switch.html b/source/components/switch.command_switch.html new file mode 100644 index 00000000000..b158da8cf42 --- /dev/null +++ b/source/components/switch.command_switch.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.command_switch/';</script> \ No newline at end of file diff --git a/source/components/switch.edimax.html b/source/components/switch.edimax.html new file mode 100644 index 00000000000..5e69375d757 --- /dev/null +++ b/source/components/switch.edimax.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.edimax/';</script> \ No newline at end of file diff --git a/source/components/switch.hikvision.html b/source/components/switch.hikvision.html new file mode 100644 index 00000000000..e1cc4b04ef6 --- /dev/null +++ b/source/components/switch.hikvision.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.hikvision/';</script> \ No newline at end of file diff --git a/source/components/switch.html b/source/components/switch.html new file mode 100644 index 00000000000..2627d79d815 --- /dev/null +++ b/source/components/switch.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch/';</script> \ No newline at end of file diff --git a/source/components/switch.modbus.html b/source/components/switch.modbus.html new file mode 100644 index 00000000000..cffb462cafa --- /dev/null +++ b/source/components/switch.modbus.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.modbus/';</script> \ No newline at end of file diff --git a/source/components/switch.mqtt.html b/source/components/switch.mqtt.html new file mode 100644 index 00000000000..db675650f2c --- /dev/null +++ b/source/components/switch.mqtt.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.mqtt/';</script> \ No newline at end of file diff --git a/source/components/switch.rest.html b/source/components/switch.rest.html new file mode 100644 index 00000000000..fdb6fd3926b --- /dev/null +++ b/source/components/switch.rest.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.rest/';</script> \ No newline at end of file diff --git a/source/components/switch.rfxtrx.html b/source/components/switch.rfxtrx.html new file mode 100644 index 00000000000..c20a2bd1dcd --- /dev/null +++ b/source/components/switch.rfxtrx.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.rfxtrx/';</script> \ No newline at end of file diff --git a/source/components/switch.rpi_gpio.html b/source/components/switch.rpi_gpio.html new file mode 100644 index 00000000000..1c208e5ba84 --- /dev/null +++ b/source/components/switch.rpi_gpio.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.rpi_gpio/';</script> \ No newline at end of file diff --git a/source/components/switch.tellstick.html b/source/components/switch.tellstick.html new file mode 100644 index 00000000000..6020b11790c --- /dev/null +++ b/source/components/switch.tellstick.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.tellstick/';</script> \ No newline at end of file diff --git a/source/components/switch.transmission.html b/source/components/switch.transmission.html new file mode 100644 index 00000000000..56b2ac4a6b8 --- /dev/null +++ b/source/components/switch.transmission.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.transmission/';</script> \ No newline at end of file diff --git a/source/components/switch.vera.html b/source/components/switch.vera.html new file mode 100644 index 00000000000..eceea8d2f53 --- /dev/null +++ b/source/components/switch.vera.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.vera/';</script> \ No newline at end of file diff --git a/source/components/switch.wemo.html b/source/components/switch.wemo.html new file mode 100644 index 00000000000..6762dc81c64 --- /dev/null +++ b/source/components/switch.wemo.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.wemo/';</script> \ No newline at end of file diff --git a/source/components/switch.wink.html b/source/components/switch.wink.html new file mode 100644 index 00000000000..2c4aa24c4e2 --- /dev/null +++ b/source/components/switch.wink.html @@ -0,0 +1 @@ +<script>document.location = '/components/switch.wink/';</script> \ No newline at end of file diff --git a/source/components/tellstick.html b/source/components/tellstick.html new file mode 100644 index 00000000000..8b296330737 --- /dev/null +++ b/source/components/tellstick.html @@ -0,0 +1 @@ +<script>document.location = '/components/tellstick/';</script> \ No newline at end of file diff --git a/source/components/thermostat.heat_control.html b/source/components/thermostat.heat_control.html new file mode 100644 index 00000000000..626630e0a8e --- /dev/null +++ b/source/components/thermostat.heat_control.html @@ -0,0 +1 @@ +<script>document.location = '/components/thermostat.heat_control/';</script> \ No newline at end of file diff --git a/source/components/thermostat.html b/source/components/thermostat.html new file mode 100644 index 00000000000..80740f0ceed --- /dev/null +++ b/source/components/thermostat.html @@ -0,0 +1 @@ +<script>document.location = '/components/thermostat/';</script> \ No newline at end of file diff --git a/source/components/thermostat.nest.html b/source/components/thermostat.nest.html new file mode 100644 index 00000000000..7968eee0dc4 --- /dev/null +++ b/source/components/thermostat.nest.html @@ -0,0 +1 @@ +<script>document.location = '/components/thermostat.nest/';</script> \ No newline at end of file diff --git a/source/components/thermostat.radiotherm.html b/source/components/thermostat.radiotherm.html new file mode 100644 index 00000000000..530bef78e88 --- /dev/null +++ b/source/components/thermostat.radiotherm.html @@ -0,0 +1 @@ +<script>document.location = '/components/thermostat.radiotherm/';</script> \ No newline at end of file diff --git a/source/components/vera.html b/source/components/vera.html new file mode 100644 index 00000000000..506dcdcccd4 --- /dev/null +++ b/source/components/vera.html @@ -0,0 +1 @@ +<script>document.location = '/components/vera/';</script> \ No newline at end of file diff --git a/source/components/verisure.html b/source/components/verisure.html new file mode 100644 index 00000000000..654a0e67f30 --- /dev/null +++ b/source/components/verisure.html @@ -0,0 +1 @@ +<script>document.location = '/components/verisure/';</script> \ No newline at end of file diff --git a/source/components/wink.html b/source/components/wink.html new file mode 100644 index 00000000000..b0ae545d8e0 --- /dev/null +++ b/source/components/wink.html @@ -0,0 +1 @@ +<script>document.location = '/components/wink/';</script> \ No newline at end of file diff --git a/source/components/zone.html b/source/components/zone.html new file mode 100644 index 00000000000..6ed74eee70e --- /dev/null +++ b/source/components/zone.html @@ -0,0 +1 @@ +<script>document.location = '/components/zone/';</script> \ No newline at end of file diff --git a/source/components/zwave.html b/source/components/zwave.html new file mode 100644 index 00000000000..18800619321 --- /dev/null +++ b/source/components/zwave.html @@ -0,0 +1 @@ +<script>document.location = '/components/zwave/';</script> \ No newline at end of file diff --git a/source/cookbook/index.markdown b/source/cookbook/index.markdown index bf1bcee1d10..6c213e6a3d5 100644 --- a/source/cookbook/index.markdown +++ b/source/cookbook/index.markdown @@ -7,10 +7,10 @@ sidebar: false comments: false sharing: true footer: true +regenerate: true --- -This is a community currated list of `configuration.yaml` examples. New recipes can be added via -the [home-assistant.io repository](https://github.com/balloob/home-assistant.io/tree/master/source/_cookbook). +This is a community currated list of `configuration.yaml` examples. New recipes can be added via the [home-assistant.io repository](https://github.com/balloob/home-assistant.io/tree/master/source/_cookbook). {% for recipe in site.cookbook %} * [{{recipe.title}}]({{recipe.url}}) diff --git a/source/demo/frontend.html b/source/demo/frontend.html index d62b624de40..c2b80cacde8 100644 --- a/source/demo/frontend.html +++ b/source/demo/frontend.html @@ -4328,7 +4328,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN line-height: 1.5em; margin-top: 8px; margin-bottom: 16px; - }</style><template><ha-card header="Welcome Home!"><div class="content"><template is="dom-if" if="[[showInstallInstruction]]">To install Home Assistant, run:<br><code class="install">pip3 install homeassistant<br>hass --open-ui</code></template>Here are some resources to get started.<ul><template is="dom-if" if="[[showInstallInstruction]]"><li><a href="https://home-assistant.io/getting-started/">Installation instructions per platform</a></li><li><a href="https://home-assistant.io/getting-started/troubleshooting.html">Troubleshooting your installation</a></li></template><li><a href="https://home-assistant.io/getting-started/configuration.html" target="_blank">Configuring Home Assistant</a></li><li><a href="https://home-assistant.io/components/" target="_blank">Available components</a></li><li><a href="https://home-assistant.io/getting-started/troubleshooting-configuration.html">Troubleshooting your configuration</a></li><li><a href="https://home-assistant.io/help/" target="_blank">Getting help</a></li></ul><template is="dom-if" if="[[showHideInstruction]]">To remove this card, edit your config in <code>configuration.yaml</code> and disable the <code>introduction</code> component.</template></div></ha-card></template></dom-module><dom-module id="ha-zone-cards" assetpath="components/"><style>:host { + }</style><template><ha-card header="Welcome Home!"><div class="content"><template is="dom-if" if="[[showInstallInstruction]]">To install Home Assistant, run:<br><code class="install">pip3 install homeassistant<br>hass --open-ui</code></template>Here are some resources to get started.<ul><template is="dom-if" if="[[showInstallInstruction]]"><li><a href="https://home-assistant.io/getting-started/">Installation instructions per platform</a></li><li><a href="https://home-assistant.io/getting-started/troubleshooting/">Troubleshooting your installation</a></li></template><li><a href="https://home-assistant.io/getting-started/configuration/" target="_blank">Configuring Home Assistant</a></li><li><a href="https://home-assistant.io/components/" target="_blank">Available components</a></li><li><a href="https://home-assistant.io/getting-started/troubleshooting-configuration/">Troubleshooting your configuration</a></li><li><a href="https://home-assistant.io/help/" target="_blank">Getting help</a></li></ul><template is="dom-if" if="[[showHideInstruction]]">To remove this card, edit your config in <code>configuration.yaml</code> and disable the <code>introduction</code> component.</template></div></ha-card></template></dom-module><dom-module id="ha-zone-cards" assetpath="components/"><style>:host { display: block; padding-right: 8px; } diff --git a/source/developers/add_new_platform.html b/source/developers/add_new_platform.html new file mode 100644 index 00000000000..50ffdbb0745 --- /dev/null +++ b/source/developers/add_new_platform.html @@ -0,0 +1 @@ +<script>document.location = '/developers/add_new_platform/';</script> \ No newline at end of file diff --git a/source/developers/add_new_platform.markdown b/source/developers/add_new_platform.markdown index ab4333b1681..d1d3c540046 100644 --- a/source/developers/add_new_platform.markdown +++ b/source/developers/add_new_platform.markdown @@ -23,35 +23,21 @@ If you are planning to add support for a new type of device to an existing compo ### {% linkable_title Interfacing with devices %} -One of the rules for Home Assistant is that platform logic should never interface directly with -devices but use a third-party Python 3 library to do so. This way Home Assistant is able to share -code with the Python community and we can keep the project maintainable. +One of the rules for Home Assistant is that platform logic should never interface directly with devices but use a third-party Python 3 library to do so. This way Home Assistant is able to share code with the Python community and we can keep the project maintainable. -Platforms can specify dependencies and requirements the same way as a component does. Please see -[the component page](/developers/creating_components.html#dependencies) for more information. +Platforms can specify dependencies and requirements the same way as a component does. Please see [the component page](/developers/creating_components/#dependencies) for more information. ### {% linkable_title Creating Entities %} -Home Assistant will call a function with the following signature to initialize -your new platform. This function must exist in the platform module you create. +Home Assistant will call a function with the following signature to initialize your new platform. This function must exist in the platform module you create. ```python def setup_platform(hass, config, add_devices, discovery_info=None) ``` -In this function, your platform should create the appropriate entities and -register them with the Home Assistant core. Entities are Home Assistant's -representation of lights, switches, sensors, etc. and are derived from the -[Entity Abstract Class](https://github.com/balloob/home-assistant/blob/master/homeassistant/helpers/entity.py). -This abstract class contains logic for integrating most standard features into -your entities, such as visibility, entity IDs, updates, and many more. +In this function, your platform should create the appropriate entities and register them with the Home Assistant core. Entities are Home Assistant's representation of lights, switches, sensors, etc. and are derived from the [Entity Abstract Class](https://github.com/balloob/home-assistant/blob/master/homeassistant/helpers/entity.py). This abstract class contains logic for integrating most standard features into your entities, such as visibility, entity IDs, updates, and many more. -A list of entities can be registered with Home Assistant using the *add_devices* -function that is provided as an input to *setup_platform*. Once entities are -registered with with Home Assistant their updates will be provided to the core -and the core will have control over them. For more information on how Entities -can be customized, take a look at the [Entity Abstract -Class](https://github.com/balloob/home-assistant/blob/master/homeassistant/helpers/entity.py#L18). +A list of entities can be registered with Home Assistant using the *add_devices* function that is provided as an input to *setup_platform*. Once entities are registered with with Home Assistant their updates will be provided to the core and the core will have control over them. For more information on how Entities can be customized, take a look at the [Entity Abstract Class](https://github.com/balloob/home-assistant/blob/master/homeassistant/helpers/entity.py#L18). ## {% linkable_title Allowing your platform to be discovered %} diff --git a/source/developers/api.html b/source/developers/api.html new file mode 100644 index 00000000000..0c882b8e930 --- /dev/null +++ b/source/developers/api.html @@ -0,0 +1 @@ +<script>document.location = '/developers/api/';</script> \ No newline at end of file diff --git a/source/developers/api.markdown b/source/developers/api.markdown index 777ce646f2c..e2a3fb24705 100644 --- a/source/developers/api.markdown +++ b/source/developers/api.markdown @@ -12,5 +12,5 @@ footer: true Home Assistant is offering a RESTful API and a Python API for convenient access to a Home Assistant instance over HTTP. -- [Rest API](/developers/rest_api.html) -- [Python API](/developers/python_api.html) +- [Rest API](/developers/rest_api/) +- [Python API](/developers/python_api/) diff --git a/source/developers/architecture.html b/source/developers/architecture.html new file mode 100644 index 00000000000..4a7b0f2e9df --- /dev/null +++ b/source/developers/architecture.html @@ -0,0 +1 @@ +<script>document.location = '/developers/architecture/';</script> \ No newline at end of file diff --git a/source/developers/architecture.markdown b/source/developers/architecture.markdown index a01c95c5742..974cc312990 100644 --- a/source/developers/architecture.markdown +++ b/source/developers/architecture.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -Before we dive into the Home Assistant architecture, it is important to get a clear overview of the home automation landscape as a whole. This will allow us to show how the different parts of Home Assistant fit in the picture. For a more lengthy discussion about what each part in this overview is responsible for, <a href='{{ root_url }}/blog/2014/12/26/home-control-home-automation-and-the-smart-home/'>check out our blog</a>. A tl;dr version of the blog: +Before we dive into the Home Assistant architecture, it is important to get a clear overview of the home automation landscape as a whole. This will allow us to show how the different parts of Home Assistant fit in the picture. For a more lengthy discussion about what each part in this overview is responsible for, <a href='/blog/2014/12/26/home-control-home-automation-and-the-smart-home/'>check out our blog</a>. A tl;dr version of the blog: * Home Control is responsible for collecting information on- and controlling devices. * Home Automation triggers commands based on user configurations. @@ -31,54 +31,57 @@ The Home Assistant core is responsible for Home Control. It has four parts to ma * The **Timer** will send every 1 second a `time_changed` event on the event bus. <p class='img'> - <a href='{{ root_url }}/images/architecture/ha_architecture.png'> - <img src='{{ root_url }}/images/architecture/ha_architecture.png' /> + <a href='/images/architecture/ha_architecture.png'> + <img src='/images/architecture/ha_architecture.png' /> </a> Overview of the Home Assistant core architecture </p> Home Assistant can be extended by **components**. Each component is responsible for a specific domain within Home Assistant. Components can listen for- or trigger events, offer services and maintain states. Components are written in Python and can do all the goodness that Python has to offer. Out of the box, Home Assistant offers a bunch of [built-in components]({{site_root}}/components/). -We can differentiate between two different types of -components within Home Assistant. +We can differentiate between two different types ofcomponents within Home Assistant. #### {% linkable_title Components that interact with an Internet of Things domain %} + These components will track devices within a specific domain and exist of a core part and platform specific logic. These components make their information available via the State Machine and the Event Bus. The component will also register services in the Service Registry to expose control of the devices. For example, one of the built-in components is the `switch` component. This component is responsible for interaction with different types of switches. -If you are planning to add support for a new platform, please check out the [add new platform section]({{root_url}}/developers/add_new_platform.html). +If you are planning to add support for a new platform, please check out the [add new platform section]({{root_url}}/developers/add_new_platform/). #### {% linkable_title Components that respond to events that happen within Home Assistant %} + These components provide small pieces of home automation logic or services that do common tasks within your house. -For example the `device_sun_light_trigger` component tracks the state of devices and the sun to make sure that the lights are turned on when it gets dark and there are people home. The component uses logic along the following lines: +For example the [`device_sun_light_trigger` component](/components/device_sun_light_trigger/) tracks the state of devices and the sun to make sure that the lights are turned on when it gets dark and there are people home. The component uses logic along the following lines: +```plain In the event that device 'Paulus Nexus 5' changes to the 'Home' state: If the sun has set and the lights are not on: Turn on the lights +``` -<!-- comment to separate markdown blockquotes --> - +```plain In the event that the combined state of all tracked devices changes to 'Not Home': If the lights are on: Turn off the lights +``` -<!-- comment to separate markdown blockquotes --> - +```plain 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 +``` -Another example of a home automation component can be found in [`/config/custom_components/example.py`](https://github.com/balloob/home-assistant/blob/master/config/custom_components/example.py). +An extended example of a home automation component can be found [here](https://github.com/balloob/home-assistant/blob/master/config/custom_components/example.py). ### {% linkable_title The full picture %} When we put all the different pieces of Home Assistant together we see that we match pretty close to the initial sketched home automation overview. The smart home AI is not implemented yet and therefore omitted from the following picture. <p class='img'> - <a href='{{ root_url }}/images/architecture/ha_full_architecture.png'> - <img src='{{ root_url }}/images/architecture/ha_full_architecture.png' /> + <a href='/images/architecture/ha_full_architecture.png'> + <img src='/images/architecture/ha_full_architecture.png' /> </a> Overview of the full Home Assistant architecture with a couple of loaded components and platforms. </p> @@ -90,8 +93,8 @@ Component's platform logic uses 3rd party Python libraries to communicate with t Home Assistant supports running multiple synchronized instances using a master-slave model. Whenever `events.fire` or `states.set` is called on the salve it will forward it to the master. The master will replicate all events and changed states to its slaves. <p class='img'> - <a href='{{ root_url }}/images/architecture/architecture-remote.png'> - <img src='{{ root_url }}/images/architecture/architecture-remote.png' /> + <a href='/images/architecture/architecture-remote.png'> + <img src='/images/architecture/architecture-remote.png' /> </a> Overview of the Home Assistant architecture for multiple devices. </p> diff --git a/source/developers/creating_components.html b/source/developers/creating_components.html new file mode 100644 index 00000000000..397b81b2243 --- /dev/null +++ b/source/developers/creating_components.html @@ -0,0 +1 @@ +<script>document.location = '/developers/creating_components/';</script> \ No newline at end of file diff --git a/source/developers/creating_components.markdown b/source/developers/creating_components.markdown index 438ad20ac75..57ce55700ae 100644 --- a/source/developers/creating_components.markdown +++ b/source/developers/creating_components.markdown @@ -26,10 +26,10 @@ example: ## {% linkable_title Loading components %} -A component will be loaded on start if a section (ie. `[light]`) for it exists in the config file. A component can also be loaded if another component is loaded that depends on it. When loading a component Home Assistant will check the following paths: +A component will be loaded on start if a section (ie. `light:`) for it exists in the config file. A component can also be loaded if another component is loaded that depends on it. When loading a component Home Assistant will check the following paths: - * <code><config directory>/custom_components/<component name></code> - * <code>homeassistant/components/<component name></code> (built-in components) + * `<config directory>/custom_components/<component name>` + * `homeassistant/components/<component name>` (built-in components) Once loaded, a component will only be setup if all dependencies can be loaded and are able to setup. Keep an eye on the logs to see if your component could be loaded and initialized. @@ -47,28 +47,27 @@ Home Assistant allows components and platforms to specify their dependencies and Dependencies are other Home Assistant components that should be setup before the platform is loaded. An example is the MQTT sensor component, which requires an active connection to an MQTT broker. If Home Assistant is unable to load and setup the MQTT component, it will not setup the MQTT sensor component. -Requirements are Python libraries that you would normally install using `pip`. Each entry in a requirement list is a pip compatible string. For example, the media player Cast platform depends on the Python package PyChromecast thus `REQUIREMENTS = ['pychromecast==0.6.12']`. If Home Assistant is unable to install the package or verify it is installed, the component will fail to -load. +Requirements are Python libraries that you would normally install using `pip`. Each entry in a requirement list is a pip compatible string. For example, the media player Cast platform depends on the Python package PyChromecast thus `REQUIREMENTS = ['pychromecast==0.6.12']`. If Home Assistant is unable to install the package or verify it is installed, the component will fail to load. ## {% linkable_title Initializing components %} -After loading, the bootstrapper will call `setup(hass, config)` method on the component to initialize it. The following parameters are passed in: +After loading, the bootstrapper will call `setup(hass, config)` method on the component to initialize it. -| Parameter | Description | -| --------- | ----------- | -| <code>hass</code> | The Home Assistant object. Call its methods to track time, register services, listen for events or track states: [Overview of available methods.](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L55) | -| <code>config</code> | A dict containing the configuration. The keys of the config-dict are component names and the value is another dict with the component configuration.: [Details](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L687) | +### {% linkable_title `hass`: the Home Assistant instance %} -### {% linkable_title Guidance on using the Home Assistant object %} -The Home Assistant object contains three objects to help you interact with the system. +The Home Assistant instace contains three objects to help you interact with the system. | Object | Description | | ------ | ----------- | -| <code>hass.states</code> | This is the StateMachine. It allows you to set states and track when they are changed. [See available methods](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L434). | -| <code>hass.bus</code> | This is the EventBus. It allows you to trigger and listen for events.<br>[See available methods](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L229). | -| <code>hass.services</code> | This is the ServiceRegistry. It allows you to register services.<br>[See available methods](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L568). | +| `hass.config` | This is the core configuration of Home Assistant exposing location, temperature preferences and config directory path. [Details](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L687) +| `hass.states` | This is the StateMachine. It allows you to set states and track when they are changed. [See available methods](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L434). | +| `hass.bus` | This is the EventBus. It allows you to trigger and listen for events.<br>[See available methods](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L229). | +| `hass.services` | This is the ServiceRegistry. It allows you to register services.<br>[See available methods](https://github.com/balloob/home-assistant/blob/dev/homeassistant/core.py#L568). | + +### {% linkable_title `config`: User given configuration. %} + +The `config` paramter is a dictionary containing the user supplied configuration. The keys of the dictionary are the component names and the value is another dictionary with the component configuration. -### {% linkable_title Example on using the configuration parameter %} If your configuration file contains the following lines: ```yaml @@ -77,3 +76,7 @@ example: ``` Then in the setup method of your component you will be able to refer to `config['example']['host']` to get the value `paulusschoutsen.nl`. + +## {% linkable_title Responding to events %} + +Home Assistant has different ways of responding to events that occur in Home Assistant. These have been organized in [helper methods](https://github.com/balloob/home-assistant/blob/dev/homeassistant/helpers/event.py). Examples are `track_state_change`, `track_point_in_time`, `track_time_change`. \ No newline at end of file diff --git a/source/developers/credits.html b/source/developers/credits.html new file mode 100644 index 00000000000..edc81609998 --- /dev/null +++ b/source/developers/credits.html @@ -0,0 +1 @@ +<script>document.location = '/developers/credits/';</script> \ No newline at end of file diff --git a/source/developers/frontend.html b/source/developers/frontend.html new file mode 100644 index 00000000000..20ba1fc49cb --- /dev/null +++ b/source/developers/frontend.html @@ -0,0 +1 @@ +<script>document.location = '/developers/frontend/';</script> \ No newline at end of file diff --git a/source/developers/frontend.markdown b/source/developers/frontend.markdown index 25196bc328c..d6c0e70b500 100644 --- a/source/developers/frontend.markdown +++ b/source/developers/frontend.markdown @@ -11,9 +11,9 @@ footer: true Home Assistant uses [Polymer](https://www.polymer-project.org/) for the UI and [NuclearJS](http://optimizely.github.io/nuclear-js/) for all data management. - * Polymer allows building encapsulated custom HTML elements. + * Polymer allows building encapsulated custom HTML elements. [Home-Assistant-Polymer source code on GitHub.](https://github.com/balloob/home-assistant-polymer) - * NuclearJS is a reactive flux built with ImmutableJS data structures. + * NuclearJS is a reactive flux built with ImmutableJS data structures. [Home-Assistant-JS source code on GitHub.](https://github.com/balloob/home-assistant-js) <p class='note warning'> @@ -28,39 +28,29 @@ http: development: 1 ``` -Next step is to get the frontend code. When you clone the Home Assistant repository, the frontend -repository is not cloned by default. You will have to trigger this manually by running from the -command line: +Next step is to get the frontend code. When you clone the Home Assistant repository, the frontend repository is not cloned by default. You will have to do this by running from the command line: ```bash -git submodule update --init +$ git submodule update --init ``` -After checking out the frontend code, you will have to install the frontend dependencies. Firing off -a build of the frontend by running `script/build_frontend` will ensure they get installed. +After checking out the frontend code, you will have to install the frontend dependencies. Firing off a build of the frontend by running `script/build_frontend` will ensure they get installed. -Once this is done, you can start editting the webcomponents in the folder -`homeassistant/components/frontend/www_static/home-assistant-polymer/src`. To see the changes you've -made, simply refresh your browser. +Once this is done, you can start editting the webcomponents in the folder `homeassistant/components/frontend/www_static/home-assistant-polymer/src`. To see the changes you've made, simply refresh your browser. ## {% linkable_title Enabling JavaScript backend development %} -Polymer is only providing a UI toolkit for Home Assistant. All data management and interaction with -the server is done by `home-assistant-js` leveraging NuclearJS. To enable JavaScript development: +Polymer is only providing a UI toolkit for Home Assistant. All data management and interaction with the server is done by `home-assistant-js` leveraging NuclearJS. To enable JavaScript development: ```bash -cd homeassistant/components/frontend/www_static/home-assistant-polymer/ -npm run setup_js_dev -npm run js_dev +$ cd homeassistant/components/frontend/www_static/home-assistant-polymer/ +$ npm run setup_js_dev +$ npm run js_dev ``` -`npm run js_dev` will start the process that will ensure that your latest changes to the JavaScript -files will be loaded when you refresh the page. This command has to be always running while working -on home-assistant-js. +`npm run js_dev` will start the process that will ensure that your latest changes to the JavaScript files will be loaded when you refresh the page. This command has to be always running while working on home-assistant-js. -After your changes have been accepted into the `home-assistant-js` repository, we'll have to update -Home Assistant Polymer to use the latest version. This can be done by updating `package.json`. Look -for the line that contains `home-assistant-js` and update the SHA to the SHA of your commit. +After your changes have been accepted into the `home-assistant-js` repository, we'll have to update Home Assistant Polymer to use the latest version. This can be done by updating `package.json`. Look for the line that contains `home-assistant-js` and update the SHA to the SHA of your commit. # {% linkable_title Building the Polymer frontend %} @@ -73,26 +63,23 @@ Building a new version of the frontend is as simple as running `script/build_fro * Vulcanize all Webcomponents to `frontend.vulcan.html`. * Minify `frontend.vulcan.html` and save it as `frontend.html`. * Copy the webcomponents polyfill `webcomponents-lite.min.js` from **home-assistant-polymer** to `components/frontend/www_static/webcomponents-lite.min.js`. - * Copy the final frontend build `frontend.html` from **home-assistant-polymer** to `components/frontend/www_static/frontend.html`. + * Copy the final frontend build `frontend.html` from **home-assistant-polymer** to `components/frontend/www_static/frontend/`. * Generate MD5 hash of `frontend.html` to signal caches to redownload the UI. <p class='img'> <img src='/images/frontend/polymer-build-architecture.png' alt='Polymer build architecture diagram' /> +Polymer build architecture diagram </p> # {% linkable_title Adding state cards %} The main interface of Home Assistant is a list of the current entities and their states. For each entity in the system, a state card will be rendered. State cards will show a state badge, the name of the entity, when the state has last changed and the current state or a control to interact with it. -<img src='/images/frontend/frontend-cards.png' /> - -Some domains will be filtered out of the main view and are available through separate menu options. Examples are `group`, `script`, `scene`. +![Cards in the frontend](/images/frontend/frontend-cards.png) The different card types can be found [here](https://github.com/balloob/home-assistant-polymer/tree/master/src/state-summary). -Adding a custom card type can be done with a few simple steps. For this example we will add a new -state card for the domain `camera`: -_(All files in this example link to their source-code)_ +Adding a custom card type can be done with a few simple steps. For this example we will add a new state card for the domain `camera`: _(All files in this example link to their source-code)_ 1. Add `'camera'` to the array `DOMAINS_WITH_CARD` in the file [`/util/state-card-type.js`](https://github.com/balloob/home-assistant-polymer/blob/master/src/util/state-card-type.js#L3-L4). 2. Create the files `state-card-camera.html` and `state-card-camera.js` in the folder [`/state-summary/`](https://github.com/balloob/home-assistant-polymer/tree/master/src/state-summary). @@ -108,7 +95,7 @@ Whenever the user taps or clicks on one of the cards, a more info dialog will sh The more info dialog for a light allows the user to control the color and the brightness. </p> -The instructions to add a more info dialog are very similar to adding a new card type. This example will add a new more info component for the domain `camera`: +The instructions to add a more info dialog are very similar to adding a new card type. This example will add a new more info component for the domain `camera`: _(All files in this example link to their source-code)_ 1. Add `'camera'` to the array `DOMAINS_WITH_MORE_INFO` in the file [`util/state-more-info-type.js`](https://github.com/balloob/home-assistant-polymer/blob/master/src/util/state-more-info-type.js#L1). diff --git a/source/developers/index.markdown b/source/developers/index.markdown index dcbb3c9451b..93e0f53133e 100644 --- a/source/developers/index.markdown +++ b/source/developers/index.markdown @@ -22,9 +22,9 @@ Home Assistant is open-source and MIT licensed. The source can be found here: You will need to setup a development environment if you want to start developing a new feature or component for Home Assistant perform theses steps ```bash -git clone https://github.com/balloob/home-assistant.git -cd home-assistant -script/setup +$ git clone https://github.com/balloob/home-assistant.git +$ cd home-assistant +$ script/setup ``` After following these steps, running `hass` will invoke your local installation. @@ -36,25 +36,25 @@ requests. 1. Go to [the Home Assistant repository](https://github.com/balloob/home-assistant) and click fork in the top right. 2. Follow steps in the previous section but with your forked repository. - 3. Create a new branch to hold your changes<br> + 3. Create a new branch to hold your changes `git checkout -b some-feature` 4. Make the changes you want - 5. Check your changes for style violations<br> + 5. Check your changes for style violations `./script/lint` - 6. Commit the changes<br> - `git add .`<br> + 6. Commit the changes + `git add .` `git commit -m "Added some-feature"` - 7. Push your commited changes back to your fork on Github<br> + 7. Push your commited changes back to your fork on Github `git push origin HEAD` 8. Follow [these steps](https://help.github.com/articles/creating-a-pull-request/) to create your pull request. ### {% linkable_title Further reading %} -- [Home Assistant Architecture](/developers/architecture.html) -- [Frontend development](/developers/frontend.html) -- [Creating a custom component](/developers/creating_components.html) -- [Adding support for a new platform](/developers/add_new_platform.html) -- [Rest API](/developers/api.html) -- [Website](/developers/website.html) +- [Home Assistant Architecture](/developers/architecture/) +- [Frontend development](/developers/frontend/) +- [Creating a custom component](/developers/creating_components/) +- [Adding support for a new platform](/developers/add_new_platform/) +- [Rest API](/developers/api/) +- [Website](/developers/website/) diff --git a/source/developers/python_api.html b/source/developers/python_api.html new file mode 100644 index 00000000000..c5857548eed --- /dev/null +++ b/source/developers/python_api.html @@ -0,0 +1 @@ +<script>document.location = '/developers/python_api/';</script> \ No newline at end of file diff --git a/source/developers/python_api.markdown b/source/developers/python_api.markdown index b3b2d43cf5d..06395eb10f5 100644 --- a/source/developers/python_api.markdown +++ b/source/developers/python_api.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -In the package [`homeassistant.remote`](https://github.com/balloob/home-assistant/blob/master/homeassistant/remote.py) a Python API on top of the [HTTP API](/developers/api.html) can be found. +In the package [`homeassistant.remote`](https://github.com/balloob/home-assistant/blob/master/homeassistant/remote.py) a Python API on top of the [HTTP API](/developers/api/) can be found. This page is not a full documentation it's more a collection of some example. A simple way to get all current entities is to visit the "Set State" page in the "Developer Tools". For the examples below just choose one from the available entries. Here the sensor `sensor.office_temperature` and the switch `switch.livingroom_pin_2` are used. diff --git a/source/developers/rest_api.html b/source/developers/rest_api.html new file mode 100644 index 00000000000..59fcf663760 --- /dev/null +++ b/source/developers/rest_api.html @@ -0,0 +1 @@ +<script>document.location = '/developers/rest_api/';</script> \ No newline at end of file diff --git a/source/developers/website.html b/source/developers/website.html new file mode 100644 index 00000000000..ddb4bd03585 --- /dev/null +++ b/source/developers/website.html @@ -0,0 +1 @@ +<script>document.location = '/developers/website/';</script> \ No newline at end of file diff --git a/source/getting-started/android.html b/source/getting-started/android.html new file mode 100644 index 00000000000..c876eb74786 --- /dev/null +++ b/source/getting-started/android.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/android/';</script> \ No newline at end of file diff --git a/source/getting-started/automation.html b/source/getting-started/automation.html new file mode 100644 index 00000000000..5dcffd663d3 --- /dev/null +++ b/source/getting-started/automation.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/automation/';</script> \ No newline at end of file diff --git a/source/getting-started/automation.markdown b/source/getting-started/automation.markdown index 24ad1c8d5c7..dd252b41bae 100644 --- a/source/getting-started/automation.markdown +++ b/source/getting-started/automation.markdown @@ -9,33 +9,23 @@ sharing: true footer: true --- -When all your devices are set up it's time to put the cherry on the pie: automation. Home Assistant -offers [a few built-in automations](/components/#automation) but mainly you'll be using -[the automation component](/components/automation.html) to set up your own rules. +When all your devices are set up it's time to put the cherry on the pie: automation. Home Assistant offers [a few built-in automations](/components/#automation) but mainly you'll be using [the automation component](/components/automation/) to set up your own rules. ### {% linkable_title The basics of automation %} Every automation rule consists of triggers, an action to be performed and optional conditions. -Triggers can be anything observed in Home Assistant. For example, it can be a certain point in time -or a person coming home, which can be observed by the state changing from `not_home` to `home`. +Triggers can be anything observed in Home Assistant. For example, it can be a certain point in time or a person coming home, which can be observed by the state changing from `not_home` to `home`. -Actions will call services within Home Assistant. For example, turn a light on, set the temperature -on your thermostat or activate a scene. +Actions will call services within Home Assistant. For example, turn a light on, set the temperature on your thermostat or activate a scene. -Conditions are used to prevent actions from firing unless certain conditions are met. For example, -it is possible to only turn on the light if someone comes home and it is after a certain point in -time. +Conditions are used to prevent actions from firing unless certain conditions are met. For example, it is possible to only turn on the light if someone comes home and it is after a certain point in time. -The difference between a condition and a trigger can be confusing. The difference is that the trigger -looks at the event that is happening, ie a car engine turning on. Conditions looks at the current state -of the system, ie is the car engine on. +The difference between a condition and a trigger can be confusing. The difference is that the trigger looks at the event that is happening, ie a car engine turning on. Conditions looks at the current state of the system, ie is the car engine on. ### {% linkable_title Exploring the internal state %} -Automation rules are based on the internal state of Home Assistant. This is available for exploring -in the app using the developer tools. The first icon will show you the available services and the -second icon will show you the current devices. +Automation rules are based on the internal state of Home Assistant. This is available for exploring in the app using the developer tools. The first icon will show you the available services and the second icon will show you the current devices. Each device is represented in Home Assistant as an entity consisting of the following parts: @@ -45,19 +35,13 @@ Each device is represented in Home Assistant as an entity consisting of the foll | State | The current state of the device. | `home` | Attributes | Extra data related to the device and/or current state. | `brightness` -A service can be called to have Home Assistant perform an action. Turn on a light, run a script or -enable a scene. Each service has a domain and a name. For example the service `light.turn_on` is -capable of turning on any light device in your system. Services can be passed parameters to for -example tell which device to turn on or what color to use. +A service can be called to have Home Assistant perform an action. Turn on a light, run a script or enable a scene. Each service has a domain and a name. For example the service `light.turn_on` is capable of turning on any light device in your system. Services can be passed parameters to for example tell which device to turn on or what color to use. ## {% linkable_title Creating your first automation rule %} -Before we dive deeper into what every piece of automation _can_ do, let's look at a simple automation -rule: **Turn on the lights when the sun sets** +Before we dive deeper into what every piece of automation _can_ do, let's look at a simple automation rule: **Turn on the lights when the sun sets** -In this example, we are defining a trigger to track the sunset and tell it to fire when the sun is -setting. When this event is triggered, the service `light.turn_on` is called without any -parameters. Because we specify no parameters, it will turn on all the lights. +In this example, we are defining a trigger to track the sunset and tell it to fire when the sun is setting. When this event is triggered, the service `light.turn_on` is called without any parameters. Because we specify no parameters, it will turn on all the lights. ```yaml # Example configuration.yaml entry @@ -70,10 +54,7 @@ automation: service: light.turn_on ``` -After a few days of running this automation rule you come to realize that this automation rule is not -good enough. It was already dark when the lights went on and the one day you weren't home, the lights -turned on anyway. Time for some tweaking. Let's add an offset to the sunset trigger and a condition -to only turn on the lights if anyone is home. +After a few days of running this automation rule you come to realize that this automation rule is not good enough. It was already dark when the lights went on and the one day you weren't home, the lights turned on anyway. Time for some tweaking. Let's add an offset to the sunset trigger and a condition to only turn on the lights if anyone is home. ```yaml # Example configuration.yaml entry @@ -91,18 +72,11 @@ automation: service: light.turn_on ``` -Now you're happy and all is good. You start to like this automation business and buy some more lights, -this time you put them in the bedroom. But what you now realize is that when the sun is setting, the -lights in the bedroom are also being turned on! Time to tweak the automation to only turn on the living -room lights. +Now you're happy and all is good. You start to like this automation business and buy some more lights, this time you put them in the bedroom. But what you now realize is that when the sun is setting, the lights in the bedroom are also being turned on! Time to tweak the automation to only turn on the living room lights. -The first thing you do is to look at the entities in the developer tools (second icon) in the app. -You see the names of your lights and you write them down: `light.table_lamp`, `light.bedroom`, -`light.ceiling`. +The first thing you do is to look at the entities in the developer tools (second icon) in the app. You see the names of your lights and you write them down: `light.table_lamp`, `light.bedroom`, `light.ceiling`. -Instead of hard coding the entity ids of the lights in the automation rule, we will set up a group. -This will allow us to see the living room separate in the app and be able to address it from -automation rules. +Instead of hard coding the entity ids of the lights in the automation rule, we will set up a group. This will allow us to see the living room separate in the app and be able to address it from automation rules. So we tweak the config to add the group and have the automation rule only turn on the group. @@ -128,14 +102,9 @@ automation: entity_id: group.living_room ``` -Christmas is coming along and you decide to buy a remote switch to control the christmas lights from -Home Assistant. You can't claim to live in the house of the future if you're still manually turn on -your christmas lights! +Christmas is coming along and you decide to buy a remote switch to control the christmas lights from Home Assistant. You can't claim to live in the house of the future if you're still manually turn on your christmas lights! -We hook the switch up to Home Assistant and grab the entity id from the developer tools: -`switch.christmas_lights`. We will update the group to include the switch and will change our action. -We are no longer able to call `light.turn_on` because we also want to turn on a switch. This is -where `homeassistant.turn_on` comes to the rescue. This service is capable of turning any entity on. +We hook the switch up to Home Assistant and grab the entity id from the developer tools: `switch.christmas_lights`. We will update the group to include the switch and will change our action. We are no longer able to call `light.turn_on` because we also want to turn on a switch. This is where `homeassistant.turn_on` comes to the rescue. This service is capable of turning any entity on. ```yaml # Example configuration.yaml entry @@ -162,14 +131,13 @@ automation: ### {% linkable_title Further reading %} -We went over the basics of creating a home automation rule. From here no longer any hand holding, -go automate! +We went over the basics of creating a home automation rule. From here no longer any hand holding, go automate! - - Learn about the available [automation triggers](/components/automation.html#triggers) - - Learn about the available [automation conditions](/components/automation.html#conditions) - - Learn about [scripts](/components/script.html) to help you trigger multiple actions and delays - - Learn about [scenes](/components/scene.html) to help you set many entities at once to your liking - - Setup the [notification component](/components/#notify-service) to sent yourself messages + - Learn about the available [automation triggers](/components/automation/#triggers) + - Learn about the available [automation conditions](/components/automation/#conditions) + - Learn about [scripts](/components/script/) to help you trigger multiple actions and delays + - Learn about [scenes](/components/scene/) to help you set many entities at once to your liking + - Setup a [notification platform](/components/#notifications) to sent yourself messages <p class='note warning'> Whenever you write the value <code>on</code> or <code>off</code>, surround it with quotes to avoid diff --git a/source/getting-started/autostart.html b/source/getting-started/autostart.html new file mode 100644 index 00000000000..0569f3c52d3 --- /dev/null +++ b/source/getting-started/autostart.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/autostart/';</script> \ No newline at end of file diff --git a/source/getting-started/autostart.markdown b/source/getting-started/autostart.markdown index 485171218c8..6aa3e3b2e7e 100644 --- a/source/getting-started/autostart.markdown +++ b/source/getting-started/autostart.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -<div class='advanced-installs-container'> +<div class='advanced-installs-container' markdown='0'> <input name='advanced-installs' type='radio' id='upstart-install' checked> <input name='advanced-installs' type='radio' id='systemd-install'> <input name='advanced-installs' type='radio' id='osx-install'> @@ -17,44 +17,45 @@ footer: true <label class='menu-selector systemd' for='systemd-install'>Systemd Daemon</label> <label class='menu-selector osx' for='osx-install'>OS X</label> - -<div class='advanced-installs upstart'> +<div class='advanced-installs upstart' markdown='1'> Many linux distributions use the Upstart system (or similar) for managing daemons. Typically, systems based on Debian 7 or previous use Upstart. This includes Ubuntu releases before 15.04 and all current Raspian releases. If you are unsure if your system is using Upstart, you may check with the following command: ```bash -ps -p 1 -o comm= +$ ps -p 1 -o comm= ``` If the preceding command returns the string `init`, you are likely using Upstart. -Upstart will launch init scripts that are located in the directory <code>/etc/init.d/</code>. A sample init script for systems using Upstart is <a href="https://raw.githubusercontent.com/balloob/home-assistant/dev/script/hass-daemon">maintained by this project</a>. +Upstart will launch init scripts that are located in the directory `/etc/init.d/`. A sample init script for systems using Upstart is <a href="https://raw.githubusercontent.com/balloob/home-assistant/dev/script/hass-daemon">maintained by this project</a>. To install this script, download it, tweak it to you liking, and install it by following the directions in the header. This script will setup Home Assistant to run when the system boots. To start/stop Home Assistant manually, issue the following commands: + + ```bash -sudo service hass-daemon start -sudo service hass-daemon stop +$ sudo service hass-daemon start +$ sudo service hass-daemon stop ``` -When running Home Assistant with this script, the configuration directory will be located at <code>/var/opt/homeassistant</code>. This directory will contain a verbose log rather than simply an error log. +When running Home Assistant with this script, the configuration directory will be located at `/var/opt/homeassistant`. This directory will contain a verbose log rather than simply an error log. When running daemons, it is good practice to have the daemon run under its own user name rather than the default user's name. Instructions for setting this up are outside the scope of this document. </div> <!-- UPSTART --> - - -<div class='advanced-installs systemd'> +<div class='advanced-installs systemd' markdown='1'> Newer linux distributions are trending towards using systemd for managing daemons. Typically, systems based on Fedora or Debian 8 or later use systemd. This includes Ubuntu releases including and after 15.04, CentOS, and Red Hat. If you are unsure if your system is using systemd, you may check with the following command: + ```bash -ps -p 1 -o comm= +$ ps -p 1 -o comm= ``` If the preceding command returns the string `systemd`, you are likely using systemd. If you want Home Assistant to be launched automatically, an extra step is needed to setup systemd. You need a service file to control Home Assistant with systemd. + ```bash -su -c 'cat <<EOF >> /lib/systemd/system/home-assistant.service +$ su -c 'cat <<EOF >> /lib/systemd/system/home-assistant.service [Unit] Description=Home Assistant After=network.target @@ -69,17 +70,21 @@ User=pi [Install] WantedBy=multi-user.target EOF' + ``` You need to reload systemd to make the daemon aware of the new configuration. Enable and launch Home Assistant after that. + ```bash -sudo systemctl \-\-system daemon-reload -sudo systemctl enable home-assistant -sudo systemctl start home-assistant +$ sudo systemctl --system daemon-reload +$ sudo systemctl enable home-assistant +$ sudo systemctl start home-assistant + ``` -If everything went well, <code>sudo systemctl start home-assistant</code> should give you a positive feedback. +If everything went well, `sudo systemctl start home-assistant` should give you a positive feedback. + ```bash $ sudo systemctl status home-assistant -l @@ -90,26 +95,28 @@ $ sudo systemctl status home-assistant -l CGroup: /system.slice/home-assistant.service └─8557 /usr/bin/python3.4 -m homeassistant [...] + ``` -To get Home Assistant's logging output, simple use <code>journalctl</code>. +To get Home Assistant's logging output, simple use `journalctl`. + ```bash -sudo journalctl -f -u home-assistant +$ sudo journalctl -f -u home-assistant ``` + </div> <!-- SYSTEMD --> -<div class='advanced-installs osx'> -Setting up Home Assistant to run as a background service is simple. OS X will -start it on boot and make sure it's always running. +<div class='advanced-installs osx' markdown='1'> +Setting up Home Assistant to run as a background service is simple. OS X will start it on boot and make sure it's always running. To get Home Assistant installed as a background service, run: + ```bash $ hass --install-osx Home Assistant has been installed. Open it here: http://localhost:8123 - ``` Home Assistant will log to `~/Library/Logs/homeassistant.log` @@ -120,9 +127,9 @@ To uninstall the service, run: $ hass --uninstall-osx Home Assistant has been uninstalled. - ``` </div> <!-- OSX --> +</div> -###[« Back to Getting Started](/getting-started/index.html) +### [« Back to Getting Started](/getting-started/) diff --git a/source/getting-started/configuration.html b/source/getting-started/configuration.html new file mode 100644 index 00000000000..7347ed0c9c4 --- /dev/null +++ b/source/getting-started/configuration.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/configuration/';</script> \ No newline at end of file diff --git a/source/getting-started/configuration.markdown b/source/getting-started/configuration.markdown index f2238791327..aefe67fa5b6 100644 --- a/source/getting-started/configuration.markdown +++ b/source/getting-started/configuration.markdown @@ -9,20 +9,13 @@ sharing: true footer: true --- -Home Assistant will create a configuration folder when it is run for the first time. Location depends -on operating system: on OS X/Linux it is `~/.homeassistant` and on Windows it is `%APPDATA%/.homeassistant`. -If you want to use a different folder for configuration, run `hass --config path/to/config`. +Home Assistant will create a configuration folder when it is run for the first time. Location depends on operating system: on OS X/Linux it is `~/.homeassistant` and on Windows it is `%APPDATA%/.homeassistant`. If you want to use a different folder for configuration, run `hass --config path/to/config`. -Inside your configuration folder is the file `configuration.yaml`. This is the main file that contains -which components will be loaded and what their configuration is. An example configuration file is -located [here](https://github.com/balloob/home-assistant/blob/master/config/configuration.yaml.example). +Inside your configuration folder is the file `configuration.yaml`. This is the main file that contains which components will be loaded and what their configuration is. An example configuration file is located [here](https://github.com/balloob/home-assistant/blob/master/config/configuration.yaml.example). -When launched for the first time, Home Assistant will write a default configuration enabling the web -interface and device discovery. It can take up to a minute for your devices to be discovered and -show up in the interface. +When launched for the first time, Home Assistant will write a default configuration enabling the web interface and device discovery. It can take up to a minute for your devices to be discovered and show up in the interface. -If you are running into troubles while configuring Home Assistant, have a look at -[the configuration troubleshoot page](/getting-started/troubleshooting-configuration.html). +If you are running into troubles while configuring Home Assistant, have a look at [the configuration troubleshoot page](/getting-started/troubleshooting-configuration/). <p class='note'> You will have to restart Home Assistant for changes in <code>configuration.yaml</code> to take effect. @@ -30,9 +23,7 @@ If you are running into troubles while configuring Home Assistant, have a look a ### {% linkable_title Setting up the basic info %} -By default Home Assistant will try to detect your location and will automatically select a -temperature unit and time zone based on your location. You can overwrite this by adding the -following information to your `configuration.yaml`: +By default Home Assistant will try to detect your location and will automatically select a temperature unit and time zone based on your location. You can overwrite this by adding the following information to your `configuration.yaml`: ```yaml homeassistant: @@ -57,23 +48,19 @@ homeassistant: The first thing you want to add is a password for the web interface. Use your favourite text editor to open the file `/config/configuration.yaml` and add the following to the bottom: -``` +```yaml http: api_password: YOUR_PASSWORD ``` ### {% linkable_title Setting up your phone or tablet %} -Home Assistant runs as a self hosted web application. Home Assistant contains support to be added to your homescreen. If you're on Android you can follow [the visual guide]({{site_root}}/getting-started/android.html). For other devices, open Home Assistant on your mobile browser and click on the add to homescreen option. +Home Assistant runs as a self hosted web application. Home Assistant contains support to be added to your homescreen. If you're on Android you can follow [the visual guide]({{site_root}}/getting-started/android/). For other devices, open Home Assistant on your mobile browser and click on the add to homescreen option. ### {% linkable_title Remote access %} -To make Home Assistant accessible while away from home, you will have to setup port forwarding from -your router to port 8123 on the computer that is hosting Home Assistant. Instructions how to do this -can be found by searching `<Router model> port forwarding instructions`. +To make Home Assistant accessible while away from home, you will have to setup port forwarding from your router to port 8123 on the computer that is hosting Home Assistant. Instructions how to do this can be found by searching `<Router model> port forwarding instructions`. -Some internet service providers will only offer dynamic IPs. This can cause you to be unable to -access Home Assistant while being remote. You can solve this by using a free Dynamic DNS service -like [DuckDNS](https://www.duckdns.org/). +Some internet service providers will only offer dynamic IPs. This can cause you to be unable to access Home Assistant while being remote. You can solve this by using a free Dynamic DNS service like [DuckDNS](https://www.duckdns.org/). -###[Next step: Setting up devices »](/getting-started/devices.html) \ No newline at end of file +### [Next step: Setting up devices »](/getting-started/devices/) diff --git a/source/getting-started/devices.html b/source/getting-started/devices.html new file mode 100644 index 00000000000..08c042f5462 --- /dev/null +++ b/source/getting-started/devices.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/devices/';</script> \ No newline at end of file diff --git a/source/getting-started/devices.markdown b/source/getting-started/devices.markdown index dc051adc19d..99a3346eff8 100644 --- a/source/getting-started/devices.markdown +++ b/source/getting-started/devices.markdown @@ -9,25 +9,19 @@ sharing: true footer: true --- -Home Assistant will be able to automatically discover and configure any Google Chromecasts, Netgear -routers, Belkin WeMo switches, Philips Hue bridges and Sonos speakers in your network if you have -[the discovery component]({{site_root}}/components/discovery.html) enabled (which is by default). +Home Assistant will be able to automatically discover and configure any Google Chromecasts, Netgear routers, Belkin WeMo switches, Philips Hue bridges and Sonos speakers in your network if you have [the discovery component]({{site_root}}/components/discovery/) enabled (which is by default). + +See the [components overview page](/components/) to find installation instructions for your devices and services. Many components use the `sensor` platform. Sensors need to be added into the `configuration.yaml` as `sensor:`, `sensor 2:`, `sensor 3:`, etc. There should not be gaps in the sequence or your sensors might not load correctly. -See the [components overview page](/components/) to find installation instructions for your devices -and services. Many components use the `sensor` platform. Sensors need to be added into the `configuration.yaml` as `sensor:`, `sensor 2:`, `sensor 3:`, etc. There should not be gaps in the sequence or your sensors might not load correctly. <p class='note'> Most components that support multiple entries within the <code>configuration.yaml</code> follow the <code>component:</code>, <code>component 2:</code> format. </p> -If you can't find support for your favorite device or service, -[consider adding support](/developers/add_new_platform.html) +If you can't find support for your favorite device or service, [consider adding support](/developers/add_new_platform/) ### {% linkable_title Grouping devices %} -Once you get a bunch of devices set up, it is time to organize them. This can be done using groups. -Each group exists of a name and a list of entity IDs. Entity IDs can be retrieved from the web interface -by using the Set State page in the Developer Tools (icon in the middle). - +Once you get a bunch of devices set up, it is time to organize them. This can be done using groups. Each group exists of a name and a list of entity IDs. Entity IDs can be retrieved from the web interface by using the Set State page in the Developer Tools (icon in the middle). ```yaml # Example configuration.yaml entry @@ -40,9 +34,7 @@ group: ### {% linkable_title Customizing devices and services %} -By default, all of your devices will be visible and have a default icon determined by their domain. -You may find it desireable to customize the look and feel of your front page by altering some -of these parameters. This can be done by adding the following config to the `homeassistant:` section. +By default, all of your devices will be visible and have a default icon determined by their domain. You may find it desireable to customize the look and feel of your front page by altering some of these parameters. This can be done by adding the following config to the `homeassistant:` section. Entity_pictures, badges, device_tracker pictures, etc can either be a URL or `/local/file.jpg`, which points to directory `www` in the HASS configuration directory. @@ -59,5 +51,4 @@ homeassistant: friendly_name: My better name ``` - -###[Next step: Setting up presence detection »](/getting-started/presence-detection.html) +### [Next step: Setting up presence detection »](/getting-started/presence-detection/) diff --git a/source/getting-started/index.markdown b/source/getting-started/index.markdown index f876131c861..07efdba7857 100644 --- a/source/getting-started/index.markdown +++ b/source/getting-started/index.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -<div class='install-instructions-container'> +<div class='install-instructions-container' markdown='0'> <input name='install-instructions' type='radio' id='normal-install' checked> <input name='install-instructions' type='radio' id='raspberry-install'> <input name='install-instructions' type='radio' id='docker-install'> @@ -17,55 +17,48 @@ footer: true <label class='menu-selector raspberry' for='raspberry-install'>Install on a Raspberry Pi</label> <label class='menu-selector docker' for='docker-install'>Install using Docker</label> +<div class='install-instructions normal' markdown='1'> +Installing and running Home Assistant on your local machine is easy. Make sure you have [Python 3.4](https://www.python.org/downloads/) installed and execute the following code in a console: -<div class='install-instructions normal'> -Installing and running Home Assistant on your local machine is easy. Make sure you have <a href='https://www.python.org/downloads/' target="_blank">Python 3.4</a> installed and execute the following code in a console: - -<p> ```bash -pip3 install homeassistant -hass \-\-open-ui +$ pip3 install homeassistant +$ hass --open-ui ``` -</p> -<p>Running these commands will:</p> -<ol> -<li>Install Home Assistant</li> -<li>Launch Home Assistant and serve web interface on -<a href='http://localhost:8123' target="_blank">http://localhost:8123</a></li> -</ol> + +Running these commands will: + + - Install Home Assistant + - Launch Home Assistant and serve web interface on [http://localhost:8123](http://localhost:8123) + </div> <!-- INSTALL-INSTRUCTIONS NORMAL --> -<div class='install-instructions docker'> +<div class='install-instructions docker' markdown='1'> -Installation with Docker is straightforward. Adjust the following command so that `/path/to/your/config/` -points at the folder where you want to store your config and run it: +Installation with Docker is straightforward. Adjust the following command so that `/path/to/your/config/` points at the folder where you want to store your config and run it: ```bash -docker run -d \-\-name="home-assistant" -v /path/to/your/config:/config -v /etc/localtime:/etc/localtime:ro \-\-net=host balloob/home-assistant +$ docker run -d --name="home-assistant" -v /path/to/your/config:/config -v /etc/localtime:/etc/localtime:ro --net=host balloob/home-assistant ``` This will launch Home Assistant and serve its web interface from port 8123 on your Docker host. <p class='note'> -When using boot2docker on OS X you are unable to map the local time to your Docker container. Replace -<code>-v /etc/localtime:/etc/localtime:ro</code> with <code>-e "TZ=America/Los_Angeles"</code> -(replacing America/Los_Angeles with <a href='http://en.wikipedia.org/wiki/List_of_tz_database_time_zones' target="_blank">your timezone</a>) +When using boot2docker on OS X you are unable to map the local time to your Docker container. Replace `-v /etc/localtime:/etc/localtime:ro` with `-e "TZ=America/Los_Angeles"` (replacing America/Los_Angeles with [your timezone](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) </p> </div> <!-- INSTALL-INSTRUCTIONS DOCKER --> -<div class='install-instructions raspberry'> +<div class='install-instructions raspberry' markdown='1'> -Home Assistant requires the Raspberry Pi to run <a href='https://www.raspberrypi.org/downloads/raspbian/'>Raspbian Jessie</a>. -This version has been released on September 24, 2015 and comes by default with Python 3.4 which is required for Home Assistant. +Home Assistant requires the Raspberry Pi to run [Raspbian Jessie](https://www.raspberrypi.org/downloads/raspbian/). This version has been released on September 24, 2015 and comes by default with Python 3.4 which is required for Home Assistant. Execute the following code in a console: ```bash -pip3 install homeassistant -hass \-\-open-ui +$ pip3 install homeassistant +$ hass --open-ui ``` Running these commands will: @@ -74,28 +67,23 @@ Running these commands will: - Launch Home Assistant and serve web interface on [http://localhost:8123](http://localhost:8123) </div> <!-- INSTALL-INSTRUCTIONS RASPBERRY --> +</div> ### {% linkable_title Troubleshooting %} -If you run into any issues, please see [the troubleshooting page](/getting-started/troubleshooting.html). It contains solutions to many of the more commonly encountered issues. +If you run into any issues, please see [the troubleshooting page](/getting-started/troubleshooting/). It contains solutions to many of the more commonly encountered issues. For additional help, in addition to this site, there are three sources: - [Gitter Chatroom](https://gitter.im/balloob/home-assistant) for general Home Assistant discussions and questions. - [Development Mailing List](https://groups.google.com/forum/#!forum/home-assistant-dev) for development related questions and discussing new features. - - [GitHub Page](https://github.com/balloob/home-assistant) for issue reporting. + - [GitHub Page](https://github.com/balloob/home-assistant/issues) for issue reporting. -### {% linkable_title What's next %} -If you want to have Home Assistant start on boot, [autostart instructions](/getting-started/autostart.html) can be found here. +### What's next +If you want to have Home Assistant start on boot, [autostart instructions](/getting-started/autostart/) can be found here. -To see what Home Assistant can do, launch demo mode: -```bash -hass \-\-demo-mode -``` +To see what Home Assistant can do, launch demo mode: `hass --demo-mode` -To update Home Assistant to the latest release: -```bash -pip3 install \-\-upgrade homeassistant -``` +To update Home Assistant to the latest release: `pip3 install --upgrade homeassistant` -###[Next step: Configuring Home Assistant »](/getting-started/configuration.html) +### [Next step: Configuring Home Assistant »](/getting-started/configuration/) diff --git a/source/getting-started/presence-detection.html b/source/getting-started/presence-detection.html new file mode 100644 index 00000000000..0075b0e134c --- /dev/null +++ b/source/getting-started/presence-detection.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/presence-detection/';</script> \ No newline at end of file diff --git a/source/getting-started/presence-detection.markdown b/source/getting-started/presence-detection.markdown index 949dc4afd7b..546551e3a84 100644 --- a/source/getting-started/presence-detection.markdown +++ b/source/getting-started/presence-detection.markdown @@ -13,9 +13,7 @@ footer: true We care about privacy. Collected data is <b>only</b> stored in your instance of Home Assistant. </p> -Presence detection detects if people are home, an important input for automation. The most important -piece of information is to know if anyone is home. But knowing who is home or where they are will open -a whole range of other automation options: +Presence detection detects if people are home, an important input for automation. The most important piece of information is to know if anyone is home. But knowing who is home or where they are will open a whole range of other automation options: - Send me a notification when the kid arrives at school - Turn on AC when I leave work @@ -27,19 +25,11 @@ Screenshot of Home Assistant showing a school, work and home zone and two people ## {% linkable_title Setting it up %} -The device tracker component offers presence detection for Home Assistant. It supports two different -methods for presence detection: scan for connected devices on the local network and connect to third -party service. +The device tracker component offers presence detection for Home Assistant. It supports two different methods for presence detection: scan for connected devices on the local network and connect to third party service. -Scanning for connected devices is easy to setup. See the instructions for our [supported routers][routers] -or [scan the network using nmap][nmap]. This approach does have its limitations. It will only be able -to detect if a device is home. It also struggles with iPhones because they disconnect from the WiFi if -idle, marking them as not home while they are not. +Scanning for connected devices is easy to setup. See the instructions for our [supported routers][routers] or [scan the network using nmap][nmap]. This approach does have its limitations. It will only be able to detect if a device is home. It also struggles with iPhones because they disconnect from the WiFi if idle, marking them as not home while they are not. -Home Assistant currently supports one third party service for presence detection: [OwnTracks](http://www.owntracks.org). -OwnTracks is an app that you install on your iPhone or Android phone that allows you to push the location -of your device to Home Assistant using an MQTT broker. An MQTT broker is an Internet of Things communication -platform that you can [freely host yourself][mqtt-self] or get [a private instance for free in the cloud](/components/mqtt.html#run-your-own). +Home Assistant currently supports one third party service for presence detection: [OwnTracks](http://www.owntracks.org). OwnTracks is an app that you install on your iPhone or Android phone that allows you to push the location of your device to Home Assistant using an MQTT broker. An MQTT broker is an Internet of Things communication platform that you can [freely host yourself][mqtt-self] or get [a private instance for free in the cloud](/components/mqtt/#run-your-own). <p class='note'> OwnTracks communicates directly with your MQTT broker, no data will pass through their servers. @@ -48,19 +38,17 @@ OwnTracks communicates directly with your MQTT broker, no data will pass through #### {% linkable_title Zones %} <img src='/images/screenshots/badges-zone.png' style='float: right; margin-left: 8px; height: 100px;'> -Home Assistant will know about the location for your device if you are using OwnTracks. By [setting up -zones][zone] you will be able to add names to locations of your devices. This way you can easily -spot on the state page where the people in your house are and use it as [triggers][trigger] and -[conditions][condition] for automation. -###[Next step: Setting up automation »](/getting-started/automation.html) +Home Assistant will know about the location for your device if you are using OwnTracks. By [setting up zones][zone] you will be able to add names to locations of your devices. This way you can easily spot on the state page where the people in your house are and use it as [triggers][trigger] and [conditions][condition] for automation. -[routers]: /components/#presence -[nmap]: /components/device_tracker.nmap_scanner.html -[ha-owntracks]: /components/device_tracker.owntracks.html -[mqtt-self]: /components/mqtt.html#run-your-own -[mqtt-cloud]: /components/mqtt.html#cloudmqtt -[zone]: /components/zone.html -[trigger]: /components/automation.html#zone-trigger -[condition]: /components/automation.html#zone-condition +### [Next step: Setting up automation »](/getting-started/automation/) + +[routers]: /components/#presence-detection +[nmap]: /components/device_tracker.nmap_scanner/ +[ha-owntracks]: /components/device_tracker.owntracks/ +[mqtt-self]: /components/mqtt/#run-your-own +[mqtt-cloud]: /components/mqtt/#cloudmqtt +[zone]: /components/zone/ +[trigger]: /components/automation/#zone-trigger +[condition]: /components/automation/#zone-condition diff --git a/source/getting-started/troubleshooting-configuration.html b/source/getting-started/troubleshooting-configuration.html new file mode 100644 index 00000000000..ceee1595d09 --- /dev/null +++ b/source/getting-started/troubleshooting-configuration.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/troubleshooting-configuration/';</script> \ No newline at end of file diff --git a/source/getting-started/troubleshooting-configuration.markdown b/source/getting-started/troubleshooting-configuration.markdown index a434cd86964..69e5de8b6cf 100644 --- a/source/getting-started/troubleshooting-configuration.markdown +++ b/source/getting-started/troubleshooting-configuration.markdown @@ -9,23 +9,17 @@ sharing: true footer: true --- -It can happen that you run into trouble while configuring Home Assistant. A component is not -showing up or is acting weird. This page will discuss a few of the most common problems. +It can happen that you run into trouble while configuring Home Assistant. A component is not showing up or is acting weird. This page will discuss a few of the most common problems. -Before we dive into common issues, make sure you know where your configuration directory is. -Home Assistant will print out the configuration directory it is using when starting up. +Before we dive into common issues, make sure you know where your configuration directory is. Home Assistant will print out the configuration directory it is using when starting up. -Whenever a component or configuration option results in a warning, it will be stored in -`home-assistant.log`. This file is reset on start of Home Assistant. +Whenever a component or configuration option results in a warning, it will be stored in `home-assistant.log`. This file is reset on start of Home Assistant. ### {% linkable_title YAML %} -Home Assistant uses the YAML syntax for configuration. YAML can be confusing at start but it is really -powerful in allowing you to express complex configurations. +Home Assistant uses the YAML syntax for configuration. YAML can be confusing at start but it is really powerful in allowing you to express complex configurations. -The basics of YAML are lists and lookup tables containing key-value pairs. Lists will have each item -start with a `-` while lookup tables will have the format `key: value`. The last value for a key is -used in case you specify a duplicate key. +The basics of YAML are lists and lookup tables containing key-value pairs. Lists will have each item start with a `-` while lookup tables will have the format `key: value`. The last value for a key is used in case you specify a duplicate key. ```yaml # A list @@ -52,26 +46,20 @@ sensor: state_topic: sensor2/topic ``` -Indentation is used to specify which objects are nested under one anohter. Getting the right indentation -can be tricky if you're not using an editor with a fixed width font. You can test your -configuration using [this online YAML parser](http://yaml-online-parser.appspot.com/). +Indentation is used to specify which objects are nested under one anohter. Getting the right indentation can be tricky if you're not using an editor with a fixed width font. You can test your configuration using [this online YAML parser](http://yaml-online-parser.appspot.com/). -To learn more about the quirks of YAML, read -[YAML IDIOSYNCRASIES](https://docs.saltstack.com/en/latest/topics/troubleshooting/yaml_idiosyncrasies.html) -by SaltStack. +To learn more about the quirks of YAML, read [YAML IDIOSYNCRASIES](https://docs.saltstack.com/en/latest/topics/troubleshooting/yaml_idiosyncrasies.html) by SaltStack. ### {% linkable_title My component does not show up %} -When a component does not show up, many different things can be the case. Before you try any of -these steps, make sure to look at the `home-assistant.log` file and see if there are any errors -related to your component you are trying to set up. -**Problems with the configuration<br>** -`configuration.yaml` does not allow multiple sections to have the same name. If you want a - specific component to be loaded twice, append a number to the name. +When a component does not show up, many different things can be the case. Before you try any of these steps, make sure to look at the `home-assistant.log` file and see if there are any errors related to your component you are trying to set up. + +**Problems with the configuration** +`configuration.yaml` does not allow multiple sections to have the same name. If you want a specific component to be loaded twice, append a number to the name. ```yaml sensor: - platform: mqtt + platform: forecast […] sensor 2: @@ -79,27 +67,18 @@ sensor 2: […] ``` -Another common problem is that a required configuration setting is missing. If this is the -case, the component will report this to `home-assistant.log`. You can have a look at -[the component page](/components/) for instructions how to setup the components. +Another common problem is that a required configuration setting is missing. If this is the case, the component will report this to `home-assistant.log`. You can have a look at [the component page](/components/) for instructions how to setup the components. -If you find any errors or want to expand the documentation, please -[let us know](https://github.com/balloob/home-assistant.io/issues). +If you find any errors or want to expand the documentation, please [let us know](https://github.com/balloob/home-assistant.io/issues). -**Problems with dependencies<br>** -Almost all components have external dependencies to communicate with your devices and services. -Sometimes Home Assistant is unable to install the necessary dependencies. If this is the case, it -should show up in `home-assistant.log`. +**Problems with dependencies** +Almost all components have external dependencies to communicate with your devices and services. Sometimes Home Assistant is unable to install the necessary dependencies. If this is the case, it should show up in `home-assistant.log`. -First step is trying to restart Home Assistant and see if the problem persists. If it does, please -[report it](https://github.com/balloob/home-assistant/issues) so we can investigate what is going on. +First step is trying to restart Home Assistant and see if the problem persists. If it does, please [report it](https://github.com/balloob/home-assistant/issues) so we can investigate what is going on. -**Problems with components<br>** -It can happen that some components either do not work right away or stop working after Home -Assistant has been running for a while. If this happens to you, please -[report it](https://github.com/balloob/home-assistant/issues) so that we can have a look. +**Problems with components** +It can happen that some components either do not work right away or stop working after Home Assistant has been running for a while. If this happens to you, please [report it](https://github.com/balloob/home-assistant/issues) so that we can have a look. <p class='note'> -Whenever you report an issue, be aware that we are a group of volunteers that do not have access to -every single device in the world nor unlimited time to fix every problem out there. +Whenever you report an issue, be aware that we are a group of volunteers that do not have access to every single device in the world nor unlimited time to fix every problem out there. </p> diff --git a/source/getting-started/troubleshooting.html b/source/getting-started/troubleshooting.html new file mode 100644 index 00000000000..ade8aa3e8ea --- /dev/null +++ b/source/getting-started/troubleshooting.html @@ -0,0 +1 @@ +<script>document.location = '/getting-started/troubleshooting/';</script> \ No newline at end of file diff --git a/source/getting-started/troubleshooting.markdown b/source/getting-started/troubleshooting.markdown index 4192c68802e..34b427c23b5 100644 --- a/source/getting-started/troubleshooting.markdown +++ b/source/getting-started/troubleshooting.markdown @@ -12,60 +12,61 @@ footer: true It can happen that you run into trouble while installing Home Assistant. This page is here to help you figure out the most common problems. -**pip3: command not found**<br> -This utility should have been installed as part of the Python 3.4 installation. Check if Python 3.4 -is installed by running `python3 --version`. If it is not installed, -[download it here](https://www.python.org/getit/). +**pip3: command not found** +This utility should have been installed as part of the Python 3.4 installation. Check if Python 3.4 is installed by running `python3 --version`. If it is not installed, [download it here](https://www.python.org/getit/). -If you are able to successfully run `python3 --version` but not `pip3`, run the following command instead -to install Home Assistant: `python3 -m pip install homeassistant`. +If you are able to successfully run `python3 --version` but not `pip3`, run the following command instead to install Home Assistant: -**No module named pip**<br> -[Pip](https://pip.pypa.io/en/stable/) should come bundled with the latest Python 3 but is ommitted -by some distributions. If you are unable to run `python3 -m pip --version` you can install `pip` by -[downloading the installer](https://bootstrap.pypa.io/get-pip.py) and run it with Python 3: -`python3 get-pip.py`. +```bash +$ python3 -m pip install homeassistant +``` -**distutils.errors.DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both**<br> -This is a known issue if you're on a Mac using Homebrew to install Python. Please follow -[these instructions](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Homebrew-and-Python.md#note-on-pip-install---user) -to resolve it. +**No module named pip** +[Pip](https://pip.pypa.io/en/stable/) should come bundled with the latest Python 3 but is ommitted by some distributions. If you are unable to run `python3 -m pip --version` you can install `pip` by [downloading the installer](https://bootstrap.pypa.io/get-pip.py) and run it with Python 3: -**CentOS and Python 3**<br> -To run Python 3.x on [CentOS](https://www.centos.org/) or RHEL, [Software Collections](https://www.softwarecollections.org/en/scls/rhscl/rh-python34/) needs to be activated.</p> +```bash +$ python3 get-pip.py +``` -**Run the development version**<br> -If you want to stay on top of the development of Home Assistant then you can upgrade to the dev branch using -`pip3 install --upgrade git+git://github.com/balloob/home-assistant.git@dev`. Keep in mind, that stable releases -of Home Assistant are published often. +**distutils.errors.DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both** +This is a known issue if you're on a Mac using Homebrew to install Python. Please follow [these instructions](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Homebrew-and-Python.md#note-on-pip-install---user) to resolve it. -**No access to the frontend**<br> -In newer Linux distributions (at least Fedora 22/CentOS 7) the access to a host is very limited. -This means that you can't access the Home Assistant Frontend that is running on a host outside of the -host machine. Windows and OSX machines may also have issues with this. +**CentOS and Python 3** +To run Python 3.x on [CentOS](https://www.centos.org/) or RHEL, [Software Collections](https://www.softwarecollections.org/en/scls/rhscl/rh-python34/) needs to be activated. -To fix this you will need to open your machine's firewall for TCP traffic over port 8123. The method -for doing this will vary depending on your operating system and the firewall you have installed. -Below are some suggestions to try. Google is your friend here. +**No access to the frontend** +In newer Linux distributions (at least Fedora 22/CentOS 7) the access to a host is very limited. This means that you can't access the Home Assistant Frontend that is running on a host outside of the host machine. Windows and OSX machines may also have issues with this. -[Windows instructions](http://windows.microsoft.com/en-us/windows/open-port-windows-firewall#1TC=windows-7)<br> +To fix this you will need to open your machine's firewall for TCP traffic over port 8123. The method for doing this will vary depending on your operating system and the firewall you have installed. Below are some suggestions to try. Google is your friend here. + +[Windows instructions](http://windows.microsoft.com/en-us/windows/open-port-windows-firewall#1TC=windows-7) [Mac OSX instructions](https://support.apple.com/en-us/HT201642) For firewalld systems (Fedora, RHEL, etc.): + ```bash -sudo firewall-cmd --permanent --add-port=8123/tcp -sudo firewall-cmd --reload +$ sudo firewall-cmd --permanent --add-port=8123/tcp +$ sudo firewall-cmd --reload ``` For UFW systems (Ubuntu, Debian, Raspbian, etc.): + ```bash -sudo ufw allow 8123/tcp +$ sudo ufw allow 8123/tcp ``` For iptables systems (usually the default): + ```bash -iptables -I INPUT -p tcp --dport 8123 -j ACCEPT -iptables-save > /etc/network/iptables.rules # your rules may be saved elsewhere +$ iptables -I INPUT -p tcp --dport 8123 -j ACCEPT +$ iptables-save > /etc/network/iptables.rules # your rules may be saved elsewhere ``` -###[« Back to Getting Started](/getting-started/index.html) +**Run the development version** +If you want to stay on top of the development of Home Assistant then you can upgrade to the dev branch. This can result in an unstable system, loss of data etc etc. + +```bash +$ pip3 install --upgrade git+git://github.com/balloob/home-assistant.git@dev +``` + +### [« Back to Getting Started](/getting-started/index/)