diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
deleted file mode 100644
index e041b33ae3c..00000000000
--- a/.devcontainer/Dockerfile
+++ /dev/null
@@ -1,36 +0,0 @@
-FROM ruby:2.6
-
-# Avoid warnings by switching to noninteractive
-ENV DEBIAN_FRONTEND=noninteractive
-
-# Use Bash as the default shell
-ENV SHELL=/bin/bash
-
-# Set an environment variable to be able to detect we are in dev container
-ENV DEVCONTAINER=true
-
-# Locale env vars
-ENV \
- LANG=en_US.UTF-8 \
- LANGUAGE=en_US:en \
- LC_ALL=en_US.UTF-8
-
-# Install git, process tools
-RUN apt update \
- && apt-get install -y --no-install-recommends \
- ack \
- git \
- locales \
- procps \
- && echo "en_US UTF-8" > /etc/locale.gen \
- && locale-gen en_US.UTF-8 \
- && echo 'export PS1="\\w\$ "' > /root/.bashrc \
- && apt-get autoremove -y \
- && apt-get clean -y \
- && rm -rf /var/lib/apt/lists/*
-
-# Install the specific version of bundler we need
-RUN gem install bundler -v 2.0.1
-
-# Switch back to dialog for any ad-hoc use of apt-get
-ENV DEBIAN_FRONTEND=dialog
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index e19189152ea..53ae8b5a44a 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,8 +1,10 @@
{
"name": "home-assistant.io",
- "dockerFile": "Dockerfile",
+ "context": "..",
+ "dockerFile": "../Dockerfile",
"appPort": [4000],
- "postCreateCommand": "bundle install",
+ "postCreateCommand": "bundle install && npm install",
+ "containerEnv": {"DEVCONTAINER": "true"},
"extensions": [
"davidanson.vscode-markdownlint",
"editorconfig.editorconfig",
@@ -17,6 +19,6 @@
"errorLens.gutterIconsEnabled": true,
"errorLens.addAnnotationTextPrefixes": false,
"errorLens.enabledDiagnosticLevels": ["error", "warning"],
- "terminal.integrated.shell.linux": "/bin/bash"
+ "terminal.integrated.shell.linux": "/usr/bin/zsh",
}
}
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 6d33c93e6e3..3d6834d9165 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -8,7 +8,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v3.0.15
+ - uses: actions/stale@v3.0.16
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 60
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index f05485a3169..c7484284e30 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -14,7 +14,7 @@ jobs:
with:
node-version: 12.x
- name: Setup NPM cache
- uses: actions/cache@v2
+ uses: actions/cache@v2.1.4
with:
path: ~/.npm
key: npm-${{ hashFiles('**/package-lock.json') }}
@@ -37,7 +37,7 @@ jobs:
with:
node-version: 12.x
- name: Setup NPM cache
- uses: actions/cache@v2
+ uses: actions/cache@v2.1.4
with:
path: ~/.npm
key: npm-${{ hashFiles('**/package-lock.json') }}
@@ -61,7 +61,7 @@ jobs:
with:
ruby-version: 2.6
- name: Setup Ruby Gems cache
- uses: actions/cache@v2
+ uses: actions/cache@v2.1.4
with:
path: vendor/bundle
key: gems-${{ hashFiles('**/Gemfile.lock') }}
@@ -73,7 +73,7 @@ jobs:
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- name: Setting up Jekyll cache
- uses: actions/cache@v2
+ uses: actions/cache@v2.1.4
with:
path: source/.jekyll-cache
key: jekyll-${{ hashFiles('**/Gemfile.lock') }}-${{ hashFiles('**/_config.yml') }}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000000..445458446aa
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,29 @@
+ARG VARIANT=2.6
+FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
+
+# Install node
+COPY .nvmrc /tmp/.nvmrc
+RUN \
+ su vscode -c \
+ "source /usr/local/share/nvm/nvm.sh && nvm install $(cat /tmp/.nvmrc) 2>&1"
+
+# Locale env vars
+ENV \
+ LANG=en_US.UTF-8 \
+ LANGUAGE=en_US:en \
+ LC_ALL=en_US.UTF-8
+
+# Install tools
+RUN \
+ apt update \
+ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+ ack \
+ && echo "en_US UTF-8" > /etc/locale.gen \
+ && locale-gen en_US.UTF-8 \
+ && apt-get autoremove -y \
+ && apt-get clean -y \
+ && rm -rf /var/lib/apt/lists/*
+
+# Install the specific version of bundler we need
+COPY Gemfile.lock ./
+RUN gem install bundler -v `awk 'c&&c--;/BUNDLED WITH/{c=1}' Gemfile.lock`
diff --git a/Gemfile b/Gemfile
index 12111262b14..ff95f49b6f2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -8,6 +8,8 @@ group :development do
gem 'compass', '1.0.3'
gem 'sass-globbing', '1.1.5'
gem 'stringex', '2.8.5'
+ # > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189
+ gem 'sassc', '2.1.0'
end
group :jekyll_plugins do
diff --git a/Gemfile.lock b/Gemfile.lock
index 5df2e88d874..a0893d5887c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -99,9 +99,9 @@ GEM
sass (3.4.25)
sass-globbing (1.1.5)
sass (>= 3.1)
- sassc (2.4.0)
+ sassc (2.1.0)
ffi (~> 1.9)
- sassc (2.4.0-x64-mingw32)
+ sassc (2.1.0-x64-mingw32)
ffi (~> 1.9)
sinatra (2.1.0)
mustermann (~> 1.0)
@@ -133,6 +133,7 @@ DEPENDENCIES
nokogiri (= 1.11.1)
rake (= 13.0.3)
sass-globbing (= 1.1.5)
+ sassc (= 2.1.0)
sinatra (= 2.1.0)
stringex (= 2.8.5)
tzinfo (~> 2.0)
diff --git a/Rakefile b/Rakefile
index bdf1535119c..8df92944c02 100644
--- a/Rakefile
+++ b/Rakefile
@@ -60,7 +60,8 @@ task :preview, :listen do |t, args|
listen_addr = args[:listen] || '127.0.0.1'
listen_addr = '0.0.0.0' unless ENV['DEVCONTAINER'].nil?
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}"
+ puts "Starting to watch source with Jekyll and Compass."
+ puts "Now listening on http://localhost:#{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 -t --watch --incremental")
compassPid = Process.spawn("compass watch")
diff --git a/_config.yml b/_config.yml
index 1fb1ca80254..6fcb521c223 100644
--- a/_config.yml
+++ b/_config.yml
@@ -102,8 +102,8 @@ social:
# Home Assistant release details
current_major_version: 2021
current_minor_version: 2
-current_patch_version: 0
-date_released: 2021-02-03
+current_patch_version: 2
+date_released: 2021-02-09
# Either # or the anchor link to latest release notes in the blog post.
# Must be prefixed with a # and have double quotes around it.
diff --git a/package-lock.json b/package-lock.json
index 2fd56caa709..2bb3d6a9641 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -104,9 +104,9 @@
"dev": true
},
"@textlint/ast-tester": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-2.3.1.tgz",
- "integrity": "sha512-L9M2VNTYJ5sVdkPs9jH7s01Gg900Nuk7m9zQmCz9WFa3YyzJFEd7GCSmAvLMgX31jw5bbvvmj7DngymlP+PahQ==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-2.3.2.tgz",
+ "integrity": "sha512-4e1kyqsHks5POcQmuh7ITVrU/dbYyRUfQarQbeVRPP271n2HnlgnoYyZ10yV2Sb/Ksw+lQf7DPSnwNewXdCWww==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
@@ -121,9 +121,9 @@
}
},
"@textlint/ast-traverse": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-2.3.1.tgz",
- "integrity": "sha512-uOFKqm3M9by55Zl2ryZ7jOSiLdLhDmVgX0IG/MJfGKY1a/MSyt5qwy9cvZNcob6hNCPeRMW8boAH2uRJOwRcoQ==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-2.3.2.tgz",
+ "integrity": "sha512-Dt1s/6x0XWhUNFH2rAa9gL6ODtq232BZuBHuHiOg+SrVwzl+VjOfa3fMQ0LoYixGSyDtwqAlksWcC0KyLz0eSw==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
@@ -138,22 +138,22 @@
}
},
"@textlint/feature-flag": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-3.3.1.tgz",
- "integrity": "sha512-0a1UopFf30UrmEDKFNATXlotMqwbLGjJa1GTuljL/AKn2Adz7rPawclW4pHf/b//K7Da5GOtuzbIfVAZSFQRxA==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-3.3.2.tgz",
+ "integrity": "sha512-7ErQ/UF0IBAd+PkQNBD7yYCDqL2o6leErMDENSWAgUHWLy5TcHr3Orn7qswtBMW5gIyXW9lh+EpllwLJ5qv35w==",
"dev": true,
"requires": {
"map-like": "^2.0.0"
}
},
"@textlint/fixer-formatter": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-3.3.1.tgz",
- "integrity": "sha512-ZPK66J61lv8UMdqJeG4YUPfKPlCom/jiv8kZkz5ELnLA587HLOlEIYLaNjKop0viW5z3Fz9cZd5glIHrPymiqQ==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-3.3.2.tgz",
+ "integrity": "sha512-aTEyH/rHSzxRLrluSjNhDnMSgIYK60J5AAgprKJCkb9h3dDRuNoiJ+BXh5FXVSSm1tGF0d8pu+Ph8OFBgQOchQ==",
"dev": true,
"requires": {
- "@textlint/module-interop": "^1.2.1",
- "@textlint/types": "^1.5.1",
+ "@textlint/module-interop": "^1.2.2",
+ "@textlint/types": "^1.5.2",
"chalk": "^1.1.3",
"debug": "^4.3.1",
"diff": "^4.0.2",
@@ -171,9 +171,9 @@
"dev": true
},
"@textlint/types": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.1.tgz",
- "integrity": "sha512-YgPmxEeFUXuCjWOFx4p0afxFCHJbTf9Muw/6SJDLd/txQ6YrStst3Kvw+6QGefdJe44/UdiUYtI8sYa5T1ejaQ==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.2.tgz",
+ "integrity": "sha512-IdS0h2MCzdY+wjM0+qvl8IW/IxhmVFAVrGu5TmIBpJkihIV7WMa3ITFXIVb0oqwnePUmyLBRIVsCtC66E3QbfQ==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
@@ -264,18 +264,18 @@
}
},
"@textlint/kernel": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-3.4.1.tgz",
- "integrity": "sha512-8ZpiLy5KgmIMjda7RNgbNzoHpDnF51OC0rmMBTUl5xFMrpOcmnKZ6qcnmP7hlyR1MQJxQVzG0PvWnLHFUZL53w==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-3.4.2.tgz",
+ "integrity": "sha512-PpxAtvLGI9ewn+Dbt4j0KMfmMM39/AY3cikmZffu59nyTdIymXMeVMEVkpVZTEUk5OlL27RAON9FF+2u+0fshg==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1",
- "@textlint/ast-tester": "^2.3.1",
- "@textlint/ast-traverse": "^2.3.1",
- "@textlint/feature-flag": "^3.3.1",
- "@textlint/source-code-fixer": "^3.4.1",
- "@textlint/types": "^1.5.1",
- "@textlint/utils": "^1.2.1",
+ "@textlint/ast-tester": "^2.3.2",
+ "@textlint/ast-traverse": "^2.3.2",
+ "@textlint/feature-flag": "^3.3.2",
+ "@textlint/source-code-fixer": "^3.4.2",
+ "@textlint/types": "^1.5.2",
+ "@textlint/utils": "^1.2.2",
"debug": "^4.3.1",
"deep-equal": "^1.1.1",
"map-like": "^2.0.0",
@@ -289,9 +289,9 @@
"dev": true
},
"@textlint/types": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.1.tgz",
- "integrity": "sha512-YgPmxEeFUXuCjWOFx4p0afxFCHJbTf9Muw/6SJDLd/txQ6YrStst3Kvw+6QGefdJe44/UdiUYtI8sYa5T1ejaQ==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.2.tgz",
+ "integrity": "sha512-IdS0h2MCzdY+wjM0+qvl8IW/IxhmVFAVrGu5TmIBpJkihIV7WMa3ITFXIVb0oqwnePUmyLBRIVsCtC66E3QbfQ==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
@@ -309,15 +309,15 @@
}
},
"@textlint/linter-formatter": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-3.3.1.tgz",
- "integrity": "sha512-tBtOSfpZWr3AwIJ1vbBSD+fwB4JSEtCQIE+AgfFqO8eDMOssjxKgVtIPX9dwh3/+6vlc6KozBJjIfXoxLuaWlg==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-3.3.2.tgz",
+ "integrity": "sha512-MRa8D1/x6pWycKTwb1QLjtY7GyjgcsYRfV0Gu0Aze5szCa3UDwZSewHycpcAGlIqr8AkqPRfyXi653M47eJ0rA==",
"dev": true,
"requires": {
"@azu/format-text": "^1.0.1",
"@azu/style-format": "^1.0.0",
- "@textlint/module-interop": "^1.2.1",
- "@textlint/types": "^1.5.1",
+ "@textlint/module-interop": "^1.2.2",
+ "@textlint/types": "^1.5.2",
"chalk": "^1.1.3",
"concat-stream": "^1.6.2",
"debug": "^4.3.1",
@@ -340,9 +340,9 @@
"dev": true
},
"@textlint/types": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.1.tgz",
- "integrity": "sha512-YgPmxEeFUXuCjWOFx4p0afxFCHJbTf9Muw/6SJDLd/txQ6YrStst3Kvw+6QGefdJe44/UdiUYtI8sYa5T1ejaQ==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.2.tgz",
+ "integrity": "sha512-IdS0h2MCzdY+wjM0+qvl8IW/IxhmVFAVrGu5TmIBpJkihIV7WMa3ITFXIVb0oqwnePUmyLBRIVsCtC66E3QbfQ==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
@@ -479,9 +479,9 @@
}
},
"@textlint/markdown-to-ast": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-6.3.1.tgz",
- "integrity": "sha512-piqeTN6dzMr7ljlo7GbRBILMcZ8zW2H9raN48qH+HYhfrGZfEOmL5HAMMeF8h0sDz9CzTvZixEwGWLMdlwsb+A==",
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-6.3.2.tgz",
+ "integrity": "sha512-uwndF3PRJ48wTVAEDSy0IAEVJg/scxpdZ1r+QKeGuFfdtaGSrtcgROI6qiVU1g/WNyNfQw+DAA7F8HfM+pmleg==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1",
@@ -597,18 +597,18 @@
}
},
"@textlint/module-interop": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-1.2.1.tgz",
- "integrity": "sha512-ZvxTTvEm7nmkRctWKREfvNvnVtRxRbdUms8cqkiYbP2K0fRIMacrWpL8z8cdkkdNZbaYciaUnyE3be7UD4J8EA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-1.2.2.tgz",
+ "integrity": "sha512-B8HPS129lOqzEpRcafYl/OJ2TDxfBw1jGfEhebzwt3kGoMd5pQVih+hUIOl+SfAmLWqCDEniaKn0gw1s+hjSXA==",
"dev": true
},
"@textlint/source-code-fixer": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-3.4.1.tgz",
- "integrity": "sha512-FqL+xdjIU2hswS4Cmhf/bL7SWTpXkKoK/wb8Lmo9sNmEE481fc5Ey/s8JgxAaOHRpwOcmErGd16c3gXcG6Y2ow==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-3.4.2.tgz",
+ "integrity": "sha512-mSGQNO8is21KcHgDh4S8Cx88r7uU+7xpzHLuEuzhgEZfgwz3+tnpk22TrEjNYe1V1+aseU9iCQegVQQr1wroKQ==",
"dev": true,
"requires": {
- "@textlint/types": "^1.5.1",
+ "@textlint/types": "^1.5.2",
"debug": "^4.3.1"
},
"dependencies": {
@@ -619,9 +619,9 @@
"dev": true
},
"@textlint/types": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.1.tgz",
- "integrity": "sha512-YgPmxEeFUXuCjWOFx4p0afxFCHJbTf9Muw/6SJDLd/txQ6YrStst3Kvw+6QGefdJe44/UdiUYtI8sYa5T1ejaQ==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.2.tgz",
+ "integrity": "sha512-IdS0h2MCzdY+wjM0+qvl8IW/IxhmVFAVrGu5TmIBpJkihIV7WMa3ITFXIVb0oqwnePUmyLBRIVsCtC66E3QbfQ==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
@@ -639,9 +639,9 @@
}
},
"@textlint/text-to-ast": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-3.3.1.tgz",
- "integrity": "sha512-aN1IY3u98Wig2PTF/eEJdb7XfCH5VEwZagGdG1vajx6sdc7Sc3265UVv9uEB/ypJDteYnURRICfTd6NCGwkVGA==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-3.3.2.tgz",
+ "integrity": "sha512-+DKAP62ho21KID8IcKy1kP6K+kUZk+Z0MwvS9u2l39J0cK+vX523KI+sA6AXxEhOMDA8zhdIsBf3onGvrAtyhA==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
@@ -656,21 +656,21 @@
}
},
"@textlint/textlint-plugin-markdown": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-5.3.1.tgz",
- "integrity": "sha512-IhQVGW9YqylkuZ4AjOfLFtOWHPXtLMhWTVfvIFzMQ2TIpquIaybws8KiFN2yZzLBNNduF+PFvm+H2NRhR0w/lQ==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-5.3.2.tgz",
+ "integrity": "sha512-6Ph7ESKR48tEz5Pnog3PpvF84LU3jkADvr4iBkkVz9vLQt3KbqGnmk8EV94Y0hLEX+UrZKWmH3cJfh6O1Zy/eA==",
"dev": true,
"requires": {
- "@textlint/markdown-to-ast": "^6.3.1"
+ "@textlint/markdown-to-ast": "^6.3.2"
}
},
"@textlint/textlint-plugin-text": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-4.3.1.tgz",
- "integrity": "sha512-IqtO6TWOfVaw8sXMdVVwsvEYuqYk13ApKXBVjjJoLux0g+6G1rCEhFSZtopkrpC1Srr/OZCfb4nk8/zx+5M6Ng==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-4.3.2.tgz",
+ "integrity": "sha512-xnjad0bXaM6ZtgffuFKogHYkzXymUK3VTLP5MGA00kLitADlNUtwXQk82TebkXFcSPRhePU9+2XFipXNQDsg7g==",
"dev": true,
"requires": {
- "@textlint/text-to-ast": "^3.3.1"
+ "@textlint/text-to-ast": "^3.3.2"
}
},
"@textlint/types": {
@@ -683,9 +683,9 @@
}
},
"@textlint/utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-1.2.1.tgz",
- "integrity": "sha512-X/rLpqskTLWDPO5cvQO5CcA7zNnDimeBokwehiDwTg6aP9LYqFeOw5mKZ5lb4purY9zN9tLRxJGLle4Py1QobQ==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-1.2.2.tgz",
+ "integrity": "sha512-7Mqcl9G9YYrPBv5d/tZ2NlWC66hTUpQEQxZEHDMTdF3gPmQUSNRNGjqUR9mhw00Wy8Wo6i3LUWuxwMT6heHNBQ==",
"dev": true
},
"@types/mdast": {
@@ -1116,9 +1116,9 @@
"dev": true
},
"get-intrinsic": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz",
- "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
@@ -1156,9 +1156,9 @@
}
},
"graceful-fs": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
- "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz",
+ "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==",
"dev": true
},
"has": {
@@ -1352,11 +1352,12 @@
"dev": true
},
"is-regex": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
- "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
+ "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.2",
"has-symbols": "^1.0.1"
}
},
@@ -2533,22 +2534,22 @@
"dev": true
},
"textlint": {
- "version": "11.8.1",
- "resolved": "https://registry.npmjs.org/textlint/-/textlint-11.8.1.tgz",
- "integrity": "sha512-FlXzJrR008O/H/ynCTVQnsaW2kX2I1zb/rIxkn0HIAoNxU/A4au+P4QJkeDg7FRE6h8qdlZjrXHx79MfSTWzDw==",
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/textlint/-/textlint-11.8.2.tgz",
+ "integrity": "sha512-YrTGagGzWKXYw6VjW4uhJ1y7LoW8zqWZIr8sWgeQVIFE84+G/cHPoZ8RhFlia+RZ4YryZPNOqevuF4vG+dbKNQ==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1",
- "@textlint/ast-traverse": "^2.3.1",
- "@textlint/feature-flag": "^3.3.1",
- "@textlint/fixer-formatter": "^3.3.1",
- "@textlint/kernel": "^3.4.1",
- "@textlint/linter-formatter": "^3.3.1",
- "@textlint/module-interop": "^1.2.1",
- "@textlint/textlint-plugin-markdown": "^5.3.1",
- "@textlint/textlint-plugin-text": "^4.3.1",
- "@textlint/types": "^1.5.1",
- "@textlint/utils": "^1.2.1",
+ "@textlint/ast-traverse": "^2.3.2",
+ "@textlint/feature-flag": "^3.3.2",
+ "@textlint/fixer-formatter": "^3.3.2",
+ "@textlint/kernel": "^3.4.2",
+ "@textlint/linter-formatter": "^3.3.2",
+ "@textlint/module-interop": "^1.2.2",
+ "@textlint/textlint-plugin-markdown": "^5.3.2",
+ "@textlint/textlint-plugin-text": "^4.3.2",
+ "@textlint/types": "^1.5.2",
+ "@textlint/utils": "^1.2.2",
"debug": "^4.3.1",
"deep-equal": "^1.1.1",
"file-entry-cache": "^5.0.1",
@@ -2576,9 +2577,9 @@
"dev": true
},
"@textlint/types": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.1.tgz",
- "integrity": "sha512-YgPmxEeFUXuCjWOFx4p0afxFCHJbTf9Muw/6SJDLd/txQ6YrStst3Kvw+6QGefdJe44/UdiUYtI8sYa5T1ejaQ==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.2.tgz",
+ "integrity": "sha512-IdS0h2MCzdY+wjM0+qvl8IW/IxhmVFAVrGu5TmIBpJkihIV7WMa3ITFXIVb0oqwnePUmyLBRIVsCtC66E3QbfQ==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.1"
diff --git a/package.json b/package.json
index 8a10c879213..f6e9fe9fab1 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,7 @@
"remark-lint-fenced-code-flag": "^2.0.1",
"remark-lint-no-shell-dollars": "^2.0.2",
"remark-stringify": "^9.0.1",
- "textlint": "^11.8.1",
+ "textlint": "^11.8.2",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^2.1.5"
},
diff --git a/source/.well-known/apple-app-site-association b/source/.well-known/apple-app-site-association
index 494213bed58..9eaf0bcf49a 100644
--- a/source/.well-known/apple-app-site-association
+++ b/source/.well-known/apple-app-site-association
@@ -5,54 +5,54 @@
{
"appID": "UTQFCBPQRF.io.robbie.HomeAssistant.dev",
"paths": [
- "/ios/*",
"NOT /ios/beta",
"NOT /ios/beta/*",
+ "/ios/*",
"/tag/*"
]
},
{
"appID": "UTQFCBPQRF.io.robbie.HomeAssistant.beta",
"paths": [
- "/ios/*",
"NOT /ios/beta",
"NOT /ios/beta/*",
+ "/ios/*",
"/tag/*"
]
},
{
"appID": "UTQFCBPQRF.io.robbie.HomeAssistant",
"paths": [
- "/ios/*",
"NOT /ios/beta",
"NOT /ios/beta/*",
+ "/ios/*",
"/tag/*"
]
},
{
"appID": "QMQYCKL255.io.robbie.HomeAssistant.dev",
"paths": [
- "/ios/*",
"NOT /ios/beta",
"NOT /ios/beta/*",
+ "/ios/*",
"/tag/*"
]
},
{
"appID": "QMQYCKL255.io.robbie.HomeAssistant.beta",
"paths": [
- "/ios/*",
"NOT /ios/beta",
"NOT /ios/beta/*",
+ "/ios/*",
"/tag/*"
]
},
{
"appID": "QMQYCKL255.io.robbie.HomeAssistant",
"paths": [
- "/ios/*",
"NOT /ios/beta",
"NOT /ios/beta/*",
+ "/ios/*",
"/tag/*"
]
}
diff --git a/source/_docs/automation/templating.markdown b/source/_docs/automation/templating.markdown
index cdeb8640b17..26c7aa5ea70 100644
--- a/source/_docs/automation/templating.markdown
+++ b/source/_docs/automation/templating.markdown
@@ -3,75 +3,11 @@ title: "Automation Templating"
description: "Advanced automation documentation using templating."
---
-In Home Assistant 0.19 we introduced a new powerful feature: variables in scripts and automations. This makes it possible to adjust your condition and action based on the information of the trigger.
-
-The trigger data made is available during [template](/docs/configuration/templating/) rendering as the `trigger` variable.
-
-{% raw %}
-```yaml
-# Example configuration.yaml entries
-automation:
- trigger:
- platform: state
- entity_id: device_tracker.paulus
- action:
- service: notify.notify
- data:
- message: >
- Paulus just changed from {{ trigger.from_state.state }}
- to {{ trigger.to_state.state }}
-
-automation 2:
- trigger:
- platform: mqtt
- topic: /notify/+
- action:
- service: >
- notify.{{ trigger.topic.split('/')[-1] }}
- data:
- message: "{{ trigger.payload }}"
-
-automation 3:
- trigger:
- # Multiple entities for which you want to perform the same action.
- - platform: state
- entity_id:
- - light.bedroom_closet
- - light.kiddos_closet
- - light.linen_closet
- to: "on"
- # Trigger when someone leaves one of those lights on for 10 minutes.
- for: "00:10:00"
- action:
- - service: light.turn_off
- data:
- # Turn off whichever entity triggered the automation.
- entity_id: "{{ trigger.entity_id }}"
-```
-{% endraw %}
-
-## Important Template Rules
-
-There are a few very important rules to remember when writing automation templates:
-
-1. You **must** surround single-line templates with double quotes (`"`) or single quotes (`'`).
-1. It is advised that you prepare for undefined variables by using `if ... is not none` or the [`default` filter](http://jinja.pocoo.org/docs/dev/templates/#default), or both.
-1. It is advised that when comparing numbers, you convert the number(s) to a [`float`](http://jinja.pocoo.org/docs/dev/templates/#float) or an [`int`](http://jinja.pocoo.org/docs/dev/templates/#int) by using the respective [filter](http://jinja.pocoo.org/docs/dev/templates/#list-of-builtin-filters).
-1. While the [`float`](http://jinja.pocoo.org/docs/dev/templates/#float) and [`int`](http://jinja.pocoo.org/docs/dev/templates/#int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
-
-Remembering these simple rules will help save you from many headaches and endless hours of frustration when using automation templates.
-
-## Trigger State Object
-
-Knowing how to access the [state object](/docs/configuration/state_object/) of a trigger entity can be useful in automations. Here are a few ways to access the [`state`](#state), [`numeric state`](#numeric-state) and [`template`](#template) triggers:
-
-* `trigger.from_state` will return the **previous** [state object](/docs/configuration/state_object/) of the entity.
-* `trigger.to_state` will return the **new** [state object](/docs/configuration/state_object/) that triggered trigger.
-* `states[trigger.to_state.entity_id]` will return the **current** [state object](/docs/configuration/state_object/) of the entity.
+Automations support [templating](/docs/configuration/templating/) in the same way as scripts do. In addition to the [Home Assistant template extensions](/docs/configuration/templating/#home-assistant-template-extensions) available to scripts, the `trigger` template variable is available.
- Be aware that if you reference a `trigger` state object in templates of automation `action`, attempting to test that automation by calling the `automation.trigger` service or by clicking EXECUTE in the More Info box for the automation will not work. This is because the trigger state object doesn't exist in those contexts. One way to test automations like these is to manually check that the templates work as expected by pasting them in Developer Tools > Template together with your trigger's definition like:
+ Be aware that if you reference a `trigger` state object in templates of an automation' `action` or `condition` sections, attempting to test that automation by calling the `automation.trigger` service or by clicking EXECUTE in the More Info box for the automation will not work. This is because the trigger state object doesn't exist in those contexts. One way to test automations like these is to manually check that the templates work as expected by pasting them in Developer Tools > Template together with your trigger's definition like:
{%raw%}
```yaml
@@ -180,4 +116,49 @@ The following tables show the available trigger data per platform.
| `trigger.zone` | State object of zone
| `trigger.event` | Event that trigger observed: `enter` or `leave`.
+## Examples
+
+{% raw %}
+```yaml
+# Example configuration.yaml entries
+automation:
+ trigger:
+ platform: state
+ entity_id: device_tracker.paulus
+ action:
+ service: notify.notify
+ data:
+ message: >
+ Paulus just changed from {{ trigger.from_state.state }}
+ to {{ trigger.to_state.state }}
+
+automation 2:
+ trigger:
+ platform: mqtt
+ topic: /notify/+
+ action:
+ service: >
+ notify.{{ trigger.topic.split('/')[-1] }}
+ data:
+ message: "{{ trigger.payload }}"
+
+automation 3:
+ trigger:
+ # Multiple entities for which you want to perform the same action.
+ - platform: state
+ entity_id:
+ - light.bedroom_closet
+ - light.kiddos_closet
+ - light.linen_closet
+ to: "on"
+ # Trigger when someone leaves one of those lights on for 10 minutes.
+ for: "00:10:00"
+ action:
+ - service: light.turn_off
+ data:
+ # Turn off whichever entity triggered the automation.
+ entity_id: "{{ trigger.entity_id }}"
+```
+{% endraw %}
+
[state object]: /docs/configuration/state_object/
diff --git a/source/_docs/automation/yaml.markdown b/source/_docs/automation/yaml.markdown
index 1929edab832..b21bcea57c4 100644
--- a/source/_docs/automation/yaml.markdown
+++ b/source/_docs/automation/yaml.markdown
@@ -117,6 +117,8 @@ automation:
If you want to migrate your manual automations to use the editor, you'll have to copy them to `automations.yaml`. Make sure that `automations.yaml` remains a list! For each automation that you copy over, you'll have to add an `id`. This can be any string as long as it's unique.
+{% raw %}
+
```yaml
# Example automations.yaml entry. Note, automations.yaml is always a list!
- id: my_unique_id # <-- Required for editor to work, for automations created with the editor the id will be automatically generated.
@@ -131,11 +133,13 @@ If you want to migrate your manual automations to use the editor, you'll have to
entity_id: sensor.temperature
above: 17
below: 25
- value_template: '{% raw %}{{ float(state.state) + 2 }}{% endraw %}'
+ value_template: "{{ float(state.state) + 2 }}"
action:
- service: light.turn_on
```
+{% endraw %}
+
### Deleting Automations
When automations remain visible in the Home Assistant Dashboard, even after having deleted in the YAML file, you have to delete them in the UI.
diff --git a/source/_docs/blueprint/schema.markdown b/source/_docs/blueprint/schema.markdown
index a0e7c06a129..c514467a495 100644
--- a/source/_docs/blueprint/schema.markdown
+++ b/source/_docs/blueprint/schema.markdown
@@ -96,7 +96,7 @@ a default value and also provide a [selector](/docs/blueprint/selectors/) that
ensures a matching input field in the user interface.
Each input field can be referred to, outside of the blueprint metadata, using
-the `!input` custom tag.
+the `!input` custom YAML tag.
The following example shows a minimal blueprint with a single input:
@@ -117,6 +117,19 @@ was used in the user interface, a text input field would be shown to the user.
A blueprint can have as many inputs as you like.
+### Blueprint inputs in templates
+
+The inputs are available as custom YAML tags, but not as template variables.
+To use a blueprint input in a template, it first needs to be exposed as either
+a [script level variable](/integrations/script/#-configuration-variables) or in
+a [variable script step](/docs/scripts/#variables).
+
+```yaml
+variables:
+ # Make input my_input available as a script level variable
+ my_input: !input my_input
+```
+
## Example blueprints
The [built-in blueprints][blueprint-built-in]
diff --git a/source/_docs/blueprint/tutorial.markdown b/source/_docs/blueprint/tutorial.markdown
index 53727ee8753..ec95e596db2 100644
--- a/source/_docs/blueprint/tutorial.markdown
+++ b/source/_docs/blueprint/tutorial.markdown
@@ -54,7 +54,7 @@ blueprint:
Now we have to decide what steps we want to make configurable. We want to make it as re-usable as possible, without losing its original intent of turning on a light-based on a motion sensor.
-Configurable parts in blueprints are called inputs. To make the motion sensor entity configurable, we're replacing the entity ID with a custom YAML tag `!input`. This YAML tag has to be combined with the name of the input:
+Configurable parts in blueprints are called [inputs](/docs/blueprint/schema/#blueprint-inputs). To make the motion sensor entity configurable, we're replacing the entity ID with a custom YAML tag `!input`. This YAML tag has to be combined with the name of the input:
```yaml
trigger:
diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown
index 80b9298657f..6892f38d405 100644
--- a/source/_docs/configuration/templating.markdown
+++ b/source/_docs/configuration/templating.markdown
@@ -44,6 +44,17 @@ script:
```
{% endraw %}
+### Important Template Rules
+
+There are a few very important rules to remember when adding templates to YAML:
+
+1. You **must** surround single-line templates with double quotes (`"`) or single quotes (`'`).
+1. It is advised that you prepare for undefined variables by using `if ... is not none` or the [`default` filter](http://jinja.pocoo.org/docs/dev/templates/#default), or both.
+1. It is advised that when comparing numbers, you convert the number(s) to a [`float`](http://jinja.pocoo.org/docs/dev/templates/#float) or an [`int`](http://jinja.pocoo.org/docs/dev/templates/#int) by using the respective [filter](http://jinja.pocoo.org/docs/dev/templates/#list-of-builtin-filters).
+1. While the [`float`](http://jinja.pocoo.org/docs/dev/templates/#float) and [`int`](http://jinja.pocoo.org/docs/dev/templates/#int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
+
+Remembering these simple rules will help save you from many headaches and endless hours of frustration when using automation templates.
+
## Home Assistant template extensions
Extensions allow templates to access all of the Home Assistant specific states and adds other convenience functions and filters.
diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown
index 5f4e1ce56dc..2b836fe39cc 100644
--- a/source/_docs/mqtt/discovery.markdown
+++ b/source/_docs/mqtt/discovery.markdown
@@ -422,7 +422,7 @@ Setting up a device tracker:
"state_topic": "homeassistant/device_tracker/paulus/state",
"payload_home": "home",
"payload_not_home": "not_home",
- "source_type": "bluetooth",
+ "source_type": "bluetooth"
}
```
@@ -438,6 +438,6 @@ If the device supports gps co-ordinates then they can be sent to Home Assistant
{
"latitude": 32.87336,
"longitude": -117.22743,
- "gps_accuracy": 1.2,
+ "gps_accuracy": 1.2
}
```
diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown
index 11d25da7caa..d17ef32caf0 100644
--- a/source/_docs/scripts.markdown
+++ b/source/_docs/scripts.markdown
@@ -5,6 +5,8 @@ description: "Documentation for the Home Assistant Script Syntax."
Scripts are a sequence of actions that Home Assistant will execute. Scripts are available as an entity through the standalone [Script component] but can also be embedded in [automations] and [Alexa/Amazon Echo] configurations.
+When the script is executed within an automation the `trigger` variable is available. See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data).
+
The script syntax basic structure is a list of key/value maps that contain actions. If a script contains only 1 action, the wrapping list can be omitted.
```yaml
@@ -62,7 +64,7 @@ Scripts may also use a shortcut syntax for activating scenes instead of calling
## Variables
-The variables command allows you to set/override variables that will be accessible by templates in actions after it. See also [script variables] for how to define variables accessible in the entire script.
+The variables action allows you to set/override variables that will be accessible by templates in actions after it. See also [script variables] for how to define variables accessible in the entire script.
{% raw %}
@@ -141,8 +143,6 @@ All forms accept templates.
These actions allow a script to wait for entities in the system to be in a certain state as specified by a template, or some event to happen as expressed by one or more triggers.
-When used within an automation the `trigger` variable is available. See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data).
-
### Wait Template
This action evaluates the template, and if true, the script will continue. If not, then it will wait until it is true.
@@ -272,6 +272,8 @@ This action allows you to fire an event. Events can be used for many things. It
You can also use event_data to fire an event with custom data. This could be used to pass data to another script awaiting
an event trigger.
+The `event_data` accepts templates.
+
{% raw %}
```yaml
@@ -285,7 +287,7 @@ an event trigger.
### Raise and Consume Custom Events
-The following automation shows how to raise a custom event called `event_light_state_changed` with `entity_id` as the event data. The action part could be inside a script or an automation.
+The following automation example shows how to raise a custom event called `event_light_state_changed` with `entity_id` as the event data. The action part could be inside a script or an automation.
```yaml
- alias: Fire Event
@@ -299,7 +301,7 @@ The following automation shows how to raise a custom event called `event_light_s
state: "on"
```
-The following automation shows how to capture the custom event `event_light_state_changed`, and retrieve corresponding `entity_id` that was passed as the event data.
+The following automation example shows how to capture the custom event `event_light_state_changed` with an [Event Automation Trigger](/docs/automation/trigger#event-trigger), and retrieve corresponding `entity_id` that was passed as the event trigger data, see [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data) for more details.
{% raw %}
diff --git a/source/_integrations/beewi_smartclim.markdown b/source/_integrations/beewi_smartclim.markdown
index 8bf844bdb3a..62b357cf17c 100644
--- a/source/_integrations/beewi_smartclim.markdown
+++ b/source/_integrations/beewi_smartclim.markdown
@@ -51,7 +51,7 @@ To use your Mi Temperature and Humidity sensor in your installation, add the fol
# Example configuration.yaml entry
sensor:
- platform: beewi_smartclim
- mac: 'xx:xx:xx:xx:xx:xx'
+ mac: "xx:xx:xx:xx:xx:xx"
```
{% configuration %}
@@ -73,6 +73,6 @@ A full configuration example could look like the one below:
# Example configuration.yaml entry
sensor:
- platform: beewi_smartclim
- mac: 'xx:xx:xx:xx:xx:xx'
+ mac: "xx:xx:xx:xx:xx:xx"
name: Garden
```
diff --git a/source/_integrations/binary_sensor.mqtt.markdown b/source/_integrations/binary_sensor.mqtt.markdown
index 7e12e59a19f..428f376dfaf 100644
--- a/source/_integrations/binary_sensor.mqtt.markdown
+++ b/source/_integrations/binary_sensor.mqtt.markdown
@@ -195,7 +195,7 @@ binary_sensor:
payload_not_available: "offline"
qos: 0
device_class: opening
- value_template: '{{ value_json.state }}'
+ value_template: "{{ value_json.state }}"
```
{% endraw %}
diff --git a/source/_integrations/cast.markdown b/source/_integrations/cast.markdown
index 9993a904cd3..ff5b3509524 100644
--- a/source/_integrations/cast.markdown
+++ b/source/_integrations/cast.markdown
@@ -117,8 +117,8 @@ You can play MP3 streams like net radios, FLAC files or videos from your local n
service: media_player.play_media
data:
entity_id: media_player.chromecast
- media_content_type: 'video'
- media_content_id: 'http://192.168.0.100/movies/sample-video.mkv'
+ media_content_type: "video"
+ media_content_id: "http://192.168.0.100/movies/sample-video.mkv"
```
```yaml
@@ -126,8 +126,8 @@ data:
service: media_player.play_media
data:
entity_id: media_player.chromecast
- media_content_type: 'image/jpeg'
- media_content_id: 'http://via.placeholder.com/1024x600.jpg/0B6B94/FFFFFF/?text=Hello,%20Home%20Assistant!'
+ media_content_type: "image/jpeg"
+ media_content_id: "http://via.placeholder.com/1024x600.jpg/0B6B94/FFFFFF/?text=Hello,%20Home%20Assistant!"
```
Extra media metadata (for example title, subtitle, artist or album name) can be passed into the service and that will be shown on the Chromecast display.
@@ -138,15 +138,15 @@ For the possible metadata types and values check [Google cast documentation > Me
service: media_player.play_media
data:
entity_id: media_player.chromecast
- media_content_type: 'video/mp4'
- media_content_id: 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4'
+ media_content_type: "video/mp4"
+ media_content_id: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
extra:
metadata:
metadataType: 1
- title: 'Big Buck Bunny'
- subtitle: 'By Blender Foundation, Licensed under the Creative Commons Attribution license'
+ title: "Big Buck Bunny"
+ subtitle: "By Blender Foundation, Licensed under the Creative Commons Attribution license"
images:
- - url: 'https://peach.blender.org/wp-content/uploads/watchtrailer.gif'
+ - url: "https://peach.blender.org/wp-content/uploads/watchtrailer.gif"
```
```yaml
@@ -154,15 +154,15 @@ data:
service: media_player.play_media
data:
entity_id: media_player.chromecast
- media_content_type: 'audio/mp3'
- media_content_id: 'http://stream.tilos.hu:8000/tilos'
+ media_content_type: "audio/mp3"
+ media_content_id: "http://stream.tilos.hu:8000/tilos"
extra:
metadata:
metadataType: 3
- title: 'Radio TILOS'
- artist: 'LIVE'
+ title: "Radio TILOS"
+ artist: "LIVE"
images:
- - url: 'https://tilos.hu/images/kockalogo.png'
+ - url: "https://tilos.hu/images/kockalogo.png"
```
## Advanced use
diff --git a/source/_integrations/clicksend.markdown b/source/_integrations/clicksend.markdown
index d5b6e09f501..ebc067930c0 100644
--- a/source/_integrations/clicksend.markdown
+++ b/source/_integrations/clicksend.markdown
@@ -57,7 +57,7 @@ sender:
description: The name or number of the sender. (Limited to 11 characters.)
required: false
type: string
- default: 'hass'
+ default: "hass"
{% endconfiguration %}
To use notifications, please see the [getting started with automation page](/getting-started/automation/).
diff --git a/source/_integrations/climate.markdown b/source/_integrations/climate.markdown
index 338233d60b3..324390b81ca 100644
--- a/source/_integrations/climate.markdown
+++ b/source/_integrations/climate.markdown
@@ -68,7 +68,7 @@ automation:
- service: climate.set_preset_mode
data:
entity_id: climate.kitchen
- preset_mode: 'eco'
+ preset_mode: "eco"
```
### Service `climate.set_temperature`
@@ -157,7 +157,7 @@ automation:
- service: climate.set_fan_mode
data:
entity_id: climate.kitchen
- fan_mode: 'On Low'
+ fan_mode: "On Low"
```
### Service `climate.set_hvac_mode`
diff --git a/source/_integrations/color_extractor.markdown b/source/_integrations/color_extractor.markdown
index c4998926dd5..e35112f0064 100644
--- a/source/_integrations/color_extractor.markdown
+++ b/source/_integrations/color_extractor.markdown
@@ -68,7 +68,7 @@ Example usage in an automation, taking the album art present on a Chromecast and
action:
- service: color_extractor.turn_on
data_template:
- color_extract_url: '{{ states.media_player.chromecast.attributes.entity_picture }}'
+ color_extract_url: "{{ states.media_player.chromecast.attributes.entity_picture }}"
entity_id: light.shelf_leds
```
@@ -85,7 +85,7 @@ With a nicer transition period of 5 seconds and setting brightness to 100% each
action:
- service: color_extractor.turn_on
data_template:
- color_extract_url: '{{ states.media_player.chromecast.attributes.entity_picture }}'
+ color_extract_url: "{{ states.media_player.chromecast.attributes.entity_picture }}"
entity_id: light.shelf_leds
brightness_pct: 100
transition: 5
diff --git a/source/_integrations/command_line.markdown b/source/_integrations/command_line.markdown
index 2d58016c048..78d177f5980 100644
--- a/source/_integrations/command_line.markdown
+++ b/source/_integrations/command_line.markdown
@@ -19,7 +19,7 @@ To use your Command binary sensor in your installation, add the following to you
# Example configuration.yaml entry
binary_sensor:
- platform: command_line
- command: 'cat /proc/sys/net/ipv4/ip_forward'
+ command: "cat /proc/sys/net/ipv4/ip_forward"
```
@@ -81,7 +81,7 @@ Check the state of an [SickRage](https://github.com/sickragetv/sickrage) instanc
binary_sensor:
- platform: command_line
command: 'netstat -na | find "33322" | find /c "LISTENING" > nul && (echo "Running") || (echo "Not running")'
- name: 'sickragerunning'
+ name: "sickragerunning"
device_class: moving
payload_on: "Running"
payload_off: "Not running"
@@ -95,7 +95,7 @@ Check if [RasPlex](https://github.com/RasPlex/RasPlex) is `online`.
binary_sensor:
- platform: command_line
command: 'ping -c 1 rasplex.local | grep "1 received" | wc -l'
- name: 'is_rasplex_online'
+ name: "is_rasplex_online"
device_class: connectivity
payload_on: 1
payload_off: 0
@@ -133,8 +133,8 @@ A binary command line sensor can check this:
binary_sensor:
- platform: command_line
command: '/bin/systemctl is-active home-assistant@rock64.service'
- payload_on: 'active'
- payload_off: 'inactive'
+ payload_on: "active"
+ payload_off: "inactive"
```
## Services
diff --git a/source/_integrations/cover.mqtt.markdown b/source/_integrations/cover.mqtt.markdown
index 40ffc1f021f..4b350bf1e2b 100644
--- a/source/_integrations/cover.mqtt.markdown
+++ b/source/_integrations/cover.mqtt.markdown
@@ -288,7 +288,7 @@ cover:
payload_available: "online"
payload_not_available: "offline"
optimistic: false
- value_template: '{{ value.x }}'
+ value_template: "{{ value.x }}"
```
{% endraw %}
@@ -319,7 +319,7 @@ cover:
payload_available: "online"
payload_not_available: "offline"
optimistic: false
- value_template: '{{ value.x }}'
+ value_template: "{{ value.x }}"
```
{% endraw %}
@@ -351,9 +351,9 @@ cover:
payload_available: "online"
payload_not_available: "offline"
optimistic: false
- value_template: '{{ value.x }}'
- tilt_command_topic: 'home-assistant/cover/tilt'
- tilt_status_topic: 'home-assistant/cover/tilt-state'
+ value_template: "{{ value.x }}"
+ tilt_command_topic: "home-assistant/cover/tilt"
+ tilt_status_topic: "home-assistant/cover/tilt-state"
tilt_status_template: '{{ value_json["PWM"]["PWM1"] }}'
tilt_min: 0
tilt_max: 180
diff --git a/source/_integrations/cover.template.markdown b/source/_integrations/cover.template.markdown
index 215db5e5844..6817460ba63 100644
--- a/source/_integrations/cover.template.markdown
+++ b/source/_integrations/cover.template.markdown
@@ -199,15 +199,15 @@ cover:
open_cover:
service: script.cover_group
data:
- modus: 'open'
+ modus: "open"
close_cover:
service: script.cover_group
data:
- modus: 'close'
+ modus: "close"
stop_cover:
service: script.cover_group
data:
- modus: 'stop'
+ modus: "stop"
set_cover_position:
service: script.cover_group_position
data:
@@ -255,7 +255,7 @@ automation:
trigger:
- platform: sun
event: sunset
- offset: '+00:30:00'
+ offset: "+00:30:00"
action:
- service: cover.set_cover_position
data:
@@ -280,15 +280,15 @@ cover:
open_cover:
service: script.cover_group
data:
- modus: 'open'
+ modus: "open"
close_cover:
service: script.cover_group
data:
- modus: 'close'
+ modus: "close"
stop_cover:
service: script.cover_group
data:
- modus: 'stop'
+ modus: "stop"
value_template: "{{is_state('sensor.cover_group', 'open')}}"
icon_template: >-
{% if is_state('sensor.cover_group', 'open') %}
@@ -315,15 +315,15 @@ cover:
open_cover:
service: script.cover_group
data:
- modus: 'open'
+ modus: "open"
close_cover:
service: script.cover_group
data:
- modus: 'close'
+ modus: "close"
stop_cover:
service: script.cover_group
data:
- modus: 'stop'
+ modus: "stop"
value_template: "{{is_state('sensor.cover_group', 'open')}}"
icon_template: >-
{% if is_state('sensor.cover_group', 'open') %}
diff --git a/source/_integrations/deconz.markdown b/source/_integrations/deconz.markdown
index 73cec5f60ad..67892c607af 100644
--- a/source/_integrations/deconz.markdown
+++ b/source/_integrations/deconz.markdown
@@ -280,7 +280,7 @@ automation:
trigger:
- platform: state
entity_id: binary_sensor.doorbell_motion
- to: 'on'
+ to: "on"
action:
- service: deconz.configure
data:
diff --git a/source/_integrations/default_config.markdown b/source/_integrations/default_config.markdown
index 0375afa36b6..17214f4e08c 100644
--- a/source/_integrations/default_config.markdown
+++ b/source/_integrations/default_config.markdown
@@ -14,6 +14,7 @@ This integration is a meta-component and configures a default set of integration
- [Home Assistant Cloud](/integrations/cloud/) (`cloud`)
- [Configuration](/integrations/config/) (`config`)
- [Counter](/integrations/counter/) (`counter`)
+- [DHCP Discovery](/integrations/dhcp/) (`dhcp`)
- [Frontend](/integrations/frontend/) (`frontend`)
- [History](/integrations/history/) (`history`)
- [Image](/integrations/image/) (`image`)
diff --git a/source/_integrations/delijn.markdown b/source/_integrations/delijn.markdown
index 29776604907..80e9670a635 100644
--- a/source/_integrations/delijn.markdown
+++ b/source/_integrations/delijn.markdown
@@ -27,7 +27,7 @@ To enable this sensor, add the following lines to your `configuration.yaml` file
# Example configuration.yaml entry
sensor:
- platform: delijn
- api_key: 'API_SUBSCRIPTION_KEY'
+ api_key: "API_SUBSCRIPTION_KEY"
next_departure:
- stop_id: 'STOP_ID'
```
@@ -64,7 +64,7 @@ The example below shows a full configuration with two sensors, only the abcdefg
sensor:
# De Lijn public transport
- platform: delijn
- api_key: 'abcdefg'
+ api_key: "abcdefg"
next_departure:
- stop_id: '200018'
- stop_id: '201169'
diff --git a/source/_integrations/deutsche_bahn.markdown b/source/_integrations/deutsche_bahn.markdown
index 6ecb09bfbcf..6944f4011df 100644
--- a/source/_integrations/deutsche_bahn.markdown
+++ b/source/_integrations/deutsche_bahn.markdown
@@ -42,14 +42,18 @@ only_direct:
This sensor stores a lot of attributes which can be accessed by other sensors, e.g., a [template sensor](/integrations/template).
+{% raw %}
+
```yaml
# Example configuration.yaml entry
sensor:
platform: template
sensors:
next_departure:
- value_template: '{% raw %}{{ state_attr('sensor.munich_to_ulm', 'next') }}{% endraw %}'
- friendly_name: 'Next departure'
+ value_template: "{{ state_attr('sensor.munich_to_ulm', 'next') }}"
+ friendly_name: "Next departure"
```
+{% endraw %}
+
The data is coming from the [bahn.de](https://www.bahn.de/p/view/index.shtml) website.
diff --git a/source/_integrations/device_tracker.mqtt.markdown b/source/_integrations/device_tracker.mqtt.markdown
index 678a65cd092..1c777d8f7a6 100644
--- a/source/_integrations/device_tracker.mqtt.markdown
+++ b/source/_integrations/device_tracker.mqtt.markdown
@@ -9,9 +9,9 @@ ha_domain: mqtt
---
-The `mqtt` device tracker 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.
+The `mqtt` device tracker platform allows you to define new device_trackers through [manual YAML configuration](#yaml-configuration) in `configuration.yaml` and also to automatically discover device_trackers through a [discovery schema](#discovery-schema) using the MQTT Discovery protocol.
-## Configuration
+## YAML Configuration
To use this device tracker in your installation, add the following to your `configuration.yaml` file:
@@ -20,8 +20,8 @@ To use this device tracker in your installation, add the following to your `conf
device_tracker:
- platform: mqtt
devices:
- paulus_oneplus: 'location/paulus'
- annetherese_n4: 'location/annetherese'
+ paulus_oneplus: "location/paulus"
+ annetherese_n4: "location/annetherese"
```
{% configuration %}
@@ -37,40 +37,181 @@ payload_home:
description: The payload value that represents the 'home' state for the device.
required: false
type: string
- default: 'home'
+ default: "home"
payload_not_home:
description: The payload value that represents the 'not_home' state for the device.
required: false
type: string
- default: 'not_home'
+ default: "not_home"
source_type:
description: Attribute of a device tracker that affects state when being used to track a [person](/integrations/person/). Valid options are `gps`, `router`, `bluetooth`, or `bluetooth_le`.
required: false
type: string
{% endconfiguration %}
-## Complete example configuration
+## Complete YAML example configuration
```yaml
# Complete configuration.yaml entry
device_tracker:
- platform: mqtt
devices:
- paulus_oneplus: 'location/paulus'
- annetherese_n4: 'location/annetherese'
+ paulus_oneplus: "location/paulus"
+ annetherese_n4: "location/annetherese"
qos: 1
- payload_home: 'present'
- payload_not_home: 'not present'
+ payload_home: "present"
+ payload_not_home: "not present"
source_type: bluetooth
```
-## Usage
+## YAML Usage
-Example JSON you can publish to the topic (e.g., via mqtt.publish service):
+To set the state of the device_tracker then you need to publish a JSON message to the topic (e.g., via mqtt.publish service). As an example, the following JSON message would set the `paulus_oneplus` device_tracker to `home`:
```json
{
"topic": "location/paulus",
- "payload": "home"
+ "payload": "present"
}
```
+
+## Discovery Schema
+
+MQTT device_trackers are also supported through [MQTT discovery](/docs/mqtt/discovery/). This is different to the YAML configuration from above. Here, the device_tracker can be created via a discovery topic that follows the following topic name convention: `
/device_tracker/[/]/config` and the JSON message content of a specific format as defined below.
+
+{% configuration %}
+availability:
+ description: A list of MQTT topics subscribed to receive availability (online/offline) updates. Must not be used together with `availability_topic`.
+ required: false
+ type: list
+ keys:
+ payload_available:
+ description: The payload that represents the available state.
+ required: false
+ type: string
+ default: online
+ payload_not_available:
+ description: The payload that represents the unavailable state.
+ required: false
+ type: string
+ default: offline
+ topic:
+ description: An MQTT topic subscribed to receive availability (online/offline) updates.
+ required: true
+ type: string
+availability_mode:
+ description: When `availability` is configured, this controls the conditions needed to set the entity to `available`. Valid entries are `all`, `any`, and `latest`. If set to `all`, `payload_available` must be received on all configured availability topics before the entity is marked as online. If set to `any`, `payload_available` must be received on at least one configured availability topic before the entity is marked as online. If set to `latest`, the last `payload_available` or `payload_not_available` received on any configured availability topic controls the availability.
+ required: false
+ type: string
+ default: latest
+availability_topic:
+ description: The MQTT topic subscribed to receive availability (online/offline) updates. Must not be used together with `availability`.
+ required: false
+ type: string
+device:
+ description: "Information about the device this device tracker is a part of that ties it into the [device registry](https://developers.home-assistant.io/docs/en/device_registry_index.html)."
+ required: false
+ type: map
+ keys:
+ connections:
+ description: "A list of connections of the device to the outside world as a list of tuples `[connection_type, connection_identifier]`. For example the MAC address of a network interface: `'connections': ['mac', '02:5b:26:a8:dc:12']`."
+ required: false
+ type: [list, map]
+ identifiers:
+ description: A list of IDs that uniquely identify the device. For example a serial number.
+ required: false
+ type: [list, string]
+ manufacturer:
+ description: The manufacturer of the device.
+ required: false
+ type: string
+ model:
+ description: The model of the device.
+ required: false
+ type: string
+ name:
+ description: The name of the device.
+ required: false
+ type: string
+ sw_version:
+ description: The firmware version of the device.
+ required: false
+ type: string
+ via_device:
+ description: 'Identifier of a device that routes messages between this device and Home Assistant. Examples of such devices are hubs, or parent devices of a sub-device. This is used to show device topology in Home Assistant.'
+ required: false
+ type: string
+icon:
+ description: The icon for the device tracker.
+ required: false
+ type: icon
+json_attributes_template:
+ description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the JSON dictionary from messages received on the `json_attributes_topic`. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-template-configuration) documentation."
+ required: false
+ type: template
+json_attributes_topic:
+ description: The MQTT topic subscribed to receive a JSON dictionary payload and then set as device_tracker attributes. Usage example can be found in [MQTT sensor](/integrations/sensor.mqtt/#json-attributes-topic-configuration) documentation.
+ required: false
+ type: string
+name:
+ description: The name of the MQTT device_tracker.
+ required: false
+ type: string
+payload_available:
+ description: The payload that represents the available state.
+ required: false
+ type: string
+ default: online
+payload_home:
+ description: The payload value that represents the 'home' state for the device.
+ required: false
+ type: string
+ default: home
+payload_not_available:
+ description: The payload that represents the unavailable state.
+ required: false
+ type: string
+ default: offline
+payload_not_home:
+ description: The payload value that represents the 'not_home' state for the device.
+ required: false
+ type: string
+ default: not_home
+qos:
+ description: The maximum QoS level of the state topic.
+ required: false
+ type: integer
+ default: 0
+source_type:
+ description: Attribute of a device tracker that affects state when being used to track a [person](/integrations/person/). Valid options are `gps`, `router`, `bluetooth`, or `bluetooth_le`.
+ required: false
+ type: string
+state_topic:
+ description: The MQTT topic subscribed to receive device tracker state changes.
+ required: true
+ type: string
+unique_id:
+ description: "An ID that uniquely identifies this device_tracker. If two device_trackers have the same unique ID, Home Assistant will raise an exception."
+ required: false
+ type: string
+value_template:
+ description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) that returns a device tracker state."
+ required: false
+ type: template
+{% endconfiguration %}
+
+## Discovery Example
+
+You can use the discovery protocol to create a new device tracker and set it's state using the command line tool `mosquitto_pub` shipped with `mosquitto` or the `mosquitto-clients` package to send MQTT messages.
+
+To create the device_tracker:
+
+```bash
+mosquitto_pub -h 127.0.0.1 -t home-assistant/device_tracker/a4567d663eaf/config -m '{"state_topic": "a4567d663eaf/state", "name": "My Tracker", "payload_home": "home", "payload_not_home": "not_home"}'
+```
+
+To set the state of the device tracker to "home":
+
+```bash
+mosquitto_pub -h 127.0.0.1 -t a4567d663eaf/state -m 'home'
+```
diff --git a/source/_integrations/dexcom.markdown b/source/_integrations/dexcom.markdown
index 6771e3db619..0c82d9375ae 100644
--- a/source/_integrations/dexcom.markdown
+++ b/source/_integrations/dexcom.markdown
@@ -49,8 +49,8 @@ If you have a sensor session running, and once you have enabled the Dexcom integ
entity_id: sensor.dexcom_YOUR_USERNAME_glucose_value
platform: numeric_state
condition: time
- after: '22:00:00'
- before: '06:00:00'
+ after: "22:00:00"
+ before: "06:00:00"
action:
- service: light.turn_on
data:
diff --git a/source/_integrations/dovado.markdown b/source/_integrations/dovado.markdown
index 4a9f22ba37b..8a597aae16b 100644
--- a/source/_integrations/dovado.markdown
+++ b/source/_integrations/dovado.markdown
@@ -73,8 +73,8 @@ automation:
action:
service: notify.dovado
data:
- message: 'The sun has set'
- target: '+14151234567'
+ message: "The sun has set"
+ target: "+14151234567"
```
## Sensor
diff --git a/source/_integrations/dweet.markdown b/source/_integrations/dweet.markdown
index ee755d4ab81..8ef019d5ddc 100644
--- a/source/_integrations/dweet.markdown
+++ b/source/_integrations/dweet.markdown
@@ -66,7 +66,7 @@ To use Dweet.io sensors in your installation, add the following to your `configu
sensor:
- platform: dweet
device: THING_NAME
- value_template: '{{ value_json.VARIABLE }}'
+ value_template: "{{ value_json.VARIABLE }}"
```
{% endraw %}
@@ -103,7 +103,7 @@ sensor:
- platform: dweet
name: Temperature
device: THING_NAME
- value_template: '{{ value_json.VARIABLE }}'
+ value_template: "{{ value_json.VARIABLE }}"
unit_of_measurement: "°C"
```
diff --git a/source/_integrations/dynalite.markdown b/source/_integrations/dynalite.markdown
index e3ba2739b04..159661f381c 100755
--- a/source/_integrations/dynalite.markdown
+++ b/source/_integrations/dynalite.markdown
@@ -284,9 +284,9 @@ dynalite:
template: time_cover
preset:
'1':
- name: 'On'
+ name: "On"
'4':
- name: 'Off'
+ name: "Off"
template:
room:
room_on: 1
diff --git a/source/_integrations/dyson.markdown b/source/_integrations/dyson.markdown
index 78c77f58354..61fe214f17d 100644
--- a/source/_integrations/dyson.markdown
+++ b/source/_integrations/dyson.markdown
@@ -191,7 +191,7 @@ Set the oscillation angle of the selected fan(s).
| `angle_low` | Yes | The angle at which the oscillation should start | 1 |
| `angle_high` | Yes | The angle at which the oscillation should end | 255 |
-#### Service `dyson.flow_direction_front` (only for DP04 and TP04)
+#### Service `dyson.set_flow_direction_front` (only for DP04 and TP04)
Set the fan flow direction.
diff --git a/source/_integrations/ebusd.markdown b/source/_integrations/ebusd.markdown
index 5045f451091..a974c48a005 100644
--- a/source/_integrations/ebusd.markdown
+++ b/source/_integrations/ebusd.markdown
@@ -18,7 +18,7 @@ Enable the sensor by adding the following to your `configuration.yaml` file:
# Example configuration.yaml entry
ebusd:
host: 127.0.0.1
- circuit: '700'
+ circuit: "700"
```
{% configuration %}
diff --git a/source/_integrations/ecovacs.markdown b/source/_integrations/ecovacs.markdown
index 9699d5c664d..5cbe6bfc275 100644
--- a/source/_integrations/ecovacs.markdown
+++ b/source/_integrations/ecovacs.markdown
@@ -90,7 +90,7 @@ sensor:
sensors:
vacuum_filter:
friendly_name: "Vacuum Filter Remaining Lifespan"
- unit_of_measurement: '%'
+ unit_of_measurement: "%"
value_template: "{{ state_attr('vacuum.my_vacuum_id', 'component_filter') }}"
```
diff --git a/source/_integrations/edimax.markdown b/source/_integrations/edimax.markdown
index 0871a5c912a..02c04b885c4 100644
--- a/source/_integrations/edimax.markdown
+++ b/source/_integrations/edimax.markdown
@@ -52,12 +52,12 @@ Starting with [version 2 of the firmware](https://www.edimax.com/edimax/download
sensors:
edimax_current_power:
friendly_name: Edimax Current power consumption
- unit_of_measurement: 'W'
+ unit_of_measurement: "W"
value_template: "{{ state_attr('switch.edimax_smart_plug', 'current_power_w') | replace('None', 0) }}"
edimax_total_power:
friendly_name: Edimax Accumulated daily power consumption
- unit_of_measurement: 'kWh'
+ unit_of_measurement: "kWh"
value_template: "{{ state_attr('switch.edimax_smart_plug', 'today_energy_kwh') | replace('None', 0) }}"
```
diff --git a/source/_integrations/egardia.markdown b/source/_integrations/egardia.markdown
index 2a924b0b312..e998443a23c 100644
--- a/source/_integrations/egardia.markdown
+++ b/source/_integrations/egardia.markdown
@@ -45,7 +45,7 @@ version:
description: The version of the Egardia system. `GATE-01`, `GATE-02` and `GATE-03` are currently supported.
required: false
type: string
- default: 'GATE-01'
+ default: "GATE-01"
port:
description: The port of the alarm panel.
required: false
diff --git a/source/_integrations/envisalink.markdown b/source/_integrations/envisalink.markdown
index b5ec83cfe76..a0ce1a4745c 100644
--- a/source/_integrations/envisalink.markdown
+++ b/source/_integrations/envisalink.markdown
@@ -33,7 +33,7 @@ envisalink:
panel_type: HONEYWELL or DSC
user_name: YOUR_USERNAME
password: YOUR_PASSWORD
- code: '1234'
+ code: "1234"
port: 4025
evl_version: 3
keepalive_interval: 60
@@ -42,14 +42,14 @@ envisalink:
panic_type: Police
zones:
11:
- name: 'Back Door'
- type: 'opening'
+ name: "Back Door"
+ type: "opening"
21:
- name: 'First Floor Motion'
- type: 'motion'
+ name: "First Floor Motion"
+ type: "motion"
partitions:
1:
- name: 'Home Alarm'
+ name: "Home Alarm"
```
{% configuration %}
diff --git a/source/_integrations/epson.markdown b/source/_integrations/epson.markdown
index fea9839eb27..875dcce5576 100644
--- a/source/_integrations/epson.markdown
+++ b/source/_integrations/epson.markdown
@@ -40,7 +40,7 @@ name:
description: The name of the device used in the frontend.
required: false
type: string
- default: 'EPSON Projector'
+ default: "EPSON Projector"
{% endconfiguration %}
### Supported features
diff --git a/source/_integrations/eq3btsmart.markdown b/source/_integrations/eq3btsmart.markdown
index c35923f11a9..8f86ec3fbd2 100644
--- a/source/_integrations/eq3btsmart.markdown
+++ b/source/_integrations/eq3btsmart.markdown
@@ -42,7 +42,7 @@ climate:
- platform: eq3btsmart
devices:
room1:
- mac: '00:11:22:33:44:55'
+ mac: "00:11:22:33:44:55"
```
{% configuration %}
diff --git a/source/_integrations/etherscan.markdown b/source/_integrations/etherscan.markdown
index 206fba68dd9..964385d31dd 100644
--- a/source/_integrations/etherscan.markdown
+++ b/source/_integrations/etherscan.markdown
@@ -17,7 +17,7 @@ To add the Etherscan sensor to your installation, specify an Ethereum address to
# Example configuration.yaml entry
sensor:
- platform: etherscan
- address: '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359'
+ address: "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"
- platform: etherscan
address: "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"
token: OMG
diff --git a/source/_integrations/ezviz.markdown b/source/_integrations/ezviz.markdown
index a7f29fbbc1e..4c51daab4cb 100644
--- a/source/_integrations/ezviz.markdown
+++ b/source/_integrations/ezviz.markdown
@@ -74,7 +74,7 @@ camera_view: live
elements:
- icon: 'mdi:arrow-up'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
bottom: 50px
right: 25px
tap_action:
@@ -86,7 +86,7 @@ elements:
type: icon
- icon: 'mdi:arrow-down'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
bottom: 0px
right: 25px
tap_action:
@@ -98,7 +98,7 @@ elements:
type: icon
- icon: 'mdi:arrow-left'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
bottom: 25px
right: 50px
tap_action:
@@ -110,7 +110,7 @@ elements:
type: icon
- icon: 'mdi:arrow-right'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
bottom: 25px
right: 0px
tap_action:
@@ -122,7 +122,7 @@ elements:
type: icon
- icon: 'mdi:run-fast'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
top: 25px
right: 25px
tap_action:
@@ -134,7 +134,7 @@ elements:
type: icon
- icon: 'mdi:run'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
top: 25px
right: 0px
tap_action:
@@ -146,7 +146,7 @@ elements:
type: icon
- icon: 'mdi:eye'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 25px
top: 50px
tap_action:
@@ -158,7 +158,7 @@ elements:
type: icon
- icon: 'mdi:eye-off'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 0px
top: 50px
tap_action:
@@ -170,7 +170,7 @@ elements:
type: icon
- icon: 'mdi:volume-high'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 25px
top: 75px
tap_action:
@@ -182,7 +182,7 @@ elements:
type: icon
- icon: 'mdi:volume-off'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 0px
top: 75px
tap_action:
@@ -194,7 +194,7 @@ elements:
type: icon
- icon: 'mdi:led-on'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 25px
top: 100px
tap_action:
@@ -206,7 +206,7 @@ elements:
type: icon
- icon: 'mdi:led-off'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 0px
top: 100px
tap_action:
@@ -218,7 +218,7 @@ elements:
type: icon
- icon: 'mdi:brightness-4'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 25px
top: 100px
tap_action:
@@ -230,7 +230,7 @@ elements:
type: icon
- icon: 'mdi:brightness-5'
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 0px
top: 100px
tap_action:
diff --git a/source/_integrations/facebook.markdown b/source/_integrations/facebook.markdown
index 36533b944ad..17dbaca1bbb 100644
--- a/source/_integrations/facebook.markdown
+++ b/source/_integrations/facebook.markdown
@@ -47,7 +47,7 @@ automation:
action:
service: notify.facebook
data:
- message: 'Good Evening'
+ message: "Good Evening"
target:
- '+919413017584'
- '+919784516314'
diff --git a/source/_integrations/facebox.markdown b/source/_integrations/facebox.markdown
index 8ebe2ee0af5..c4ea7fabee6 100644
--- a/source/_integrations/facebox.markdown
+++ b/source/_integrations/facebox.markdown
@@ -104,7 +104,7 @@ Use the `image_processing.detect_face` events to trigger automations, and breako
platform: event
event_type: image_processing.detect_face
event_data:
- name: 'Ringo_Starr'
+ name: "Ringo_Starr"
action:
service: notify.platform
data:
@@ -184,7 +184,7 @@ you can create an automation to receive notifications on Facebox errors:
action:
- service: notify.pushbullet
data_template:
- message: '{{ trigger.event.data.message }}'
+ message: "{{ trigger.event.data.message }}"
title: Facebox error
```
diff --git a/source/_integrations/familyhub.markdown b/source/_integrations/familyhub.markdown
index c3519fb3995..fba49362ef9 100644
--- a/source/_integrations/familyhub.markdown
+++ b/source/_integrations/familyhub.markdown
@@ -18,7 +18,7 @@ To enable your Family Hub camera in your installation, add the following to your
# Example configuration.yaml entry
camera:
- platform: familyhub
- ip_address: 'IP_ADDRESS'
+ ip_address: "IP_ADDRESS"
```
{% configuration %}
diff --git a/source/_integrations/file.markdown b/source/_integrations/file.markdown
index 4ed2f45425f..353866358b4 100644
--- a/source/_integrations/file.markdown
+++ b/source/_integrations/file.markdown
@@ -106,5 +106,5 @@ sensor:
name: Temperature
file_path: /home/user/.homeassistant/sensor.json
value_template: {% raw %}'{{ value_json.temperature }}'{% endraw %}
- unit_of_measurement: '°C'
+ unit_of_measurement: "°C"
```
diff --git a/source/_integrations/fireservicerota.markdown b/source/_integrations/fireservicerota.markdown
index 7cf918c4df9..9768ab4e2da 100644
--- a/source/_integrations/fireservicerota.markdown
+++ b/source/_integrations/fireservicerota.markdown
@@ -142,7 +142,7 @@ automation:
entity_id: media_player.nest_hub_bedroom
media_content_id: >
{{ state_attr('sensor.incidents','message_to_speech_url') }}
- media_content_type: 'audio/mp4'
+ media_content_type: "audio/mp4"
- alias: 'Send response acknowledgement when a button is pressed'
trigger:
diff --git a/source/_integrations/flux.markdown b/source/_integrations/flux.markdown
index 8a6a5a667bb..da28d284fb1 100644
--- a/source/_integrations/flux.markdown
+++ b/source/_integrations/flux.markdown
@@ -99,8 +99,8 @@ switch:
- light.desk
- light.lamp
name: Fluxer
- start_time: '7:00'
- stop_time: '23:00'
+ start_time: "7:00"
+ stop_time: "23:00"
start_colortemp: 4000
sunset_colortemp: 3000
stop_colortemp: 1900
diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown
index 1d23964e219..ebfe1e9cc32 100644
--- a/source/_integrations/flux_led.markdown
+++ b/source/_integrations/flux_led.markdown
@@ -17,6 +17,7 @@ This integration will provide local control over your LED lights/strips and can
The `flux_led` integration is configured through the Configuration -> Integrations page. You can select either auto configuration or manual configuration. For auto configuration the integration will automatically scan your network for any supported devices.
If you select the manual flow you can specify the name and host address of the light controller. You can add multiple lights/strips by adding additional instances of the integration.
+
### Effects
The Flux LED light offers a number of effects which are not included in other lighting packages. These can be selected from the front-end, or sent in the effect field of the `light.turn_on` command.
diff --git a/source/_integrations/foscam.markdown b/source/_integrations/foscam.markdown
index 465b1d339d5..2062cef880d 100644
--- a/source/_integrations/foscam.markdown
+++ b/source/_integrations/foscam.markdown
@@ -61,9 +61,9 @@ camera_image: camera.bedroom
camera_view: live
elements:
- type: icon
- icon: 'mdi:arrow-up'
+ icon: "mdi:arrow-up"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 25px
bottom: 50px
tap_action:
@@ -73,9 +73,9 @@ elements:
entity_id: camera.bedroom
movement: up
- type: icon
- icon: 'mdi:arrow-down'
+ icon: "mdi:arrow-down"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 25px
bottom: 0px
tap_action:
@@ -85,9 +85,9 @@ elements:
entity_id: camera.bedroom
movement: down
- type: icon
- icon: 'mdi:arrow-left'
+ icon: "mdi:arrow-left"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 50px
bottom: 25px
tap_action:
@@ -97,9 +97,9 @@ elements:
entity_id: camera.bedroom
movement: left
- type: icon
- icon: 'mdi:arrow-right'
+ icon: "mdi:arrow-right"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 0px
bottom: 25px
tap_action:
@@ -109,9 +109,9 @@ elements:
entity_id: camera.bedroom
movement: right
- type: icon
- icon: 'mdi:arrow-top-left'
+ icon: "mdi:arrow-top-left"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 50px
bottom: 50px
tap_action:
@@ -121,9 +121,9 @@ elements:
entity_id: camera.bedroom
movement: top_left
- type: icon
- icon: 'mdi:arrow-top-right'
+ icon: "mdi:arrow-top-right"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 0px
bottom: 50px
tap_action:
@@ -133,9 +133,9 @@ elements:
entity_id: camera.bedroom
movement: top_right
- type: icon
- icon: 'mdi:arrow-bottom-left'
+ icon: "mdi:arrow-bottom-left"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 50px
bottom: 0px
tap_action:
@@ -145,9 +145,9 @@ elements:
entity_id: camera.bedroom
movement: bottom_left
- type: icon
- icon: 'mdi:arrow-bottom-right'
+ icon: "mdi:arrow-bottom-right"
style:
- background: 'rgba(255, 255, 255, 0.5)'
+ background: "rgba(255, 255, 255, 0.5)"
right: 0px
bottom: 0px
tap_action:
diff --git a/source/_integrations/frontier_silicon.markdown b/source/_integrations/frontier_silicon.markdown
index ed5c2694321..3959070439a 100644
--- a/source/_integrations/frontier_silicon.markdown
+++ b/source/_integrations/frontier_silicon.markdown
@@ -67,8 +67,8 @@ alias: "Bathroom Motion Detected"
trigger:
platform: state
entity_id: binary_sensor.motion_sensor_166d0001171111
- from: 'off'
- to: 'on'
+ from: "off"
+ to: "on"
action:
service: media_player.turn_on
data:
diff --git a/source/_integrations/garadget.markdown b/source/_integrations/garadget.markdown
index 1c627804a19..0b145fafc52 100644
--- a/source/_integrations/garadget.markdown
+++ b/source/_integrations/garadget.markdown
@@ -83,15 +83,15 @@ sensor:
- platform: template
sensors:
garage_door_status:
- friendly_name: 'State of the door'
+ friendly_name: "State of the door"
value_template: "{{ states('cover.garage_door') }}"
garage_door_time_in_state:
- friendly_name: 'Since'
+ friendly_name: "Since"
value_template: "{{ state_attr('cover.garage_door', 'time_in_state') }}"
garage_door_wifi_signal_strength:
- friendly_name: 'WiFi strength'
+ friendly_name: "WiFi strength"
value_template: "{{ state_attr('cover.garage_door', 'wifi_signal_strength') }}"
- unit_of_measurement: 'dB'
+ unit_of_measurement: "dB"
group:
garage_door:
diff --git a/source/_integrations/generic.markdown b/source/_integrations/generic.markdown
index 77b930b2b7a..78d8b2e89ff 100644
--- a/source/_integrations/generic.markdown
+++ b/source/_integrations/generic.markdown
@@ -89,7 +89,7 @@ camera:
- platform: generic
name: Weather
still_image_url: https://www.yr.no/place/Norway/Oslo/Oslo/Oslo/meteogram.svg
- content_type: 'image/svg+xml'
+ content_type: "image/svg+xml"
```
### Local image
diff --git a/source/_integrations/geo_json_events.markdown b/source/_integrations/geo_json_events.markdown
index b4530d73327..f1714768254 100644
--- a/source/_integrations/geo_json_events.markdown
+++ b/source/_integrations/geo_json_events.markdown
@@ -70,5 +70,5 @@ geo_location:
- platform: geo_json_events
url: https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson
radius: 250
- entity_namespace: 'usgs_earthquakes'
+ entity_namespace: "usgs_earthquakes"
```
diff --git a/source/_integrations/geo_rss_events.markdown b/source/_integrations/geo_rss_events.markdown
index 9e512cd9b1f..58905bbeb94 100644
--- a/source/_integrations/geo_rss_events.markdown
+++ b/source/_integrations/geo_rss_events.markdown
@@ -34,7 +34,7 @@ sensor:
- platform: geo_rss_events
name: NSW Fire Service
url: https://www.rfs.nsw.gov.au/feeds/majorIncidents.xml
- unit_of_measurement: 'Incidents'
+ unit_of_measurement: "Incidents"
categories:
- 'Emergency Warning'
- 'Watch and Act'
@@ -87,11 +87,11 @@ sensor:
- platform: geo_rss_events
name: Qld Fire and Emergency Services
url: https://www.qfes.qld.gov.au/data/alerts/bushfireAlert.xml
- unit_of_measurement: 'Alerts'
+ unit_of_measurement: "Alerts"
- platform: geo_rss_events
name: Tas Fire Service
url: http://www.fire.tas.gov.au/Show?pageId=colBushfireSummariesRss
- unit_of_measurement: 'Alerts'
+ unit_of_measurement: "Alerts"
- platform: geo_rss_events
name: WA Department of Fire and Emergency Services
url: https://www.emergency.wa.gov.au/data/incident_FCAD.rss
diff --git a/source/_integrations/google_translate.markdown b/source/_integrations/google_translate.markdown
index a225fd433b1..f0e2b42a00e 100644
--- a/source/_integrations/google_translate.markdown
+++ b/source/_integrations/google_translate.markdown
@@ -39,5 +39,5 @@ A full configuration sample including optional variables:
# Example configuration.yaml entry
tts:
- platform: google_translate
- language: 'de'
+ language: "de"
```
diff --git a/source/_integrations/google_travel_time.markdown b/source/_integrations/google_travel_time.markdown
index 08b820ed433..c01ac567ddd 100644
--- a/source/_integrations/google_travel_time.markdown
+++ b/source/_integrations/google_travel_time.markdown
@@ -142,11 +142,11 @@ You can also use the `homeassistant.update_entity` service to update the sensor
initial_state: "on"
trigger:
- platform: time_pattern
- minutes: '/2'
+ minutes: "/2"
condition:
- condition: time
- after: '08:00:00'
- before: '11:00:00'
+ after: "08:00:00"
+ before: "11:00:00"
- condition: time
weekday:
- mon
diff --git a/source/_integrations/griddy.markdown b/source/_integrations/griddy.markdown
index dfc3da50d26..88abb01dbfe 100644
--- a/source/_integrations/griddy.markdown
+++ b/source/_integrations/griddy.markdown
@@ -50,7 +50,7 @@ The current price for the Load Zone will appear as a sensor:
```yaml
- id: '1572630019168'
alias: Stop Tesla Charging if Power Price Spikes
- description: ''
+ description: ""
trigger:
- above: '30'
entity_id: sensor.lz_houston_price_now
diff --git a/source/_integrations/growatt_server.markdown b/source/_integrations/growatt_server.markdown
index 24f57f8116c..c20a1695bfb 100644
--- a/source/_integrations/growatt_server.markdown
+++ b/source/_integrations/growatt_server.markdown
@@ -54,12 +54,12 @@ name:
# Example configuration.yaml entry
sensor:
- platform: growatt_server
- name: 'growatt home'
+ name: "growatt home"
plant_id: 12345678
username: username
password: password
- platform: growatt_server
- name: 'growatt work'
+ name: "growatt work"
plant_id: 87654321
username: username
password: password
diff --git a/source/_integrations/hangouts.markdown b/source/_integrations/hangouts.markdown
index 6ca273dc3ce..5a1ccfd199e 100644
--- a/source/_integrations/hangouts.markdown
+++ b/source/_integrations/hangouts.markdown
@@ -238,7 +238,7 @@ sensor:
- platform: rest
resource: https://api.ipify.org/?format=json
name: External IP
- value_template: '{{ value_json.ip }}'
+ value_template: "{{ value_json.ip }}"
scan_interval: 10
automation:
@@ -248,7 +248,7 @@ automation:
platform: state
condition:
- condition: template
- value_template: '{{ trigger.from_state.state != trigger.to_state.state }}'
+ value_template: "{{ trigger.from_state.state != trigger.to_state.state }}"
- condition: template
value_template: '{{ not is_state("sensor.external_ip", "unavailable") }}'
action:
diff --git a/source/_integrations/harmony.markdown b/source/_integrations/harmony.markdown
index 4447a492cad..d9394cf60c0 100644
--- a/source/_integrations/harmony.markdown
+++ b/source/_integrations/harmony.markdown
@@ -180,10 +180,10 @@ sensor:
sensors:
family_room:
value_template: '{{ state_attr("remote.family_room", "current_activity") }}'
- friendly_name: 'Family Room'
+ friendly_name: "Family Room"
bedroom:
value_template: '{{ state_attr("remote.bedroom", "current_activity") }}'
- friendly_name: 'bedroom'
+ friendly_name: "bedroom"
```
{% endraw %}
diff --git a/source/_integrations/here_travel_time.markdown b/source/_integrations/here_travel_time.markdown
index 8b505cf0119..72c07605685 100644
--- a/source/_integrations/here_travel_time.markdown
+++ b/source/_integrations/here_travel_time.markdown
@@ -160,11 +160,11 @@ automation:
initial_state: "on"
trigger:
- platform: time_pattern
- minutes: '/2'
+ minutes: "/2"
condition:
- condition: time
- after: '08:00:00'
- before: '11:00:00'
+ after: "08:00:00"
+ before: "11:00:00"
- condition: time
weekday:
- mon
diff --git a/source/_integrations/history_stats.markdown b/source/_integrations/history_stats.markdown
index 6388ee42abf..eba31dcf5e9 100644
--- a/source/_integrations/history_stats.markdown
+++ b/source/_integrations/history_stats.markdown
@@ -34,8 +34,8 @@ sensor:
entity_id: light.my_lamp
state: "on"
type: time
- start: '{{ now().replace(hour=0, minute=0, second=0) }}'
- end: '{{ now() }}'
+ start: "{{ now().replace(hour=0, minute=0, second=0) }}"
+ end: "{{ now() }}"
```
{% endraw %}
@@ -135,8 +135,8 @@ Here are some examples of periods you could work with, and what to write in your
{% raw %}
```yaml
- start: '{{ now().replace(hour=0, minute=0, second=0) }}'
- end: '{{ now() }}'
+ start: "{{ now().replace(hour=0, minute=0, second=0) }}"
+ end: "{{ now() }}"
```
{% endraw %}
@@ -146,7 +146,7 @@ Here are some examples of periods you could work with, and what to write in your
{% raw %}
```yaml
- end: '{{ now().replace(hour=0, minute=0, second=0) }}'
+ end: "{{ now().replace(hour=0, minute=0, second=0) }}"
duration:
hours: 24
```
@@ -158,7 +158,7 @@ Here are some examples of periods you could work with, and what to write in your
{% raw %}
```yaml
- start: '{{ now().replace(hour=6, minute=0, second=0) }}'
+ start: "{{ now().replace(hour=6, minute=0, second=0) }}"
duration:
hours: 5
```
@@ -172,8 +172,8 @@ Here, last Monday is _today_ as a timestamp, minus 86400 times the current weekd
{% raw %}
```yaml
- start: '{{ as_timestamp( now().replace(hour=0, minute=0, second=0) ) - now().weekday() * 86400 }}'
- end: '{{ now() }}'
+ start: "{{ as_timestamp( now().replace(hour=0, minute=0, second=0) ) - now().weekday() * 86400 }}"
+ end: "{{ now() }}"
```
{% endraw %}
@@ -183,7 +183,7 @@ Here, last Monday is _today_ as a timestamp, minus 86400 times the current weekd
{% raw %}
```yaml
- end: '{{ now().replace(hour=0, minute=0, second=0) }}'
+ end: "{{ now().replace(hour=0, minute=0, second=0) }}"
duration:
days: 30
```
@@ -195,8 +195,8 @@ Here, last Monday is _today_ as a timestamp, minus 86400 times the current weekd
{% raw %}
```yaml
- start: '{{ 0 }}'
- end: '{{ now() }}'
+ start: "{{ 0 }}"
+ end: "{{ now() }}"
```
{% endraw %}
diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown
index 3709e899f1b..47777de6922 100644
--- a/source/_integrations/homekit.markdown
+++ b/source/_integrations/homekit.markdown
@@ -313,81 +313,7 @@ When exposing a Television media player (a `media_player` with device class `tv`
## Disable Auto Start
-Depending on your setup, it might be necessary to disable `Auto Start` for all accessories to be available for `HomeKit`. Only those entities that are fully set up when the `HomeKit` integration is started, can be added. To start `HomeKit` when `auto_start: false`, you can call the service `homekit.start`.
-
-If you have Z-Wave entities you want to be exposed to HomeKit, then you'll need to disable auto start and then start it after the Z-Wave mesh is ready. This is because the Z-Wave entities won't be fully set up until then. This can be automated using an automation.
-
-
-
-Please remember that you can only have a single `automation` entry. Add the automation to your existing automations.
-
-
-
-```yaml
-# Example for Z-Wave
-homekit:
- auto_start: false
-
-automation:
- - alias: 'Start HomeKit'
- trigger:
- - platform: event
- event_type: zwave.network_ready
- - platform: event
- event_type: zwave.network_complete
- - platform: event
- event_type: zwave.network_complete_some_dead
- action:
- - service: homekit.start
-```
-
-For a general delay where your integration doesn't generate an event, you can also do:
-
-```yaml
-# Example using a delay after the start of Home Assistant
-homekit:
- auto_start: false
-
-automation:
- - alias: 'Start HomeKit'
- trigger:
- - platform: homeassistant
- event: start
- action:
- - delay: 00:05 # Waits 5 minutes
- - service: homekit.start
-```
-
-In some cases it might be desirable to check that all entities are available before starting `HomeKit`. This can be accomplished by adding an additional `binary_sensor` as follows:
-
-{% raw %}
-
-```yaml
-# Example checking specific entities to be available before start
-homekit:
- auto_start: false
-
-automation:
- - alias: 'Start HomeKit'
- trigger:
- - platform: homeassistant
- event: start
- action:
- - wait_template: >-
- {% if not states.light.kitchen_lights %}
- false
- {% elif not states.sensor.outside_temperature %}
- false
- # Repeat for every entity
- {% else %}
- true
- {% endif %}
- timeout: 00:15 # Waits 15 minutes
- continue_on_timeout: false
- - service: homekit.start
-```
-
-{% endraw %}
+It is not needed (anymore) to disable `Auto Start` for all accessories to be available for `HomeKit` as Home Assistant restores all entities on start instantly.
## Configure Filter
diff --git a/source/_integrations/homematic.markdown b/source/_integrations/homematic.markdown
index 57d428ac8f2..e8e2e433891 100644
--- a/source/_integrations/homematic.markdown
+++ b/source/_integrations/homematic.markdown
@@ -212,7 +212,7 @@ sensor:
bedroom_valve:
value_template: "{% raw %}{{ state_attr('climate.leq123456', 'level') }}{% endraw %}"
entity_id: climate.leq123456
- friendly_name: 'Bedroom valve'
+ friendly_name: "Bedroom valve"
```
### Variables
diff --git a/source/_integrations/hp_ilo.markdown b/source/_integrations/hp_ilo.markdown
index 9da5cce69a7..52704ea4ecc 100644
--- a/source/_integrations/hp_ilo.markdown
+++ b/source/_integrations/hp_ilo.markdown
@@ -102,11 +102,11 @@ sensor:
monitored_variables:
- name: CPU fanspeed
sensor_type: server_health
- unit_of_measurement: '%'
+ unit_of_measurement: "%"
value_template: '{% raw %}{{ ilo_data.fans["Fan 1"].speed[0] }}{% endraw %}'
- name: Inlet temperature
sensor_type: server_health
- unit_of_measurement: '°C'
+ unit_of_measurement: "°C"
value_template: '{% raw %}{{ ilo_data.temperature["01-Inlet Ambient"].currentreading[0] }}{% endraw %}'
- name: Server Health
sensor_type: server_health
diff --git a/source/_integrations/html5.markdown b/source/_integrations/html5.markdown
index 361374b63b0..78886c1c16d 100644
--- a/source/_integrations/html5.markdown
+++ b/source/_integrations/html5.markdown
@@ -179,7 +179,7 @@ Example of adding a tag to your notification. This won't create new notification
message: "Last known sensor state is {{ states('sensor.sensor') }}."
data:
data:
- tag: 'notification-about-sensor'
+ tag: "notification-about-sensor"
```
{% endraw %}
diff --git a/source/_integrations/http.markdown b/source/_integrations/http.markdown
index 84b109577a2..81ad50380d9 100644
--- a/source/_integrations/http.markdown
+++ b/source/_integrations/http.markdown
@@ -125,7 +125,7 @@ If you want to apply additional IP filtering, and automatically ban brute force
```yaml
127.0.0.1:
- banned_at: '2016-11-16T19:20:03'
+ banned_at: "2016-11-16T19:20:03"
```
After a ban is added a Persistent Notification is populated to the Home Assistant frontend.
diff --git a/source/_integrations/humidifier.markdown b/source/_integrations/humidifier.markdown
index 2c4b20d0e3e..df25806fa53 100644
--- a/source/_integrations/humidifier.markdown
+++ b/source/_integrations/humidifier.markdown
@@ -46,7 +46,7 @@ automation:
- service: humidifier.set_mode
data:
entity_id: humidifier.bedroom
- preset_mode: 'eco'
+ preset_mode: "eco"
```
### Service `humidifier.set_humidity`
diff --git a/source/_integrations/hyperion.markdown b/source/_integrations/hyperion.markdown
index 5d300ba53a6..5363d1e7efb 100644
--- a/source/_integrations/hyperion.markdown
+++ b/source/_integrations/hyperion.markdown
@@ -93,7 +93,7 @@ automation:
trigger:
- platform: state
entity_id: light.hyperion
- to: 'on'
+ to: "on"
action:
- service: light.turn_on
data:
@@ -108,13 +108,13 @@ To have the lights playing an effect when pausing, idle or turn off a media play
trigger:
- platform: state
entity_id: media_player.plex
- to: 'off'
+ to: "off"
- platform: state
entity_id: media_player.plex.plex
- to: 'paused'
+ to: "paused"
- platform: state
entity_id: media_player.plex.plex
- to: 'idle'
+ to: "idle"
action:
- service: light.turn_on
data:
@@ -129,7 +129,7 @@ To capture the screen when playing something on a media_player you can use this
trigger:
- platform: state
entity_id: media_player.plex
- to: 'playing'
+ to: "playing"
action:
- service: light.turn_on
data:
diff --git a/source/_integrations/icloud.markdown b/source/_integrations/icloud.markdown
index 92eaae46534..22e2b8d40d3 100644
--- a/source/_integrations/icloud.markdown
+++ b/source/_integrations/icloud.markdown
@@ -29,9 +29,9 @@ There is two ways to integrate iCloud in Home Assistant
Menu: *Configuration* -> *Integrations*. Search for "iCloud", add your credentials, click submit.
-If you add the integration for the first time for an account:
-1. Choose a trusted device from the list and submit.
-2. It will send you a text message on your trusted device, add the received code to the next form and submit (if you missed the right code, you will be back to the previous step, and retry).
+If you add the integration for the first time for an account, and two-factor authentication is enabled:
+1. After clicking submit, you will receive a verification code on your trusted iCloud devices.
+2. Press Allow on your device, and enter the 6 digit code in Home Assistant. Finally, click Submit.
3. You are done!
If you already added the integration before, you are done!
@@ -83,9 +83,7 @@ You may receive an email and a notification from Apple saying that someone has l
For the notification, press "Allow", then "OK".
-If two-step authentication is enabled for your iCloud account, some time after Home Assistant startup the integration will ask which device you want to use as the Trusted Device via a notification in the Home Assistant UI. The integration will send an SMS prompt to that device with the auth code to enter in Home Assistant. The duration of this authentication is determined by Apple, but is currently 2 months, so you will only need to verify your account every two months.
-
-2 Factor Authentication is the improved version of two-step authentication and is still not supported by the pyicloud library. Therefore it's not possible to use it with the device_tracker yet.
+If two-step authentication is enabled for your iCloud account, some time after Home Assistant startup the integration will ask to enter the verification code you receive on your device via a notification in the Home Assistant UI. The duration of this authentication is determined by Apple, so you will need to verify your account every now and then.
To prevent excessive battery drainage, a dynamic interval is used for each individual device instead of a fixed interval for all devices linked to one account. The dynamic interval is based on the current zone of a device, the distance towards home and the battery level of the device.
diff --git a/source/_integrations/ifttt.markdown b/source/_integrations/ifttt.markdown
index 5a14221833b..6a03b18df5e 100644
--- a/source/_integrations/ifttt.markdown
+++ b/source/_integrations/ifttt.markdown
@@ -154,7 +154,7 @@ automation:
action:
service: script.ifttt_notify
data:
- value1: 'HA Status:'
+ value1: "HA Status:"
value2: "{{ trigger.event.data.entity_id.split('_')[1] }} is "
value3: "{{ trigger.event.data.to_state.state }}"
```
diff --git a/source/_integrations/ihc.markdown b/source/_integrations/ihc.markdown
index d89995039f9..d65766f0ca5 100644
--- a/source/_integrations/ihc.markdown
+++ b/source/_integrations/ihc.markdown
@@ -167,7 +167,7 @@ ihc:
sensor:
- id: 12345
name: Temperatur_living_room
- unit_of_measurement: '°C'
+ unit_of_measurement: "°C"
note: Floor and wall temp.
position: On wall between windows
- id: 23456
diff --git a/source/_integrations/image_processing.markdown b/source/_integrations/image_processing.markdown
index 3733c3fee47..257528d283d 100644
--- a/source/_integrations/image_processing.markdown
+++ b/source/_integrations/image_processing.markdown
@@ -46,7 +46,7 @@ automation:
event_type: image_processing.detect_face
event_data:
entity_id: image_processing.door
- name: 'Hans Maier'
+ name: "Hans Maier"
...
```
@@ -67,7 +67,7 @@ automation:
trigger:
- platform: state
entity_id: sensor.door_motion_sensor
- to: 'on'
+ to: "on"
action:
- service: image_processing.scan
data:
diff --git a/source/_integrations/influxdb.markdown b/source/_integrations/influxdb.markdown
index 4be01e2112e..14bd8da7e91 100644
--- a/source/_integrations/influxdb.markdown
+++ b/source/_integrations/influxdb.markdown
@@ -525,7 +525,7 @@ username: home-assistant
field: value
database: db1
- name: Min for last hour
- unit_of_measurement: '%'
+ unit_of_measurement: "%"
value_template: '{% raw %}{{ value | round(1) }}{% endraw %}'
group_function: min
where: '"entity_id" = ''salon'' and time > now() - 1h'
diff --git a/source/_integrations/input_boolean.markdown b/source/_integrations/input_boolean.markdown
index 4fbfb6a2ce0..17fb74f5b66 100644
--- a/source/_integrations/input_boolean.markdown
+++ b/source/_integrations/input_boolean.markdown
@@ -75,7 +75,7 @@ automation:
trigger:
platform: state
entity_id: binary_sensor.motion_garage
- to: 'on'
+ to: "on"
condition:
condition: state
entity_id: input_boolean.notify_home
diff --git a/source/_integrations/input_datetime.markdown b/source/_integrations/input_datetime.markdown
index ea80a79142f..ff0bbdd700a 100644
--- a/source/_integrations/input_datetime.markdown
+++ b/source/_integrations/input_datetime.markdown
@@ -136,7 +136,7 @@ If you have a `datetime` object you can use its `timestamp` method. Of if you ha
target:
entity_id: input_datetime.XXX
data:
- time: '05:30:00'
+ time: "05:30:00"
# Sets time to time from datetime object
- service: input_datetime.set_datetime
target:
@@ -148,7 +148,7 @@ If you have a `datetime` object you can use its `timestamp` method. Of if you ha
target:
entity_id: input_datetime.XXX
data:
- date: '2020-08-24'
+ date: "2020-08-24"
# Sets date to date from datetime object
- service: input_datetime.set_datetime
target:
@@ -160,7 +160,7 @@ If you have a `datetime` object you can use its `timestamp` method. Of if you ha
target:
entity_id: input_datetime.XXX
data:
- datetime: '2020-08-25 05:30:00'
+ datetime: "2020-08-25 05:30:00"
# Sets date and time from datetime object
- service: input_datetime.set_datetime
target:
diff --git a/source/_integrations/input_number.markdown b/source/_integrations/input_number.markdown
index f02fbbcf74f..f1264939204 100644
--- a/source/_integrations/input_number.markdown
+++ b/source/_integrations/input_number.markdown
@@ -154,7 +154,7 @@ input_select:
- Reading
- Relax
- 'OFF'
- initial: 'Select'
+ initial: "Select"
input_number:
bedroom_brightness:
name: Brightness
@@ -198,7 +198,7 @@ automation:
- alias: Set temp slider
trigger:
platform: mqtt
- topic: 'setTemperature'
+ topic: "setTemperature"
action:
service: input_number.set_value
data:
@@ -214,7 +214,7 @@ automation:
action:
service: mqtt.publish
data:
- topic: 'setTemperature'
+ topic: "setTemperature"
retain: true
payload: "{{ states('input_number.target_temp') | int }}"
```
@@ -249,7 +249,7 @@ automation:
trigger:
platform: state
entity_id: switch.something
- to: 'on'
+ to: "on"
action:
- delay: "00:{{ states('input_number.minutes') | int }}:{{ states('input_number.seconds') | int }}"
- service: switch.turn_off
diff --git a/source/_integrations/input_text.markdown b/source/_integrations/input_text.markdown
index b6c55104860..7a6fb1b552e 100644
--- a/source/_integrations/input_text.markdown
+++ b/source/_integrations/input_text.markdown
@@ -32,7 +32,7 @@ input_text:
max: 40
text3:
name: Text 3
- pattern: '[a-fA-F0-9]*'
+ pattern: "[a-fA-F0-9]*"
text4:
name: Text 4
mode: password
@@ -121,7 +121,7 @@ input_select:
- Reading
- Relax
- 'OFF'
- initial: 'Select'
+ initial: "Select"
input_text:
bedroom:
name: Brightness
diff --git a/source/_integrations/islamic_prayer_times.markdown b/source/_integrations/islamic_prayer_times.markdown
index b6471ef17c5..2e4b1d5f312 100644
--- a/source/_integrations/islamic_prayer_times.markdown
+++ b/source/_integrations/islamic_prayer_times.markdown
@@ -33,7 +33,7 @@ islamic_prayer_times:
{% configuration %}
calculation_method:
required: false
- default: 'isna'
+ default: "isna"
type: string
description: "The calculation method used for prayer times. Must be one of: `karachi`, `isna`, `mwl`, `makkah`."
{% endconfiguration %}
diff --git a/source/_integrations/isy994.markdown b/source/_integrations/isy994.markdown
index d9230e4763d..bada843acba 100644
--- a/source/_integrations/isy994.markdown
+++ b/source/_integrations/isy994.markdown
@@ -113,7 +113,7 @@ automation:
event_type: isy994_control
event_data:
entity_id: light.lr_track_lights_front
- control: 'DFON'
+ control: "DFON"
value: 255
formatted: "On"
uom: "100"
diff --git a/source/_integrations/keyboard_remote.markdown b/source/_integrations/keyboard_remote.markdown
index 7dd54f8c307..323c4c65109 100644
--- a/source/_integrations/keyboard_remote.markdown
+++ b/source/_integrations/keyboard_remote.markdown
@@ -19,7 +19,7 @@ The `evdev` package is used to interface with the keyboard and thus this is Linu
```yaml
# Example configuration.yaml entry
keyboard_remote:
- type: 'key_up'
+ type: "key_up"
```
{% configuration %}
@@ -62,7 +62,7 @@ A full configuration for two Keyboard Remotes could look like the one below:
```yaml
keyboard_remote:
- device_descriptor: '/dev/input/by-id/bluetooth-keyboard'
- type: 'key_down'
+ type: "key_down"
emulate_key_hold: true
emulate_key_hold_delay: 250
emulate_key_hold_repeat: 33
@@ -76,8 +76,8 @@ Or like the following for one keyboard:
```yaml
keyboard_remote:
- device_name: 'Bluetooth Keyboard'
- type: 'key_down'
+ device_name: "Bluetooth Keyboard"
+ type: "key_down"
```
And an automation rule to breathe life into it:
diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown
index 6e8221cd08f..f208e375328 100644
--- a/source/_integrations/knx.markdown
+++ b/source/_integrations/knx.markdown
@@ -282,7 +282,7 @@ default:
The `knx` binary sensor platform allows you to monitor [KNX](https://www.knx.org/) binary sensors.
-Binary sensors are read-only. To write to the knx-bus configure an exposure [KNX Integration - Expose](/integrations/knx/#exposing-sensor-values-or-time-to-knx-bus).
+Binary sensors are read-only. To write to the KNX bus configure an exposure [KNX Integration Expose](/integrations/knx/#exposing-entity-states-entity-attributes-or-time-to-knx-bus).
```yaml
knx:
@@ -917,7 +917,7 @@ name:
The `knx` sensor platform allows you to monitor [KNX](https://www.knx.org/) sensors.
-Sensors are read-only. To write to the knx-bus configure an exposure [KNX Integration - Expose](/integrations/knx/#exposing-sensor-values-or-time-to-knx-bus) or use the `knx.send` service.
+Sensors are read-only. To write to the KNX bus configure an exposure [KNX Integration Expose](/integrations/knx/#exposing-entity-states-entity-attributes-or-time-to-knx-bus) or use the `knx.send` service.
```yaml
# Example configuration.yaml entry
@@ -925,6 +925,7 @@ knx:
sensor:
- name: Heating.Valve1
state_address: "2/0/0"
+ type: "percent"
```
In order to actively read the sensor data from the bus every 30 minutes you can add the following lines to your `configuration.yaml`:
@@ -935,6 +936,7 @@ knx:
sensor:
- name: Heating.Valve1
state_address: "2/0/0"
+ type: "percent"
sync_state: every 30
```
@@ -943,6 +945,10 @@ state_address:
description: KNX group address of the sensor.
required: true
type: string
+type:
+ description: A type from the value types table below must be defined. The DPT of the group address should match the expected KNX DPT to be parsed correctly.
+ required: true
+ type: string
name:
description: A name for this device used within Home Assistant.
required: false
@@ -952,10 +958,6 @@ sync_state:
required: false
type: [boolean, string, integer]
default: true
-type:
- description: A type from the following table must be defined. The DPT of the group address should match the expected KNX DPT to be parsed correctly.
- required: true
- type: string
always_callback:
description: Defines if telegrams with equal payload as the previously received telegram should trigger a state update within Home Assistant.
required: false
diff --git a/source/_integrations/light.markdown b/source/_integrations/light.markdown
index 42c373b0ba0..e4c9f8d3356 100644
--- a/source/_integrations/light.markdown
+++ b/source/_integrations/light.markdown
@@ -56,7 +56,7 @@ automation:
trigger:
- platform: state
entity_id: binary_sensor.motion_1
- to: 'on'
+ to: "on"
action:
- service: light.turn_on
data:
diff --git a/source/_integrations/lock.mqtt.markdown b/source/_integrations/lock.mqtt.markdown
index a73f9159414..08beb2e43ae 100644
--- a/source/_integrations/lock.mqtt.markdown
+++ b/source/_integrations/lock.mqtt.markdown
@@ -195,7 +195,7 @@ lock:
optimistic: false
qos: 1
retain: true
- value_template: '{{ value.x }}'
+ value_template: "{{ value.x }}"
```
{% endraw %}
diff --git a/source/_integrations/london_air.markdown b/source/_integrations/london_air.markdown
index a658cd136df..4f93deb4fab 100644
--- a/source/_integrations/london_air.markdown
+++ b/source/_integrations/london_air.markdown
@@ -63,12 +63,12 @@ To explore the data available within the `data` attribute of a sensor use the `d
- platform: template
sensors:
updated:
- friendly_name: 'Updated'
+ friendly_name: "Updated"
value_template: {% raw %}'{{state_attr('sensor.merton', 'updated')}}'{% endraw %}
merton_pm10:
- friendly_name: 'Merton PM10'
+ friendly_name: "Merton PM10"
value_template: {% raw %}'{{state_attr('sensor.merton', 'data')[0].pollutants[0].summary}}'{% endraw %}
westminster_s02:
- friendly_name: 'Westminster S02'
+ friendly_name: "Westminster S02"
value_template: {% raw %}'{{state_attr('sensor.westminster', 'data')[0].pollutants[3].summary}}'{% endraw %}
```
diff --git a/source/_integrations/loopenergy.markdown b/source/_integrations/loopenergy.markdown
index 537b90f4a36..ec0807bab89 100644
--- a/source/_integrations/loopenergy.markdown
+++ b/source/_integrations/loopenergy.markdown
@@ -47,11 +47,11 @@ Now you have the keys, add the following lines to your `configuration.yaml`, rep
sensor:
- platform: loopenergy
electricity:
- electricity_serial: 'ELECTRICAL_SERIAL'
- electricity_secret: 'ELECTRICAL_SECRET'
+ electricity_serial: "ELECTRICAL_SERIAL"
+ electricity_secret: "ELECTRICAL_SECRET"
gas:
- gas_serial: 'GAS_SERIAL'
- gas_secret: 'GAS_SECRET'
+ gas_serial: "GAS_SERIAL"
+ gas_secret: "GAS_SECRET"
```
{% configuration %}
diff --git a/source/_integrations/lutron_caseta.markdown b/source/_integrations/lutron_caseta.markdown
index 3b5e058c46f..5d488dc1c6b 100644
--- a/source/_integrations/lutron_caseta.markdown
+++ b/source/_integrations/lutron_caseta.markdown
@@ -153,7 +153,7 @@ For more information on working with binary sensors in Home Assistant, see the [
## Pico and Shade Remotes
-Pico and Shade remotes require a RA2 Select Main Repeater (`RR-SEL-REP2-BL`) or Lutron Caséta Smart Bridge PRO (`L-BDGPRO2-WH`) with Telnet Support enabled in the Lutron app under `Settings` >> `Advanced` >> `Intergration`
+Pico and Shade remotes require a RA2 Select Main Repeater (`RR-SEL-REP2-BL`) or Lutron Caséta Smart Bridge PRO (`L-BDGPRO2-WH`) with Telnet Support enabled in the Lutron app under `Settings` >> `Advanced` >> `Integration`
Device Triggers are implemented for `press` and `release` of each button on the remotes via watching for `lutron_caseta_button_event` events in the format:
diff --git a/source/_integrations/manual.markdown b/source/_integrations/manual.markdown
index c3a0bd5effa..c1d7274232a 100644
--- a/source/_integrations/manual.markdown
+++ b/source/_integrations/manual.markdown
@@ -134,7 +134,7 @@ In the configuration example below:
alarm_control_panel:
- platform: manual
name: Home Alarm
- code: '1234'
+ code: "1234"
arming_time: 30
delay_time: 20
trigger_time: 4
@@ -157,16 +157,16 @@ automation:
trigger:
- platform: state
entity_id: sensor.pir1
- to: 'active'
+ to: "active"
- platform: state
entity_id: sensor.pir2
- to: 'active'
+ to: "active"
- platform: state
entity_id: sensor.door
- to: 'open'
+ to: "open"
- platform: state
entity_id: sensor.window
- to: 'open'
+ to: "open"
condition:
- condition: state
entity_id: alarm_control_panel.ha_alarm
@@ -184,7 +184,7 @@ automation:
trigger:
- platform: state
entity_id: alarm_control_panel.ha_alarm
- to: 'triggered'
+ to: "triggered"
action:
- service: notify.notify
data:
@@ -199,7 +199,7 @@ automation:
trigger:
- platform: state
entity_id: sensor.front_door_lock_alarm_type
- to: '19'
+ to: "19"
# many z-wave locks use Alarm Type 19 for 'Unlocked by Keypad'
action:
- service: alarm_control_panel.alarm_disarm
@@ -215,7 +215,7 @@ Sending a Notification when the Alarm is Armed (Away/Home), Disarmed and in Pend
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
- to: 'disarmed'
+ to: "disarmed"
action:
- service: notify.notify
data:
@@ -227,7 +227,7 @@ Sending a Notification when the Alarm is Armed (Away/Home), Disarmed and in Pend
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
- to: 'pending'
+ to: "pending"
action:
- service: notify.notify
data:
@@ -239,7 +239,7 @@ Sending a Notification when the Alarm is Armed (Away/Home), Disarmed and in Pend
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
- to: 'armed_away'
+ to: "armed_away"
action:
- service: notify.notify
data:
@@ -251,7 +251,7 @@ Sending a Notification when the Alarm is Armed (Away/Home), Disarmed and in Pend
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
- to: 'armed_home'
+ to: "armed_home"
action:
- service: notify.notify
data:
diff --git a/source/_integrations/marytts.markdown b/source/_integrations/marytts.markdown
index 03272640728..400a0a01216 100644
--- a/source/_integrations/marytts.markdown
+++ b/source/_integrations/marytts.markdown
@@ -68,11 +68,11 @@ A full configuration sample including optional variables:
# Example configuration.yaml entry
tts:
- platform: marytts
- host: 'localhost'
+ host: "localhost"
port: 59125
- codec: 'WAVE_FILE'
- voice: 'cmu-slt-hsmm'
- language: 'en_US'
+ codec: "WAVE_FILE"
+ voice: "cmu-slt-hsmm"
+ language: "en_US"
effect:
Volume: "amount:2.0;",
TractScaler: "amount:1.5;",
diff --git a/source/_integrations/matrix.markdown b/source/_integrations/matrix.markdown
index e8bf91af00a..8d62e4d82e6 100644
--- a/source/_integrations/matrix.markdown
+++ b/source/_integrations/matrix.markdown
@@ -124,7 +124,7 @@ automation:
action:
service: notify.matrix_notify
data:
- message: 'It looks like you wrote !testword'
+ message: "It looks like you wrote !testword"
- alias: 'React to an introduction'
trigger:
platform: event
diff --git a/source/_integrations/neato.markdown b/source/_integrations/neato.markdown
index ab749f0b615..37a685981a2 100644
--- a/source/_integrations/neato.markdown
+++ b/source/_integrations/neato.markdown
@@ -50,8 +50,9 @@ neato:
```
3. Restart Home Assistant
-4. Add Neato Botvac via *Configuration* -> *Integrations*
-5. Follow the instructions. After that, all the entities will automatically show up in Home Assistant.
+4. Make sure you visit Home Assistant via a the same domain you used as `redirect_url` before
+5. Add Neato Botvac via *Configuration* -> *Integrations*
+6. Follow the instructions. After that, all the entities will automatically show up in Home Assistant. Make sure you start only one configuration flow at a time. Even though you can click “Open Website” several times, press it only once and wait until this flow is complete.
{% configuration %}
client_id:
@@ -75,10 +76,6 @@ After the update to firmware 4.0 (which adds cleaning maps) there is also suppor
The `neato` vacuum platform allows you to control your [Neato Botvac Connected][botvac-connected].
The status will contain attributes on the robots last clean session.
-
-If you notice the robot stops responding to commands check the state to see if the robot is "unavailable". If you see "unavailable" first try to restart the vacuum and wait about 5 minutes to see if it is no longer "unavailable". If you are still having issues check the Neato app and make sure your robot is connected and working. If it is not then follow the steps in the app to reset your robot and give it the same name as before then restart Home Assistant.
-
-
### Services
Currently supported services are:
@@ -116,3 +113,17 @@ Some information about the capabilities might be found on the [Neato Developer P
| `zone` | yes | Only supported on the Botvac D7. Name of the zone to clean from the Neato app. Use unique names for the zones to avoid the wrong zone from running. Defaults to no zone i.e., complete house cleanup. |
[botvac-connected]: https://neatorobotics.com/products
+
+## Troubleshooting
+
+### My robot is unavailable
+
+Try to restart the vacuum and wait about 5 minutes to see if it is no longer unavailable. If you are still having issues check the Neato app and make sure your robot is connected and working. If it is not then follow the steps in the app to reset your robot and give it the same name as before then restart Home Assistant.
+
+### My robot is not deteced by Home Assistant
+
+Please check your logs if there are any warnings. When there is a message about your robot being offline, check if it is connected to the internet and available though the app. If there is a message about a bad response, try to reset this robot via your app.
+
+### There is a warning about a bad response but everything works as expected
+
+Do you have a stale robot in your configuration? Try to [look into your account](https://neatorobotics.com) and delete any stale robots. If these warnings are about actively used robots, please report an issue to help us solving this problem.
diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown
index 232a222804b..58cedd3c0a4 100644
--- a/source/_integrations/nest.markdown
+++ b/source/_integrations/nest.markdown
@@ -182,7 +182,7 @@ subscriber_id:
Once your developer account is set up and you have a valid `nest` entry in `configuration.yaml`, you need to connect devices with the following steps:
-1. From the Home Assistant front-end, navigate to **Configuration** then **Integrations**. Click **Add Integration** then locate 'Nest'.
+1. Using your externally accessible address from the Home Assistant front-end, navigate to **Configuration** then **Integrations**. Click **Add Integration** then locate 'Nest'.
1. You should get redirected to Google to choose an account. This should be the same developer account you configured above.
diff --git a/source/_integrations/number.mqtt.markdown b/source/_integrations/number.mqtt.markdown
index f7657fea23b..fa69e67300f 100644
--- a/source/_integrations/number.mqtt.markdown
+++ b/source/_integrations/number.mqtt.markdown
@@ -3,7 +3,7 @@ title: "MQTT Number"
description: "Instructions on how to interact with a device exposing a Number through MQTT from within Home Assistant."
ha_category:
- Number
-ha_release: 2020.02
+ha_release: 2021.2
ha_iot_class: Configurable
ha_domain: mqtt
---
diff --git a/source/_integrations/ozw.markdown b/source/_integrations/ozw.markdown
index cfae9e63c8b..e7f6cdb9c4c 100644
--- a/source/_integrations/ozw.markdown
+++ b/source/_integrations/ozw.markdown
@@ -13,7 +13,7 @@ ha_codeowners:
ha_domain: ozw
---
-This integration allows you to utilize OpenZWave's ozwdaemon to control a Z-Wave network over MQTT.
+This integration allows you to utilize OpenZWave's ozwdaemon to control a Z-Wave network over MQTT. If you're starting out with Z-Wave in Home Assistant, we recommend that you use [the Z-Wave JS integration](/integrations/zwave_js).
## Requirements
diff --git a/source/_integrations/rest.markdown b/source/_integrations/rest.markdown
index e8297f6bc9d..bcd3bdc8100 100644
--- a/source/_integrations/rest.markdown
+++ b/source/_integrations/rest.markdown
@@ -261,10 +261,10 @@ sensor:
- platform: template
sensors:
date:
- friendly_name: 'Date'
- value_template: '{{ states.sensor.json_time.attributes["date"] }}'
+ friendly_name: "Date"
+ value_template: "{{ states.sensor.json_time.attributes["date"] }}"
milliseconds:
- friendly_name: 'milliseconds'
+ friendly_name: "milliseconds"
value_template: '{{ states.sensor.json_time.attributes["milliseconds_since_epoch"] }}'
```
@@ -310,17 +310,17 @@ sensor:
entity_picture_template: '{{ "https://openweathermap.org/img/w/"+state_attr('sensor.owm_report', 'weather')[0]["icon"].lower()+".png" }}'
entity_id: sensor.owm_report
owm_temp:
- friendly_name: 'Outside temp'
+ friendly_name: "Outside temp"
value_template: '{{ state_attr('sensor.owm_report', 'main')["temp"]-273.15 }}'
unit_of_measurement: "°C"
entity_id: sensor.owm_report
owm_pressure:
- friendly_name: 'Outside pressure'
+ friendly_name: "Outside pressure"
value_template: '{{ state_attr('sensor.owm_report', 'main')["pressure"] }}'
unit_of_measurement: "hP"
entity_id: sensor.owm_report
owm_humidity:
- friendly_name: 'Outside humidity'
+ friendly_name: "Outside humidity"
value_template: '{{ state_attr('sensor.owm_report', 'main')["humidity"] }}'
unit_of_measurement: "%"
entity_id: sensor.owm_report
@@ -368,25 +368,25 @@ sensor:
- bedroom1
- bedroom2
- bedroom3
- value_template: 'OK'
+ value_template: "OK"
- platform: template
sensors:
bedroom1_temperature:
value_template: '{{ states.sensor.room_sensors.attributes["bedroom1"]["temperature"] }}'
device_class: temperature
- unit_of_measurement: '°C'
+ unit_of_measurement: "°C"
bedroom1_humidity:
value_template: '{{ states.sensor.room_sensors.attributes["bedroom1"]["humidity"] }}'
device_class: humidity
- unit_of_measurement: '%'
+ unit_of_measurement: "%"
bedroom1_battery:
value_template: '{{ states.sensor.room_sensors.attributes["bedroom1"]["battery"] }}'
device_class: battery
- unit_of_measurement: 'V'
+ unit_of_measurement: "V"
bedroom2_temperature:
value_template: '{{ states.sensor.room_sensors.attributes["bedroom2"]["temperature"] }}'
device_class: temperature
- unit_of_measurement: '°C'
+ unit_of_measurement: "°C"
```
{% endraw %}
@@ -405,7 +405,7 @@ sensor:
resource: http://192.168.1.105/status.xml
json_attributes_path: "$.response"
scan_interval: 15
- value_template: 'OK'
+ value_template: "OK"
json_attributes:
- "usr0"
- "pot0"
diff --git a/source/_integrations/rfxtrx.markdown b/source/_integrations/rfxtrx.markdown
index 4227916136e..d364d02db23 100644
--- a/source/_integrations/rfxtrx.markdown
+++ b/source/_integrations/rfxtrx.markdown
@@ -240,7 +240,7 @@ type_string: 'ARC'
id_string': 'C3'
data: '0710010143030170'
values':
- Command: 'On'
+ Command: "On"
Rssi numeric': 7
```
diff --git a/source/_integrations/ring.markdown b/source/_integrations/ring.markdown
index f98d6589e7f..f6a4130d838 100644
--- a/source/_integrations/ring.markdown
+++ b/source/_integrations/ring.markdown
@@ -62,11 +62,11 @@ Then you can use the following automation, with the entities from your system, w
```yaml
automation:
- alias: 'Save the video when the doorbell is pushed'
+ alias: "Save the video when the doorbell is pushed"
trigger:
- platform: state
entity_id: binary_sensor.front_doorbell_ding
- to: 'on'
+ to: "on"
action:
- service: downloader.download_file
data:
diff --git a/source/_integrations/ripple.markdown b/source/_integrations/ripple.markdown
index 221bf8359a8..b3f6b5c863c 100644
--- a/source/_integrations/ripple.markdown
+++ b/source/_integrations/ripple.markdown
@@ -16,7 +16,7 @@ To add the Ripple sensor to your installation, specify a ripple address to watch
# Example configuration.yaml entry
sensor:
- platform: ripple
- address: 'r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV'
+ address: "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV"
```
{% configuration %}
diff --git a/source/_integrations/rmvtransport.markdown b/source/_integrations/rmvtransport.markdown
index 67c97889e44..6839796eea0 100644
--- a/source/_integrations/rmvtransport.markdown
+++ b/source/_integrations/rmvtransport.markdown
@@ -101,13 +101,13 @@ sensor:
- 'Bus'
- 'S'
- station: 3006907
- products: 'Bus'
+ products: "Bus"
destinations: ['Wiesbaden Dernsches Gelände', 'Mainz Hauptbahnhof']
name: Destination
- station: 3006904
- lines: 'S8'
+ lines: "S8"
max_journeys: 5
- products: 'S'
+ products: "S"
```
The first sensor will return S-Bahn, bus, RB and RE trains departures from Frankfurt Hauptbahnhof to Frankfurt Airport or Stadium that are at least 5 minutes away.
diff --git a/source/_integrations/rova.markdown b/source/_integrations/rova.markdown
index 5b691ff87cd..723987dff4b 100644
--- a/source/_integrations/rova.markdown
+++ b/source/_integrations/rova.markdown
@@ -84,10 +84,10 @@ To have your Home Assistant installation remind you of upcoming waste collection
# Example configuration.yaml entry for Rova waste collection reminder
automation:
- id: rova-garbage-bio-reminder
- alias: 'Send Rova Bio waste collection reminder'
+ alias: "Send Rova Bio waste collection reminder"
trigger:
- platform: time
- at: '19:00:00'
+ at: "19:00:00"
condition:
- condition: template
value_template: "{% if (as_timestamp(states('sensor.rova_garbage_gft')) - as_timestamp(now())) < 43200 %}true{% endif %}"
@@ -96,7 +96,7 @@ automation:
action:
- service: NOTIFICATION_SERVICE
data:
- message: 'Reminder: put out biowaste bin'
+ message: "Reminder: put out biowaste bin"
```
{% endraw %}
diff --git a/source/_integrations/rpi_gpio.markdown b/source/_integrations/rpi_gpio.markdown
index 193021f2dd0..a5a798bed0b 100644
--- a/source/_integrations/rpi_gpio.markdown
+++ b/source/_integrations/rpi_gpio.markdown
@@ -133,14 +133,14 @@ cover:
- platform: rpi_gpio
relay_time: 0.2
invert_relay: false
- state_pull_mode: 'UP'
+ state_pull_mode: "UP"
invert_state: true
covers:
- relay_pin: 10
state_pin: 11
- relay_pin: 12
state_pin: 13
- name: 'Right door'
+ name: "Right door"
```
## Remote Raspberry Pi Cover
diff --git a/source/_integrations/rtorrent.markdown b/source/_integrations/rtorrent.markdown
index d95803cb5b3..a5fdcac17ab 100644
--- a/source/_integrations/rtorrent.markdown
+++ b/source/_integrations/rtorrent.markdown
@@ -16,7 +16,7 @@ To enable this sensor, add the following lines to your `configuration.yaml`:
# Example configuration.yaml entry
sensor:
- platform: rtorrent
- url: 'http://
:@:/RPC2'
+ url: "http://:@:/RPC2"
monitored_variables:
- 'current_status'
- 'download_speed'
diff --git a/source/_integrations/satel_integra.markdown b/source/_integrations/satel_integra.markdown
index 7a6ae977b30..d112c1a8d67 100644
--- a/source/_integrations/satel_integra.markdown
+++ b/source/_integrations/satel_integra.markdown
@@ -118,43 +118,43 @@ satel_integra:
port: 7094
partitions:
01:
- name: 'House'
+ name: "House"
arm_home_mode: 2
02:
- name: 'Garage'
+ name: "Garage"
zones:
01:
- name: 'Bedroom'
- type: 'motion'
+ name: "Bedroom"
+ type: "motion"
02:
- name: 'Hall'
- type: 'motion'
+ name: "Hall"
+ type: "motion"
30:
- name: 'Kitchen - smoke'
- type: 'smoke'
+ name: "Kitchen - smoke"
+ type: "smoke"
113:
- name: 'Entry door'
- type: 'opening'
+ name: "Entry door"
+ type: "opening"
outputs:
05:
- name: 'Garden lights trigger'
- type: 'light'
+ name: "Garden lights trigger"
+ type: "light"
09:
- name: 'Gate opening trigger'
- type: 'opening'
+ name: "Gate opening trigger"
+ type: "opening"
30:
- name: 'Alarm triggered'
- type: 'safety'
+ name: "Alarm triggered"
+ type: "safety"
32:
- name: 'Alarm power problem'
- type: 'safety'
+ name: "Alarm power problem"
+ type: "safety"
switchable_outputs:
05:
- name: 'Gate open'
+ name: "Gate open"
06:
- name: 'Gate close'
+ name: "Gate close"
14:
- name: 'Garden light'
+ name: "Garden light"
```
@@ -165,8 +165,8 @@ For example:
alias: Flick the input switch when movement in bedroom detected
trigger:
platform: state
- entity_id: 'binary_sensor.bedroom'
- to: 'on'
+ entity_id: "binary_sensor.bedroom"
+ to: "on"
action:
service: input_boolean.turn_on
data:
diff --git a/source/_integrations/scene.markdown b/source/_integrations/scene.markdown
index 84beea83966..8e1f34af395 100644
--- a/source/_integrations/scene.markdown
+++ b/source/_integrations/scene.markdown
@@ -164,8 +164,8 @@ The following example turns off some entities as soon as a window opens. The sta
trigger:
- platform: state
entity_id: binary_sensor.window
- from: 'off'
- to: 'on'
+ from: "off"
+ to: "on"
condition: []
action:
- service: scene.create
@@ -180,13 +180,13 @@ The following example turns off some entities as soon as a window opens. The sta
- service: climate.set_hvac_mode
data:
entity_id: climate.ecobee
- hvac_mode: 'off'
+ hvac_mode: "off"
- alias: Window closed
trigger:
- platform: state
entity_id: binary_sensor.window
- from: 'on'
- to: 'off'
+ from: "on"
+ to: "off"
condition: []
action:
- service: scene.turn_on
diff --git a/source/_integrations/scrape.markdown b/source/_integrations/scrape.markdown
index a643ead125f..cdd267b3722 100644
--- a/source/_integrations/scrape.markdown
+++ b/source/_integrations/scrape.markdown
@@ -126,9 +126,9 @@ sensor:
- platform: scrape
resource: http://www.bfs.de/DE/themen/opt/uv/uv-index/prognose/prognose_node.html
name: Coast Ostsee
- select: 'p'
+ select: "p"
index: 19
- unit_of_measurement: 'UV Index'
+ unit_of_measurement: "UV Index"
```
### IFTTT status
@@ -141,7 +141,7 @@ sensor:
- platform: scrape
resource: https://status.ifttt.com/
name: IFTTT status
- select: '.component-status'
+ select: ".component-status"
```
### Get the latest podcast episode file URL
@@ -154,7 +154,7 @@ sensor:
- platform: scrape
resource: https://hasspodcast.io/feed/podcast
name: Home Assistant Podcast
- select: 'enclosure'
+ select: "enclosure"
index: 1
attribute: url
```
@@ -191,7 +191,7 @@ sensor:
resource: http://www.bom.gov.au/vic/forecasts/melbourne.shtml
name: Melbourne Forecast Summary
select: ".main .forecast p"
- value_template: '{{ value | truncate(255) }}'
+ value_template: "{{ value | truncate(255) }}"
# Request every hour
scan_interval: 3600
headers:
diff --git a/source/_integrations/script.markdown b/source/_integrations/script.markdown
index 3a66e6d3a04..a2dfa5b5ff4 100644
--- a/source/_integrations/script.markdown
+++ b/source/_integrations/script.markdown
@@ -120,12 +120,12 @@ script:
wakeup:
alias: Wake Up
icon: "mdi:party-popper"
- description: 'Turns on the bedroom lights and then the living room lights after a delay'
+ description: "Turns on the bedroom lights and then the living room lights after a delay"
variables:
turn_on_entity: group.living_room
fields:
minutes:
- description: 'The amount of time to wait before turning on the living room lights'
+ description: "The amount of time to wait before turning on the living room lights"
example: 1
# If called again while still running (probably in delay step), start over.
mode: restart
@@ -165,15 +165,15 @@ automation:
trigger:
platform: state
entity_id: light.bedroom
- from: 'off'
- to: 'on'
+ from: "off"
+ to: "on"
action:
service: script.turn_on
entity_id: script.notify_pushover
data:
variables:
- title: 'State change'
- message: 'The light is on!'
+ title: "State change"
+ message: "The light is on!"
```
The other way is calling the script as a service directly. In this case, all service data will be made available as variables. If we apply this approach on the script above, it would look like this:
@@ -184,13 +184,13 @@ automation:
trigger:
platform: state
entity_id: light.bedroom
- from: 'off'
- to: 'on'
+ from: "off"
+ to: "on"
action:
service: script.notify_pushover
data:
- title: 'State change'
- message: 'The light is on!'
+ title: "State change"
+ message: "The light is on!"
```
Using the variables in the script requires the use of templates:
@@ -199,14 +199,14 @@ Using the variables in the script requires the use of templates:
# Example configuration.yaml entry
script:
notify_pushover:
- description: 'Send a pushover notification'
+ description: "Send a pushover notification"
fields:
title:
- description: 'The title of the notification'
- example: 'State change'
+ description: "The title of the notification"
+ example: "State change"
message:
- description: 'The message content'
- example: 'The light is on!'
+ description: "The message content"
+ example: "The light is on!"
sequence:
- condition: state
entity_id: switch.pushover_notifications
diff --git a/source/_integrations/sensehat.markdown b/source/_integrations/sensehat.markdown
index ce8b3661f5b..bef5936f50d 100644
--- a/source/_integrations/sensehat.markdown
+++ b/source/_integrations/sensehat.markdown
@@ -87,14 +87,14 @@ sensor:
- platform: template
sensors:
sensehat_temperature:
- value_template: '{{ states('sensor.temperature') | round(1) }}'
- unit_of_measurement: '°C'
+ value_template: "{{ states('sensor.temperature') | round(1) }}"
+ unit_of_measurement: "°C"
sensehat_pressure:
- value_template: '{{ states('sensor.pressure') | round(1) }}'
- unit_of_measurement: 'mb'
+ value_template: "{{ states('sensor.pressure') | round(1) }}"
+ unit_of_measurement: "mb"
sensehat_humidity:
- value_template: '{{ states('sensor.humidity') | round(1) }}'
- unit_of_measurement: '%'
+ value_template: "{{ states('sensor.humidity') | round(1) }}"
+ unit_of_measurement: "%"
```
{% endraw %}
diff --git a/source/_integrations/sensor.buienradar.markdown b/source/_integrations/sensor.buienradar.markdown
index 2b75385f290..c155cdfa0db 100644
--- a/source/_integrations/sensor.buienradar.markdown
+++ b/source/_integrations/sensor.buienradar.markdown
@@ -158,7 +158,7 @@ Full configuration example (excluding forecasted conditions) where location is m
```yaml
# Example configuration.yaml entry
- platform: buienradar
- name: 'volkel'
+ name: "volkel"
# Force 'Meetstation Volkel' to be used:
latitude: 51.65
longitude: 5.70
diff --git a/source/_integrations/sensor.command_line.markdown b/source/_integrations/sensor.command_line.markdown
index 6629495ca39..38843c89f09 100644
--- a/source/_integrations/sensor.command_line.markdown
+++ b/source/_integrations/sensor.command_line.markdown
@@ -74,7 +74,7 @@ sensor:
command: "cat /sys/class/thermal/thermal_zone0/temp"
# If errors occur, make sure configuration file is encoded as UTF-8
unit_of_measurement: "°C"
- value_template: '{{ value | multiply(0.001) | round(1) }}'
+ value_template: "{{ value | multiply(0.001) | round(1) }}"
```
{% endraw %}
@@ -184,8 +184,8 @@ sensor:
json_attributes:
- date
- milliseconds_since_epoch
- command: 'python3 /home/pi/.homeassistant/scripts/datetime.py'
- value_template: '{{ value_json.time }}'
+ command: "python3 /home/pi/.homeassistant/scripts/datetime.py"
+ value_template: "{{ value_json.time }}"
```
{% endraw %}
diff --git a/source/_integrations/sensor.mqtt.markdown b/source/_integrations/sensor.mqtt.markdown
index cbadd65b129..f0d2dc8391b 100644
--- a/source/_integrations/sensor.mqtt.markdown
+++ b/source/_integrations/sensor.mqtt.markdown
@@ -165,7 +165,7 @@ sensor:
- platform: mqtt
name: "RSSI"
state_topic: "home/sensor1/infojson"
- unit_of_measurement: 'dBm'
+ unit_of_measurement: "dBm"
value_template: "{{ value_json.RSSI }}"
availability:
- topic: "home/sensor1/status"
@@ -219,7 +219,7 @@ sensor:
- platform: mqtt
name: "Battery Tablet"
state_topic: "owntracks/tablet/tablet"
- unit_of_measurement: '%'
+ unit_of_measurement: "%"
value_template: "{{ value_json.batt }}"
```
{% endraw %}
@@ -245,12 +245,12 @@ sensor:
- platform: mqtt
name: "Temperature"
state_topic: "office/sensor1"
- unit_of_measurement: '°C'
+ unit_of_measurement: "°C"
value_template: "{{ value_json.temperature }}"
- platform: mqtt
name: "Humidity"
state_topic: "office/sensor1"
- unit_of_measurement: '%'
+ unit_of_measurement: "%"
value_template: "{{ value_json.humidity }}"
```
{% endraw %}
diff --git a/source/_integrations/seven_segments.markdown b/source/_integrations/seven_segments.markdown
index c081034c085..b70c2f2dfe3 100644
--- a/source/_integrations/seven_segments.markdown
+++ b/source/_integrations/seven_segments.markdown
@@ -142,9 +142,9 @@ sensor:
- platform: template
sensors:
power_meter:
- value_template: '{{ states('image_processing.sevensegment_ocr_seven_segments') }}'
- friendly_name: 'Ampere'
- unit_of_measurement: 'A'
+ value_template: "{{ states('image_processing.sevensegment_ocr_seven_segments') }}"
+ friendly_name: "Ampere"
+ unit_of_measurement: "A"
```
{% endraw %}
diff --git a/source/_integrations/shodan.markdown b/source/_integrations/shodan.markdown
index b9b78d89a1a..324dd707f76 100644
--- a/source/_integrations/shodan.markdown
+++ b/source/_integrations/shodan.markdown
@@ -24,7 +24,7 @@ file:
sensor:
- platform: shodan
api_key: SHODAN_API_KEY
- query: 'home-assistant'
+ query: "home-assistant"
```
{% configuration %}
diff --git a/source/_integrations/shopping_list.markdown b/source/_integrations/shopping_list.markdown
index be4bee97dc0..84f35f1d071 100644
--- a/source/_integrations/shopping_list.markdown
+++ b/source/_integrations/shopping_list.markdown
@@ -56,8 +56,8 @@ service: notify.notify
title: "Time to shop?"
message: 'Click to open the shopping list'
data:
- clickAction: '/shopping-list'
- url: '/shopping-list'
+ clickAction: "/shopping-list"
+ url: "/shopping-list"
```
{% endraw %}
diff --git a/source/_integrations/simulated.markdown b/source/_integrations/simulated.markdown
index b358417e6a3..e0becd4c5ee 100644
--- a/source/_integrations/simulated.markdown
+++ b/source/_integrations/simulated.markdown
@@ -92,8 +92,8 @@ To give an example of simulating real world data, a simulated relative humidity
```yaml
sensor:
- platform: simulated
- name: 'simulated relative humidity'
- unit: '%'
+ name: "simulated relative humidity"
+ unit: "%"
amplitude: 0 # Turns off the periodic contribution
mean: 50
spread: 10
diff --git a/source/_integrations/sisyphus.markdown b/source/_integrations/sisyphus.markdown
index a4b0a866f7d..d51a3338623 100644
--- a/source/_integrations/sisyphus.markdown
+++ b/source/_integrations/sisyphus.markdown
@@ -34,9 +34,9 @@ Auto-detection can be a little slow, so if your table has a fixed IP address or
# This will skip auto-detection and add only the listed tables
sisyphus:
- name: 'TABLE_NAME'
- host: 'TABLE_IP_OR_HOSTNAME'
+ host: "TABLE_IP_OR_HOSTNAME"
- name: 'ANOTHER_TABLE_NAME'
- host: 'ANOTHER_TABLE_IP_OR_HOSTNAME'
+ host: "ANOTHER_TABLE_IP_OR_HOSTNAME"
```
{% configuration %}
diff --git a/source/_integrations/slack.markdown b/source/_integrations/slack.markdown
index d560cc42e01..bfaa5d448ba 100644
--- a/source/_integrations/slack.markdown
+++ b/source/_integrations/slack.markdown
@@ -44,7 +44,7 @@ notify:
- name: NOTIFIER_NAME
platform: slack
api_key: YOUR_API_KEY
- default_channel: '#general'
+ default_channel: "#general"
```
{% configuration %}
diff --git a/source/_integrations/sma.markdown b/source/_integrations/sma.markdown
index d7299b9c562..97ec2a97c8a 100644
--- a/source/_integrations/sma.markdown
+++ b/source/_integrations/sma.markdown
@@ -127,7 +127,7 @@ Example:
```yaml
custom:
yesterday_consumption:
- key: '6400_00543A01'
+ key: "6400_00543A01"
unit: kWh
factor: 1000
```
diff --git a/source/_integrations/smtp.markdown b/source/_integrations/smtp.markdown
index 4cb747c2bbf..77a7dcb991c 100644
--- a/source/_integrations/smtp.markdown
+++ b/source/_integrations/smtp.markdown
@@ -109,8 +109,8 @@ To use the SMTP notification, refer to it in an automation or script like in thi
seconds: 1
- service: notify.NOTIFIER_NAME
data:
- title: 'Intruder alert'
- message: 'Intruder alert at apartment!!'
+ title: "Intruder alert"
+ message: "Intruder alert at apartment!!"
data:
images:
- /home/pi/snapshot1.jpg
@@ -130,7 +130,7 @@ The optional `html` field makes a custom text/HTML multi-part message, allowing
seconds: 1
- service: notify.NOTIFIER_NAME
data:
- message: 'Intruder alert at apartment!!'
+ message: "Intruder alert at apartment!!"
data:
images:
- /home/pi/snapshot1.jpg
diff --git a/source/_integrations/snips.markdown b/source/_integrations/snips.markdown
index 445fc66de4b..06fd876fbdd 100644
--- a/source/_integrations/snips.markdown
+++ b/source/_integrations/snips.markdown
@@ -155,7 +155,7 @@ intent_script:
- service: light.turn_on
data:
entity_id: 'light.{{ objectLocation | replace(" ","_") }}'
- color_name: '{{ objectColor }}'
+ color_name: "{{ objectColor }}"
```
{% endraw %}
@@ -176,7 +176,7 @@ In this example if we had an intent triggered with 'Set a timer for five minutes
SetTimer:
speech:
type: plain
- text: 'Set a timer'
+ text: "Set a timer"
action:
service: script.set_timer
data:
@@ -221,7 +221,7 @@ intent_script:
turn_on_light:
speech:
type: plain
- text: 'OK, turning on the light'
+ text: "OK, turning on the light"
action:
service: light.turn_on
```
@@ -233,7 +233,7 @@ intent_script:
OpenGarageDoor:
speech:
type: plain
- text: 'OK, opening the garage door'
+ text: "OK, opening the garage door"
action:
- service: cover.open_cover
data:
@@ -250,14 +250,14 @@ automation:
trigger:
- platform: state
entity_id: binary_sensor.my_garage_door_sensor
- from: 'off'
- to: 'on'
+ from: "off"
+ to: "on"
for:
minutes: 10
sequence:
service: snips.say_action
data:
- text: 'Garage door has been open 10 minutes, would you like me to close it?'
+ text: "Garage door has been open 10 minutes, would you like me to close it?"
intent_filter:
- closeGarageDoor
@@ -266,7 +266,7 @@ intent_script:
closeGarageDoor:
speech:
type: plain
- text: 'OK, closing the garage door'
+ text: "OK, closing the garage door"
action:
- service: script.garage_door_close
```
diff --git a/source/_integrations/snmp.markdown b/source/_integrations/snmp.markdown
index 3ae76681929..bea1a295cd5 100644
--- a/source/_integrations/snmp.markdown
+++ b/source/_integrations/snmp.markdown
@@ -230,12 +230,12 @@ To create a sensor that displays the uptime for your printer in minutes, you can
# Example configuration.yaml entry
sensor:
- platform: snmp
- name: 'Printer uptime'
+ name: "Printer uptime"
host: 192.168.2.21
baseoid: 1.3.6.1.2.1.1.3.0
accept_errors: true
- unit_of_measurement: 'minutes'
- value_template: '{{((value | int) / 6000) | int}}'
+ unit_of_measurement: "minutes"
+ value_template: "{{((value | int) / 6000) | int}}"
```
{% endraw %}
@@ -389,12 +389,12 @@ switch:
- platform: snmp
name: SNMP v3 switch
host: 192.168.0.3
- version: '3'
- username: 'myusername'
- auth_key: 'myauthkey'
- auth_protocol: 'hmac-sha'
- priv_key: 'myprivkey'
- priv_protocol: 'aes-cfb-128'
+ version: "3"
+ username: "myusername"
+ auth_key: "myauthkey"
+ auth_protocol: "hmac-sha"
+ priv_key: "myprivkey"
+ priv_protocol: "aes-cfb-128"
baseoid: 1.3.6.1.4.1.19865.1.2.1.4.0
payload_on: 1
payload_off: 0
@@ -402,12 +402,12 @@ switch:
- platform: snmp
name: Enable PoE on Netgear switch port 2 using SNMP v3
host: 192.168.0.4
- version: '3'
- username: 'myusername'
- auth_key: 'myauthkey'
- auth_protocol: 'hmac-sha'
- priv_key: 'myprivkey'
- priv_protocol: 'des'
+ version: "3"
+ username: "myusername"
+ auth_key: "myauthkey"
+ auth_protocol: "hmac-sha"
+ priv_key: "myprivkey"
+ priv_protocol: "des"
baseoid: 1.3.6.1.4.1.4526.11.15.1.1.1.1.1.2
payload_on: 15400
payload_off: 3000
diff --git a/source/_integrations/sochain.markdown b/source/_integrations/sochain.markdown
index 00812002046..1a4dcf7a527 100644
--- a/source/_integrations/sochain.markdown
+++ b/source/_integrations/sochain.markdown
@@ -17,7 +17,7 @@ To add the SoChain sensor to your installation, specify a network and address to
sensor:
- platform: sochain
network: LTC
- address: 'M9m37h3dVkLDS13wYK7vcs7ck6MMMX6yhK'
+ address: "M9m37h3dVkLDS13wYK7vcs7ck6MMMX6yhK"
```
{% configuration %}
diff --git a/source/_integrations/solaredge_local.markdown b/source/_integrations/solaredge_local.markdown
index e79e009e8f9..60a9deba65c 100644
--- a/source/_integrations/solaredge_local.markdown
+++ b/source/_integrations/solaredge_local.markdown
@@ -72,7 +72,7 @@ sensor:
sensors:
solaredge_energy_this_year_template:
value_template: "{{ (states('sensor.solaredge_energy_this_year') | float / 1000) | round(2) }}"
- unit_of_measurement: 'KWh'
+ unit_of_measurement: "KWh"
icon_template: "mdi:solar-power"
```
diff --git a/source/_integrations/solax.markdown b/source/_integrations/solax.markdown
index fb7d708b853..022fa774e01 100644
--- a/source/_integrations/solax.markdown
+++ b/source/_integrations/solax.markdown
@@ -49,11 +49,11 @@ sensors:
sensors:
total_pv_power:
friendly_name: "Total PV Power"
- unit_of_measurement: 'W'
+ unit_of_measurement: "W"
value_template: "{{ (states('sensor.pv1_power') | float) + (states('sensor.pv2_power') | float) }}"
load_power:
friendly_name: "Load Power"
- unit_of_measurement: 'W'
+ unit_of_measurement: "W"
value_template: "{{ (states('sensor.power_now') | float) - (states('sensor.exported_power') | float) }}"
```
diff --git a/source/_integrations/spotify.markdown b/source/_integrations/spotify.markdown
index 1ed7da9f5de..4daf9cc50a5 100644
--- a/source/_integrations/spotify.markdown
+++ b/source/_integrations/spotify.markdown
@@ -104,7 +104,7 @@ script:
- service: media_player.play_media
data:
entity_id: media_player.spotify
- media_content_id: 'https://open.spotify.com/playlist/5xddIVAtLrZKtt4YGLM1SQ?si=YcvRqaKNTxOi043Qn4LYkg'
+ media_content_id: "https://open.spotify.com/playlist/5xddIVAtLrZKtt4YGLM1SQ?si=YcvRqaKNTxOi043Qn4LYkg"
media_content_type: playlist
```
diff --git a/source/_integrations/sql.markdown b/source/_integrations/sql.markdown
index 4055ca93bf9..33a39b8fa9e 100644
--- a/source/_integrations/sql.markdown
+++ b/source/_integrations/sql.markdown
@@ -28,7 +28,7 @@ sensor:
queries:
- name: Sun state
query: "SELECT * FROM states WHERE entity_id = 'sun.sun' ORDER BY state_id DESC LIMIT 1;"
- column: 'state'
+ column: "state"
```
{% endraw %}
@@ -77,7 +77,7 @@ This example shows the previously *recorded* state of the sensor `sensor.tempera
sensor:
- platform: random
name: Temperature in
- unit_of_measurement: '°C'
+ unit_of_measurement: "°C"
```
The query will look like this:
@@ -93,7 +93,7 @@ sensor:
queries:
- name: Temperature in
query: "SELECT * FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 1;"
- column: 'state'
+ column: "state"
```
Note that the SQL sensor state corresponds to the last row of the SQL result set.
@@ -138,7 +138,7 @@ sensor:
queries:
- name: DB size
query: 'SELECT table_schema "database", Round(Sum(data_length + index_length) / 1024, 1) "value" FROM information_schema.tables WHERE table_schema="hass" GROUP BY table_schema;'
- column: 'value'
+ column: "value"
unit_of_measurement: kB
```
@@ -156,8 +156,8 @@ sensor:
queries:
- name: DB Size
query: 'SELECT ROUND(page_count * page_size / 1024 / 1024, 1) as size FROM pragma_page_count(), pragma_page_size();'
- column: 'size'
- unit_of_measurement: 'MiB'
+ column: "size"
+ unit_of_measurement: "MiB"
```
{% endraw %}
@@ -174,7 +174,7 @@ sensor:
queries:
- name: DB size
query: "SELECT TOP 1 SUM(m.size) * 8 / 1024 as size FROM sys.master_files m INNER JOIN sys.databases d ON d.database_id=m.database_id WHERE d.name='DB_NAME';"
- column: 'size'
+ column: "size"
unit_of_measurement: MiB
```
{% endraw %}
diff --git a/source/_integrations/stream.markdown b/source/_integrations/stream.markdown
index 921c67c5002..7ef44cf8802 100644
--- a/source/_integrations/stream.markdown
+++ b/source/_integrations/stream.markdown
@@ -49,7 +49,7 @@ action:
service: camera.record
data:
entity_id: camera.quintal
- filename: '/config/www/my_stream.mp4'
+ filename: "/config/www/my_stream.mp4"
duration: 30
```
diff --git a/source/_integrations/switch.mysensors.markdown b/source/_integrations/switch.mysensors.markdown
index 4c6240447b4..deedcba260d 100644
--- a/source/_integrations/switch.mysensors.markdown
+++ b/source/_integrations/switch.mysensors.markdown
@@ -64,22 +64,22 @@ automation:
- alias: Turn HVAC on
trigger:
platform: time
- at: '5:30:00'
+ at: "5:30:00"
action:
service: mysensors.send_ir_code
entity_id: switch.hvac_1_1
data:
- V_IR_SEND: '0xC284' # the IR code to send
+ V_IR_SEND: "0xC284" # the IR code to send
- alias: Turn HVAC off
trigger:
platform: time
- at: '0:30:00'
+ at: "0:30:00"
action:
service: mysensors.send_ir_code
entity_id: switch.hvac_1_1
data:
- V_IR_SEND: '0xC288' # the IR code to send
+ V_IR_SEND: "0xC288" # the IR code to send
```
## Example sketches
diff --git a/source/_integrations/switch.rest.markdown b/source/_integrations/switch.rest.markdown
index d1edb74f12d..9b7ee792589 100644
--- a/source/_integrations/switch.rest.markdown
+++ b/source/_integrations/switch.rest.markdown
@@ -99,7 +99,7 @@ switch:
resource: http://IP_ADDRESS/led_endpoint
body_on: '{"active": "true"}'
body_off: '{"active": "false"}'
- is_on_template: '{{ value_json.is_active }}'
+ is_on_template: "{{ value_json.is_active }}"
headers:
Content-Type: application/json
verify_ssl: true
diff --git a/source/_integrations/switchbot.markdown b/source/_integrations/switchbot.markdown
index 6457db41d20..b3f509131e4 100644
--- a/source/_integrations/switchbot.markdown
+++ b/source/_integrations/switchbot.markdown
@@ -19,7 +19,7 @@ To enable it, add the following lines to your `configuration.yaml`:
```yaml
switch:
- platform: switchbot
- mac: 'MAC_ADDRESS'
+ mac: "MAC_ADDRESS"
```
{% configuration %}
diff --git a/source/_integrations/switcher_kis.markdown b/source/_integrations/switcher_kis.markdown
index 182b073e538..dc89d3b817f 100644
--- a/source/_integrations/switcher_kis.markdown
+++ b/source/_integrations/switcher_kis.markdown
@@ -26,9 +26,9 @@ To retrieve your device's details, please follow the instructions [here](https:/
```yaml
switcher_kis:
- phone_id: 'REPLACE_WITH_PHONE_ID'
- device_id: 'REPLACE_WITH_DEVICE_ID'
- device_password: 'REPLACE_WITH_DEVICE_PASSWORD'
+ phone_id: "REPLACE_WITH_PHONE_ID"
+ device_id: "REPLACE_WITH_DEVICE_ID"
+ device_password: "REPLACE_WITH_DEVICE_PASSWORD"
```
{% configuration %}
diff --git a/source/_integrations/switchmate.markdown b/source/_integrations/switchmate.markdown
index 4030da9efa3..e5b686ce516 100644
--- a/source/_integrations/switchmate.markdown
+++ b/source/_integrations/switchmate.markdown
@@ -19,7 +19,7 @@ To enable it, add the following lines to your `configuration.yaml`:
```yaml
switch:
- platform: switchmate
- mac: 'cb:25:0b......'
+ mac: "cb:25:0b......"
```
{% configuration %}
diff --git a/source/_integrations/system_log.markdown b/source/_integrations/system_log.markdown
index 3c103af479e..58dda10f5b2 100644
--- a/source/_integrations/system_log.markdown
+++ b/source/_integrations/system_log.markdown
@@ -59,6 +59,7 @@ Errors and warnings are posted as the event `system_log_event`, so it is possibl
| `source` | File that triggered the error, e.g., `core.py` or `media_player/yamaha.py`. |
| `exception` | Full stack trace if available, an empty string otherwise. |
| `message` | Descriptive message of the error, e.g., "Error handling request". |
+| `name` | Name of the component, e.g., `homeassistant.components.device_tracker` |
| `timestamp` | Unix timestamp with as a double, e.g., 1517241010.237416. |
Live examples of these events can be found in the Home Assistant log file (`home-assistant.log`) or by just looking in the system log. An example could, for instance, look like this:
@@ -71,7 +72,7 @@ Traceback (most recent call last):
[...]
```
-The message ("Unable to find integration system_healt"), source (`homeassistant.loader`) and level (`ERROR`) can easily be extracted from the log. The exact timestamp and if there is a stack trace that's shown as well. Here is another error caused by the `google_map` integration with additional output present.
+The message ("Unable to find integration system_healt"), name (`homeassistant.loader`) and level (`ERROR`) can easily be extracted from the log. The exact timestamp and if there is a stack trace that's shown as well. Here is another error caused by the `google_map` integration with additional output present.
## Examples
@@ -118,7 +119,7 @@ automation:
service: persistent_notification.create
data:
title: Something bad happened
- message: '{{ trigger.event.data.message }}'
+ message: "{{ trigger.event.data.message }}"
```
{% endraw %}
@@ -133,11 +134,11 @@ automation:
trigger:
platform: state
entity_id: binary_sensor.door
- from: 'off'
- to: 'on'
+ from: "off"
+ to: "on"
action:
service: system_log.write
data:
- message: 'Door opened!'
+ message: "Door opened!"
level: info
```
diff --git a/source/_integrations/systemmonitor.markdown b/source/_integrations/systemmonitor.markdown
index a8add075c15..3160553fd36 100644
--- a/source/_integrations/systemmonitor.markdown
+++ b/source/_integrations/systemmonitor.markdown
@@ -112,7 +112,7 @@ sensor:
- platform: systemmonitor
resources:
- type: network_in
- arg: 'Local Area Connection'
+ arg: "Local Area Connection"
```
If you need to use some other interface, open a command line prompt and type `ipconfig` to list all interface names. For example a wireless connection output from `ipconfig` might look like:
diff --git a/source/_integrations/tag.mqtt.markdown b/source/_integrations/tag.mqtt.markdown
index f56ac2d2e99..1fba648a745 100644
--- a/source/_integrations/tag.mqtt.markdown
+++ b/source/_integrations/tag.mqtt.markdown
@@ -71,11 +71,16 @@ To test, you can use the command line tool `mosquitto_pub` shipped with `mosquit
Discover the tag scanner:
```bash
-mosquitto_pub -h 127.0.0.1 -t home-assistant/tag/0AFFD2/config -m '{"topic": "0AFFD2/tag_scanned", "value_template": "{{ value_json.PN532.UID }}"}'
+mosquitto_pub -h 127.0.0.1 -t homeassistant/tag/0AFFD2/config -m '{"topic": "0AFFD2/tag_scanned", "value_template": "{{ value_json.PN532.UID }}"}'
```
Generate tag scanned event:
+{% raw %}
+
```bash
mosquitto_pub -h 127.0.0.1 -t 0AFFD2/tag_scanned -m '{"Time":"2020-09-28T17:02:10","PN532":{"UID":"E9F35959", "DATA":"ILOVETASMOTA"}}'
```
+
+{% endraw %}
+
diff --git a/source/_integrations/telegram.markdown b/source/_integrations/telegram.markdown
index 15bb3c56193..f6ecd131b3f 100644
--- a/source/_integrations/telegram.markdown
+++ b/source/_integrations/telegram.markdown
@@ -118,7 +118,7 @@ To use notifications, please see the [getting started with automation page](/get
action:
service: notify.NOTIFIER_NAME
data:
- title: '*Send a message*'
+ title: "*Send a message*"
message: "That's an example that _sends_ a *formatted* message with a custom inline keyboard."
data:
inline_keyboard:
diff --git a/source/_integrations/telegram_bot.markdown b/source/_integrations/telegram_bot.markdown
index bca5c1258fc..6623f72256d 100644
--- a/source/_integrations/telegram_bot.markdown
+++ b/source/_integrations/telegram_bot.markdown
@@ -297,11 +297,11 @@ trigger:
platform: event
event_type: telegram_command
event_data:
- command: '/ping'
+ command: "/ping"
action:
- service: notify.notify
data:
- message: 'pong'
+ message: "pong"
```
An example that shows keyboard interaction with `notify.telegram`
@@ -311,11 +311,11 @@ trigger:
platform: event
event_type: telegram_command
event_data:
- command: '/start'
+ command: "/start"
action:
- service: notify.telegram
data:
- message: 'commands'
+ message: "commands"
data:
keyboard:
- '/ping, /alarm'
@@ -329,7 +329,7 @@ trigger:
platform: event
event_type: telegram_command
event_data:
- command: '/siren'
+ command: "/siren"
action:
- service: homeassistant.turn_on
entity_id: switch.vision_zm1601eu5_battery_operated_siren_switch_9_0
@@ -349,7 +349,7 @@ An example to show the use of event_data in action:
platform: event
event_type: telegram_command
event_data:
- command: '/speak'
+ command: "/speak"
action:
- service: notify.kitchen_echo
data:
@@ -379,9 +379,9 @@ Text repeater:
action:
- service: telegram_bot.send_message
data:
- title: '*Dumb automation*'
- target: '{{ trigger.event.data.user_id }}'
- message: 'You said: {{ trigger.event.data.text }}'
+ title: "*Dumb automation*"
+ target: "{{ trigger.event.data.user_id }}"
+ message: "You said: {{ trigger.event.data.text }}"
disable_notification: true
inline_keyboard:
- "Edit message:/edit_msg, Don't:/do_nothing"
@@ -400,18 +400,18 @@ Message editor:
platform: event
event_type: telegram_callback
event_data:
- command: '/edit_msg'
+ command: "/edit_msg"
action:
- service: telegram_bot.answer_callback_query
data:
- callback_query_id: '{{ trigger.event.data.id }}'
- message: 'Editing the message!'
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "Editing the message!"
show_alert: true
- service: telegram_bot.edit_message
data:
- message_id: '{{ trigger.event.data.message.message_id }}'
- chat_id: '{{ trigger.event.data.chat_id }}'
- title: '*Message edit*'
+ message_id: "{{ trigger.event.data.message.message_id }}"
+ chat_id: "{{ trigger.event.data.chat_id }}"
+ title: "*Message edit*"
inline_keyboard:
- "Edit message:/edit_msg, Don't:/do_nothing"
- "Remove this button:/remove_button"
@@ -433,16 +433,16 @@ Keyboard editor:
platform: event
event_type: telegram_callback
event_data:
- command: '/remove_button'
+ command: "/remove_button"
action:
- service: telegram_bot.answer_callback_query
data:
- callback_query_id: '{{ trigger.event.data.id }}'
- message: 'Callback received for editing the inline keyboard!'
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "Callback received for editing the inline keyboard!"
- service: telegram_bot.edit_replymarkup
data:
- message_id: 'last'
- chat_id: '{{ trigger.event.data.chat_id }}'
+ message_id: "last"
+ chat_id: "{{ trigger.event.data.chat_id }}"
inline_keyboard:
- "Edit message:/edit_msg, Don't:/do_nothing"
```
@@ -459,12 +459,12 @@ Only acknowledges the 'NO' answer:
platform: event
event_type: telegram_callback
event_data:
- command: '/do_nothing'
+ command: "/do_nothing"
action:
- service: telegram_bot.answer_callback_query
data:
- callback_query_id: '{{ trigger.event.data.id }}'
- message: 'OK, you said no!'
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "OK, you said no!"
```
{% endraw %}
@@ -479,13 +479,13 @@ Telegram callbacks also support arguments and commands the same way as normal me
platform: event
event_type: telegram_callback
event_data:
- command: '/repeat'
+ command: "/repeat"
action:
- service: telegram_bot.answer_callback_query
data:
show_alert: true
- callback_query_id: '{{ trigger.event.data.id }}'
- message: 'I repeat: {{trigger.event.data["args"]}}'
+ callback_query_id: "{{ trigger.event.data.id }}"
+ message: "I repeat: {{trigger.event.data["args"]}}"
```
{% endraw %}
@@ -507,11 +507,11 @@ Receiving `chat_id` and `message_id` identifiers of sent messages by the `telegr
- service: input_number.set_value
data_template:
entity_id: input_number.chat_id
- value: '{{ trigger.event.data.chat_id }}'
+ value: "{{ trigger.event.data.chat_id }}"
- service: input_number.set_value
data_template:
entity_id: input_number.message_id
- value: '{{ trigger.event.data.message_id }}'
+ value: "{{ trigger.event.data.message_id }}"
```
{% endraw %}
diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown
index 34638fdebd9..3f02a1a9c4c 100644
--- a/source/_integrations/template.markdown
+++ b/source/_integrations/template.markdown
@@ -27,7 +27,7 @@ sensor:
sensors:
solar_angle:
friendly_name: "Sun angle"
- unit_of_measurement: 'degrees'
+ unit_of_measurement: "degrees"
value_template: "{{ state_attr('sun.sun', 'elevation') }}"
sunrise:
@@ -127,7 +127,7 @@ sensor:
sensors:
solar_angle:
friendly_name: "Sun Angle"
- unit_of_measurement: '°'
+ unit_of_measurement: "°"
value_template: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}"
```
@@ -194,12 +194,12 @@ sensor:
sensors:
transmission_down_speed_kbps:
friendly_name: "Transmission Down Speed"
- unit_of_measurement: 'kB/s'
+ unit_of_measurement: "kB/s"
value_template: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"
transmission_up_speed_kbps:
friendly_name: "Transmission Up Speed"
- unit_of_measurement: 'kB/s'
+ unit_of_measurement: "kB/s"
value_template: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"
```
@@ -279,7 +279,7 @@ sensor:
Power Production
{% endif %}
value_template: "{{ states('sensor.power_consumption') }}"
- unit_of_measurement: 'kW'
+ unit_of_measurement: "kW"
```
{% endraw %}
@@ -335,7 +335,7 @@ sensor:
sensors:
nonsmoker:
value_template: '{{ ( ( as_timestamp(now()) - as_timestamp(strptime("06.07.2018", "%d.%m.%Y")) ) / 86400 ) | round(2) }}'
- friendly_name: 'Not smoking'
+ friendly_name: "Not smoking"
unit_of_measurement: "Days"
```
diff --git a/source/_integrations/thermoworks_smoke.markdown b/source/_integrations/thermoworks_smoke.markdown
index 694110dfa59..268adb59b7d 100644
--- a/source/_integrations/thermoworks_smoke.markdown
+++ b/source/_integrations/thermoworks_smoke.markdown
@@ -99,7 +99,7 @@ input_number:
min: -40
max: 500
step: 0.5
- unit_of_measurement: '°F'
+ unit_of_measurement: "°F"
icon: mdi:thermometer
automation:
diff --git a/source/_integrations/timer.markdown b/source/_integrations/timer.markdown
index dd7cf7eb4a7..3d276826fc9 100644
--- a/source/_integrations/timer.markdown
+++ b/source/_integrations/timer.markdown
@@ -25,7 +25,7 @@ To add a timer to your installation, add the following to your `configuration.ya
# Example configuration.yaml entry
timer:
laundry:
- duration: '00:01:00'
+ duration: "00:01:00"
```
{% configuration %}
@@ -121,7 +121,7 @@ Set a timer called `test` to a duration of 30 seconds.
# Example configuration.yaml entry
timer:
test:
- duration: '00:00:30'
+ duration: "00:00:30"
```
### Control a timer from the frontend
@@ -129,19 +129,19 @@ timer:
```yaml
# Example automations.yaml entry
- alias: Timerswitch
- id: 'Timerstart'
+ id: "Timerstart"
# Timer is started when the switch pumprun is set to on.
trigger:
- platform: state
entity_id: switch.pumprun
- to: 'on'
+ to: "on"
action:
- service: timer.start
entity_id: timer.test
# When timer is stopped, the time run out, another message is sent
- alias: Timerstop
- id: 'Timerstop'
+ id: "Timerstop"
trigger:
- platform: event
event_type: timer.finished
diff --git a/source/_integrations/tod.markdown b/source/_integrations/tod.markdown
index 32a170f3857..a667f6a59ce 100644
--- a/source/_integrations/tod.markdown
+++ b/source/_integrations/tod.markdown
@@ -25,13 +25,13 @@ binary_sensor:
- platform: tod
name: Early Morning
after: sunrise
- after_offset: '-02:00'
- before: '07:00'
+ after_offset: "-02:00"
+ before: "07:00"
- platform: tod
name: Late Morning
- after: '10:00'
- before: '12:00'
+ after: "10:00"
+ before: "12:00"
```
{% configuration %}
diff --git a/source/_integrations/totalconnect.markdown b/source/_integrations/totalconnect.markdown
index 9727736c885..410a5156f6b 100644
--- a/source/_integrations/totalconnect.markdown
+++ b/source/_integrations/totalconnect.markdown
@@ -46,7 +46,7 @@ automation:
trigger:
platform: state
entity_id: alarm_control_panel.total_connect
- to: 'disarmed'
+ to: "disarmed"
condition:
condition: sun
before: sunset
@@ -57,7 +57,7 @@ automation:
trigger:
platform: state
entity_id: alarm_control_panel.total_connect
- to: 'armed_away'
+ to: "armed_away"
action:
service: scene.turn_on
entity_id: scene.OnArmedAway
diff --git a/source/_integrations/tplink.markdown b/source/_integrations/tplink.markdown
index b7af997a3ad..0048ab96525 100644
--- a/source/_integrations/tplink.markdown
+++ b/source/_integrations/tplink.markdown
@@ -155,23 +155,23 @@ sensor:
my_tp_switch_amps:
friendly_name_template: "{{ state_attr('switch.my_tp_switch','friendly_name') }} Current"
value_template: "{{ state_attr('switch.my_tp_switch','current_a') | float }}"
- unit_of_measurement: 'A'
+ unit_of_measurement: "A"
my_tp_switch_watts:
friendly_name_template: "{{ state_attr('switch.my_tp_switch','friendly_name') }} Current Consumption"
value_template: "{{ state_attr('switch.my_tp_switch','current_power_w') | float }}"
- unit_of_measurement: 'W'
+ unit_of_measurement: "W"
my_tp_switch_total_kwh:
friendly_name_template: "{{ state_attr('switch.my_tp_switch','friendly_name') }} Total Consumption"
value_template: "{{ state_attr('switch.my_tp_switch','total_energy_kwh') | float }}"
- unit_of_measurement: 'kWh'
+ unit_of_measurement: "kWh"
my_tp_switch_volts:
friendly_name_template: "{{ state_attr('switch.my_tp_switch','friendly_name') }} Voltage"
value_template: "{{ state_attr('switch.my_tp_switch','voltage') | float }}"
- unit_of_measurement: 'V'
+ unit_of_measurement: "V"
my_tp_switch_today_kwh:
friendly_name_template: "{{ state_attr('switch.my_tp_switch','friendly_name') }} Today's Consumption"
value_template: "{{ state_attr('switch.my_tp_switch','today_energy_kwh') | float }}"
- unit_of_measurement: 'kWh'
+ unit_of_measurement: "kWh"
```
{% endraw %}
diff --git a/source/_integrations/transport_nsw.markdown b/source/_integrations/transport_nsw.markdown
index b6cdd039367..c7f9edb401d 100644
--- a/source/_integrations/transport_nsw.markdown
+++ b/source/_integrations/transport_nsw.markdown
@@ -28,8 +28,8 @@ To enable the sensor, add the following lines to your `configuration.yaml` file:
# Example configuration.yaml entry
sensor:
- platform: transport_nsw
- stop_id: '200024'
- api_key: 'YOUR API KEY'
+ stop_id: "200024"
+ api_key: "YOUR API KEY"
```
{% configuration %}
@@ -65,20 +65,20 @@ More example configurations for bus or ferry.
# Example bus route configuration.yaml entry
sensor:
- platform: transport_nsw
- name: 'Bus'
- stop_id: '209516'
+ name: "Bus"
+ stop_id: "209516"
route: '199'
- api_key: 'YOUR API KEY'
+ api_key: "YOUR API KEY"
```
```yaml
# Example ferry configuration.yaml entry
sensor:
- platform: transport_nsw
- name: 'Ferry'
- stop_id: '10102008'
- destination: 'Circular Quay'
- api_key: 'YOUR API KEY'
+ name: "Ferry"
+ stop_id: "10102008"
+ destination: "Circular Quay"
+ api_key: "YOUR API KEY"
```
The sensor returns n/a if no stop event is found within the next 24h. A `template` sensor can help building a more meaningful string.
diff --git a/source/_integrations/tts.markdown b/source/_integrations/tts.markdown
index e5da42d2522..f48ccf11c62 100644
--- a/source/_integrations/tts.markdown
+++ b/source/_integrations/tts.markdown
@@ -110,7 +110,7 @@ Say to all `media_player` device entities:
service: tts.google_translate_say
entity_id: "all"
data:
- message: 'May the Force be with you.'
+ message: "May the Force be with you."
```
Say to the `media_player.floor` device entity:
@@ -119,7 +119,7 @@ Say to the `media_player.floor` device entity:
service: tts.google_translate_say
entity_id: media_player.floor
data:
- message: 'May the Force be with you.'
+ message: "May the Force be with you."
```
Say to the `media_player.floor` device entity in French:
@@ -128,8 +128,8 @@ Say to the `media_player.floor` device entity in French:
service: tts.google_translate_say
entity_id: media_player.floor
data:
- message: 'Que la force soit avec toi.'
- language: 'fr'
+ message: "Que la force soit avec toi."
+ language: "fr"
```
With a template:
diff --git a/source/_integrations/twilio_call.markdown b/source/_integrations/twilio_call.markdown
index b97d0334c5e..d247f2db679 100644
--- a/source/_integrations/twilio_call.markdown
+++ b/source/_integrations/twilio_call.markdown
@@ -49,7 +49,7 @@ automation:
action:
service: notify.twilio_call
data:
- message: 'The sun has set'
+ message: "The sun has set"
target:
- +14151234567
- +15105555555
diff --git a/source/_integrations/twilio_sms.markdown b/source/_integrations/twilio_sms.markdown
index db1cad1683a..81876bfacb4 100644
--- a/source/_integrations/twilio_sms.markdown
+++ b/source/_integrations/twilio_sms.markdown
@@ -52,7 +52,7 @@ automation:
action:
service: notify.twilio_sms
data:
- message: 'The sun has set'
+ message: "The sun has set"
target:
- '+14151234567'
- '+15105555555'
diff --git a/source/_integrations/uk_transport.markdown b/source/_integrations/uk_transport.markdown
index b8eacf5b8e5..de6455acf5a 100644
--- a/source/_integrations/uk_transport.markdown
+++ b/source/_integrations/uk_transport.markdown
@@ -85,23 +85,23 @@ Attributes can be accessed using the [template sensor](/integrations/template) a
- platform: template
sensors:
next_train_status:
- friendly_name: 'Next train status'
+ friendly_name: "Next train status"
value_template: >-
{{state_attr('sensor.next_train_to_wat', 'next_trains')[0].status}}
next_trains_origin:
- friendly_name: 'Next train origin'
+ friendly_name: "Next train origin"
value_template: >-
{{state_attr('sensor.next_train_to_wat', 'next_trains')[0].origin_name}}
next_trains_estimated:
- friendly_name: 'Next train estimated'
+ friendly_name: "Next train estimated"
value_template: >-
{{state_attr('sensor.next_train_to_wat', 'next_trains')[0].estimated}}
next_trains_scheduled:
- friendly_name: 'Next train scheduled'
+ friendly_name: "Next train scheduled"
value_template: >-
{{state_attr('sensor.next_train_to_wat', 'next_trains')[0].scheduled}}
next_trains_platform:
- friendly_name: 'Next train platform'
+ friendly_name: "Next train platform"
value_template: >-
{{state_attr('sensor.next_train_to_wat', 'next_trains')[0].platform}}
```
@@ -140,16 +140,16 @@ And the template sensor for viewing the next bus attributes.
- platform: template
sensors:
next_bus_route:
- friendly_name: 'Next bus route'
+ friendly_name: "Next bus route"
value_template: {% raw %}"{{state_attr('sensor.next_bus_to_wantage', 'next_buses')[0].route}}"{% endraw %}
next_bus_direction:
- friendly_name: 'Next bus direction'
+ friendly_name: "Next bus direction"
value_template: {% raw %}"{{state_attr('sensor.next_bus_to_wantage', 'next_buses')[0].direction}}"{% endraw %}
next_bus_scheduled:
- friendly_name: 'Next bus scheduled'
+ friendly_name: "Next bus scheduled"
value_template: {% raw %}"{{state_attr('sensor.next_bus_to_wantage', 'next_buses')[0].scheduled}}"{% endraw %}
next_bus_estimated:
- friendly_name: 'Next bus estimated'
+ friendly_name: "Next bus estimated"
value_template: {% raw %}"{{state_attr('sensor.next_bus_to_wantage', 'next_buses')[0].estimated}}"{% endraw %}
```
diff --git a/source/_integrations/universal.markdown b/source/_integrations/universal.markdown
index 36696398265..910d15b933b 100644
--- a/source/_integrations/universal.markdown
+++ b/source/_integrations/universal.markdown
@@ -119,12 +119,12 @@ media_player:
service: media_player.select_source
data:
entity_id: media_player.receiver
- source: '{{ source }}'
+ source: "{{ source }}"
volume_set:
service: media_player.volume_set
data:
entity_id: media_player.receiver
- volume_level: '{{ volume_level }}'
+ volume_level: "{{ volume_level }}"
attributes:
state: switch.living_room_tv
@@ -215,8 +215,8 @@ automation:
trigger:
platform: state
entity_id: media_player.kodi_tv
- from: 'off'
- to: 'playing'
+ from: "off"
+ to: "playing"
action:
- service: media_player.turn_on
entity_id: media_player.kodi_tv
@@ -225,7 +225,7 @@ automation:
trigger:
platform: state
entity_id: media_player.kodi_tv
- to: 'idle'
+ to: "idle"
for:
minutes: 15
action:
@@ -272,7 +272,7 @@ media_player:
service: remote.turn_on
data:
entity_id: remote.alexander_down_guest
- activity: '{{ source }}'
+ activity: "{{ source }}"
```
{% endraw %}
diff --git a/source/_integrations/upb.markdown b/source/_integrations/upb.markdown
index 5301e239339..c9a1c158df8 100644
--- a/source/_integrations/upb.markdown
+++ b/source/_integrations/upb.markdown
@@ -172,17 +172,17 @@ Start a scene blinking.
#automation:
- alias: 'Specific scene activated'
- description: 'Trigger when scene 9 on network 42 is activated'
+ description: "Trigger when scene 9 on network 42 is activated"
trigger:
platform: event
event_type: upb.scene_changed
event_data:
command: activated
- address: '42_9'
+ address: "42_9"
action:
service: persistent_notification.create
data:
- title: 'Scene Activated'
+ title: "Scene Activated"
message: >
Activated scene 9 on network 42: {{trigger.event.data.command}}, {{trigger.event.data.address}}
@@ -192,8 +192,8 @@ Start a scene blinking.
#script:
all_lights_on:
- alias: 'All Lights On'
- description: 'Activate two UPB scenes named interior_lights and exterior_lights'
+ alias: "All Lights On"
+ description: "Activate two UPB scenes named interior_lights and exterior_lights"
sequence:
- service: scene.turn_on
entity_id:
@@ -201,8 +201,8 @@ all_lights_on:
- scene.exterior_lights
all_lights_off:
- alias: 'All Lights Off'
- description: 'Deactivate two UPB scenes named interior_lights and exterior_lights'
+ alias: "All Lights Off"
+ description: "Deactivate two UPB scenes named interior_lights and exterior_lights"
sequence:
- service: upb.scene_deactivate
entity_id:
@@ -210,8 +210,8 @@ all_lights_off:
- scene.exterior_lights
kitchen_fade_on:
- alias: 'Kitchen Fade to On'
- description: 'Turn on kitchen light to 75% over a period of 10 seconds'
+ alias: "Kitchen Fade to On"
+ description: "Turn on kitchen light to 75% over a period of 10 seconds"
sequence:
- service: upb.light_fade_start
data:
diff --git a/source/_integrations/updater.markdown b/source/_integrations/updater.markdown
index 4ca50fe8f35..799beeacc23 100644
--- a/source/_integrations/updater.markdown
+++ b/source/_integrations/updater.markdown
@@ -68,8 +68,8 @@ automation:
trigger:
- platform: state
entity_id: binary_sensor.updater
- from: 'off'
- to: 'on'
+ from: "off"
+ to: "on"
action:
- service: notify.notify
data:
diff --git a/source/_integrations/uptime.markdown b/source/_integrations/uptime.markdown
index 9c60a196188..6061a17db6d 100644
--- a/source/_integrations/uptime.markdown
+++ b/source/_integrations/uptime.markdown
@@ -10,7 +10,7 @@ ha_quality_scale: internal
ha_domain: uptime
---
-The `uptime` sensor platform displays the time since the last Home Assistant restart.
+The `uptime` sensor stores the timestamp (date and time) when Home Assistant was last started.
## Configuration
diff --git a/source/_integrations/usgs_earthquakes_feed.markdown b/source/_integrations/usgs_earthquakes_feed.markdown
index 115375269aa..5f3bddf3961 100644
--- a/source/_integrations/usgs_earthquakes_feed.markdown
+++ b/source/_integrations/usgs_earthquakes_feed.markdown
@@ -32,7 +32,7 @@ To integrate the U.S. Geological Survey Earthquake Hazards Program feed, add the
# Example configuration.yaml entry
geo_location:
- platform: usgs_earthquakes_feed
- feed_type: 'past_day_all_earthquakes'
+ feed_type: "past_day_all_earthquakes"
```
{% configuration %}
@@ -112,7 +112,7 @@ The following state attributes are available for each entity in addition to the
# Example configuration.yaml entry
geo_location:
- platform: usgs_earthquakes_feed
- feed_type: 'past_month_all_earthquakes'
+ feed_type: "past_month_all_earthquakes"
radius: 50
minimum_magnitude: 0.0
latitude: 35.899722
diff --git a/source/_integrations/utility_meter.markdown b/source/_integrations/utility_meter.markdown
index ddd52292143..a9c816ad506 100644
--- a/source/_integrations/utility_meter.markdown
+++ b/source/_integrations/utility_meter.markdown
@@ -146,9 +146,9 @@ a time based automation can be used:
automation:
trigger:
- platform: time
- at: '09:00:00'
+ at: "09:00:00"
- platform: time
- at: '21:00:00'
+ at: "21:00:00"
action:
- service: utility_meter.next_tariff
entity_id: utility_meter.daily_energy
diff --git a/source/_integrations/vacuum.mqtt.markdown b/source/_integrations/vacuum.mqtt.markdown
index 035905f1f45..7b57856f1f9 100644
--- a/source/_integrations/vacuum.mqtt.markdown
+++ b/source/_integrations/vacuum.mqtt.markdown
@@ -245,7 +245,7 @@ vacuum:
- medium
- high
- max
- send_command_topic: 'vacuum/send_command'
+ send_command_topic: "vacuum/send_command"
```
{% endraw %}
@@ -478,7 +478,7 @@ vacuum:
- medium
- high
- max
- send_command_topic: 'vacuum/send_command'
+ send_command_topic: "vacuum/send_command"
```
### State MQTT Protocol
@@ -527,8 +527,8 @@ Service trigger example:
action:
service: vacuum.send_command
data:
- entity_id: 'vacuum.vacuum_entity'
- command: 'custom_command'
+ entity_id: vacuum.vacuum_entity
+ command: "custom_command"
params:
- key: value
```
@@ -602,8 +602,8 @@ Service trigger example:
action:
service: vacuum.send_command
data:
- entity_id: 'vacuum.vacuum_entity'
- command: 'custom_command'
+ entity_id: vacuum.vacuum_entity
+ command: "custom_command"
params:
- key: value
```
diff --git a/source/_integrations/velbus.markdown b/source/_integrations/velbus.markdown
index 8fe3c7f0dbe..e7ddd25ae4a 100644
--- a/source/_integrations/velbus.markdown
+++ b/source/_integrations/velbus.markdown
@@ -40,7 +40,7 @@ There are 2 options in configuring the Velbus integration:
```yaml
# Example configuration.yaml entry for a USB or serial interface
velbus:
- port: 'PORT_STRING'
+ port: "PORT_STRING"
```
## Port String
@@ -101,7 +101,7 @@ The actual linking can be realized by two automation rules. One rule to control
trigger:
- entity_id: binary_sensor.push_button_10
platform: state
- to: 'on'
+ to: "on"
condition: []
action:
- entity_id: light.living
@@ -113,10 +113,10 @@ The actual linking can be realized by two automation rules. One rule to control
trigger:
- entity_id: light.living
platform: state
- to: 'on'
+ to: "on"
- entity_id: light.living
platform: state
- to: 'off'
+ to: "off"
condition: []
action:
- condition: or
diff --git a/source/_integrations/version.markdown b/source/_integrations/version.markdown
index 50bcc7be6df..9c9e5c4d0a9 100644
--- a/source/_integrations/version.markdown
+++ b/source/_integrations/version.markdown
@@ -95,7 +95,7 @@ sensor:
- platform: rest
resource: http://IP_ADDRESS:8123/api/config
name: Current Version
- value_template: '{{ value_json.version }}'
+ value_template: "{{ value_json.version }}"
```
{% endraw %}
diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown
index eb5c5856ef4..f92fac78ebd 100644
--- a/source/_integrations/vesync.markdown
+++ b/source/_integrations/vesync.markdown
@@ -115,15 +115,15 @@ sensor:
vesync_switch_watts:
friendly_name_template: "{{ states.switch.vesync_switch.name}} Current Consumption"
value_template: '{{ states.switch.vesync_switch.attributes["current_power_w"] | float }}'
- unit_of_measurement: 'W'
+ unit_of_measurement: "W"
vesync_switch_total_kwh:
friendly_name_template: "{{ states.switch.vesync_switch.name}} Total Consumption"
value_template: '{{ states.switch.vesync_switch.attributes["today_energy_kwh"] | float }}'
- unit_of_measurement: 'kWh'
+ unit_of_measurement: "kWh"
vesync_switch_volts:
friendly_name_template: "{{ states.switch.vesync_switch.name}} Voltage"
value_template: '{{ states.switch.vesync_switch.attributes["voltage"] | float }}'
- unit_of_measurement: 'V'
+ unit_of_measurement: "V"
```
{% endraw %}
diff --git a/source/_integrations/vlc.markdown b/source/_integrations/vlc.markdown
index 7d650229650..4198d1adfab 100644
--- a/source/_integrations/vlc.markdown
+++ b/source/_integrations/vlc.markdown
@@ -50,7 +50,7 @@ A full configuration for VLC could look like the one below:
media_player:
- platform: vlc
name: speaker_1
- arguments: '--alsa-audio-device=hw:1,0'
+ arguments: "--alsa-audio-device=hw:1,0"
```
## Additional configuration on macOS
diff --git a/source/_integrations/voicerss.markdown b/source/_integrations/voicerss.markdown
index d48f4e62b24..7d5b23c50f0 100644
--- a/source/_integrations/voicerss.markdown
+++ b/source/_integrations/voicerss.markdown
@@ -54,9 +54,9 @@ The configuration sample below shows how an entry can look like:
tts:
- platform: voicerss
api_key: YOUR_API_KEY
- language: 'de-de'
+ language: "de-de"
codec: mp3
- format: '8khz_8bit_mono'
+ format: "8khz_8bit_mono"
```
Please note, some media_players require a certain format. For example the Sonos requires a format of '44khz_16bit_stereo'
diff --git a/source/_integrations/volkszaehler.markdown b/source/_integrations/volkszaehler.markdown
index b746b986cc4..cab0a9b40a9 100644
--- a/source/_integrations/volkszaehler.markdown
+++ b/source/_integrations/volkszaehler.markdown
@@ -66,7 +66,7 @@ monitored_conditions:
sensor:
- platform: volkszaehler
host: demo.volkszaehler.org
- uuid: '57acbef0-88a9-11e4-934f-6b0f9ecd95a8'
+ uuid: "57acbef0-88a9-11e4-934f-6b0f9ecd95a8"
monitored_conditions:
- average
- consumption
diff --git a/source/_integrations/volvooncall.markdown b/source/_integrations/volvooncall.markdown
index 379ba07b74b..deebd695e10 100644
--- a/source/_integrations/volvooncall.markdown
+++ b/source/_integrations/volvooncall.markdown
@@ -131,7 +131,7 @@ volvooncall:
username: YOUR_USERNAME
password: YOUR_PASSWORD
name:
- YOUR_VIN_NUMBER: 'NEW_NAME'
+ YOUR_VIN_NUMBER: "NEW_NAME"
resources:
- odometer
- lock
diff --git a/source/_integrations/wake_on_lan.markdown b/source/_integrations/wake_on_lan.markdown
index 908ac71a794..aca1946d9e2 100644
--- a/source/_integrations/wake_on_lan.markdown
+++ b/source/_integrations/wake_on_lan.markdown
@@ -126,5 +126,5 @@ switch:
service: shell_command.turn_off_TARGET
shell_command:
- turn_off_TARGET: 'ssh hass@TARGET sudo pm-suspend'
+ turn_off_TARGET: "ssh hass@TARGET sudo pm-suspend"
```
diff --git a/source/_integrations/watson_iot.markdown b/source/_integrations/watson_iot.markdown
index 760091fdda4..908dbe56425 100644
--- a/source/_integrations/watson_iot.markdown
+++ b/source/_integrations/watson_iot.markdown
@@ -29,10 +29,10 @@ With this basic information you can configure the component:
```yaml
# Example configuration.yaml entry:
watson_iot:
- organization: 'organization_id'
- type: 'device_type'
- id: 'device_id'
- token: 'auth_token'
+ organization: "organization_id"
+ type: "device_type"
+ id: "device_id"
+ token: "auth_token"
```
{% configuration %}
diff --git a/source/_integrations/watson_tts.markdown b/source/_integrations/watson_tts.markdown
index 34f87e30b85..21e470b0614 100644
--- a/source/_integrations/watson_tts.markdown
+++ b/source/_integrations/watson_tts.markdown
@@ -65,7 +65,7 @@ Say to all `media_player` device entities:
```yaml
- service: tts.watson_tts_say
data:
- message: 'Hello from Watson'
+ message: "Hello from Watson"
```
or
diff --git a/source/_integrations/waze_travel_time.markdown b/source/_integrations/waze_travel_time.markdown
index d86d8d7df25..fe919e6665c 100644
--- a/source/_integrations/waze_travel_time.markdown
+++ b/source/_integrations/waze_travel_time.markdown
@@ -22,7 +22,7 @@ sensor:
- platform: waze_travel_time
origin: Montréal, QC
destination: Québec, QC
- region: 'US'
+ region: "US"
```
{% configuration %}
@@ -120,20 +120,20 @@ sensor:
name: "Me to destination"
origin: device_tracker.myphone
destination: sensor.dest_address
- region: 'US'
+ region: "US"
# Tracking entity to zone friendly name
- platform: waze_travel_time
name: Home To Eddie's House
origin: zone.home
destination: Eddies House # Friendly name of a zone
- region: 'US'
+ region: "US"
# Tracking entity in imperial unit
- platform: waze_travel_time
origin: person.paulus
destination: "725 5th Ave, New York, NY 10022, USA"
- region: 'US'
+ region: "US"
units: imperial # 'metric' for Metric, 'imperial' for Imperial
vehicle_type: motorcycle # vehicle type used for routing
@@ -142,7 +142,7 @@ sensor:
name: Westerscheldetunnel
origin: 51.330436, 3.802043
destination: 51.445677, 3.749929
- region: 'EU'
+ region: "EU"
avoid_toll_roads: true
avoid_subscription_roads: true
```
diff --git a/source/_integrations/webostv.markdown b/source/_integrations/webostv.markdown
index fec592feb89..e2786bbb1c8 100644
--- a/source/_integrations/webostv.markdown
+++ b/source/_integrations/webostv.markdown
@@ -231,7 +231,7 @@ automation:
trigger:
platform: state
entity_id: binary_sensor.front_door_motion
- to: 'on'
+ to: "on"
action:
service: notify.livingroom_tv
data:
diff --git a/source/_integrations/wink.markdown b/source/_integrations/wink.markdown
index a964ec8239a..7288ad50c23 100644
--- a/source/_integrations/wink.markdown
+++ b/source/_integrations/wink.markdown
@@ -370,7 +370,7 @@ script:
- service: wink.set_nimbus_dial_state
data:
entity_id: wink.nimbus_dial_1
- rotation: 'ccw'
+ rotation: "ccw"
```
## Alarm Control Panel
diff --git a/source/_integrations/withings.markdown b/source/_integrations/withings.markdown
index bd1e92b784b..83f1956f5a2 100644
--- a/source/_integrations/withings.markdown
+++ b/source/_integrations/withings.markdown
@@ -129,7 +129,7 @@ sensor:
sensors:
withings_weight_lbs_USER_PROFILE_NAME:
friendly_name: "withings weight_lbs_USER_PROFILE_NAME"
- unit_of_measurement: 'lbs'
+ unit_of_measurement: "lbs"
value_template: "{{ (states('sensor.withings_weight_kg_USER_PROFILE_NAME') | float * 2.20462262185) | round(2) }}"
icon_template: mdi:weight-pound
@@ -137,7 +137,7 @@ sensor:
sensors:
withings_bone_mass_lbs_USER_PROFILE_NAME:
friendly_name: "withings bone_mass_lbs_USER_PROFILE_NAME"
- unit_of_measurement: 'lbs'
+ unit_of_measurement: "lbs"
value_template: "{{ (states('sensor.withings_bone_mass_kg_USER_PROFILE_NAME') | float * 2.20462262185) | round(2) }}"
icon_template: mdi:weight-pound
@@ -145,7 +145,7 @@ sensor:
sensors:
withings_fat_free_mass_lbs_USER_PROFILE_NAME:
friendly_name: "withings fat_free_mass_lbs_USER_PROFILE_NAME"
- unit_of_measurement: 'lbs'
+ unit_of_measurement: "lbs"
value_template: "{{ (states('sensor.withings_fat_free_mass_kg_USER_PROFILE_NAME') | float * 2.20462262185) | round(2) }}"
icon_template: mdi:weight-pound
@@ -153,7 +153,7 @@ sensor:
sensors:
withings_fat_mass_lbs_USER_PROFILE_NAME:
friendly_name: "withings fat_mass_lbs_USER_PROFILE_NAME"
- unit_of_measurement: 'lbs'
+ unit_of_measurement: "lbs"
value_template: "{{ (states('sensor.withings_fat_mass_kg_USER_PROFILE_NAME') | float * 2.20462262185) | round(2) }}"
icon_template: mdi:weight-pound
@@ -161,7 +161,7 @@ sensor:
sensors:
withings_muscle_mass_lbs_USER_PROFILE_NAME:
friendly_name: "withings muscle_mass_lbs_USER_PROFILE_NAME"
- unit_of_measurement: 'lbs'
+ unit_of_measurement: "lbs"
value_template: "{{ (states('sensor.withings_muscle_mass_kg_USER_PROFILE_NAME') | float * 2.20462262185) | round(2) }}"
icon_template: mdi:weight-pound
```
diff --git a/source/_integrations/workday.markdown b/source/_integrations/workday.markdown
index 239ce73dbda..4c3b259580f 100644
--- a/source/_integrations/workday.markdown
+++ b/source/_integrations/workday.markdown
@@ -134,10 +134,10 @@ automation:
alias: Turn on heater on workdays
trigger:
platform: time
- at: '08:00:00'
+ at: "08:00:00"
condition:
condition: state
- entity_id: 'binary_sensor.workday_sensor'
+ entity_id: binary_sensor.workday_sensor
state: "on"
action:
service: switch.turn_on
diff --git a/source/_integrations/xbox.markdown b/source/_integrations/xbox.markdown
index f2568e11cbd..9f400cd6bb9 100644
--- a/source/_integrations/xbox.markdown
+++ b/source/_integrations/xbox.markdown
@@ -166,7 +166,7 @@ elements:
service: remote.send_command
service_data:
entity_id: remote.xboxone_remote
- command: 'A'
+ command: "A"
style:
top: 82.5%
left: 80.05%
@@ -179,7 +179,7 @@ elements:
service: remote.send_command
service_data:
entity_id: remote.xboxone_remote
- command: 'X'
+ command: "X"
style:
top: 60.0%
left: 70.6%
@@ -192,7 +192,7 @@ elements:
service: remote.send_command
service_data:
entity_id: remote.xboxone_remote
- command: 'B'
+ command: "B"
style:
top: 60.0%
left: 89.5%
@@ -205,7 +205,7 @@ elements:
service: remote.send_command
service_data:
entity_id: remote.xboxone_remote
- command: 'Y'
+ command: "Y"
style:
top: 37.9%
left: 80.05%
@@ -230,8 +230,8 @@ elements:
service: media_player.play_media
service_data:
entity_id: media_player.xboxone
- media_content_type: ''
- media_content_id: 'Home'
+ media_content_type: ""
+ media_content_id: "Home"
style:
top: 22.2%
left: 47.2%
diff --git a/source/_integrations/xiaomi.markdown b/source/_integrations/xiaomi.markdown
index 4760dbf753a..bfeed006de3 100644
--- a/source/_integrations/xiaomi.markdown
+++ b/source/_integrations/xiaomi.markdown
@@ -51,8 +51,8 @@ To enable the platform, add the following lines to your`configuration.yaml` file
camera:
- platform: xiaomi
name: Camera
- host: '192.168.1.100'
- model: 'yi'
+ host: "192.168.1.100"
+ model: "yi"
password: YOUR_PASSWORD
```
@@ -105,11 +105,11 @@ One particularly useful adjustment deals with video size. Since Yi videos are fa
camera:
- platform: xiaomi
name: My Camera
- host: '192.168.1.100'
- model: 'xiaofang'
+ host: "192.168.1.100"
+ model: "xiaofang"
password: YOUR_PASSWORD
path: /home/camera/feed
- ffmpeg_arguments: '-vf scale=800:450'
+ ffmpeg_arguments: "-vf scale=800:450"
```
## Hostname template
@@ -120,7 +120,7 @@ camera:
- platform: xiaomi
name: Front Camera
host: "{{ states.device_tracker.front_camera.attributes.ip }}"
- model: 'yi'
+ model: "yi"
password: 1234
path: /tmp/sd/record
```
diff --git a/source/_integrations/xiaomi_miio.markdown b/source/_integrations/xiaomi_miio.markdown
index 8b9c211951b..595338ee8bd 100644
--- a/source/_integrations/xiaomi_miio.markdown
+++ b/source/_integrations/xiaomi_miio.markdown
@@ -1083,14 +1083,14 @@ script:
towel_heater:
sequence:
- service: remote.send_command
- entity_id: 'remote.bathroom_remote'
+ entity_id: "remote.bathroom_remote"
data:
command:
- 'activate_towel_heater'
please_cover_your_ears:
sequence:
- service: remote.send_command
- entity_id: 'remote.bathroom_remote'
+ entity_id: "remote.bathroom_remote"
data:
command:
- 'read_bad_poem'
@@ -1288,7 +1288,7 @@ automation:
- service: xiaomi_miio.vacuum_clean_zone
data:
entity_id: vacuum.xiaomi_vacuum
- repeats: '{{states('input_number.vacuum_passes')|int}}'
+ repeats: "{{states('input_number.vacuum_passes')|int}}"
zone: [[30914,26007,35514,28807], [20232,22496,26032,26496]]
```
@@ -1308,7 +1308,7 @@ automation:
- service: xiaomi_miio.vacuum_clean_zone
data:
entity_id: vacuum.xiaomi_vacuum
- repeats: '{{states('input_number.vacuum_passes')|int}}'
+ repeats: "{{states('input_number.vacuum_passes')|int}}"
zone:
- [30914,26007,35514,28807]
- [20232,22496,26032,26496]
@@ -1494,7 +1494,7 @@ vacuum_kitchen:
sequence:
- service: vacuum.send_command
data:
- entity_id: 'vacuum.xiaomi_vacuum_cleaner'
+ entity_id: "vacuum.xiaomi_vacuum_cleaner"
command: app_zoned_clean
params: [[23084,26282,27628,29727,1]]
```
diff --git a/source/_integrations/yale_smart_alarm.markdown b/source/_integrations/yale_smart_alarm.markdown
index 63db9a507c6..32562e3207e 100644
--- a/source/_integrations/yale_smart_alarm.markdown
+++ b/source/_integrations/yale_smart_alarm.markdown
@@ -53,7 +53,7 @@ automation:
trigger:
platform: state
entity_id: alarm_control_panel.yale_smart_alarm
- to: 'disarmed'
+ to: "disarmed"
condition:
condition: sun
before: sunset
@@ -64,7 +64,7 @@ automation:
trigger:
platform: state
entity_id: alarm_control_panel.yale_smart_alarm
- to: 'armed_away'
+ to: "armed_away"
action:
service: scene.turn_on
entity_id: scene.OnArmedAway
diff --git a/source/_integrations/yandextts.markdown b/source/_integrations/yandextts.markdown
index f198a5324e6..d7d2c82b576 100644
--- a/source/_integrations/yandextts.markdown
+++ b/source/_integrations/yandextts.markdown
@@ -68,7 +68,7 @@ The configuration sample below shows how an entry can look like:
tts:
- platform: yandextts
api_key: YOUR_API_KEY
- language: 'ru-RU'
+ language: "ru-RU"
codec: mp3
voice: oksana
emotion: evil
diff --git a/source/_integrations/yeelight.markdown b/source/_integrations/yeelight.markdown
index 6763ff61f6a..0b261a09ff3 100644
--- a/source/_integrations/yeelight.markdown
+++ b/source/_integrations/yeelight.markdown
@@ -181,6 +181,8 @@ This integration is tested to work with the following models. If you have a diff
| `lamp1` | MJTD01YL | Xiaomi Mijia Smart LED Desk Lamp (autodiscovery isn't possible because the device doesn't support mDNS due to the small amount of RAM) |
| `ceiling1` | YLXD01YL | Yeelight Ceiling Light |
| `ceiling2` | YLXD03YL | Yeelight Ceiling Light - Youth Version |
+
+| ? | YLXD62YI | Yeelight Ceiling Light (Jiaoyue 260) |
| ?, may be `ceiling3` | YLXD04YL | Yeelight Ceiling Light (Jiaoyue 450) |
| `ceiling3` | YLXD05YL | Yeelight Ceiling Light (Jiaoyue 480) |
| `ceiling4` | YLXD02YL | Yeelight Ceiling Light (Jiaoyue 650) |
diff --git a/source/_integrations/yi.markdown b/source/_integrations/yi.markdown
index 9cfd99c49e2..e0ff63ee2bc 100644
--- a/source/_integrations/yi.markdown
+++ b/source/_integrations/yi.markdown
@@ -69,7 +69,7 @@ To enable the platform, add the following lines to your`configuration.yaml` file
camera:
- platform: yi
name: Camera
- host: '192.168.1.100'
+ host: "192.168.1.100"
password: my_password_123
```
@@ -112,8 +112,8 @@ One particularly useful adjustment deals with video size. Since Yi videos are fa
camera:
- platform: yi
name: My Camera
- host: '192.168.1.100'
+ host: "192.168.1.100"
password: my_password_123
path: /home/camera/feed
- ffmpeg_arguments: '-vf scale=800:450'
+ ffmpeg_arguments: "-vf scale=800:450"
```
diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown
index 47ebbe0f9f9..c33f74a3532 100644
--- a/source/_integrations/zha.markdown
+++ b/source/_integrations/zha.markdown
@@ -200,7 +200,7 @@ To correct the device type, also called domain, add the following to your `confi
zha:
device_config:
84:71:27:ff:fe:93:17:24-1: # format: {ieee}-{endpoint_id}
- type: 'switch' # corrected device type
+ type: "switch" # corrected device type
```
`{ieee}` is the device hardware address which can be read from the Home Assistant UI when looking at *Device info*. From device info, you can find the `{endpoint_id}` by viewing the *Zigbee device signature*.
diff --git a/source/_integrations/zwave.markdown b/source/_integrations/zwave.markdown
index 9129079c2f3..fe2d0f4ee3c 100644
--- a/source/_integrations/zwave.markdown
+++ b/source/_integrations/zwave.markdown
@@ -11,7 +11,7 @@ ha_category:
- Lock
- Sensor
- Switch
-featured: true
+featured: false
ha_iot_class: Local Push
ha_release: 0.7
ha_config_flow: true
@@ -20,6 +20,14 @@ ha_codeowners:
ha_domain: zwave
---
+
+
+This integration is deprecated. We recommend using [the Z-Wave JS integration](/integrations/zwave_js).
+
+The Z-Wave integration will no longer receive any updates. It will not be removed unless it becomes incompatible with a future version of Python.
+
+
+
The [Z-Wave](https://www.z-wave.com/) integration for Home Assistant allows you to observe and control connected Z-Wave devices. Please see the [Z-Wave getting started section](/docs/z-wave/) for in-depth documentation on how to use and setup the Z-Wave component.
There is currently support for the following device types within Home Assistant:
@@ -92,7 +100,7 @@ automation:
- service: climate.set_hvac_mode
data:
entity_id: climate.remotec_zxt120_heating_1_id
- hvac_mode: 'Off'
+ hvac_mode: "Off"
```
**Note:** In the example above, the word `Off` is encased in single quotes to be valid YAML.
diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown
index 04c2ece8960..63d198d598a 100644
--- a/source/_integrations/zwave_js.markdown
+++ b/source/_integrations/zwave_js.markdown
@@ -1,6 +1,7 @@
---
title: Z-Wave JS
description: Instructions on how to integrate Z-Wave with Home Assistant via Z-Wave JS.
+featured: true
ha_category:
- Binary Sensor
- Climate
@@ -19,56 +20,31 @@ ha_codeowners:
ha_domain: zwave_js
---
-This integration allows you to control a Z-Wave network via [Z-Wave JS](https://zwave-js.github.io/node-zwave-js/#/).
+This integration allows you to control a Z-Wave network via the [Z-Wave JS](https://zwave-js.github.io/node-zwave-js/#/) driver. This is our recommended Z-Wave integration for Home Assistant.
-## Requirements
+## Quick start (Home Assistant including Supervisor)
-Controlling your Z-Wave network with the Z-Wave JS integration is split up into two parts:
+To add Z-Wave JS to your installation, plug the Z-Wave stick into the device that runs Home Assistant. Then Go to Configuration >> Integrations in the UI. Click the "Add integration" button in the bottom right and from the list of integrations, select "Z-Wave JS" and follow the instructions shown.
-1. The [Z-Wave JS Server](https://github.com/zwave-js/zwave-js-server) is the gateway between your Z-Wave USB stick and Home Assistant. You can run this server separately from Home Assistant so your Z-Wave mesh will keep running if you restart or stop Home Assistant. The Home Assistant Z-Wave JS integration connects to this server with a websocket connection.
+Note: A new network key is automatically generated for you. If this Z-Wave stick has already paired with secure devices, you need to enter the previously used network key. Make sure that you keep a backup of this key in a safe place in case you need to move your Z-Wave stick to another device.
-2. The Z-Wave JS integration in Home Assistant. This integration connects to the Z-Wave JS Server to retrieve the info from your Z-Wave network.
+If you do not run Home Assistant OS (the default installation type) or Home Assistant Supervised, please see the [advanced installation instructions](#advanced-installation-instructions).
-### Supervisor managed installation
+## Using Z-Wave
-- The official Z-Wave JS add-on installed available from the add-on store.
+When the Z-Wave integration starts up, it will interview your entire Z-Wave network. Depending on the number of devices paired with the Z-Wave stick, this can take a while. Information about your devices is stored in cache files by Z-Wave JS. Be aware that (re)starting the Z-Wave server will cause your network to be (partially) unresponsive until the interview process is done.
-### Core installation
+While your Z-Wave mesh is permanently stored on your stick, the additional metadata is not. When you lose the cache files (for example by switching between any of the below-mentioned ways to run the server) all your nodes will have to be re-interviewed again before they can be properly controlled. You can speed up this process by manually waking up your battery-powered devices. Most of the time this is a press on the button on those devices (see their manual). It is not needed to exclude/re-include devices from the mesh. Just be patient and the devices will appear.
-- The Z-Wave JS Server installed and running in your network.
-- We provide an official add-on which you can find in the Supervisor's add-on store.
-- Not running the Supervisor? The [Z-Wave JS 2 MQTT project](https://zwave-js.github.io/zwavejs2mqtt/#/getting-started/quick-start) also includes the Z-Wave JS Server (you can enable it in the settings) and they provide a Docker image.
-
-### Hardware requirements
-
-- [Supported Z-Wave dongle](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules). The Z-Wave controller dongle should be connected to the same host as where the Z-Wave JS server is running.
+
+Advanced users: Make sure that the server started successfully by inspecting the logs. Give the Z-Wave controller some time to start.
+
## Configuration
-This integration can be configured using the integrations in the
-Home Assistant frontend.
-
-Menu: **Configuration** -> **Integrations**.
-
-Click on the `+` sign to add an integration and click on **Z-Wave JS**.
-After completing the configuration flow, the Z-Wave JS integration will be
-available.
-
-### Secure network key
-
-The secure network key is set in the settings for zwave-js-server and
-not in the integration configuration.
-
-## Current Limitations
-
-As this integration is still in the early stages there are some important limitations to be aware of.
-
-- Garage door controllers (Barrier Operator CC) are not currently supported.
-- Configuration of Z-Wave nodes and/or configuration with the Home Assistant UI is currently not yet implemented. You will need to use another tool, such as [zwavejs2mqtt](https://github.com/zwave-js/zwavejs2mqtt), to manage device configuration.
-- Polling is currently not supported but may be added in a later release.
-- Support for setting configuration parameters through service calls is currently not supported but may be added in a later release.
-- There currently is no migration path from any of the other Z-Wave implementations in Home Assistant. Your Z-Wave network is however stored on your stick so migrating will only require you to redo your device and entity naming.
+At this time the configuration options for this new Z-Wave integration are still limited (but will be extended over time). Basic features like adding a new node or removing a node are available. You can configure the Z-Wave network within Home Assistant from the Integrations configuration page. Just click "configure" on the Z-Wave JS card.
+Menu: **Configuration** -> **Integrations** -> **Z-Wave JS** -> **Configure**
## Services
@@ -95,15 +71,12 @@ Valid code slots are between 1-254.
## Events
-### Event `zwave_js_event`
+Events are fired when you press a button on a remote (aka Central Scene support) or when a stateless value is being signalled by a device. You can test what events come in using the event developer tools in Home Assistant and subscribe to `zwave_js_event`. Once you know what the event data looks like, you can use this to create automations.
-This event is fired whenever a [notification](https://zwave-js.github.io/node-zwave-js/#/api/node?id=quotnotificationquot) or [value notification](https://zwave-js.github.io/node-zwave-js/#/api/node?id=quotvalue-notificationquot) event is received.
+### Node events (Notification)
-#### Notifications
+These are events fired by the device using the notification command class. The `parameters` attribute in the example below is optional, and when it is included, the keys in the attribute will vary depending on the event.
-Notifications are events sent using the Notification command class. The `parameters` attribute in the example below is optional, and when it is included, the keys in the attribute will vary depending on the event.
-
-Notification exapmle:
```json
{
"type": "notification",
@@ -116,11 +89,12 @@ Notification exapmle:
}
```
-#### Value Notifications
+## Scene events (Value Notification)
-Value Notifications are used for stateless values, like `Central Scenes`.
+Value Notifications are used for stateless values, like `Central Scenes` and `Scene Activation`.
Value Notification example:
+
```json
{
"type": "value_notification",
@@ -138,11 +112,239 @@ Value Notification example:
}
```
+## Current Limitations
+
+As this integration is still in the early stages there are some important limitations to be aware of.
+
+- While support for the most common devices is working, some command classes are not yet (fully) implemented in Z-Wave JS. You can track the status [here](https://github.com/zwave-js/node-zwave-js/issues/6). For example the `Barrier Operator CommandClass` (in plain English: garage door controllers) are not added yet (but [almost finished](https://github.com/zwave-js/node-zwave-js/pull/1337)!).
+- Configuration of Z-Wave nodes and/or configuration with the Home Assistant UI is currently not yet implemented. You will need to use another tool, such as [zwavejs2mqtt](https://github.com/zwave-js/zwavejs2mqtt), to manage device configuration.
+- Polling is currently not supported in the integration but will be added soon as a service.
+- Support for setting configuration parameters through service calls is currently not supported but may be added in a later release.
+- There currently is no migration path available from any of the other Z-Wave implementations in Home Assistant. Your Z-Wave network is however stored on your stick so migrating will only require you to redo your device and entity naming.
+
+You can keep track of the Roadmap for the Z-Wave JS integration [here](https://github.com/home-assistant-libs/zwave-js-server-python/issues/56).
+
+## Migrating from previous Z-Wave implementations
+
+If you are currently running on the [`zwave`](/integrations/zwave/) or [`ozw`](/integrations/ozw/) Z-Wave integration and it works fine, there is **no need to switch over at this time** to Z-Wave JS. It is important to know is that most development focus currently goes to Z-Wave JS. The previous implementations are still provided as-is. They will **NOT be removed** without proper notice but in time there *might* come technical dependencies that render one or both of those integrations unusable.
+
+If you're new to Home Assistant, use Z-Wave JS.
+
+The `zwave` integration has been marked as deprecated and will no longer receive any updates like new device files. The `ozw` integration will receive new device files if they are provided by upstream.
+
+It is perfectly doable to switch over from one of the above mentioned previous integrations to the new Z-Wave JS integration. The good news is that your entire Z-Wave network is **stored on your stick** so you will not have to run through your house to recreate your network. That said, we currently do not provide a full-fledged, worry-free, click-a-button, migration from old to new. We're exploring options to provide this in the future. This means that if you want to switch over now, *you* will be the migration wizard.
+
+### In a nutshell this is what the migration path looks like
+
+1) Make a **backup** of your Home Assistant configuration. If you're running the supervisor this is very easy to do by creating a snapshot. You should do this so you'll be able to quickly revert if you may run into unexpected problems.
+
+ Write down/copy your Z-Wave network key somewhere, you are going to need it later.
+
+ Make a list of what node ID belongs to each device. Your network (Nodes and their config etc) is stored on the stick but the names you gave your devices and entities are not. This step is optional but will save you a lot of time later.
+
+2) Remove the Z-Wave integration from Home Assistant: Configuration --> Integrations --> Z-Wave (or OpenZWave) --> Press the three dots and click Remove.
+
+3) If you were running the OpenZWave beta, make sure to stop (or even remove) the OpenZWave add-on, also make sure it doesn't start automatically at startup.
+
+4) Restart your Home Assistant host. This step is important to make sure that your Z-Wave stick is released by the operating system.
+
+5) Install the Z-Wave JS Server of your choice. If you run the supervisor and you'd like to run the standard add-on, you can skip this step if you want. The add-on is installed automatically for you when you choose so in the integration set-up. Remember to fill in the network key you've saved before.
+
+6) Set up the Z-Wave JS integration and connect it to the server. You should see your nodes being detected by Home Assistant. Carefully watch if the status of the node is "ready". This means it's been fully interviewed (and those details cached) by the Z-Wave JS driver. Battery-powered nodes will only be interviewed when they wake up (at scheduled intervals) which can take from a few hours to a few days. To speed that up, you might want to consider waking the device up once. The manual of your device will tell you how to do a manual wake.
+
+7) Once a node hits the ready state, the entities will be created (so not before). Only at this point, is it safe to rename the device (and so its entities). You will thank yourself at this point for having that list noted down of nodes and their names. This is actually the only real hard part of the migration as you will need to name all your devices again.
+
+8) Enjoy your super fast up-to-date Z-Wave network in Home Assistant with support for all modern devices!
+
+#### Need more help with your migration to Z-Wave JS?
+
+There are a few topics created on the forums that might be of your interest:
+
+- [OpenZwave (beta) -> Z-Wave JS Official add-on](https://community.home-assistant.io/t/switching-from-openzwave-beta-to-zwave-js/276723)
+
+- [OpenZwave (beta) -> ZwaveJS2MQTT](https://community.home-assistant.io/t/switching-from-openzwave-beta-to-zwavejs2mqtt/276724)
+
+- [Z-Wave legacy (1.4) -> Z-Wave JS Official add-on](https://community.home-assistant.io/t/switching-from-zwave-1-4-to-zwave-js/276718/2)
+
+- [Z-Wave legacy (1.4) -> ZwaveJS2MQTT](https://community.home-assistant.io/t/switching-from-zwave-1-4-to-zwavejs2mqtt/276721)
+
+You can also visit the `#zwave` channel on [our discord](/join-chat/).
+
+## Advanced installation instructions
+
+The above instructions won't work if you are using Home Assistant Container, Home Assistant Core, or you don't want to use the built-in Z-Wave JS Server add-on. Below you'll find the more detailed set-up instructions that covers all use cases.
+
+### Requirements
+
+Controlling your Z-Wave network using the Z-Wave JS integration has the following requirements:
+
+1. Run [Z-Wave JS Server](https://github.com/zwave-js/zwave-js-server). This application provides the connection between your Z-Wave USB stick and Home Assistant. This server runs separately from Home Assistant so your Z-Wave mesh will keep running if you restart or stop Home Assistant. The Home Assistant Z-Wave JS integration connects to this server via a websocket connection. You need to run this Z-Wave server before you can use the integration.
+
+2. [Supported Z-Wave dongle](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules). The Z-Wave controller dongle should be connected to the same host as where the Z-Wave JS server is running. In the configuration for the Z-Wave server you need to provide the path to this stick. It's recommended to use the `/dev/serial-by-id/yourdevice` version of the path to your stick, to make sure the path doesn't change over reboots. The most common known path is `/dev/serial/by-id/usb-0658_0200-if00`.
+
+3. A **network key**. This key is used in order to connect securely to compatible devices. The network key consists of 32 hexadecimal characters, for example `2232666D100F795E5BB17F0A1BB7A146` (do not use this one, pick a random one). Without a network key security enabled devices cannot be added securely and will not function correctly. You must provide this network key in the configuration part of the Z-Wave JS Server. For new installations, a unique default key will be auto generated for you. TIP: You could use a site like random.org to create your own random network key. Make sure that you keep a backup of this key in a safe place. You will need to enter the same key to be able to access the securely paired devices.
+
+4. The Z-Wave JS integration in Home Assistant. This integration connects to the Z-Wave JS Server to retrieve the info from your Z-Wave network and turns it into Home Assistant devices and entities.
+
+### Running the Z-Wave JS Server
+
+As stated in the above requirements, you need to run the Z-Wave JS Server somewhere in your network. There are multiple ways to run this server, we'll explain the most common ways below:
+
+#### 1. The official Z-Wave JS add-on, available from the add-on store
+
+_This option is only available for Home Assistant OS (the recommended installation type) and Home Assistant Supervised installations._
+
+This add-on runs the Z-Wave JS server. It can be automatically installed and configured by Home Assistant as part of setting up the integration. You can also set it up manually.
+
+The Z-Wave network can be configured via the built-in Z-Wave JS control panel in Home Assistant.
+
+#### 2. The Z-Wave JS to MQTT add-on installed available from the community add-on store
+
+_This option is only available for Home Assistant OS (the recommended installation type) and Home Assistant Supervised installations._
+
+This add-on includes the Z-Wave JS Server as part of the Z-Wave JS 2 MQTT application. Despite the name, MQTT is not required to run this add-on.
+
+The Z-Wave network can be configured via the built-in Z-Wave JS control panel in Home Assistant and via the Z-Wave JS control panel built into Z-Wave JS 2 MQTT.
+
+Despite what the name suggests, you can actually run this add-on without MQTT enabled. In that case, it will provide you with a full-fledged, attractive and feature-complete UI to manage your Z-Wave nodes and settings.
+
+
+#### 3. The Z-Wave JS to MQTT Docker container
+
+This is the recommended approach if you're running Home Assistant Container. See the [zwavejs2mqtt documentation](https://zwave-js.github.io/zwavejs2mqtt/#/getting-started/quick-start) for instructions.
+
+After installing the Docker image, make sure you enable the Z-Wave JS Server in the configuration.
+
+#### 4. Run the Z-Wave server yourself
+
+This is considered a very advanced use case. In this case you run the Z-Wave JS Server or zwavejs2mqtt NodeJS application directly. Installation and maintaining this is out of scope for this document. See the [Z-Wave JS server](https://github.com/zwave-js/zwave-js-server) or [zwavejs2mqtt](https://github.com/zwave-js/zwavejs2mqtt) GitHub repository for information.
+
+### Installing and configuring the Z-Wave JS integration in Home Assistant
+
+Once you have the Z-Wave server up and running, it's time to configure the integration in Home Assistant. This integration can be configured using the integrations in the Home Assistant frontend:
+
+1. Click on the `+` sign to add an integration and click on **Z-Wave JS**.
+
+2. If you're running full Home Assistant with supervisor, you will be presented with a dialog that asks if you want to use the Z-Wave JS Supervisor add-on. Check the box if you prefer this option. If you run the server yourself, or prefer the alternative zwavejs2mqtt addon, uncheck this box. After completing the configuration flow, the Z-Wave JS integration will be
+available.
+
+3. If you're not running the supervisor or you've unchecked the above mentioned box, you will be asked to enter a websocket URL (defaults to ws://localhost:3000). It is very important that you fill in the correct (docker) IP/hostname here. For example for the Z-Wave JS to MQTT add-on this is `ws://a0d7b954-zwavejs2mqtt:3000`.
+
+## Frequently Asked Questions
+
+### What Z-Wave devices are currently supported?
+
+See the [Z-Wave JS device database](https://devices.zwave-js.io/).
+
+### Can I switch between the Official Z-Wave JS add-on and Z-Wave JS to MQTT?
+
+You can, but you cannot run them at the same time. Only one of them can be active at the same time.
+
+When you switch add-ons, re-add the Z-Wave integration to Home Assistant with the new/updated WebSocket URL. There will be a popup raised that this Z-Wave network is already configured but "under the hood" the WebSocket URL is adjusted.
+
+### I do not see any entities created for my device in Home Assistant
+
+Entities will be created only after the node hits the ready state (interview is completed). Also, note that some devices (like button remotes) do not create any entities but will only provide events when a button is pressed. See the events section on how to handle those events in your automations. If you are certain that your device should have entities and you do not see them (even after a restart of Home Assistant Core), that will be the time to create an issue about your problem on the GitHub issue tracker, see below section of troubleshooting issues.
+
+### Is there a way to easily export a dump of all my current Z-Wave nodes before I migrate?
+
+You can run the script below in the Developer Tools to get a full oversight of your nodes and their entities.
+
+{% raw %}
+
+```yaml
+{%- for node, zstates in states | selectattr('attributes.node_id', 'in', range(1000)) | groupby('attributes.node_id') %}
+
+{%- for s in zstates %}
+Node {{ node }};{{ s.name }};{{ s.entity_id }}{% endfor %}
+
+{%- endfor %}
+```
+
+{% endraw %}
+
+## How can I add (include) a new device to my Z-Wave network?
+
+1. In Home Assistant: open Configuration -> Integrations -> Z-Wave JS -> Configure.
+2. Press `Add node`.
+3. Press `Start Inclusion`. The Z-Wave controller is now in inclusion mode and will not respond to other commands.
+4. Put the device you want to add in inclusion mode. Refer to its manual how this is done.
+5. The UI should confirm that the node was added and it will be immediately visible in Home Assistant. After a short while (seconds to minutes) the entities should also be created.
+6. If the controller fails to add/find your device, cancel the inclusion process (to unblock your network again). In some cases it might help to first remove a node (exclusion) before you add it, even when the device has not been added to this Z-Wave network yet. Another approach would be to factory reset the device. Info about that is in the manual of your device.
+
+
+While adding devices, you have the option to use `secure inclusion`, this means that the traffic between the controller and the device will be encrypted. This adds additional overhead to the Z-Wave network so use this option with care. As a general rule of thumb it is advised to only securely include devices that actually NEED this kind of protection. A good example is a Z-Wave door lock.
+
+
+## How can I remove (exclude) a device from my Z-Wave network?
+
+1. In Home Assistant: open Configuration -> Integrations -> Z-Wave JS -> Configure.
+2. Press `Remove node`.
+3. Press `Start Exclusion`. The Z-Wave controller is now in exclusion mode and will not respond to other commands.
+4. Put the device you want to remove in exclusion mode. Refer to its manual how this is done.
+5. The UI should confirm that the node was removed and the device and entities will be removed from Home Assistant.
+
+### Where do I need to enter the network key?
+
+- You enter the network key during integration setup if you do not have the add-on installed.
+- Official Z-Wave JS add-on: In the add-on configuration, directly in the supervisor.
+- Z-Wave JS 2 MQTT: In the web UI, go to Settings -> Z-Wave -> Network Key.
+
+### How can I use my OZW network key in zwavejs2mqtt?
+
+You can use your existing network key in zwavejs2mqtt but you need to slightly adjust it.
+The OZW looks like this: `0x01, 0x02, 0x03 etc.` while the network key format accepted in zwavejs2mqtt looks like this `0102030405 etc.`. You can simply edit your existing key and remove the `"0x"` part and the `", "` part so it becomes one large string of numbers.
+
+### What's the benefit of using Z-Wave JS to MQTT over the official Add-On?
+
+The official add-on provides the Z-Wave Server in it's bare minimum variant, just enough to serve the Home Assistant integration.
+The Z-Wave JS to MQTT project includes the Z-Wave JS Server for convenience but also provides a Z-Wave Control panel and the ability (hence its name) to serve your Z-Wave network to MQTT. You can leave the MQTT Gateway disabled and only use the Control panel but you can even have the MQTT features enabled at the same time. For example to interact with Z-Wave from other devices, while the Home Assistant integration still works (as long as you keep the WS Server enabled in zwavejs2mqtt).
+
+### Z-Wave JS to MQTT seems to provide Home Assistant integration on its own too, now I'm confused
+
+Correct, the Z-Wave (JS) to MQTT project existed before Home Assistant even had plans to move to the Z-Wave JS Driver.
+The Home Assistant integration that exists in zwavejs2mqtt is based on MQTT discovery.
+The official Z-Wave JS integration is not based on MQTT and is talking directly to the Z-Wave JS Driver (using the WS Server). This gives a better experience.
+
+### Can I run Z-Wave JS to MQTT only for the control panel and nothing else?
+
+Sure, in the settings of zwavejs2mqtt, make sure to enable "WS Server" and disable "Gateway".
+
+### My device does not automatically update its status in HA if I control it manually
+
+Your device might not send send automatic status updates to the controller. While the best advice would be to update to recent Z-Wave Plus devices, there is a workaround with active polling (request the status) at some interval. See the section below for more info about this.
+
+### What about polling of devices?
+
+Some legacy devices don't report all their values automatically and require polling to get updated values when controlled manually. Z-Wave JS does not automatically poll devices on a regular basis without user interaction. Polling can quickly lead to network congestion and should be used very sparingly and only where necessary.
+
+- In an upcoming release of Home Assistant we will provide a service to allow you to manually poll a value, for example from an automation that only polls a device when there is motion in that same room. If you **really** need polling, you can enable this in zwavejs2mqtt but not in the official add-on.
+
+- zwavejs2mqtt allows you to configure scheduled polling on a per-value basis, which you can use to keep certain values updated. It also allows you to poll individual values on-demand from your automations, which should be preferred over blindly polling all the time if possible.
+
+
+Polling is considered bad practice and should only be used as a last resort when you use it with care and accept the negative impact on your network. Z-Wave is a very low speed network and poll requests can easily flood your network and slow down your commands.
+
+
+### My device is recognized as Unknown Manufacturer and/or some of its functionalities do not work in Z-Wave JS
+
+When your device is not yet fully interviewed, this info will not yet be present. So make sure your device is interviewed at least once. Is the state of your device reported as ready and you still see Unknown Manufacturer, read on.
+
+Z-Wave JS keeps a database of all devices it supports, including any special treatments they need. These are called the device configuration files and they are contributed mainly by the community. Is your device not fully supported, consider [contributing the device configuration file](https://zwave-js.github.io/node-zwave-js/#/development/config-files?id=contributing-configuration-files).
+
+### I get a lot of sensor entities for my device that I'm probably never going to use
+
+The integration will add as many useable entities for you as possible from the information it retrieves from your Z-Wave devices. Entities that you don't want/like, can be disabled within the Home Assistant interface.
+
+### I renamed my devices in Z-Wave JS 2 MQTT but those names are not visible in Home Assistant
+
+Correct. Only a few devices actually support having their name stored in the hardware. In case your device supports it, you can rename it from the control panel and it will be stored on your device (and Home Assistant will prefer that name). Most devices don't support that feature. Zwavejs2mqtt changes are only available within the application and not stored/synced with the actual Z-Wave network and thus not populated to Home Assistant.
+
## Troubleshooting Issues
### Get a dump of the current network state
-When trying to determine why something isn't working as you expect, or when reporting an issue with the integration, it is helpful to know what Z-Wave JS sees as the current state of your Z-Wave network. To get a dump of your current network state, follow the menu:
+When trying to determine why something isn't working as you expect, or when reporting an issue with the integration, it is helpful to know what Z-Wave JS sees as the current state of your Z-Wave network. To get a dump of your current network state, follow the menu:
**Configuration** -> **Integrations** -> **Z-Wave JS** -> **Configure** -> **Download a dump of your network to help diagnose issues**
diff --git a/source/_lovelace/entities.markdown b/source/_lovelace/entities.markdown
index 18fcf51e0bf..c71d7246bf1 100644
--- a/source/_lovelace/entities.markdown
+++ b/source/_lovelace/entities.markdown
@@ -367,7 +367,7 @@ type: entities
title: Entities card sample
show_header_toggle: true
header:
- image: 'https://www.home-assistant.io/images/lovelace/header-footer/balloons-header.png'
+ image: "https://www.home-assistant.io/images/lovelace/header-footer/balloons-header.png"
type: picture
entities:
- entity: alarm_control_panel.alarm
@@ -427,7 +427,7 @@ entities:
entity: sun.sun
attribute: elevation
name: Sun elevation
- prefix: '~'
+ prefix: "~"
suffix: Units
- type: conditional
conditions:
diff --git a/source/_lovelace/entity.markdown b/source/_lovelace/entity.markdown
index 528e24de78a..132347a1f32 100644
--- a/source/_lovelace/entity.markdown
+++ b/source/_lovelace/entity.markdown
@@ -60,11 +60,11 @@ Alternatively, the card can be configured using YAML:
- type: entity
entity: light.bedroom
attribute: brightness
- unit: '%'
+ unit: "%"
- type: entity
entity: vacuum.downstairs
name: Vacuum
- icon: 'mdi:battery'
+ icon: "mdi:battery"
attribute: battery_level
- unit: '%'
+ unit: "%"
```
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 aefaddf13c2..0aeb42fc900 100644
--- a/source/_posts/2015-09-13-home-assistant-meets-ifttt.markdown
+++ b/source/_posts/2015-09-13-home-assistant-meets-ifttt.markdown
@@ -56,7 +56,7 @@ automation:
trigger:
platform: mqtt
mqtt_topic: home/alarm/fire
- mqtt_payload: 'on'
+ mqtt_payload: "on"
action:
service: ifttt.trigger
diff --git a/source/_posts/2015-11-16-zwave-switches-lights-and-honeywell-thermostats-now-supported.markdown b/source/_posts/2015-11-16-zwave-switches-lights-and-honeywell-thermostats-now-supported.markdown
index cf40d59d40b..44dddf474ae 100644
--- a/source/_posts/2015-11-16-zwave-switches-lights-and-honeywell-thermostats-now-supported.markdown
+++ b/source/_posts/2015-11-16-zwave-switches-lights-and-honeywell-thermostats-now-supported.markdown
@@ -14,7 +14,7 @@ categories: Release-Notes
homeassistant:
customize:
switch.ac:
- icon: 'mdi:air-conditioner'
+ icon: "mdi:air-conditioner"
```
#### Breaking changes
diff --git a/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown b/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown
index 38be3dbc1a0..8788212344d 100644
--- a/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown
+++ b/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown
@@ -64,12 +64,12 @@ automation:
trigger:
- platform: state
entity_id: device_tracker.beacon_car
- from: 'not_home'
- to: 'home'
+ from: "not_home"
+ to: "home"
condition:
- condition: state
entity_id: switch.gate
- state: 'off'
+ state: "off"
action:
service: switch.turn_on
entity_id: switch.gate
@@ -97,7 +97,7 @@ automation:
condition:
- condition: state
entity_id: script.send_key_alert
- state: 'on'
+ state: "on"
action:
service: script.turn_off
entity_id: script.send_key_alert
@@ -111,8 +111,8 @@ script:
minutes: 2
- service: notify.notify
data:
- message: 'You forgot your keys'
- target: 'device/gregs_iphone'
+ message: "You forgot your keys"
+ target: "device/gregs_iphone"
```
diff --git a/source/_posts/2021-02-03-release-20212.markdown b/source/_posts/2021-02-03-release-20212.markdown
index bdb67a3ceec..fa3c6cfc3b1 100644
--- a/source/_posts/2021-02-03-release-20212.markdown
+++ b/source/_posts/2021-02-03-release-20212.markdown
@@ -49,6 +49,8 @@ Enjoy the release!
- [New Integrations](#new-integrations)
- [New Platforms](#new-platforms)
- [Integrations now available to set up from the UI](#integrations-now-available-to-set-up-from-the-ui)
+- [Release 2021.2.1 - February 5](#release-202121---february-5)
+- [Release 2021.2.2 - February 9](#release-202122---february-9)
- [If you need help...](#if-you-need-help)
- [Breaking Changes](#breaking-changes)
- [Farewell to the following](#farewell-to-the-following)
@@ -83,7 +85,7 @@ supported and tested.
This release brings you the [Z-Wave JS integration](/integrations/zwave_js)!
A brand new integration for Z-Wave in Home Assistant, full-blown, created
-in a just month by a bunch of awesome people!
+in just a month by a bunch of awesome people!
More and more people were concerned about the future of Z-Wave with
Home Assistant; meanwhile the [Z-Wave JS][zwavejs] project was rapidly growing
@@ -96,8 +98,8 @@ JS integration uses a WebSocket connection to a Z-Wave JS server.
This means, in order to use this new integration, you'll need to run the
Z-Wave JS server that sits in between your Z-Wave USB stick and Home Assistant.
-There are multiple options available on running the Z-Wave JS server,
-via Docker, manually, but there is also an Home Assistant add-on available.
+There are multiple options available for running the Z-Wave JS server,
+via Docker or manually, and there is also a Home Assistant add-on available.
If you run an installation with a Supervisor, the add-on will even be
set up automatically for you.
@@ -177,7 +179,7 @@ Over a year ago, Home Assistant started working on the
OZW daemon, using MQTT as a transport. This project was promising and something
we put a lot of time and effort in.
-Unfortunately, the OpenZWave project itself became a bit staler as most
+Unfortunately, the OpenZWave project itself became a bit stale as most
of the upstream development is done by a single person:
Justin Hammond (Fishwaldo).
@@ -320,7 +322,7 @@ The following integration got support for a new platform:
- [WiLight][wilight docs] now supports fans, added by [@leofig-rj]
- [Hyperion][hyperion docs] now has all kinds of advanced control switches,
added by [@dermotduffy]
-
+
## Integrations now available to set up from the UI
The following integrations are now available via the Home Assistant UI:
@@ -328,6 +330,120 @@ The following integrations are now available via the Home Assistant UI:
- [Somfy MyLink][somfy_mylink docs], done by [@bdraco]
- [Foscam][foscam docs], done by [@skgsergio]
+## Release 2021.2.1 - February 5
+
+- Convert ozw climate values to correct units ([@Chrisgozd] - [#45369]) ([ozw docs])
+- Add support for iCloud 2FA ([@nzapponi] - [#45818]) ([icloud docs])
+- Don't log missing mpd artwork inappropriately ([@mweinelt] - [#45908]) ([mpd docs])
+- Fix entities device_info property in Harmony integration ([@bieniu] - [#45964]) ([harmony docs])
+- Fix Local Media in Media Browser ([@DeadEnded] - [#45987]) ([media_source docs])
+- Bump zwave-js-server-python to 0.17.1 ([@MartinHjelmare] - [#45988]) ([zwave_js docs])
+- Bump awesomeversion from 21.2.0 to 21.2.2 ([@ludeeus] - [#45993])
+- Do not listen for dhcp packets if the filter cannot be setup ([@bdraco] - [#46006]) ([dhcp docs])
+- Bump zwave-js-server-python to 0.17.2 ([@MartinHjelmare] - [#46010]) ([zwave_js docs])
+- dhcp does not need promisc mode. Disable it in scapy ([@bdraco] - [#46018]) ([dhcp docs])
+- Revert aioshelly ([@balloob] - [#46038]) ([shelly docs])
+- Prevent fritzbox callmonitor phonebook_id 0 from being ignored ([@obelix05] - [#45990]) ([fritzbox_callmonitor docs])
+- Upgrade holidays to 0.10.5.2 ([@fabaff] - [#46013]) ([workday docs])
+
+[#45369]: https://github.com/home-assistant/core/pull/45369
+[#45818]: https://github.com/home-assistant/core/pull/45818
+[#45908]: https://github.com/home-assistant/core/pull/45908
+[#45964]: https://github.com/home-assistant/core/pull/45964
+[#45987]: https://github.com/home-assistant/core/pull/45987
+[#45988]: https://github.com/home-assistant/core/pull/45988
+[#45990]: https://github.com/home-assistant/core/pull/45990
+[#45993]: https://github.com/home-assistant/core/pull/45993
+[#46006]: https://github.com/home-assistant/core/pull/46006
+[#46010]: https://github.com/home-assistant/core/pull/46010
+[#46013]: https://github.com/home-assistant/core/pull/46013
+[#46018]: https://github.com/home-assistant/core/pull/46018
+[#46038]: https://github.com/home-assistant/core/pull/46038
+[@Chrisgozd]: https://github.com/Chrisgozd
+[@DeadEnded]: https://github.com/DeadEnded
+[@MartinHjelmare]: https://github.com/MartinHjelmare
+[@balloob]: https://github.com/balloob
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@fabaff]: https://github.com/fabaff
+[@ludeeus]: https://github.com/ludeeus
+[@mweinelt]: https://github.com/mweinelt
+[@nzapponi]: https://github.com/nzapponi
+[@obelix05]: https://github.com/obelix05
+[dhcp docs]: /integrations/dhcp/
+[fritzbox_callmonitor docs]: /integrations/fritzbox_callmonitor/
+[harmony docs]: /integrations/harmony/
+[icloud docs]: /integrations/icloud/
+[media_source docs]: /integrations/media_source/
+[mpd docs]: /integrations/mpd/
+[ozw docs]: /integrations/ozw/
+[shelly docs]: /integrations/shelly/
+[workday docs]: /integrations/workday/
+[zwave_js docs]: /integrations/zwave_js/
+
+## Release 2021.2.2 - February 9
+
+- Fix zwave_js cover control for Up/Down and Open/Close ([@natekspencer] - [#45965]) ([zwave_js docs])
+- Fix foscam to work again with non-admin accounts and make RTSP port configurable again ([@skgsergio] - [#45975]) ([foscam docs])
+- Fix downloader path validation on subdir ([@gadgetchnnel] - [#46061]) ([downloader docs])
+- Fix deprecated method isAlive() ([@cdce8p] - [#46062]) ([zwave docs])
+- Improve deCONZ logbook to be more robust in different situations ([@Kane610] - [#46063]) ([deconz docs])
+- Fix zwave_js Notification CC sensors and binary sensors ([@raman325] - [#46072]) ([zwave_js docs])
+- Fix incorrect current temperature for homekit water heaters ([@bdraco] - [#46076]) ([homekit docs])
+- Use async_update_entry rather than updating config_entry.data directly in Axis ([@Kane610] - [#46078]) ([axis docs])
+- Handle missing value in all platforms of zwave_js ([@marcelveldt] - [#46081]) ([zwave_js docs])
+- update discovery scheme for zwave_js light platform ([@marcelveldt] - [#46082]) ([zwave_js docs])
+- Update zwave_js discovery scheme for boolean sensors in the Alarm CC ([@marcelveldt] - [#46085]) ([zwave_js docs])
+- Fix Google translate TTS by bumping gTTS from 2.2.1 to 2.2.2 ([@hmmbob] - [#46110]) ([google_translate docs])
+- Revert "Convert ozw climate values to correct units (#45369)" ([@dshokouhi] - [#46163]) ([ozw docs])
+- Enable KNX auto_reconnect for auto-discovered connections ([@farmio] - [#46178]) ([knx docs])
+- Ensure creating an index that already exists is forgiving for postgresql ([@bdraco] - [#46185]) ([recorder docs])
+- Fix Tado Power and Link binary sensors ([@Noltari] - [#46235]) ([tado docs])
+- Handle empty mylink response at startup ([@bdraco] - [#46241]) ([somfy_mylink docs])
+
+[#45965]: https://github.com/home-assistant/core/pull/45965
+[#45975]: https://github.com/home-assistant/core/pull/45975
+[#46061]: https://github.com/home-assistant/core/pull/46061
+[#46062]: https://github.com/home-assistant/core/pull/46062
+[#46063]: https://github.com/home-assistant/core/pull/46063
+[#46072]: https://github.com/home-assistant/core/pull/46072
+[#46076]: https://github.com/home-assistant/core/pull/46076
+[#46078]: https://github.com/home-assistant/core/pull/46078
+[#46081]: https://github.com/home-assistant/core/pull/46081
+[#46082]: https://github.com/home-assistant/core/pull/46082
+[#46085]: https://github.com/home-assistant/core/pull/46085
+[#46110]: https://github.com/home-assistant/core/pull/46110
+[#46163]: https://github.com/home-assistant/core/pull/46163
+[#46178]: https://github.com/home-assistant/core/pull/46178
+[#46185]: https://github.com/home-assistant/core/pull/46185
+[#46235]: https://github.com/home-assistant/core/pull/46235
+[#46241]: https://github.com/home-assistant/core/pull/46241
+[@Kane610]: https://github.com/Kane610
+[@Noltari]: https://github.com/Noltari
+[@bdraco]: https://github.com/bdraco
+[@cdce8p]: https://github.com/cdce8p
+[@dshokouhi]: https://github.com/dshokouhi
+[@farmio]: https://github.com/farmio
+[@gadgetchnnel]: https://github.com/gadgetchnnel
+[@hmmbob]: https://github.com/hmmbob
+[@marcelveldt]: https://github.com/marcelveldt
+[@natekspencer]: https://github.com/natekspencer
+[@raman325]: https://github.com/raman325
+[@skgsergio]: https://github.com/skgsergio
+[axis docs]: /integrations/axis/
+[deconz docs]: /integrations/deconz/
+[downloader docs]: /integrations/downloader/
+[foscam docs]: /integrations/foscam/
+[google_translate docs]: /integrations/google_translate/
+[homekit docs]: /integrations/homekit/
+[knx docs]: /integrations/knx/
+[ozw docs]: /integrations/ozw/
+[recorder docs]: /integrations/recorder/
+[somfy_mylink docs]: /integrations/somfy_mylink/
+[tado docs]: /integrations/tado/
+[zwave docs]: /integrations/zwave/
+[zwave_js docs]: /integrations/zwave_js/
+
## If you need help...
...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e).
@@ -464,7 +580,7 @@ to make sure all RainMachine service calls have those.
The current state of the ecobee integration always behaves as if the
-selected hold duration is **Until next scheduled activity**.
+selected hold duration is **Until next scheduled activity**.
With this change the following settings are now respected:
@@ -2008,4 +2124,4 @@ The following integrations have been removed:
[zeroconf docs]: /integrations/zeroconf/
[zha docs]: /integrations/zha/
[zwave docs]: /integrations/zwave/
-[zwave_js docs]: /integrations/zwave_js/
\ No newline at end of file
+[zwave_js docs]: /integrations/zwave_js/
diff --git a/source/hassio/installation.markdown b/source/hassio/installation.markdown
index 60cdfa6ecb3..aaf7ba01e3c 100644
--- a/source/hassio/installation.markdown
+++ b/source/hassio/installation.markdown
@@ -27,10 +27,10 @@ The following will take you through the steps required to install Home Assistant
- **For the device images:** Flash the downloaded image to an SD card using [balenaEtcher][balenaEtcher]. If using a Pi, we recommend at least a 32 GB SD card to avoid running out of space.
- **For the virtual appliance images:** Load the appliance image into your virtual machine software. (Note: You are free to assign as much resources as you wish to the VM, please assign enough based on your add-on needs)
- For VirtualBox create a new virtual machine, select "Other Linux (64Bit), assign it at least 2 GB of memory and "Use an existing virtual hard disk file", select the VDI file from above, afterwards edit the "Settings" of the VM and go "System" then Motherboard and Enable EFI, then "Network" "Adapter 1" Bridged and your adapter.
- - For Hyper-V create a new virtual machine, select "Generation 2", assign it at least 2 GB of memory and select "Connection -> "Your Virtual Switch that is bridged", then "Use an existing virtual hard disk" and select the VHDX file from above, after creation go to "Settings" -> "Security" and deselect "Enable Secure Boot".
- - For KVM create a new virtual machine in `virt-manager`, select "Import existing disk image", provide the path to the QCOW2 image above, choose "Generic Default" for the operating system, assign at least 2 GB memory and 1 vCPU, check the box for "Customize configuration before install" and select your bridge under "Network Selection", then under customization select "Overview" -> "Firmware" -> "UEFI x86_64: ...". If you want mDNS and another multicast to work, you'll need to manually edit the XML to add trustGuestRxFilters='yes' to the interfaces tag. See virsh or virt-manager documentation for how to do that.
- - For Vmware Workstation create a new virtual machine, select "Custom", make it compatible with the default of Workstation and ESX, Choose "I will install the operating system later", select "Linux" -> "Other Linux 5.x or later kernel 64-bit", give it at least 2 GB RAM and 1vCPU, select "Use Bridged Networking" then "Use an existing virtual disk" and select the VMDK file above, after creation of VM go to "Settings" and "Options" then "Advanced" and select "Firmware type" to "UEFI".
- - For Proxmox, create a new virtual machine, and make note of the VM ID. Under "OS", select "Do not use any media". Under "System" select "Advanced" and change "BIOS" to "OVMF (UEFI)", then select a storage location for the EFI disk. Under "Hard Disk", create a default hard disk (we will delete this later). Set your CPU, memory, and network as needed. From the command line (as root on the Proxmox host), download the qcow2 image with `wget` or `curl` and decompress it (`gunzip hassos_ova-4.13.qcow2.gz`). Then, import the disk to your VM, changing the VM ID as needed (`qm importdisk ### hassos_ova-4.13.qcow2 local-lvm --format qcow2`). After you see `Successfully imported disk`, you can remove the qcow2 image (`rm hassos_ova-4.13.qcow2`). Back in the web UI, navigate to your VM, then "Hardware" and locate the default hard disk we created earlier (probably called `disk0`). Click on it, then click "Detach", then click on the disk again and click "Remove" (this should leave you with two disks: the EFI disk and the imported qcow2 disk). Click on the qcow2 disk (probably called `disk2`) and click "Edit" then "Add". Click on the qcow2 disk one last time, then click on "Resize disk" and set your size (Home Assistant will fill up this entire space).
+ - For Hyper-V download the VHDX file and unpack it using 7-Zip. Create a new virtual machine, select "Generation 2", assign it at least 2 GB of memory and select "Connection -> "Your Virtual Switch that is bridged", then "Use an existing virtual hard disk" and select the upacked VHDX file. After creation go to "Settings" -> "Security" and deselect "Enable Secure Boot".
+ - For KVM download the QCOW2 file and unpack it using `unxz`. Create a new virtual machine in `virt-manager`, select "Import existing disk image", provide the path to the unpacked QCOW2 image, choose "Generic Default" for the operating system, assign at least 2 GB memory and 1 vCPU, check the box for "Customize configuration before install" and select your bridge under "Network Selection", then under customization select "Overview" -> "Firmware" -> "UEFI x86_64: ...". If you want mDNS and another multicast to work, you'll need to manually edit the XML to add trustGuestRxFilters='yes' to the interfaces tag. See virsh or virt-manager documentation for how to do that.
+ - For Vmware Workstation download the VMDK file and unpack it using 7-Zip or `unxz`. Create a new virtual machine, select "Custom", make it compatible with the default of Workstation and ESX, Choose "I will install the operating system later", select "Linux" -> "Other Linux 5.x or later kernel 64-bit", give it at least 2 GB RAM and 1vCPU, select "Use Bridged Networking" then "Use an existing virtual disk" and select the unpacked VMDK file, after creation of VM go to "Settings" and "Options" then "Advanced" and select "Firmware type" to "UEFI".
+ - For Proxmox, create a new virtual machine, and make note of the VM ID. Under "OS", select "Do not use any media". Under "System" select "Advanced" and change "BIOS" to "OVMF (UEFI)", then select a storage location for the EFI disk. Under "Hard Disk", create a default hard disk (we will delete this later). Set your CPU, memory, and network as needed. From the command line (as root on the Proxmox host), download the qcow2 image with `wget` or `curl` and decompress it (`unxz hassos_ova-5.10.qcow2.xz`). Then, import the disk to your VM, changing the VM ID as needed (`qm importdisk ### hassos_ova-5.10.qcow2 local-lvm --format qcow2`). After you see `Successfully imported disk`, you can remove the qcow2 image (`rm hassos_ova-5.10.qcow2`). Back in the web UI, navigate to your VM, then "Hardware" and locate the default hard disk we created earlier (probably called `disk0`). Click on it, then click "Detach", then click on the disk again and click "Remove" (this should leave you with two disks: the EFI disk and the imported qcow2 disk). Click on the qcow2 disk (probably called `disk2`) and click "Edit" then "Add". Click on the qcow2 disk one last time, then click on "Resize disk" and set your size (Home Assistant will fill up this entire space).
- For VMware ESXi/vSphere installation use the "E1001" or "E1001E" virtual network adapater. There are confirmed mDNS/Multicast discovery issues when using VMware's "VMXnet3" virtual network adapter.
3. Optional - set up the Wi-Fi or a static IP address. There are two possible places for that: