Upgrade ruby/jekyll/style

This commit is contained in:
Paulus Schoutsen 2016-08-22 01:01:04 -07:00
parent ad565e855d
commit 5f1b5997da
33 changed files with 329 additions and 950 deletions

View File

@ -1 +1 @@
2.2.3
2.3.1

10
Gemfile
View File

@ -5,13 +5,13 @@ group :development do
gem 'jekyll', '~> 3.0'
gem 'pygments.rb', '~> 0.6.3'
gem 'rdiscount', '~> 2.0'
gem 'RedCloth', '~> 4.2.9'
gem 'RedCloth', '~> 4.2'
gem 'haml', '~> 4.0'
gem 'compass', '~> 0.12.2'
gem 'sass-globbing', '~> 1.0.0'
gem 'rubypants', '~> 0.2.0'
gem 'compass', '~> 0.12'
gem 'sass-globbing', '~> 1.0'
gem 'rubypants', '~> 0.2'
gem 'rb-fsevent', '~> 0.9'
gem 'stringex', '~> 1.4.0'
gem 'stringex', '~> 1.4'
gem 'execjs'
gem 'therubyracer', :platforms => :ruby
gem 'coderay'

View File

@ -1,43 +1,47 @@
GEM
remote: https://rubygems.org/
specs:
RedCloth (4.2.9)
chunky_png (1.3.5)
coderay (1.1.0)
colorator (0.1)
RedCloth (4.3.2)
addressable (2.4.0)
chunky_png (1.3.6)
coderay (1.1.1)
colorator (1.1.0)
compass (0.12.7)
chunky_png (~> 1.2)
fssm (>= 0.2.7)
sass (~> 3.2.19)
execjs (2.6.0)
ffi (1.9.10)
execjs (2.7.0)
ffi (1.9.14)
forwardable-extended (2.6.0)
fssm (0.2.10)
haml (4.0.7)
tilt
jekyll (3.0.0)
colorator (~> 0.1)
jekyll (3.2.1)
colorator (~> 1.0)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 1.1)
kramdown (~> 1.3)
liquid (~> 3.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (~> 1.7)
safe_yaml (~> 1.0)
jekyll-paginate (1.1.0)
jekyll-sass-converter (1.3.0)
sass (~> 3.2)
jekyll-sitemap (0.9.0)
jekyll-time-to-read (0.1.1)
jekyll-sitemap (0.11.0)
addressable (~> 2.4.0)
jekyll-time-to-read (0.1.2)
jekyll
jekyll-watch (1.3.0)
listen (~> 3.0)
kramdown (1.9.0)
libv8 (3.16.14.13)
jekyll-watch (1.5.0)
listen (~> 3.0, < 3.1)
kramdown (1.12.0)
libv8 (3.16.14.15)
liquid (3.0.6)
listen (3.0.3)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
mercenary (0.3.5)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
mercenary (0.3.6)
method_source (0.8.2)
octopress (3.0.11)
jekyll (>= 2.0)
@ -49,8 +53,8 @@ GEM
titlecase
octopress-deploy (1.3.0)
colorator
octopress-escape-code (2.0.6)
octopress-hooks (~> 2.0)
octopress-escape-code (2.1.1)
jekyll (~> 3.0)
octopress-filters (1.4.0)
jekyll
octopress-hooks (~> 2.0)
@ -63,8 +67,10 @@ GEM
octopress-tag-helpers (~> 1.0)
octopress-tag-helpers (1.0.8)
jekyll (>= 2.0)
pathutil (0.14.0)
forwardable-extended (~> 2.6)
posix-spawn (0.3.11)
pry (0.10.3)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
@ -74,30 +80,30 @@ GEM
rack (1.6.4)
rack-protection (1.5.3)
rack
rake (10.4.2)
rb-fsevent (0.9.6)
rb-inotify (0.9.5)
rake (10.5.0)
rb-fsevent (0.9.7)
rb-inotify (0.9.7)
ffi (>= 0.5.0)
rdiscount (2.1.8)
redcarpet (3.3.3)
rdiscount (2.2.0.1)
redcarpet (3.3.4)
ref (2.0.0)
rouge (1.10.1)
rubypants (0.2.0)
rouge (1.11.1)
rubypants (0.5.0)
rubypants-unicode (0.2.5)
safe_yaml (1.0.4)
sass (3.2.19)
sass-globbing (1.0.0)
sass-globbing (1.1.5)
sass (>= 3.1)
sinatra (1.4.6)
rack (~> 1.4)
sinatra (1.4.7)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
slop (3.6.0)
stringex (1.4.0)
stringex (1.5.1)
therubyracer (0.12.2)
libv8 (~> 3.16.14.0)
ref
tilt (2.0.1)
tilt (2.0.5)
titlecase (0.1.1)
yajl-ruby (1.2.1)
@ -105,9 +111,9 @@ PLATFORMS
ruby
DEPENDENCIES
RedCloth (~> 4.2.9)
RedCloth (~> 4.2)
coderay
compass (~> 0.12.2)
compass (~> 0.12)
execjs
haml (~> 4.0)
jekyll (~> 3.0)
@ -122,10 +128,10 @@ DEPENDENCIES
rake (~> 10.0)
rb-fsevent (~> 0.9)
rdiscount (~> 2.0)
rubypants (~> 0.2.0)
sass-globbing (~> 1.0.0)
rubypants (~> 0.2)
sass-globbing (~> 1.0)
sinatra (~> 1.4.2)
stringex (~> 1.4.0)
stringex (~> 1.4)
therubyracer
BUNDLED WITH

View File

@ -35,6 +35,8 @@ category_dir: blog/categories
markdown: kramdown
timezone: UTC
# highlighter: coderay
kramdown:
input: GFM
auto_ids: false
@ -43,15 +45,32 @@ kramdown:
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
# 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
# syntax_highlighter_opts:
# wrap: div
# line_numbers: nil
# line_number_start: 1
# tab_width: 4
# bold_every: 10
# css: class
# block:
# wrap: div
# line_numbers: nil
# line_number_start: 1
# tab_width: 4
# bold_every: 10
# css: class
highlighter: rouge

View File

@ -1,163 +0,0 @@
import os
dirs = ['components', 'getting-started', 'developers']
template = "<script>document.location = '/{}/{}/';</script>"
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

View File

@ -1,144 +0,0 @@
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; }

View File

@ -124,9 +124,12 @@ h6:hover a.title-link {
&::before {
position: absolute;
left: -50px;
top: 2px;
left: -25px;
padding-right: 40px;
font-family: "FontAwesome";
font-size: 15px;
color: #999;
content: "\f0c1"
}
}
@ -164,6 +167,9 @@ h6:hover a.title-link {
}
article.post, article.page, article.listing {
font-size: 1.125em;
line-height: 1.6;
img, table {
border-radius: 3px;
box-shadow: rgba(0,0,0,0.06) 0 0 10px;
@ -214,9 +220,25 @@ article.post, article.page, article.listing {
}
}
h1, h2, h3 {
margin-bottom: 4px;
line-height: 1.2;
h1 {
}
h2 {
font-size: 1.5em;
margin-top: 2em;
}
h3 {
text-transform: uppercase;
letter-spacing: 0.125rem;
font-size: 1.2rem;
margin-top: 2em;
}
h4 {
font-size: 1.1rem;
margin-top: 2em;
}
}

83
sass/custom/_syntax.scss Normal file
View File

@ -0,0 +1,83 @@
/* https://github.com/richleland/pygments-css/blob/master/github.css */
code.highlighter-rouge {
background: #fff;
font-size: .8em;
line-height: 1.5em;
color: #555;
border: 1px solid #ddd;
-webkit-border-radius: 0.4em;
-moz-border-radius: 0.4em;
border-radius: 0.4em;
padding: 0 .3em;
}
.highlight {
background-color: #FFF;
border: 1px solid #CCC;
font-family: "Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
color: #000;
padding: 1em 0px 1em 1em;
font-size: 15px;
}
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #999988; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #000000; font-weight: bold } /* Keyword */
.highlight .o { color: #000000; font-weight: bold } /* Operator */
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #999999 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #000000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #000000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #000000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: #000000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #009999 } /* Literal.Number */
.highlight .s { color: #d01040 } /* Literal.String */
.highlight .na { color: #008080 } /* Name.Attribute */
.highlight .nb { color: #0086B3 } /* Name.Builtin */
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
.highlight .no { color: #008080 } /* Name.Constant */
.highlight .nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #800080 } /* Name.Entity */
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
.highlight .nl { color: #990000; font-weight: bold } /* Name.Label */
.highlight .nn { color: #555555 } /* Name.Namespace */
.highlight .nt { color: #000080 } /* Name.Tag */
.highlight .nv { color: #008080 } /* Name.Variable */
.highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #009999 } /* Literal.Number.Float */
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
.highlight .sb { color: #d01040 } /* Literal.String.Backtick */
.highlight .sc { color: #d01040 } /* Literal.String.Char */
.highlight .sd { color: #d01040 } /* Literal.String.Doc */
.highlight .s2 { color: #d01040 } /* Literal.String.Double */
.highlight .se { color: #d01040 } /* Literal.String.Escape */
.highlight .sh { color: #d01040 } /* Literal.String.Heredoc */
.highlight .si { color: #d01040 } /* Literal.String.Interpol */
.highlight .sx { color: #d01040 } /* Literal.String.Other */
.highlight .sr { color: #009926 } /* Literal.String.Regex */
.highlight .s1 { color: #d01040 } /* Literal.String.Single */
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #008080 } /* Name.Variable.Class */
.highlight .vg { color: #008080 } /* Name.Variable.Global */
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */

View File

@ -1,3 +1,3 @@
@import 'oscailte/oscailte';
@import 'custom/paulus';
@import 'custom/coderay';
@import 'custom/syntax';

View File

@ -20,7 +20,7 @@ Amazon has released [Echosim], a website that simulates the Alexa service in you
[Echosim]: https://echosim.io/
### {% linkable_title I just want to turn devices on and off using Echo %}
## {% linkable_title I just want to turn devices on and off using Echo %}
If you just want to be able to turn anything with a switch (like lights, switches, media players, etc) on and off, check out Michael Auchter's [Haaska][haaska-github-link] which integrates the [Alexa Lighting API][alexa-lighting-api] into Home Assistant.
@ -47,7 +47,7 @@ In addition, you would need to build custom intents for each device and on/off c
Please note that you can use Haaska and the built-in Alexa component side-by-side without issue if you wish.
### {% linkable_title I want to build custom commands to use with Echo %}
## {% linkable_title I want to build custom commands to use with Echo %}
The built-in Alexa component allows you to integrate Home Assistant into Alexa/Amazon Echo. This component will allow you to query information and call services within Home Assistant by using your voice. Home Assistant offers no built-in sentences but offers a framework for you to define your own.
@ -55,7 +55,8 @@ The built-in Alexa component allows you to integrate Home Assistant into Alexa/A
<iframe width="560" height="315" src="https://www.youtube.com/embed/1Ke3mtWd_cQ" frameborder="0" allowfullscreen></iframe>
</div>
#### {% linkable_title Requirements before using %}
### {% linkable_title Requirements %}
Amazon requires the endpoint of a skill to be hosted via SSL. Self-signed certificates are ok because our skills will only run in development mode. Read more on [our blog][blog-lets-encrypt] about how to set up encryption for Home Assistant. If you are unable to get HTTPS up and running, consider using [this AWS Lambda proxy for Alexa skills](https://forums.developer.amazon.com/forums/thread.jspa?messageID=18604).
[blog-lets-encrypt]: https://home-assistant.io/blog/2015/12/13/setup-encryption-using-lets-encrypt/
@ -72,7 +73,7 @@ To get started with Alexa skills:
- https
- https://YOUR_HOST/api/alexa?api_password=YOUR_API_PASSWORD
#### {% linkable_title Configuring your Amazon Alexa skill %}
### {% linkable_title Configuring your Amazon Alexa skill %}
Alexa works based on intents. Each intent has a name and variable slots. For example, a `LocateIntent` with a slot that contains a `User`. Example intent schema:
@ -111,7 +112,7 @@ This means that we can now ask Alexa things like:
- Alexa, ask Home Assistant where Paul is
- Alexa, ask Home Assistant where we are
### {% linkable_title Configuring Home Assistant %}
## {% linkable_title Configuring Home Assistant %}
Out of the box, the component will do nothing. You have to teach it about all intents you want it to answer to. The way it works is that the answer for each intent is based on [templates] that you define. Each template will have access to the existing states via the `states` variable but will also have access to all variables defined in the intent.
@ -125,8 +126,7 @@ Actions are using the [Home Assistant Script Syntax] and also have access to the
Configuring the Alexa component for the above intents would look like this:
```yaml
{% raw %}
# Example configuration.yaml entry
{% raw %}# Example configuration.yaml entry
alexa:
intents:
WhereAreWeIntent:
@ -137,8 +137,8 @@ alexa:
is_state('device_tracker.anne_therese', 'home') -%}
You are both home, you silly
{%- else -%}
Anne Therese is at {{ states("device_tracker.anne_therese") }} and
Paulus is at {{ states("device_tracker.paulus") }}
Anne Therese is at {{ states("device_tracker.anne_therese") }}
and Paulus is at {{ states("device_tracker.paulus") }}
{% endif %}
LocateIntent:
@ -198,15 +198,14 @@ ActivateSceneIntent activate {Scene}
Then add the intent to your Alexa Section in your HA config file:
```yaml
{% raw %}
ActivateSceneIntent:
action:
service: scene.turn_on
data_template:
entity_id: scene.{{ Scene | replace(" ", "_") }}
entity_id: scene.{% raw %}{{ Scene | replace(" ", "_") }}{% endraw %}
speech:
type: plaintext
text: OK{% endraw %}
text: OK
```
Here we are using [templates] to take the name we gave to Alexa e.g. `downstairs on` and replace the space with an underscore so it becomes `downstairs_on` as Home Assistant expects.
@ -246,29 +245,26 @@ RunScriptIntent run {Script}
Then add the intent to your Alexa Section in your HA config file:
```yaml
{% raw %}
RunScriptIntent:
action:
service: script.turn_on
data_template:
entity_id: script.{{ Script | replace(" ", "_") }}
entity_id: script.{% raw %}{{ Script | replace(" ", "_") }}{% endraw %}
speech:
type: plaintext
text: OK{% endraw %}
text: OK
```
Now say `Alexa ask homeassistant to run <some script>` and Alexa will run that script for you.
### {% linkable_title Giving Alexa Some Personality%}
## {% linkable_title Giving Alexa Some Personality%}
In the examples above, we told Alexa to say `OK` when she succesfully completed the task. This is effective but a little dull! We can again use [templates] to spice things up a little.
First create a file called `alexa_confirm.yaml` with something like the following in it (go on, be creative!):
```text
{% raw %}
>
{% raw %} >
{{ [
"OK",
"Sure",

View File

@ -16,7 +16,7 @@ Integrates MySensors binary sensors into Home Assistant. See the [main component
The following sensor types are supported:
##### MySensors version 1.4 and higher
#### MySensors version 1.4 and higher
S_TYPE | V_TYPE
-------------------|---------------------------------------
@ -24,7 +24,7 @@ S_DOOR | V_TRIPPED
S_MOTION | V_TRIPPED
S_SMOKE | V_TRIPPED
##### MySensors version 1.5 and higher
#### MySensors version 1.5 and higher
S_TYPE | V_TYPE
---------------|----------------------------------

View File

@ -79,7 +79,7 @@ Solar elevation automations can cope with offsets from sunset / sunrise as the s
trigger:
platform: numeric_state
entity_id: sun.sun
value_template: '{{ "{{ state.attributes.elevation ""}}}}'
value_template: '{% raw %}{{ state.attributes.elevation }}{% endraw %}'
below: 3.5
action:
service: scene.turn_on
@ -89,7 +89,7 @@ Solar elevation automations can cope with offsets from sunset / sunrise as the s
trigger:
platform: numeric_state
entity_id: sun.sun
value_template: '{{ "{{ state.attributes.elevation ""}}}}'
value_template: '{% raw %}{{ state.attributes.elevation }}{% end raw %}'
below: 1.5
action:
service: scene.turn_on
@ -99,7 +99,7 @@ Solar elevation automations can cope with offsets from sunset / sunrise as the s
trigger:
platform: numeric_state
entity_id: sun.sun
value_template: '{{ "{{ state.attributes.elevation ""}}}}'
value_template: '{% raw %}{{ state.attributes.elevation }}{% endraw %}'
below: -2.5
action:
service: switch.turn_off

View File

@ -1,446 +0,0 @@
homeassistant:
# Name of the location where Home Assistant is running
name: example.com
# Location required to calculate the time the sun rises and sets
latitude: 37
longitude: -121
# 'metric' for Metric, 'imperial' for Imperial
unit_system: imperial
# Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
time_zone: America/Los_Angeles
customize:
switch.aeon_labs_smart_energy_switch_switch_2:
friendly_name: Mac Switch-Meter
switch.leviton_unknown_type1a02_id0334_switch_3:
friendly_name: W Nightstand
entity_picture: /local/zwvapl.jpg
switch.hub_switch:
friendly_name: Wink Hub Switch
entity_picture: /local/wemoswitch.jpg
switch.leviton_unknown_type1a02_id0334_switch_4:
friendly_name: Christmas Tree
entity_picture: /local/zwvapl.jpg
switch.leviton_unknown_type1a02_id0334_switch_5:
friendly_name: Roof Lights
entity_picture: /local/zwvapl.jpg
light.w_bedroom_ceiling_:
friendly_name: Will's Bedroom Ceiling Lights (Wink)
entity_picture: /local/casetta.jpg
light.living_room_wall_:
friendly_name: Living Room Couch Lights (Wink)
entity_picture: /local/casetta.jpg
media_player.my_shield_android_tv:
friendly_name: Dalek (Cast)
entity_picture: /local/shieldtv.jpg
media_player.chromecast:
friendly_name: Jeff chromecast
entity_picture: /local/chromecast.jpg
media_player.kodi:
friendly_name: Tardis-Win7 (Kodi)
entity_picture: /local/kodi.png
media_player.kodi_2:
friendly_name: Dalek (Kodi)
media_player.roku_2_xd__12a18n045363:
friendly_name: Parents Roku
entity_picture: /local/roku2xd.jpg
sensor.aeon_labs_smart_energy_switch_power_2:
friendly_name: Mac Usage (W)
sensor.aeon_labs_smart_energy_switch_previous_reading_2:
friendly_name: Mac Usage Previous (W)
hidden: true
sensor.aeon_labs_smart_energy_switch_energy_2:
friendly_name: Mac Usage (kWh)
hidden: true
#####################
## GROUPS
#####################
group:
w_bedroom:
- switch.leviton_unknown_type1a02_id0334_switch_3
- light.w_bedroom_ceiling_
christmas:
- switch.leviton_unknown_type1a02_id0334_switch_4
- switch.leviton_unknown_type1a02_id0334_switch_5
almanac:
- sensor.date
- sensor.time
- sensor.time_utc
- sun.sun
tracker:
- device_tracker.will_wnexus
# OpenWeatherMap:
# - sensor.weather_temperature
# - sensor.weather_humidity
# - sensor.weather_pressure
# - sensor.weather_rain
# - sensor.weather_wind_speed
# - sensor.weather_cloud_coverage
# - sensor.weather_forecast
Meteobridge:
- sensor.outdoor_temp_meteobridge
- sensor.outdoor_humidity_meteobridge
- sensor.outdoor_dewpoint_meteobridge
- sensor.precip_rate_meteobridge
- sensor.wind_direction_meteobridge
- sensor.wind_gust_meteohub
- sensor.wind_chill_meteobridge
- sensor.wind_speed_meteobridge
- sensor.indoor_dewpoint_meteobridge
- sensor.indoor_humidity_meteobridge
- sensor.indoor_temp_meteobridge
- sensor.precip_change_meteobridge
- sensor.precip_total_meteobridge
- sensor.sea_level_pressure_meteobridge
- sensor.barometric_pressure_meteobridge
####################
## ZONES
####################
zone:
name: Home
latitude: 37
longitude: -121
radius: 200
icon: mdi:home
zone 2:
name: Barracuda_(SJ)
latitude: 37
longitude: -121
radius: 100
zone 3:
name: SFC
latitude: 37
longitude: -122
radius: 95
####################
## NOTIFICATIONS
####################
####################
## AUTOMATION
####################
automation:
#- alias: 'W_at_work'
# trigger:
# - platform: zone
# entity_id: device_tracker.will_wnexus
# zone: zone.barracuda_sj
# event: enter
# - platform: time
# after: '07:15'
# before: '09:00'
# action:
# service: ifttt.trigger
# data: {"event":"hassnotification_dadsms", "value1": "Will's at Work"}
- alias: "Update_Update"
trigger:
platform: state
entity_id: updater.updater
action:
service: ifttt.trigger
data: {"event":"hassnotification_willsms","value1":"HASS has an update"}
- alias: 'Christmas Roof ON'
trigger:
platform: sun
event: sunset
offset: '-01:00:00'
action:
service: homeassistant.turn_on
entity_id: switch.leviton_unknown_type1a02_id0334_switch_5
- alias: 'Christmas Roof OFF'
trigger:
platform: time
hours: 1
minutes: 0
seconds: 0
action:
service: homeassistant.turn_off
entity_id: switch.leviton_unknown_type1a02_id0334_switch_5
- alias: 'Christmas Tree ON'
trigger:
platform: time
hours: 8
minutes: 0
seconds: 0
action:
service: homeassistant.turn_on
entity_id: switch.leviton_unknown_type1a02_id0334_switch_4
- alias: 'Christmas Tree (OFF)'
trigger:
platform: time
hours: 23
minutes: 0
seconds: 0
action:
service: homeassistant.turn_off
entity_id: switch.leviton_unknown_type1a02_id0334_switch_4
#- alias: test notify
# trigger:
# platform: time
# minutes: '/5' #every 5 min
# action:
# service: notify.pushEtta
# data:
# message: 5 Min Test
#################################
### COMPONENTS ###
#################################
#discovery:
sun:
#updater:
history:
#conversation:
frontend:
logbook:
http:
api_password: Austin12#
server_port: 8123
ssl_certificate: /etc/letsencrypt/live/example.com/fullchain.pem
ssl_key: /etc/letsencrypt/live/example.com/privkey.pem
ifttt:
key: gm3dAtxwX8RpbA793mHWbK1bftO1wgScKt0ZHiT9GyC
media_player 1:
platform: plex
#media_player 2:
# platform: squeezebox
# host: 192.168.2.80
# port: 9000
media_player 3:
platform: cast
media_player 4:
platform: kodi
url: http://192.168.2.129:8080/jsonrpc
user: kodi
password: kodi
media_player 5:
platform: plex
media_player 6:
platform: kodi
url: http://192.168.2.165/jsonrpc
media_player 7:
platform: samsungtv
host: 192.168.2.90
name: Parents TV
wink:
access_token: cf83448f669cd3acd3b969b063028565
refresh_token: 6213c8a1d519d864e08b7364c91eaf22
zwave:
usb_path: /dev/ttyUSB0
config_path: /usr/local/share/python-openzwave/config
polling_interval: 10000
#zigbee:
# device: /dev/ttyUSB1
# baud: 115200
mqtt:
broker: 127.0.0.1
port: 8883
username: hass
password: austin
device_tracker 1:
platform: owntracks
track_new_devices: yes
interval_seconds: 40
consider_home: 120
device_tracker 2:
platform: nmap_tracker
hosts: 192.168.2.0/24
home_interval: 3
#sensor:
# platform: openweathermap
# api_key: b693a8bb2f60dcedc7b4bf33649ed4f1
# forecast: 1
# monitored_conditions:
# - temperature
# - wind_speed
# - humidity
# - pressure
# - clouds
# - rain
sensor 2:
platform: time_date
display_options:
- 'time'
- 'date'
- 'time_utc'
### BEGIN METEO SENSORS ###
sensor 3:
platform: tcp
name: Outdoor Temp (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[2]}}"
unit: C
sensor 4:
platform: tcp
name: Outdoor Humidity (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[3]}}"
unit: Percent
sensor 5:
platform: tcp
name: Outdoor Dewpoint (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[4] }}"
unit: C
sensor 6:
platform: tcp
name: Wind Direction (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[7]}}"
unit: Degrees
sensor 7:
platform: tcp
name: Wind Gust (Meteohub)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[8]}}"
unit: m/s
sensor 8:
platform: tcp
name: Wind Speed (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[9]}}"
unit: m/s
sensor 9:
platform: tcp
name: Wind Chill (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[10]}}"
unit: C
sensor 10:
platform: tcp
name: Precip Rate (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[13]}}"
unit: mm/hr
sensor 11:
platform: tcp
name: Precip Total (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[14]}}"
unit: mm
sensor 12:
platform: tcp
name: Precip Change (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[15]}}"
unit: mm
sensor 13:
platform: tcp
name: Indoor Temp (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[18]}}"
unit: C
sensor 14:
platform: tcp
name: Indoor Humidity (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[19]}}"
unit: percent
sensor 15:
platform: tcp
name: Indoor Dewpoint (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[20]}}"
unit: C
sensor 16:
platform: tcp
name: Barometric Pressure (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[21]}}"
unit: mb
sensor 17:
platform: tcp
name: Sea Level Pressure (Meteobridge)
host: 192.168.2.82
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[22]}}"
unit: mb
sensor 18:
platform: steam_online
api_key: [Redact]
accounts:
- 76561198012067051
switch:
platform: wemo

View File

@ -306,7 +306,7 @@ sensor 3:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[2]}}"
value_template: "{% raw %}{{value.split (' ')[2]}}{% endraw %}"
unit: C
sensor 4:
@ -316,7 +316,7 @@ sensor 4:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[3]}}"
value_template: "{% raw %}{{value.split (' ')[3]}}{% endraw %}"
unit: Percent
sensor 5:
@ -326,7 +326,7 @@ sensor 5:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[4] }}"
value_template: "{% raw %}{{value.split (' ')[4] }}{% endraw %}"
unit: C
sensor 6:
@ -336,7 +336,7 @@ sensor 6:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[7]}}"
value_template: "{% raw %}{{value.split (' ')[7]}}{% endraw %}"
unit: Degrees
sensor 7:
@ -346,7 +346,7 @@ sensor 7:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[8]}}"
value_template: "{% raw %}{{value.split (' ')[8]}}{% endraw %}"
unit: m/s
sensor 8:
@ -356,7 +356,7 @@ sensor 8:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[9]}}"
value_template: "{% raw %}{{value.split (' ')[9]}}{% endraw %}"
unit: m/s
sensor 9:
@ -366,7 +366,7 @@ sensor 9:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[10]}}"
value_template: "{% raw %}{{value.split (' ')[10]}}{% endraw %}"
unit: C
sensor 10:
@ -376,7 +376,7 @@ sensor 10:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[13]}}"
value_template: "{% raw %}{{value.split (' ')[13]}}{% endraw %}"
unit: mm/hr
sensor 11:
@ -386,7 +386,7 @@ sensor 11:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[14]}}"
value_template: "{% raw %}{{value.split (' ')[14]}}{% endraw %}"
unit: mm
sensor 12:
@ -396,7 +396,7 @@ sensor 12:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[15]}}"
value_template: "{% raw %}{{value.split (' ')[15]}}{% endraw %}"
unit: mm
sensor 13:
@ -406,7 +406,7 @@ sensor 13:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[18]}}"
value_template: "{% raw %}{{value.split (' ')[18]}}{% endraw %}"
unit: C
sensor 14:
@ -416,7 +416,7 @@ sensor 14:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[19]}}"
value_template: "{% raw %}{{value.split (' ')[19]}}{% endraw %}"
unit: percent
sensor 15:
@ -426,7 +426,7 @@ sensor 15:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[20]}}"
value_template: "{% raw %}{{value.split (' ')[20]}}{% endraw %}"
unit: C
sensor 16:
@ -436,7 +436,7 @@ sensor 16:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[21]}}"
value_template: "{% raw %}{{value.split (' ')[21]}}{% endraw %}"
unit: mb
sensor 17:
@ -446,7 +446,7 @@ sensor 17:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charaset=UTF-8\n\n"
value_template: "{{value.split (' ')[22]}}"
value_template: "{% raw %}{{value.split (' ')[22]}}{% endraw %}"
unit: mb
sensor 18:

View File

@ -28,7 +28,7 @@ switch:
oncmd: 'curl -k "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig&isEnable=1&usr=admin&pwd=password"'
offcmd: 'curl -k "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig&isEnable=0&usr=admin&pwd=password"'
statecmd: 'curl -k --silent "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=getMotionDetectConfig&usr=admin&pwd=password" | grep -oP "(?<=isEnable>).*?(?=</isEnable>)"'
value_template: '{{ value == "1" }}'
value_template: '{% raw %}{{ value == "1" }}{% endraw %}'
```
The service `shell_command.foscam_turn_off` sets the camera to point down and away to indicate it is not recording, and `shell_command.foscam_turn_on` sets the camera to point where I'd like to record. h of these services require preset points to be added to your camera. See source above for additional information.

View File

@ -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 | markdownify | cdata_escape }}]]></content>
<content type="html"><![CDATA[{{ post.content | full_urls | cdata_escape }}]]></content>
</entry>
{% endfor %}
</feed>

View File

@ -61,7 +61,7 @@ Alrighty, it's time for Home Assistant 0.10. A lot amazing things have changed a
This release introduces templates. This will allow you to parse data before it gets processed or create messages for notifications on the fly based on data within Home Assistant. The notification component and the new Alexa/Amazon Echo component are both using the new template functionality to render responses. A template editor has been added to the developer tool section in the app so you can get instant feedback if your templates are working or not.
```jinja2
```text
The temperature at home is {% raw %}{{ states('sensor.temperature') }}{% endraw %}.
```

View File

@ -58,7 +58,7 @@ If you park your car and go shopping - *device_tracker.beacon_car* will stop mov
With the basic tracking working - you can use automation to do things like open your gates if your car comes home
````yaml
```yaml
automation:
- alias: 'Open gate'
trigger:
@ -73,19 +73,19 @@ automation:
action:
service: switch.turn_on
entity_id: switch.gate
````
```
Or warn you if you leave your keys behind
````yaml
```yaml
automation:
- alias: 'Forgotten keys'
trigger:
platform: template
value_template: {% raw %}'{{states.device_tracker.greg_gregphone.state != states.device_tracker.beacon_keys.state}}'{% endraw %}
value_template: '{% raw %}{{ states.device_tracker.greg_gregphone.state != states.device_tracker.beacon_keys.state}}{% endraw %}'
condition:
condition: template
value_template: {% raw %}'{{ states.device_tracker.greg_gregphone.state != "home" }}'{% endraw %}
value_template: '{% raw %}{{ states.device_tracker.greg_gregphone.state != "home" }}{% endraw %}'
action:
service: script.turn_on
entity_id: script.send_key_alert
@ -93,7 +93,7 @@ automation:
- alias: 'Forgotten keys - cancel'
trigger:
platform: template
value_template: {% raw %}'{{states.device_tracker.greg_gregphone.state == states.device_tracker.beacon_keys.state}}'{% endraw %}
value_template: '{% raw %}{{ states.device_tracker.greg_gregphone.state == states.device_tracker.beacon_keys.state }}{% endraw %}'
condition:
- condition: state
entity_id: script.send_key_alert
@ -101,9 +101,9 @@ automation:
action:
service: script.turn_off
entity_id: script.send_key_alert
````
```
````yaml
```yaml
script:
send_key_alert:
sequence:
@ -113,7 +113,7 @@ script:
data:
message: 'You forgot your keys'
target: 'device/gregs_iphone'
````
```
(The delay is needed for two reasons: -

View File

@ -62,7 +62,6 @@ class OutsideLights(appapi.AppDaemon):
def sunset_cb(self, args, kwargs):
self.turn_on(self.args["on_scene"])
```
This is also fairly easy to achieve with Home Assistant automations, but we are just getting started.

View File

@ -124,7 +124,7 @@ This (large) sensor configuration gives us another example:
host: 192.168.2.82
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[2]}}"
value_template: "{% raw %}{{value.split (' ')[2]}}{% endraw %}"
unit: C
- platform: tcp
name: 'Outdoor Humidity (Meteobridge)'
@ -132,7 +132,7 @@ This (large) sensor configuration gives us another example:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[3]}}"
value_template: "{% raw %}{{value.split (' ')[3]}}{% endraw %}"
unit: Percent
- platform: tcp
name: 'Outdoor Dewpoint (Meteobridge)'
@ -140,7 +140,7 @@ This (large) sensor configuration gives us another example:
port: 5556
timeout: 6
payload: "Content-type: text/xml; charset=UTF-8\n\n"
value_template: "{{value.split (' ')[4] }}"
value_template: "{% raw %}{{value.split (' ')[4] }}{% endraw %}"
unit: C
###################################
#### STEAM FRIENDS ####

View File

@ -86,9 +86,8 @@ Home Assistant adds extensions to allow templates to access all of the current s
### {% linkable_title States %}
Next two statements result in same value if state exists. Second one will result in an error if state does not exist.
```jinja2
{% raw %}
{{ states('device_tracker.paulus') }}
```text
{% raw %}{{ states('device_tracker.paulus') }}
{{ states.device_tracker.paulus.state }}{% endraw %}
```
@ -96,9 +95,8 @@ Next two statements result in same value if state exists. Second one will result
Print an attribute if state is defined
```jinja2
{% raw %}
{% if states.device_tracker.paulus %}
```text
{% raw %}{% if states.device_tracker.paulus %}
{{ states.device_tracker.paulus.attributes.battery }}
{% else %}
??
@ -109,9 +107,8 @@ Print an attribute if state is defined
Print out a list of all the sensor states.
```jinja2
{% raw %}
{% for state in states.sensor %}
```text
{% raw %}{% for state in states.sensor %}
{{ state.entity_id }}={{ state.state }},
{% endfor %}
@ -131,17 +128,15 @@ Print out a list of all the sensor states.
{{ as_timestamp(states.binary_sensor.garage_door.last_changed) }}
{{ as_timestamp(now) - as_timestamp(states.binary_sensor.garage_door.last_changed) }}
{% endraw %}
{{ as_timestamp(now) - as_timestamp(states.binary_sensor.garage_door.last_changed) }}{% endraw %}
```
### {% linkable_title Distance examples %}
If only 1 location is passed in will measure the distance from home.
```jinja2
{% raw %}
Using Lat Lng coordinates: {{ distance(123.45, 123.45) }}
```text
{% raw %}Using Lat Lng coordinates: {{ distance(123.45, 123.45) }}
Using State: {{ distance(states.device_tracker.paulus) }}
@ -154,9 +149,8 @@ These can also be combined in any combination:
Find entities closest to the Home Assistant location:
```jinja2
{% raw %}
Query all entities: {{ closest(states) }}
```text
{% raw %}Query all entities: {{ closest(states) }}
Query all entities of a specific domain: {{ closest('states.device_tracker') }}
Query all entities in group.children: {{ closest('group.children') }}
Query all entities in group.children: {{ closest(states.group.children) }}{% endraw %}
@ -164,9 +158,8 @@ Query all entities in group.children: {{ closest(states.group.children) }}{% end
Find entities closest to a coordinate or another entity. All previous arguments still apply for 2nd argument.
```jinja2
{% raw %}
Closest to a coordinate: {{ closest(23.456, 23.456, 'group.children') }}
```text
{% raw %}Closest to a coordinate: {{ closest(23.456, 23.456, 'group.children') }}
Closest to an entity: {{ closest('zone.school', 'group.children') }}
Closest to an entity: {{ closest(states.zone.school, 'group.children') }}{% endraw %}
```
@ -174,9 +167,8 @@ Closest to an entity: {{ closest(states.zone.school, 'group.children') }}{% endr
### {% linkable_title Combined %}
Since closest returns a state, we can combine it with distance too
```jinja2
{% raw %}
{{ closest(states).name }} is {{ distance(closest(states)) }} meters away.{% endraw %}
```text
{% raw %}{{ closest(states).name }} is {{ distance(closest(states)) }} meters away.{% endraw %}
```
## {% linkable_title Processing incoming data %}
@ -190,7 +182,7 @@ It depends per component or platform but it is common to be able to define a tem
| `value` | The incoming value. |
| `value_json` | The incoming value parsed as JSON. |
```jinja2
```text
# Incoming value:
{"primes": [2, 3, 5, 7, 11, 13]}

View File

@ -4,7 +4,8 @@ title: "Blog index"
---
<div id="archive-list">
{% for post in site.posts reverse %}
{% assign reversedposts = site.posts | reverse %}
{% for post in reversedposts %}
{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
{% unless year == this_year %}
{% assign year = this_year %}

View File

@ -62,9 +62,9 @@ automation:
- condition: or
conditions:
- condition: template
value_template: '{{ states.sun.sun.attributes.elevation < 4 }}'
value_template: '{% raw %}{{ states.sun.sun.attributes.elevation < 4 }}{% endraw %}'
- condition: template
value_template: '{{ states.sensor.sensorluz_7_0.state < 10 }}'
value_template: '{% raw %}{{ states.sensor.sensorluz_7_0.state < 10 }}{% endraw %}'
- service: scene.turn_on
entity_id: scene.DespiertaDespacho
```

View File

@ -32,9 +32,9 @@ Example of using condition:
condition: or
conditions:
- condition: template
value_template: '{{ states.sun.sun.attributes.elevation < 4 }}'
value_template: '{% raw %}{{ states.sun.sun.attributes.elevation < 4 }}{% endraw %}'
- condition: template
value_template: '{{ states.sensor.sensorluz_7_0.state < 10 }}'
value_template: '{% raw %}{{ states.sensor.sensorluz_7_0.state < 10 }}{% endraw %}'
action:
- service: scene.turn_on
entity_id: scene.DespiertaDespacho

View File

@ -37,15 +37,19 @@ automation 2:
message: {% raw %}{{ trigger.payload }}{% endraw %}
```
### {% linkable_title Available Trigger Data %}
## {% linkable_title Available Trigger Data %}
The following tables show the available trigger data per platform.
### {% linkable_title event %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `event`.
| `trigger.event` | Event object that matched.
### {% linkable_title mqtt %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `mqtt`.
@ -53,6 +57,8 @@ The following tables show the available trigger data per platform.
| `trigger.payload` | Payload.
| `trigger.qos` | QOS of payload.
### {% linkable_title numeric_state %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `numeric_state`
@ -62,6 +68,8 @@ The following tables show the available trigger data per platform.
| `trigger.from_state` | The previous [state object] of the entity.
| `trigger.to_state` | The new [state object] that triggered trigger.
### {% linkable_title state %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `state`
@ -70,12 +78,16 @@ The following tables show the available trigger data per platform.
| `trigger.to_state` | The new [state object] that triggered trigger.
| `trigger.for` | Timedelta object how long state has been to state, if any.
### {% linkable_title sun %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `sun`
| `trigger.event` | The event that just happened: `sunset` or `sunrise`.
| `trigger.offset` | Timedelta object with offset to the event, if any.
### {% linkable_title template %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `template`
@ -83,11 +95,15 @@ The following tables show the available trigger data per platform.
| `trigger.from_state` | Previous [state object] of entity that caused change.
| `trigger.to_state` | New [state object] of entity that caused template to change.
### {% linkable_title time %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `time`
| `trigger.now` | DateTime object that triggered the time trigger.
### {% linkable_title zone %}
| Template variable | Data |
| ---- | ---- |
| `trigger.platform` | Hardcoded: `zone`

View File

@ -11,7 +11,7 @@ footer: true
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 %}
### {% 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.
```yaml
@ -24,7 +24,7 @@ automation:
mood: happy
```
#### {% linkable_title MQTT trigger %}
### {% 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.
```yaml
@ -36,7 +36,7 @@ automation:
payload: 'on'
```
#### {% linkable_title Numeric state trigger %}
### {% 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.
```yaml
@ -51,7 +51,7 @@ automation:
below: 25
```
#### {% linkable_title State trigger %}
### {% linkable_title State trigger %}
Triggers when the state of tracked entities change. If only entity_id given will match all state changes.
@ -76,7 +76,7 @@ automation:
Use quotes around your values for `from` and `to` to avoid the YAML parser interpreting values as booleans.
</p>
#### {% linkable_title Sun trigger %}
### {% 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.
```yaml
@ -89,7 +89,7 @@ automation:
offset: '-00:45:00'
```
#### {% linkable_title Template trigger %}
### {% linkable_title Template trigger %}
Template triggers work by evaluating a [template] on each state change. The trigger will fire if the state change caused the template to render 'true'. This is achieved by having the template result in a true boolean expression (`{% raw %}{{ is_state('device_tracker.paulus', 'home') }}{% endraw %}`) or by having the template render 'true' (example below).
@ -100,7 +100,7 @@ automation:
value_template: '{% raw %}{% if is_state('device_tracker.paulus', 'home') %}true{% endif %}{% endraw %}'
```
#### {% linkable_title Time trigger %}
### {% 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. You can prefix the value with a `/` to match whenever the value is divisible by that number. You cannot use `after` together with hour, minute or second.
@ -127,7 +127,7 @@ automation 3:
seconds: 0
```
#### {% linkable_title Zone trigger %}
### {% 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/) as well as the [iCloud platform](/components/device_tracker.icloud/).

View File

@ -15,7 +15,7 @@ Home Assistant offers a wide range of automations. In the next few pages we'll t
[cookbook-config]: /cookbook/#example-configurationyaml
### {% linkable_title The basics of automation %}
### {% linkable_title Automation basics %}
Before you can go ahead and create your own automations, it's important to learn the basics. To explore the basics, let's have a look at the following example home automation rule:

View File

@ -9,28 +9,21 @@ sharing: true
footer: true
---
By default, all of your devices will be visible and have a default icon determined by their domain. You can customize the look and feel of your front page by altering some of these parameters. This can be done by adding the following configuration inside the `homeassistant:` section.
Devices that you don't want to have visible can be hidden with `hidden`.
`entity_picture`entries, badges, `device_tracker` pictures, etc. can either be external URLs (e.g. `http://example.com/example.jpg`) or of the form `/local/filename.jpg`, where `/local` represents the directory `www` in the HASS configuration directory. You may have to create the `www` directory yourself as it is not made automatically.
You can also use `icon` and refer to any icon from [MaterialDesignIcons.com](http://MaterialDesignIcons.com).
For switches with an assumed state two buttons are shown (turn off, turn on) instead of a switch. By setting `assumed_state` to `false` you will get the default switch icon.
By default, all of your devices will be visible and have a default icon determined by their domain. You can customize the look and feel of your front page by altering some of these parameters. This can be done by overriding attributes of specific entities.
```yaml
# Example configuration.yaml entry
homeassistant:
name: Home
unit_system: celsius
# etc
# Add this to your existing configuration
# Only the `entity_id` is required. All other options are optional.
customize:
# Only the 'entity_id' is required. All other options are optional.
sensor.living_room_motion:
hidden: true
thermostat.family_roomfamily_room:
entity_picture: https://dl.dropboxusercontent.com/u/12345/images/nest.jpg
entity_picture: https://example.com/images/nest.jpg
friendly_name: Nest
switch.wemo_switch_1:
friendly_name: Toaster
@ -42,6 +35,16 @@ homeassistant:
assumed_state: false
```
### {% linkable_title Possible values %}
| Attribute | Description |
| --------- | ----------- |
| friendly_name | Name of the entity
| hidden | Set to `true` to hide the entity.
| entity_picture | url to use as picture for entity
| icon | Any icon from [MaterialDesignIcons.com](http://MaterialDesignIcons.com). Prefix name with `mdi:`, ie `mdi:home`.
| assumed_state | For switches with an assumed state two buttons are shown (turn off, turn on) instead of a switch. By setting `assumed_state` to `false` you will get the default switch icon.
### {% linkable_title Reloading customize %}
Home Assistant offers a service to reload the core configuration while Home Assistant is running called `homeassistant/reload_core_config`. This allows you to change your customize section and see it being applied without having to restart Home Assistant. To call this service, go to the <img src='/images/screenshots/developer-tool-services-icon.png' alt='service developer tool icon' class="no-shadow" height="38" /> service developer tools, select the service `homeassistant/reload_core_config` and click "Call Service".

View File

@ -9,7 +9,7 @@ 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 on your network if you have [the discovery component]({{site_root}}/components/discovery/) enabled (which is by default).
Home Assistant will be able to automatically discover a bunch of devices and services available on 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. If you can't find support for your favorite device or service, [consider adding support](/developers/add_new_platform/).
@ -51,10 +51,6 @@ camera 2:
platform: mjpeg
```
<p class='note note'>
If your devices are not showing up in the frontend then check the entries in your <code>configuration.yaml</code> file for duplicates.
</p>
### {% linkable_title Grouping devices %}
Once you have a bunch of devices set up, it is time to organize them into groups.

View File

@ -23,7 +23,7 @@ Presence detection detects if people are home, an important input for automation
Screenshot of Home Assistant showing a school, work and home zone and two people.
</p>
## {% linkable_title Setting it up %}
### {% 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.
@ -35,7 +35,7 @@ Home Assistant currently supports two third party services for presence detectio
OwnTracks communicates directly with your MQTT broker, no data will pass through their servers.
</p>
#### {% linkable_title Zones %}
### {% linkable_title Zones %}
<img src='/images/screenshots/badges-zone.png' style='float: right; margin-left: 8px; height: 100px;'>

View File

@ -11,7 +11,7 @@ footer: true
Conditions can be used within a script or automation to prevent further execution. A condition will look at the system right now. For example a condition can test if a switch is currently turned on or off.
#### {% linkable_title AND condition %}
### {% linkable_title AND condition %}
Test multiple conditions in 1 condition statement. Passes if all embedded conditions are valid.
@ -26,7 +26,7 @@ conditions:
below: '20'
```
#### {% linkable_title OR condition %}
### {% linkable_title OR condition %}
Test multiple conditions in 1 condition statement. Passes if any embedded conditions is valid.
@ -41,7 +41,7 @@ conditions:
below: '20'
```
#### {% linkable_title MIXED AND and OR conditions %}
### {% linkable_title MIXED AND and OR conditions %}
Test multiple AND and OR conditions in 1 condition statement. Passes if any embedded conditions is valid.
This allows you to mix several AND and OR conditions together.
@ -62,7 +62,7 @@ conditions:
below: '20'
```
#### {% linkable_title Numeric state condition %}
### {% linkable_title Numeric state condition %}
This type of condition attempts to parse the state of specified entity as a number and triggers if the value matches all of the above or below thresholds.
@ -76,10 +76,10 @@ entity_id: sensor.temperature
above: 17
below: 25
# If your sensor value needs to be adjusted
value_template: {{ float(state.state) + 2 }}
value_template: {% raw %}{{ float(state.state) + 2 }}{% endraw %}
```
#### {% linkable_title State condition %}
### {% linkable_title State condition %}
Tests if an entity is a specified state.
@ -94,7 +94,7 @@ for:
seconds: 5
```
#### {% linkable_title Sun condition %}
### {% linkable_title Sun condition %}
The sun condition can test if the sun has already set or risen when a trigger occurs. The `before` and `after` keys can only be set to `sunset` or `sunrise`. They have a corresponding optional offset value (`before_offset`, `after_offset`) that can be added, similar to the [sun trigger][sun_trigger].
@ -107,7 +107,7 @@ after: sunset
after_offset: "-1:00:00"
```
#### {% linkable_title Template condition %}
### {% linkable_title Template condition %}
The template condition will test if the [given template][template] renders a value equal to true. This is achieved by having the template result in a true boolean expression or by having the template render 'true'.
@ -121,7 +121,7 @@ Within an automation, template conditions also have access to the `trigger` vari
[template]: /topics/templating/
[automation-templating]: /getting-started/automation-templating/
#### {% linkable_title Time condition %}
### {% 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
@ -138,7 +138,7 @@ weekday:
Valid values for `weekday` are `mon`, `tue`, `wed`, `thu`, `fri`, `sat`, `sun`.
#### {% linkable_title Zone condition %}
### {% 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/) and the [iCloud platform](/components/device_tracker.icloud/).
@ -148,8 +148,7 @@ entity_id: device_tracker.paulus
zone: zone.home
```
#### {% linkable_title Examples %}
### {% linkable_title Examples %}
```yaml
condition:

View File

@ -26,7 +26,7 @@ script:
message: 'Turned on the ceiling light!'
```
#### {% linkable_title Call a Service %}
### {% linkable_title Call a Service %}
The most important one is the action to call a service. This can be done in various ways. For all the different possibilities, have a look at the [service calls page].
@ -38,7 +38,7 @@ data:
brightness: 100
```
#### {% linkable_title Test a Condition %}
### {% linkable_title Test a Condition %}
While executing a script you can add a condition to stop further execution. When a condition does not return `true`, the script will finish. There are many different conditions which are documented at the [conditions page].
@ -48,7 +48,7 @@ entity_id: device_tracker.paulus
state: 'home'
```
#### {% linkable_title Delay %}
### {% linkable_title Delay %}
Delays are useful for temporarily suspending your script and start it at a later moment. We support different syntaxes for a delay as shown below.
@ -75,7 +75,7 @@ delay:
delay: {% raw %}'00:{{ input_slider.minute_delay | int }}:00'{% endraw %}
```
#### {% linkable_title Fire an Event %}
### {% linkable_title Fire an Event %}
This action allows you to fire an event. Events can be used for many things. It could trigger an automation or indicate to another component that something is happening. For instance, in the below example it is used to create an entry in the logbook.

View File

@ -90,9 +90,9 @@ $ ls /dev/ttyACM*
Depending on what's plugged into your USB ports, the name found above may change. You can lock in a name, such as `/dev/zwave`, by following [these instructions](http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/).
</p>
#### {% linkable_title Events %}
### {% linkable_title Events %}
**zwave.network_complete**
#### {% linkable_title zwave.network_complete %}
HomeAssistant will trigger a event when the zwave network is complete. Meaning all of the nodes on the network have been queried. This can take quite som time, depending on wakeup intervals on the battery powered devices on the network.
```yaml
@ -102,7 +102,7 @@ HomeAssistant will trigger a event when the zwave network is complete. Meaning a
event_type: zwave.network_complete
```
**zwave.network_ready**
#### {% linkable_title zwave.network_ready %}
HomeAssistant will trigger a event when the zwave network is ready for use. Between `zwave.network_start` and `zwave.network_ready` HomeAssistant will feel sluggish when trying to send commands to zwave nodes. This is because the controller is requesting information from all of the nodes on the network. When this is triggered all awake nodes have been queried and sleeping nodes will be queried when they awake.
```yaml
@ -112,7 +112,7 @@ HomeAssistant will trigger a event when the zwave network is ready for use. Betw
event_type: zwave.network_ready
```
**zwave.network_start**
#### {% linkable_title zwave.network_start %}
HomeAssistant will trigger a event when the zwave network is set up to be started.
```yaml
@ -122,7 +122,7 @@ HomeAssistant will trigger a event when the zwave network is set up to be starte
event_type: zwave.network_start
```
**zwave.network_stop**
#### {% linkable_title zwave.network_stop %}
HomeAssistant will trigger a event when the zwave network stopping.
```yaml
@ -132,7 +132,7 @@ HomeAssistant will trigger a event when the zwave network stopping.
event_type: zwave.network_stop
```
**zwave.node_event**
#### {% linkable_title zwave.node_event %}
HomeAssistant will trigger a event when command_class_basic changes value on a node.
This can be virtually anything, so tests have to be made to determine what value equals what.
You can use this for automations.
@ -168,7 +168,7 @@ automation:
The *object_id* and *scene_id* of all triggered events can be seen in the console output.
#### {% linkable_title Services %}
### {% linkable_title Services %}
The Z-Wave component exposes seven services to help maintain the network.