(%4tEi%i6RuG|
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
U36jH=e^y9dR^?-jv{}f10Xu
Date: Tue, 1 May 2018 22:26:02 +0200
Subject: [PATCH 29/70] MQTT Sensor Device Class Docs (#5252)
* MQTT Sensor Device Class
* Remove formatting
* Other small fix
---
source/_components/sensor.mqtt.markdown | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/source/_components/sensor.mqtt.markdown b/source/_components/sensor.mqtt.markdown
index 5f36c9de1d..b6e5c4b0d2 100644
--- a/source/_components/sensor.mqtt.markdown
+++ b/source/_components/sensor.mqtt.markdown
@@ -81,9 +81,14 @@ json_attributes:
reqired: false
type: list, string
unique_id:
- description: "An id that uniquely identifies this sensor. If 2 sensors have the same unique id, Home Assistant will raise an exception.**"
+ description: "An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception."
required: false
type: string
+device_class:
+ description: The type/class of the sensor to set the icon in the frontend.
+ required: false
+ type: device_class
+ default: None
{% endconfiguration %}
## {% linkable_title Examples %}
From 851f0f29ddeafd21690016962a73e38abd8a7a30 Mon Sep 17 00:00:00 2001
From: GoSpursGoNL
Date: Tue, 1 May 2018 22:42:15 +0200
Subject: [PATCH 30/70] Update deconz.markdown
I found that the credentials are no longer stored in deconz.conf but instead in .config_entries.json
---
source/_components/deconz.markdown | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/source/_components/deconz.markdown b/source/_components/deconz.markdown
index ad79ab5225..d1fde01521 100644
--- a/source/_components/deconz.markdown
+++ b/source/_components/deconz.markdown
@@ -34,7 +34,7 @@ ha_iot_class: "Local Push"
Home Assistant will automatically discover deCONZ presence on your network, if `discovery:` is present in your `configuration.yaml` file.
-If you don't have the API key, you can generate an API key for deCONZ by using the one-click functionality similar to Philips Hue. Go to **Menu** -> **Settings** -> **Unlock Gateway** in deCONZ and then use the deCONZ configurator in Home Assistant frontend to create an API key. When you've generated the API key from Home Assistant, the API key will be stored in `deconz.conf` inside the `.homeassistant` folder.
+If you don't have the API key, you can generate an API key for deCONZ by using the one-click functionality similar to Philips Hue. Go to **Menu** -> **Settings** -> **Unlock Gateway** in deCONZ and then use the deCONZ configurator in Home Assistant frontend to create an API key. When you've generated the API key from Home Assistant, the API key will be stored in `.config_entries.json` inside the `.homeassistant` folder.
You can add the following to your configuration.yaml file if you are not using the `discovery:` component:
From fd5f1fc725042a4226526821b2531ae9f5cf45a9 Mon Sep 17 00:00:00 2001
From: giangvo
Date: Thu, 3 May 2018 12:39:04 +1000
Subject: [PATCH 31/70] add document for fan template (#5296)
---
source/_components/fan.template.markdown | 96 ++++++++++++++++++++++++
1 file changed, 96 insertions(+)
create mode 100644 source/_components/fan.template.markdown
diff --git a/source/_components/fan.template.markdown b/source/_components/fan.template.markdown
new file mode 100644
index 0000000000..2b7a984508
--- /dev/null
+++ b/source/_components/fan.template.markdown
@@ -0,0 +1,96 @@
+---
+layout: page
+title: "Template Fan"
+description: "Instructions how to setup the Template fans within Home Assistant."
+date: 2018-05-03 09:00
+sidebar: true
+comments: false
+sharing: true
+footer: true
+ha_category: Fan
+ha_release: 0.69
+ha_iot_class: "Local Push"
+logo: home-assistant.png
+---
+
+The `template` platform creates fans that combine components and provides the
+ability to run scripts or invoke services for each of the turn_on, turn_off, set_speed, and
+set_oscillating commands of a fan.
+
+To enable Template Fans in your installation, add the following to your
+`configuration.yaml` file:
+
+{% raw %}
+```yaml
+# Example configuration.yaml entry
+fan:
+ - platform: template
+ fans:
+ bedroom_fan:
+ friendly_name: "Bedroom fan"
+ value_template: "{{ states('input_boolean.state') }}"
+ speed_template: "{{ states('input_select.speed') }}"
+ oscillating_template: "{{ states('input_select.osc') }}"
+ turn_on:
+ service: script.fan_on
+ turn_off:
+ service: script.fan_off
+ set_speed:
+ service: script.fan_speed
+ data_template:
+ speed: "{{ speed }}"
+ set_oscillating:
+ service: script.fan_oscillating
+ data_template:
+ oscillating: "{{ oscillating }}"
+ speeds:
+ - '1'
+ - '2'
+ - '3'
+```
+{% endraw %}
+
+{% configuration %}
+ fans:
+ description: List of your fans.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ value_template:
+ description: "Defines a template to get the state of the fan. Valid value: 'on'/'off'
+ required: true
+ type: template
+ speed_template:
+ description: Defines a template to get the speed of the fan.
+ required: false
+ type: template
+ oscillating_template:
+ description: Defines a template to get the osc state of the fan. Valid value: True/False
+ required: false
+ type: template
+ turn_on:
+ description: Defines an action to run when the fan is turned on.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action to run when the fan is turned off.
+ required: true
+ type: action
+ set_speed:
+ description: Defines an action to run when the fan is given a speed command.
+ required: false
+ type: action
+ set_oscillating:
+ description: Defines an action to run when the fan is given a osc state command.
+ required: false
+ type: action
+ speeds:
+ description: List of speeds the fan is capable of running at.
+ required: false
+ type: string list
+ default: ['low', 'medium', 'high']
+{% endconfiguration %}
From 39720a4de26328632d1ec34d7d6e51ed4faadafc Mon Sep 17 00:00:00 2001
From: Ian
Date: Thu, 3 May 2018 07:23:52 -0500
Subject: [PATCH 32/70] Create configuration_yaml_by_apocrathia.markdown
(#5291)
Adding my own Home Assistant configuration repository to the cookbook.
---
.../configuration_yaml_by_apocrathia.markdown | 12 ++++++++++++
1 file changed, 12 insertions(+)
create mode 100644 source/_cookbook/configuration_yaml_by_apocrathia.markdown
diff --git a/source/_cookbook/configuration_yaml_by_apocrathia.markdown b/source/_cookbook/configuration_yaml_by_apocrathia.markdown
new file mode 100644
index 0000000000..6ac2ccd329
--- /dev/null
+++ b/source/_cookbook/configuration_yaml_by_apocrathia.markdown
@@ -0,0 +1,12 @@
+---
+layout: page
+title: "Configuration.yaml by Apocrathia"
+description: ""
+date: 2018-05-02 12:40
+sidebar: true
+comments: false
+sharing: true
+footer: true
+ha_category: Example configuration.yaml
+ha_external_link: https://github.com/Apocrathia/home-assistant-config/
+---
From 8f8e2e9a3dc60c9eb8fdf72382e4a0127ec51d6d Mon Sep 17 00:00:00 2001
From: Greg Stevenson
Date: Thu, 3 May 2018 13:29:43 +0100
Subject: [PATCH 33/70] Update URL to Lets Encrypt blog (#5295)
The current link takes you to a page which tells you it is outdated.
---
.../ecosystem/certificates/tls_self_signed_certificate.markdown | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown b/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown
index d7c145fe8b..2aab9deb6d 100644
--- a/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown
+++ b/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown
@@ -11,7 +11,7 @@ redirect_from: /cookbook/tls_self_signed_certificate/
---
If your Home Assistant instance is only accessible from your local network you can still protect the communication between your browsers and the frontend with SSL/TLS.
-[Let's encrypt]({{site_root}}/blog/2015/12/13/setup-encryption-using-lets-encrypt/) will only work if you have a DNS entry and remote access is allowed.
+[Let's encrypt]({{site_root}}/blog/2017/09/27/effortless-encryption-with-lets-encrypt-and-duckdns/) will only work if you have a DNS entry and remote access is allowed.
The solution is to use a self-signed certificate. As you most likely don't have a certification authority (CA) your browser will complain about the security. If you have a CA then this will not be an issue.
To create a certificate locally, you need the [OpenSSL](https://www.openssl.org/) command-line tool.
From 04a3b83a53b80ed58678209aa890ea291631bcfe Mon Sep 17 00:00:00 2001
From: Tod Schmidt
Date: Thu, 3 May 2018 14:21:34 -0400
Subject: [PATCH 34/70] Update snips.markdown (#5293)
* Update snips.markdown
Added new examples and link to discord and new documentation
* Update snips.markdown
* Fix formatting
---
source/_components/snips.markdown | 94 ++++++++++++++++++++++++++-----
1 file changed, 81 insertions(+), 13 deletions(-)
diff --git a/source/_components/snips.markdown b/source/_components/snips.markdown
index da7ed21417..cc2aa3248c 100644
--- a/source/_components/snips.markdown
+++ b/source/_components/snips.markdown
@@ -2,7 +2,7 @@
layout: page
title: "Snips"
description: "Instructions on how to integrate Snips within Home Assistant."
-date: 2017-06-22 12:00
+date: 2018-05-02 12:00
sidebar: true
comments: false
sharing: true
@@ -14,7 +14,7 @@ ha_release: 0.48
The [Snips Voice Platform](https://www.snips.ai) allows users to add powerful voice assistants to their Raspberry Pi devices without compromising on privacy. It runs 100% on-device, and does not require an internet connection. It features Hotword Detection, Automatic Speech Recognition (ASR), Natural Language Understanding (NLU) and Dialog Management.
-The latest documentation can be found here: [Snips Platform Documentation](https://github.com/snipsco/snips-platform-documentation/wiki).
+The latest documentation can be found here: [Snips Platform Documentation](https://snips.gitbook.io/documentation/).

@@ -166,11 +166,11 @@ SetTimer:
```
{% endraw %}
-### Sending TTS Notifications
+### {% linkable_title Sending TTS Notifications %}
You can send TTS notifications to Snips using the snips.say and snips.say_action services. Say_action starts a session and waits for user response, "Would you like me to close the garage door?", "Yes, close the garage door".
-#### {% linkable_title Service `snips/say` %}
+#### {% linkable_title Service `snips.say` %}
| Service data attribute | Optional | Description |
|------------------------|----------|--------------------------------------------------------|
@@ -178,7 +178,7 @@ You can send TTS notifications to Snips using the snips.say and snips.say_action
| `site_id` | yes | Site to use to start session. |
| `custom_data` | yes | custom data that will be included with all messages in this session. |
-#### {% linkable_title Service `snips/say_action` %}
+#### {% linkable_title Service `snips.say_action` %}
| Service data attribute | Optional | Description |
|------------------------|----------|--------------------------------------------------------|
@@ -188,19 +188,48 @@ You can send TTS notifications to Snips using the snips.say and snips.say_action
| `can_be_enqueued` | yes | If True, session waits for an open session to end, if False session is dropped if one is running. |
| `intent_filter` | yes | Array of Strings - A list of intents names to restrict the NLU resolution to on the first query. |
-#### Configuration Examples
+
+### {% linkable_title Snips Support %}
+
+There is an active [discord](https://discordapp.com/invite/3939Kqx) channel for further support.
+
+### {% linkable_title Configuration Examples %}
+
+#### {% linkable_title Turn on a light %}
```yaml
-script:
+intent_script:
turn_on_light:
- sequence:
- service: script.turn_on_light
- service: snips.say
- data:
- text: 'OK, the light is now on'
+ speech:
+ type: plain
+ text: 'OK, closing the garage door'
+ action:
+ service: light.turn_on
+```
+##### {% linkable_title Open a Garage Door %}
+
+```yaml
+intent_script:
+ OpenGarageDoor:
+ speech:
+ type: plain
+ text: 'OK, opening the garage door'
+ action:
+ - service: cover.open_cover
+ data:
+ entity_id: garage_door
+```
+
+##### {% linkable_title Intiating a query %}
+
+Here is a more complex example. The automation is triggered if the garage door is open for more than 10 minutes.
+Snips will then ask you if you want to close it and if you respond with something like "Close the garage door" it
+will do so. Unfortunately there is no builtin support for yes and no responses.
+
+```yaml
automation:
- query_garage_door:
+ garage_door_has_been_open:
trigger:
- platform: state
entity_id: binary_sensor.my_garage_door_sensor
@@ -224,3 +253,42 @@ intent_script:
action:
- service: script.garage_door_close
```
+
+##### {% linkable_title Weather %}
+
+So now you can open and close your garage door, let's check the weather. Add the Weather by Snips Skill to your assistant.
+
+Create a weather sensor, in this example (Dark Sky)[/components/sensor.darksky/] and the api_key in the secrets file.
+
+```yaml
+- platform: darksky
+ name: "Dark Sky Weather"
+ api_key: !secret dark_sky_key
+ update_interval:
+ minutes: 10
+ monitored_conditions:
+ - summary
+ - hourly_summary
+ - temperature
+ - temperature_max
+ - temperature_min
+```
+
+Then create this intent_script.yaml file in your config directory
+
+{% raw %}
+```yaml
+intent_script:
+ searchWeatherForecast:
+ speech:
+ type: plain
+ text: >
+ The weather is currently
+ {{ states('sensor.dark_sky_weather_temperature') | round(0) }}
+ degrees outside and {{ states('sensor.dark_sky_weather_summary') }}.
+ The high today will be
+ {{ states('sensor.dark_sky_weather_daily_high_temperature') | round(0)}}
+ and {{ states('sensor.dark_sky_weather_hourly_summary') }}
+```
+{% endraw %}
+
From b3288f13cdb66aae8fde8580ac4935acb3c9d859 Mon Sep 17 00:00:00 2001
From: Louis Orleans
Date: Thu, 3 May 2018 12:00:02 -0700
Subject: [PATCH 35/70] Add specific instructions for Meraki device tracker
(#5297)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 📝 add specific instructions for Meraki device tracker
The current instructions aren't really complete, and require you to have both an understanding of how the Home Assistant API works, as well as be able to read through the code for the Meraki component to find the API endpoint you're supposed to use.
* Update formatting
---
.../device_tracker.meraki.markdown | 22 ++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/source/_components/device_tracker.meraki.markdown b/source/_components/device_tracker.meraki.markdown
index a88aa1d713..cbe481d39e 100644
--- a/source/_components/device_tracker.meraki.markdown
+++ b/source/_components/device_tracker.meraki.markdown
@@ -11,8 +11,21 @@ logo: meraki.png
ha_category: Presence Detection
ha_release: "0.60"
---
-Use your `Meraki AP` as device tracker. Note that Meraki will see all devices, not only connected to the network.
-Follow instructions [here](https://meraki.cisco.com/technologies/location-analytics-api) how to enable Location Analytics.
+
+Use your Meraki AP as device tracker. Note that Meraki will see all devices, not only connected to the network.
+
+### {% linkable_title Prerequisites %}
+
+1. Go to Network-wide/General page, and find the Location and scanning section.
+1. Make sure analytics and Scanning API are both enabled.
+1. Make note of the Validator string, which will be used in the `device_tracker` configuration.
+1. Click **Add a Post URL**:
+ 1. Set the Post URL to `https://YOUR_HOSTNAME/api/meraki?api_password=YOUR_HASS_PASSWORD`
+ 1. Set the Secret to a randomly generated string, and make note of it for the `device_tracker` configuration.
+ 1. Make sure the API Version is set to `2.0`.
+ 1. Hit **Save** in the bottom right of the page.
+
+## {% linkable_title Configuration %}
After you configure access to the Meraki CMX API, add the following to your `configuration.yaml` file:
@@ -24,14 +37,13 @@ device_tracker:
validator: meraki_validator
```
-
{% configuration %}
secret:
- description: Secret code added in Meraki
+ description: Secret code added in Meraki.
required: true
type: string
validator:
- description: Validation string from Meraki
+ description: Validation string from Meraki.
required: true
type: string
{% endconfiguration %}
From fe352e7dd60558a9292bfd2453da86793b6743ac Mon Sep 17 00:00:00 2001
From: escoand
Date: Thu, 3 May 2018 21:00:17 +0200
Subject: [PATCH 36/70] Add description of discovery (#5286)
* Add description of discovery
* Fix copy&paste
* Update link
---
source/_components/media_player.volumio.markdown | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/source/_components/media_player.volumio.markdown b/source/_components/media_player.volumio.markdown
index f8945adc88..26053822e8 100644
--- a/source/_components/media_player.volumio.markdown
+++ b/source/_components/media_player.volumio.markdown
@@ -12,12 +12,11 @@ ha_category: Media Player
ha_release: 0.41
---
-The `Volumio` platform allows you to control a [Volumio](http://volumio.org) media player
-from Home Assistant.
+The `Volumio` platform allows you to control a [Volumio](http://volumio.org) media player from Home Assistant.
+The preferred way to set up the Volumio platform is by enabling the [discovery component](/components/discovery/).
-To add a Volumio player to your installation, add the following to
-your `configuration.yaml` file.
+In case the discovery does not work, or you need specific configuration variables, you can add the following to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
From bc01c98712599057c74dbb08555e0f91848dd096 Mon Sep 17 00:00:00 2001
From: Robin
Date: Thu, 3 May 2018 20:05:52 +0100
Subject: [PATCH 37/70] Adds info on whitelist_external_dirs (#5213)
whitelist_external_dirs needs to be mentioned
---
source/_components/folder_watcher.markdown | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/source/_components/folder_watcher.markdown b/source/_components/folder_watcher.markdown
index 88b19937e0..df9041ed35 100644
--- a/source/_components/folder_watcher.markdown
+++ b/source/_components/folder_watcher.markdown
@@ -13,13 +13,14 @@ ha_iot_class: "Local Polling"
ha_release: 0.67
---
-This component adds [Watchdog](https://pythonhosted.org/watchdog/) file system monitoring, publishing events on the Home Assistant bus on the creation/deletion/modification of files. The monitored `event_type` are:
+This component adds [Watchdog](https://pythonhosted.org/watchdog/) file system monitoring, publishing events on the Home Assistant bus on the creation/deletion/modification of files within configured folders. The monitored `event_type` are:
+
* `created`
* `deleted`
* `modified`
* `moved`
-Note that by default folder monitoring is recursive, meaning that the contents of sub-folders are also monitored.
+Configured folders must be added to [whitelist_external_dirs](/docs/configuration/basic/). Note that by default folder monitoring is recursive, meaning that the contents of sub-folders are also monitored.
To enable the Folder Watcher component in your installation, add the following to your `configuration.yaml` file:
From 334a06b4d666c5880c08703e9e8d0b9b0804a60b Mon Sep 17 00:00:00 2001
From: Fabian Affolter
Date: Thu, 3 May 2018 22:01:32 +0200
Subject: [PATCH 38/70] Various fixes (#5302)
---
.../alarm_control_panel.alarmdecoder.markdown | 4 +-
.../_components/binary_sensor.hive.markdown | 9 +--
.../_components/binary_sensor.random.markdown | 2 +
.../binary_sensor.workday.markdown | 2 +-
source/_components/calendar.google.markdown | 6 +-
source/_components/climate.hive.markdown | 12 ++--
source/_components/google_assistant.markdown | 2 +
source/_components/hive.markdown | 6 +-
source/_components/light.hive.markdown | 11 ++--
.../_components/media_player.onkyo.markdown | 2 +
source/_components/notify.clicksend.markdown | 5 +-
source/_components/sensor.hive.markdown | 9 +--
source/_components/sensor.sht31.markdown | 2 +
.../sensor.thethingsnetwork.markdown | 4 ++
source/_components/switch.hive.markdown | 7 ++-
source/_components/switch.rainbird.markdown | 2 +
source/_components/switch.rest.markdown | 4 +-
source/_components/tts.amazon_polly.markdown | 63 ++++++++++++++-----
18 files changed, 106 insertions(+), 46 deletions(-)
diff --git a/source/_components/alarm_control_panel.alarmdecoder.markdown b/source/_components/alarm_control_panel.alarmdecoder.markdown
index 476773df3e..98810aaa2a 100644
--- a/source/_components/alarm_control_panel.alarmdecoder.markdown
+++ b/source/_components/alarm_control_panel.alarmdecoder.markdown
@@ -27,7 +27,9 @@ The Alarm Decoder component gives you access to several services for you to cont
- `alarm_disarm`: Disarms the alarm from any state. Also clears a `check_zone` flag after an alarm was triggered.
- `alarmdecoder_alarm_toggle_chime`: Toggles the alarm's chime state.
-**Note**: `alarm_arm_custom_bypass` and `alarm_trigger`, while available in the services list in Home Assistant, are not currently implemented in the Alarm Decoder component.
+
+`alarm_arm_custom_bypass` and `alarm_trigger`, while available in the services list in Home Assistant, are not currently implemented in the Alarm Decoder platform.
+
### {% linkable_title Attributes %}
diff --git a/source/_components/binary_sensor.hive.markdown b/source/_components/binary_sensor.hive.markdown
index ffba6e29d1..49486d62d7 100644
--- a/source/_components/binary_sensor.hive.markdown
+++ b/source/_components/binary_sensor.hive.markdown
@@ -14,11 +14,12 @@ ha_iot_class: "Cloud Polling"
---
-The 'hive' binary sensor component integrates your Hive sensors into Home Assistant.
+The `hive` binary sensor component integrates your Hive sensors into Home Assistant.
-The Hive binary sensor component supports the following Hive products:
-- **Hive Window or Door Sensor**
-- **Hive Motion Sensor**
+The platform supports the following Hive products:
+
+- Hive Window or Door Sensor
+- Hive Motion Sensor
diff --git a/source/_components/binary_sensor.random.markdown b/source/_components/binary_sensor.random.markdown
index d8a0129120..b1208681a8 100644
--- a/source/_components/binary_sensor.random.markdown
+++ b/source/_components/binary_sensor.random.markdown
@@ -16,6 +16,8 @@ ha_release: 0.57
The `random` binary sensor platform is creating random states (`True`, 1, `on` or `False`, 0, `off`). This can be useful if you want to test automation rules. It generates a new state every time it is polled.
+## {% linkable_title Configuration %}
+
To enable the random binary sensor, add the following lines to your `configuration.yaml`:
```yaml
diff --git a/source/_components/binary_sensor.workday.markdown b/source/_components/binary_sensor.workday.markdown
index b63d8f778d..1ba1f8bd8c 100644
--- a/source/_components/binary_sensor.workday.markdown
+++ b/source/_components/binary_sensor.workday.markdown
@@ -26,7 +26,7 @@ To enable the `workday` sensor in your installation, add the following to your `
binary_sensor:
- platform: workday
country: DE
- workdays: [ mon, wed, fri ]
+ workdays: [mon, wed, fri]
```
Configuration variables:
diff --git a/source/_components/calendar.google.markdown b/source/_components/calendar.google.markdown
index 5999dc48ac..9825c5f9cc 100644
--- a/source/_components/calendar.google.markdown
+++ b/source/_components/calendar.google.markdown
@@ -16,7 +16,7 @@ ha_release: 0.33
The `google` calendar platform allows you to connect to your [Google Calendars](https://calendar.google.com) and generate binary sensors. The sensors created can trigger based on any event on the calendar or only for matching events. When you first setup this component it will generate a new configuration file `google_calendars.yaml` that will contain information about all of the calendars you can see.
-### {% linkable_title Prerequisites %}
+## {% linkable_title Prerequisites %}
Generate a Client ID and Client Secret on [Google Developers Console](https://console.developers.google.com/start/api?id=calendar).
@@ -30,7 +30,7 @@ Generate a Client ID and Client Secret on [Google Developers Console](https://co
1. Save the client ID and secret as you will need to put these in your `configuration.yaml` file.
1. Click on "Library", search for "Google Calendar API" and enable it.
-### {% linkable_title Basic Setup %}
+## {% linkable_title Configuration %}
To integrate Google Calendar in Home Assistant, add the following section to your `configuration.yaml` file:
@@ -61,7 +61,7 @@ The next steps will require you to have Home Assistant running.
After you have it running complete the Google authentication that pops up. It will give you a URL and a code to enter. This will grant your Home Assistant service access to all the Google Calendars that the account you authenticate with can read. This is a Read-Only view of these calendars.
-### {% linkable_title Calendar Configuration %}
+## {% linkable_title Calendar Configuration %}
Editing the `google_calendars.yaml` file.
diff --git a/source/_components/climate.hive.markdown b/source/_components/climate.hive.markdown
index dd3fd41ca5..12f4688553 100644
--- a/source/_components/climate.hive.markdown
+++ b/source/_components/climate.hive.markdown
@@ -14,13 +14,15 @@ ha_iot_class: "Cloud Polling"
---
-The 'hive' climate component integrates your Hive thermostat and hot water into Home Assistant, enabling control of setting the **mode** and setting the **target temperature**.
+The `hive` climate platform integrates your Hive thermostat and hot water into Home Assistant, enabling control of setting the **mode** and setting the **target temperature**.
+
A short boost for Hive Heating or Hive Hot water can be set by using the **Aux Heat** function, this will turn on the boost feature for Hive Heating or Hive Hot water for 30 minutes at 0.5 degrees higher than the current temperature.
-The Hive climate component supports the following Hive products:
-- **Hive Active Heating**
-- **Hive Multizone**
-- **Hot water control**
+The platform supports the following Hive products:
+
+- Hive Active Heating
+- Hive Multizone
+- Hot water control
diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown
index f196288c7a..edd0b8ebb1 100644
--- a/source/_components/google_assistant.markdown
+++ b/source/_components/google_assistant.markdown
@@ -25,6 +25,8 @@ The Google Assistant component requires a bit more setup than most due to the wa
To use Google Assistant, your Home Assistant configuration has to be externally accessible with a hostname and SSL certificate. If you haven't already configured that, you should do so before continuing.
+## {% linkable_title Configuration %}
+
To enable this, add the following lines to your `configuration.yaml` file:
```yaml
diff --git a/source/_components/hive.markdown b/source/_components/hive.markdown
index fbe0d5b17f..16f2a77ac4 100644
--- a/source/_components/hive.markdown
+++ b/source/_components/hive.markdown
@@ -14,11 +14,13 @@ ha_iot_class: "Cloud Polling"
---
-This Hive component is the main component to set up and integrate all supported Hive devices. Once configured with the minimum required details it will detect and add all your Hive devices into Home Assistant, including support for multizone heating.
+The `hive` component is the main component to set up and integrate all supported Hive devices. Once configured with the minimum required details it will detect and add all your Hive devices into Home Assistant, including support for multizone heating.
This component uses the unofficial API used in the official Hive website [https://my.hivehome.com](https://my.hivehome.com), and you will need to use the same Username and Password you use on the Hive website to configure this Hive component in Home Assistant.
-To add your Hive devices into your Home Assistant installation, using the default scan_interval, add the following to your 'configuration.yaml' file:
+
+
+To add your Hive devices into your Home Assistant installation, add the following to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
diff --git a/source/_components/light.hive.markdown b/source/_components/light.hive.markdown
index 78daeb5641..44221f6371 100644
--- a/source/_components/light.hive.markdown
+++ b/source/_components/light.hive.markdown
@@ -14,12 +14,13 @@ ha_iot_class: "Cloud Polling"
---
-The 'hive' light component integrates your Hive lights into Home Assistant, enabling control of various settings, depending on the model light.
+The `hive` light platform integrates your Hive lights into Home Assistant, enabling control of various settings, depending on the model light.
-The Hive light component supports the following Hive products:
-- **Hive Active Light Dimmable**
-- **Hive Active Light Cool to Warm White**
-- **Hive Active Light Color Changing**
+The platform supports the following Hive products:
+
+- Hive Active Light Dimmable
+- Hive Active Light Cool to Warm White
+- Hive Active Light Color Changing
diff --git a/source/_components/media_player.onkyo.markdown b/source/_components/media_player.onkyo.markdown
index 0c6dc4d2d3..13a50152dc 100644
--- a/source/_components/media_player.onkyo.markdown
+++ b/source/_components/media_player.onkyo.markdown
@@ -16,6 +16,8 @@ ha_iot_class: "Local Polling"
The `onkyo` platform allows you to control a [Onkyo](http://www.onkyo.com/) and some recent [Pioneer](http://www.pioneerelectronics.com) receivers from Home Assistant. Please be aware that you need to enable "Network Standby" for this component to work in your Hardware.
+## {% linkable_title Configuration %}
+
To add an Onkyo or Pioneer receiver to your installation, add the following to your `configuration.yaml` file:
```yaml
diff --git a/source/_components/notify.clicksend.markdown b/source/_components/notify.clicksend.markdown
index a5f9d587fd..8d619617b4 100644
--- a/source/_components/notify.clicksend.markdown
+++ b/source/_components/notify.clicksend.markdown
@@ -15,9 +15,12 @@ ha_release: 0.48
The `clicksend` platform uses [ClickSend](https://clicksend.com) to deliver notifications from Home Assistant.
-### Get your ClickSend API Credentials
+## {% linkable_title Prerequisites %}
+
Go to your [ClickSend Dashboard](https://dashboard.clicksend.com) section and create your new project. After creating your project, you should now be able to obtain your `username` and `api_key`.
+## {% linkable_title Configuration %}
+
To add ClickSend to your installation, add the following to your Home Assistant `configuration.yaml` file:
```yaml
diff --git a/source/_components/sensor.hive.markdown b/source/_components/sensor.hive.markdown
index 4fa0221f31..0d4d087516 100644
--- a/source/_components/sensor.hive.markdown
+++ b/source/_components/sensor.hive.markdown
@@ -14,11 +14,12 @@ ha_iot_class: "Cloud Polling"
---
-The 'hive' sensor component exposes hive data as a sensor.
+The `hive` sensor component exposes Hive data as a sensor.
-The Hive sensor component exposes the following sensors:
-- **Hive Hub Online Status**
-- **Hive Outside Temperature**
+The platform exposes the following sensors:
+
+- Hive Hub Online Status
+- Hive Outside Temperature
Full configuration details can be found on the main [Hive component](/components/hive/) page.
diff --git a/source/_components/sensor.sht31.markdown b/source/_components/sensor.sht31.markdown
index 73660bbbdc..7adbfc2cee 100644
--- a/source/_components/sensor.sht31.markdown
+++ b/source/_components/sensor.sht31.markdown
@@ -15,6 +15,8 @@ ha_iot_class: "Local Polling"
The `sht31` sensor platform allows you to get the current temperature and humidity from a Sensirion SHT31 device.
+## {% linkable_title Configuration %}
+
To use your SHT31 sensor in your installation, add the following to your `configuration.yaml` file:
```yaml
diff --git a/source/_components/sensor.thethingsnetwork.markdown b/source/_components/sensor.thethingsnetwork.markdown
index cce7aad569..faeb8b7e65 100644
--- a/source/_components/sensor.thethingsnetwork.markdown
+++ b/source/_components/sensor.thethingsnetwork.markdown
@@ -17,6 +17,8 @@ The `thethingsnetwork` sensor platform allows you to get data from a [The Things
This platform requires that the [The Things Network component](/components/thethingsnetwork/) is set up and the [The Things Network Storage Integration](https://www.thethingsnetwork.org/docs/applications/storage/) as well.
+## {% linkable_title Prerequisites %}
+
Visit the [The Things Network Console](https://console.thethingsnetwork.org/) website, log in with your The Things Network credentials, choose your application from **Applications** and go to **Integrations**.
Add a new integration.
@@ -54,6 +56,8 @@ Select **Devices** to get the ID of your device that you want to use.
Devices overview
+## {% linkable_title Configuration %}
+
To enable this platform, add the following lines to your `configuration.yaml`:
```yaml
diff --git a/source/_components/switch.hive.markdown b/source/_components/switch.hive.markdown
index 8f7d867722..e4ea483797 100644
--- a/source/_components/switch.hive.markdown
+++ b/source/_components/switch.hive.markdown
@@ -14,10 +14,11 @@ ha_iot_class: "Cloud Polling"
---
-The 'hive' switch component integrates your Hive plugs into Home Assistant, enabling control of your devices.
+The `hive` switch platform integrates your Hive plugs into Home Assistant, enabling control of your devices.
-The Hive switch component supports the following Hive products:
-- **Hive Active Plug**
+The platform supports the following Hive products:
+
+- Hive Active Plug
diff --git a/source/_components/switch.rainbird.markdown b/source/_components/switch.rainbird.markdown
index 6fba9a2f99..673c4d1928 100644
--- a/source/_components/switch.rainbird.markdown
+++ b/source/_components/switch.rainbird.markdown
@@ -15,6 +15,8 @@ ha_iot_class: "Local Polling"
This `rainbird` switch platform allows interacting with [LNK WiFi](http://www.rainbird.com/landscape/products/controllers/LNK-WiFi.htm) module of the Rain Bird Irrigation system in Home Assistant.
+## {% linkable_title Configuration %}
+
Once you have enabled the [Rain Bird component](/components/rainbird), add the following to your `configuration.yaml` file:
```yaml
diff --git a/source/_components/switch.rest.markdown b/source/_components/switch.rest.markdown
index 79388ff24b..65f0afcd3e 100644
--- a/source/_components/switch.rest.markdown
+++ b/source/_components/switch.rest.markdown
@@ -15,6 +15,8 @@ ha_iot_class: "Local Polling"
The `rest` switch platform allows you to control a given endpoint that supports a [RESTful API](https://en.wikipedia.org/wiki/Representational_state_transfer). The switch can get the state via GET and set the state via POST on a given REST resource.
+## {% linkable_title Configuration %}
+
To enable this switch, add the following lines to your `configuration.yaml` file:
```yaml
@@ -93,7 +95,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
```
diff --git a/source/_components/tts.amazon_polly.markdown b/source/_components/tts.amazon_polly.markdown
index 6561bc6d09..8be1fdc0a5 100644
--- a/source/_components/tts.amazon_polly.markdown
+++ b/source/_components/tts.amazon_polly.markdown
@@ -15,6 +15,8 @@ ha_release: 0.37
The `amazon_polly` text-to-speech platform that works with [Amazon Polly](https://aws.amazon.com/polly/) to create the spoken output.
Polly is a paid service via Amazon Web Services. There is a [free tier](https://aws.amazon.com/polly/pricing/) for the first 12 months and then a charge per million characters afterwards.
+## {% linkable_title Configuration %}
+
To get started, add the following lines to your `configuration.yaml` (example for Amazon Polly):
```yaml
@@ -23,33 +25,62 @@ tts:
- platform: amazon_polly
aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
- profile_name: AWS_PROFILE
- region_name: 'us-east-1'
- voice: Joanna
```
-Configuration variables:
+{% configuration %}
+aws_access_key_id:
+ description: "Your AWS Access Key ID. For more information, please read the [AWS General Reference regarding Security Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html). If provided, you must also provide an `aws_secret_access_key` and must **not** provide a `profile_name`."
+ required: true
+ type: string
+aws_secret_access_key:
+ description: "Your AWS Secret Access Key. For more information, please read the [AWS General Reference regarding Security Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html). If provided, you must also provide an `aws_access_key_id` and must **not** provide a `profile_name`."
+ required: true
+ type: string
+profile_name:
+ description: A credentials profile name. For more information, please see the [boto3 Documentation](http://boto3.readthedocs.io/en/latest/guide/configuration.html#shared-credentials-file) for more information.
+ required: false
+ type: string
+region_name:
+ description: "The region identifier to connect to. The default is `us-east-1`. See the [AWS Regions and Endpoints Reference](https://docs.aws.amazon.com/general/latest/gr/rande.html#pol_region) for available regions."
+ required: false
+ type: string or list
+name:
+ description: "Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`."
+ required: false
+ type: string
+text_type:
+ description: "Specify wherever to use text (default) or ssml markup by default."
+ required: false
+ type: string
+ default: text
+voice:
+ description: "Voice name to be used. See the [Amazon Documentation](http://docs.aws.amazon.com/polly/latest/dg/voicelist.html) for available voices."
+ required: false
+ type: string
+output_format:
+ description: "Override the default output format, e.g., `mp3`, `ogg_vorbis` or `pcm`."
+ required: false
+ type: string
+ default: mp3
+sample_rate:
+ description: "Override the default sample rate, defaults to 22050 for MP3 and Ogg Vorbis, 16000 for pcm."
+ required: false
+ type: string
+{% endconfiguration %}
-| Parameter | Value | Description |
-|---------------------|----------|-------------|
-| `aws_access_key_id` | Required | Your AWS Access Key ID. For more information, please read the [AWS General Reference regarding Security Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html). If provided, you must also provide an `aws_secret_access_key` and must **not** provide a `profile_name` |
-| `aws_secret_access_key` | Required | Your AWS Secret Access Key. For more information, please read the [AWS General Reference regarding Security Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html). If provided, you must also provide an `aws_access_key_id` and must **not** provide a `profile_name`. |
-| `profile_name` | Optional | A credentials profile name. For more information, please see the [boto3 Documentation](http://boto3.readthedocs.io/en/latest/guide/configuration.html#shared-credentials-file) for more information. |
-| `region_name` | Optional | The region identifier to connect to. The default is `us-east-1`. See the [AWS Regions and Endpoints Reference](https://docs.aws.amazon.com/general/latest/gr/rande.html#pol_region) for available regions. |
-| `name` | Optional | Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. |
-| `text_type` | text/ssml | text or ssml: Specify wherever to use text (default) or ssml markup by default. |
-| `voice` | Optional | Voice name to be used. See the [Amazon Documentation](http://docs.aws.amazon.com/polly/latest/dg/voicelist.html) for available voices. |
-| `output_format` | mp3/ogg_vorbis/pcm | Override the default output format, defaults to MP3. |
-| `sample_rate` | 8000/16000/22050 | Override the default sample rate, defaults to 22050 for MP3 and Ogg Vorbis, 16000 for pcm. |
-## Usage
+## {% linkable_title Usage %}
+
Say to all `media_player` device entities:
+
```yaml
- service: tts.amazon_polly_say
data_template:
message: 'Hello from Amazon Polly'
```
+
or
+
```yaml
- service: tts.amazon_polly_say
data_template:
From d7fcb153de9f791bfbfa83db9ee459498120a94b Mon Sep 17 00:00:00 2001
From: Aaron Bach
Date: Thu, 3 May 2018 14:56:01 -0600
Subject: [PATCH 39/70] Adds docs for RainMachine component/hub (#5251)
* Adds docs for RainMachine component/hub
* Removing references to remote API
* Collaborator-requested changes
* Adding new info (per home-assistant/home-assistant#14225)
* Collaborator-requested changes
* Collaborator-requested changes
* Revert "Collaborator-requested changes"
This reverts commit 34f75ffab911dcd9a9ae3163645c7c6e9dbf54ee.
* I think I got it this time...
* Collaborator-requested changes
* Collaborator-requested changes
* Small tweak
---
source/_components/rainmachine.markdown | 71 +++++++++++++++
.../_components/switch.rainmachine.markdown | 88 +++----------------
2 files changed, 85 insertions(+), 74 deletions(-)
create mode 100644 source/_components/rainmachine.markdown
diff --git a/source/_components/rainmachine.markdown b/source/_components/rainmachine.markdown
new file mode 100644
index 0000000000..e416c7f626
--- /dev/null
+++ b/source/_components/rainmachine.markdown
@@ -0,0 +1,71 @@
+---
+layout: page
+title: "RainMachine"
+description: "Instructions on how to integrate RainMachine units within Home Assistant."
+date: 2018-04-25 20:32
+sidebar: true
+comments: false
+sharing: true
+footer: true
+logo: rainmachine.png
+ha_category: Hub
+ha_release: 0.69
+ha_iot_class: "Cloud Polling"
+---
+
+The `rainmachine` component is the main component to integrate all platforms
+related to [RainMachine smart Wi-Fi sprinkler controllers](http://www.rainmachine.com/).
+
+## {% linkable_title Base Configuration %}
+
+To connect to your RainMachine device, add the following to your
+`configuration.yaml` file:
+
+```yaml
+rainmachine:
+ ip_address: 192.168.1.100
+ password: YOUR_PASSWORD
+```
+
+To configure switch-related functionality, add configuration options beneath
+a `switches` key within the `rainmachine` sections of `configuration.yaml`
+as below:
+
+```yaml
+rainmachine:
+ ip_address: 192.168.1.100
+ password: YOUR_PASSWORD
+ switches:
+ # switch configuration options...
+```
+
+{% configuration %}
+ip_address:
+ description: the IP address or hostname of your RainMachine unit
+ required: optional
+ type: string
+password:
+ description: your RainMachine password.
+ required: true
+ type: string
+port:
+ description: the TCP port used by your unit for the REST API
+ required: false
+ type: int
+ default: 8080
+ssl:
+ description: whether communication with the local device should occur over HTTPS
+ required: false
+ type: boolean
+ default: true
+switches:
+ description: switch-related configuration options
+ required: false
+ type: map
+ keys:
+ zone_run_time:
+ description: the default number of seconds that a zone should run when turned on
+ required: false
+ type: int
+ default: 600
+{% endconfiguration %}
diff --git a/source/_components/switch.rainmachine.markdown b/source/_components/switch.rainmachine.markdown
index 26b73e0aa8..f37ce0fbd5 100644
--- a/source/_components/switch.rainmachine.markdown
+++ b/source/_components/switch.rainmachine.markdown
@@ -13,84 +13,24 @@ ha_iot_class: "Cloud Polling"
ha_release: 0.51
---
-The `rainmachine` switch platform allows you to control programs and zones within a [RainMachine smart Wi-Fi sprinkler controller](http://www.rainmachine.com/).
-
-## {% linkable_title Configuring the Platform %}
-
-The platform allows for either local (i.e., directly across the LAN) or remote (i.e., through RainMachine's cloud API) access; the route you choose will dictate what your configuration should look like.
-
-For local access, specify the IP address/hostname of your RainMachine unit, your RainMachine password, and optionally, the device's HTTP port:
-
-```yaml
-switch:
- platform: rainmachine
- ip_address: 192.168.1.100
- password: YOUR_PASSWORD
-```
-
-For remote access, specify your RainMachine username/email and password:
-
-```yaml
-switch:
- platform: rainmachine
- email: user@host.com
- password: YOUR_PASSWORD
-```
-
-{% configuration %}
-password:
- description: Your RainMachine password.
- required: true
- type: string
-email:
- description: "Your RainMachine username/email. Cannot be used with the `ip_address` parameter."
- required: false
- type: string
-ip_address:
- description: "The IP address of your RainMachine unit; cannot be used with the `email` parameter."
- required: optional
- type: string
-port:
- description: The TCP port used by your unit for the REST API.
- required: false
- type: int
- default: 8080
-ssl:
- description: Whether communication with the local device should occur over HTTPS.
- required: false
- type: boolean
- default: true
-zone_run_time:
- description: The number of seconds that a zone should run when turned on.
- required: false
- type: int
- default: 600
-{% endconfiguration %}
+The `rainmachine` switch platform allows you to control programs and zones
+within a [RainMachine smart Wi-Fi sprinkler controller](http://www.rainmachine.com/).
+
+You must have the [RainMachine component](https://www.home-assistant.io/components/rainmachine/)
+configured to use this switch. After configuring that component, switches will
+automatically appear.
+
## {% linkable_title Controlling Your Device %}
-After Home Assistant loads, you will see new switches for every enabled program and zone. These work as expected:
+After Home Assistant loads, new switches will be added for every enabled
+program and zone. These work as expected:
- Program On/Off: starts/stops a program
-- Zone On/Off: starts/stops a zone (using the `zone_run_time` parameter to determine how long to run for)
+- Zone On/Off: starts/stops a zone (using the `zone_run_time` parameter to
+determine how long to run for)
-Programs and zones are linked. If a program is running its final zone, you will see both the program and zone switches turned on; turning either one off will turn the other one off (just like in the web app).
-
-## {% linkable_title Weblink %}
-
-If you would like to see and control more detailed information, create an [iFrame](/components/panel_iframe/) that renders the RainMachine web app:
-
-```yaml
-panel_iframe:
- rainmachine:
- title: RainMachine
- url: "https://my.rainmachine.com/s//ui/"
- icon: mdi:water-pump
-```
-
-You can find `` by logging into [https://my.rainmachine.com](https://my.rainmachine.com ) and taking note of the URL.
-
-## {% linkable_title For Awareness %}
-
-The remote RainMachine API currently has two broken operations (i.e., they return error codes): starting a program and stopping a program. Please note that starting/stopping programs with the remote API is disabled until RainMachine can fix the issue.
+Programs and zones are linked. While a program is running, you will see both
+the program and zone switches turned on; turning either one off will turn the
+other one off (just like in the web app).
From f02495713b5b8cfdc9c2169812c602ee69e19e25 Mon Sep 17 00:00:00 2001
From: DubhAd
Date: Fri, 4 May 2018 08:19:02 +0100
Subject: [PATCH 40/70] Re-ordered the automation blocks (#5305)
The automations were as the editor produces them, so not logically ordered or clear to read. I've re-written them to match the rest of the documentation.
---
source/_components/timer.markdown | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/source/_components/timer.markdown b/source/_components/timer.markdown
index 9f28b2ec7a..eb6db877f3 100644
--- a/source/_components/timer.markdown
+++ b/source/_components/timer.markdown
@@ -107,30 +107,29 @@ timer:
```yaml
# Example automations.yaml entry
-- action:
- - service: timer.start
- entity_id: timer.test
- alias: Timerswitch
+- alias: Timerswitch
id: 'Timerstart'
-
-# Timer is started when the switch pumprun is set to on.
+ # Timer is started when the switch pumprun is set to on.
trigger:
- platform: state
+ - platform: state
entity_id: switch.pumprun
to: 'on'
+ action:
+ - service: timer.start
+ entity_id: timer.test
# When timer is stopped, the time run out, another message is sent
-- action:
- - service: notify.nma
- data:
- message: "Timer stop"
- alias: Timerstop
+- alias: Timerstop
id: 'Timerstop'
trigger:
- platform: event
+ - platform: event
event_type: timer.finished
event_data:
entity_id: timer.test
+ action:
+ - service: notify.nma
+ data:
+ message: "Timer stop"
```
### {% linkable_title Control a timer from the frontend %}
From 49c697004a4c81e7acec37eea9810c8e0f6b0d1c Mon Sep 17 00:00:00 2001
From: DubhAd
Date: Fri, 4 May 2018 08:20:00 +0100
Subject: [PATCH 41/70] Added explicit call out about Z-Wave (#5294)
* Added explicit call out about Z-Wave
Called out the need to disable the auto-start when you're using Z-Wave
* Included details about `discovery:`
---
source/_components/homekit.markdown | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/source/_components/homekit.markdown b/source/_components/homekit.markdown
index f0723ba4ac..a28655751b 100644
--- a/source/_components/homekit.markdown
+++ b/source/_components/homekit.markdown
@@ -81,6 +81,9 @@ The `HomeKit` component allows you to forward entities from Home Assistant to Ap
default: ''
{% endconfiguration %}
+
+ If you use Z-Wave, or `discovery:` you'll need to disable auto-start, see the [section below](#disable-auto-start) for details on how to do this. You'll then need to start the HomeKit component once Z-Wave is ready, or an appropriate delay to allow your entities to be discovered.
+
## {% linkable_title Setup %}
@@ -120,7 +123,7 @@ A common situation might be if you decide to disable parts of the configuration
Depending on your individual setup, it might be necessary to disable `Auto Start` for all accessories to be available for `HomeKit`. Only those entities that are fully setup when the `HomeKit` component is started, can be added. To start `HomeKit` when `auto_start: False`, you can call the service `homekit.start`.
-This can be automated using an `automation`.
+If you have Z-Wave entities you want 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:
{% raw %}
```yaml
@@ -138,6 +141,8 @@ automation:
```
{% endraw %}
+For a general delay where your component doesn't generate an event, you can also do:
+
{% raw %}
```yaml
# Example using a delay after start of Home Assistant
From cb8cdf34529f2c309c4b7ea7c52aaa142e91755e Mon Sep 17 00:00:00 2001
From: Tod Schmidt
Date: Fri, 4 May 2018 03:43:51 -0400
Subject: [PATCH 42/70] Update snips.markdown (#5292)
* Update snips.markdown
Updated to reference latest add on.
* Update snips.markdown
* Fix escaping
---
source/_addons/snips.markdown | 96 ++++++++++++++++++++++++-----------
1 file changed, 65 insertions(+), 31 deletions(-)
diff --git a/source/_addons/snips.markdown b/source/_addons/snips.markdown
index 55a1dca239..2160608694 100644
--- a/source/_addons/snips.markdown
+++ b/source/_addons/snips.markdown
@@ -2,7 +2,7 @@
layout: page
title: "Snips.ai"
description: "Enhance your Hass.io installation with a local voice assistant."
-date: 2018-03-22 13:28
+date: 2018-05-02 13:28
sidebar: true
comments: false
sharing: true
@@ -25,42 +25,17 @@ Open garage door
What is on my shopping list
```
-To get started creating your own configuration, follow [their tutorial](https://github.com/snipsco/snips-platform-documentation/wiki/2.-Create-an-assistant-using-an-existing-bundle) to create an assistant and download the training data. You can add the HomeAssistant bundle to your assistant to enable the built-in intents, and add or create your own intents to do more complex tasks.
+To get started creating your own configuration, follow [their tutorial](https://snips.gitbook.io/documentation/console) to create an assistant and download the training data. You can also add the HomeAssistant Skill to your assistant to enable the built-in intents, and add or create your own intents to do more complex tasks.
-Now install and activate the [Samba] add-on so you can upload your training data. Connect to the "share" Samba share and copy your training data over. Name the file `assistant.zip`.
-
-Now it's time to start Snips for the first time. When the Snips add-on starts, it will output your audio devices. If you are using a USB mic and the raspberry pi output, you won't need to change anything:
-
-```text
-**** List of PLAYBACK Hardware Devices ****
-card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
- Subdevices: 8/8
- Subdevice #0: subdevice #0
- Subdevice #1: subdevice #1
- Subdevice #2: subdevice #2
- Subdevice #3: subdevice #3
- Subdevice #4: subdevice #4
- Subdevice #5: subdevice #5
- Subdevice #6: subdevice #6
- Subdevice #7: subdevice #7
-card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
- Subdevices: 1/1
- Subdevice #0: subdevice #0
-```
-
-You need to use this information to point the add-on at the right speakers and microphone. The information describes different cards and devices. On a Raspberry Pi 3, card 0 - device 0 is the built-in headset port, card 0 - device 1 is the HDMI port. In the example above, the USB microphone showed up as card 1 - device 0.
-
-Find the microphone and speakers that you want to use and note down their device and card number. We will need that to configure the add-on options `mic` (microphone to use) and `speaker` (speaker to use). The format for these options is `,`. Change the configuration options and click save.
+Now install and activate the [Samba] add-on so you can upload your training data. Connect to the "share" Samba share and copy your assistant over. Name the file `assistant.zip` or whatever you have configured in the configuration options.
+Now it's time to start Snips for the first time. You can configure the microphone and sound card using the addon gui.
Now start the add-on.
### Add-On configuration
```json
{
- "mic": "1,0",
- "speaker": "1,0",
- "assistant": "assistant.zip",
"mqtt_bridge": {
"active": true,
"host": "172.17.0.1",
@@ -68,23 +43,82 @@ Now start the add-on.
"user": "",
"password": ""
},
+ "assistant": "assistant.zip",
+ "language": "en",
+ "custom_tts": false,
+ "tts_platform": "amazon_polly"
}
```
Configuration variables:
- **mqtt_bridge** : Snips uses MQTT to communicate and defaults to their own broker. Use this config option to bridge their broker to your the Mosquitto add-on.
-- **mic**: This is the hardware address of your microphone. Look at the Snips output if you are using different hardware.
+- **assistant** : The name of your custom assistant in /share. If no assistant is found a default assistant will be used.
+- **language** : Language. This is used to select the default custom assistant, Currently en, de, and fr are supported.
+- **custom_tts** : Whether to use a TTS provider from Home Assistant for a variety of voices
+- **tts_platform** : Which tts platform to use.
### {% linkable_title Home Assistant configuration %}
-Use the Home Assistant [Snips.ai component][comp] to integrate the add-on into Home Assistant.
+A simple configuration just requires this. Consult [Snips.ai component][comp] for more options
```yaml
snips:
```
+### {% linkable_title Home Assistant configuration %}
+
+There is an active [discord](https://discordapp.com/invite/3939Kqx) channel for further support.
+
+### Examples
+
+So now you can turn lights on and off, let's check the weather. Log on to the [console](https://console.snips.ai/). If this is your first time, create a new assistant and add the Home Assistant skill, along with the Weather skill by snips. Download your assistant manually and copy it to the /share folder on your HassIO installation using the Samba addon.
+
+Next create a weather sensor, I happen to use (Dark Sky)[/components/sensor.darksky/] and have my api_key in my secrets file.
+
+```yaml
+- platform: darksky
+ name: "Dark Sky Weather"
+ api_key: !secret dark_sky_key
+ update_interval:
+ minutes: 10
+ monitored_conditions:
+ - summary
+ - hourly_summary
+ - temperature
+ - temperature_max
+ - temperature_min
+```
+Next add this to your configuration.yaml to reference a new intent_script component.
+This is a good practice to split your config files up.
+
+```yaml
+intent_script: !include intent_script.yaml
+```
+
+Finally, create this intent_script.yaml file in your config directory
+
+{% raw %}
+```yaml
+searchWeatherForecast:
+ speech:
+ type: plain
+ text: >
+ The weather is currently
+ {{ states('sensor.dark_sky_weather_temperature') | round(0) }}
+ degrees outside and {{ states('sensor.dark_sky_weather_summary') }}.
+ The high today will be
+ {{ states('sensor.dark_sky_weather_daily_high_temperature') | round(0)}}
+ and {{ states('sensor.dark_sky_weather_hourly_summary') }}
+```
+{% endraw %}
+
+Now just restart HassIO and ask it what the weather is like!
+
+
+
[Snips.ai]: https://snips.ai/
[their tutorial]: https://github.com/snipsco/snips-platform-documentation/wiki/2.-Create-an-assistant-using-an-existing-bundle
[Samba]: /addons/samba/
[comp]: /components/snips/
+
From c66bde18435b54313308e14f70eeba70ff77370e Mon Sep 17 00:00:00 2001
From: Fabian Affolter
Date: Fri, 4 May 2018 09:52:24 +0200
Subject: [PATCH 43/70] Fix formatting and some sentences
---
source/_addons/snips.markdown | 41 +++++++++++++------------------
source/_components/snips.markdown | 8 +++---
2 files changed, 20 insertions(+), 29 deletions(-)
diff --git a/source/_addons/snips.markdown b/source/_addons/snips.markdown
index 2160608694..851afd8e7d 100644
--- a/source/_addons/snips.markdown
+++ b/source/_addons/snips.markdown
@@ -9,7 +9,7 @@ sharing: true
footer: true
---
-[Snips.ai] is an AI-powered voice assistant that runs on the Raspberry Pi 3 and x86 platforms. It runs on-device and is Private by Design.
+[Snips.ai](https://snips.ai/) is an AI-powered voice assistant that runs on the Raspberry Pi 3 and x86 platforms. It runs on-device and is Private by Design.
The Snips add-on depends on the Mosquitto add on to bridge to Home Assistant, so make sure that is installed.
@@ -17,7 +17,7 @@ HomeAssistant comes with certain Intents builtin to handle common tasks. A compl
The Snips addon by default comes with an assistant that allows you to turn on lights or switches, open covers, or add and list items to a shopping list if that component is enabled.
-If using a USB microphone and speakers plugged into the raspberry pi output, Snips will work without any change to the configuration. Trying saying things like:
+If using a USB microphone and speakers plugged into the Raspberry Pi output, Snips will work without any change to the configuration. Trying saying things like:
```
Turn on kitchen light
@@ -27,12 +27,11 @@ What is on my shopping list
To get started creating your own configuration, follow [their tutorial](https://snips.gitbook.io/documentation/console) to create an assistant and download the training data. You can also add the HomeAssistant Skill to your assistant to enable the built-in intents, and add or create your own intents to do more complex tasks.
-Now install and activate the [Samba] add-on so you can upload your training data. Connect to the "share" Samba share and copy your assistant over. Name the file `assistant.zip` or whatever you have configured in the configuration options.
+Now install and activate the [Samba](/addons/samba/) add-on so you can upload your training data. Connect to the "share" Samba share and copy your assistant over. Name the file `assistant.zip` or whatever you have configured in the configuration options.
-Now it's time to start Snips for the first time. You can configure the microphone and sound card using the addon gui.
-Now start the add-on.
+Now it's time to start Snips for the first time. You can configure the microphone and sound card using the Add-on interface. Now start the add-on.
-### Add-On configuration
+### {% linkable_title Add-On configuration %}
```json
{
@@ -52,15 +51,15 @@ Now start the add-on.
Configuration variables:
-- **mqtt_bridge** : Snips uses MQTT to communicate and defaults to their own broker. Use this config option to bridge their broker to your the Mosquitto add-on.
-- **assistant** : The name of your custom assistant in /share. If no assistant is found a default assistant will be used.
-- **language** : Language. This is used to select the default custom assistant, Currently en, de, and fr are supported.
-- **custom_tts** : Whether to use a TTS provider from Home Assistant for a variety of voices
-- **tts_platform** : Which tts platform to use.
+- **mqtt_bridge**: Snips uses MQTT to communicate and defaults to their own broker. Use this config option to bridge their broker to your the Mosquitto add-on.
+- **assistant**: The name of your custom assistant in `/share`. If no assistant is found then a default assistant will be used.
+- **language**: Language. This is used to select the default custom assistant, Currently `en`, `de` and `fr` are supported.
+- **custom_tts**: Whether to use a TTS provider from Home Assistant for a variety of voices.
+- **tts_platform**: Which TTS platform to use.
### {% linkable_title Home Assistant configuration %}
-A simple configuration just requires this. Consult [Snips.ai component][comp] for more options
+A simple configuration just requires this. Consult [Snips.ai component](/components/snips/) for more options.
```yaml
snips:
@@ -70,11 +69,11 @@ snips:
There is an active [discord](https://discordapp.com/invite/3939Kqx) channel for further support.
-### Examples
+### {% linkable_title Examples %}
-So now you can turn lights on and off, let's check the weather. Log on to the [console](https://console.snips.ai/). If this is your first time, create a new assistant and add the Home Assistant skill, along with the Weather skill by snips. Download your assistant manually and copy it to the /share folder on your HassIO installation using the Samba addon.
+So now you can turn lights on and off, let's check the weather. Log on to the [console](https://console.snips.ai/). If this is your first time, create a new assistant and add the Home Assistant skill, along with the Weather skill by snips. Download your assistant manually and copy it to the `/share` folder on your HassIO installation using the Samba addon.
-Next create a weather sensor, I happen to use (Dark Sky)[/components/sensor.darksky/] and have my api_key in my secrets file.
+Next create a weather sensor, e.g., one for (Dark Sky)[/components/sensor.darksky/] and put the `api_key` in your `secrets.yaml` file.
```yaml
- platform: darksky
@@ -89,14 +88,13 @@ Next create a weather sensor, I happen to use (Dark Sky)[/components/sensor.dark
- temperature_max
- temperature_min
```
-Next add this to your configuration.yaml to reference a new intent_script component.
-This is a good practice to split your config files up.
+Next add this to your `configuration.yaml` file to reference a new `intent_script` component. This is a good practice to [split your configuration files](/docs/configuration/splitting_configuration/) up.
```yaml
intent_script: !include intent_script.yaml
```
-Finally, create this intent_script.yaml file in your config directory
+Finally, create this `intent_script.yaml` file in your configuration directory.
{% raw %}
```yaml
@@ -113,12 +111,7 @@ searchWeatherForecast:
```
{% endraw %}
-Now just restart HassIO and ask it what the weather is like!
+Now just restart HassIO and ask it what the weather is like.
-
-
-[Snips.ai]: https://snips.ai/
[their tutorial]: https://github.com/snipsco/snips-platform-documentation/wiki/2.-Create-an-assistant-using-an-existing-bundle
-[Samba]: /addons/samba/
-[comp]: /components/snips/
diff --git a/source/_components/snips.markdown b/source/_components/snips.markdown
index cc2aa3248c..e7086ac9dc 100644
--- a/source/_components/snips.markdown
+++ b/source/_components/snips.markdown
@@ -97,7 +97,7 @@ followed by a command, e.g.
> Set the lights to green in the living room
-As the Snips Platform parses this query into an intent, it will be published on MQTT, on the `hermes/intent/` topic. The Snips Home Assistant component subscribes to this topic, and handles the intent according to the rules defined in `configuration.yaml`, as explained below.
+As the Snips Platform parses this query into an intent, it will be published on MQTT, on the `hermes/intent/` topic. The Snips Home Assistant component subscribes to this topic, and handles the intent according to the rules defined in `configuration.yaml` file, as explained below.
#### {% linkable_title Optional: specifying an external MQTT broker %}
@@ -256,9 +256,7 @@ intent_script:
##### {% linkable_title Weather %}
-So now you can open and close your garage door, let's check the weather. Add the Weather by Snips Skill to your assistant.
-
-Create a weather sensor, in this example (Dark Sky)[/components/sensor.darksky/] and the api_key in the secrets file.
+So now you can open and close your garage door, let's check the weather. Add the Weather by Snips Skill to your assistant. Create a weather sensor, in this example (Dark Sky)[/components/sensor.darksky/] and the `api_key` in the `secrets.yaml` file.
```yaml
- platform: darksky
@@ -274,7 +272,7 @@ Create a weather sensor, in this example (Dark Sky)[/components/sensor.darksky/]
- temperature_min
```
-Then create this intent_script.yaml file in your config directory
+Then create this `intent_script.yaml` file in your configuration directory.
{% raw %}
```yaml
From 05916670688398ef9afb55416f2ac3d7e8cedd60 Mon Sep 17 00:00:00 2001
From: lbouriez
Date: Fri, 4 May 2018 04:20:20 -0400
Subject: [PATCH 44/70] fix yaml example (#5275)
* fix yaml example
* Fix configuration sample
---
source/_components/device_tracker.google_maps.markdown | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/source/_components/device_tracker.google_maps.markdown b/source/_components/device_tracker.google_maps.markdown
index 5b16f3c785..d05c9e35d2 100644
--- a/source/_components/device_tracker.google_maps.markdown
+++ b/source/_components/device_tracker.google_maps.markdown
@@ -29,9 +29,9 @@ To integrate Google Maps Location Sharing in Home Assistant, add the following s
```yaml
# Example configuration.yaml entry
device_tracker:
- platform: google_maps
- username: example@gmail.com
- password: password
+ - platform: google_maps
+ username: YOUR_USERNAME
+ password: YOUR_PASSWORD
```
{% configuration %}
From 99b142470d51393ed2b6dd8e7ba09ab3ec53ba1c Mon Sep 17 00:00:00 2001
From: cdce8p <30130371+cdce8p@users.noreply.github.com>
Date: Sat, 5 May 2018 15:38:37 +0200
Subject: [PATCH 45/70] Updated sensor device_classes (#5306)
* Updated sensor device_classes
* Removed lux
* Changed device_class name
* Updated homekit doc
---
source/_components/homekit.markdown | 2 +-
source/_components/sensor.markdown | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/source/_components/homekit.markdown b/source/_components/homekit.markdown
index 631ddf592c..c50ce9b6be 100644
--- a/source/_components/homekit.markdown
+++ b/source/_components/homekit.markdown
@@ -206,7 +206,7 @@ The following components are currently supported:
| sensor | HumiditySensor | All sensors that have `%` as their `unit_of_measurement` or `humidity` as their `device_class`. |
| sensor | AirQualitySensor | All sensors that have `pm25` as part of their `entity_id` or `pm25` as their `device_class` |
| sensor | CarbonDioxideSensor | All sensors that have `co2` as part of their `entity_id` or `co2` as their `device_class` |
-| sensor | LightSensor | All sensors that have `lm`/`lux` as their `unit_of_measurement` or `light` as their `device_class` |
+| sensor | LightSensor | All sensors that have `lm` or `lx` as their `unit_of_measurement` or `illuminance` as their `device_class` |
| switch / remote / input_boolean / script | Switch | All represented as switches. |
diff --git a/source/_components/sensor.markdown b/source/_components/sensor.markdown
index d973c2442e..647f0e7ab0 100644
--- a/source/_components/sensor.markdown
+++ b/source/_components/sensor.markdown
@@ -20,6 +20,7 @@ The way these sensors are displayed in the frontend can be modified in the [cust
- **None**: Generic sensor. This is the default and doesn't need to be set.
- **battery**: Percentage of battery that is left.
- **humidity**: Percentage of humidity in the air.
+- **illuminance**: The current light level in lx or lm.
- **temperature**: Temperature in °C or °F.
From 69405f1edc24dfea0342bc10b0c90678acedb6e8 Mon Sep 17 00:00:00 2001
From: Lukas Barth
Date: Sat, 5 May 2018 19:05:15 +0200
Subject: [PATCH 46/70] Add matrix documentation (#5019)
* Add matrix documentation
* Try to use new config tags
* Use new config tag
* :arrow_up: Added ha_version tag
* :arrow_up: ha_release -> 0.68
* update version number
---
source/_components/matrix.markdown | 136 ++++++++++++++++++++++
source/_components/notify.matrix.markdown | 10 +-
2 files changed, 138 insertions(+), 8 deletions(-)
create mode 100644 source/_components/matrix.markdown
diff --git a/source/_components/matrix.markdown b/source/_components/matrix.markdown
new file mode 100644
index 0000000000..1047d54053
--- /dev/null
+++ b/source/_components/matrix.markdown
@@ -0,0 +1,136 @@
+---
+layout: page
+title: "Matrix"
+description: "Matrix chatbot support"
+date: 2018-03-25 18:50
+sidebar: true
+comments: false
+sharing: true
+footer: true
+logo: matrix.png
+ha_category: Hub
+ha_version: 0.69
+---
+
+This component allows you to send messages to matrix rooms, as well as to react to messages in matrix rooms. Reacting to commands is accomplished by firing an event when one of the configured commands is triggered.
+
+```yaml
+# Example configuration.yaml entry
+matrix:
+ homeserver: https://matrix.org
+ username: "@my_matrix_user:matrix.org"
+ password: supersecurepassword
+ rooms:
+ - "#hasstest:matrix.org"
+ commands:
+ - word: my_command
+ name: my_command
+```
+
+Configuration variables:
+
+{% configuration %}
+username:
+ description: "The matrix username that home assistant should use to log in. *Note*: You must specify a full matrix ID here, including the homeserver domain, e.g. '@my_matrix_bot:matrix.org'. Please note also that the '@' character has a special meaning in YAML, so this must always be given in quotes."
+ required: true
+ type: string
+password:
+ description: The password for your Matrix account.
+ required: true
+ type: string
+homeserver:
+ description: "The full URL for your homeserver. If you use the defauls matrix.org homeserver, this is 'https://matrix.org'."
+ required: true
+ type: string
+verify_ssl:
+ description: Verify the homeservers certificate.
+ required: false
+ type: string
+ default: true
+rooms:
+ description: "The list of rooms that the bot should join and listen for commands (see below) in. While you can limit the list of rooms that a certain command applies to on a per-command basis (see below), you must still list all rooms here that commands should be received in. Rooms can be given either by their internal ID (e.g., '!cURbafjkfsMDVwdRDQ:matrix.org') or any of their aliases (e.g., '#matrix:matrix.org')."
+ required: false
+ type: [string]
+ default: empty
+commands:
+ description: "A list of commands that the bot should listen for. If a command is triggered (via its *word* or *expression*, see below), an event is fired that you can handle using automations. Every command consists of these possible configuration options:"
+ required: false
+ type: map
+ default: empty
+ keys:
+ word:
+ description: "Specifies a word that the bot should listen for. If you specify 'my_command' here, the bot will react to any message starting with '!my_command'."
+ required: false
+ type: string
+ expression:
+ description: "Specifies a regular expression (in python regexp syntax) that the bot should listen to. The bot will react to any message that matches the regular expression."
+ required: false
+ type: string
+ name:
+ description: "The name of the command. This will be an attribute of the event that is fired when this command triggers."
+ required: true
+ type: string
+ rooms:
+ description: "A list of rooms that the bot should listen for this command in. If this is not given, the *rooms* list from the main config is used. Please note that every room in this list must also be in the main *room* config."
+ required: false
+ type: [string]
+ default: empty
+{% endconfiguration %}
+
+### {% linkable_title Event Data %}
+
+If a command is triggered, a `matrix_command` event is fired. The event contains the name of the command in the `name` field. If the command is a word command that has no name set, the `name` field contains the word instead.
+
+If the command is a word command, the `data` field contains a list of the command's arguments, i.e., everything that stood behind the word, split at spaces. If the command is an expression command, the `data` field contains the [group dictionary](https://docs.python.org/3.6/library/re.html?highlight=re#re.match.groupdict) of the regular expression that matched the message.
+
+### {% linkable_title Comprehensive Configuration Example %}
+
+This example also uses the [matrix `notify` platform](/components/notify.matrix/).
+
+```yaml
+# The Matrix component
+matrix:
+ homeserver: https://matrix.org
+ username: "@my_matrix_user:matrix.org"
+ password: supersecurepassword
+ rooms:
+ - "#hasstest:matrix.org"
+ - "#someothertest:matrix.org"
+ commands:
+ - word: testword
+ rooms:
+ - "#someothertest:matrix.org"
+ - expression: "My name is (?P.*)"
+ name: introduction
+
+notify:
+ - name: matrix_notify
+ platform: matrix
+ default_room: "#hasstest:matrix.org"
+
+automation:
+ - alias: 'React to !testword'
+ trigger:
+ platform: event
+ event_type: matrix_command
+ event_data:
+ command: testword
+ action:
+ service: notify.matrix_notify
+ data:
+ message: 'It looks like you wrote !testword'
+ - alias: 'React to an introduction'
+ trigger:
+ platform: event
+ event_type: matrix_command
+ event_data:
+ command: introduction
+ action:
+ service: notify.matrix_notify
+ data_template:
+ message: "Hello {{trigger.event.data.name}}"
+```
+
+This configuration will:
+- Listen for "!testword" in the room "#someothertest:matrix.org" (and *only*) there. If such a message is encountered, it will answer with "It looks like you wrote !testword" into the "#hasstest:matrix.org" channel.
+- Listen in both rooms for any message matching "My name is " and answer with "Hello " into "#hasstest:matrix.org".
diff --git a/source/_components/notify.matrix.markdown b/source/_components/notify.matrix.markdown
index 2d9aff6a04..29890d46c8 100644
--- a/source/_components/notify.matrix.markdown
+++ b/source/_components/notify.matrix.markdown
@@ -17,27 +17,21 @@ The `matrix` platform allows you to deliver notifications from Home Assistant to
## {% linkable_title Configuration %}
-To enable Matrix notifications in your installation, add the following to your `configuration.yaml` file:
+To enable Matrix notifications in your installation, you first need to configure
+the [Matrix component](/components/matrix/). Then, add the following to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
notify:
- name: NOTIFIER_NAME
platform: matrix
- homeserver: HOMESERVER
- username: YOUR_USERNAME
- password: YOUR_PASSWORD
default_room: ROOM_ID_OR_ALIAS
```
Configuration variables:
- **name** (*Optional*): Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`.
-- **homeserver** (*Required*): The base URL of the homeserver, where the notifier account is registered (e.g., `https://matrix.org`).
-- **username** (*Required*): The username of the notifying Matrix account.
-- **password** (*Required*): The password for the given Matrix account.
- **default_room** (*Required*): The room all messages will be sent to, when no other target is given.
-- **verify_ssl** (*Optional*): Verify the homeservers certificate. Defaults to `true`.
The target room has to be precreated, the room id can be obtained from the rooms settings dialog. Rooms by default have a canonical id of the form `"!:homeserver.tld"`, but can also be allocated aliases like `"#roomname:homeserver.tld"`. Make sure to use quotes around the room id or alias to escape special characters (`!`, and `#`) in YAML. The notifying account may need to be invited to the room, depending on the individual rooms policies.
From ba630fb068bec34736d3a9e8cf4135d1dfa48223 Mon Sep 17 00:00:00 2001
From: cdce8p <30130371+cdce8p@users.noreply.github.com>
Date: Sat, 5 May 2018 19:05:49 +0200
Subject: [PATCH 47/70] Updated Sensor device_class requirement - HomeKit
(#5304)
* HomeKit - sensor device_class requirement
* Limit breaking change to Humidity Sensor
---
source/_components/homekit.markdown | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/source/_components/homekit.markdown b/source/_components/homekit.markdown
index c50ce9b6be..bb2b4649f8 100644
--- a/source/_components/homekit.markdown
+++ b/source/_components/homekit.markdown
@@ -202,8 +202,8 @@ The following components are currently supported:
| cover | WindowCovering | All covers that support `open_cover`, `stop_cover` and `close_cover` through value mapping. (`open` -> `>70`; `close` -> `<30`; `stop` -> every value in between) |
| light | Light | Support for `on / off`, `brightness` and `rgb_color`. |
| lock | DoorLock | Support for `lock / unlock`. |
-| sensor | TemperatureSensor | All sensors that have `Celsius` and `Fahrenheit` as their `unit_of_measurement` or `temperature` as their `device_class`. |
-| sensor | HumiditySensor | All sensors that have `%` as their `unit_of_measurement` or `humidity` as their `device_class`. |
+| sensor | TemperatureSensor | All sensors that have `Celsius` or `Fahrenheit` as their `unit_of_measurement` or `temperature` as their `device_class`. |
+| sensor | HumiditySensor | All sensors that have `%` as their `unit_of_measurement` and `humidity` as their `device_class`. |
| sensor | AirQualitySensor | All sensors that have `pm25` as part of their `entity_id` or `pm25` as their `device_class` |
| sensor | CarbonDioxideSensor | All sensors that have `co2` as part of their `entity_id` or `co2` as their `device_class` |
| sensor | LightSensor | All sensors that have `lm` or `lx` as their `unit_of_measurement` or `illuminance` as their `device_class` |
From 8187c4aebe4fc0edc551ed2f508ec15748e89bbc Mon Sep 17 00:00:00 2001
From: Mick Vleeshouwer
Date: Sat, 5 May 2018 19:06:14 +0200
Subject: [PATCH 48/70] Add sensor.postnl documentation (#5231)
* Add sensor.postnl documentation
* Update ha_release
---
source/_components/sensor.postnl.markdown | 47 ++++++++++++++++++++++
source/images/supported_brands/postnl.png | Bin 0 -> 190385 bytes
2 files changed, 47 insertions(+)
create mode 100644 source/_components/sensor.postnl.markdown
create mode 100644 source/images/supported_brands/postnl.png
diff --git a/source/_components/sensor.postnl.markdown b/source/_components/sensor.postnl.markdown
new file mode 100644
index 0000000000..3087ce4b01
--- /dev/null
+++ b/source/_components/sensor.postnl.markdown
@@ -0,0 +1,47 @@
+---
+layout: page
+title: PostNL Sensor
+description: "Instructions on how to set up PostNL sensors within Home Assistant."
+date: 2017-04-22 08:00
+sidebar: true
+comments: false
+sharing: true
+footer: true
+logo: postnl.png
+ha_category: Sensor
+ha_release: 0.69
+ha_iot_class: "Cloud Polling"
+---
+
+The `postnl` platform allows one to track deliveries by [PostNL](https://www.postnl.nl) (Dutch Postal Services). To use this sensor, you need a [PostNL Account](https://jouw.postnl.nl). It is possible to add multiple accounts to your Home Assistant configuration.
+
+## {% linkable_title Configuration %}
+
+To enable this sensor, add the following lines to your `configuration.yaml`:
+
+```yaml
+sensors:
+ - platform: postnl
+ username: POSTNL_USERNAME
+ password: POSTNL_PASSWORD
+```
+
+{% configuration %}
+name:
+ description: Sensor name
+ required: false
+ default: "postnl"
+ type: string
+username:
+ description: Account username of jouw.postnl.nl
+ required: true
+ type: string
+password:
+ description: Account password of jouw.postnl.nl
+ required: true
+ type: string
+{% endconfiguration %}
+
+
+This component is not affiliated with PostNL and retrieves date from the endpoints of the mobile application. Use at your own risk.
+
diff --git a/source/images/supported_brands/postnl.png b/source/images/supported_brands/postnl.png
new file mode 100644
index 0000000000000000000000000000000000000000..93d54db18c92d5d4513e65a159d7a9074266aeb6
GIT binary patch
literal 190385
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