Merge remote-tracking branch 'origin/current' into next

This commit is contained in:
Paulus Schoutsen 2017-09-23 20:23:59 -07:00
commit 111b08281d
18 changed files with 1097 additions and 280 deletions

View File

@ -139,12 +139,12 @@ social:
# Home Assistant release details
current_major_version: 0
current_minor_version: 53
current_patch_version: 1
date_released: 2017-09-12
current_minor_version: 54
current_patch_version: 0
date_released: 2017-09-23
# Either # or the anchor link to latest release notes in the blog post.
# Must be prefixed with a # and have double quotes around it.
# Major release:
patch_version_notes: "#release-0531---september-11"
patch_version_notes: "#"
# Minor release (Example #release-0431---april-25):

114
plugins/configuration.rb Normal file
View File

@ -0,0 +1,114 @@
module Jekyll
class ConfigurationBlock < Liquid::Block
TYPE_LINKS = {
'action' => '/docs/scripts/',
'device_class' => '/components/%{component}/#device_class',
'template' => '/docs/configuration/templating/',
}
def initialize(tag_name, text, tokens)
super
@component, @platform = text.strip.split('.', 2)
end
def slug(key)
key.downcase.strip.gsub(' ', '-').gsub(/[^\w\-]/, '')
end
def type_class(type)
((type.is_a? Array) ? type.join(' ') : type).downcase
end
def type_link(type, component: nil)
if type.include? ','
type = type.split(',')
end
if type.is_a? Array
return (type.map { |t| type_link(t, component: component) }).join(' | ')
end
type.strip!
if TYPE_LINKS.include? type.downcase
url = TYPE_LINKS[type.downcase] % {component: component}
"[%s](%s)" % [type, url]
else
type
end
end
def required_value(value)
if value === true
"Required"
elsif value === false
"Optional"
else
value.strip.titlecase
end
end
def render_config_vars(vars:, component:, platform:, classes: nil)
result = Array.new
result << "<dl class='#{classes}'>"
result << vars.map do |key, attr|
markup = Array.new
markup << "<dt><a class='title-link' name='#{slug(key)}' href='\##{slug(key)}'></a> #{key}</dt>"
markup << "<dd>"
markup << "<p class='desc'>"
if attr.key? 'type'
markup << "<span class='type'>(<span class='#{type_class(attr['type'])}'>"
markup << "#{type_link(attr['type'], component: component)}</span>)</span>"
end
if attr.key? 'required'
markup << "<span class='required'>(#{required_value(attr['required'])})</span>"
end
if attr.key? 'description'
markup << "<span class='description'>#{attr['description']}</span>"
end
markup << "</p>"
if attr.key? 'default'
markup << "<p class='default'>Default value: #{attr['default']}</p>"
end
markup << "</dd>"
# Check for nested configuration variables
if attr.key? 'keys'
markup << "<dd>"
markup << render_config_vars(
vars: attr['keys'], component: component,
platform: platform, classes: 'nested')
markup << "</dd>"
end
markup
end
result << "</dl>"
result.join
end
def render(context)
if @component.nil? and @platform.nil?
page = context.environments.first['page']
@component, @platform = page['slug'].split('.', 2)
end
contents = super(context)
component = Liquid::Template.parse(@component).render context
platform = Liquid::Template.parse(@platform).render context
vars = SafeYAML.load(contents)
<<~MARKUP
<div class="config-vars">
<h3><a class="title-link" name="configuration-variables" href="#configuration-variables"></a> Configuration Variables</h3>
#{render_config_vars(vars: vars, component: component, platform: platform)}
</div>
MARKUP
end
end
end
Liquid::Template.register_tag('configuration', Jekyll::ConfigurationBlock)

View File

@ -100,7 +100,6 @@ $primary-color: #049cdb;
}
.frontpage {
.material-card {
margin-bottom: 24px;
}
@ -109,7 +108,6 @@ $primary-color: #049cdb;
.release-date {
white-space: nowrap;
}
}
.recent-posts {
@ -202,7 +200,8 @@ h2:hover a.title-link,
h3:hover a.title-link,
h4:hover a.title-link,
h5:hover a.title-link,
h6:hover a.title-link {
h6:hover a.title-link,
dt:hover a.title-link {
position: relative;
&::before {
@ -310,6 +309,13 @@ article.post, article.page, article.listing {
h2 {
font-size: 1.5em;
margin-top: 2em;
// Future re-design
// margin: 1.5em 0 1rem;
//
// border: 0;
// border-top: 1px solid $primary-color;
// padding-top: 1.4rem;
}
h3 {
@ -317,11 +323,17 @@ article.post, article.page, article.listing {
letter-spacing: 0.125rem;
font-size: 1.2rem;
margin-top: 2em;
// Future re-design
// margin: 2em 0 1rem;
}
h4 {
font-size: 1.1rem;
margin-top: 2em;
// Future re-design
// margin: 1.5em 0 1rem;
}
}
@ -431,7 +443,7 @@ ul.sidebar-menu {
}
a code {
color: #049cdb;
color: $primary-color;
}
twitterwidget {
@ -447,3 +459,48 @@ twitterwidget {
max-width: 100%;
overflow: hidden;
}
// Configuration variables
div.config-vars {
// Future re-design
// h3 {
// border: 0;
// border-top: 1px solid $primary-color;
// padding-top: 1.4rem;
// }
dl {
margin-bottom: 1.5em;
&.nested {
border-left: 1px dotted $primary-color;
padding-left: 6px;
}
dt {
font-weight: bold;
}
dd {
margin: 0 0 0.5em 1em;
p.desc {
margin: 0;
span.type,
span.required {
font-style: italic;
&::after {
content: " "
}
}
}
p.default {
font-style: italic;
margin: 0;
}
}
}
}

View File

@ -1,145 +1,191 @@
---
layout: page
title: "Template Binary Sensor"
description: "Instructions how to integrate Template binary sensors into Home Assistant."
description: "Instructions how to integrate Template Binary Sensors into Home Assistant."
date: 2016-02-25 15:00
sidebar: true
comments: false
sharing: true
footer: true
ha_category: Binary Sensor
ha_release: 0.12
ha_iot_class: "Local Push"
logo: home-assistant.png
---
The `template` platform supports sensors which breaks out the `state` and `state_attributes` from other entities. The state of a template binary sensor can only be `on` or `off`.
The `template` platform supports sensors which breaks out the `state` and
`state_attributes` from other entities. The state of a Template Binary Sensor
can only be `on` or `off`.
To enable template binary sensors in your installation, add the following to your `configuration.yaml` file:
To enable Template Binary Sensors in your installation, add the following to
your `configuration.yaml` file:
{% raw %}
```yaml
# Example configuration.yaml entry
binary_sensor:
- platform: template
sensors:
sun_up:
value_template: {% raw %}'{{ states.sun.sun.attributes.elevation > 0}}'{% endraw %}
friendly_name: 'Sun is up'
friendly_name: "Sun is up"
value_template: >-
{{ states.sun.sun.attributes.elevation|float > 0 }}
```
{% endraw %}
Configuration variables:
{% configuration binary_sensor.template %}
sensors:
description: List of your sensors.
required: true
type: map
keys:
friendly_name:
description: Name to use in the frontend.
required: false
type: string
entity_id:
description: Add a list of entity IDs so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update its state.
required: false
type: string, list
device_class:
description: The type/class of the sensor to set the icon in the frontend.
required: false
type: device_class
default: None
value_template:
description: Defines a template to set the state of the sensor.
required: true
type: template
on_delay:
description: The amount of time the template state must be ***met*** before this sensor will switch to `on`.
required: false
type: time
off_delay:
description: The amount of time the template state must be ***not met*** before this sensor will switch to `off`.
required: false
type: time
{% endconfiguration %}
- **sensors** array (*Required*): List of your sensors.
- **friendly_name** (*Optional*): Name to use in the Frontend.
- **device_class** (*Optional*): The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend.
- **value_template** (*Optional*): Defines a [template](/topics/templating/) to extract a value from the payload.
- **entity_id** (*Optional*): Add a list of entity IDs so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update it's state.
- **on_delay** (*Optional*): The amount of time the template state must be met before this sensor will switch to on.
- **off_delay** (*Optional*): The amount of time the template state must be not met before this sensor will switch to off.
## {% linkable_title Considerations %}
If you are using the state of a platform that takes extra time to load, the
Template Binary Sensor may get an `unknown` state during startup. This results
in error messages in your log file until that platform has completed loading.
If you use `is_state()` function in your template, you can avoid this situation.
For example, you would replace
{% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %}
with this equivalent that returns `true`/`false` and never gives an unknown
result:
{% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
## {% linkable_title Examples %}
In this section you find some real life examples of how to use this sensor.
### {% linkable_title Sensor threshold %}
### {% linkable_title Sensor Threshold %}
This example indicates true if a sensor is above a given threshold. Assuming a sensor of `furnace` that provides a current reading for the fan motor, we can determine if the furnace is running by checking that it is over some threshold:
This example indicates true if a sensor is above a given threshold. Assuming a
sensor of `furnace` that provides a current reading for the fan motor, we can
determine if the furnace is running by checking that it is over some threshold:
{% raw %}
```yaml
sensor:
- platform: template
sensors:
furnace_on:
value_template: {% raw %}{{ states.sensor.furnace.state > 2.5 }}{% endraw %}
friendly_name: 'Furnace Running'
friendly_name: "Furnace Running"
device_class: heat
value_template: "{{ states('sensor.furnace')|float > 2.5 }}"
```
{% endraw %}
### {% linkable_title Switch as sensor %}
### {% linkable_title Switch as Sensor %}
Some movement sensors and door/window sensors will appear as a switch. By using a template binary sensor, the switch can be displayed as a binary sensors. The original switch can then be hidden by [customizing.](/getting-started/customizing-devices/)
Some movement sensors and door/window sensors will appear as a switch. By using
a Template Binary Sensor, the switch can be displayed as a binary sensors. The
original switch can then be hidden by
[customizing](/getting-started/customizing-devices/).
{% raw %}
```yaml
binary_sensor:
- platform: template
sensors:
movement:
value_template: {% raw %}"{{ states.switch.movement.state == 'on' }}"{% endraw %}
device_class: motion
value_template: "{{ is_state('switch.movement', 'on') }}"
door:
value_template: {% raw %}"{{ states.switch.door.state == 'on' }}"{% endraw %}
device_class: opening
value_template: "{{ is_state('switch.door', 'on') }}"
```
{% endraw %}
### {% linkable_title Combining multiple sensors, and using entity_id: %}
### {% linkable_title Combining Multiple Sensors, and Using `entity_id` %}
This example combines multiple CO sensors into a single overall
status. When using templates with binary sensors, you need to return
`True` or `False` explicitly. `entity_id` is used to limit which
`true` or `false` explicitly. `entity_id` is used to limit which
sensors are being monitored to update the state, making computing this
sensor far more efficient.
{% raw %}
```yaml
binary_sensor:
- platform: template
sensors:
co:
friendly_name: 'CO'
device_class: 'gas'
value_template: {% raw %}>-
{%- if is_state("sensor.bedroom_co_status", "Ok")
and is_state("sensor.kitchen_co_status", "Ok")
and is_state("sensor.wardrobe_co_status", "Ok") -%}
False
{%- else -%}
True
{%- endif %}{% endraw %}
friendly_name: "CO"
device_class: gas
entity_id:
- sensor.bedroom_co_status
- sensor.kitchen_co_status
- sensor.wardrobe_co_status
value_template: >-
{{ is_state('sensor.bedroom_co_status', 'Ok')
and is_state('sensor.kitchen_co_status', 'Ok')
and is_state('sensor.wardrobe_co_status', 'Ok') }}
```
{% endraw %}
### {% linkable_title Washing Machine Running %}
This example creates a washing machine "load running" sensor by monitoring an energy meter connected to the washer. During the washer's operation, the energy meter will fluctuate wildly, hitting zero frequently even before the load is finished. By utilizing `off_delay`, we can have this sensor only turn off if there has been no washer activity for 5 minutes.
This example creates a washing machine "load running" sensor by monitoring an
energy meter connected to the washer. During the washer's operation, the energy
meter will fluctuate wildly, hitting zero frequently even before the load is
finished. By utilizing `off_delay`, we can have this sensor only turn off if
there has been no washer activity for 5 minutes.
{% raw %}
```yaml
# Determine when the washing machine has a load running.
binary_sensor:
- platform: template
name: Washing Machine
value_template: {% raw %}'{{ states.sensor.washing_machine_power.state > 0 }}'{% endraw %}
sensors:
washing_machine:
friendly_name: "Washing Machine"
off_delay:
minutes: 5
value_template: >-
{{ states('sensor.washing_machine_power')|float > 0 }}
```
{% endraw %}
### {% linkable_title Is anyone home? %}
### {% linkable_title Is Anyone Home? %}
This example is determining if anyone is home based on the combination
of device tracking and motion sensors. It's extremely useful if you
have kids/baby sitter/grand parents who might still be in your
house that aren't represented by a trackable device in home
assistant. This is providing a composite of wifi based device tracking
and z-wave multisensor presence sensors.
assistant. This is providing a composite of WiFi based device tracking
and Z-Wave multisensor presence sensors.
{% raw %}
```yaml
binary_sensor:
- platform: template
sensors:
people_home:
value_template: {% raw %}>-
{%- if is_state("device_tracker.sean", "home")
or is_state("device_tracker.susan", "home")
or is_state("binary_sensor.office_124", "on")
or is_state("binary_sensor.hallway_134", "on")
or is_state("binary_sensor.living_room_139", "on")
or is_state("binary_sensor.porch_ms6_1_129", "on")
or is_state("binary_sensor.family_room_144", "on")
-%}
True
{%- else -%}
False
{%- endif %}{% endraw %}
entity_id:
- device_tracker.sean
- device_tracker.susan
@ -148,4 +194,13 @@ binary_sensor:
- binary_sensor.living_room_139
- binary_sensor.porch_ms6_1_129
- binary_sensor.family_room_144
value_template: >-
{{ is_state('device_tracker.sean', 'home')
or is_state('device_tracker.susan', 'home')
or is_state('binary_sensor.office_124', 'on')
or is_state('binary_sensor.hallway_134', 'on')
or is_state('binary_sensor.living_room_139', 'on')
or is_state('binary_sensor.porch_ms6_1_129', 'on')
or is_state('binary_sensor.family_room_144', 'on') }}
```
{% endraw %}

View File

@ -12,4 +12,4 @@ ha_category: Binary Sensor
ha_iot_class: "Local Polling"
---
To get your ZigBee binary sensors working with Home Assistant, follow then instructions for the general [ZigBee Home Automationcomponent](/components/zha/).
To get your ZigBee binary sensors working with Home Assistant, follow the instructions for the general [ZigBee Home Automation component](/components/zha/).

View File

@ -1,7 +1,7 @@
---
layout: page
title: "Template Cover"
description: "Instructions how to integrate Template covers into Home Assistant."
description: "Instructions how to integrate Template Covers into Home Assistant."
date: 2017-06-19 20:32
sidebar: true
comments: false
@ -13,10 +13,14 @@ ha_iot_class: "Local Push"
logo: home-assistant.png
---
The `template` platform can create covers that combine components and provides the ability to run scripts or invoke services for each of the open, close, stop, position, and tilt commands of a cover.
The `template` platform can create covers that combine components and provides
the ability to run scripts or invoke services for each of the open, close,
stop, position, and tilt commands of a cover.
To enable Template covers in your installation, add the following to your `configuration.yaml` file:
To enable Template Covers in your installation, add the following to your
`configuration.yaml` file:
{% raw %}
```yaml
# Example configuration.yaml entry
cover:
@ -24,7 +28,7 @@ cover:
covers:
garage_door:
friendly_name: "Garage Door"
value_template: "{% raw %}'{{is_state('sensor.garage_door > 0'}}'{% endraw %}"
value_template: "{{ states('sensor.garage_door')|float > 0 }}"
open_cover:
service: script.open_garage_door
close_cover:
@ -32,27 +36,93 @@ cover:
stop_cover:
service: script.stop_garage_door
```
{% endraw %}
Configuration variables:
{% configuration %}
covers:
description: List of your covers.
required: true
type: map
keys:
friendly_name:
description: Name to use in the frontend.
required: false
type: string
entity_id:
description: Add a list of entity IDs so the switch only reacts to state changes of these entities. This will reduce the number of times the cover will try to update its state.
required: false
type: [string, list]
value_template:
description: Defines a template to get the state of the cover. Valid values are `open`/`true` or `closed`/`false`. [`value_template`](#value_template) and [`position_template`](#position_template) cannot be specified concurrently.
required: exclusive
type: template
position_template:
description: Defines a template to get the state of the cover. Legal values are numbers between `0` (closed) and `100` (open). [`value_template`](#value_template) and [`position_template`](#position_template) cannot be specified concurrently.
required: exclusive
type: template
icon_template:
description: Defines a template to specify which icon to use.
required: false
type: template
open_cover:
description: Defines an action to run when the cover is opened. If [`open_cover`](#open_cover) is specified, [`close_cover`](#close_cover) must also be specified. At least one of [`open_cover`](#open_cover) and [`set_cover_position`](#set_cover_position) must be specified.
required: inclusive
type: action
close_cover:
description: Defines an action to run when the cover is closed.
required: inclusive
type: action
stop_cover:
description: Defines an action to run when the cover is stopped.
required: false
type: action
set_cover_position:
description: Defines an action to run when the cover is set to a specific value (between `0` and `100`).
required: false
type: action
set_cover_tilt_position:
description: Defines an action to run when the cover tilt is set to a specific value (between `0` and `100`).
required: false
type: action
optimistic:
description: Force cover position to use [optimistic mode](#optimistic-mode).
required: false
type: bool
default: false
tilt_optimistic:
description: Force cover tilt position to use [optimistic mode](#optimistic-mode).
required: false
type: bool
default: false
tilt_template:
description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open).
required: false
type: template
{% endconfiguration %}
- **covers** array (*Required*): List of your coverss.
- **open_cover** (*Optional*): Defines an [action](/getting-started/automation/) to run when the cover is opened. If `open_cover` is specified, `close_cover` must also be specified. At least one of `open_cover` and `set_cover_position` must be specified.
- **close_cover** (*Optional*): Defines an [action](/getting-started/automation/) to run when the cover is closed.
- **stop_cover** (*Optional*): Defines an [action](/getting-started/automation/) to run when the cover is stopped.
- **set_cover_position** (*Optional*): Defines an [action](/getting-started/automation/) to run when the cover is set to a specific value (between 0 and 100).
- **set_cover_tilt_position** (*Optional*): Defines an [action](/getting-started/automation/) to run when the cover tilt is set to a specific value (between 0 and 100).
- **value_template** (*Optional*): Defines a [template](/topics/templating/) to get the state of the cover. Valid values are open/true or closed/false. `value_template` and `position_template` cannot be specified concurrently.
- **position_template** (*Optional*): Defines a [template](/topics/templating/) to get the state of the cover. Legal values are numbers between 0 (closed) and 100 (open). `value_template` and `position_template` cannot be specified concurrently.
- **tilt_template** (*Optional*): Defines a [template](/topics/templating/) to get the tilt state of the cover. Legal values are numbers between 0 (closed) and 100 (open).
- **optimistic** (*Optional*): Force cover position to use optimistic mode. Value is either `true` or `false`. [See below](#optimistic-mode) for more details.
- **tilt_optimistic** (*Optional*): Force cover tilt position to use optimistic mode. Value is either `true` or `false`. [See below](#optimistic mode) for more details.
- **icon_template** (*Optional*): Defines a [template](/topics/templating/) to specify which icon to use. Either `value_template` or `position_template` must be specified.
- **friendly_name** (*Optional*): Name to use in the frontend.
- **entity_id** (*Optional*): Add a list of entity IDs so the switch only reacts to state changes of these entities. This will reduce the number of times the cover will try to update it's state.
## {% linkable_title Considerations %}
## {% linkable_title Optitmistic Mode %}
If you are using the state of a platform that takes extra time to load, the
Template Cover may get an `unknown` state during startup. This results
in error messages in your log file until that platform has completed loading.
If you use `is_state()` function in your template, you can avoid this situation.
For example, you would replace
{% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %}
with this equivalent that returns `true`/`false` and never gives an unknown
result:
{% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
In optmistic mode, the cover position state is maintained internally. This mode is automatically enabled if neither `value_template` or `position_template` are sepcified. Note that this is unlikely to be very reliable without some feedback mechanism, since there is otherwise no way to know if the cover is moving properly. The cover can be forced into optimistic mode by using the `optimistic` attribute. There is an equivalent mode for tilt-position that is enabled when `tilt_template` is not specified or when the `tilt-optimistic` attribute is used.
## {% linkable_title Optimistic Mode %}
In optimistic mode, the cover position state is maintained internally. This
mode is automatically enabled if neither [`value_template`](#value_template) or
[`position_template`](#position_template) are specified. Note that this is
unlikely to be very reliable without some feedback mechanism, since there is
otherwise no way to know if the cover is moving properly. The cover can be
forced into optimistic mode by using the [`optimistic`](#optimistic)
attribute. There is an equivalent mode for `tilt_position` that is enabled
when [`tilt_template`](#tilt_template) is not specified or when the
[`tilt_optimistic`](#tilt_optimistic) attribute is used.
## {% linkable_title Examples %}
@ -60,34 +130,44 @@ In this section you will find some real life examples of how to use this cover.
### {% linkable_title Garage Door %}
This example converts a garage door with a controllable switch and position sensor into a cover.
This example converts a garage door with a controllable switch and position
sensor into a cover.
```yaml
{% raw %}
```yaml
cover:
- platform: template
covers:
garage_door:
friendly_name: 'Garage Door'
value_template: "{{ sensor.garage_door }}"
friendly_name: "Garage Door"
position_template: "{{ states('sensor.garage_door') }}"
open_cover:
service: switch.turn_on
data:
entity_id: switch.garage_door
close_cover:
service: switch.turn_off
data:
entity_id: switch.garage_door
stop_cover:
service: switch.turn_on
data:
entity_id: switch.garage_door
icon_template: "{% if not is_state('sensor.garage_door', 'on') %}mdi:garage-open{% else %}mdi:garage{% endif %}"{% endraw %}
icon_template: >-
{% if states('sensor.garage_door')|float > 0 %}
mdi:garage-open
{% else %}
mdi:garage
{% endif %}
```
{% endraw %}
### {% linkable_title Multi Covers %}
### {% linkable_title Multiple Covers %}
This example allows you to control two or more covers at once.
```yaml
{% raw %}
```yaml
homeassistant:
customize:
all_covers:
@ -97,7 +177,7 @@ cover:
- platform: template
covers:
all_covers:
friendly_name: 'All Covers'
friendly_name: "All Covers"
open_cover:
service: script.cover_all_open
close_cover:
@ -108,20 +188,13 @@ cover:
service: script.cover_all_set_position
data_template:
position: "{{ position }}"
value_template: >
{% if is_state('sensor.all_covers', 'open') %}
open
{% else %}
closed
{% endif %}
icon_template: >
value_template: "{{ is_state('sensor.all_covers', 'open') }}"
icon_template: >-
{% if is_state('sensor.all_covers', 'open') %}
mdi:window-open
{% else %}
mdi:window-closed
{% endif %}
entity_id:
- cover.bedroom
- cover.livingroom
@ -130,7 +203,7 @@ sensor:
- platform: template
sensors:
all_covers:
value_template: >
value_template: >-
{% if is_state('cover.bedroom', 'open') %}
open
{% elif is_state('cover.livingroom', 'open') %}
@ -138,7 +211,6 @@ sensor:
{% else %}
closed
{% endif %}
entity_id:
- cover.bedroom
- cover.livingroom
@ -147,41 +219,43 @@ script:
cover_all_open:
sequence:
- service: cover.open_cover
entity_id: cover.bedroom
- service: cover.open_cover
entity_id: cover.livingroom
data:
entity_id:
- cover.bedroom
- cover.livingroom
cover_all_stop:
sequence:
- service: cover.stop_cover
entity_id: cover.bedroom
- service: cover.stop_cover
entity_id: cover.livingroom
data:
entity_id:
- cover.bedroom
- cover.livingroom
cover_all_close:
sequence:
- service: cover.close_cover
entity_id: cover.bedroom
- service: cover.close_cover
entity_id: cover.livingroom
data:
entity_id:
- cover.bedroom
- cover.livingroom
cover_all_set_position:
sequence:
- service: cover.set_cover_position
entity_id: cover.bedroom
data_template:
position: "{{ position }}"
- service: cover.set_cover_position
entity_id: cover.livingroom
data_template:
entity_id:
- cover.bedroom
- cover.livingroom
position: "{{ position }}"
automation:
- alias: 'Close covers at night'
- alias: "Close covers at night"
trigger:
- platform: sun
event: sunset
offset: '+00:30:00'
action:
service: cover.set_cover_position
- service: cover.set_cover_position
data:
entity_id: cover.all_covers
data_template:
position: 25{% endraw %}
position: 25
```
{% endraw %}

View File

@ -9,7 +9,7 @@ sharing: true
footer: true
logo: abode.jpg
ha_release: 0.54
ha_category: Cover
ha_category: Light
ha_iot_class: "Cloud Push"
---

View File

@ -1,7 +1,7 @@
---
layout: page
title: "Template Light"
description: "Instructions how to integrate Template lights into Home Assistant."
description: "Instructions how to integrate Template Lights into Home Assistant."
date: 2016-05-18 20:32
sidebar: true
comments: false
@ -13,10 +13,14 @@ ha_iot_class: "Local Push"
logo: home-assistant.png
---
The `template` platform creates lights that combine components and provides the ability to run scripts or invoke services for each of the on, off, and brightness commands of a light.
The `template` platform creates lights that combine components and provides the
ability to run scripts or invoke services for each of the on, off, and
brightness commands of a light.
To enable Template lights in your installation, add the following to your `configuration.yaml` file:
To enable Template Lights in your installation, add the following to your
`configuration.yaml` file:
{% raw %}
```yaml
# Example configuration.yaml entry
light:
@ -24,7 +28,8 @@ light:
lights:
theater_lights:
friendly_name: "Theater Lights"
value_template: "{% raw %}{{is_state('sensor.theater_brightness.attributes.lux > 0'}}{% endraw %}"
level_template: "{{ sensor.theater_brightness.attributes.lux|int }}"
value_template: "{{ sensor.theater_brightness.attributes.lux|int > 0 }}"
turn_on:
service: script.theater_lights_on
turn_off:
@ -32,26 +37,59 @@ light:
set_level:
service: script.theater_lights_level
data_template:
brightness: "{% raw %}{{brightness}}{% endraw %}"
level_template: "{% raw %}{{is_state('sensor.theater_brightness.attributes.lux'}}{% endraw %}"
brightness: "{{ brightness }}"
```
{% endraw %}
Configuration variables:
- **lights** array (*Required*): List of your lights.
- **friendly_name** (*Optional*): Name to use in the Frontend.
- **value_template** (*Optional*): Defines a [template](/topics/templating/) to get the state of the light. If not provided the component defaults to optimisitc state determination.
- **turn_on** (*Required*): Defines an [action](/getting-started/automation/) to run when the light is turned on.
- **turn_off** (*Required*): Defines an [action](/getting-started/automation/) to run when the light is turned off.
- **set_level** (*Optional*): Defines an [action](/getting-started/automation/) to run when the light is given a brightness command.
- **level_template** (*Optional): Defines a [template](/topics/templating/) to get the brightness of the light. If not provided the component defaults to optimisitc brightness determination.
- **entity_id** (*Optional*): Add a list of entity IDs so the switch only reacts to state changes of these entities. This will reduce the number of times the light will try to update it's state.
{% configuration %}
switches:
description: List of your lights.
required: true
type: map
keys:
friendly_name:
description: Name to use in the frontend.
required: false
type: string
entity_id:
description: Add a list of entity IDs so the switch only reacts to state changes of these entities. This will reduce the number of times the light will try to update its state.
required: false
type: [string, list]
value_template:
description: Defines a template to get the state of the light.
required: false
type: template
default: optimistic
level_template:
description: Defines a template to get the brightness of the light.
required: false
type: template
default: optimistic
turn_on:
description: Defines an action to run when the light is turned on.
required: true
type: action
turn_off:
description: Defines an action to run when the light is turned off.
required: true
type: action
set_level:
description: Defines an action to run when the light is given a brightness command.
required: false
type: action
{% endconfiguration %}
## {% linkable_title Considerations %}
If you are using the state of a platform that takes extra time to load, the template light may get an 'unknown' state during startup. This results in error messages in your log file until that platform has completed loading. If you use is_state() function in your template, you can avoid this situation. For example, you would replace {% raw %}'{{ states.switch.source.state }}'{% endraw %} with this equivalent that returns true/false and never gives an unknown result:
{% raw %}'{{ is_state('switch.source', 'on') }}'{% endraw %}
If you are using the state of a platform that takes extra time to load, the
Template Light may get an `unknown` state during startup. This results
in error messages in your log file until that platform has completed loading.
If you use `is_state()` function in your template, you can avoid this situation.
For example, you would replace
{% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %}
with this equivalent that returns `true`/`false` and never gives an unknown
result:
{% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
## {% linkable_title Examples %}
@ -59,26 +97,29 @@ In this section you will find some real life examples of how to use this light.
### {% linkable_title Theater Volume Control %}
This example shows a light that is actually a home theater's volume. This component gives you the flexibility to provide whatever you'd like to send as the payload to the consumer including any scale conversions you may need to make; the media_player component needs a floating point percentage value 0.0-1.0
This example shows a light that is actually a home theater's volume. This
component gives you the flexibility to provide whatever you'd like to send as
the payload to the consumer including any scale conversions you may need to
make; the [Media Player component](/components/media_player/) needs a floating
point percentage value from `0.0` to `1.0`.
{% raw %}
```yaml
light:
- platform: template
lights:
theater_volume:
friendly_name: 'Receiver Volume'
friendly_name: "Receiver Volume"
value_template: >-
{% raw %}
{%- if is_state("media_player.receiver", "on") -%}
{%- if states.media_player.receiver.attributes.is_volume_muted -%}
{% if is_state('media_player.receiver', 'on') %}
{% if states.media_player.receiver.attributes.is_volume_muted %}
off
{%- else -%}
{% else %}
on
{%- endif -%}
{%- else -%}
{% endif %}
{% else %}
off
{%- endif -%}
{% endraw %}
{% endif %}
turn_on:
service: media_player.volume_mute
data:
@ -91,16 +132,14 @@ light:
is_volume_muted: true
set_level:
service: media_player.volume_set
data:
entity_id: media_player.receiver
data_template:
volume_level: '{% raw %}{{((brightness / 255 * 100) | int)/100}}{% endraw %}'
entity_id: media_player.receiver
volume_level: "{{ (brightness / 255 * 100)|int / 100 }}"
level_template: >-
{% raw %}
{%- if is_state("media_player.receiver", "on") -%}
{{(255 * states.media_player.receiver.attributes.volume_level) | int}}
{%- else -%}
{% if is_state('media_player.receiver', 'on') %}
{{ (states.media_player.receiver.attributes.volume_level|float * 255)|int }}
{% else %}
0
{%- endif -%}
{% endraw %}
{% endif %}
```
{% endraw %}

View File

@ -1,7 +1,7 @@
---
layout: page
title: "Template Sensor"
description: "Instructions how to integrate Template sensors into Home Assistant."
description: "Instructions how to integrate Template Sensors into Home Assistant."
date: 2016-01-27 07:00
sidebar: true
comments: false
@ -13,142 +13,205 @@ ha_iot_class: "Local Push"
logo: home-assistant.png
---
The `template` platform supports sensors which break out `state_attributes` from other entities.
The `template` platform supports sensors which break out `state_attributes`
from other entities.
To enable Template sensors in your installation, add the following to your `configuration.yaml` file:
To enable Template Sensors in your installation, add the following to your
`configuration.yaml` file:
{% raw %}
```yaml
# Example configuration.yaml entry
sensor:
- platform: template
sensors:
solar_angle:
value_template: {% raw %}'{{ states.sun.sun.attributes.elevation }}'{% endraw %}
friendly_name: 'Sun angle'
friendly_name: "Sun angle"
unit_of_measurement: 'degrees'
value_template: "{{ states.sun.sun.attributes.elevation }}"
sunrise:
value_template: {% raw %}'{{ states.sun.sun.attributes.next_rising }}'{% endraw %}
value_template: "{{ states.sun.sun.attributes.next_rising }}"
```
{% endraw %}
Configuration variables:
{% configuration %}
sensors:
description: List of your sensors.
required: true
type: map
keys:
friendly_name:
description: Name to use in the frontend.
required: false
type: string
entity_id:
description: Add a list of entity IDs so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update its state.
required: false
type: string, list
unit_of_measurement:
description: Defines the units of measurement of the sensor, if any.
required: false
type: string
value_template:
description: Defines a template to get the state of the sensor.
required: true
type: template
icon_template:
description: Defines a template for the icon of the sensor.
required: false
type: template
{% endconfiguration %}
- **sensors** array (*Required*): List of your sensors.
- **friendly_name** (*Optional*): Name to use in the Frontend.
- **unit_of_measurement** (*Optional*): Defines the units of measurement of the sensor, if any.
- **value_template** (*Required*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the event bus.
- **icon_template** (*Optional*): Defines a [template](/topics/templating/) for the icon of the sensor.
- **entity_id** (*Optional*): Add a list of entity IDs so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update its state.
## {% linkable_title Considerations %}
If you are using the state of a platform that takes extra time to load, the
Template Sensor may get an `unknown` state during startup. This results
in error messages in your log file until that platform has completed loading.
If you use `is_state()` function in your template, you can avoid this situation.
For example, you would replace
{% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %}
with this equivalent that returns `true`/`false` and never gives an unknown
result:
{% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
## {% linkable_title Examples %}
In this section you find some real life examples of how to use this sensor.
### {% linkable_title Sun angle %}
### {% linkable_title Sun Angle %}
This example shows the sun angle in the frontend.
{% raw %}
```yaml
sensor:
- platform: template
sensors:
solar_angle:
value_template: {% raw %}'{{ "%+.1f"|format(states.sun.sun.attributes.elevation) }}'{% endraw %}
friendly_name: 'Sun Angle'
friendly_name: "Sun Angle"
unit_of_measurement: '°'
value_template: "{{ '%+.1f'|format(states.sun.sun.attributes.elevation) }}"
```
{% endraw %}
### {% linkable_title Renaming sensor output %}
### {% linkable_title Renaming Sensor Output %}
If you don't like the wording of a sensor output then the template sensor can help too. Let's rename the output of the [Sun component](/components/sun/) as a simple example:
If you don't like the wording of a sensor output then the Template Sensor can
help too. Let's rename the output of the [Sun component](/components/sun/) as
a simple example:
{% raw %}
```yaml
sensor:
- platform: template
sensors:
sun_state:
value_template: {% raw %}'{% if is_state("sun.sun", "above_horizon") %}up{% else %}down{% endif %}'{% endraw %}
friendly_name: 'Sun state'
friendly_name: "Sun State"
value_template: >-
{% if is_state('sun.sun', 'above_horizon') %}
up
{% else %}
down
{% endif %}
```
{% endraw %}
Processes monitored by the [System Monitor sensor](/components/sensor.systemmonitor/) show `on` or `off` if they are running or not. This example shows how the output of a monitored `glances` process can be renamed.
Processes monitored by the [System Monitor sensor](/components/sensor.systemmonitor/)
show `on` or `off` if they are running or not. This example shows how the
output of a monitored `glances` process can be renamed.
{% raw %}
```yaml
sensor:
- platform: template
sensors:
glances:
value_template: {% raw %}'{% if is_state("sensor.process_glances", "off") %}not running{% else %}running{% endif %}'{% endraw %}
friendly_name: 'Glances'
friendly_name: "Glances"
value_template: >-
{% if is_state('sensor.process_glances', 'on') %}
running
{% else %}
not running
{% endif %}
```
{% endraw %}
By comparing the details published on the [template](/topics/templating/) page the same can be achieved with a different approach:
The [Template Binary Sensor](/components/binary_sensor.template/) is the one in
similar cases if you prefer to see an icon instead of text.
```yaml
value_template: {% raw %}"{%if states.sensor.ENTITY_ID.state == 'on' %}running{%elif states.switch.ENTITY_ID.state == 'off' %}not running{% endif %}"{% endraw %}
```
### {% linkable_title Multiline Example With an `if` Test %}
The [Binary template sensor](/components/binary_sensor.template/) is the one in similar cases if you prefer to see an icon instead of text.
### {% linkable_title Multiline example with an if test %}
This example shows a multiple line template with an if test. It looks at a sensing switch and shows on/off in the frontend.
This example shows a multiple line template with an `if` test. It looks at a
sensing switch and shows `on`/`off` in the frontend.
{% raw %}
```yaml
sensor:
- platform: template
sensors:
kettle:
friendly_name: 'Kettle'
{% raw %}value_template: >-
{%- if is_state("switch.kettle", "off") %}
friendly_name: "Kettle"
value_template: >-
{% if is_state('switch.kettle', 'off') %}
off
{% elif states.switch.kettle.attributes.kwh < 1000 %}
{% elif states.switch.kettle.attributes.kwh|float < 1000 %}
standby
{% elif is_state("switch.kettle", "on") %}
{% elif is_state('switch.kettle', 'on') %}
on
{% else %}
failed
{%- endif %}{% endraw %}
{% endif %}
next_sensor:
[...]
...
```
{% endraw %}
<p class='note'>
Please note the blank line to close the multi-line template.
</p>
### {% linkable_title Change The Unit of Measurement %}
### {% linkable_title Change the unit of measurement %}
With a template sensor it's easy to convert given values into others if the unit of measurement doesn't fit your needs.
With a Template Sensor it's easy to convert given values into others if the
unit of measurement doesn't fit your needs.
{% raw %}
```yaml
sensor:
- platform: template
sensors:
transmission_down_speed_kbps:
value_template: {% raw %}'{{ states.sensor.transmission_down_speed.state | multiply(1024) }}'{% endraw %}
friendly_name: 'Transmission Down Speed'
friendly_name: "Transmission Down Speed"
unit_of_measurement: 'kB/s'
transmission_up_speed_kbps:
value_template: {% raw %}'{{ states.sensor.transmission_up_speed.state | multiply(1024) }}'{% endraw %}
friendly_name: 'Transmission Up Speed'
unit_of_measurement: 'kB/s'
```
value_template: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"
### {% linkable_title Change the icon %}
transmission_up_speed_kbps:
friendly_name: "Transmission Up Speed"
unit_of_measurement: 'kB/s'
value_template: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"
```
{% endraw %}
### {% linkable_title Change The Icon %}
This example shows how to change the icon based on the day/night cycle.
{% raw %}
```yaml
sensor:
- platform: template
sensors:
day_night:
friendly_name: 'Day/Night'
value_template: {% raw %}'{% if is_state("sun.sun", "above_horizon") %}Day{% else %}Night{% endif %}'{% endraw %}
icon_template: {% raw %}'{% if is_state("sun.sun", "above_horizon") %}mdi:weather-sunny{% else %}mdi:weather-night{% endif %}'{% endraw %}
friendly_name: "Day/Night"
value_template: >-
{% if is_state('sun.sun', 'above_horizon') %}
Day
{% else %}
Night
{% endif %}
icon_template: >-
{% if is_state('sun.sun', 'above_horizon') %}
mdi:weather-sunny
{% else %}
mdi:weather-night
{% endif %}
```
{% endraw %}

View File

@ -9,7 +9,6 @@ sharing: true
footer: true
ha_category: DIY
ha_release: 0.54
logo: home-assistant.png
ha_iot_class: "Local Polling"
---

View File

@ -158,7 +158,7 @@ group:
```yaml
sensor:
- platform: wunderground
- api_key: your_api_key
api_key: your_api_key
monitored_conditions:
- temp_high_record_c
- temp_high_1d_c

View File

@ -7,7 +7,6 @@ sidebar: true
comments: false
sharing: true
footer: true
logo: home-assistant.png
ha_category: Switch
ha_release: 0.54
ha_iot_class: "Local Polling"
@ -29,7 +28,7 @@ switch:
command_on: "PWR ON"
command_off: "PWR OFF"
command_state: "PWR?"
value_template: '{{ value == "PWR=01" }}'
value_template: '{% raw %}{{ value == "PWR=01" }}{% endraw %}'
```
Configuration variables:

View File

@ -1,7 +1,7 @@
---
layout: page
title: "Template switch"
description: "Instructions how to integrate Template switches into Home Assistant."
title: "Template Switch"
description: "Instructions how to integrate Template Switches into Home Assistant."
date: 2016-02-07 07:00
sidebar: true
comments: false
@ -15,116 +15,174 @@ logo: home-assistant.png
The `template` platform creates switches that combines components.
For example, if you have a garage door with a toggle switch that operates the motor and a sensor that allows you know whether the door is open or closed, you can combine these into a switch that knows whether the garage door is open or closed.
For example, if you have a garage door with a toggle switch that operates the
motor and a sensor that allows you know whether the door is open or closed,
you can combine these into a switch that knows whether the garage door is open
or closed.
This can simplify the GUI and make it easier to write automations. You can mark the components you have combined as `hidden` so they don't appear themselves.
This can simplify the GUI and make it easier to write automations. You can mark
the components you have combined as `hidden` so they don't appear themselves.
To enable Template switches in your installation, add the following to your `configuration.yaml` file:
To enable Template Switches in your installation, add the following to your
`configuration.yaml` file:
{% raw %}
```yaml
# Example configuration.yaml entry
switch:
- platform: template
switches:
skylight:
value_template: {% raw %}"{{ is_state('sensor.skylight', 'on') }}"{% endraw %}
value_template: "{{ is_state('sensor.skylight', 'on') }}"
turn_on:
service: switch.turn_on
data:
entity_id: switch.skylight_open
turn_off:
service: switch.turn_on
data:
entity_id: switch.skylight_close
```
{% endraw %}
Configuration variables:
- **switches** array (*Required*): List of your switches.
- **friendly_name** (*Optional*): Name to use in the Frontend.
- **value_template** (*Required*): Defines a [template](/topics/templating/) to set the state of the switch.
- **turn_on** (*Required*): Defines an [action](/getting-started/automation/) to run when the switch is turned on.
- **turn_off** (*Required*): Defines an [action](/getting-started/automation/) to run when the switch is turned off.
- **entity_id** (*Optional*): Add a list of entity IDs so the switch only reacts to state changes of these entities. This will reduce the number of times the switch will try to update it's state.
{% configuration %}
switches:
description: List of your switches.
required: true
type: map
keys:
friendly_name:
description: Name to use in the frontend.
required: false
type: string
entity_id:
description: Add a list of entity IDs so the switch only reacts to state changes of these entities. This will reduce the number of times the switch will try to update its state.
required: false
type: [string, list]
value_template:
description: Defines a template to set the state of the switch.
required: true
type: template
turn_on:
description: Defines an action to run when the switch is turned on.
required: true
type: action
turn_off:
description: Defines an action to run when the switch is turned off.
required: true
type: action
{% endconfiguration %}
## {% linkable_title Considerations %}
If you are using the state of a platform that takes extra time to load, the template switch may get an 'unknown' state during startup. This results in error messages in your log file until that platform has completed loading. If you use `is_state()` function in your template, you can avoid this situation. For example, you would replace {% raw %}`{{ states.switch.source.state }}`{% endraw %} with this equivalent that returns true/false and never gives an unknown result:
If you are using the state of a platform that takes extra time to load, the
Template Switch may get an `unknown` state during startup. This results
in error messages in your log file until that platform has completed loading.
If you use `is_state()` function in your template, you can avoid this situation.
For example, you would replace
{% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %}
with this equivalent that returns `true`/`false` and never gives an unknown
result:
{% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
## {% linkable_title Examples %}
In this section you find some real life examples of how to use this switch.
### {% linkable_title Copy switch %}
### {% linkable_title Copy Switch %}
This example shows a switch that copies another switch.
{% raw %}
```yaml
switch:
- platform: template
switches:
copy:
value_template: {% raw %}"{{ is_state('switch.source', 'on') }}"{% endraw %}
value_template: "{{ is_state('switch.source', 'on') }}"
turn_on:
service: switch.turn_on
data:
entity_id: switch.source
turn_off:
service: switch.turn_off
data:
entity_id: switch.source
````
```
{% endraw %}
### {% linkable_title Toggle switch %}
### {% linkable_title Toggle Switch %}
This example shows a switch that takes its state from a sensor, and toggles a switch.
This example shows a switch that takes its state from a sensor, and toggles
a switch.
{% raw %}
```yaml
switch:
- platform: template
switches:
blind:
friendly_name: 'Blind'
value_template: {% raw %}"{{ is_state_attr('switch.blind_toggle', 'sensor_state', 'on') }}"{% endraw %}
friendly_name: "Blind"
value_template: "{{ is_state_attr('switch.blind_toggle', 'sensor_state', 'on') }}"
turn_on:
service: switch.toggle
data:
entity_id: switch.blind_toggle
turn_off:
service: switch.toggle
data:
entity_id: switch.blind_toggle
```
{% endraw %}
### {% linkable_title Sensor and two switches %}
### {% linkable_title Sensor and Two Switches %}
This example shows a switch that takes its state from a sensor, and uses two momentary switches to control a device.
This example shows a switch that takes its state from a sensor, and uses two
momentary switches to control a device.
{% raw %}
```yaml
switch:
- platform: template
switches:
skylight:
friendly_name: 'Skylight'
value_template: {% raw %}"{{ is_state('sensor.skylight.state', 'on') }}"{% endraw %}
friendly_name: "Skylight"
value_template: "{{ is_state('sensor.skylight.state', 'on') }}"
turn_on:
service: switch.turn_on
data:
entity_id: switch.skylight_open
turn_off:
service: switch.turn_on
data:
entity_id: switch.skylight_close
```
### {% linkable_title Change the icon %}
{% endraw %}
### {% linkable_title Change The Icon %}
This example shows how to change the icon based on the day/night cycle.
{% raw %}
```yaml
switch:
- platform: template
switches:
garage:
value_template: {% raw %}"{{ is_state(cover.garage_door', 'on') }}"{% endraw %}
value_template: "{{ is_state('cover.garage_door', 'on') }}"
turn_on:
service: cover.open_cover
data:
entity_id: cover.garage_door
turn_off:
service: cover.close_cover
data:
entity_id: cover.garage_door
icon_template: {% raw %}"{% if is_state('cover.garage_door', 'open') %}mdi:garage-open{% else %}mdi:garage{% endif %}"{% endraw %}
icon_template: >-
{% if is_state('cover.garage_door', 'open') %}
mdi:garage-open
{% else %}
mdi:garage
{% endif %}
```
{% endraw %}

View File

@ -1,7 +1,7 @@
---
layout: page
title: "ZigBee Home Automation Switch"
description: "Instructions how to setup ZigBee Home Automation switches within Home Assistant."
description: "Instructions on how to setup ZigBee Home Automation switches within Home Assistant."
date: 2017-02-22 00:00
sidebar: true
comments: false
@ -12,4 +12,4 @@ ha_category: Switch
ha_iot_class: "Local Polling"
---
To get your ZigBee switches working with Home Assistant, follow theminstructions for the general [ZigBee Home Automation component](/components/zha/).
To get your ZigBee switches working with Home Assistant, follow the instructions for the general [ZigBee Home Automation component](/components/zha/).

View File

@ -1,6 +1,6 @@
---
layout: page
title: "MQTT"
title: "MQTT Vacuum"
description: "Instructions how to integrate your MQTT enabled Vacuum within Home Assistant."
date: 2017-09-11 20:26
sidebar: true

View File

@ -86,6 +86,10 @@ $ ls /dev/cu.usbmodem*
Depending on what's plugged into your USB ports, the name found above may change. You can lock in a name, such as `/dev/zwave`, by following [these instructions](http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/).
</p>
<p class='note'>
After installing and configuring Z-Wave, Home Assistant will try to install required Python Z-Wave libraries during startup (if they are not already installed). This process might take anywhere between 5 to 25 minutes depending upon various factors. Please be patient, and let it run! This happens only once and the subsequent restarts will have no impact in performance.
</p>
### {% linkable_title Adding Devices %}
To add a Z-Wave device to your system, go to the Z-Wave panel in the Home Assistant frontend and click the Add Node button in the Z-Wave Network Management card. This will place the controller in inclusion mode, after which you should activate your device to be included by following the instructions provided with the device.

View File

@ -0,0 +1,355 @@
---
layout: post
title: "0.54: Todoist, DoorBird, Abode cameras"
description: "4 years of Home Assistant is celebrated with another great release."
date: 2017-09-23 00:11:05
date_formatted: "September 23, 2017"
author: Paulus Schoutsen
author_twitter: balloob
comments: true
categories: Release-Notes
og_image: /images/blog/2017-09-0.54/components.png
---
<a href='/components/#version/0.54'><img src='/images/blog/2017-09-0.54/components.png' style='border: 0;box-shadow: none;'></a>
We're approaching the end of September and that means that it was our birthday! We are now officially 4 years old and are getting more amazing with every release. This release too will include some great new stuff and tons of bugfixes. Included is a bug fix by [@fanthos] that should fix the frontend in some browsers. If you had issues with your browser before, make sure to check out this release.
This release we've started the work to make our Xiaomi integrations more robust. This meant that we've had to rename the components to make it more clear which of the Xiaomi protocols are being used. We have some developers working on making this very affordable home automation solution a first class citizen in the Home Assistant ecosystem, stay tuned for more integrations!
Another cool thing in this release is the new [`mqtt_statestream`][mqtt_statestream docs] component to export state changes to MQTT. Each entity will be exported on their own topic which makes it very easy to subscribe to individual entity updates.
## {% linkable_title New Platforms %}
- Added mqtt_statestream component ([@mw-white] - [#9286]) ([mqtt_statestream docs]) (new-platform)
- Add support for Todoist platform ([@Jay2645] - [#9236]) ([calendar.todoist docs]) (new-platform)
- DoorBird Component ([@Klikini] - [#9281]) ([doorbird docs]) ([binary_sensor.doorbird docs]) ([camera.doorbird docs]) ([switch.doorbird docs]) (new-platform)
- Basic MQTT vacuum support ([@johnboiles] - [#9386]) ([vacuum docs]) ([vacuum.mqtt docs]) (new-platform)
- Added Zyxel Keenetic NDMS2 based routers support for device tracking ([@foxel] - [#9315]) ([device_tracker.keenetic_ndms2 docs]) (new-platform)
- Telnet switch ([@multiholle] - [#8913]) ([switch.telnet docs]) (new-platform)
- Abode services, events, lights, cameras, automations, quick actions. ([@MisterWil] - [#9310]) ([abode docs]) ([alarm_control_panel.abode docs]) ([binary_sensor.abode docs]) ([camera.abode docs]) ([cover.abode docs]) ([light.abode docs]) ([lock.abode docs]) ([switch.abode docs]) (new-platform)
- Added satel_integra alarm panel and binary sensor platform ([@c-soft] - [#9336]) ([satel_integra docs]) ([alarm_control_panel.satel_integra docs]) ([binary_sensor.satel_integra docs]) (new-platform)
- Worx Landroid sensor ([@nilzen] - [#9416]) ([sensor.worxlandroid docs]) (new-platform)
## {% linkable_title If you need help... %}
...don't hesitate to use our very active [forums][forum] or join us for a little [chat][discord]. The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks.
## {% linkable_title Reporting Issues %}
Experiencing issues introduced by this release? Please report them in our [issue tracker][issue]. Make sure to fill in all fields of the issue template.
<!--more-->
## {% linkable_title Breaking Changes %}
- Sensor - OneWire: This update changes the names of the sensors from `<sensor_name>` to `<sensor_name> <Sensor_type>` ([@tcastberg] - [#9404]) ([sensor.onewire docs]) (breaking change)
- Renamed Xiaomi platforms to include their protocol names. xiaomi -> xiaomi_aqara, xiaomi_aqara.switch, xiaomi_aqara.light, xiaomi_aqara.binary_sensor, ... and vacuum.xiaomi, xiaomi_philipslight -> xiaomi_miio, vacuum.xiaomi_miio, light.xiaomi_miio ([@danielhiversen] - [#9426]) (breaking change)
- Swiss Public Transport sensor: All times handled by the Swiss Public Transport sensor are now in ISO 8601 format. Please update your templates sensors and automations. ([@fabaff] - [#9129]) ([sensor.swiss_public_transport docs]) (breaking change)
- iOS: All category identifiers need to be lowercase. If you do not update, it will break actionable notifications to IOS devices sent by scripts/automations. ([@rbflurry] - [#9427]) (breaking change)
- Fitbit: Put endpoints behind `/api` like the other oauth-using components ([@happyleavesaoc] - [#9460]) ([sensor.fitbit docs]) (breaking change)
- Version 0.53 introduced a bug in the HomeMatic component which breaks the usage of system variables on the CCU / Homegear. This has not been fixed yet. If you are using these variables in your automations you should skip updates until the bug has been resolved. Upgrading is safe however if you only interact with devices.
## {% linkable_title All changes %}
- Add HTTP Basic auth to RESTful Switch ([@amelchio] - [#9162]) ([switch.rest docs])
- Bump pywebpush and pyJWT versions ([@fanaticDavid] - [#9355]) ([notify.html5 docs])
- Add /usr/sbin to PATH ([@morberg] - [#9364])
- Add polling interval service and setting available through zwave node entity panel ([@turbokongen] - [#9056]) ([zwave docs])
- Round off probability to 2 decimals. ([@arsaboo] - [#9365]) ([binary_sensor.bayesian docs])
- Added mqtt_statestream component ([@mw-white] - [#9286]) ([mqtt_statestream docs]) (new-platform)
- typo in waypoint import topic preventing waypoint import ([@diplix] - [#9338]) ([device_tracker.owntracks docs])
- Cleanup and simplitfy the async state update ([@pvizeli] - [#9390])
- Update cloud auth ([@balloob] - [#9357])
- Allow multiple observations of same entity ([@jlmcgehee21] - [#9391]) ([binary_sensor.bayesian docs])
- Break up Alexa per functionality ([@balloob] - [#9400]) ([alexa docs])
- Upgrade psutil to 5.3.1 ([@fabaff] - [#9403]) ([sensor.systemmonitor docs])
- fix mopar sensor ([@happyleavesaoc] - [#9389]) ([sensor.mopar docs])
- Support specifying no Apple TVs ([@postlund] - [#9394]) ([apple_tv docs])
- Update netdisco to 1.2.0 ([@balloob] - [#9408])
- components/xiaomi: Add initial discovery using NetDisco. ([@pfalcon] - [#9283])
- Fix copy&paste mistake ([@tinloaf] - [#9378])
- Added log-file command line flag ([@TD22057] - [#9422])
- Add LC_CTYPE to environment variables in macOS ([@morberg] - [#9227])
- Added more devices and types to onewire ([@tcastberg] - [#9404]) ([sensor.onewire docs]) (breaking change)
- Bump uvcclient to 0.10.1 to work with beta NVR releases ([@antonym] - [#9423]) ([camera.uvc docs])
- full RGB support for users of tradfri GW ([@spektren] - [#9411]) ([light.tradfri docs])
- Add support for Todoist platform ([@Jay2645] - [#9236]) ([calendar.todoist docs]) (new-platform)
- Fix artwork bug in Apple TV ([@postlund] - [#9415]) ([media_player.apple_tv docs])
- Bump python-mirobo for improved device support and introduce API changes. ([@syssi] - [#9424])
- MPD small improvements ([@pdanilew] - [#9301]) ([media_player.mpd docs])
- update broadlink.py to add support for MP1 switch ([@giangvo] - [#9222]) ([switch.broadlink docs])
- Fix displaying of friendly_name for light template component ([@rollbrettler] - [#9413]) ([light.template docs])
- Improve Python script ([@doudz] - [#9417]) ([python_script docs])
- Add manual alarm_control_panel pending time per state ([@snjoetw] - [#9264]) ([alarm_control_panel.manual docs])
- Rename xiaomi #9425 ([@danielhiversen] - [#9426]) (breaking change)
- Bump version of aioautomatic ([@armills] - [#9435]) ([device_tracker.automatic docs])
- Fix russound_rio for python 3.4 ([@wickerwaka] - [#9428]) ([media_player.russound_rio docs])
- Basic MQTT vacuum support ([@johnboiles] - [#9386]) ([vacuum docs]) ([vacuum.mqtt docs]) (new-platform)
- Optimaze vacuum mqtt platform ([@pvizeli] - [#9439]) ([vacuum.mqtt docs])
- Polymer access to log file broken when using new log file command line ([@TD22057] - [#9437])
- Allow empty hostnames when detecting devices with the aruba device_tracker. ([@michaelarnauts] - [#9440]) ([device_tracker.aruba docs])
- mqtt_statestream: Update to append 'state' to topic for future use with mqtt discovery ([@mw-white] - [#9446]) ([mqtt_statestream docs])
- Fix for DTE Energy Bridge returning the wrong units from time to time ([@kylehendricks] - [#9246]) ([sensor.dte_energy_bridge docs])
- Refactor Swiss Public Transport sensor ([@fabaff] - [#9129]) ([sensor.swiss_public_transport docs]) (breaking change)
- Added Zyxel Keenetic NDMS2 based routers support for device tracking ([@foxel] - [#9315]) ([device_tracker.keenetic_ndms2 docs]) (new-platform)
- Add city/state/country options and fix bugs for airvisual ([@bachya] - [#9436]) ([sensor.airvisual docs])
- Fix emulated hue warning message ([@astone123] - [#9452]) ([emulated_hue docs])
- Alexa smart home native support ([@pvizeli] - [#9443])
- fix for Twitter notifications without media ([@MikeChristianson] - [#9448])
- Load WebComponent polyfill on header. ([@fanthos] - [#9438])
- Fix issue 5728: Emulated Hue UPnP crashes on special characters. ([@SqyD] - [#9453])
- Ios notify camera fix ([@rbflurry] - [#9427]) (breaking change)
- Adds MQTT Fan Discovery ([@hufman] - [#9463])
- Upgrade sqlalchemy to 1.1.14 ([@fabaff] - [#9458])
- Upgrade uber_rides to 0.6.0 ([@fabaff] - [#9457]) ([sensor.uber docs])
- Upgrade youtube_dl to 2017.9.15 ([@fabaff] - [#9456])
- DoorBird Component ([@Klikini] - [#9281]) ([doorbird docs]) ([binary_sensor.doorbird docs]) ([camera.doorbird docs]) ([switch.doorbird docs]) (new-platform)
- Fix recorder does not vacuum SQLite DB on purge ([@milanvo] - [#9469])
- fitbit fixes ([@happyleavesaoc] - [#9460]) ([sensor.fitbit docs]) (breaking change)
- Fix typo in services.yaml ([@mika] - [#9475])
- Upgrade pyasn1 to 0.3.5 and pyasn1-modules to 0.1.4 ([@fabaff] - [#9474]) ([notify.xmpp docs])
- Xiaomi Gateway: Allow static configuration of a gateway without discovery ([@syssi] - [#9464]) ([xiaomi_aqara docs])
- Added support for the DTE Energy Bridge v2 ([@Blender3D] - [#9431]) ([sensor.dte_energy_bridge docs])
- Telnet switch ([@multiholle] - [#8913]) ([switch.telnet docs]) (new-platform)
- Abode services, events, lights, cameras, automations, quick actions. ([@MisterWil] - [#9310]) ([abode docs]) ([alarm_control_panel.abode docs]) ([binary_sensor.abode docs]) ([camera.abode docs]) ([cover.abode docs]) ([light.abode docs]) ([lock.abode docs]) ([switch.abode docs]) (new-platform)
- Added satel_integra alarm panel and binary sensor platform ([@c-soft] - [#9336]) ([satel_integra docs]) ([alarm_control_panel.satel_integra docs]) ([binary_sensor.satel_integra docs]) (new-platform)
- Worx Landroid sensor ([@nilzen] - [#9416]) ([sensor.worxlandroid docs]) (new-platform)
- Fix universal media_player mute ([@colindunn] - [#9462]) ([media_player.universal docs])
- Small improvement of KNX Covers ([@Julius2342] - [#9476])
- Upgrade async_timeout to 1.4.0 ([@fabaff] - [#9488])
- Bump version of abodepy ([@MisterWil] - [#9491]) ([abode docs])
- Upgrade coinmarketcap to 4.1.1 ([@fabaff] - [#9490]) ([sensor.coinmarketcap docs])
- Upgrade blockchain to 1.4.0 ([@fabaff] - [#9489])
- Solve Recorder component failing when using Axis component ([@Kane610] - [#9293]) ([axis docs]) ([camera.axis docs])
- switch to pypi for xiaomi gw ([@danielhiversen] - [#9498]) ([xiaomi_aqara docs])
- renamed add_devices to async_add_devices according to hass naming scheme ([@Julius2342] - [#9485]) ([binary_sensor.knx docs]) ([climate.knx docs]) ([light.knx docs]) ([sensor.knx docs]) ([switch.knx docs])
- Revert "renamed add_devices to async_add_devices according to hass naming scheme (#9485)" ([@pvizeli] - [#9503]) ([alarm_control_panel.spc docs]) ([binary_sensor.knx docs]) ([binary_sensor.spc docs]) ([climate.knx docs]) ([light.knx docs]) ([sensor.citybikes docs]) ([sensor.knx docs]) ([sensor.worxlandroid docs]) ([switch.knx docs])
- LIFX: fix multi-zone color restore after effects ([@amelchio] - [#9492]) ([light.lifx docs])
- renamed add_devices to async_add_devices according to hass naming scheme (second try after failed #9485) ([@Julius2342] - [#9505]) ([alarm_control_panel.spc docs]) ([binary_sensor.knx docs]) ([binary_sensor.spc docs]) ([climate.knx docs]) ([light.knx docs]) ([sensor.citybikes docs]) ([sensor.knx docs]) ([sensor.worxlandroid docs]) ([switch.knx docs])
- Xiaomi pycryptodome ([@danielhiversen] - [#9511]) ([xiaomi_aqara docs])
- Bumped pyhomematic, additional device support ([@danielperna84] - [#9506]) ([homematic docs]) ([sensor.homematic docs])
- abode: Bump abodepy dependency to 0.11.7 ([@vickyg3] - [#9504]) ([abode docs])
- abode: Set device_type in state attributes ([@vickyg3] - [#9515]) ([abode docs])
- update xiaomi aqara lib ([@danielhiversen] - [#9520]) ([xiaomi_aqara docs])
- added services.yaml integration for input_boolean ([@skalavala] - [#9519]) ([input_boolean docs])
- Add reload service to python_script ([@doudz] - [#9512]) ([python_script docs])
- MQTT Binary Sensor - Add availability_topic for online/offline status ([@marthoc] - [#9507]) ([binary_sensor.mqtt docs])
- Fix typo within cover/knx https://github.com/XKNX/xknx/issues/64 ([@Julius2342] - [#9527]) ([cover.knx docs])
- LIFX: improve performance of setting multi-zone lights to a single color ([@amelchio] - [#9526]) ([light.lifx docs])
[#8913]: https://github.com/home-assistant/home-assistant/pull/8913
[#9056]: https://github.com/home-assistant/home-assistant/pull/9056
[#9129]: https://github.com/home-assistant/home-assistant/pull/9129
[#9162]: https://github.com/home-assistant/home-assistant/pull/9162
[#9222]: https://github.com/home-assistant/home-assistant/pull/9222
[#9227]: https://github.com/home-assistant/home-assistant/pull/9227
[#9236]: https://github.com/home-assistant/home-assistant/pull/9236
[#9246]: https://github.com/home-assistant/home-assistant/pull/9246
[#9264]: https://github.com/home-assistant/home-assistant/pull/9264
[#9281]: https://github.com/home-assistant/home-assistant/pull/9281
[#9283]: https://github.com/home-assistant/home-assistant/pull/9283
[#9286]: https://github.com/home-assistant/home-assistant/pull/9286
[#9293]: https://github.com/home-assistant/home-assistant/pull/9293
[#9301]: https://github.com/home-assistant/home-assistant/pull/9301
[#9310]: https://github.com/home-assistant/home-assistant/pull/9310
[#9315]: https://github.com/home-assistant/home-assistant/pull/9315
[#9336]: https://github.com/home-assistant/home-assistant/pull/9336
[#9338]: https://github.com/home-assistant/home-assistant/pull/9338
[#9355]: https://github.com/home-assistant/home-assistant/pull/9355
[#9357]: https://github.com/home-assistant/home-assistant/pull/9357
[#9364]: https://github.com/home-assistant/home-assistant/pull/9364
[#9365]: https://github.com/home-assistant/home-assistant/pull/9365
[#9378]: https://github.com/home-assistant/home-assistant/pull/9378
[#9386]: https://github.com/home-assistant/home-assistant/pull/9386
[#9389]: https://github.com/home-assistant/home-assistant/pull/9389
[#9390]: https://github.com/home-assistant/home-assistant/pull/9390
[#9391]: https://github.com/home-assistant/home-assistant/pull/9391
[#9394]: https://github.com/home-assistant/home-assistant/pull/9394
[#9400]: https://github.com/home-assistant/home-assistant/pull/9400
[#9403]: https://github.com/home-assistant/home-assistant/pull/9403
[#9404]: https://github.com/home-assistant/home-assistant/pull/9404
[#9408]: https://github.com/home-assistant/home-assistant/pull/9408
[#9411]: https://github.com/home-assistant/home-assistant/pull/9411
[#9413]: https://github.com/home-assistant/home-assistant/pull/9413
[#9415]: https://github.com/home-assistant/home-assistant/pull/9415
[#9416]: https://github.com/home-assistant/home-assistant/pull/9416
[#9417]: https://github.com/home-assistant/home-assistant/pull/9417
[#9422]: https://github.com/home-assistant/home-assistant/pull/9422
[#9423]: https://github.com/home-assistant/home-assistant/pull/9423
[#9424]: https://github.com/home-assistant/home-assistant/pull/9424
[#9426]: https://github.com/home-assistant/home-assistant/pull/9426
[#9427]: https://github.com/home-assistant/home-assistant/pull/9427
[#9428]: https://github.com/home-assistant/home-assistant/pull/9428
[#9431]: https://github.com/home-assistant/home-assistant/pull/9431
[#9435]: https://github.com/home-assistant/home-assistant/pull/9435
[#9436]: https://github.com/home-assistant/home-assistant/pull/9436
[#9437]: https://github.com/home-assistant/home-assistant/pull/9437
[#9438]: https://github.com/home-assistant/home-assistant/pull/9438
[#9439]: https://github.com/home-assistant/home-assistant/pull/9439
[#9440]: https://github.com/home-assistant/home-assistant/pull/9440
[#9443]: https://github.com/home-assistant/home-assistant/pull/9443
[#9446]: https://github.com/home-assistant/home-assistant/pull/9446
[#9448]: https://github.com/home-assistant/home-assistant/pull/9448
[#9452]: https://github.com/home-assistant/home-assistant/pull/9452
[#9453]: https://github.com/home-assistant/home-assistant/pull/9453
[#9456]: https://github.com/home-assistant/home-assistant/pull/9456
[#9457]: https://github.com/home-assistant/home-assistant/pull/9457
[#9458]: https://github.com/home-assistant/home-assistant/pull/9458
[#9460]: https://github.com/home-assistant/home-assistant/pull/9460
[#9462]: https://github.com/home-assistant/home-assistant/pull/9462
[#9463]: https://github.com/home-assistant/home-assistant/pull/9463
[#9464]: https://github.com/home-assistant/home-assistant/pull/9464
[#9469]: https://github.com/home-assistant/home-assistant/pull/9469
[#9474]: https://github.com/home-assistant/home-assistant/pull/9474
[#9475]: https://github.com/home-assistant/home-assistant/pull/9475
[#9476]: https://github.com/home-assistant/home-assistant/pull/9476
[#9485]: https://github.com/home-assistant/home-assistant/pull/9485
[#9488]: https://github.com/home-assistant/home-assistant/pull/9488
[#9489]: https://github.com/home-assistant/home-assistant/pull/9489
[#9490]: https://github.com/home-assistant/home-assistant/pull/9490
[#9491]: https://github.com/home-assistant/home-assistant/pull/9491
[#9492]: https://github.com/home-assistant/home-assistant/pull/9492
[#9498]: https://github.com/home-assistant/home-assistant/pull/9498
[#9503]: https://github.com/home-assistant/home-assistant/pull/9503
[#9504]: https://github.com/home-assistant/home-assistant/pull/9504
[#9505]: https://github.com/home-assistant/home-assistant/pull/9505
[#9506]: https://github.com/home-assistant/home-assistant/pull/9506
[#9507]: https://github.com/home-assistant/home-assistant/pull/9507
[#9511]: https://github.com/home-assistant/home-assistant/pull/9511
[#9512]: https://github.com/home-assistant/home-assistant/pull/9512
[#9515]: https://github.com/home-assistant/home-assistant/pull/9515
[#9519]: https://github.com/home-assistant/home-assistant/pull/9519
[#9520]: https://github.com/home-assistant/home-assistant/pull/9520
[#9526]: https://github.com/home-assistant/home-assistant/pull/9526
[#9527]: https://github.com/home-assistant/home-assistant/pull/9527
[@MisterWil]: https://github.com/MisterWil
[@pdanilew]: https://github.com/pdanilew
[@marthoc]: https://github.com/marthoc
[@spektren]: https://github.com/spektren
[@Blender3D]: https://github.com/Blender3D
[@Jay2645]: https://github.com/Jay2645
[@Julius2342]: https://github.com/Julius2342
[@Kane610]: https://github.com/Kane610
[@Klikini]: https://github.com/Klikini
[@MikeChristianson]: https://github.com/MikeChristianson
[@SqyD]: https://github.com/SqyD
[@TD22057]: https://github.com/TD22057
[@amelchio]: https://github.com/amelchio
[@antonym]: https://github.com/antonym
[@armills]: https://github.com/armills
[@arsaboo]: https://github.com/arsaboo
[@astone123]: https://github.com/astone123
[@bachya]: https://github.com/bachya
[@balloob]: https://github.com/balloob
[@c-soft]: https://github.com/c-soft
[@colindunn]: https://github.com/colindunn
[@danielhiversen]: https://github.com/danielhiversen
[@danielperna84]: https://github.com/danielperna84
[@diplix]: https://github.com/diplix
[@doudz]: https://github.com/doudz
[@fabaff]: https://github.com/fabaff
[@fanaticDavid]: https://github.com/fanaticDavid
[@fanthos]: https://github.com/fanthos
[@foxel]: https://github.com/foxel
[@giangvo]: https://github.com/giangvo
[@happyleavesaoc]: https://github.com/happyleavesaoc
[@hufman]: https://github.com/hufman
[@jlmcgehee21]: https://github.com/jlmcgehee21
[@johnboiles]: https://github.com/johnboiles
[@kylehendricks]: https://github.com/kylehendricks
[@michaelarnauts]: https://github.com/michaelarnauts
[@mika]: https://github.com/mika
[@milanvo]: https://github.com/milanvo
[@morberg]: https://github.com/morberg
[@multiholle]: https://github.com/multiholle
[@mw-white]: https://github.com/mw-white
[@nilzen]: https://github.com/nilzen
[@pfalcon]: https://github.com/pfalcon
[@postlund]: https://github.com/postlund
[@pvizeli]: https://github.com/pvizeli
[@rbflurry]: https://github.com/rbflurry
[@rollbrettler]: https://github.com/rollbrettler
[@skalavala]: https://github.com/skalavala
[@snjoetw]: https://github.com/snjoetw
[@syssi]: https://github.com/syssi
[@tcastberg]: https://github.com/tcastberg
[@tinloaf]: https://github.com/tinloaf
[@turbokongen]: https://github.com/turbokongen
[@vickyg3]: https://github.com/vickyg3
[@wickerwaka]: https://github.com/wickerwaka
[abode docs]: /components/abode/
[alarm_control_panel.abode docs]: /components/alarm_control_panel.abode/
[alarm_control_panel.manual docs]: /components/alarm_control_panel.manual/
[alarm_control_panel.satel_integra docs]: /components/alarm_control_panel.satel_integra/
[alarm_control_panel.spc docs]: /components/alarm_control_panel.spc/
[alexa docs]: /components/alexa/
[api docs]: /components/api/
[apple_tv docs]: /components/apple_tv/
[axis docs]: /components/axis/
[binary_sensor.abode docs]: /components/binary_sensor.abode/
[binary_sensor.bayesian docs]: /components/binary_sensor.bayesian/
[binary_sensor.doorbird docs]: /components/binary_sensor.doorbird/
[binary_sensor.knx docs]: /components/binary_sensor.knx/
[binary_sensor.mqtt docs]: /components/binary_sensor.mqtt/
[binary_sensor.satel_integra docs]: /components/binary_sensor.satel_integra/
[binary_sensor.spc docs]: /components/binary_sensor.spc/
[calendar.todoist docs]: /components/calendar.todoist/
[camera.abode docs]: /components/camera.abode/
[camera.axis docs]: /components/camera.axis/
[camera.doorbird docs]: /components/camera.doorbird/
[camera.uvc docs]: /components/camera.uvc/
[climate.knx docs]: /components/climate.knx/
[config.zwave docs]: /components/config.zwave/
[cover.abode docs]: /components/cover.abode/
[cover.knx docs]: /components/cover.knx/
[device_tracker.aruba docs]: /components/device_tracker.aruba/
[device_tracker.automatic docs]: /components/device_tracker.automatic/
[device_tracker.keenetic_ndms2 docs]: /components/device_tracker.keenetic_ndms2/
[device_tracker.owntracks docs]: /components/device_tracker.owntracks/
[doorbird docs]: /components/doorbird/
[emulated_hue docs]: /components/emulated_hue/
[homematic docs]: /components/homematic/
[input_boolean docs]: /components/input_boolean/
[light.abode docs]: /components/light.abode/
[light.knx docs]: /components/light.knx/
[light.lifx docs]: /components/light.lifx/
[light.template docs]: /components/light.template/
[light.tradfri docs]: /components/light.tradfri/
[light.xiaomi_philipslight docs]: /components/light.xiaomi_philipslight/
[lock.abode docs]: /components/lock.abode/
[media_player.apple_tv docs]: /components/media_player.apple_tv/
[media_player.mpd docs]: /components/media_player.mpd/
[media_player.russound_rio docs]: /components/media_player.russound_rio/
[media_player.universal docs]: /components/media_player.universal/
[mqtt_statestream docs]: /components/mqtt_statestream/
[notify.html5 docs]: /components/notify.html5/
[notify.xmpp docs]: /components/notify.xmpp/
[python_script docs]: /components/python_script/
[satel_integra docs]: /components/satel_integra/
[sensor.airvisual docs]: /components/sensor.airvisual/
[sensor.citybikes docs]: /components/sensor.citybikes/
[sensor.coinmarketcap docs]: /components/sensor.coinmarketcap/
[sensor.dte_energy_bridge docs]: /components/sensor.dte_energy_bridge/
[sensor.fitbit docs]: /components/sensor.fitbit/
[sensor.homematic docs]: /components/sensor.homematic/
[sensor.knx docs]: /components/sensor.knx/
[sensor.mopar docs]: /components/sensor.mopar/
[sensor.onewire docs]: /components/sensor.onewire/
[sensor.swiss_public_transport docs]: /components/sensor.swiss_public_transport/
[sensor.systemmonitor docs]: /components/sensor.systemmonitor/
[sensor.uber docs]: /components/sensor.uber/
[sensor.worxlandroid docs]: /components/sensor.worxlandroid/
[switch.abode docs]: /components/switch.abode/
[switch.broadlink docs]: /components/switch.broadlink/
[switch.doorbird docs]: /components/switch.doorbird/
[switch.knx docs]: /components/switch.knx/
[switch.rest docs]: /components/switch.rest/
[switch.telnet docs]: /components/switch.telnet/
[vacuum docs]: /components/vacuum/
[vacuum.mqtt docs]: /components/vacuum.mqtt/
[vacuum.xiaomi docs]: /components/vacuum.xiaomi/
[xiaomi docs]: /components/xiaomi/
[xiaomi_aqara docs]: /components/xiaomi_aqara/
[zwave docs]: /components/zwave/
[forum]: https://community.home-assistant.io/
[issue]: https://github.com/home-assistant/home-assistant/issues
[discord]: https://discord.gg/c5DvZ4e

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB