From 2e963d2ab986117ca04118c13b0f4098f59fea2f Mon Sep 17 00:00:00 2001 From: Rohan Kapoor Date: Sun, 11 Nov 2018 07:08:08 -0600 Subject: [PATCH 01/84] Update mailgun webhook settings for new api (#7208) --- source/_components/mailgun.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/mailgun.markdown b/source/_components/mailgun.markdown index 4ee7a4e6fa0..a0d3fb2dcea 100644 --- a/source/_components/mailgun.markdown +++ b/source/_components/mailgun.markdown @@ -12,13 +12,13 @@ ha_category: Notifications ha_release: 0.38 --- -To be able to receive events from Mailgun, your Home Assistant instance needs to be accessible from the web ([Hass.io instructions](/addons/duckdns/)) and you need to have the `base_url` configured for the HTTP component ([docs](https://www.home-assistant.io/components/http/#base_url)). +To be able to receive webhooks from Mailgun, your Home Assistant instance needs to be accessible from the web ([Hass.io instructions](/addons/duckdns/)) and you need to have the `base_url` configured for the HTTP component ([docs](https://www.home-assistant.io/components/http/#base_url)). To set it up, go to the integrations page in the configuration screen and find Mailgun. Click on configure. Follow the instructions on the screen to configure Mailgun. -You will get a URL of the following format: `https:///api/webhook/9940e99a26fae4dcf6fe0a478124b6b58b578ea4c55c9a584beb1c9f5057bb91`. To generate inbound events, add a Route set to Store and Notify with that url. +You will get a URL of the following format: `https:///api/webhook/9940e99a26fae4dcf6fe0a478124b6b58b578ea4c55c9a584beb1c9f5057bb91`. To receive webhooks from Mailgun, you need to provide that url as a callback URL in the Webhooks tab of the Mailgun Control Panel. -Events coming in from Mailgun will be available as events in Home Assistant and are fired as `mailgun_message_received`. The [data specified by Mailgun](https://www.mailgun.com/blog/a-guide-to-using-mailguns-webhooks) will be available as the event data. You can use this event to trigger automations. +Events coming in from Mailgun will be available as events in Home Assistant and are fired as `mailgun_message_received`. The [data specified by Mailgun](https://documentation.mailgun.com/en/latest/api-events.html#event-structure) will be available as the event data. You can use this event to trigger automations. You can then consume that information with the following automation: From e1967c95ab4512c23037164f7ac58db150d2c475 Mon Sep 17 00:00:00 2001 From: Pawel Date: Wed, 7 Nov 2018 09:33:27 +0100 Subject: [PATCH 02/84] Cover get position topic (#7279) * Support for position_topic. * titles fixed * added Configuration description. * set_position_topic description updated. --- source/_components/cover.mqtt.markdown | 61 ++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/source/_components/cover.mqtt.markdown b/source/_components/cover.mqtt.markdown index 26bb333b6b3..903ac487224 100644 --- a/source/_components/cover.mqtt.markdown +++ b/source/_components/cover.mqtt.markdown @@ -18,12 +18,17 @@ The `mqtt` cover platform allows you to control an MQTT cover (such as blinds, a ## {% linkable_title Configuration %} The device state (`open` or `closed`) will be updated only after a new message is published on `state_topic` matching `state_open` or `state_closed`. If these messages are published with the `retain` flag set, the cover will receive an instant state update after subscription and Home Assistant will display the correct state on startup. Otherwise, the initial state displayed in Home Assistant will be `unknown`. +`state_topic` can only manage `state_open` and `state_closed`. No percentage positons etc. -There is an attribute that stores the relative position of the device, where 0 means the device is `closed` and all other intermediate positions means the device is `open`. +For this purpose is `position_topic` which can set state of the cover and positon. +Default setting are 0 means the device is `closed` and all other intermediate positions means the device is `open`. +`position_topic` is managed by `position_open` and `position_closed` +You can set it up in opossite way as well. +If position topic is defined than state topic is ignored. -If a state topic is not defined, the cover will work in optimistic mode. In this mode, the cover will immediately change state (`open` or `closed`) after every command sent by Home Assistant. If a state topic is defined, the cover will wait for a message on `state_topic` matching `state_open` or `state_closed` before changing state in Home Assistant. +If a state topic and position topic are not defined, the cover will work in optimistic mode. In this mode, the cover will immediately change state (`open` or `closed`) after every command sent by Home Assistant. If a state topic/position topic is defined, the cover will wait for a message on `state_topic` or `position_topic`. -Optimistic mode can be forced, even if a `state_topic` is defined. Try to enable it if experiencing incorrect cover operation. +Optimistic mode can be forced, even if a `state_topic` / `position_topic` is defined. Try to enable it if experiencing incorrect cover operation (Google Assistant gauge may need optimistic mode as it often send request to your Home Assistant immediately after send set_cover_position in which case MQTT could be too slow). The `mqtt` cover platform optionally supports an `availability_topic` to receive online and offline messages (birth and LWT messages) from the MQTT cover device. During normal operation, if the MQTT cover device goes offline (i.e. publishes `payload_not_available` to `availability_topic`), Home Assistant will display the cover as "unavailable". If these messages are published with the `retain` flag set, the cover will receive an instant update after subscription and Home Assistant will display correct availability state of the cover when Home Assistant starts up. If the `retain` flag is not set, Home Assistant will display the cover as "unavailable" when Home Assistant starts up. @@ -63,7 +68,7 @@ payload_stop: type: string default: STOP state_topic: - description: The MQTT topic subscribed to receive cover state messages. + description: The MQTT topic subscribed to receive cover state messages. Use only if not using get_position_topic. State topic can only read open/close state. Cannot read position state. required: false type: string state_open: @@ -76,6 +81,20 @@ state_closed: required: false type: string default: closed +position_topic: + description: The MQTT topic subscribed to receive cover position messages. Always in favor if used together with state_topic. + required: false + type: integer +position_open: + description: Number which represents open position. + required: false + type: integer + default: 100 +position_closed: + description: Number which represents closed position. + required: false + type: integer + default: 0 availability_topic: description: "The MQTT topic subscribed to to receive birth and LWT messages from the MQTT cover device. If `availability_topic` is not defined, the cover availability state will always be `available`. If `availability_topic` is defined, the cover availability state will be `unavailable` by default." required: false @@ -110,11 +129,11 @@ value_template: required: false type: string set_position_topic: - description: The MQTT topic to publish position commands to. + description: The MQTT topic to publish position commands to. You need to set position_topic as well if you want to use position topic. Use template if position topic wants different values than within range `position_closed` - `position_open`. If template is not defined and `position_closed != 100` and `position_open != 0` then proper position value is calculated from percentage position. required: false type: string set_position_template: - description: " Defines a [template](/topics/templating/) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{{position}}`. If no template is defined, the numeric position (0-100) will be written directly to the topic." + description: " Defines a [template](/topics/templating/) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{{position}}`. If no template is defined, the position (0-100) will be calculated according to `position_open` and `position_closed` values." required: false type: string tilt_command_topic: @@ -194,9 +213,9 @@ device: In this section you will find some real-life examples of how to use this platform. -### {% linkable_title Full configuration without tilt %} +### {% linkable_title Full configuration state topic without tilt %} -The example below shows a full configuration for a cover without tilt. +The example below shows a full configuration for a cover without tilt with state topic only. ```yaml # Example configuration.yaml entry @@ -219,6 +238,32 @@ cover: value_template: '{% raw %}{{ value.x }}{% endraw %}' ``` +### {% linkable_title Full configuration position topic without tilt %} + +The example below shows a full configuration for a cover without tilt with position topic. + +```yaml +# Example configuration.yaml entry +cover: + - platform: mqtt + name: "MQTT Cover" + command_topic: "home-assistant/cover/set" + position_topic: "home-assistant/cover/position" + availability_topic: "home-assistant/cover/availability" + set_position_topic: "home-assistant/cover/set_position" + qos: 0 + retain: true + payload_open: "OPEN" + payload_close: "CLOSE" + payload_stop: "STOP" + position_open: 100 + position_closed: 0 + payload_available: "online" + payload_not_available: "offline" + optimistic: false + value_template: '{% raw %}{{ value.x }}{% endraw %}' +``` + ### {% linkable_title Full configuration %} The example below shows a full configuration for a cover. From 0b17f216a2279fe79589569fa52a4712923efe16 Mon Sep 17 00:00:00 2001 From: DubhAd Date: Sun, 11 Nov 2018 20:16:50 +0000 Subject: [PATCH 03/84] Fixing templates (#7468) Updating the examples to use the things we keep telling people to use ;) --- source/_components/sensor.template.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_components/sensor.template.markdown b/source/_components/sensor.template.markdown index 06c69ba5925..8fea549c842 100644 --- a/source/_components/sensor.template.markdown +++ b/source/_components/sensor.template.markdown @@ -33,10 +33,10 @@ sensor: solar_angle: friendly_name: "Sun angle" unit_of_measurement: 'degrees' - value_template: "{{ states.sun.sun.attributes.elevation }}" + value_template: "{{ state_attr('sun.sun', 'elevation') }}" sunrise: - value_template: "{{ states.sun.sun.attributes.next_rising }}" + value_template: "{{ state_attr('sun.sun', 'next_rising') }}" ``` {% endraw %} @@ -103,7 +103,7 @@ sensor: solar_angle: friendly_name: "Sun Angle" unit_of_measurement: '°' - value_template: "{{ '%+.1f'|format(states.sun.sun.attributes.elevation) }}" + value_template: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}" ``` {% endraw %} @@ -162,7 +162,7 @@ sensor: value_template: >- {% if is_state('switch.kettle', 'off') %} off - {% elif states.switch.kettle.attributes.kwh|float < 1000 %} + {% elif state_attr('switch.kettle', 'kwh')|float < 1000 %} standby {% elif is_state('switch.kettle', 'on') %} on From ee28f8686e5a9ff1df40059906828c0ec25a43d9 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 11 Nov 2018 20:20:53 +0000 Subject: [PATCH 04/84] Update image_processing.tensorflow.markdown (#7467) --- source/_components/image_processing.tensorflow.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/image_processing.tensorflow.markdown b/source/_components/image_processing.tensorflow.markdown index 6a649ef63e1..b9b679a1b6e 100644 --- a/source/_components/image_processing.tensorflow.markdown +++ b/source/_components/image_processing.tensorflow.markdown @@ -22,7 +22,7 @@ The `tensorflow` image processing platform allows you to detect and recognize ob ## {% linkable_title Setup %} -You need to install the `tensorflow` Python packages with: `$ pip3 install tensorflow==1.11.0`. The wheel is not available for all platforms. See [the official install guide](https://www.tensorflow.org/install/) for other options. Hass.io has this package pre-installed. +You need to install the `tensorflow` Python packages with: `$ pip3 install tensorflow==1.11.0`. The wheel is not available for all platforms. See [the official install guide](https://www.tensorflow.org/install/) for other options. Hass.io is not yet supported but an addon is under development. This component requires files to be downloaded, compiled on your computer, and added to the Home Assistant configuration directory. These steps can be performed using the sample script at [this gist](https://gist.github.com/hunterjm/6f9332f92b60c3d5e448ad936d7353c3). Alternatively, if you wish to perform the process manually, the process is as follows: From 586ea56edc7d8e0329205f377a2dca659cd01123 Mon Sep 17 00:00:00 2001 From: Michael Requeny Date: Sun, 11 Nov 2018 15:21:18 -0500 Subject: [PATCH 05/84] Add troubleshooting tip to UPS documentation (#7463) * Add troubleshooting tip to UPS documentation * :pencil2: Tweak --- source/_components/sensor.ups.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/sensor.ups.markdown b/source/_components/sensor.ups.markdown index fe1ae61a91a..0c78dac2067 100644 --- a/source/_components/sensor.ups.markdown +++ b/source/_components/sensor.ups.markdown @@ -48,3 +48,7 @@ Configuration options for the UPS Sensor:

The UPS sensor logs into the UPS My Choice website to scrape package data. It does not use an API. Use at your own risk.

+ +

+If the UPS sensor is throwing an error about not being able to login to the UPS My Choice website, it's likely because there is a new UPS Technology Agreement (UTA) preventing the scraper from accessing the package data. Login to UPS My Choice manually and accept the UTA to resolve this. +

From 4998875ac8acb711a43203f65a87c4f41a1c25dd Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 11 Nov 2018 23:37:47 +0100 Subject: [PATCH 06/84] Move {% raw %} --- source/_docs/automation/templating.markdown | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/source/_docs/automation/templating.markdown b/source/_docs/automation/templating.markdown index a34d46cc3c6..9bba3c630c9 100644 --- a/source/_docs/automation/templating.markdown +++ b/source/_docs/automation/templating.markdown @@ -14,6 +14,7 @@ In Home Assistant 0.19 we introduced a new powerful feature: variables in script The trigger data made is available during [template](/docs/configuration/templating/) rendering as the `trigger` variable. +{% raw %} ```yaml # Example configuration.yaml entries automation: @@ -23,28 +24,29 @@ automation: action: service: notify.notify data_template: - message: >{% raw %} + message: > Paulus just changed from {{ trigger.from_state.state }} - to {{ trigger.to_state.state }}{% endraw %} + to {{ trigger.to_state.state }} automation 2: trigger: platform: mqtt topic: /notify/+ action: - service_template: >{% raw %} - notify.{{ trigger.topic.split('/')[-1] }}{% endraw %} + service_template: > + notify.{{ trigger.topic.split('/')[-1] }} data_template: - message: {% raw %}'{{ trigger.payload }}'{% endraw %} + message: '{{ trigger.payload }}' ``` +{% endraw %} ## {% linkable_title Important Template Rules %} There are a few very important rules to remember when writing automation templates: -1. You ***must*** use `data_template` in place of `data` when using templates in the `data` section of a service call. -1. You ***must*** use `service_template` in place of `service` when using templates in the `service` section of a service call. -1. You ***must*** surround single-line templates with double quotes (`"`) or single quotes (`'`). +1. You **must** use `data_template` in place of `data` when using templates in the `data` section of a service call. +1. You **must** use `service_template` in place of `service` when using templates in the `service` section of a service call. +1. You **must** surround single-line templates with double quotes (`"`) or single quotes (`'`). 1. It is advised that you prepare for undefined variables by using `if ... is not none` or the [`default` filter](http://jinja.pocoo.org/docs/dev/templates/#default), or both. 1. It is advised that when comparing numbers, you convert the number(s) to a [`float`](http://jinja.pocoo.org/docs/dev/templates/#float) or an [`int`](http://jinja.pocoo.org/docs/dev/templates/#int) by using the respective [filter](http://jinja.pocoo.org/docs/dev/templates/#list-of-builtin-filters). 1. While the [`float`](http://jinja.pocoo.org/docs/dev/templates/#float) and [`int`](http://jinja.pocoo.org/docs/dev/templates/#int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables. From 8c08d4e2544270fcee79368db2d556874810e6dc Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 12 Nov 2018 11:13:16 +0100 Subject: [PATCH 07/84] Update apcupsd sensor component configuration (#7474) --- source/_components/sensor.apcupsd.markdown | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/_components/sensor.apcupsd.markdown b/source/_components/sensor.apcupsd.markdown index bfaf33769b6..74e2c9735bf 100644 --- a/source/_components/sensor.apcupsd.markdown +++ b/source/_components/sensor.apcupsd.markdown @@ -28,9 +28,12 @@ sensor: - linev ``` -Configuration variables: - -- **resources** array (*Required*): Contains all entries to display. +{% configuration %} +resources: + description: Contains all entries to display. + required: true + type: list +{% endconfiguration %} ### {% linkable_title Example %} From 423f5918ef899d5e299ec55e163f765a613fa877 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 12 Nov 2018 11:13:47 +0100 Subject: [PATCH 08/84] Update file sensor component configuration (#7473) --- source/_components/sensor.file.markdown | 27 +++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/source/_components/sensor.file.markdown b/source/_components/sensor.file.markdown index 3e8ea059e98..7e426c5d979 100644 --- a/source/_components/sensor.file.markdown +++ b/source/_components/sensor.file.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Local Polling" ha_release: 0.45 --- - The `file` sensor platform reads the entries from a plain-text file and shows the found value. Only the last line of the file is used. This is similar to do `$ tail -n 1 sensor.txt` on the command-line. Note that file paths must be added to [whitelist_external_dirs](/docs/configuration/basic/). ## {% linkable_title Configuration %} @@ -27,12 +26,25 @@ sensor: file_path: /home/user/.homeassistant/sensor-data.txt ``` -Configuration variables: - -- **file_path** (*Required*): path to file that stores the sensor data. -- **name** (*Optional*): Name of the sensor to use in the frontend. Defaults to `File`. -- **unit_of_measurement** (*Optional*): Defines the units of measurement of the sensor, if any. -- **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload. +{% configuration %} +file_path: + description: Path to file that stores the sensor data. + required: true + type: string +name: + description: Name of the sensor to use in the frontend. + required: false + default: file name + type: string +unit_of_measurement: + description: Defines the units of measurement of the sensor, if any. + required: false + type: string +value_template: + description: Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload. + required: false + type: template +{% endconfiguration %} ## {% linkable_title Examples %} @@ -59,4 +71,3 @@ sensor: value_template: {% raw %}'{{ value_json.temperature }}'{% endraw %} unit_of_measurement: '°C' ``` - From df2d7ba55f9a3518b8a160150212e1cee68d12fb Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 12 Nov 2018 10:14:18 +0000 Subject: [PATCH 09/84] Update image_processing.tensorflow.markdown (#7476) --- source/_components/image_processing.tensorflow.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/image_processing.tensorflow.markdown b/source/_components/image_processing.tensorflow.markdown index b9b679a1b6e..1ecd0591fff 100644 --- a/source/_components/image_processing.tensorflow.markdown +++ b/source/_components/image_processing.tensorflow.markdown @@ -16,7 +16,7 @@ ha_release: 0.82 The `tensorflow` image processing platform allows you to detect and recognize objects in a camera image using [TensorFlow](https://www.tensorflow.org/). The state of the entity is the number of objects detected, and recognized objects are listed in the `summary` attribute along with quantity. The `matches` attribute provides the confidence `score` for recognition and the bounding `box` of the object for each detection category.

- The following packages must be installed on Hassbian after following the setup for the component to work: + The following packages must be installed on Hassbian/Raspbian before following the setup for the component to work: `$ sudo apt-get install libatlas-base-dev libopenjp2-7 libtiff5`

From 70232f9d846d0f33d14cf87048c20db8ea5ea846 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 12 Nov 2018 11:51:07 +0100 Subject: [PATCH 10/84] Update shell_command component configuration (#7471) --- source/_components/shell_command.markdown | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/source/_components/shell_command.markdown b/source/_components/shell_command.markdown index b50d8f00a0c..15f81dea59d 100644 --- a/source/_components/shell_command.markdown +++ b/source/_components/shell_command.markdown @@ -25,12 +25,14 @@ shell_command: restart_pow: touch ~/.pow/restart.txt ``` -Configuration variables: +{% configuration %} +alias: + description: Give the shell command a name (alias) as a variable and set the command you want to execute after the colon. e.g., `alias`:`the shell command you want to execute`. + required: true + type: string +{% endconfiguration %} - - Alias for the command - - Command itself. - -The commands can be dynamic, using templates to insert values for arguments. When using templates, shell_command runs in a more secure environment which doesn't allow any shell helpers like automatically expanding the home dir `~` or using pipe symbols to run multiple commands. Similarly, only content after the first space can be generated by a template. This means the command name itself cannot be generated by a template, but it must be literally provided. +The commands can be dynamic, using templates to insert values for arguments. When using templates, shell_command runs in a more secure environment which doesn't allow any shell helpers like automatically expanding the home dir `~` or using pipe symbols to run multiple commands. Similarly, only content after the first space can be generated by a template. This means the command name itself cannot be generated by a template, but it must be literally provided. Any service data passed into the service call to activate the shell command will be available as a variable within the template. @@ -54,7 +56,7 @@ input_number: min: 18 max: 32 step: 1 - + {% raw %} shell_command: set_ac_to_slider: 'irsend SEND_ONCE DELONGHI AC_{{ states.input_number.ac_temperature.state }}_AUTO' From 657d1e59dbe7b540a8fd63022b3b890f6de15b00 Mon Sep 17 00:00:00 2001 From: Victor Cerutti Date: Mon, 12 Nov 2018 11:53:42 +0100 Subject: [PATCH 11/84] Fix config that could be interpreted as octal (#7478) Some postal codes have a leading zero which would be interpreted as an octal int. Adding quotes on the documentation to be avoid confusion with those postal codes. Fixes https://github.com/home-assistant/home-assistant/issues/18375 --- source/_components/sensor.meteo_france.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.meteo_france.markdown b/source/_components/sensor.meteo_france.markdown index e8981c4a08d..23a139e2dca 100644 --- a/source/_components/sensor.meteo_france.markdown +++ b/source/_components/sensor.meteo_france.markdown @@ -23,7 +23,7 @@ To add Météo-France to your installation, add the following to your `configura # Example configuration.yaml entry sensor: - platform: meteo_france - postal_code: 76000 + postal_code: '76000' monitored_conditions: - temperature - weather From 460bf354f5045730da5f5d4f6b9f7ffcb757adf1 Mon Sep 17 00:00:00 2001 From: panache67 Date: Tue, 13 Nov 2018 08:30:42 +0100 Subject: [PATCH 12/84] Update sensor.rmvtransport.markdown (#7483) fixed value for S-Bahn in example. --- source/_components/sensor.rmvtransport.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.rmvtransport.markdown b/source/_components/sensor.rmvtransport.markdown index 0ecb8212fd6..0f96c7bfb69 100644 --- a/source/_components/sensor.rmvtransport.markdown +++ b/source/_components/sensor.rmvtransport.markdown @@ -98,7 +98,7 @@ sensor: - 'RB' - 'RE' - 'Bus' - - 'S' + - 'S-Bahn' - station: 3006907 products: 'Bus' destinations: ['Wiesbaden Dernsches Gelände', 'Mainz Hauptbahnhof'] @@ -106,7 +106,7 @@ sensor: - station: 3006904 lines: 'S8' max_journeys: 5 - products: 'S' + products: 'S-Bahn' ``` The first sensor will return S-Bahn, bus, RB and RE trains departures from Frankfurt Hauptbahnhof to Frankfurt Airport or Stadium that are at least 5 minutes away. From 80e8b201ad15fb563b753923509dc0d3dc591558 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 13 Nov 2018 14:18:32 +0100 Subject: [PATCH 13/84] Update time_zone entry --- source/_docs/configuration/basic.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/configuration/basic.markdown b/source/_docs/configuration/basic.markdown index 82910cb4161..5ad0e89bdaf 100644 --- a/source/_docs/configuration/basic.markdown +++ b/source/_docs/configuration/basic.markdown @@ -43,7 +43,7 @@ unit_system: required: false type: string time_zone: - description: "Pick yours from here: [http://en.wikipedia.org/wiki/List_of_tz_database_time_zones](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)" + description: "Pick your time zone from the column **TZ** of [Wikipedia's list of tz database time zones](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)" required: false type: string name: From 82b58834839b4c6dd7ed20b7aa006a59b90cd55d Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 14 Nov 2018 09:48:09 +0000 Subject: [PATCH 14/84] Update ffmpeg.markdown (#7502) --- source/_components/ffmpeg.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/ffmpeg.markdown b/source/_components/ffmpeg.markdown index 24f4f30de98..d567fb2de07 100644 --- a/source/_components/ffmpeg.markdown +++ b/source/_components/ffmpeg.markdown @@ -14,7 +14,7 @@ ha_category: Image Processing The `ffmpeg` component allows other Home Assistant components to process video and audio streams. This component supports all FFmpeg versions since 3.0.0; if you have an older version, please update.

-You need the `ffmpeg` binary in your system path. On Debian 8 or Raspbian (Jessie) you can install it from [debian-backports](https://backports.debian.org/Instructions/). If you want [hardware acceleration](https://trac.ffmpeg.org/wiki/HWAccelIntro) support on a Raspberry Pi, you will need to build from source by yourself. Windows binaries are available on the [FFmpeg](http://www.ffmpeg.org/) website. +You need the `ffmpeg` binary in your system path. On Hassbian you will need to login as the `pi` user and `sudo apt install ffmpeg`. On Debian 8 or Raspbian (Jessie) you can install it from [debian-backports](https://backports.debian.org/Instructions/). If you want [hardware acceleration](https://trac.ffmpeg.org/wiki/HWAccelIntro) support on a Raspberry Pi, you will need to build from source by yourself. Windows binaries are available on the [FFmpeg](http://www.ffmpeg.org/) website.

From 7cb9d0ab82dfe58faffa82228e76dd9bf7fa0937 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 14 Nov 2018 09:48:31 +0000 Subject: [PATCH 15/84] Update camera.ffmpeg.markdown (#7503) --- source/_components/camera.ffmpeg.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/camera.ffmpeg.markdown b/source/_components/camera.ffmpeg.markdown index 86f1c261f05..7bf659ce119 100644 --- a/source/_components/camera.ffmpeg.markdown +++ b/source/_components/camera.ffmpeg.markdown @@ -17,7 +17,7 @@ The `ffmpeg` platform allows you to use any video feed as a camera in Home Assis ## {% linkable_title Configuration %} -To enable your FFmpeg feed in your installation, add the following to your `configuration.yaml` file: +To enable your FFmpeg feed in your installation you must first configure the [ffmpeg component](https://www.home-assistant.io/components/ffmpeg/), then add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry From 001e400da3486a021dbe519c77e3d9183f209bf6 Mon Sep 17 00:00:00 2001 From: Mohammed Chotia Date: Wed, 14 Nov 2018 11:50:13 +0200 Subject: [PATCH 16/84] Correct type from `picture-status` to `plant-status` (#7499) Correct type from `picture-status` to `plant-status` --- source/_lovelace/plant-status.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_lovelace/plant-status.markdown b/source/_lovelace/plant-status.markdown index 784c4a9ccd9..0b7270e3f76 100644 --- a/source/_lovelace/plant-status.markdown +++ b/source/_lovelace/plant-status.markdown @@ -20,7 +20,7 @@ Screenshot of the plant status card. {% configuration %} type: required: true - description: picture-status + description: plant-status type: string entity: required: true From 861e1d60141c8ec52db9ac9eeac7d56d9b0f31a8 Mon Sep 17 00:00:00 2001 From: chrismcneil Date: Wed, 14 Nov 2018 04:51:19 -0500 Subject: [PATCH 17/84] Update route53.markdown (#7496) Removing 'home." from the base domain. Following this configuration previously would create the following entries: vpn.home.yourdomain.com, hassio.home.yourdomain.com, home.home.yourdomain.com. Now it will create vpn.yourdomain.com, hassio.yourdomain.com, home.yourdomain.com. --- source/_components/route53.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/route53.markdown b/source/_components/route53.markdown index a00e5e708d0..1a0fd16f4fd 100644 --- a/source/_components/route53.markdown +++ b/source/_components/route53.markdown @@ -72,7 +72,7 @@ route53: aws_access_key_id: ABC123 aws_secret_access_key: DEF456 zone: ZONEID678 - domain: home.yourdomain.com + domain: yourdomain.com records: - vpn - hassio From e9a2e155e569714b741ddff6e5d446e94c931cbf Mon Sep 17 00:00:00 2001 From: hulkhaugen Date: Wed, 14 Nov 2018 10:52:55 +0100 Subject: [PATCH 18/84] Added "monitored_conditions" (#7494) Added `monitored_conditions` to configure additional functionality beneath `binary_sensor` and `sensor` key within the `openuv` section of the `configuration.yaml` file. Without it, you'll end up with a "expected a dictionary for dictionary value @ data..."-error --- source/_components/openuv.markdown | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/source/_components/openuv.markdown b/source/_components/openuv.markdown index 9da2251ce68..4366222a34b 100644 --- a/source/_components/openuv.markdown +++ b/source/_components/openuv.markdown @@ -98,18 +98,20 @@ To configure additional functionality, add configuration options beneath a `bina openuv: api_key: YOUR_OPENUV_API_KEY binary_sensors: - - uv_protection_window + monitored_conditions: + - uv_protection_window sensors: - - current_ozone_level - - current_uv_index - - current_uv_level - - max_uv_index - - safe_exposure_time_type_1 - - safe_exposure_time_type_2 - - safe_exposure_time_type_3 - - safe_exposure_time_type_4 - - safe_exposure_time_type_5 - - safe_exposure_time_type_6 + monitored_conditions: + - current_ozone_level + - current_uv_index + - current_uv_level + - max_uv_index + - safe_exposure_time_type_1 + - safe_exposure_time_type_2 + - safe_exposure_time_type_3 + - safe_exposure_time_type_4 + - safe_exposure_time_type_5 + - safe_exposure_time_type_6 ```

From 17a883269773b85b2708b8a9817b5ec3b93b7557 Mon Sep 17 00:00:00 2001 From: Alex Lauerman Date: Thu, 15 Nov 2018 02:24:04 -0600 Subject: [PATCH 19/84] Fixed Configuration link (#7511) This was not displaying correctly on the docs site ("##" were showing). --- source/_components/tesla.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/tesla.markdown b/source/_components/tesla.markdown index ecff18947fb..1d088c67369 100644 --- a/source/_components/tesla.markdown +++ b/source/_components/tesla.markdown @@ -23,7 +23,7 @@ This component provides the following platforms: - Climate - HVAC control. Allow you to control (turn on/off, set target temperature) your Tesla's HVAC system. - Switch - Charger and max range switch. Allow you to start/stop charging and set max range charging. - ## {% linkable_title Configuration %} +## {% linkable_title Configuration %} To use Tesla in your installation, add the following to your `configuration.yaml` file: From f53128b9258caffef0f22c0a362d3e07ec568a21 Mon Sep 17 00:00:00 2001 From: Emacee Date: Thu, 15 Nov 2018 09:25:06 +0100 Subject: [PATCH 20/84] Update sensor.sigfox.markdown (#7506) Change IoT Class to Cloud Polling as it is using the Sigfox API. --- source/_components/sensor.sigfox.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.sigfox.markdown b/source/_components/sensor.sigfox.markdown index e11dc9600e8..4e34dcb41f7 100644 --- a/source/_components/sensor.sigfox.markdown +++ b/source/_components/sensor.sigfox.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: sigfox.png ha_category: Sensor -ha_iot_class: "Local Polling" +ha_iot_class: "Cloud Polling" ha_release: 0.68 --- From 350ca8f74c213a53e9e6ea3bb2e67a2577f20d3f Mon Sep 17 00:00:00 2001 From: Scott Gauche Date: Thu, 15 Nov 2018 03:28:50 -0500 Subject: [PATCH 21/84] Add certfile and keyfile to default configuration (#7508) --- source/_addons/lets_encrypt.markdown | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/source/_addons/lets_encrypt.markdown b/source/_addons/lets_encrypt.markdown index 6b298f43b9f..c50d52fb273 100644 --- a/source/_addons/lets_encrypt.markdown +++ b/source/_addons/lets_encrypt.markdown @@ -19,7 +19,9 @@ Setup and manage a [Let's Encrypt](https://letsencrypt.org/) certificate. This a ```json { "email": "example@example.com", - "domains": ["example.com", "mqtt.example.com", "hass.example.com"] + "domains": ["example.com", "mqtt.example.com", "hass.example.com"], + "certfile": "fullchain.pem", + "keyfile": "privkey.pem" } ``` @@ -32,6 +34,16 @@ domains: description: A list of domains to create/renew the certificate. required: true type: list +certfile: + description: Name of the certfile that is created. Leave as default value. + required: true + type: string + default: fullchain.pem +keyfile: + description: Name of the keyfile that is created. Leave as default value. + required: true + type: string + default: privkey.pem {% endconfiguration %} ## {% linkable_title Home Assistant configuration %} From 0d8747d485f4337e4a1588b1d1daf2a6709ff130 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 15 Nov 2018 14:26:57 +0100 Subject: [PATCH 22/84] Release 0.82.1 --- _config.yml | 6 +-- source/_posts/2018-11-08-release-82.markdown | 42 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/_config.yml b/_config.yml index 487a4a7cbfd..15c61e15a7b 100644 --- a/_config.yml +++ b/_config.yml @@ -142,13 +142,13 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 82 -current_patch_version: 0 -date_released: 2018-11-09 +current_patch_version: 1 +date_released: 2018-11-15 # 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: "#" +patch_version_notes: "#release-0821---november-15" # Minor release (Example #release-0431---april-25): # Date we moved to Discourse for comments diff --git a/source/_posts/2018-11-08-release-82.markdown b/source/_posts/2018-11-08-release-82.markdown index 7d49a470d33..e1ddb63dbb5 100644 --- a/source/_posts/2018-11-08-release-82.markdown +++ b/source/_posts/2018-11-08-release-82.markdown @@ -38,6 +38,48 @@ And we have one more thing… we have soft-forked Open Z-Wave and have added sup - Add a component for GreenEye Monitor ([@jkeljo] - [#16378]) ([greeneye_monitor docs]) (new-platform) - TensorFlow image_processing component ([@hunterjm] - [#17795]) ([image_processing.tensorflow docs]) (new-platform) +## {% linkable_title Release 0.82.1 - November 15 %} + +- catch key error when saving image ([@hunterjm] - [#18365]) ([image_processing.tensorflow docs]) +- Fix hangouts notify ([@MartinHjelmare] - [#18372]) ([notify docs]) +- Fix including from sub dir ([@bramkragten] - [#18378]) +- Fix default value for optional Sense configuration parameter ([@claytonjn] - [#18379]) ([sense docs]) +- cancel off_delay action ([@dgomes] - [#18389]) ([binary_sensor.mqtt docs]) +- Changed checking of cover state closed from 0 to closed_position variable. ([@pszafer] - [#18407]) ([cover.mqtt docs]) +- updated pydaikin version ([@fredrike] - [#18413]) ([daikin docs]) ([climate.daikin docs]) +- edp_redy: increase UPDATE_INTERVAL ([@abmantis] - [#18429]) ([edp_redy docs]) +- Update pyozw to 0.1.1 ([@pvizeli] - [#18436]) ([zwave docs]) +- Fix AsusWRT ([@kennedyshead] - [#18400]) + +[#18365]: https://github.com/home-assistant/home-assistant/pull/18365 +[#18372]: https://github.com/home-assistant/home-assistant/pull/18372 +[#18378]: https://github.com/home-assistant/home-assistant/pull/18378 +[#18379]: https://github.com/home-assistant/home-assistant/pull/18379 +[#18389]: https://github.com/home-assistant/home-assistant/pull/18389 +[#18407]: https://github.com/home-assistant/home-assistant/pull/18407 +[#18413]: https://github.com/home-assistant/home-assistant/pull/18413 +[#18429]: https://github.com/home-assistant/home-assistant/pull/18429 +[#18436]: https://github.com/home-assistant/home-assistant/pull/18436 +[#18400]: https://github.com/home-assistant/home-assistant/pull/18400 +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@abmantis]: https://github.com/abmantis +[@bramkragten]: https://github.com/bramkragten +[@claytonjn]: https://github.com/claytonjn +[@dgomes]: https://github.com/dgomes +[@fredrike]: https://github.com/fredrike +[@hunterjm]: https://github.com/hunterjm +[@pszafer]: https://github.com/pszafer +[@pvizeli]: https://github.com/pvizeli +[binary_sensor.mqtt docs]: /components/binary_sensor.mqtt/ +[climate.daikin docs]: /components/climate.daikin/ +[cover.mqtt docs]: /components/cover.mqtt/ +[daikin docs]: /components/daikin/ +[edp_redy docs]: /components/edp_redy/ +[image_processing.tensorflow docs]: /components/image_processing.tensorflow/ +[notify docs]: /components/notify/ +[sense docs]: /components/sense/ +[zwave docs]: /components/zwave/ + ## {% linkable_title If you need help... %} ...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. From c0573af71789379ac2d1c47ad9be6829a490bf5f Mon Sep 17 00:00:00 2001 From: pattyland Date: Thu, 15 Nov 2018 20:00:04 +0100 Subject: [PATCH 23/84] Update vacuum.xiaomi_miio.markdown (#7519) - Updated links to HTTPS - Updated supported version of iOS App - fixed markup for note, because the line breaks were not visible on the website but would improve readability --- source/_components/vacuum.xiaomi_miio.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/_components/vacuum.xiaomi_miio.markdown b/source/_components/vacuum.xiaomi_miio.markdown index 500e176081c..24273d648ba 100644 --- a/source/_components/vacuum.xiaomi_miio.markdown +++ b/source/_components/vacuum.xiaomi_miio.markdown @@ -13,7 +13,7 @@ ha_release: 0.51 ha_iot_class: "Local Polling" --- -The `xiaomi miio` vacuum platform allows you to control the state of your [Xiaomi Mi Robot Vacuum](http://www.mi.com/roomrobot/). +The `xiaomi miio` vacuum platform allows you to control the state of your [Xiaomi Mi Robot Vacuum](https://www.mi.com/roomrobot/). Currently supported services are: @@ -135,9 +135,9 @@ The following table shows the units of measurement for each attribute:

As per [python-miio issue 185](https://github.com/rytilahti/python-miio/issues/185) the Android Mi Home app no longer stores the token within the database (it's retrieved from Xiaomi servers from version 5.0.31+). Currently the only known fix is to uninstall, then install a downgraded version of the apk. Apkmirror is a trusted source for older versions of the app. [Mi-Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/) is confirmed as working for the following Android methods. Using older version than 5.0.30 is not recommended as it might lack support for some newer devices like the Roborock S50. - -The iPhone app still stores the token in the sqlite db as of v4.7.18 (July 17, 2018). - +

+The iPhone app still stores the token in the sqlite db as of v4.9.1 (Nov 7, 2018). +

This token (32 hexadecimal characters) is required for the Xiaomi Mi Robot Vacuum, Mi Robot 2 (Roborock) Vacuum, Xiaomi Philips Lights and Xiaomi IR Remote. The Xiaomi Gateway uses another security method and requires a `key` (16 alphanumeric chars), which can be obtained easily via a hidden menu item at the Mi-Home app or using the `miio` command line tool.

@@ -248,12 +248,12 @@ To fetch the token follow these instructions depending on your mobile phone plat 1. Configure the robot with the Mi-Home app. 2. Using iTunes, create an unencrypted backup of your iPhone. -3. Install [iBackup Viewer](http://www.imactools.com/iphonebackupviewer/), open it, and open your backup. +3. Install [iBackup Viewer](https://www.imactools.com/iphonebackupviewer/), open it, and open your backup. 4. Open the "Raw Data" module. 5. Navigate to `com.xiaomi.mihome`. 6. Search for a file that looks like this: `123456789_mihome.sqlite` – note that `_mihome.sqlite` is *not* the correct file. 7. Save this file to your filesystem. -8. Install [DB Browser for SQLite](http://sqlitebrowser.org/). +8. Install [DB Browser for SQLite](https://sqlitebrowser.org/). 9. Open DB Browser and load the `.sqlite` file you saved from your backup. 10. Click on the `Execute SQL` tab. 11. Input and run this query: `SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%vacuum%"` From 78c11cf7bf5140b1305a623d881ac721c44b02ec Mon Sep 17 00:00:00 2001 From: cdce8p <30130371+cdce8p@users.noreply.github.com> Date: Thu, 15 Nov 2018 20:18:24 +0100 Subject: [PATCH 24/84] HomeKit doc improvements (#7515) * HomeKit improvements * Bugfix * Added move install section * Added additional troubleshooting notes * :pencil2: Spelling & grammar --- source/_components/homekit.markdown | 81 +++++++++++++++++++---------- 1 file changed, 53 insertions(+), 28 deletions(-) diff --git a/source/_components/homekit.markdown b/source/_components/homekit.markdown index d87844743f3..66de0951e95 100644 --- a/source/_components/homekit.markdown +++ b/source/_components/homekit.markdown @@ -1,7 +1,7 @@ --- layout: page title: "HomeKit" -description: "Instructions on how to setup the HomeKit component in Home Assistant." +description: "Instructions on how to set up the HomeKit component in Home Assistant." date: 2018-02-20 17:30 sidebar: true comments: false @@ -12,7 +12,7 @@ ha_release: 0.64 logo: apple-homekit.png --- -The `HomeKit` component allows you to forward entities from Home Assistant to Apple `HomeKit`, so they can be controlled from Apple's `Home` app and `Siri`. Please make sure that you have read the [considerations](#considerations) listed below to save you some trouble later. However if you do encounter issues, checkout the [troubleshooting](#troubleshooting) section. +The `HomeKit` component allows you to forward entities from Home Assistant to Apple `HomeKit`, so they can be controlled from Apple's `Home` app and `Siri`. Please make sure that you have read the [considerations](#considerations) listed below to save you some trouble later. However if you do encounter issues, check out the [troubleshooting](#troubleshooting) section.

If you want to control `HomeKit` only devices with Home Assistant, check out the [HomeKit controller](/components/homekit_controller/) component. @@ -74,7 +74,7 @@ homekit: required: false type: string filter: - description: Filters for entities to be included / excluded from HomeKit. ([Configure Filter](#configure-filter)) + description: Filters for entities to be included/excluded from HomeKit. ([Configure Filter](#configure-filter)) required: false type: map keys: @@ -105,7 +105,7 @@ homekit: type: map keys: name: - description: Name of entity to show in HomeKit. HomeKit will cache the name on the first run so a device must be removed and then re-added for any change to take effect. + description: Name of the entity to show in HomeKit. HomeKit will cache the name on the first run so a device must be removed and then re-added for any change to take effect. required: false type: string code: @@ -142,20 +142,25 @@ homekit: After Home Assistant has started, the entities specified by the filter are exposed to `HomeKit` if they are [supported](#supported-components). To add them: 1. Open the Home Assistant frontend. A new card will display the `pin code`. 1. Open the `Home` app. -2. Click `Add Accessory`, than select `Don't Have a Code or Can't Scan?` and choose the `Home Assistant Bridge`. +2. Click `Add Accessory`, then select `Don't Have a Code or Can't Scan?` and choose the `Home Assistant Bridge`. 4. Confirm that you are adding an `Uncertified Accessory` by clicking on `Add Anyway`. 5. Enter the `PIN` code. -6. Follow the setup be clicking on `Next` and lastly `Done` in the top right hand corner. +6. Follow the setup by clicking on `Next` and lastly `Done` in the top right-hand corner. 7. The `Home Assistant` Bridge and the Accessories should now be listed in the `Home` app. -After the setup is completed you should be able to control your Home Assistant components through `Home` and `Siri`. +After the setup is completed, you should be able to control your Home Assistant components through `Home` and `Siri`. +## {% linkable_title Move Home Assistant install %} + +If you like to retain your HomeKit pairing through a move to a new Home Assistant device or installation, besides copying the configurations files you need to copy the `.homekit.state` file inside your configurations directory. Keep in mind though that the file is usually hidden by default, depending on your operating system. + +Before you copy it, make sure to stop the old and new Home Assistant instances first entirely, otherwise it won't work. ## {% linkable_title Considerations %} ### {% linkable_title Accessory ID %} -Currently this component uses the `entity_id` to generate a unique `accessory id (aid)` for `HomeKit`. The `aid` is used to identify a device and save all configurations made for it. This however means that if you decide to change an `entity_id` all configurations for this accessory made in the `Home` app will be lost. +Currently, this component uses the `entity_id` to generate a unique `accessory id (aid)` for `HomeKit`. The `aid` is used to identify a device and save all configurations made for it. This, however, means that if you decide to change an `entity_id` all configurations for this accessory made in the `Home` app will be lost. ### {% linkable_title Device Limit %} @@ -163,19 +168,18 @@ The HomeKit guidelines only allow a maximum of 100 unique accessories (`aid`) pe ### {% linkable_title Persistence Storage %} -Unfortunately `HomeKit` doesn't support any kind of persistent storage - only the configuration for accessories that are added to the `Home Assistant Bridge` are kept. To avoid problems it is recommended to use an automation to always start `HomeKit` with at least the same entities setup. If for some reason some entities are not setup, their config will be deleted. (State unknown or similar will not cause any issues.) +Unfortunately `HomeKit` doesn't support any persistent storage - only the configuration for accessories that are added to the `Home Assistant Bridge` are kept. To avoid problems, it is recommended to use an automation to always start `HomeKit` with at least the same entities setup. If for some reason some entities are not set up, their config will be deleted. (State unknown or similar will not cause any issues.) A common situation might be if you decide to disable parts of the configuration for testing. Please make sure to disable `auto start` and `turn off` the `Start HomeKit` automation (if you have one). - ## {% linkable_title Disable Auto Start %} -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`. +Depending on your setup, it might be necessary to disable `Auto Start` for all accessories to be available for `HomeKit`. Only those entities that are fully set up when the `HomeKit` component is started, can be added. To start `HomeKit` when `auto_start: False`, you can call the service `homekit.start`. -If you have Z-Wave entities you want 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. +If you have Z-Wave entities you want to be exposed to HomeKit, then you'll need to disable auto start and then start it after the Z-Wave mesh is ready. This is because the Z-Wave entities won't be fully set up until then. This can be automated using an automation. -

+Please remember that you can only have a single `automation` entry. Add the automation to your existing automations.

{% raw %} @@ -202,7 +206,7 @@ For a general delay where your component doesn't generate an event, you can also {% raw %} ```yaml -# Example using a delay after start of Home Assistant +# Example using a delay after the start of Home Assistant homekit: auto_start: False @@ -217,10 +221,9 @@ automation: ``` {% endraw %} - ## {% linkable_title Configure Filter %} -By default no entity will be excluded. To limit which entities are being exposed to `HomeKit`, you can use the `filter` parameter. Keep in mind only [supported components](#supported-components) can be added. +By default, no entity will be excluded. To limit which entities are being exposed to `HomeKit`, you can use the `filter` parameter. Keep in mind only [supported components](#supported-components) can be added. {% raw %} ```yaml @@ -252,7 +255,6 @@ Filters are applied as follows: - if entity is included, pass (as #2 above) - if entity include and exclude, the entity exclude is ignored - ## {% linkable_title Supported Components %} The following components are currently supported: @@ -281,7 +283,6 @@ The following components are currently supported: | switch | Switch | Represented as a switch by default but can be changed by using `type` within `entity_config`. | | water_heater | WaterHeater | All water_heater devices. | - ## {% linkable_title Troubleshooting %} ### {% linkable_title Deleting the `.homekit.state` file %} @@ -313,48 +314,72 @@ homekit: ``` #### {% linkable_title PIN doesn't appear as persistent status %} + You might have paired the `Home Assistant Bridge` already. If not, delete the `.homekit.state` file ([guide](#deleting-the-homekitstate-file)). #### {% linkable_title `Home Assistant Bridge` doesn't appear in the Home App (for pairing) %} -For `Docker` users: make sure to set `network_mode: host`. Other reasons could be network related. Make sure to check your router configuration. For some it helped when the Home Assistant device was using WIFI, not LAN. Remember that the iOS device needs to be in the same local network as the Home Assistant device for paring. + +This is often setup and network related. Make sure to check the other issues below as well, but things that might work include: +- Check your router configuration +- Try with WIFI **and** LAN +- Change the default [port](#port) + +Remember that the iOS device needs to be in the same local network as the Home Assistant device for paring. + +#### {% linkable_title `Home Assistant Bridge` doesn't appear in the Home App (for pairing) - Docker %} + +Set `network_mode: host`. If you have further problems this [issue](https://github.com/home-assistant/home-assistant/issues/15692) might help. + +#### {% linkable_title `Home Assistant Bridge` doesn't appear in the Home App (for pairing) - VirtualBox %} + +Configure the network mode as `networkbridge`. Otherwise the Home Assistant Bridge won't be exposed to the network. #### {% linkable_title Pairing hangs - zeroconf error %} + Paining eventually fails, you might see and an error message `NonUniqueNameException`. To resolve this, you need to replace a specific file. See the following git issues for more details: [home-assistant#14567](https://github.com/home-assistant/home-assistant/issues/14567) and [home-assistant#17181](https://github.com/home-assistant/home-assistant/issues/17181) #### {% linkable_title Pairing hangs - only works with debug config %} + Pairing works fine when the filter is set to only include `demo.demo`, but fails with normal config. See [specific entity doesn't work](#specific-entity-doesnt-work) -#### {% linkable_title Duplicate AID found when attempting to add accessory %} -Two of your entities share the same `entity_id`. Either resolve this or configure the [filter](#configure-filter) to exclude them. +#### {% linkable_title Pairing hangs - no error %} +Make sure that you don't try to add more than 100 accessories, see [device limit](#device-limit). In rare cases, one of your entities doesn't work with the HomeKit component. Use the [filter](#configure-filter) to find out which one. Feel free to open a new issue in the `home-assistant` repo, so we can resolve it. + +#### {% linkable_title Duplicate AID found when attempting to add accessory %} + +Two of your entities share the same `entity_id`. Either resolve this or configure the [filter](#configure-filter) to exclude them. ### {% linkable_title Issues during normal use %} -#### {% linkable_title Pairing hangs - no error %} -Make sure that you don't try to add more then 100 accessories, see [device limit](#device-limit). In rare cases one of your entities doesn't work with the HomeKit component. Use the [filter](#configure-filter) to find out which one. Feel free to open a new issue in the `home-assistant` repo, so we can resolve it. - #### {% linkable_title Some of my devices don't show up - Z-Wave / Discovery %} + See [disable auto start](#disable-auto-start) #### {% linkable_title My entity doesn't show up %} + Check if the domain of your entity is [supported](#supported-components). If it is, check your [filter](#configure-filter) settings. Make sure the spelling is correct, especially if you use `include_entities`. #### {% linkable_title HomeKit doesn't work on second Home Assistant instance %} + To use the HomeKit component with to different Home Assistant instances on the same local network, you need to set a custom name for at least one of them. [config/name](#name) #### {% linkable_title Specific entity doesn't work %} + Although we try our best, some entities don't work with the HomeKit component yet. The result will be that either pairing fails completely or all Home Assistant accessories will stop working. Use the filter to identify which entity is causing the issue. It's best to try pairing and step by step including more entities. If it works unpair and repeat until you find the one that is causing the issues. To help others and the developers, please open a new issue here: [home-assistant/issues/new](https://github.com/home-assistant/home-assistant/issues/new?labels=component: homekit) #### {% linkable_title Accessories are all listed as not responding %} + See [specific entity doesn't work](#specific-entity-doesnt-work) #### {% linkable_title Accessory not responding - after restart or update %} + See [device limit](#device-limit) #### {% linkable_title Accessory not responding - randomly %} -Unfortunately that sometimes happens at the moment. It might help to close the `Home` App and delete it from the cache. Usually the accessory should get back to responding after a few minutes at most. + +Unfortunately, that sometimes happens at the moment. It might help to close the `Home` App and delete it from the cache. Usually, the accessory should get back to responding after a few minutes at most. #### {% linkable_title Accessories not responding / behaving unusual - Upgrade from `0.65.x` %} -To fix this, you need to unpair the `Home Assistant Bridge`, delete the `.homekit.state` file ([guide](#deleting-the-homekitstate-file)) and pair it again. This should only be an issue if you're upgrading from `0.65.x` or below. -[devices]: https://www.home-assistant.io/docs/configuration/devices/ +To fix this, you need to unpair the `Home Assistant Bridge`, delete the `.homekit.state` file ([guide](#deleting-the-homekitstate-file)) and pair it again. This should only be an issue if you're upgrading from `0.65.x` or below. From 29861c483b15b9e78ad6eec6846e5d41cd7117b4 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Thu, 15 Nov 2018 22:13:54 +0100 Subject: [PATCH 25/84] Changed gitignore list (#7076) * WIP: Changed gitignore file (again) * :pencil2: Deleted my text, it makes no sense * :pencil2: Adding storage and cloud folder * :pencil2: Changed the gitignore list * :pencil2: Improved after input from others --- .../_docs/ecosystem/backup/backup_github.markdown | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/source/_docs/ecosystem/backup/backup_github.markdown b/source/_docs/ecosystem/backup/backup_github.markdown index 82114cae475..eac5f50c09b 100644 --- a/source/_docs/ecosystem/backup/backup_github.markdown +++ b/source/_docs/ecosystem/backup/backup_github.markdown @@ -57,16 +57,21 @@ Creating a `.gitignore` file in your repository will tell Git which files NOT to Here is an example that will ignore everything but your YAML configuration. ```bash -# Example .gitignore file for your config dir. Lines with ! will not be ignored. +# Example .gitignore file for your config dir. +# A * ensures that everything will be ignored. * + +# You can whitelist files/folders with !, these will not be ignored. !*.yaml !.gitignore -*.conf -*.txt -*.log +!*.md + +# Ignore folders. .storage .cloud .google.token + +# Ensure these YAML files are ignored, otherwise your secret data/credentials will leak. ip_bans.yaml secrets.yaml known_devices.yaml From 94d4440fc95c225fe2acfa55d62f6adfb44a08c8 Mon Sep 17 00:00:00 2001 From: zxdavb Date: Thu, 15 Nov 2018 21:16:30 +0000 Subject: [PATCH 26/84] Update evohome.markdown (#7487) * Update evohome.markdown Added info about Zones now being supported. Also a little tidy-up. * :fire: Removed optional parameter from initial example * :pencil2: Tweaks --- source/_components/evohome.markdown | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/source/_components/evohome.markdown b/source/_components/evohome.markdown index f9bee84846b..446ebd3334b 100644 --- a/source/_components/evohome.markdown +++ b/source/_components/evohome.markdown @@ -13,14 +13,11 @@ ha_release: 0.80 ha_iot_class: "Cloud Polling" --- -The `evohome` platform is the main component to set up and integrate all supported evohome devices. +The `evohome` platform is the main component to set up and integrate all supported evohome Climate devices. It uses the [evohomeclient](https://pypi.org/project/evohomeclient/) client library and so will let you control (only) _EU-based_ [Honeywell Connect Comfort](https://international.mytotalconnectcomfort.com/Account/Login) systems. -Currently, only Controllers are supported; support for Heating zones and DHW controllers will be added at a later time. - -It is related to the [honeywell](/components/climate.honeywell/) climate component, which allows limited integration with evohome Heating zones. These two components should be usuable side-by-side, but YMMV. - +Currently, only Controllers and Zones are supported; support for DHW controllers will be added at a later time. More information is available [evohome climate component](/components/climate.honeywell/) page. ## {% linkable_title Configuration %} @@ -31,9 +28,9 @@ To use this component in your installation, add the following to your `configura evohome: username: YOUR_USERNAME password: YOUR_PASSWORD - location_idx: 0 ``` -This is a IoT cloud-polling device, and the `scan_interval` is currently fixed at 3 minutes. Testing has indicated that this is a safe interval that - by itself - shouldn't cause you to be rate-limited by Honeywell. + +This is an IoT cloud-polling device, and the `scan_interval` is currently fixed at 5 minutes. Testing has indicated that this is a safe interval that - by itself - shouldn't cause you to be rate-limited by Honeywell. {% configuration %} username: From 016ca4baf166e01e959e2f7c66549744d6a2548a Mon Sep 17 00:00:00 2001 From: mdallaire <23340663+mdallaire@users.noreply.github.com> Date: Thu, 15 Nov 2018 17:55:38 -0500 Subject: [PATCH 27/84] Change category to sensor (#7520) --- source/_components/waterfurnace.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/waterfurnace.markdown b/source/_components/waterfurnace.markdown index bc45420f464..d42a6aecbac 100644 --- a/source/_components/waterfurnace.markdown +++ b/source/_components/waterfurnace.markdown @@ -8,7 +8,7 @@ comments: false sharing: true footer: true logo: waterfurnace.png -ha_category: Irrigation +ha_category: Sensor ha_release: 0.62 ha_iot_class: "Cloud Polling" --- From aedcafc0d95bec7328dadb68a266f2e7ad324b2a Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:53:01 +0100 Subject: [PATCH 28/84] Update discoverable component configuration (#7534) --- source/_components/discoverable.markdown | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/source/_components/discoverable.markdown b/source/_components/discoverable.markdown index 12c170a1eee..03e2880a408 100644 --- a/source/_components/discoverable.markdown +++ b/source/_components/discoverable.markdown @@ -25,11 +25,13 @@ To enable `discovery` in your installation, add the following to your `configura ```yaml # Example configuration.yaml entry discoverable: - expose_password: yes + expose_password: true ``` - -Configuration variables: - -- **expose_password** (*Optional*): It is up to the user to expose the password in the discovery response (Default: off). If password not exposed, uHA instances will have to provide it (`get_instance('my password')`). - +{% configuration %} +expose_password: + description: It is up to the user to expose the password in the discovery response. If password not exposed, uHA instances will have to provide it (`get_instance('my password')`). + required: false + default: false + type: boolean +{% endconfiguration %} From a8cbc29b0bc48e350005e36c93f670e1fd163fbf Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:53:58 +0100 Subject: [PATCH 29/84] Update homematic add-on component configuration (#7533) --- source/_addons/homematic.markdown | 77 +++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/source/_addons/homematic.markdown b/source/_addons/homematic.markdown index ce8972998d0..03ef67f1b1f 100644 --- a/source/_addons/homematic.markdown +++ b/source/_addons/homematic.markdown @@ -45,26 +45,63 @@ Follow devices will be supported and tested: } ``` -Configuration variables: - -- **rf_enable** (*Required*): Boolean. Enable or disable BidCoS-RF. -- **wired_enable** (*Required*): Boolean. Enable or disable BidCoS-Wired. - -For RF devices: - -- **type** (*Required*): Device type for RFD service. Look into the manual of your device. -- **device** (*Required*): Device on the host. - -For wired devices: - -- **serial** (*Required*): Serial number of the device. -- **key** (*Required*): Encrypted key. -- **ip** (*Required*): IP address of LAN gateway. - -For HmIP devices: - -- **type** (*Required*): Device type for RFD service. Look into the manual of your device. -- **device** (*Required*): Device on the host. +{% configuration %} +rf_enable: + description: Enable or disable BidCoS-RF. + required: true + type: boolean +rf: + description: RF devices. + required: true + type: list + keys: + type: + description: Device type for RFD service. Look into the manual of your device. + required: true + type: string + device: + description: Device on the host. + required: true + type: string +wired_enable: + description: Enable or disable BidCoS-Wired. + required: true + type: boolean +wired: + description: Wired devices. + required: true + type: list + keys: + serial: + description: Serial number of the device. + required: true + type: string + key: + description: Encrypted key. + required: true + type: string + ip: + description: IP address of LAN gateway. + required: true + type: string +hmip_enable: + description: Enable or disable hmip. + required: true + type: boolean +hmip: + description: HMIP devices. + required: true + type: list + keys: + type: + description: Device type for RFD service. Look into the manual of your device. + required: true + type: string + device: + description: Device on the host. + required: true + type: string +{% endconfiguration %} ## {% linkable_title Home Assistant configuration %} From b1fac434e002fd7e3c44ccbbe591e84551ba9743 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:54:20 +0100 Subject: [PATCH 30/84] Update prowl notify component configuration (#7529) --- source/_components/notify.prowl.markdown | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/source/_components/notify.prowl.markdown b/source/_components/notify.prowl.markdown index b9fa8c0008d..496efa4ffd1 100644 --- a/source/_components/notify.prowl.markdown +++ b/source/_components/notify.prowl.markdown @@ -12,7 +12,6 @@ ha_category: Notifications ha_release: 0.52 --- - The `prowl` platform uses [Prowl](https://www.prowlapp.com/) to deliver push notifications from Home Assistant to your iOS device. Go to the [Prowl website](https://www.prowlapp.com/) and create a new API key. @@ -27,10 +26,17 @@ notify: api_key: YOUR_API_KEY ``` -Configuration variables: - -- **name** (*Optional*): Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. -- **api_key** (*Required*): The Prowl API key to use. +{% configuration %} +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +api_key: + description: The Prowl API key to use. + required: true + type: string +{% endconfiguration %} ### {% linkable_title Prowl service data %} From 1f1a2253f3aa5f0e4057409b3a38ec22130135d3 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:54:38 +0100 Subject: [PATCH 31/84] Update file notify component configuration (#7528) --- source/_components/notify.file.markdown | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/source/_components/notify.file.markdown b/source/_components/notify.file.markdown index 9a94b1177e4..7b978d331fc 100644 --- a/source/_components/notify.file.markdown +++ b/source/_components/notify.file.markdown @@ -12,7 +12,6 @@ ha_category: Notifications ha_release: pre 0.7 --- - The `file` platform allows you to store notifications from Home Assistant as a file. To enable file notifications in your installation, add the following to your `configuration.yaml` file: @@ -25,10 +24,21 @@ notify: filename: FILENAME ``` -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`. -- **filename** (*Required*): Name of the file to use. The file will be created if it doesn't exist and saved in your [configuration](/docs/configuration/) folder. -- **timestamp** (*Optional*): Setting `timestamp` to `True` adds a timestamp to every entry. +{% configuration %} +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +filename: + description: Name of the file to use. The file will be created if it doesn't exist and saved in your [configuration](/docs/configuration/) folder. + required: true + type: string +timestamp: + description: Setting `timestamp` to `True` adds a timestamp to every entry. + required: false + default: false + type: boolean +{% endconfiguration %} To use notifications, please see the [getting started with automation page](/getting-started/automation/). From 88ca8169545ff143aa41105f7dca02a5c92c266c Mon Sep 17 00:00:00 2001 From: teejay-87 Date: Fri, 16 Nov 2018 08:55:11 +0100 Subject: [PATCH 32/84] Fixed case of exposed domains (#7523) Exposed domains must be lowercase, otherwise Google Home will link accounts but will not find any device to setup. --- source/_components/google_assistant.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown index 8acb903c7c8..814ef6bad49 100644 --- a/source/_components/google_assistant.markdown +++ b/source/_components/google_assistant.markdown @@ -105,9 +105,9 @@ google_assistant: project_id: YOUR_PROJECT_ID api_key: YOUR_API_KEY exposed_domains: - - SWITCH - - LIGHT - - GROUP + - switch + - light + - group entity_config: switch.kitchen: name: CUSTOM_NAME_FOR_GOOGLE_ASSISTANT From a83570da986fe2ad599aae6b975aa5850f3a82f1 Mon Sep 17 00:00:00 2001 From: Marc Forth Date: Fri, 16 Nov 2018 07:56:07 +0000 Subject: [PATCH 33/84] Update alert.markdown (#7524) Added raw tags for template in last example as the templates weren't displaying correctly. --- source/_components/alert.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/alert.markdown b/source/_components/alert.markdown index 5c97d5cf4a1..5f93724faa2 100644 --- a/source/_components/alert.markdown +++ b/source/_components/alert.markdown @@ -215,7 +215,7 @@ of the entity. repeat: 30 can_acknowledge: True skip_first: True - message: "Plant {{ states.plant.plant_office }} needs help ({{ state_attr('plant.plant_office', 'problem') }})" + message: {% raw %} "Plant {{ states.plant.plant_office }} needs help ({{ state_attr('plant.plant_office', 'problem') }})" {% endraw %} done_message: Plant in office is fine notifiers: - ryans_phone From 80aa62fac9040274ede8333f7fa1042c37880ff0 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:56:28 +0100 Subject: [PATCH 34/84] Update pushsafer notify component configuration (#7526) --- source/_components/notify.pushsafer.markdown | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/source/_components/notify.pushsafer.markdown b/source/_components/notify.pushsafer.markdown index 42e1b4514bd..f3a213fa2f0 100644 --- a/source/_components/notify.pushsafer.markdown +++ b/source/_components/notify.pushsafer.markdown @@ -26,16 +26,22 @@ notify: private_key: YOUR_KEY ``` -**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`. -- **private_key** (*Required*): Your private or alias key. Private key = send the notification to all devices with standard params, alias key send the notification to the devices stored in the alias with predefined params. +{% configuration %} +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +private_key: + description: Your private or alias key. Private key = send the notification to all devices with standard params, alias key send the notification to the devices stored in the alias with predefined params. + required: true + type: string +{% endconfiguration %} ### {% linkable_title Examples %} Message to two devices with formatted text. - ```yaml action: service: notify.notify From 2cee806142755061ad92dc12268f06532a0e6438 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:56:51 +0100 Subject: [PATCH 35/84] Update syslog notify component configuration (#7525) --- source/_components/notify.syslog.markdown | 29 +++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/source/_components/notify.syslog.markdown b/source/_components/notify.syslog.markdown index 13683e8a8a2..24251869509 100644 --- a/source/_components/notify.syslog.markdown +++ b/source/_components/notify.syslog.markdown @@ -12,7 +12,6 @@ ha_category: Notifications ha_release: pre 0.7 --- - The `syslog` platform allows you to deliver notifications from Home Assistant to the local syslog. To enable syslog notifications in your installation, add the following to your `configuration.yaml` file: @@ -24,12 +23,28 @@ notify: platform: syslog ``` -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`. -- **facility** (*Optional*): Facility according to RFC 3164 (http://tools.ietf.org/html/rfc3164). Default is 'syslog' if no value is given. Check the table below for entries. -- **option** (*Optional*): Log option. Default is 'pid' if no value is given. Check the table below for entries. -- **priority** (*Optional*): Priority of the messages. Default is 'info' if no value is given. Check the table below for entries. +{% configuration %} +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +facility: + description: Facility according to RFC 3164 (http://tools.ietf.org/html/rfc3164). Check the table below for entries. + required: false + default: syslog + type: string +option: + description: Log option. Check the table below for entries. + required: false + default: pid + type: string +priority: + description: Priority of the messages. Check the table below for entries. + required: false + default: info + type: string +{% endconfiguration %} The table contains values to use in your `configuration.yaml` file. From a15df464adbeabe70a9f104fb0c00cdba3b99f7a Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:57:14 +0100 Subject: [PATCH 36/84] Update rest notify component configuration (#7527) --- source/_components/notify.rest.markdown | 54 +++++++++++++++++++------ 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/source/_components/notify.rest.markdown b/source/_components/notify.rest.markdown index d46ca8e932d..e31d35a89c2 100644 --- a/source/_components/notify.rest.markdown +++ b/source/_components/notify.rest.markdown @@ -12,7 +12,6 @@ ha_category: Notifications ha_release: 0.13 --- - The `rest` notification platform allows you to deliver [RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer) notifications from Home Assistant to another party. To enable the REST notification in your installation, add the following to your `configuration.yaml` file: @@ -25,17 +24,46 @@ notify: resource: http://IP_ADDRESS/ENDPOINT ``` -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`. -- **resource** (*Required*): The resource or endpoint that will receive the value. -- **method** (*Optional*): The method of the request. Default is `GET`. Other valid options are `POST` or `POST_JSON`. -- **headers** (*Optional*): The headers for the request. -- **message_param_name** (*Optional*): Parameter name for the message. Defaults to `message`. -- **title_param_name** (*Optional*): Parameter name for the title. Defaults to none. -- **target_param_name** (*Optional*): Parameter name for the target. Defaults to none. -- **data** (*Optional*): Dictionary of extra parameters to send to the resource. -- **data_template** (*Optional*): Template dictionary of extra parameters to send to the resource. +{% configuration %} +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +resource: + description: The resource or endpoint that will receive the value. + required: true + type: string +method: + description: The method of the request. Valid options are `GET`, `POST` or `POST_JSON`. + required: false + default: GET + type: string +headers: + description: The headers for the request. + required: false + type: string +message_param_name: + description: Parameter name for the message. + required: false + default: message + type: string +title_param_name: + description: Parameter name for the title. + required: false + type: string +target_param_name: + description: Parameter name for the target. + required: false + type: string +data: + description: Dictionary of extra parameters to send to the resource. + required: false + type: string +data_template: + description: Template dictionary of extra parameters to send to the resource. + required: false + type: template +{% endconfiguration %} To use notifications, please see the [getting started with automation page](/getting-started/automation/). - From 966e8de8a59d6532396cec36681a74c7b9c0b9e1 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:57:40 +0100 Subject: [PATCH 37/84] Update pushetta notify component configuration (#7530) --- source/_components/notify.pushetta.markdown | 35 ++++++++++++++------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/source/_components/notify.pushetta.markdown b/source/_components/notify.pushetta.markdown index bf31900c345..7275e0a3e0d 100644 --- a/source/_components/notify.pushetta.markdown +++ b/source/_components/notify.pushetta.markdown @@ -12,7 +12,6 @@ ha_category: Notifications ha_release: pre 0.7 --- - The `pushetta` notify platform uses [Pushetta](http://www.pushetta.com) to delivery notifications from Home Assistant to your devices. To retrieve the API token, log into your account at [http://www.pushetta.com](http://www.pushetta.com) and go to your **Dashboard**. Create a new channel by clicking on **Channels** and then **Add a Channel**. @@ -28,21 +27,35 @@ notify: channel_name: YOUR_CHANNEL_NAME ``` -Configuration variables: - -- **name** (*Optional*): Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. -- **api_key** (*Required*): Your API key for Pushetta. -- **channel_name** (*Required*): The name of your channel. -- **send_test_msg** (*Optional*): Disable/enable the test message send on Home Assistant's startup to test the API key and the existence of the channel. Default to `False`. +{% configuration %} +name: + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: notify + type: string +api_key: + description: Your API key for Pushetta. + required: true + type: string +channel_name: + description: The name of your channel. + required: true + type: string +send_test_msg: + description: Disable/enable the test message send on Home Assistant's startup to test the API key and the existence of the channel. + required: false + default: false + type: boolean +{% endconfiguration %} It's easy to test your Pushetta setup outside of Home Assistant. Assuming you have a channel *home-assistant*, just fire a request and check the channel page in the dashboard for a new message. ```bash curl -X POST \ - -H "Authorization: Token YOUR_API_KEY" \ - -H "Content-Type: application/json" \ - -d "{ \"body\" : \"Hello World\", \"message_type\" : \"text/plain\" }" \ - http://api.pushetta.com/api/pushes/home-assistant/ + -H "Authorization: Token YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d "{ \"body\" : \"Hello World\", \"message_type\" : \"text/plain\" }" \ + http://api.pushetta.com/api/pushes/home-assistant/ ``` For further details, please check the [API](http://pushetta.com/pushetta-api/). From 595336f43d2995a991b0d05089864ac2a458999a Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 16 Nov 2018 08:57:58 +0100 Subject: [PATCH 38/84] Update duckdns add-on component configuration (#7531) --- source/_addons/duckdns.markdown | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/source/_addons/duckdns.markdown b/source/_addons/duckdns.markdown index 38c947eb6e3..d1726880996 100644 --- a/source/_addons/duckdns.markdown +++ b/source/_addons/duckdns.markdown @@ -25,12 +25,29 @@ featured: true } ``` -Configuration variables: - -- **lets_encrypt.accept_terms** (*Required*): If you accept the [Let's Encrypt Subscriber Agreement](https://letsencrypt.org/repository/), it will generate and update Let's Encrypt certificates for your DuckDNS domain. -- **token** (*Required*): Your Duck DNS API key, from your DuckDNS account page. -- **domains** (*Required*): A list of domains to update DNS. -- **seconds** (*Required*): Seconds between updates to Duck DNS. +{% configuration %} +lets_encrypt: + description: Let's Encrypt is a free, automated, and open certificate authority. + required: true + type: list + keys: + accept_terms: + description: If you accept the [Let's Encrypt Subscriber Agreement](https://letsencrypt.org/repository/), it will generate and update Let's Encrypt certificates for your DuckDNS domain. + required: true + type: boolean +token: + description: Your Duck DNS API key, from your DuckDNS account page. + required: true + type: string +domains: + description: A list of domains to update DNS. + required: true + type: list +seconds: + description: Seconds between updates to Duck DNS. + required: true + type: integer +{% endconfiguration %} ## {% linkable_title Home Assistant configuration %} @@ -51,4 +68,4 @@ You'll need to forward the port you listed in your configuration (8123 in the ex Ensure that you allocate the Home Assistant system a fixed IP on your network before you configure port forwarding. You can do this either on the computer itself (see the [install guide](/hassio/installation/) or via a static lease on your router. -Restart Home Assistant for the configured changes to take effect. When you access the Home Assistant frontend you will now need to use `https`, even when accessing local instances, for example at `https://192.168.0.1:8123`. +Restart Home Assistant for the configured changes to take effect. When you access the Home Assistant frontend you will now need to use `https`, even when accessing local instances, for example at `https://192.168.0.1:8123`. From 0886bf2c5e7bba89b877ee7f5460fbd10f5f4a7a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 16 Nov 2018 14:21:10 +0100 Subject: [PATCH 39/84] Blog post meetup (#7535) * Add blog post about meetup * :pencil2: Small updates including new vid URL * :pencil2: Added video editor credits --- .../2018-11-16-state-of-the-union.markdown | 55 ++++++++++++++++++ .../2018-11-state-of-the-union/chatter.jpg | Bin 0 -> 102818 bytes .../frenck-hassio.jpg | Bin 0 -> 89548 bytes .../presentation-selfie.jpg | Bin 0 -> 119289 bytes .../share-the-love.jpg | Bin 0 -> 140835 bytes .../zwave-table.jpg | Bin 0 -> 69224 bytes 6 files changed, 55 insertions(+) create mode 100644 source/_posts/2018-11-16-state-of-the-union.markdown create mode 100644 source/images/blog/2018-11-state-of-the-union/chatter.jpg create mode 100644 source/images/blog/2018-11-state-of-the-union/frenck-hassio.jpg create mode 100644 source/images/blog/2018-11-state-of-the-union/presentation-selfie.jpg create mode 100644 source/images/blog/2018-11-state-of-the-union/share-the-love.jpg create mode 100644 source/images/blog/2018-11-state-of-the-union/zwave-table.jpg diff --git a/source/_posts/2018-11-16-state-of-the-union.markdown b/source/_posts/2018-11-16-state-of-the-union.markdown new file mode 100644 index 00000000000..dce5a50454d --- /dev/null +++ b/source/_posts/2018-11-16-state-of-the-union.markdown @@ -0,0 +1,55 @@ +--- +layout: post +title: "State of the Union" +description: "Paulus speaks about the origin of Home Assistant and where we're heading." +date: 2018-11-16 00:01:00 +date_formatted: "November 16, 2018" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Video +og_image: /images/blog/2018-11-state-of-the-union/share-the-love.jpg +--- + +

+ Photo of Paulus Schoutsen presenting the state of the union. +

+ +Last Wednesday, November 14, we had a meetup in Amsterdam hosted by ING. Over 80 Home Assistant enthusiasts gathered to hear me, Paulus Schoutsen, the founder of Home Assistant, speak. I talked about how Home Assistant got started, what makes Home Assistant so successful (community!) and what we're working towards. + +
+ +
+ +Special thanks to: + + - Jeroen Joosse for the initiative and organizing + - Erik-Jan Riemers for co-organizing and making it this big + - ING for hosting the event + - Franck Nijhof for providing the Hass.io demos + - Nicolaas Schoute for providing the TensorFlow demos + - Frank Kuiper for editing the presentation video + +More photos after the click. + + + +

+ Crowd talking Home Assistant + Crowd talking Home Assistant +

+ +

+ Frenck showing all the ins and outs of Hass.io + Frenck showing all the ins and outs of Hass.io +

+ +

+ The Z-Wave table + The Z-Wave table +

+ +

+ Presentation selfie! + Presentation selfie! +

diff --git a/source/images/blog/2018-11-state-of-the-union/chatter.jpg b/source/images/blog/2018-11-state-of-the-union/chatter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23ced93f46de079c8a19d5178f9b5553c4b6fdad GIT binary patch literal 102818 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 z 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 G&WsDaPaFW+AWCyA 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