From 85dc7f22dc425a42927b83735bee46cf45c2855c Mon Sep 17 00:00:00 2001 From: staraxis <21187826+staraxis@users.noreply.github.com> Date: Mon, 29 Oct 2018 09:45:34 +1100 Subject: [PATCH 01/62] Update switch.broadlink.markdown (#7106) I have added in a section to obtain the codes in bulk using iOS and Windows. This is my first ever github update. Go easy :) --- source/_components/switch.broadlink.markdown | 44 ++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/source/_components/switch.broadlink.markdown b/source/_components/switch.broadlink.markdown index 985e4d80b2d..f5138245cb8 100644 --- a/source/_components/switch.broadlink.markdown +++ b/source/_components/switch.broadlink.markdown @@ -239,3 +239,47 @@ Not every code works. 8. Convert the HEX codes to base64 Use [this](http://tomeko.net/online_tools/hex_to_base64.php?lang=en1) tool to convert the hex codes to base64 for use with Home Assistant. + +### {% linkable_title Using iOS and Windows to Obtain Codes %} + +1. Use the E-Control app to learn the codes from all of your suitable remotes. Depending on the remote, try to add useful names for the buttons and/or the remotes. This will mean that you should only have to run this process once and will help with getting them quickly into Home Assistant. Dump the files in the app by navigating to the hamburger icon, select `share and select`, then choose `Share to other phones on WLAN`. + +2. Install Requirements + +- Download and install Python 2.7 on your windows PC. +- Run `pip install simplejson`. You must install simplejson in the same python version you will use to run the scripts. You can ensure that the current version is installed by attempting to install again and confirming that you see "Requirement already satisfied". +- Download and install [iBackup Viewer](http://www.imactools.com/iphonebackupviewer/). +- Download [these](https://github.com/NightRang3r/Broadlink-e-control-db-dump) github files. Make sure you place them in the \Python27 path in Windows. Be sure that the getBroadlinkSharedData.py from the download is in this directory. + +3. Plug your iphone into your windows PC, open iTunes and create a non-encrypted backup of your device. + +4. Open iBackup viewer then select the iOS backup that you created. Navigate to the App icon and then scroll until you find e-control.app, select this. Select and extract the files jsonButton, jsonIrCode and jsonSublr; they will be located in the Documents/SharedData section. Put these in the same location as the getBroadlinkSharedData.py. + +5. Now open a Command Prompt and navigate to the directory where the aforementioned files are located e.g. C:\Python27. Now run the command python getBroadlinkSharedData.py, you should see something like this: +```C:\Python27>python getBroadlinkSharedData.py +ID: 1 | Name: TV +ID: 2 | Name: Upstairs +ID: 3 | Name: Sort in order +ID: 4 | Name: Soundbar +ID: 5 | Name: TV +ID: 6 | Name: Xbox One +ID: 7 | Name: User-Defined Aircon +ID: 8 | Name: Sort in order +ID: 9 | Name: User-Defined Aircon +ID: 10 | Name: Kids Fan +ID: 11 | Name: Downstairs +ID: 12 | Name: Ceiling Fan +ID: 13 | Name: Samsung TV +ID: 14 | Name: Xbox One +ID: 15 | Name: SONY SoundBar +ID: 16 | Name: Fire TV +ID: 17 | Name: New RF Remote +``` + +6. Select the remote ID you would like to extract: +```Select accessory ID: 5 +[+] You selected: TV +[+] Dumping codes to TV.txt +``` + +7. Now there should be a file with the name of the remote you chose in the same directory ending in `.txt`. Open that up and it will contain the Base64 code required for Home Assistant. To ensure these codes work correctly you may need to add `==` to the end of the code in your config.yaml file (or wherever you have your switches). From 70a5774b2f188a7c1f50c64022f028445ef9670f Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Mon, 29 Oct 2018 02:14:06 +0100 Subject: [PATCH 02/62] Update homematic.markdown --- source/_addons/homematic.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/_addons/homematic.markdown b/source/_addons/homematic.markdown index 50a56b1bd9d..706ef2a754c 100644 --- a/source/_addons/homematic.markdown +++ b/source/_addons/homematic.markdown @@ -16,6 +16,7 @@ The logic layer will be Home Assistant. There is no ReGa or other logic layer in Follow devices will be supported and tested: - [HM-MOD-RPI-PCB](https://www.elv.ch/homematic-funkmodul-fuer-raspberry-pi-bausatz.html) +- [HmIP-RFUSB](https://www.elv.ch/elv-homematic-ip-rf-usb-stick-hmip-rfusb-fuer-alternative-steuerungsplattformen-arr-bausatz.html) ```json { @@ -33,6 +34,13 @@ Follow devices will be supported and tested: "key": "abc", "ip": "192.168.0.0" } + ], + "hmip_enable": false, + "hmip": [ + { + "type": "HMIP_CCU2", + "device": "/dev/ttyUSB0" + } ] } ``` @@ -53,6 +61,11 @@ For wired devices: - **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. + ## {% linkable_title Home Assistant configuration %} Use the following configuration in Home Assistant to use it: From f505b2853b8b39a1a29d4f0f91a2ad65dcb44a7e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 29 Oct 2018 11:01:28 +0100 Subject: [PATCH 03/62] Add 0.81 ID Lovelace FAQ (#7152) * Add 0.81 ID FAQ Explain why ID's are added to ui-lovelace.yaml will also change documentation * Add id to config example * Update index.markdown * Change include statement * Fix typo * :pencil2: Tweaks * :pencil2: Tweaks --- source/lovelace/index.markdown | 14 ++++++++++++-- source/lovelace/tips.markdown | 8 +++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/source/lovelace/index.markdown b/source/lovelace/index.markdown index 551269287e7..e48aa75e1ff 100644 --- a/source/lovelace/index.markdown +++ b/source/lovelace/index.markdown @@ -65,7 +65,7 @@ excluded_entities: views: # View tab title. - title: Example - # Optional unique id for direct access /lovelace/${id} + # Unique id for direct access /lovelace/${id}. If you don't specify one, it is added automatically. id: example # Optional background (overwrites the global background). background: radial-gradient(crimson, skyblue) @@ -74,7 +74,8 @@ views: # The cards to show on this view. cards: # The filter card will filter entities for their state - - type: entity-filter + - id: peoplehome # Every card needs an ID, if you don't specify one, it is added automatically. + type: entity-filter entities: - device_tracker.paulus - device_tracker.anne_there @@ -116,6 +117,9 @@ views: Now restart Home Assistant, navigate to `/lovelace`. When you make changes to `ui-lovelace.yaml`, you don't have to restart Home Assistant or refresh the page. Just hit the refresh button at the top of the UI. +## {% linkable_title IDs for cards and views %} +Every card and view needs an ID, this is used to edit your config from the UI. If you don't specify an ID, Home Assistant will add one. If you don't want Home Assistant to write to your `ui-lovelace.yaml` file, make sure every view and card have an ID. + ## {% linkable_title Setting Lovelace as the Default UI %} Once you are ready to start using Lovelace UI as your main user interface, click on info, the "i" icon under 'Developer Tools" in the Home Assistant side-bar. Next, locate >>Set Lovelace as default page on this device<< under the Home Assistant version information and click it. @@ -151,3 +155,9 @@ frontend: Given examples refer to `/local/example_image.jpg`. That means you should have `www` directory next to your HA `configuration.yaml`. An image kept in `HA_configuration_dir/www/example_image.jpg` will be shown after refreshing Lovelace page. Restart Home Assistant after creating the `www` directory. Otherwise, HA will not know that you created this directory. + +### {% linkable_title My `ui-lovelace.yaml` file suddenly has ID's added to all cards and views! %} + +Since version 0.81 we started preparing for the ability to edit you Lovelace UI from the UI itself. To be able to do this every view and card should have a unique ID. If your cards or views do not have an ID, Home Assistant will add a random one. You can edit the ID, the only restriction is that it is unique. + +If you don't want Home Assistant to write to your `ui-lovelace.yaml` file, make sure all your views and cards have an ID, then Home Assistant will not touch your file. diff --git a/source/lovelace/tips.markdown b/source/lovelace/tips.markdown index 2c8ef8cdfe8..aed61412045 100644 --- a/source/lovelace/tips.markdown +++ b/source/lovelace/tips.markdown @@ -36,9 +36,11 @@ you with the ability to split your Lovelace configuration into multiple files. The [Lovelace Jinja2 Script][lovelace-jinja] by [@skalavala] is a simple Jinja2 script that you run in the template editor to generate lovelace configuration based on the entities that are already setup.

- Split configuration is no longer possible directly in Lovelace, - due to fact that Home Assistant writes directly to the `ui-lovelace.yaml` file. - Use one of the above generators if you would like to contintue to have such functionality. + Split configuration is no longer possible in Lovelace since version 0.81, due to the fact that Home Assistant + will be writing directly to the `ui-lovelace.yaml` file. + + If you want to split your configuration you can use one of the tools listed above, but edits done with the UI will + be overwritten by those tools, so you should not use both.

## {% linkable_title Tips and Tricks %} From bc71516c56d0e5e67187a9a02981ef83a4870a38 Mon Sep 17 00:00:00 2001 From: Hmmbob <33529490+hmmbob@users.noreply.github.com> Date: Mon, 29 Oct 2018 12:06:12 +0100 Subject: [PATCH 04/62] Update rest_command.markdown configuration (#7122) * Update rest_command.markdown * Update rest_command.markdown * Update rest_command.markdown * Update rest_command.markdown * Update rest_command.markdown * :pencil2: Tweak --- source/_components/rest_command.markdown | 52 +++++++++++++++++++----- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/source/_components/rest_command.markdown b/source/_components/rest_command.markdown index 4e4ef8fb6f5..6cb1213d5a6 100644 --- a/source/_components/rest_command.markdown +++ b/source/_components/rest_command.markdown @@ -27,17 +27,47 @@ rest_command: url: 'http://example.com/' ``` -Configuration variables: - -- **[service_name]** (*Required*): The name used to expose the service. E.g., in the above example, it would be `rest_command.example_request`. - - **url** (*Required*): The URL (support template) for sending request. - - **method** (*Optional*): HTTP method to use (`get`, `post`, `put`, or `delete`). Defaults to `get`. - - **headers** (*Optional*): The headers for the requests. - - **payload** (*Optional*): A string/template to send with request. - - **username** (*Optional*): The username for HTTP authentication. - - **password** (*Optional*): The password for HTTP authentication. - - **timeout** (*Optional*): Timeout for requests. Defaults to 10 seconds. - - **content_type** (*Optional*): Content type for the request. +{% configuration %} +service_name: + description: The name used to expose the service. E.g., in the above example, it would be 'rest_command.service_name'. + required: true + type: map + keys: + url: + description: The URL (supports template) for sending request. + required: true + type: [string, template] + method: + description: HTTP method to use (get, post, put, or delete). + required: false + default: get + type: string + headers: + description: The headers for the requests. + required: false + type: list + payload: + description: A string/template to send with request. + required: false + type: [string, template] + username: + description: The username for HTTP authentication. + required: false + type: string + password: + description: The password for HTTP authentication. + required: false + type: string + timeout: + description: Timeout for requests in seconds. + required: false + type: string + defaut: 10 + content_type: + description: Content type for the request. + required: false + type: string +{% endconfiguration %} ## {% linkable_title Examples %} From a050b7603f7da712c7cf7cb1c4b8c84851d45712 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 12:26:27 +0100 Subject: [PATCH 05/62] Update media_extractor component configuration (#7223) --- source/_components/media_extractor.markdown | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/source/_components/media_extractor.markdown b/source/_components/media_extractor.markdown index 60b03259a0e..33c788c3dc8 100644 --- a/source/_components/media_extractor.markdown +++ b/source/_components/media_extractor.markdown @@ -13,7 +13,6 @@ ha_release: 0.49 ha_qa_scale: internal --- - The `media_extractor` component gets a stream URL and sends it to a media player entity. This component can extract entity specific streams if configured accordingly.

@@ -27,10 +26,17 @@ To use the media extractor service in your installation, add the following to yo media_extractor: ``` -Configuration variables: - -- **default_query** (*Optional*): Set default stream query for all devices ('best' by default). -- **customize** (*Optional*): Set entity specific values. For example: +{% configuration %} +default_query: + description: Set default stream query for all devices. + required: false + default: best + type: string +customize: + description: Set entity specific values. + required: false + type: list +{% endconfiguration %} ```yaml # Example configuration.yaml entry From 3b44bec80fd2c5be72933b9914d22e172d131cff Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 12:30:12 +0100 Subject: [PATCH 06/62] Update Ciscospark notify component configuration (#7225) --- source/_components/notify.ciscospark.markdown | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/source/_components/notify.ciscospark.markdown b/source/_components/notify.ciscospark.markdown index fb55b90a6f9..d9bcbc5e42a 100644 --- a/source/_components/notify.ciscospark.markdown +++ b/source/_components/notify.ciscospark.markdown @@ -32,11 +32,20 @@ notify: roomid: CISCO_SPARK_ROOMID ``` -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`. -- **token** (*Required*): Your development token. -- **roomid** (*Required*): The Room ID. +{% 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 +token: + description: Your development token. + required: true + type: string +roomid: + description: The Room ID. + required: true + type: string +{% endconfiguration %} To use notifications, please see the [getting started with automation page](/getting-started/automation/). - From 39ab9079c4fb0bc0ee2fd10a258cd5838558f624 Mon Sep 17 00:00:00 2001 From: Josh Cooper Date: Mon, 29 Oct 2018 11:31:16 +0000 Subject: [PATCH 07/62] Added multiple switches (#7198) * Added multiple switches Added example code and text to illustrate how multiple switches would need to be added. * Added multiple switches (2) Updated headings and details around using multiple sockets, linking to a discussion comment to link the two together. * Update switch.tplink.markdown * fix deploy error * Back to how it was working /me stops trying to be clever. * Time to go back! Clean up * :pencil2: Move example below configuration list --- source/_components/switch.tplink.markdown | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/source/_components/switch.tplink.markdown b/source/_components/switch.tplink.markdown index da0083120b6..59912f87d1f 100644 --- a/source/_components/switch.tplink.markdown +++ b/source/_components/switch.tplink.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Local Polling" ha_release: "0.24" --- - The `tplink` switch platform allows you to control the state of your [TP-Link smart switch](http://www.tp-link.com/en/products/list-5258.html). Supported units: @@ -23,7 +22,7 @@ Supported units: - HS110 - HS200 -To use your TP-Link switch in your installation, add the following to your `configuration.yaml` file: +To use your TP-Link switch or socket in your installation, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry @@ -48,3 +47,15 @@ enable_leds: type: boolean {% endconfiguration %} +## {% linkable_title Adding multiple switches %} + +You may need to add [multiple switches](https://community.home-assistant.io/t/multiple-tp-link-switches/6935) and the config would need to include multiple switches separately. + +```yaml +# Example configuration.yaml entry +switch: + - platform: tplink + host: FIRST_IP_ADDRESS + - platform: tplink + host: SECOND_IP_ADDRESS +``` From 9cd4a5b4df28eeac412bbfd66eb979e3c97d95f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Mon, 29 Oct 2018 13:27:36 +0100 Subject: [PATCH 08/62] Remove some redundant information (#7221) * Remove some redundant information * Use sensor.date in example instead, more even behavior --- source/_components/sensor.template.markdown | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/source/_components/sensor.template.markdown b/source/_components/sensor.template.markdown index 551b3d3b369..06c69ba5925 100644 --- a/source/_components/sensor.template.markdown +++ b/source/_components/sensor.template.markdown @@ -292,7 +292,7 @@ sensor: ### {% linkable_title Working with dates %} -The `template` sensors are not limited to use attributes from other entities but can also work with [Home Assistant's template extensions](/docs/configuration/templating/#home-assistant-template-extensions). This template contains no entities that will trigger an update, so either we need to use `homeassistant.update_entity` or add an `entity_id:` line for an entity that will force an update - here we're using `sun.sun`. +The `template` sensors are not limited to use attributes from other entities but can also work with [Home Assistant's template extensions](/docs/configuration/templating/#home-assistant-template-extensions). This template contains no entities that will trigger an update, so either we need to use `homeassistant.update_entity` or add an `entity_id:` line for an entity that will force an update - here we're using `sensor.date`. {% raw %} ```yaml @@ -301,28 +301,13 @@ sensor: sensors: nonsmoker: value_template: '{{ (( as_timestamp(now()) - as_timestamp(strptime("06.07.2018", "%d.%m.%Y")) ) / 86400 ) | round(2) }}' - entity_id: sun.sun + entity_id: sensor.date friendly_name: 'Not smoking' unit_of_measurement: "Days" ``` {% endraw %} -### {% linkable_title Template tracking %} - -This example shows how to add `entity_id` to a template to allow tracking of updates. Fixing an error caused in (81.0) - -{% raw %} -```yaml -sensor: -- platform: template - sensors: - nonsmoker: - entity_id: now.strptime - value_template: '{{ (( as_timestamp(now()) - as_timestamp(strptime("06.07.2018", "%d.%m.%Y")) ) / 86400 ) | round(2) }}' - friendly_name: 'Not smoking' - unit_of_measurement: "Days" -``` -{% endraw %} +Useful entities to choose might be `sensor.date` which update once per day, or `sensor.time` which updates once per minute. Note: If a template uses more than one sensor they can be listed From 1bfbc35199aa719e14d0f635d9fa407b1e9e6a7a Mon Sep 17 00:00:00 2001 From: Jonas Skoogh Date: Mon, 29 Oct 2018 14:02:42 +0100 Subject: [PATCH 09/62] Made some more changes to documentation (#7217) * Removed double heading that was generated * Changed order so the required is first in list * Changed config to correct structure * Updated link to a new working one * Added configuration section * Added missing : * :pencil2: Tweaks * :pencil2: Tweaks * :ambulance: Indenting error --- source/_components/evohome.markdown | 3 --- source/_components/input_select.markdown | 12 ++++----- source/_components/proximity.markdown | 32 ++++++++++++++++++------ source/_components/tellstick.markdown | 2 +- source/_components/wemo.markdown | 8 ++++++ 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/source/_components/evohome.markdown b/source/_components/evohome.markdown index eaa1706bb5a..f9bee84846b 100644 --- a/source/_components/evohome.markdown +++ b/source/_components/evohome.markdown @@ -35,9 +35,6 @@ evohome: ``` 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. - -### {% linkable_title Configuration variables %} - {% configuration %} username: description: The username (email address) that has access to [Honeywell Connect Comfort](https://international.mytotalconnectcomfort.com/Account/Login) web site. diff --git a/source/_components/input_select.markdown b/source/_components/input_select.markdown index ad54719e9b6..3327a961bb8 100644 --- a/source/_components/input_select.markdown +++ b/source/_components/input_select.markdown @@ -40,18 +40,18 @@ input_select: required: true type: map keys: - name: - description: Friendly name of the input. - required: false - type: String options: description: List of options to choose from. required: true - type: Array + type: list + name: + description: Friendly name of the input. + required: false + type: string initial: description: Initial value when Home Assistant starts. required: false - type: Element of options + type: map default: First element of options icon: description: Icon to display for the component. diff --git a/source/_components/proximity.markdown b/source/_components/proximity.markdown index 36046ef9135..d6f28caee47 100644 --- a/source/_components/proximity.markdown +++ b/source/_components/proximity.markdown @@ -48,13 +48,31 @@ proximity: unit_of_measurement: mi ``` -Configuration variables: - -- **zone** (*Optional*): The zone to which this component is measuring the distance to. Default is the home zone. -- **ignored_zones** array (*Optional*): Where proximity is not calculated for a device (either the device being monitored or ones being compared (e.g., work or school). -- **devices** array (*Optional*): A list of devices to compare location against to check closeness to the configured zone. -- **tolerance** (*Optional*): The tolerance used to calculate the direction of travel in meters (m) to filter out small GPS coordinate changes. -- **unit_of_measurement** (*Optional*): The unit of measurement for distance. Valid values are (km, m, mi, ft) [kilometers, meters, miles and feet respectively]. The default value is kilometers. +{% configuration %} +proximity: + zone: + description: The zone to which this component is measuring the distance to. Default is the home zone. + required: false + type: map + keys: + ignored_zones: + description: Where proximity is not calculated for a device (either the device being monitored or ones being compared (e.g., work or school). + required: false + type: list + devices: + description: A list of devices to compare location against to check closeness to the configured zone. + required: false + type: list + tolerance: + description: The tolerance used to calculate the direction of travel in meters (m) to filter out small GPS coordinate changes. + required: false + type: integer + unit_of_measurement: + description: The unit of measurement for distance. Valid values are (km, m, mi, ft) [kilometers, meters, miles and feet respectively]. + required: false + type: string + default: km +{% endconfiguration %} To add multiple proximity components, simply use a list in your `configuration.yaml` file: diff --git a/source/_components/tellstick.markdown b/source/_components/tellstick.markdown index 36bdec9e609..0566e92a8a4 100644 --- a/source/_components/tellstick.markdown +++ b/source/_components/tellstick.markdown @@ -11,7 +11,7 @@ logo: telldus_tellstick.png ha_category: Hub --- -The `tellstick` component integrates [TellStick](http://www.telldus.se/products/tellstick) devices into Home Assistant. This integration allows users to add switches, lights, and sensors which are communicating with 433 MHz. There are a number of vendors (Capidi Elro, Intertechno, Nexa, Proove, Sartano, and Viking) who are selling products that work with TellStick. For more details, please check the TellStick [protocol list](http://developer.telldus.com/wiki/TellStick_conf). +The `tellstick` component integrates [TellStick](https://telldus.com/produkt/z-wave-gateway-tellstick-znet-lite-ver-2/) devices into Home Assistant. This integration allows users to add switches, lights, and sensors which are communicating with 433 MHz. There are a number of vendors (Capidi Elro, Intertechno, Nexa, Proove, Sartano, and Viking) who are selling products that work with TellStick. For more details, please check the TellStick [protocol list](http://developer.telldus.com/wiki/TellStick_conf). ## {% linkable_title Configuration %} diff --git a/source/_components/wemo.markdown b/source/_components/wemo.markdown index 71f734402ab..62cd2b5e2f6 100644 --- a/source/_components/wemo.markdown +++ b/source/_components/wemo.markdown @@ -24,6 +24,14 @@ Supported devices will be automatically discovered if the discovery component is wemo: ``` +{% configuration %} + static: + description: One or more static IP adresses for WeMo to use + required: false + type: list + default: 1 +{% endconfiguration %} + Alternately, WeMo devices that are not discoverable can be statically configured. If you have WeMo devices on subnets other than where Home Assistant is running, or devices in a remote location reachable over a VPN, you will need to configure them manually. This is also useful if you wish to disable discovery for some WeMo's, even if they are local. Example static configuration: ```yaml From a2289c4d0610258d9e15b0f732835542e1feffac Mon Sep 17 00:00:00 2001 From: Ian Slinger Date: Tue, 30 Oct 2018 00:04:52 +1100 Subject: [PATCH 10/62] Tidying up some of the auth docs. (#7146) * First pass at tidying up auth docs. Rearranged some of the images to enhance the flow and reorganised some of the steps for setting up MFAs. Submitting this as WIP for pull request. * Some more cleanup and changes to the text, mostly for clarity (IMHO). This should be all that is required for the moment, but some more info on Trusted Networks would be useful. I had a few subtle issues setting that up regarding proxies so I'll look at adding that if I figure out how to explain it succinctly. * :pencil2: Tweaks * :pencil2: Tweaks * :pencil2: Tweaks --- source/_docs/authentication.markdown | 69 +++++++++------ .../authentication/multi-factor-auth.markdown | 87 ++++++++++--------- .../_docs/authentication/providers.markdown | 51 +++++++---- 3 files changed, 123 insertions(+), 84 deletions(-) diff --git a/source/_docs/authentication.markdown b/source/_docs/authentication.markdown index 8d711c416af..6caeee7681e 100644 --- a/source/_docs/authentication.markdown +++ b/source/_docs/authentication.markdown @@ -10,39 +10,56 @@ sharing: true footer: true --- -Access to Home Assistant is secured by our authentication system. Each member of your household will get their own user account to log in and access Home Assistant. +Our authentication system secures access to Home Assistant. -Home Assistant contains two different user types: the owner user account and normal users. The owner user account is created when you start Home Assistant for the first time. This account has some special privileges compared to the other users of the system: - - - Manage users - - Configure integrations and other settings (soon) - - Configure Hass.io (soon) - -## {% linkable_title Authentication %} - -When a user wants to use Home Assistant, they have to log in. When navigating to the frontend without authentication, the user is asked for a login. The login page will always show you the website that you're logging in to. +If you are starting Home Assistant for the first time, or you have logged out, you will be asked for credentials before you can log in. Screenshot of the login screen -When logging in, make sure that the URL in the URL bar is showing the address of your Home Assistant instance. +## {% linkable_title User accounts %} -## {% linkable_title Profile %} +When you start Home Assistant for the first time the _owner_ user account is created. This account has some special privileges and can: -Once you're logged in, you can access the profile page by clicking on the badge next to the Home Assistant title in the sidebar. Here you can change your preferred language or change your password. You can also log out. + - Create and manage other user accounts. + - Configure integrations and other settings (coming soon). + - Configure Hass.io (coming soon). + +

+For the moment, other user accounts will have the same access as the owner account. In the future, non-owner accounts will be able to have restrictions applied. +

+ +### {% linkable_title Your Account Profile %} + +Once you're logged in, you can see the details of your account at the _Profile_ page by clicking on the circular badge next to the Home Assistant title in the sidebar. Screenshot of the profile page -## {% linkable_title Multi-factor authentication %} +You can: -As a user, you can setup multi-factor authentication with time-based one-time passwords. This is an extra challenge that you have to solve after you finish your login. You will be able to set up these challenges from the profile page once you're logged in. +* Change the language you prefer Home Assistant to use. +* Change your password. +* Select the [theme](https://www.home-assistant.io/components/frontend/#defining-themes) for the interface of Home Assistant. +* Enable or disable [multi-factor authentication](http://127.0.0.1:4000/docs/authentication/multi-factor-auth/). +* Delete _Refresh Tokens_. These are created when you log in from a device. Delete them if you want to force the device to log out. +* Create [Long Lived Access Tokens](https://developers.home-assistant.io/docs/en/auth_api.html#long-lived-access-token) so scripts can securely interact with Home Assistant. +* Log out of Home Assistant. -Screenshot of setting up multi-factor authentication +### {% linkable_title Securing your login %} + +_Make sure to choose a secure password!_ At some time in the future, you will probably want to access Home Assistant from outside your local network. This means you are also exposed to random black-hats trying to do the same. Treat the password like the key to your house. + + +As an extra level of security, you can turn on [multi-factor authentication](http://127.0.0.1:4000/docs/authentication/multi-factor-auth/). + +## {% linkable_title Other authentication techniques %} + +Home Assistant provides several ways to authenticate. See the [Auth Providers](/docs/authentication/providers/) section. ## {% linkable_title Troubleshooting %} ### {% linkable_title Authentication failures from `127.0.0.1` %} -If you're seeting authentication failures from `127.0.0.1` and you're using the `nmap` device tracker, you should [exclude the Home Assistant IP](/components/device_tracker.nmap_tracker/#exclude) from being scanned. +If you're seeing authentication failures from `127.0.0.1` and you're using the `nmap` device tracker, you should [exclude the Home Assistant IP](/components/device_tracker.nmap_tracker/#exclude) from being scanned. ### {% linkable_title Bearer token warnings %} @@ -56,7 +73,7 @@ If you see this, you need to add an [`api_password`](/components/http/#api_passw ### {% linkable_title Bearer token informational messages %} -If instead, you see the following, then this is a message for component developers, to tell them that they need to update how they authenticate to Home Assistant. As an end user you don't need to do anything: +If you see the following, then this is a message for component developers, to tell them they need to update how they authenticate to Home Assistant. As an end user you don't need to do anything: ```txt INFO (MainThread) [homeassistant.components.http.auth] You need to use a bearer token to access /blah/blah from 192.0.2.4 @@ -70,30 +87,30 @@ While you should hopefully be storing your passwords in a password manager, if y * `auth_provider.homeassistant` * `onboarding` -When you start Home Assistant next you'll be required to set up authentication again. +When you start Home Assistant next, you'll be required to set up authentication again. ### {% linkable_title Error: invalid client id or redirect url%} Screenshot of Error: invalid client id or redirect url -You have to use a domain name, not IP address to remote access Home Assistant; otherwise you will get **Error: invalid client id or redirect url** error on the login form. However, you can use the IP address to access Home Assistant in your home network. +You have to use a domain name, not IP address, to remote access Home Assistant otherwise you will get **Error: invalid client id or redirect url** error on the login form. However, you can use the IP address to access Home Assistant in your home network. -It because we only allow using IP address as client ID when your IP address is one of internal network address (e.g., 192.168.0.1) or loopback address (e.g., 127.0.0.1). +This is because we only allow an IP address as a client ID when your IP address is an internal network address (e.g., `192.168.0.1`) or loopback address (e.g., `127.0.0.1`). -If you don't have a valid domain name for your Home Assistant instance, you can modify the `hosts` file on your computer to fake one. For example, if you are on Windows, edit `C:\Windows\System32\Drivers\etc\hosts` file with administrator privilege, add following entry. +If you don't have a valid domain name for your Home Assistant instance, you can modify the `hosts` file on your computer to fake one. On Windows, edit the `C:\Windows\System32\Drivers\etc\hosts` file with administrator privilege, or on Linux the `/etc/hosts` file, and add following entry: ```text 12.34.56.78 hassbian.home ``` -(Please replace `12.34.56.78` with your Home Assistant's public IP address) +Replace `12.34.56.78` with your Home Assistant's public IP address. -It will allow you to open Home Assistant instance by access `http://hassbian.home:8123/` +This will allow you to open Home Assistant at `http://hassbian.home:8123/` ### {% linkable_title Stuck on Loading data %} -Some advert blocking software, such as Wipr, also blocks web sockets. If you're stuck on the Loading data screen, try disabling your ad blocker. +Some ad blocking software, such as Wipr, also blocks web sockets. If you're stuck on the Loading data screen, try disabling your ad blocker. ### {% linkable_title Migrating from pre 0.77 %} -If you were using the authentication system before 0.77, you'll likely have `auth:` and `auth_providers:` defined. You'll need to remove these and let Home Assistant [handle it automatically](https://www.home-assistant.io/docs/authentication/providers/#configuring-auth-providers). +If you were using the authentication system before 0.77, you'd likely have `auth:` and `auth_providers:` defined. You'll need to remove these and let Home Assistant [handle it automatically](https://www.home-assistant.io/docs/authentication/providers/#configuring-auth-providers). diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown index 3f09b878487..72d95ad9376 100644 --- a/source/_docs/authentication/multi-factor-auth.markdown +++ b/source/_docs/authentication/multi-factor-auth.markdown @@ -10,23 +10,28 @@ sharing: true footer: true --- -

-This is an advanced feature. If misconfigured, you will not be able to access Home Assistant anymore! -

+The Multi-factor Authentication (MFA) modules require you to solve a second challenge after you provide your password. -Besides the authentication providers, it's also possible to configure multi-factor authentication modules. These authentication modules will require the user to solve a second challenge besides just logging in. The idea is that you ask the user for something they know, their username/password, and something they have, like a time-based authentication token from their phone. +A password can be compromised in a number of ways, for example, it can be guessed if it is a simple password. MFA provides a second level of defense by requiring: -The multi-factor authentication module can be used mixed-matched with authentication providers. After the normal authentication provider validation, the login flow will ask the user for additional challenge(s) if there are multi-factor authentication modules enabled for this user. If more than one multi-factor authentication module is enabled, the user can select one of them during the login. +* something you know, like your username and password, and +* something you have, like a one-time password sent to your phone. -The multi-factor authentication module has to be enabled for the user before it can be used in the login process. The user can go to the profile page enable it by himself. +You can use MFA with any of the other authentication providers. If more than one MFA module is enabled, you can choose one when you log in. -## {% linkable_title Configuring multi-factor authentication modules %} +You can turn MFA on and off in the [profile page](/docs/authentication/#your-account-profile) for your user account. -

-By configuring your own instead of using the default configuration, you take full responsibility for the authentication of the system. -

+## {% linkable_title Available MFA modules %} -Multi-factor authentication modules are configured in your `configuration.yaml` file under the `homeassistant:` block: +### {% linkable_title Time-based One-Time Password MFA module %} + +[Time-based One-Time Password](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm) (TOTP) is widely adopted in modern authentication systems. + +Home Assistant generates a secret key which is synchronized with an app on your phone. Every thirty seconds or so the phone app generates a random six digit number. Because Home Assistant knows the secret key, it knows which number will be generated. If you enter the correct digits, then you're in. + +#### {% linkable_title Setting up TOTP %} + +Enable TOTP in your `configuration.yaml` like this: ```yaml homeassistant: @@ -34,45 +39,37 @@ homeassistant: - type: totp ``` -## {% linkable_title Available multi-factor authentication modules %} +If no `auth_mfa_modules` config section is defined in `configuration.yaml` a TOTP module named "Authenticator app" will be autoloaded. -Below is a list of the currently available auth providers. +You will need an authenticator app on your phone. We recommend either [Google Authenticator](https://support.google.com/accounts/answer/1066447) or [Authy](https://authy.com/). Both are available for iOS or Android. -### {% linkable_title Time-based One-Time Password multi-factor authentication module %} +After restarting Home Assistant, go to your [profile page](/docs/authentication/#your-account-profile) and there should be a "Multi-factor Authentication Modules" section. -[Time-based One-Time Password](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm) is widely adopted in modern authentication system, it combines a secret key with the current timestamp using a cryptographic hash function to generate a one-time password. Whoever possessed the secret key will get same one-time password in certain time period. By verifying that password, Home Assistant knows the user have the right secret key. +Click _Enable_ and a new secret key will be generated. Go to your phone app and enter the key, either by scanning the QR code or typing in the key below the QR code manually. -When trying to set up TOTP module, a QR code will show up. The user can scan it by an authenticator app, or set it up manually using the code showed in the UI. After setup, the user needs to input a six digit number generated in the authenticator app to verify the setup is good. If the verification keeps failing, you need to check whether the clock on Home Assistant is accurate. - -There are several authenticator apps on the market, we recommend either [Google Authenticator](https://support.google.com/accounts/answer/1066447) or [Authy](https://authy.com/). +Screenshot of setting up multi-factor authentication

-Please treat the secret key like a password, never expose it to others. +Please treat the secret key like a password - never expose it to others.

-By default one TOTP multi-factor auth module named "Authenticator app" will be auto loaded if no `auth_mfa_modules` config section defined in `configuration.yaml`. +Your phone app will now start generating a different six-digit code every thirty seconds or so. Enter one of these into Home Assistant under the QR code where it asks for a _Code_. Home Assistant and your phone app are now in sync and you can now use the code displayed in the app to log in. -Example of configuration: +#### {% linkable_title Using TOTP %} -```yaml -homeassistant: - auth_mfa_modules: - - type: totp -``` +Once TOTP is enabled, Home Assistant requires the latest code from your phone app before you can log in. + +

+TOTP is _time based_ so it relies on your Home Assistant clock being accurate. If the verification keeps failing, make sure the clock on Home Assistant is correct. +

### {% linkable_title Notify multi-factor authentication module %} -Notify MFA module using [notify component](https://www.home-assistant.io/components/notify/) to delivery a [HMAC-based One-Time Password](https://en.wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm) to user configured target. +The Notify MFA module uses the [notify component](https://www.home-assistant.io/components/notify/) to send you an [HMAC-based One-Time Password](https://en.wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm). It is typically sent to your phone, but can be sent to any destination supported by a `notify` service. You use this password to log in. -User need first set up the MFA module by select one of the available notify service. A 6 digit one-time password will be sent by this notify service, user need to input it to verify the setup. +#### {% linkable_title Setting up TOTP %} -During the login process, a 6 digit one-time password will be sent again, user need to input it to verify his/her identity. If the validation failed, a new one-time password will be sent again. - -

-Notify MFA module would not verify the one-time password delivery success, so that if user cannot received the message due any reason, he/she may not be login again. Edit or remove `[your_config_dir]/.storage/auth_module.notify` can disable notify MFA module to resolve the issue. -

- -Example of configuration +Add Notify MFA to your `configuration.yaml` file like this: ```yaml homeassistant: @@ -82,12 +79,12 @@ homeassistant: Optional configuration variables: -- **exclude** (*Optional*): The list of notify services you do not want to include in. -- **include** (*Optional*): The list of notify services you want to include in. -- **message** (*Optional*): The message template +- **exclude** (*Optional*): The list of notifying services you do not want to include. +- **include** (*Optional*): The list of notifying services you want to include. +- **message** (*Optional*): The message template. ```yaml -# Example configure with message template +# Example configuration, with a message template. homeassistant: auth_mfa_modules: - type: totp @@ -95,3 +92,15 @@ homeassistant: - type: notify message: 'I almost forget, to get into my clubhouse, you need to say {}' ``` + +After restarting Home Assistant, go to your [profile page](/docs/authentication/#your-account-profile) and there should be a "Multi-factor Authentication Modules" section. Click _Enable_ on the _Notify One-Time Password_ option. + +Try logging out, then logging in again. You will be asked for the six-digit one-time password that was sent to your notify service. Enter the password to log in. + +If the validation failed, a new one-time password will be sent again. + +

+The Notify MFA module can't tell if the one-time password was delivered successfully. If you don't get the notification, you won't be able to log in. + +You can disable the Notify MFA module by editing or removing the file `[your_config_dir]/.storage/auth_module.notify`. +

diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index b8ad501798c..7dea4c3bcb1 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -10,27 +10,24 @@ sharing: true footer: true --- -

-This is an advanced feature. If misconfigured, you will not be able to access Home Assistant anymore! +When you log in, an _auth provider_ checks your credentials to make sure you are an authorized user. + +

+The authentication system has been changed recently. Previously there was a single "_API password_" to log in, but you can now choose from several auth providers.

+ +To make the transition from API passwords easier, we've added a _Legacy API Password_ auth provider. This is enabled by default if you have an API password configured so you will still be able to log in. + +However, this feature is deprecated and will be removed in a future release so you should set up one of the newer authentication techniques.

-When a user logs in, it needs to authenticate against an auth provider. An auth provider will check the users' credentials, and if credentials are linked to a user in the system, allows the user to log in. - -By default, Home Assistant has enabled an auth provider that stores the users in the configuration directory. An owner account can manage these users from the frontend. - -To make the transition from API password to authentication system easier, we've added a legacy API password auth provider. This enables users to log in with the API password. This authentication provider is enabled by default if a user has an API password configured. - ## {% linkable_title Configuring auth providers %}

-Home Assistant automatically configures the standard auth providers and you **do not** need to specify `auth_providers` in your `configuration.yaml` file. Specifying `auth_providers` in your configuration will disable all auth providers that are not listed and can reduce your security or create difficulties logging in. +Home Assistant automatically configures the standard auth providers so you don't need to specify `auth_providers` in your `configuration.yaml` file unless you are configuring more than one. Specifying `auth_providers` will disable all auth providers that are not listed, so you could reduce your security or create difficulties logging in if it is not configured correctly.

-

-[Issue 16441](https://github.com/home-assistant/home-assistant/issues/16441): the legacy API password auth provider won't be automatically configured if your API password is located in a package. This is because Home Assistant processes the `auth_provider` during the `core` section loading, which is earlier than the `packages` processing. -

-Authentication providers are configured in your `configuration.yaml` under the `homeassistant:` block: +Authentication providers are configured in your `configuration.yaml` under the `homeassistant:` block. You can supply more than one, for example: ```yaml homeassistant: @@ -41,13 +38,15 @@ homeassistant: ## {% linkable_title Available auth providers %} -Below is a list of currently available auth providers. - ### {% linkable_title Home Assistant auth provider %} -This is the default auth provider which stores the users in your configuration directory. All passwords are stored hashed and with a salt, making it almost impossible for an attacker to figure out the password from the storage. +This is the default auth provider. The first user created is designated as the _owner_ and can create other users. -Users for this auth provider can be managed via the UI by the owner. Navigate to the configuration panel and click on users. +User details are stored in the `[your config]/.storage` directory. All passwords are stored hashed and with a salt, making it almost impossible for an attacker to figure out the password even if they have access to the file. + +Users can be managed in Home Assistant by the owner. Go to the configuration panel and click on _Users_. + +This is the entry in `configuration.yaml` for Home Assistant auth: ```yaml homeassistant: @@ -55,14 +54,20 @@ homeassistant: - type: homeassistant ``` +If you don't specify any `auth_providers` section in the `configuration.yaml` file then this provider will be set up automatically. + ### {% linkable_title Trusted Networks %} -With the trusted networks auth provider you can whitelist an IP range for which no authentication will be required. The user will be prompted to pick a user to log in as. +The Trusted Networks auth provider defines a range of IP addresses for which no authentication will be required (also known as "whitelisting"). For example, you can whitelist your local network so you won't be prompted for a password if you access Home Assistant from inside your home. + +When you log in from one of these networks, you will be asked which user account to use and won't need to enter a password.

-The [multi-factor autentication module](../multi-factor-auth) will not participate in login process by using this auth provider. +The [multi-factor authentication module](/authentication/multi-factor-auth/) will not participate in the login process if you using this auth provider.

+Here is an example in `configuration.yaml` to set up Trusted Networks: + ```yaml homeassistant: auth_providers: @@ -80,6 +85,10 @@ http: ### {% linkable_title Legacy API password %} +

+This is a legacy feature for backwards compatibility and will be dropped in a future release. You should move to one of the other auth providers. +

+ Activating this auth provider will allow you to authenticate with the API password set in the HTTP component. ```yaml @@ -92,3 +101,7 @@ http: ``` Activating this auth provider will also allow you to provide the API password using an authentication header to make requests against the Home Assistant API. This feature will be dropped in the future in favor of long-lived access tokens. + +

+[Issue 16441](https://github.com/home-assistant/home-assistant/issues/16441): the legacy API password auth provider, won't be automatically configured if your API password is located in a package. This is because Home Assistant processes the `auth_provider` during the `core` section loading, which is earlier than the `packages` processing. +

From 3c0e0545d7ce757d347d002c099bfb5e8547e223 Mon Sep 17 00:00:00 2001 From: Josh Cooper Date: Mon, 29 Oct 2018 13:56:38 +0000 Subject: [PATCH 11/62] Added multiple lights to TP-Link lights (#7205) * Added multiple lights to TP-Link lights Added the multiple lights text same as TP-Link switches. * fixed to be light instead of switch thanks rohankapoorcom * :pencil2: Move example below the configuration options --- source/_components/light.tplink.markdown | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/source/_components/light.tplink.markdown b/source/_components/light.tplink.markdown index 158504bcae0..c17d111832c 100644 --- a/source/_components/light.tplink.markdown +++ b/source/_components/light.tplink.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Local Polling" ha_release: "0.50" --- - The `tplink` light platform allows you to control the state of your [TP-Link smart bulb](http://www.tp-link.com/en/products/list-5609.html). Supported units: @@ -44,3 +43,15 @@ host: type: string {% endconfiguration %} +## {% linkable_title Adding multiple lights %} + +You may need to add [multiple lights](https://community.home-assistant.io/t/multiple-tp-link-switches/6935) and the config would need to include multiple lights separately. + +```yaml +# Example configuration.yaml entry +light: + - platform: tplink + host: FIRST_IP_ADDRESS + - platform: tplink + host: SECOND_IP_ADDRESS +``` From 9425cf95a186710dcd5a256866d7863e98f0a729 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 29 Oct 2018 15:38:58 +0100 Subject: [PATCH 12/62] Add ID information to Lovelace view page. (#7153) * Add ID information to view page. * :pencil2: Tweaks --- source/lovelace/views.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/lovelace/views.markdown b/source/lovelace/views.markdown index 725f43894f1..0ea7de6abb3 100644 --- a/source/lovelace/views.markdown +++ b/source/lovelace/views.markdown @@ -36,7 +36,7 @@ views: type: list id: required: false - description: IDs are used in the URL, more info below. + description: IDs are used in the URL, more info below. If you don't specify an ID, a random one will be added automatically. type: string default: view index icon: @@ -62,6 +62,8 @@ views: You can link to one view from another view by its ID. For this use cards that support navigation (`navigation_path`). Do not use special characters in IDs. +IDs are also used to identify a view for editing in the Home Assistant frontend (not yet released), we will add a randomly generated ID to your view if you don't specify one. You can change this ID, as long as every view has a unique ID. + ### {% linkable_title Example %} View config: From 328de6424e9004436b781379ddb6db58848070c8 Mon Sep 17 00:00:00 2001 From: bonanitech Date: Mon, 29 Oct 2018 10:53:20 -0400 Subject: [PATCH 13/62] Update providers.markdown (#7228) Just fixing a broken link --- source/_docs/authentication/providers.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index 7dea4c3bcb1..659b027ae3f 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -63,7 +63,7 @@ The Trusted Networks auth provider defines a range of IP addresses for which no When you log in from one of these networks, you will be asked which user account to use and won't need to enter a password.

-The [multi-factor authentication module](/authentication/multi-factor-auth/) will not participate in the login process if you using this auth provider. +The [multi-factor authentication module](/docs/authentication/multi-factor-auth/) will not participate in the login process if you using this auth provider.

Here is an example in `configuration.yaml` to set up Trusted Networks: From 470393dc6ff49ab347545569ede53e227775f187 Mon Sep 17 00:00:00 2001 From: bonanitech Date: Mon, 29 Oct 2018 12:57:43 -0400 Subject: [PATCH 14/62] Update authentication.markdown (#7229) * Update authentication.markdown Just fixing a broken link * :hammer: Makes links relative --- source/_docs/authentication.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_docs/authentication.markdown b/source/_docs/authentication.markdown index 6caeee7681e..655e4002d57 100644 --- a/source/_docs/authentication.markdown +++ b/source/_docs/authentication.markdown @@ -38,8 +38,8 @@ You can: * Change the language you prefer Home Assistant to use. * Change your password. -* Select the [theme](https://www.home-assistant.io/components/frontend/#defining-themes) for the interface of Home Assistant. -* Enable or disable [multi-factor authentication](http://127.0.0.1:4000/docs/authentication/multi-factor-auth/). +* Select the [theme](/components/frontend/#defining-themes) for the interface of Home Assistant. +* Enable or disable [multi-factor authentication](/docs/authentication/multi-factor-auth/). * Delete _Refresh Tokens_. These are created when you log in from a device. Delete them if you want to force the device to log out. * Create [Long Lived Access Tokens](https://developers.home-assistant.io/docs/en/auth_api.html#long-lived-access-token) so scripts can securely interact with Home Assistant. * Log out of Home Assistant. @@ -49,7 +49,7 @@ You can: _Make sure to choose a secure password!_ At some time in the future, you will probably want to access Home Assistant from outside your local network. This means you are also exposed to random black-hats trying to do the same. Treat the password like the key to your house. -As an extra level of security, you can turn on [multi-factor authentication](http://127.0.0.1:4000/docs/authentication/multi-factor-auth/). +As an extra level of security, you can turn on [multi-factor authentication](/docs/authentication/multi-factor-auth/). ## {% linkable_title Other authentication techniques %} @@ -81,7 +81,7 @@ INFO (MainThread) [homeassistant.components.http.auth] You need to use a bearer ### {% linkable_title Lost owner password %} -While you should hopefully be storing your passwords in a password manager, if you lose the password associated with the owner account the only way to resolve this is to delete *all* the authentication data. You do this by shutting down Home Assistant and deleting the following files from the `.storage/` folder in your [configuration folder](https://www.home-assistant.io/docs/configuration/): +While you should hopefully be storing your passwords in a password manager, if you lose the password associated with the owner account the only way to resolve this is to delete *all* the authentication data. You do this by shutting down Home Assistant and deleting the following files from the `.storage/` folder in your [configuration folder](/docs/configuration/): * `auth` * `auth_provider.homeassistant` @@ -113,4 +113,4 @@ Some ad blocking software, such as Wipr, also blocks web sockets. If you're stuc ### {% linkable_title Migrating from pre 0.77 %} -If you were using the authentication system before 0.77, you'd likely have `auth:` and `auth_providers:` defined. You'll need to remove these and let Home Assistant [handle it automatically](https://www.home-assistant.io/docs/authentication/providers/#configuring-auth-providers). +If you were using the authentication system before 0.77, you'd likely have `auth:` and `auth_providers:` defined. You'll need to remove these and let Home Assistant [handle it automatically](/docs/authentication/providers/#configuring-auth-providers). From eda0f413aa68f9e09fec46e9f6befe8a508e05fd Mon Sep 17 00:00:00 2001 From: pattyland Date: Mon, 29 Oct 2018 19:23:14 +0100 Subject: [PATCH 15/62] Tips for enabling GPIO on Hass.io (#7224) - Removed a hint to `mount_dir`, because it's not mentioned in the linked documentation (anymore?). - A tip for activating GPIO on Hass.io has been added, as the other documentation only applies to Debian based systems. --- source/_components/sensor.onewire.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.onewire.markdown b/source/_components/sensor.onewire.markdown index 8cd5751d780..9f28de6ad70 100644 --- a/source/_components/sensor.onewire.markdown +++ b/source/_components/sensor.onewire.markdown @@ -29,7 +29,8 @@ The 1-Wire bus can be connected directly to the IO pins of Raspberry Pi or using ## {% linkable_title Raspberry Pi setup %} -In order to setup 1-Wire support on Raspberry Pi, you'll need to edit `/boot/config.txt` following [this documentation](https://www.waveshare.com/wiki/Raspberry_Pi_Tutorial_Series:_1-Wire_DS18B20_Sensor#Enable_1-Wire). Don't use the `mount_dir` option. +In order to setup 1-Wire support on Raspberry Pi, you'll need to edit `/boot/config.txt` following [this documentation](https://www.waveshare.com/wiki/Raspberry_Pi_Tutorial_Series:_1-Wire_DS18B20_Sensor#Enable_1-Wire). +To edit `/boot/config.txt` on Hass.io use [this documentation](https://developers.home-assistant.io/docs/en/hassio_debugging.html) to enable SSH and edit `/mnt/boot/config.txt` via `vi`. ## {% linkable_title Interface adapter setup %} From fd95a34870b3e10afd718fe6a3b7f15d7ae8a4fb Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:43:03 +0100 Subject: [PATCH 16/62] Update History_stats sensor component configuration (#7248) * Update History_stats sensor component configuration * :ambulance: Fix error --- .../_components/sensor.history_stats.markdown | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/source/_components/sensor.history_stats.markdown b/source/_components/sensor.history_stats.markdown index 8a9c76b7ebb..c8f5bebb6e4 100644 --- a/source/_components/sensor.history_stats.markdown +++ b/source/_components/sensor.history_stats.markdown @@ -40,16 +40,38 @@ sensor: end: '{% raw %}{{ now() }}{% endraw %}' ``` -Configuration variables: - - - **entity_id** (*Required*): The entity you want to track - - **state** (*Required*): The state you want to track - - **name** (*Optional*): Name displayed on the frontend - - **type** (*Optional*): The type of sensor: `time`, `ratio`, or `count`. Defaults to `time` - - **start**: When to start the measure (timestamp or datetime). - - **end**: When to stop the measure (timestamp or datetime) - - **duration**: Duration of the measure - +{% configuration %} +entity_id: + description: The entity you want to track. + required: true + type: string +state: + description: The state you want to track. + required: true + type: string +name: + description: Name displayed on the frontend. + required: false + default: unnamed statistics + type: string +type: + description: "The type of sensor: `time`, `ratio`, or `count`." + required: false + default: time + type: string +start: + description: When to start the measure (timestamp or datetime). + required: false + type: template +end: + description: When to stop the measure (timestamp or datetime). + required: false + type: template +duration: + description: Duration of the measure. + required: false + type: time +{% endconfiguration %}

You have to provide **exactly 2** of `start`, `end` and `duration`. @@ -74,7 +96,6 @@ The `history_stats` component will execute a measure within a precise time perio As `start` and `end` variables can be either datetimes or timestamps, you can configure almost any period you want. - ### {% linkable_title Duration %} The duration variable is used when the time period is fixed. Different syntaxes for the duration are supported, as shown below. @@ -127,6 +148,7 @@ Here are some examples of periods you could work with, and what to write in your **Current week**: starts last Monday at 00:00, ends right now. Here, last Monday is _today_ as a timestamp, minus 86400 times the current weekday (86400 is the number of seconds in one day, the weekday is 0 on Monday, 6 on Sunday). + ```yaml start: '{% raw %}{{ as_timestamp( now().replace(hour=0).replace(minute=0).replace(second=0) ) - now().weekday() * 86400 }}{% endraw %}' end: '{% raw %}{{ now() }}{% endraw %}' From c7f8c123036cc028d91279f0cd9cb0cd9fd85ef7 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 29 Oct 2018 22:46:30 +0100 Subject: [PATCH 17/62] Update templates --- .../_components/sensor.history_stats.markdown | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/source/_components/sensor.history_stats.markdown b/source/_components/sensor.history_stats.markdown index c8f5bebb6e4..c2c99448962 100644 --- a/source/_components/sensor.history_stats.markdown +++ b/source/_components/sensor.history_stats.markdown @@ -28,6 +28,7 @@ Examples of what you can track: To enable the history statistics sensor, add the following lines to your `configuration.yaml`: +{% raw %} ```yaml # Example configuration.yaml entry sensor: @@ -36,9 +37,10 @@ sensor: entity_id: light.my_lamp state: 'on' type: time - start: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}' - end: '{% raw %}{{ now() }}{% endraw %}' + start: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}' + end: '{{ now() }}' ``` +{% endraw %} {% configuration %} entity_id: @@ -124,50 +126,62 @@ Here are some examples of periods you could work with, and what to write in your **Today**: starts at 00:00 of the current day and ends right now. +{% raw %} ```yaml - start: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}' - end: '{% raw %}{{ now() }}{% endraw %}' + start: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}' + end: '{{ now() }}' ``` +{% endraw %} **Yesterday**: ends today at 00:00, lasts 24 hours. +{% raw %} ```yaml - end: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}' + end: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}' duration: hours: 24 ``` +{% endraw %} **This morning (6AM - 11AM)**: starts today at 6, lasts 5 hours. +{% raw %} ```yaml - start: '{% raw %}{{ now().replace(hour=6).replace(minute=0).replace(second=0) }}{% endraw %}' + start: '{{ now().replace(hour=6).replace(minute=0).replace(second=0) }}' duration: hours: 5 ``` +{% endraw %} **Current week**: starts last Monday at 00:00, ends right now. Here, last Monday is _today_ as a timestamp, minus 86400 times the current weekday (86400 is the number of seconds in one day, the weekday is 0 on Monday, 6 on Sunday). +{% raw %} ```yaml - start: '{% raw %}{{ as_timestamp( now().replace(hour=0).replace(minute=0).replace(second=0) ) - now().weekday() * 86400 }}{% endraw %}' - end: '{% raw %}{{ now() }}{% endraw %}' + start: '{{ as_timestamp( now().replace(hour=0).replace(minute=0).replace(second=0) ) - now().weekday() * 86400 }}' + end: '{{ now() }}' ``` +{% endraw %} **Last 30 days**: ends today at 00:00, lasts 30 days. Easy one. +{% raw %} ```yaml - end: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}' + end: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}' duration: days: 30 ``` +{% endraw %} **All your history** starts at timestamp = 0, and ends right now. +{% raw %} ```yaml - start: '{% raw %}{{ 0 }}{% endraw %}' - end: '{% raw %}{{ now() }}{% endraw %}' + start: '{{ 0 }}' + end: '{{ now() }}' ``` +{% endraw %}

The `/dev-template` page of your home-assistant UI can help you check if the values for `start`, `end` or `duration` are correct. If you want to check if your period is right, just click on your component, the `from` and `to` attributes will show the start and end of the period, nicely formatted. From 773f029d8050121ee44597f67c0528d52685b1db Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:47:56 +0100 Subject: [PATCH 18/62] Update Statistics sensor component configuration (#7246) --- source/_components/sensor.statistics.markdown | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/source/_components/sensor.statistics.markdown b/source/_components/sensor.statistics.markdown index 509e7f8db3c..ad60be7beb0 100644 --- a/source/_components/sensor.statistics.markdown +++ b/source/_components/sensor.statistics.markdown @@ -38,13 +38,31 @@ sensor: minutes: 30 ``` -Configuration variables: - -- **entity_id** (*Required*): The entity to monitor. Only [sensors](/components/sensor/) and [binary sensor](/components/binary_sensor/). -- **name** (*Optional*): Name of the sensor to use in the frontend. Defaults to `Stats`. -- **sampling_size** (*Optional*): Size of the sampling. If the limit is reached then the values are rotated. Defaults to `20`. -- **max_age** (*Optional*): Maximum age of measurements. Setting this to a time interval will cause older values to be discarded. -- **precision** (*Optional*): Defines the precision of the calculated values, through the argument of round(). Defaults to `2`. +{% configuration %} +entity_id: + description: The entity to monitor. Only [sensors](/components/sensor/) and [binary sensor](/components/binary_sensor/). + required: true + type: string +name: + description: Name of the sensor to use in the frontend. + required: false + default: Stats + type: string +sampling_size: + description: Size of the sampling. If the limit is reached then the values are rotated. + required: false + default: 20 + type: integer +max_age: + description: Maximum age of measurements. Setting this to a time interval will cause older values to be discarded. + required: false + type: time +precision: + description: Defines the precision of the calculated values, through the argument of round(). + required: false + default: 2 + type: integer +{% endconfiguration %}

From bbe54a82dbc7e4931ada476163d080720b7b03e8 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:48:14 +0100 Subject: [PATCH 19/62] Update Python_component_simple_alarm component configuration (#7245) --- .../python_component_simple_alarm.markdown | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/source/_cookbook/python_component_simple_alarm.markdown b/source/_cookbook/python_component_simple_alarm.markdown index 16e7d015daa..e212f5d5255 100644 --- a/source/_cookbook/python_component_simple_alarm.markdown +++ b/source/_cookbook/python_component_simple_alarm.markdown @@ -23,10 +23,16 @@ simple_alarm: unknown_light: group.living_room ``` -Configuration variables: - -- **known_light** (*Optional*): Which light/light group has to flash when a known device comes home. -- **unknown_light** (*Optional*): Which light/light group has to flash red when light turns on while no one home. +{% configuration %} +known_light: + description: Which light/light group has to flash when a known device comes home. + required: false + type: string +unknown_light: + description: Which light/light group has to flash red when light turns on while no one home. + required: false + type: string +{% endconfiguration %} Create the file `/custom_components/simple_alarm.py` and copy paste the content below: From 0b3f98f0bdd329b3df5adb39c2b03e88fe381321 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:48:52 +0100 Subject: [PATCH 20/62] Update Gstreamer media_player component configuration (#7244) --- .../media_player.gstreamer.markdown | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/source/_components/media_player.gstreamer.markdown b/source/_components/media_player.gstreamer.markdown index 288ef12120c..ad23c571d68 100644 --- a/source/_components/media_player.gstreamer.markdown +++ b/source/_components/media_player.gstreamer.markdown @@ -23,10 +23,16 @@ media_player: - platform: gstreamer ``` -Configuration variables: - -- **name** (*Optional*): Name the player. -- **pipeline** (*Optional*): `gst` pipeline description. +{% configuration %} +name: + description: Name of the media player. + required: false + type: string +pipeline: + description: A `gst` pipeline description. + required: false + type: string +{% endconfiguration %} Only the `music` media type is supported. @@ -56,7 +62,7 @@ If you're running Home Assistant in a virtual environment, you'll need to symlin ```bash ln -s /path/to/your/installation/of/gi /path/to/your/venv/lib/python3.4/site-packages -``` +``` On a Raspberry Pi, you may need to add the Home Assistant user to the `audio` group: @@ -65,7 +71,7 @@ sudo usermod -a -G audio ``` ## {% linkable_title Example Usage %} - + ### {% linkable_title Using with TTS %} To play TTS on your local computer (for example, if you have speakers attached to your Raspberry Pi: From 7b3fd157899743ae7a184e124184433f75068493 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:51:19 +0100 Subject: [PATCH 21/62] Update Russound_rnet media_player component configuration (#7242) --- .../media_player.russound_rnet.markdown | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/source/_components/media_player.russound_rnet.markdown b/source/_components/media_player.russound_rnet.markdown index 9dd90d45d79..bd5a7ff68c0 100644 --- a/source/_components/media_player.russound_rnet.markdown +++ b/source/_components/media_player.russound_rnet.markdown @@ -46,10 +46,25 @@ media_player: - name: Sky+ ``` -Configuration variables: - -- **host** (*Required*): The IP of the TCP gateway -- **port** (*Required*): The port of the TCP gateway -- **name** (*Required*): The name of the device -- **zones** (*Required*): This is the list of zones available -- **sources** (*Required*): The list of sources available, these must be in order as they are connected to the device +{% configuration %} +host: + description: The IP of the TCP gateway. + required: true + type: string +port: + description: The port of the TCP gateway. + required: true + type: integer +name: + description: The name of the device. + required: true + type: string +zones: + description: This is the list of zones available. + required: true + type: integer +sources: + description: The list of sources available, these must be in order as they are connected to the device. + required: true + type: list +{% endconfiguration %} From 007a9df7b8b5f365b435c60055d68205aa4e6b5d Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:51:59 +0100 Subject: [PATCH 22/62] Update Mosquitto addon component configuration (#7237) --- source/_addons/mosquitto.markdown | 32 ++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/source/_addons/mosquitto.markdown b/source/_addons/mosquitto.markdown index 70f591520c0..fc1808a6ccb 100644 --- a/source/_addons/mosquitto.markdown +++ b/source/_addons/mosquitto.markdown @@ -34,13 +34,31 @@ Set up [Mosquitto](https://mosquitto.org/) as MQTT broker. Make sure you use logins and disable anonymous access if you want to secure the system.

-Configuration variables: - -- **plain** (*Optional*): Listen on port 1883 without SSL/TLS. Defaults to `true`. -- **ssl** (*Optional*): Listen on port 8883 with SSL/TLS. This requires certificates. Defaults to `false`. -- **anonymous** (*Optional*): Allow anonymous connections. If *logins* is set, the anonymous user can only read data. Defaults to `true`. -- **logins** (*Optional*): A list of users that will be created with *username* and *password*. -- **customize** (*Optional*): If you enable it, it reads additional configuration files (`*.conf`) from `/share/mosquitto`. +{% configuration %} +plain: + description: Listen on port 1883 without SSL/TLS. + required: false + default: true + type: boolean +ssl: + description: Listen on port 8883 with SSL/TLS. This requires certificates. + required: false + default: false + type: boolean +anonymous: + description: Allow anonymous connections. If *logins* is set, the anonymous user can only read data. + required: false + default: true + type: boolean +logins: + description: A list of users that will be created with *username* and *password*. + required: false + type: list +customize: + description: If you enable it, it reads additional configuration files (`*.conf`) from `/share/mosquitto`. + required: false + type: [boolean, string] +{% endconfiguration %} ### {% linkable_title Home Assistant configuration %} From 32878977db48577c2eb1e75bde369ec6e5b7d16c Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:54:05 +0100 Subject: [PATCH 23/62] Update Nad media_player component configuration (#7240) --- source/_components/media_player.nad.markdown | 34 +++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/source/_components/media_player.nad.markdown b/source/_components/media_player.nad.markdown index 41684f72129..25152678fa7 100644 --- a/source/_components/media_player.nad.markdown +++ b/source/_components/media_player.nad.markdown @@ -13,7 +13,6 @@ ha_release: 0.36 ha_iot_class: "Local Polling" --- - The `nad` platform allows you to control a [NAD receiver](http://nadelectronics.com) through RS232 from Home Assistant. To add an NAD receiver to your installation, add the following to your `configuration.yaml` file: @@ -25,13 +24,32 @@ media_player: serial_port: /dev/ttyUSB0 ``` -Configuration variables: - -- **serial_port** (*Required*): The serial port . Default is `/dev/ttyUSB0` -- **name** (*Optional*): Name of the device. Default is NAD Receiver. -- **min_volume** (*optional*): Minimum volume in dB to use with the slider. Default is `-92` -- **max_volume** (*optional*): Maximum volume in dB to use with the slider. Default is `-20` -- **sources** (*Optional*): A list of mappings from source to source name. Valid sources are `1 to 10`. +{% configuration %} +serial_port: + description: The serial port. + required: true + default: "/dev/ttyUSB0" + type: string +name: + description: Name of the device. + required: false + default: NAD Receiver + type: string +min_volume: + description: Minimum volume in dB to use with the slider. + required: false + default: -92 + type: integer +max_volume: + description: Maximum volume in dB to use with the slider. + required: false + default: -20 + type: integer +sources: + description: A list of mappings from source to source name. Valid sources are `1 to 10`. + required: false + type: [list, string] +{% endconfiguration %} The min_volume and max_volume are there to protect you against misclicks on the slider so you will not blow up your speakers when you go from -92dB to +20dB. You can still force it to go higher or lower than the values set with the plus and minus buttons. From 805971b13f81cc00ba166f1f6b04f9e152a9c7a3 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 22:58:38 +0100 Subject: [PATCH 24/62] Update Scsgate light component configuration (#7238) --- source/_components/light.scsgate.markdown | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/_components/light.scsgate.markdown b/source/_components/light.scsgate.markdown index 07df0ca0f7e..7a5030ffc40 100644 --- a/source/_components/light.scsgate.markdown +++ b/source/_components/light.scsgate.markdown @@ -27,6 +27,9 @@ light: scs_id: XXXXX ``` -Configuration variables: - -- **devices** (*Required*): A list of devices with their name to use in the frontend. +{% configuration %} +devices: + description: A list of devices with their name to use in the frontend. + required: true + type: list +{% endconfiguration %} From 50145b762c6e6a020f4ac744ae8ec02d39f6df1f Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 23:06:50 +0100 Subject: [PATCH 25/62] Update Nadtcp media_player component configuration (#7241) * Update Nadtcp media_player component configuration * Minor change --- .../_components/media_player.nadtcp.markdown | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/source/_components/media_player.nadtcp.markdown b/source/_components/media_player.nadtcp.markdown index e673e4472d8..046ba913216 100644 --- a/source/_components/media_player.nadtcp.markdown +++ b/source/_components/media_player.nadtcp.markdown @@ -13,7 +13,6 @@ ha_release: 0.47 ha_iot_class: "Local Polling" --- - The `nadtcp` platform allows you to control the D7050 and C338 from Home Assistant via WiFi. Note that it has only been tested with the D 7050. To add a NAD amplifier to your installation, add the following to your `configuration.yaml` file: @@ -21,18 +20,35 @@ To add a NAD amplifier to your installation, add the following to your `configur ```yaml # Example configuration.yaml entry media_player: - platform: nadtcp + - platform: nadtcp host: 192.168.0.112 ``` -Configuration variables: - -- **host** (*Required*): The IP address of your amplifier. -- **name** (*Optional*): Name of the device. Default is NAD amplifier. -- **min_volume** (*optional*): Minimum volume in dB to use with the slider. Default is `-60` -- **max_volume** (*optional*): Maximum volume in dB to use with the slider. Default is `-10` -- **volume_step** (*Optional*): The amount in dB you want to increase the volume with when pressing volume up/down. Default is 4 dB. +{% configuration %} +host: + description: The IP address of your amplifier. + required: true + type: string +name: + description: Name of the device. + required: false + default: NAD amplifier + type: string +min_volume: + description: Minimum volume in dB to use with the slider. + required: false + default: -60 + type: integer +max_volume: + description: Maximum volume in dB to use with the slider. + required: false + default: -10 + type: integer +volume_step: + description: The amount in dB you want to increase the volume with when pressing volume up/down. + required: false + default: 4 + type: integer +{% endconfiguration %} The maximum volume level of the D 7050 amplifier is +10 db, minimum is -90. - - From 01f4c5e2f6d3f4c146e83bb8b37711af60fe4b5e Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 23:07:03 +0100 Subject: [PATCH 26/62] Update Monoprice media_player component configuration (#7243) * Update Monoprice media_player component configuration * Minor changes --- .../media_player.monoprice.markdown | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/source/_components/media_player.monoprice.markdown b/source/_components/media_player.monoprice.markdown index 75e41d9b631..eda0f9e9f23 100644 --- a/source/_components/media_player.monoprice.markdown +++ b/source/_components/media_player.monoprice.markdown @@ -36,17 +36,26 @@ media_player: 16: name: Guest Bedroom sources: - 1: + 1: name: Sonos 5: name: Chromecast ``` -Configuration variables: - -- **port** (*Required*): The serial port to which Monoprice amplifier is connected -- **zones** (*Required*): This is the list of zones available. Valid zones are 11,12,13,14,15,16. In case multiple Monoprice devices are stacked together the list of valid zones is extended by 21,22,23,24,25,26 for the second device and 31,32,33,34,35,36 for the third device. Each zone must have a name assigned to it. -- **sources** (*Required*): The list of sources available. Valid source numbers are 1,2,3,4,5,6. Each source number corresponds to the input number on the Monoprice amplifier. Similar to zones, each source must have a name assigned to it. +{% configuration %} +port: + description: The serial port to which Monoprice amplifier is connected. + required: true + type: string +zones: + description: This is the list of zones available. Valid zones are 11, 12, 13, 14, 15 or 16. In case multiple Monoprice devices are stacked together the list of valid zones is extended by 21, 22, 23, 24, 25 or 26 for the second device and 31, 32, 33, 34, 35 or 36 for the third device. Each zone must have a name assigned to it. + required: true + type: integer +sources: + description: The list of sources available. Valid source numbers are 1, 2, 3, 4, 5 or 6. Each source number corresponds to the input number on the Monoprice amplifier. Similar to zones, each source must have a name assigned to it. + required: true + type: integer +{% endconfiguration %} ### {% linkable_title Service `snapshot` %} From 17ad45b622103470fda4c50e267e1664564bd9ce Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 23:15:51 +0100 Subject: [PATCH 27/62] Update Litejet component configuration (#7236) --- source/_components/litejet.markdown | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/source/_components/litejet.markdown b/source/_components/litejet.markdown index fb334089530..ae6b94a24a9 100644 --- a/source/_components/litejet.markdown +++ b/source/_components/litejet.markdown @@ -27,11 +27,21 @@ Your LiteJet MCP should be configured for 19.2 K baud, 8 data bits, 1 stop bit, You can also configure the Home Assistant to ignore lights, scenes, and switches via their name. This is highly recommended since LiteJet has a fixed number of each of these and with most systems many will be unused. -Configuration variables: - -- **port** (*Required*): The path to the serial port connected to the LiteJet. -- **exclude_names** (*Optional*): A list of light or switch names that should be ignored. -- **include_switches** (*Optional*): Cause entities to be created for all the LiteJet switches. Default is `false`. This can be useful when debugging your lighting as you can press/release switches remotely. +{% configuration %} +port: + description: The path to the serial port connected to the LiteJet. + required: true + type: string +exclude_names: + description: A list of light or switch names that should be ignored. + required: false + type: [list, string] +include_switches: + description: Cause entities to be created for all the LiteJet switches. This can be useful when debugging your lighting as you can press/release switches remotely. + required: false + default: false + type: boolean +{% endconfiguration %} ```yaml litejet: @@ -64,5 +74,4 @@ automation: milliseconds: 1000 held_less_than: milliseconds: 2000 - ... ``` From f17c0f94b265be9c937a86ffd0610bdc0dc2198c Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 23:17:47 +0100 Subject: [PATCH 28/62] Update dlib_face_identity image_processing component configuration (#7222) --- ...age_processing.dlib_face_identify.markdown | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/source/_components/image_processing.dlib_face_identify.markdown b/source/_components/image_processing.dlib_face_identify.markdown index 34690d6b8fd..2a4752914d4 100644 --- a/source/_components/image_processing.dlib_face_identify.markdown +++ b/source/_components/image_processing.dlib_face_identify.markdown @@ -30,13 +30,26 @@ image_processing: Bob: /home/hass/bob.jpg ``` -Configuration variables: - -- **source** array (*Required*): List of image sources. - - **entity_id** (*Required*): A camera entity id to get picture from. - - **name** (*Optional*): This parameter allows you to override the name of your `image_processing` entity. -- **faces** array (*Required*): List of faces sources. +{% configuration %} +source: + description: List of image sources. + required: true + type: list + keys: + entity_id: + description: A camera entity id to get picture from. + required: true + type: string + name: + description: This parameter allows you to override the name of your `image_processing` entity. + required: false + type: string +faces: + description: List of faces sources. + required: true + type: list +{% endconfiguration %}

-If the platform fails to load because it could not install its requirement, install cmake: `sudo apt-get install cmake`. +If the platform fails to load because it could not install its requirement, install cmake: `sudo apt-get install cmake`.

From c943546a62d5afbed0b0fee32a9a8839d0d2153f Mon Sep 17 00:00:00 2001 From: Josh McCarty Date: Mon, 29 Oct 2018 15:19:20 -0700 Subject: [PATCH 29/62] Restore padding around search icon for easier click target (#7102) --- sass/oscailte/base/_navigation.scss | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sass/oscailte/base/_navigation.scss b/sass/oscailte/base/_navigation.scss index 24f68005e6c..720884c5b62 100644 --- a/sass/oscailte/base/_navigation.scss +++ b/sass/oscailte/base/_navigation.scss @@ -81,11 +81,6 @@ header .grid { font-weight: normal; font-size: 14px; line-height: 1; - - &.show-search { - padding-left: 0; - padding-right: 0; - } } .menu > li > a:hover, .menu > li > a:focus{ From 1a38f41c647309d911382a53b4bd353a2711cd16 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 29 Oct 2018 23:23:31 +0100 Subject: [PATCH 30/62] Update Apns notify component configuration (#7239) * Update Apns notify component configuration * Add titles * Fix typos --- source/_components/notify.apns.markdown | 36 ++++++++++++++++++------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/source/_components/notify.apns.markdown b/source/_components/notify.apns.markdown index dcad472dbb1..0396724efec 100644 --- a/source/_components/notify.apns.markdown +++ b/source/_components/notify.apns.markdown @@ -11,11 +11,16 @@ ha_category: Notifications ha_release: 0.31 --- - The `apns` platform uses the Apple Push Notification service (APNS) to deliver notifications from Home Assistant. +## {% linkable_title Setup %} + To use the APNS service you will need an Apple developer account and you will need to create an app to receive push notifications. For more information, see the Apple developer documentation. +## {% linkable_title Configuration %} + +To enable APNS notifications, add the following lines to your `configuration.yaml`: + ```yaml # Example configuration.yaml entry notify: @@ -25,22 +30,35 @@ notify: topic: topic ``` -Configuration variables: - -- **name** (*Required*): The name of the notifier. The notifier will bind to the service `notify.NOTIFIER_NAME`. -- **cert_file** (*Required*): The certificate to use to authenticate with the APNS service. -- **topic** (*Required*): The app bundle ID specified in the certificate. -- **sandbox** (*Optional*): If true notifications will be sent to the sandbox (test) notification service. Default false. +{% configuration %} +name: + description: he name of the notifier. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: true + type: string +cert_file: + description: The certificate to use to authenticate with the APNS service. + required: true + type: string +topic: + description: The app bundle ID specified in the certificate. + required: true + type: string +sandbox: + description: If true notifications will be sent to the sandbox (test) notification service. + required: false + default: false + type: boolean +{% endconfiguration %} The APNS platform will register two services, `notify.NOTIFIER_NAME` and `notify.apns_NOTIFIER_NAME`. -### notify.apns_NOTIFIER_NAME +### {% linkable_title notify.apns_NOTIFIER_NAME %} This service will register device IDs with Home Assistant. In order to receive a notification a device must be registered. The app on the device can use this service to send an ID to Home Assistant during startup, the ID will be stored in `[NOTIFIER_NAME]_apns.yaml`. See `didRegisterForRemoteNotificationsWithDeviceToken` in the [Apple developer documentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:didRegisterForRemoteNotificationsWithDeviceToken:) for more information about how to obtain a device ID. -### notify.NOTIFIER_NAME +### {% linkable_title notify.NOTIFIER_NAME %} This service will send messages to a registered device. The following parameters can be used: From 34ae4be97a07eda533b68e3e1eff89a92f52af2a Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 07:38:31 +0100 Subject: [PATCH 31/62] Update ssh add-on component configuration (#7252) --- source/_addons/ssh.markdown | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/source/_addons/ssh.markdown b/source/_addons/ssh.markdown index 0fa91e88684..ad50f2d3176 100644 --- a/source/_addons/ssh.markdown +++ b/source/_addons/ssh.markdown @@ -22,7 +22,7 @@ This add-on will not enable you to install packages or do anything as root. This To use this add-on, you must have a private/public key to log in. To generate them, follow the [instructions for Windows][win] and [these for other platforms][other]. It is possible to set a password for login since version 2.0 but for high security use private/public keys. You can not run both variants at the same time. -To start this add-on for the first time, you either need to include a key (enclosed in quotation marks, on a single line without line breaks) or set a password in the options section. +To start this add-on for the first time, you either need to include a key (enclosed in quotation marks, on a single line without line breaks) or set a password in the options section. ```json { @@ -37,11 +37,16 @@ The username for login over SSH is `root`. The complete login command is `ssh ro After logging in, you will find yourself in this add-on's container. The Home Assistant configuration directory is mounted on the path `/config`. -Configuration variables: - -- **authorized_keys** (*Optional*): Your public keys for the authorized key file. Every element will be a line inside that file. -- **password** (*Optional*): Set a password for login. We do **NOT** recommend this variant. - +{% configuration %} +authorized_keys: + description: Your public keys for the authorized key file. Every element will be a line inside that file. + required: false + type: string +password: + description: Set a password for login. We do **NOT** recommend this variant. + required: false + type: string +{% endconfiguration %}
From 89ce61e777d088738f37f516d79cb99137031582 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 07:39:21 +0100 Subject: [PATCH 32/62] Update Mqtt_statestream component configuration (#7260) --- source/_components/mqtt_statestream.markdown | 55 +++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/source/_components/mqtt_statestream.markdown b/source/_components/mqtt_statestream.markdown index 8b1afaa89d5..ddf00e0806e 100644 --- a/source/_components/mqtt_statestream.markdown +++ b/source/_components/mqtt_statestream.markdown @@ -27,19 +27,48 @@ mqtt_statestream: publish_timestamps: true ``` -Configuration variables: - -- **base_topic** (*Required*): Base topic used to generate the actual topic used to publish. -- **publish_attributes** (*Optional*): Publish attributes of the entity as well as the state. -Default is false. -- **publish_timestamps** (*Optional*): Publish the last_changed and last_updated timestamps for the entity. -Default is false. -- **exclude** (*Optional*): Configure which components should be excluded from recordings. See *Include/Exclude* section below for details. - - **entities** (*Optional*): The list of entity ids to be excluded from recordings. - - **domains** (*Optional*): The list of domains to be excluded from recordings. -- **include** (*Optional*): Configure which components should be included in recordings. If set, all other entities will not be recorded. - - **entities** (*Optional*): The list of entity ids to be included from recordings. - - **domains** (*Optional*): The list of domains to be included from recordings. +{% configuration %} +base_topic: + description: Base topic used to generate the actual topic used to publish. + required: true + type: string +publish_attributes: + description: Publish attributes of the entity as well as the state. + required: false + default: false + type: boolean +publish_timestamps: + description: Publish the last_changed and last_updated timestamps for the entity. + required: false + default: false + type: boolean +exclude: + description: Configure which components should be excluded from recordings. See *Include/Exclude* section below for details. + required: false + type: list + keys: + entities: + description: The list of entity ids to be excluded from recordings. + required: false + type: list + domains: + description: The list of domains to be excluded from recordings. + required: false + type: list +include: + description: Configure which components should be included in recordings. If set, all other entities will not be recorded. + required: false + type: list + keys: + entities: + description: The list of entity ids to be included from recordings. + required: false + type: list + domains: + description: The list of domains to be included from recordings. + required: false + type: list +{% endconfiguration %} ## Operation From b2e369a701ac7f9f8b863376b49fbf5be34d8f26 Mon Sep 17 00:00:00 2001 From: Josh Cooper Date: Tue, 30 Oct 2018 06:40:46 +0000 Subject: [PATCH 33/62] Change link removing domain. (#7261) Changed link so it is less annoying for dev, through removing the home assistant domain from 'your device' link. --- source/getting-started/index.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/index.markdown b/source/getting-started/index.markdown index bf7b9db549e..4e866386574 100644 --- a/source/getting-started/index.markdown +++ b/source/getting-started/index.markdown @@ -29,7 +29,7 @@ We will need a few things to get started with installing Home Assistant. For bes ### {% linkable_title Software requirements %} -- Download the Hass.io image for [your device](https://www.home-assistant.io/hassio/installation/) +- Download the Hass.io image for [your device](/hassio/installation/) - Download [Etcher] to write the image to an SD card - Text Editor like [Visual Studio Code](https://code.visualstudio.com/) From efcaa6f124be098f6471d5beae88a87f1a058421 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 07:41:39 +0100 Subject: [PATCH 34/62] Update Clicksend_tts notify component configuration (#7259) --- .../_components/notify.clicksend_tts.markdown | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/source/_components/notify.clicksend_tts.markdown b/source/_components/notify.clicksend_tts.markdown index 6009c9e9871..562a6c56ebd 100644 --- a/source/_components/notify.clicksend_tts.markdown +++ b/source/_components/notify.clicksend_tts.markdown @@ -13,7 +13,6 @@ ha_release: 0.55 redirect_from: /components/notify.clicksendaudio/ --- - The `clicksend_tts` platform uses [ClickSend](https://clicksend.com) to deliver text-to-speech (TTS) notifications from Home Assistant. 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`. @@ -29,14 +28,34 @@ notify: recipient: PHONE_NO ``` -Configuration variables: - -* **name** (Optional): Setting the optional parameter name allows multiple notifiers to be created. The default value is `ClickSend`. The notifier will bind to the service notify.NOTIFIER_NAME. -* **username** (Required): Your username. -* **api_key** (Required): Your API Key. -* **recipient** (Required): Your phone number. This is where you want to send your notification SMS messages (e.g., `09171234567`) -* **language** (Optional): The language you want to use to convert the message to audio. Accepted values are found in the [ClickSend Documentation](http://docs.clicksend.apiary.io/#reference/voice/voice-languages). Default value is `en-us`. -* **voice** (Optional): The voice that needs to be used to play the message to the recipient. Allowed values are `female` or `male`. Default value is `female`. +{% 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: ClickSend + type: string +username: + description: Your username. + required: true + type: string +api_key: + description: Your API Key. + required: true + type: string +recipient: + description: Your phone number. This is where you want to send your notification SMS messages (e.g., `09171234567`). + required: true + type: string +language: + description: The language you want to use to convert the message to audio. Accepted values are found in the [ClickSend Documentation](http://docs.clicksend.apiary.io/#reference/voice/voice-languages). + required: false + default: en-us + type: string +voice: + description: The voice that needs to be used to play the message to the recipient. Allowed values are `female` or `male`. + required: false + default: female + type: string +{% endconfiguration %} To use notifications, please see the [getting started with automation page](/getting-started/automation/). - From 7f0d8427b1cffe7ed06ff7e1bff10d25e7c70f32 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 07:42:24 +0100 Subject: [PATCH 35/62] Update Aws_sns notify component configuration (#7258) --- source/_components/notify.aws_sns.markdown | 31 +++++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/source/_components/notify.aws_sns.markdown b/source/_components/notify.aws_sns.markdown index 2903fbfcaa5..d53d9dd5147 100644 --- a/source/_components/notify.aws_sns.markdown +++ b/source/_components/notify.aws_sns.markdown @@ -32,13 +32,30 @@ notify: region_name: 'us-east-1' ``` -Configuration variables: - -- **aws_access_key_id** (*Required if aws_secret_access_key is provided*): Your AWS Access Key ID. If provided, you must also provide an `aws_secret_access_key` and must **not** provide a `profile_name`. -- **aws_secret_access_key** (*Required if aws_access_key_id is provided*): Your AWS Secret Access Key. 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. -- **region_name** (*Required*): The region identifier to connect to. The default is `us-east-1`. -- **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`. +{% configuration %} +aws_access_key_id: + description: Your AWS Access Key ID. If provided, you must also provide an `aws_secret_access_key` and must **not** provide a `profile_name`. + required: Required if aws_secret_access_key is provided + type: string +aws_secret_access_key: + description: Your AWS Secret Access Key. If provided, you must also provide an `aws_access_key_id` and must **not** provide a `profile_name`. + required: Required if aws_access_key_id is provided + type: string +profile_name: + description: A credentials profile name. + required: false + type: string +region_name: + description: The region identifier to connect to. + required: true + default: us-east-1 + type: string +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 +{% endconfiguration %} ### {% linkable_title Usage %} From 2f4c899380e72106a2cb843846657dafe5d8ba73 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 29 Oct 2018 19:23:57 +0100 Subject: [PATCH 36/62] Release 0.81.2 --- _config.yml | 2 +- source/_posts/2018-10-29-release-81.markdown | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index ca5fd6f7ee1..95f1bfcaf68 100644 --- a/_config.yml +++ b/_config.yml @@ -148,7 +148,7 @@ date_released: 2018-10-28 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. # Major release: -patch_version_notes: "#release-0811---october-28" +patch_version_notes: "#release-0812---october-29" # Minor release (Example #release-0431---april-25): # Date we moved to Discourse for comments diff --git a/source/_posts/2018-10-29-release-81.markdown b/source/_posts/2018-10-29-release-81.markdown index 1f40a74e6d7..9ff9ff6b7c5 100644 --- a/source/_posts/2018-10-29-release-81.markdown +++ b/source/_posts/2018-10-29-release-81.markdown @@ -78,6 +78,22 @@ Other things to be aware of: [openuv docs]: /components/openuv/ [twilio docs]: /components/twilio/ +## {% linkable_title Release 0.81.2 - October 29 %} + +- Fix controller not being stored when setup fails and sequentially fails the retry functionality ([@Kane610] - [#17927]) ([unifi docs]) +- Pass hass_config to load_platform ([@balloob] - [#17952]) +- Update requests to 2.20.0 ([@balloob] - [#17978]) +- Don't use keyset ([@balloob] - [#17984]) ([cloud docs]) + +[#17927]: https://github.com/home-assistant/home-assistant/pull/17927 +[#17952]: https://github.com/home-assistant/home-assistant/pull/17952 +[#17978]: https://github.com/home-assistant/home-assistant/pull/17978 +[#17984]: https://github.com/home-assistant/home-assistant/pull/17984 +[@Kane610]: https://github.com/Kane610 +[@balloob]: https://github.com/balloob +[cloud docs]: /components/cloud/ +[unifi docs]: /components/unifi/ + ## {% 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 5e894a3d5fa120e4ab47e381b6b98f76f427e040 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 30 Oct 2018 09:33:20 +0100 Subject: [PATCH 37/62] Update version --- _config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 95f1bfcaf68..387d78ae846 100644 --- a/_config.yml +++ b/_config.yml @@ -142,8 +142,8 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 81 -current_patch_version: 1 -date_released: 2018-10-28 +current_patch_version: 2 +date_released: 2018-10-29 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. From 8b88db7ba2d95aaacfa7dc99be0f875f7450e063 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 30 Oct 2018 06:02:33 -0400 Subject: [PATCH 38/62] Add timeline chart to explain sun conditions (#7262) --- source/_docs/scripts/conditions.markdown | 4 + .../docs/scripts/sun-conditions-source.ods | Bin 0 -> 30427 bytes source/images/docs/scripts/sun-conditions.svg | 74 ++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 source/images/docs/scripts/sun-conditions-source.ods create mode 100644 source/images/docs/scripts/sun-conditions.svg diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index d7c77e06cf9..43da6d2e1a4 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -139,6 +139,10 @@ condition: before: sunrise ``` +A visual timeline is provided below showing an example of when these conditions will be true. In this chart, sunrise is at 6:00, and sunset is at 18:00 (6:00 PM). The green areas of the chart indicate when the specified conditions will be true. + +Graphic showing an example of sun conditions + ### {% linkable_title Template condition %} The template condition will test if the [given template][template] renders a value equal to true. This is achieved by having the template result in a true boolean expression or by having the template render 'true'. diff --git a/source/images/docs/scripts/sun-conditions-source.ods b/source/images/docs/scripts/sun-conditions-source.ods new file mode 100644 index 0000000000000000000000000000000000000000..444793e1a77dc242483f50e4aba75e444322a8ab GIT binary patch literal 30427 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00:00 + 06:00 + 12:00 + 18:00 + 00:00 + + + + + + + + + Before Sunrise + Before Sunrise +1:00:00 + After Sunrise + After Sunrise +1:00:00 + Before Sunset + Before Sunset +1:00:00 + After Sunset + After Sunset +1:00:00 + + AAAAAAAAAAAAAAAAAAAAAAA + \ No newline at end of file From d011a108c2f13017004b9f5cf98c42135f61643f Mon Sep 17 00:00:00 2001 From: Josh Cooper Date: Tue, 30 Oct 2018 15:30:48 +0000 Subject: [PATCH 39/62] OVA hide away (#7227) * OVA hide away Reorder list, so OVA is below VMDK, and state that it is not available and that user can read on. * Minor change * Remove space --- source/hassio/installation.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/hassio/installation.markdown b/source/hassio/installation.markdown index ce98c781af6..9fa3c528910 100644 --- a/source/hassio/installation.markdown +++ b/source/hassio/installation.markdown @@ -26,8 +26,8 @@ The following will take you through the steps required to install Hass.io. - As a virtual appliance: - - [OVA][Virtual Appliance] - [VMDK][vmdk] + - [OVA][Virtual Appliance] (not available at this time!) 2. Install Hass.io: From 5a381531c8d8097a2352de1ce04343b5301d3fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Tue, 30 Oct 2018 19:49:52 +0200 Subject: [PATCH 40/62] Samsung TV model list updates (#7277) * Sort model lists alphabetically * Add UE46D7000 to list of supported models --- .../media_player.samsungtv.markdown | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/source/_components/media_player.samsungtv.markdown b/source/_components/media_player.samsungtv.markdown index 160b26b83b7..bbf784004f8 100644 --- a/source/_components/media_player.samsungtv.markdown +++ b/source/_components/media_player.samsungtv.markdown @@ -59,52 +59,53 @@ Currently known supported models: - C7700 - D5500 +- D6300SF - D6500 +- D6505 - D7000 - D8000 +- EH5300 +- EH5600 - ES5500 - ES6800 - F6300 -- F6500 -- EH5300 -- EH5600 -- F6400AF - F6400 +- F6400AF +- F6500 - F8000BF -- D6505 -- D6300SF -- U6000 (port must be set to 8001) -- U6300 (port must be set to 8001, and `pip3 install websocket-client` must be executed) - K5579 (port must be set to 8001, On/Off, Forward/Backward, Volume control, but no Play button) +- K5600AK (partially supported, turn on works but state is not updated) - K6500AF (port must be set to 8001) - KS7005 (port must be set to 8001, and `pip3 install websocket-client` must be executed, MAC address must be provided, On/Off, Volume are OK, no channel change) +- KS7502 (port must be set to 8001, and `pip3 install websocket-client` must be executed, turn on doesn't work, turn off works fine) - KS8000 (port must be set to 8001, and `pip3 install websocket-client` must be executed) - KS8005 (port must be set to 8001, and `pip3 install websocket-client` must be executed) - KU6020 (port must be set to 8001, and `pip3 install websocket-client` must be executed) - KU6100 (port must be set to 8001, and `pip3 install websocket-client` must be executed) - KU6290 (port must be set to 8001) - KU7000 (port must be set to 8001) -- NU8000 -- MU6170UXZG (port must be set to 8001, and `pip3 install websocket-client` must be executed) -- KS7502 (port must be set to 8001, and `pip3 install websocket-client` must be executed, turn on doesn't work, turn off works fine) -- K5600AK (partially supported, turn on works but state is not updated) - M5620 (port must be set to 8001, and `pip3 install websocket-client` must be executed) -- UE65KS8005 (port must be set to 8001, On/Off, Forward/Backward, Volume are OK, but no Play button) -- UE6199UXZG (port must be set to 8001, On/Off, Forward/Backward, Volume control, but no Play button) -- Q7F (port must be set to 8001, MAC must be specified for Power On) -- UE40KU6400U (port must be set to 8001, and `pip3 install websocket-client` must be executed) +- MU6170UXZG (port must be set to 8001, and `pip3 install websocket-client` must be executed) - NU7400 (port set to 8001 and `pip3 install websocket-client` executed) +- NU8000 +- Q7F (port must be set to 8001, MAC must be specified for Power On) +- U6000 (port must be set to 8001) +- U6300 (port must be set to 8001, and `pip3 install websocket-client` must be executed) +- UE40KU6400U (port must be set to 8001, and `pip3 install websocket-client` must be executed) +- UE46D7000 +- UE6199UXZG (port must be set to 8001, On/Off, Forward/Backward, Volume control, but no Play button) +- UE65KS8005 (port must be set to 8001, On/Off, Forward/Backward, Volume are OK, but no Play button) Currently tested but not working models: - J5200 - Unable to see state and unable to control - J5500 - State is always "on" and unable to control (but port 8001 *is* open) - J6300 - State is always "on" and unable to control (but port 8001 *is* open) -- JU7000 - Unable to see state and unable to control (but port 8001 *is* open) -- JU7500 - Unable to see state and unable to control - JS8005 - State tracking working but unable to control (but port 8001 *is* open) - JS9000 - State is always "on" and unable to control (but port 8001 *is* open) - JS9500 - State is always "on" and unable to control (but port 8001 *is* open) +- JU7000 - Unable to see state and unable to control (but port 8001 *is* open) +- JU7500 - Unable to see state and unable to control - MU6300 - Port set to 8001, `pip3 install websocket-client` must be executed, turning on works, status not working reliably, turning off is not permanent (it comes back on) None of the 2014 (H) and 2015 (J) model series (e.g., J5200) will work, From e99d0a1335e0d908f448b10b4dd6725d3f9f3124 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 18:56:44 +0100 Subject: [PATCH 41/62] Update Mvglive sensor component configuration (#7276) * Update Mvglive sensor component configuration * :ambulance: Fix error --- source/_components/sensor.mvglive.markdown | 47 +++++++++++++++++----- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/source/_components/sensor.mvglive.markdown b/source/_components/sensor.mvglive.markdown index 75306f563ff..c190359f53c 100644 --- a/source/_components/sensor.mvglive.markdown +++ b/source/_components/sensor.mvglive.markdown @@ -27,16 +27,43 @@ sensor: - station: STATION_OR_STOP_NAME ``` -Configuration variables: - - - **station** (*Required*): Name of the stop or station. Visit [the MVG live web site](http://www.mvg-live.de) to find valid names. - - **destinations** (*Optional*): One or multiple final stop names, e.g., 'Feldmoching' or ['Feldmoching','Harthof']. This can be used to only consider a particular direction of travel - - **directions** (*Optional*): Filter by direction of the departure. For Tram, Bus, SEV, and S-Bahn, direction = direction. For U-Bahn trains, directions are more general. For U1, U2, U3 and U6, direction='1' indicates south-bound trains, direction='2' indicates northbound trains. For U4 and U5, direction='1' indicates east-bound trains, direction='2' indicates west-bound trains. For example, setting directions: '1' can be used to get all south-bound trains at Scheidplatz. - - **lines** (*Optional*): One or more line numbers, e.g., 'U2' or ['U2','U8','N41'] - - **products** (*Optional*): One or more modes of transport, defaults to all 4 modes ['U-Bahn', 'Tram', 'Bus', 'S-Bahn']. - - **timeoffset** (*Optional*): Do not display departures leaving sooner than this number of minutes (defaults to 0). Useful if you are a couple of minutes away from the stop. - - **number** (*Optional*): Store a list of departures in the attribute "departures", defaults to 1. If you set this parameter to 3, the next three departures will be stored. - - **name** (*Optional*): You can customize the name of the sensor, which defaults to the station name. +{% configuration %} +station: + description: Name of the stop or station. Visit [the MVG live web site](http://www.mvg-live.de) to find valid names. + required: true + type: string +destinations: + description: One or multiple final stop names, e.g., 'Feldmoching' or ['Feldmoching','Harthof']. This can be used to only consider a particular direction of travel. + required: false + type: list +directions: + description: "Filter by direction of the departure. For Tram, Bus, SEV, and S-Bahn, direction = direction. For U-Bahn trains, directions are more general. For U1, U2, U3 and U6, direction='1' indicates south-bound trains, direction='2' indicates northbound trains. For U4 and U5, direction='1' indicates east-bound trains, direction='2' indicates west-bound trains. For example, setting directions: '1' can be used to get all south-bound trains at Scheidplatz." + required: false + type: list +lines: + description: One or more line numbers, e.g., 'U2' or ['U2','U8','N41']. + required: false + type: list +products: + description: One or more modes of transport. + required: false + default: all 4 modes ['U-Bahn', 'Tram', 'Bus', 'S-Bahn'] + type: list +timeoffset: + description: Do not display departures leaving sooner than this number of minutes. Useful if you are a couple of minutes away from the stop. + required: false + default: 0 + type: integer +number: + description: Store a list of departures in the attribute "departures". If you set this parameter to 3, the next three departures will be stored. + required: false + default: 1 + type: integer +name: + description: You can customize the name of the sensor, which defaults to the station name. + required: false + type: string +{% endconfiguration %} ## {% linkable_title Examples %} From 004a19b380642922854dfeabad45fb47b93ef41f Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 19:00:43 +0100 Subject: [PATCH 42/62] Update Basic component configuration (#7275) * Update Basic component configuration * :ambulance: Fix error --- source/_docs/configuration/basic.markdown | 54 ++++++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/source/_docs/configuration/basic.markdown b/source/_docs/configuration/basic.markdown index f862052b3cf..82910cb4161 100644 --- a/source/_docs/configuration/basic.markdown +++ b/source/_docs/configuration/basic.markdown @@ -25,15 +25,45 @@ homeassistant: - /tmp ``` -Configuration variables: - -- **latitude** (*Optional*): Latitude of your location required to calculate the time the sun rises and sets. -- **longitude** (*Optional*): Longitude of your location required to calculate the time the sun rises and sets. -- **elevation** (*Optional*): Altitude above sea level in meters. Impacts weather/sunrise data. -- **unit_system** (*Optional*): `metric` for Metric, `imperial` for Imperial. -- **time_zone** (*Optional*): 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) -- **name** (*Optional*): Name of the location where Home Assistant is running. -- **customize** (*Optional*): [Customize](/docs/configuration/customizing-devices/) entities. -- **customize_domain** (*Optional*): [Customize](/docs/configuration/customizing-devices/) all entities in a domain. -- **customize_glob** (*Optional*): [Customize](/docs/configuration/customizing-devices/) entities matching a pattern. -- **whitelist_external_dirs** (*Optional*): List of folders that can be used as sources for sending files. \ No newline at end of file +{% configuration %} +latitude: + description: Latitude of your location required to calculate the time the sun rises and sets. + required: false + type: float +longitude: + description: Longitude of your location required to calculate the time the sun rises and sets. + required: false + type: float +elevation: + description: Altitude above sea level in meters. Impacts weather/sunrise data. + required: false + type: integer +unit_system: + description: "`metric` for Metric, `imperial` for Imperial." + 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)" + required: false + type: string +name: + description: Name of the location where Home Assistant is running. + required: false + type: string +customize: + description: "[Customize](/docs/configuration/customizing-devices/) entities." + required: false + type: string +customize_domain: + description: "[Customize](/docs/configuration/customizing-devices/) all entities in a domain." + required: false + type: string +customize_glob: + description: "[Customize](/docs/configuration/customizing-devices/) entities matching a pattern." + required: false + type: string +whitelist_external_dirs: + description: List of folders that can be used as sources for sending files. + required: false + type: list +{% endconfiguration %} From fe852b9e93155609c704e55c83ccaf124756879d Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 19:13:48 +0100 Subject: [PATCH 43/62] Update Multi-factor-auth component configuration (#7270) --- .../authentication/multi-factor-auth.markdown | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown index 72d95ad9376..be55b3118ce 100644 --- a/source/_docs/authentication/multi-factor-auth.markdown +++ b/source/_docs/authentication/multi-factor-auth.markdown @@ -77,11 +77,20 @@ homeassistant: - type: notify ``` -Optional configuration variables: - -- **exclude** (*Optional*): The list of notifying services you do not want to include. -- **include** (*Optional*): The list of notifying services you want to include. -- **message** (*Optional*): The message template. +{% configuration %} +exclude: + description: The list of notifying services you want to exclude. + required: false + type: list +include: + description: The list of notifying services you want to include. + required: false + type: list +message: + description: The message template. + required: false + type: template +{% endconfiguration %} ```yaml # Example configuration, with a message template. From b4cc0b361a9073355bc1cee0923191815d789376 Mon Sep 17 00:00:00 2001 From: emontnemery Date: Tue, 30 Oct 2018 19:16:43 +0100 Subject: [PATCH 44/62] Fix link to sun triggers, add link to sun conditions (#7268) --- source/_components/sun.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_components/sun.markdown b/source/_components/sun.markdown index d56854b01b2..cc2f933d70b 100644 --- a/source/_components/sun.markdown +++ b/source/_components/sun.markdown @@ -14,7 +14,10 @@ ha_qa_scale: internal The sun component will use your current location to track if the sun is above or below the horizon. The sun can be used within automation as -[a trigger with an optional offset to simulate dawn/dusk](/getting-started/automation-trigger/#sun-trigger). +[a trigger with an optional offset to simulate dawn/dusk][sun_trigger] or as [a condition with an optional offset to test if the sun has already set or risen][sun_condition]. + +[sun_trigger]: /docs/automation/trigger/#sun-trigger +[sun_condition]: /docs/scripts/conditions/#sun-condition ```yaml # Example configuration.yaml entry From f1f14f7ea6762cfab734ca0b758dfb631283bcdb Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 19:17:51 +0100 Subject: [PATCH 45/62] Update Panasonic_viera media_player component configuration (#7257) --- .../media_player.panasonic_viera.markdown | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/source/_components/media_player.panasonic_viera.markdown b/source/_components/media_player.panasonic_viera.markdown index a0ae8610a30..4da75316fb5 100644 --- a/source/_components/media_player.panasonic_viera.markdown +++ b/source/_components/media_player.panasonic_viera.markdown @@ -44,12 +44,26 @@ media_player: host: 192.168.0.10 ``` -Configuration variables: - -- **host** (*Required*): The IP of the Panasonic Viera TV, e.g., `192.168.0.10`. -- **port** (*Optional*): The port number of your Panasonic Viera TV. Defaults to `55000`. -- **mac** (*Optional*): The MAC address of your Panasonic Viera TV, e.g., `AA:BB:CC:DD:99:1A`. -- **name** (*Optional*): The name you would like to give to the Panasonic Viera TV. +{% configuration %} +host: + description: The IP of the Panasonic Viera TV, e.g., `192.168.0.10`. + required: true + type: string +port: + description: The port number of your Panasonic Viera TV. + required: false + default: 55000 + type: integer +mac: + description: The MAC address of your Panasonic Viera TV, e.g., `AA:BB:CC:DD:99:1A`. + required: false + type: string +name: + description: The name you would like to give to the Panasonic Viera TV. + required: false + default: Panasonic Viera TV + type: string +{% endconfiguration %} ### {% linkable_title Example `play_media` script %} From 2092dd0067986dc1cf011705fd02f39462322d4c Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 19:19:46 +0100 Subject: [PATCH 46/62] Update command_line cover component configuration (#7256) --- .../_components/cover.command_line.markdown | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/source/_components/cover.command_line.markdown b/source/_components/cover.command_line.markdown index b91c4a645ba..d72862e0af5 100644 --- a/source/_components/cover.command_line.markdown +++ b/source/_components/cover.command_line.markdown @@ -28,16 +28,46 @@ cover: command_stop: move_command stop garage ``` -Configuration variables: - -- **covers** (*Required*): The array that contains all command line covers. - - **identifier** (*Required*): Name of the command line cover as slug. Multiple entries are possible. - - **command_open** (*Required*): The command to open the cover. - - **command_close** (*Required*): The action to close the cover. - - **command_stop** (*Required*): The action to stop the cover. - - **command_state** (*Optional*): If given, this will act as a sensor that runs in the background and updates the state of the cover. If the command returns a `0` the indicates the cover is fully closed, whereas a 100 indicates the cover is fully open. - - **value_template** (*optional - default: '{% raw %}{{ value }}{% endraw%}'*): if specified, `command_state` will ignore the result code of the command but the template evaluating will indicate the position of the cover. For example, if your `command_state` returns a string "open", using `value_template` as in the example config above will allow you to translate that into the valid state `100`. - - **friendly_name** (*Optional*): The name used to display the cover in the frontend. +{% configuration %} +covers: + description: The array that contains all command line covers. + required: true + type: list + keys: + identifier: + description: Name of the command line cover as slug. Multiple entries are possible. + required: true + type: list + keys: + command_open: + description: The command to open the cover. + required: true + default: true + type: string + command_close: + description: The action to close the cover. + required: true + default: true + type: string + command_stop: + description: The action to stop the cover. + required: true + default: true + type: string + command_state: + description: If given, this will act as a sensor that runs in the background and updates the state of the cover. If the command returns a `0` the indicates the cover is fully closed, whereas a 100 indicates the cover is fully open. + required: false + type: string + value_template: + description: if specified, `command_state` will ignore the result code of the command but the template evaluating will indicate the position of the cover. For example, if your `command_state` returns a string "open", using `value_template` as in the example config above will allow you to translate that into the valid state `100`. + required: false + default: "'{% raw %}{{ value }}{% endraw%}'" + type: template + friendly_name: + description: The name used to display the cover in the frontend. + required: false + type: string +{% endconfiguration %} ## {% linkable_title Examples %} From 1daa7a2ff3d885390eef2bec134557ea3bbe2777 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 21:09:54 +0100 Subject: [PATCH 47/62] Update Mqtt_room sensor component configuration (#7278) * Update Mqtt_room sensor component configuration * :ambulance: Fix error * Fix typo --- source/_components/sensor.mqtt_room.markdown | 34 +++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/source/_components/sensor.mqtt_room.markdown b/source/_components/sensor.mqtt_room.markdown index 96aaa9dc7da..e0c19fcfce3 100644 --- a/source/_components/sensor.mqtt_room.markdown +++ b/source/_components/sensor.mqtt_room.markdown @@ -13,7 +13,6 @@ ha_release: 0.27 ha_iot_class: depends --- - The `mqtt_room` sensor platform allows you to detect the indoor location of devices using MQTT clients. ## {% linkable_title Configuration %} @@ -31,13 +30,32 @@ sensor: away_timeout: 60 ``` -Configuration variables: - -- **device_id** (*Required*): The device id to track for this sensor. -- **name** (*Optional*): The name of the sensor. -- **state_topic** (*Optional*): The topic that contains all subtopics for the rooms. -- **timeout** (*Optional*): The time in seconds after which a room presence state is considered old. An example: device1 is reported at scanner1 with a distance of 1. No further updates are sent from scanner1. After 5 seconds scanner2 reports device1 with a distance of 2. The old location info is discarded in favor of the new scanner2 information as the timeout has passed. -- **away_timeout** (*Optional*): The time in seconds after which the state should be set to `not_home` if there were no updates. `0` disables the check and is the default. +{% configuration %} +device_id: + description: The device id to track for this sensor. + required: true + type: string +name: + description: The name of the sensor. + required: false + default: Room Sensor + type: string +state_topic: + description: The topic that contains all subtopics for the rooms. + required: false + default: room_presence + type: string +timeout: + description: "The time in seconds after which a room presence state is considered old. An example: device1 is reported at scanner1 with a distance of 1. No further updates are sent from scanner1. After 5 seconds scanner2 reports device1 with a distance of 2. The old location info is discarded in favor of the new scanner2 information as the timeout has passed." + required: false + default: 5 + type: integer +away_timeout: + description: The time in seconds after which the state should be set to `not_home` if there were no updates. `0` disables the check. + required: false + default: 0 + type: integer +{% endconfiguration %} Example JSON that should be published to the room topics: From 683ff6938396acab8f3053c9491fd130d6b33287 Mon Sep 17 00:00:00 2001 From: Alec Rust Date: Tue, 30 Oct 2018 20:11:07 +0000 Subject: [PATCH 48/62] Fix typo (#7282) Fixes typo in the first sentence of "Ping (ICMP) Binary sensor" docs: https://www.home-assistant.io/components/binary_sensor.ping/ --- source/_components/binary_sensor.ping.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/binary_sensor.ping.markdown b/source/_components/binary_sensor.ping.markdown index 0a8d1390908..3121bf86333 100644 --- a/source/_components/binary_sensor.ping.markdown +++ b/source/_components/binary_sensor.ping.markdown @@ -13,7 +13,7 @@ ha_release: 0.43 ha_qa_scale: internal --- -The `ping` binary sensor platform allows you to using `ping` to send ICMP echo requests. This way you can check if a given host is online and determine the round trip times from your Home Assistant instance to that system. +The `ping` binary sensor platform allows you to use `ping` to send ICMP echo requests. This way you can check if a given host is online and determine the round trip times from your Home Assistant instance to that system. ## {% linkable_title Configuration %} From 8040a30a016c1cb86eef4de02720d89c18a790a5 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 21:15:37 +0100 Subject: [PATCH 49/62] Update Discovery component configuration (#7271) --- source/_docs/mqtt/discovery.markdown | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index 3c6a1d9cec4..f4d390e7911 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -33,10 +33,19 @@ mqtt: discovery: true discovery_prefix: homeassistant ``` -Configuration variables: -- **discovery** (*Optional*): If the MQTT discovery should be enabled or not. Defaults to `False`. -- **discovery_prefix** (*Optional*): The prefix for the discovery topic. Defaults to `homeassistant`. +{% configuration %} +discovery: + description: If the MQTT discovery should be enabled or not. + required: false + default: false + type: boolean +discovery_prefix: + description: The prefix for the discovery topic. + required: false + default: homeassistant + type: string +{% endconfiguration %}

The [embedded MQTT broker](/docs/mqtt/broker#embedded-broker) does not save any messages between restarts. If you use the embedded MQTT broker you have to send the MQTT discovery messages after every Home Assistant restart for the devices to show up. From f2d3d90f6b9325a05abad1d99e1e16c090178812 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 30 Oct 2018 21:17:50 +0100 Subject: [PATCH 50/62] Update Gtfs sensor component configuration (#7272) --- source/_components/sensor.gtfs.markdown | 33 ++++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/source/_components/sensor.gtfs.markdown b/source/_components/sensor.gtfs.markdown index 547ff77afb9..2293dfdd685 100644 --- a/source/_components/sensor.gtfs.markdown +++ b/source/_components/sensor.gtfs.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Local Polling" ha_release: 0.17 --- - The `gtfs` sensor will give you the next departure time and associated data from your public transit station/stop. The data comes from your chosen public transit authority and is formatted as [General Transit Feed Specification](https://developers.google.com/transit/gtfs/) data, commonly known as GTFS. You need to find a valid GTFS data set, which you can usually find just by searching the internet. Most public transit authorities have GTFS available somewhere, as Google requires public transit authorities to provide the data if they wish to appear on Google Maps. You may also be able to find data at either [TransitFeeds](http://transitfeeds.com/feeds) or [GTFS Data Exchange](http://www.gtfs-data-exchange.com/). @@ -49,11 +48,27 @@ sensor: data: DATA_SOURCE ``` -Configuration variables: - -- **origin** (*Required*): The stop ID of your origin station. -- **destination** (*Required*): The stop ID of your destination station. -- **data** (*Required*): The name of the ZIP file or folder containing the GTFS data. It must be located inside the `gtfs` folder of your configuration directory. -- **name** (*Optional*): Name to use in the frontend. -- **offset** (*Optional*): A minimum delay to look for. If a departure is in less time than `offset`, it will be ignored. Defaults to `0`. - +{% configuration %} +origin: + description: The stop ID of your origin station. + required: true + type: string +destination: + description: The stop ID of your destination station. + required: true + type: string +data: + description: The name of the ZIP file or folder containing the GTFS data. It must be located inside the `gtfs` folder of your configuration directory. + required: true + type: string +name: + description: Name to use in the frontend. + required: false + default: GTFS Sensor + type: string +offset: + description: A minimum delay to look for. If a departure is in less time than `offset`, it will be ignored. + required: false + default: 0 + type: [integer, time] +{% endconfiguration %} From fa79d9a0fbeba613f6a005892d1834032915a167 Mon Sep 17 00:00:00 2001 From: Peter Golm Date: Thu, 1 Nov 2018 09:05:34 +0100 Subject: [PATCH 51/62] Fix typo (#7297) --- source/_lovelace/entity-button.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_lovelace/entity-button.markdown b/source/_lovelace/entity-button.markdown index 73dbc9e62d7..91377e4436e 100644 --- a/source/_lovelace/entity-button.markdown +++ b/source/_lovelace/entity-button.markdown @@ -71,7 +71,7 @@ Title and Script Service Example: ```yaml - type: entity-button - title: Turn Off Lights + name: Turn Off Lights entity: script.turn_off_lights service: script.turn_on ``` From 1136cb2a2fe2d8b492b8bf9d201f8f63da5c49fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Gil=20Mart=C3=ADnez?= Date: Thu, 1 Nov 2018 09:06:37 +0100 Subject: [PATCH 52/62] Update light.xiaomi_miio.markdown (#6786) --- source/_components/light.xiaomi_miio.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/light.xiaomi_miio.markdown b/source/_components/light.xiaomi_miio.markdown index 79f5a9b36c1..5b9a335f03f 100644 --- a/source/_components/light.xiaomi_miio.markdown +++ b/source/_components/light.xiaomi_miio.markdown @@ -55,7 +55,7 @@ The `xiaomi_miio` platform allows you to control the state of your Xiaomi Philip * Eye fatigue reminder / notification (on, off) * Eyecare mode (on, off) * Attributes - - model + - model (Warning: set this value to philips.light.sread1) - scene - delayed_turn_off - night_light_mode From 0fc2f0da0ae30ab204acd5a181f4336104edf60d Mon Sep 17 00:00:00 2001 From: Markus Nigbur Date: Thu, 1 Nov 2018 09:09:03 +0100 Subject: [PATCH 53/62] Updated example component (#6772) --- .../python_component_automation.markdown | 163 ++++++++++-------- 1 file changed, 87 insertions(+), 76 deletions(-) diff --git a/source/_cookbook/python_component_automation.markdown b/source/_cookbook/python_component_automation.markdown index b098278555c..f04b37ed002 100644 --- a/source/_cookbook/python_component_automation.markdown +++ b/source/_cookbook/python_component_automation.markdown @@ -26,28 +26,33 @@ example: target: TARGET_ENTITY ``` -Configuration variables: - -- **target** (*Required*): TARGET_ENTITY should be one of your devices that can be turned on and off, e.g., a light or a switch. Example value could be light.Ceiling or switch.AC (if you have these devices with those names). +{% configuration %} +target: + description: TARGET_ENTITY should be one of your devices that can be turned on and off, e.g., a light or a switch. Example value could be light.Ceiling or switch.AC (if you have these devices with those names). + required: true + type: string +{% endconfiguration %} Create the file `/custom_components/example.py` and copy paste the content below: - ```python """ Example of a custom component. """ -import time import logging +import time + +import voluptuous as vol -from homeassistant.const import STATE_HOME, STATE_NOT_HOME, STATE_ON, STATE_OFF -from homeassistant.helpers import validate_config -from homeassistant.helpers.event_decorators import \ - track_state_change, track_time_change -from homeassistant.helpers.service import service import homeassistant.components as core -from homeassistant.components import device_tracker -from homeassistant.components import light +import homeassistant.helpers.config_validation as cv +from homeassistant.components import device_tracker, light +from homeassistant.const import (ATTR_ENTITY_ID, SERVICE_TURN_OFF, + SERVICE_TURN_ON, STATE_HOME, STATE_NOT_HOME, + STATE_OFF, STATE_ON) +from homeassistant.core import split_entity_id +from homeassistant.helpers.event import (async_track_state_change, + async_track_time_change) # The domain of your component. Should be equal to the name of your component. DOMAIN = "example" @@ -69,17 +74,20 @@ SERVICE_FLASH = 'flash' # Shortcut for the logger _LOGGER = logging.getLogger(__name__) +# Validate that all required config options are given. +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Optional(CONF_TARGET): cv.entity_id + }) +}, extra=vol.ALLOW_EXTRA) -def setup(hass, config): +async def async_setup(hass, config): """Setup example component.""" - global TARGET_ID - - # Validate that all required config options are given. - if not validate_config(config, {DOMAIN: [CONF_TARGET]}, _LOGGER): - return False - TARGET_ID = config[DOMAIN][CONF_TARGET] + domain = split_entity_id(TARGET_ID)[0] + data = {ATTR_ENTITY_ID: TARGET_ID} + # Validate that the target entity id exists. if hass.states.get(TARGET_ID) is None: _LOGGER.error("Target entity id %s does not exist", @@ -90,70 +98,73 @@ def setup(hass, config): TARGET_ID = None return False - # Tell the bootstrapper that we initialized successfully. - return True + async def async_switch_on(entity_id, old_state, new_state): + """Callback to turn on our target entity""" + # If the target id is not set, return + if not TARGET_ID: + return + if not core.is_on(hass, TARGET_ID): + await hass.services.async_call(domain, SERVICE_TURN_ON, data) -@track_state_change(device_tracker.ENTITY_ID_ALL_DEVICES) -def track_devices(hass, entity_id, old_state, new_state): - """Called when the group.all devices change state.""" - # If the target id is not set, return - if not TARGET_ID: - return + async def async_switch_off(entity_id, old_state, new_state): + """Callback to turn off our target entity""" + # If the target id is not set, return + if not TARGET_ID: + return - # If anyone comes home and the entity is not on, turn it on. - if new_state.state == STATE_HOME and not core.is_on(hass, TARGET_ID): + if core.is_on(hass, TARGET_ID): + await hass.services.async_call(domain, SERVICE_TURN_OFF, data) - core.turn_on(hass, TARGET_ID) + async def async_wake_up(service): + """Turn light on in the morning. + + Turn the light on when called, but only if there are people home + and it is not already on. + """ + if not TARGET_ID: + return + + if device_tracker.is_on(hass) and not core.is_on(hass, TARGET_ID): + _LOGGER.info('People home at 7AM, turning target on') + await hass.services.async_call(domain, SERVICE_TURN_ON, data) + + async def async_flash_service(service): + """Service callback that will toggle the target. + + Set the light to off for 10 seconds if on and vice versa. + """ + if not TARGET_ID: + return + + if core.is_on(hass, TARGET_ID): + # We need this call to run blocking, as we want to wait 10s after it finished + await hass.services.async_call(domain, SERVICE_TURN_OFF, data, blocking=True) + time.sleep(10) + await hass.services.async_call(domain, SERVICE_TURN_ON, data) + else: + await hass.services.async_call(domain, SERVICE_TURN_ON, data, blocking=True) + time.sleep(10) + await hass.services.async_call(domain, SERVICE_TURN_OFF, data) + + # register the example.flash service + hass.services.async_register(DOMAIN, SERVICE_FLASH, async_flash_service) + + # If all lights turn off, turn off. + async_track_state_change( + hass, light.ENTITY_ID_ALL_LIGHTS, async_switch_off, STATE_ON, STATE_OFF) # If all people leave the house and the entity is on, turn it off. - elif new_state.state == STATE_NOT_HOME and core.is_on(hass, TARGET_ID): + async_track_state_change( + hass, device_tracker.ENTITY_ID_ALL_DEVICES, async_switch_off, STATE_HOME, STATE_NOT_HOME) - core.turn_off(hass, TARGET_ID) + # If anyone comes home and the entity is not on, turn it on. + async_track_state_change( + hass, device_tracker.ENTITY_ID_ALL_DEVICES, async_switch_on, STATE_NOT_HOME, STATE_HOME) + # Call wakeup callback at 7 AM + async_track_time_change(hass, async_wake_up, hour=7, minute=00, second=00) -@track_time_change(hour=7, minute=0, second=0) -def wake_up(hass, now): - """Turn light on in the morning. - - Turn the light on at 7 AM if there are people home and it is not already - on. - """ - if not TARGET_ID: - return - - if device_tracker.is_on(hass) and not core.is_on(hass, TARGET_ID): - _LOGGER.info('People home at 7AM, turning it on') - core.turn_on(hass, TARGET_ID) - - -@track_state_change(light.ENTITY_ID_ALL_LIGHTS, STATE_ON, STATE_OFF) -def all_lights_off(hass, entity_id, old_state, new_state): - """If all lights turn off, turn off.""" - if not TARGET_ID: - return - - if core.is_on(hass, TARGET_ID): - _LOGGER.info('All lights have been turned off, turning it off') - core.turn_off(hass, TARGET_ID) - - -@service(DOMAIN, SERVICE_FLASH) -def flash_service(hass, call): - """Service that will toggle the target. - - Set the light to off for 10 seconds if on and vice versa. - """ - if not TARGET_ID: - return - - if core.is_on(hass, TARGET_ID): - core.turn_off(hass, TARGET_ID) - time.sleep(10) - core.turn_on(hass, TARGET_ID) - - else: - core.turn_on(hass, TARGET_ID) - time.sleep(10) - core.turn_off(hass, TARGET_ID) + # Tell the bootstrapper that we initialized successfully. + return True ``` From 8372b3514ba505e6ecd962429aabba2bb8a0b6df Mon Sep 17 00:00:00 2001 From: Adam <22942687+SilvrrGIT@users.noreply.github.com> Date: Thu, 1 Nov 2018 03:14:52 -0500 Subject: [PATCH 54/62] Update to reflect actual implementation (#7301) Activate was changed to Execute awhile back: https://github.com/home-assistant/home-assistant-polymer/pull/1119/commits/f0f0dc3bb244ecfe559798cef4e95f4db5ac30a3 --- source/_components/script.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/script.markdown b/source/_components/script.markdown index fe6dc4dda5f..83dbb31c4f0 100644 --- a/source/_components/script.markdown +++ b/source/_components/script.markdown @@ -116,6 +116,6 @@ script: ### {% linkable_title In the Overview %} -Scripts in the Overview panel will be displayed with an **ACTIVATE** button if the device has no `delay:` or `wait:` statement, and as a toggle switch if it has either of those. +Scripts in the Overview panel will be displayed with an **EXECUTE** button if the device has no `delay:` or `wait:` statement, and as a toggle switch if it has either of those. This is to enable you to stop a running script. From dbef8947042fd44573b56790fbd7316938e9253c Mon Sep 17 00:00:00 2001 From: cgtobi Date: Thu, 1 Nov 2018 09:22:46 +0100 Subject: [PATCH 55/62] Fix category (#7300) There are two water heater categories listed due to different upper case/lower case spelling. --- source/_components/water_heater.wink.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/water_heater.wink.markdown b/source/_components/water_heater.wink.markdown index aa648d350b9..a22084a181f 100644 --- a/source/_components/water_heater.wink.markdown +++ b/source/_components/water_heater.wink.markdown @@ -8,7 +8,7 @@ comments: false sharing: true footer: true logo: wink.png -ha_category: water heater +ha_category: Water heater ha_release: 0.32 ha_iot_class: "Cloud Polling" --- From 71d0d16ba328fa08fd5a33368935d98503699aee Mon Sep 17 00:00:00 2001 From: Zac Date: Thu, 1 Nov 2018 01:23:25 -0700 Subject: [PATCH 56/62] clarify expose_by_defaults in google_assistant (#7292) --- source/_components/google_assistant.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown index 61ffe91ede9..1d16c317c6e 100644 --- a/source/_components/google_assistant.markdown +++ b/source/_components/google_assistant.markdown @@ -129,7 +129,7 @@ api_key: required: false type: string expose_by_default: - description: "Expose devices in all supported domains by default. If set to false, you need to either expose domains or add the expose configuration option to each entity in `entity_config` and set it to true." + description: "Expose devices in all supported domains by default. If set to false, you need to add the expose configuration option to each entity in `entity_config` and set it to true. Setting `exposed_domains` values will _not_ expose those domains if `expose_by_default` is false." required: false default: True type: boolean From 3fb499ae8dd83b9226bc7b8ff50c15e50708159e Mon Sep 17 00:00:00 2001 From: Stuart McCroden Date: Thu, 1 Nov 2018 03:29:45 -0500 Subject: [PATCH 57/62] Update configuration variables style (#7285) Use the new style for configuration variables as described in #6385 for sensor.rainbird.markdown --- source/_components/sensor.rainbird.markdown | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/_components/sensor.rainbird.markdown b/source/_components/sensor.rainbird.markdown index 4c523a82c48..18bd7d944cf 100644 --- a/source/_components/sensor.rainbird.markdown +++ b/source/_components/sensor.rainbird.markdown @@ -27,8 +27,12 @@ sensor: - rainsensor ``` -Configuration variables: - -- **monitored_conditions**: Currently only rainsensor is supported. Returns the sensor level. +{% configuration %} +monitored_conditions: + description: Conditions to be monitored. + keys: + rainsensor: + description: Returns the sensor level. +{% endconfiguration %} Please note that due to the implementation of the API within the LNK Module, there is a concurrency issue. For example, the Rain Bird app will give connection issues (like already a connection active). From 56d48657f87f47a3706d28d3999c7f551e0e6cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Thu, 1 Nov 2018 09:36:03 +0100 Subject: [PATCH 58/62] Documentation for home-assistant/home-assistant-polymer#1848 (#7295) --- source/_lovelace/entity-button.markdown | 5 +++++ source/_lovelace/glance.markdown | 5 +++++ source/_lovelace/picture-elements.markdown | 22 +--------------------- source/_lovelace/picture-entity.markdown | 5 +++++ 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/source/_lovelace/entity-button.markdown b/source/_lovelace/entity-button.markdown index 91377e4436e..f8c6d69bab6 100644 --- a/source/_lovelace/entity-button.markdown +++ b/source/_lovelace/entity-button.markdown @@ -50,6 +50,11 @@ tap_action: description: "Set to `toggle` or `call-service` for direct actions." type: string default: more-info +hold_action: + required: false + description: Action to perform when clicked-and-held (e.g., `more-info`, `toggle`, `call-service`). + type: string + default: none service: required: false description: "For `call-service`, e.g., `media_player.media_play_pause`" diff --git a/source/_lovelace/glance.markdown b/source/_lovelace/glance.markdown index 32611e47f59..93296e6780d 100644 --- a/source/_lovelace/glance.markdown +++ b/source/_lovelace/glance.markdown @@ -72,6 +72,11 @@ tap_action: description: "Set to `toggle` or `call-service` for direct actions." type: string default: more-info +hold_action: + required: false + description: Action to perform when clicked-and-held (e.g., `more-info`, `toggle`, `call-service`). + type: string + default: none service: required: false description: "For `call-service`, e.g., `media_player.media_play_pause`" diff --git a/source/_lovelace/picture-elements.markdown b/source/_lovelace/picture-elements.markdown index 54b60b92285..c16b9c28934 100644 --- a/source/_lovelace/picture-elements.markdown +++ b/source/_lovelace/picture-elements.markdown @@ -91,11 +91,6 @@ service_data: required: false description: The service data to use. type: object -hold_time: - required: false - description: Time in ms for click-and-hold to register. - type: integer - default: 500 style: required: true description: Position and style the element using CSS. @@ -144,11 +139,6 @@ service_data: required: false description: The service data to use. type: object -hold_time: - required: false - description: Time in ms for click-and-hold to register. - type: integer - default: 500 style: required: true description: Position and style the element using CSS. @@ -223,11 +213,6 @@ service_data: required: false description: The service data to use. type: object -hold_time: - required: false - description: Time in ms for click-and-hold to register. - type: integer - default: 500 style: required: true description: Position and style the element using CSS. @@ -268,11 +253,6 @@ service_data: required: false description: The service data to use. type: object -hold_time: - required: false - description: Time in ms for click-and-hold to register. - type: integer - default: 500 image: required: false description: The image to display. @@ -353,7 +333,7 @@ state_filter: ## {% linkable_title How to use click-and-hold %} -If the option `hold_action` is specified, that action will be performed when the entity is clicked and held for a certain time (default 0.5 seconds). +If the option `hold_action` is specified, that action will be performed when the entity is clicked and held for half a second or more. Please note that the `tap_action` and `hold_action` share variables for `navigation_path`, `service` and `service_data`. It is therefore not possible to, e.g., call two different services when clicked and when held. ```yaml diff --git a/source/_lovelace/picture-entity.markdown b/source/_lovelace/picture-entity.markdown index de390f82299..201641d3790 100644 --- a/source/_lovelace/picture-entity.markdown +++ b/source/_lovelace/picture-entity.markdown @@ -61,6 +61,11 @@ tap_action: description: "Set to `toggle` for turning entity on/off." type: string default: more-info +hold_action: + required: false + description: Action to perform when clicked-and-held (e.g., `more-info`, `toggle`). + type: string + default: none {% endconfiguration %} ## {% linkable_title Examples %} From f036b3b9045299c317587439f1e79f3182579950 Mon Sep 17 00:00:00 2001 From: Stuart McCroden Date: Thu, 1 Nov 2018 03:37:03 -0500 Subject: [PATCH 59/62] Update configuration variables style (#7284) Use the new style for configuration variables as described in #6385 for sensor.crimereports.markdown --- .../_components/sensor.crimereports.markdown | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/source/_components/sensor.crimereports.markdown b/source/_components/sensor.crimereports.markdown index e80d504a51f..8637e53c976 100644 --- a/source/_components/sensor.crimereports.markdown +++ b/source/_components/sensor.crimereports.markdown @@ -26,14 +26,32 @@ sensor: radius: ``` -Configuration options for the Crime Reports Sensor: - -- **name** (*Required*): Name the sensor whatever you want. -- **radius** (*Required*): Radius in meters. -- **latitude** (*Optional*): Defaults to your home zone latitude. -- **longitude** (*Optional*): Defaults to your home zone longitude. -- **include** (*Optional*): List of incident types to include. -- **exclude** (*Optional*): List of incident types to exclude. +{% configuration %} +name: + description: Custom name for the sensor. + required: true + type: string +radius: + description: Radius in meters + required: true + type: float +latitude: + description: Latitude for sensor. + required: false + default: Your home zone latitude defined in your configuration. +longitude: + description: Longitude for sensor. + required: false + default: Your home zone longitude defined in your configuration. +include: + description: List of incident types to include. See below for a list of valid incidents. + required: false + type: list +exclude: + description: List of incident types to exclude. See below for a list of valid incidents. + required: false + type: list +{% endconfiguration %} ## {% linkable_title Notes %} From 2766f883341ffb90f489bc08dd15862e5687c711 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Thu, 1 Nov 2018 09:41:01 +0100 Subject: [PATCH 60/62] Samba Add-on: Emphasizes security note (#7294) * Samba: Emphasizes security note * Samba: Updates configuration syntax --- source/_addons/samba.markdown | 83 +++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 14 deletions(-) diff --git a/source/_addons/samba.markdown b/source/_addons/samba.markdown index 42519d3cfed..fe967f6ab28 100644 --- a/source/_addons/samba.markdown +++ b/source/_addons/samba.markdown @@ -12,6 +12,11 @@ featured: true This add-on allows you to set up a [Samba](https://samba.org/) server to access Hass.io folders using Windows network shares. +

+It is strongly recommended to set a username and password. By using guest mode, you expose your configuration and secrets to every user in local network.
+Also be careful when setting up port forwarding for remote access. If you don't restrict access by setting a username and password, your configuration could be exposed to the entire internet! +

+ ```json { "name": "hassio", @@ -35,17 +40,67 @@ This add-on allows you to set up a [Samba](https://samba.org/) server to access } ``` -Configuration variables: - -- **name** (*Optional*): Set netbios name of Hass.io device. Default is `hassio`. -- **workgroup** (*Optional*): Set network workgroup name. Default is `WORKGROUP`. -- **guest** (*Optional*): Allow login without a username or password. Default is `true`. -- **map** (*Optional*): Control which folders will be exposed. `config` shares the Home Assistant configuration folder. `addons` shares the local custom repository. `share` shares a folder that can be accessed by add-ons and Home Assistant. `backup` shares access to snapshot files. `ssl` shares certificate storage. Be careful with the `ssl` option! Defaults are all set to `true`, except for `ssl`. -- **username** (*Optional*): Username for logging in if guest login is not used. -- **password** (*Optional*): Password for `username`. An empty password is not supported. -- **interface** (*Optional*): Interface that will start the share. Normally this is `eth0` for ethernet wired connection and `wlan0` for wireless connection. If you are running on an Intel NUC this could also be `enp3s0` for ethernet or `wlp5s0` for wireless connection. -- **allow_hosts** (*Optional*): The hosts that are allowed to connect to your Samba server. By default it is limited to people within the same local network. - -

-Be careful when setting up port forwarding to the remote access. If you don't restrict access by requiring authentication and guest access is enabled, your configuration could be exposed to the internet! -

+{% configuration %} +name: + description: Set netbios name of Hass.io device. + required: false + default: "`hassio`" + type: string +workgroup: + description: Set network workgroup name. + required: false + default: "`WORKGROUP`" + type: string +guest: + description: Allow login without a username or password. + required: false + default: true + type: boolean +map: + description: Control which folders will be exposed. + required: false + type: map + keys: + config: + description: The Home Assistant configuration folder + required: false + default: true + type: boolean + addons: + description: The local custom addons repository + required: false + default: true + type: boolean + share: + description: The folder that can be accessed by add-ons and Home Assistant + required: false + default: true + type: boolean + backup: + description: Access to snapshot files + required: false + default: true + type: boolean + ssl: + description: Certificate storage (Careful! Sharing is set to `false` by default) + required: false + default: false + type: boolean +username: + description: Username for logging in if guest login is not used. + required: false + type: string +password: + description: Password for `username`. An empty password is not supported. + required: false + type: string +interface: + description: Interface that will start the share. Normally this is `eth0` for ethernet wired connection and `wlan0` for wireless connection. If you are running on an Intel NUC this could also be `enp3s0` for ethernet or `wlp5s0` for wireless connection. + required: false + type: string +allow_hosts: + description: The hosts that are allowed to connect to your Samba server. By default it is limited to people within the same local network. + required: false + default: '`["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]`' + type: list +{% endconfiguration %} From 2edafd99530cbeb9d8f42f3097f72f328274d917 Mon Sep 17 00:00:00 2001 From: Stuart McCroden Date: Thu, 1 Nov 2018 03:50:34 -0500 Subject: [PATCH 61/62] Update Slack Notify configuration variables style (#7283) * Update Slack Notify configuration variables Use the new style for configuration variables description #6385 for notify.slack.markdown * Added type value for config vars in notify.slack * Minor changes --- source/_components/notify.slack.markdown | 29 ++++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/source/_components/notify.slack.markdown b/source/_components/notify.slack.markdown index e3b5911f859..3b978bda146 100644 --- a/source/_components/notify.slack.markdown +++ b/source/_components/notify.slack.markdown @@ -42,13 +42,28 @@ notify: default_channel: '#general' ``` -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 Slack API token to use for sending Slack messages. -- **default_channel** (*Required*): The default channel to post to if no channel is explicitly specified when sending the notification message. A channel can be specified adding a target attribute to the json at the same level as "message" -- **username** (*Optional*): Setting username will allow Home Assistant to post to Slack using the username specified. By default not setting this will post to Slack using the user account or botname that you generated the api_key as. -- **icon** (*Optional*): Use one of the Slack emojis as an Icon for the supplied username. Slack uses the standard emoji sets used [here](http://www.webpagefx.com/tools/emoji-cheat-sheet/). +{% configuration %} +name: + description: Setting this parameter allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + required: false + default: "notify" +api_key: + description: The Slack API token to use for sending Slack messages. + required: true + type: string +default_channel: + description: The default channel to post to if no channel is explicitly specified when sending the notification message. A channel can be specified adding a target attribute to the JSON at the same level as "message". + required: true + type: string +username: + description: Home Assistant will post to Slack using the username specified. + required: false + type: string + default: The user account or botname that you generated the API key as. +icon: + description: Use one of the Slack emojis as an Icon for the supplied username. Slack uses the standard emoji sets used [here](http://www.webpagefx.com/tools/emoji-cheat-sheet/). + required: false +{% endconfiguration %} ### {% linkable_title Slack service data %} From d54499fc21a70f5855913dfaa1899106cda36190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robbert=20M=C3=BCller?= Date: Thu, 1 Nov 2018 11:11:05 +0100 Subject: [PATCH 62/62] Buildtime improvements (#7315) * Remove whitespace generation this removes about 65MB of added whitespace, which didn't need generating * Remove liquid compression. Most of the stripepd whitespace, is already removed in the previous commit. And this removes more then 50% of the build time ( localy ) * Remove unneeded whitespace generation --- .../asides/component_navigation.html | 144 +++++++++--------- source/_layouts/compress.html | 10 -- source/_layouts/default.html | 4 - source/components/index.html | 34 ++--- 4 files changed, 89 insertions(+), 103 deletions(-) delete mode 100644 source/_layouts/compress.html diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html index a165fe95e16..bd64fc7efe3 100644 --- a/source/_includes/asides/component_navigation.html +++ b/source/_includes/asides/component_navigation.html @@ -1,141 +1,141 @@ -{% assign components = site.components | sort_natural: 'title' %} -{% assign github_main_repo = 'https://github.com/home-assistant/home-assistant/blob/master/homeassistant' %} +{%- assign components = site.components | sort_natural: 'title' -%} +{%- assign github_main_repo = 'https://github.com/home-assistant/home-assistant/blob/master/homeassistant' -%}
- {% include edit_github.html %} + {%- include edit_github.html -%}
- {% if page.logo %} + {%- if page.logo -%} - {% endif %} + {%- endif -%}
- {% assign file_parts = page.url | split: '/' | last | split: '.' %} + {%- assign file_parts = page.url | split: '/' | last | split: '.' -%} - {% if file_parts.size == 2 %} - {% assign is_platform = true %} - {% assign imp_name = file_parts[1] %} - {% assign parent_name = file_parts[0] %} - {% assign parent_url = parent_name | prepend: '/components/' | append: '/' %} - {% assign parent_component = components | where: 'url', parent_url | first %} - {% else %} - {% assign is_platform = false %} - {% assign imp_name = file_parts | first %} - {% endif %} + {%- if file_parts.size == 2 -%} + {%- assign is_platform = true -%} + {%- assign imp_name = file_parts[1] -%} + {%- assign parent_name = file_parts[0] -%} + {%- assign parent_url = parent_name | prepend: '/components/' | append: '/' -%} + {%- assign parent_component = components | where: 'url', parent_url | first -%} + {%- else -%} + {%- assign is_platform = false -%} + {%- assign imp_name = file_parts | first -%} + {%- endif -%} - {% if page.ha_iot_class %} + {%- if page.ha_iot_class -%}
IoT class: {{ page.ha_iot_class }}
- {% endif %} + {%- endif -%} - {% if page.ha_qa_scale %} + {%- if page.ha_qa_scale -%} - {% endif %} + {%- endif -%} - {% if page.ha_release %} + {%- if page.ha_release -%}
Introduced in release: {{ page.ha_release }}
- {% endif %} + {%- endif -%} - {% if is_platform %} + {%- if is_platform -%} - {% endif %} + {%- endif -%} - {% if is_platform and parent_name != 'sensor' %} + {%- if is_platform and parent_name != 'sensor' -%} - {% elsif is_platform == false and imp_name != 'ifttt' %} + {%- elsif is_platform == false and imp_name != 'ifttt' -%} - {% assign platforms_found = false %} - {% for component in components %} - {% if component.url != page.url %} - {% assign comp_imp_name = component.url | split: '/' | last | split: '.' | first %} - {% if comp_imp_name == imp_name %} - {% unless platforms_found %} - {% assign platforms_found = true %} + {%- assign platforms_found = false -%} + {%- for component in components -%} + {%- if component.url != page.url -%} + {%- assign comp_imp_name = component.url | split: '/' | last | split: '.' | first -%} + {%- if comp_imp_name == imp_name %} + {%- unless platforms_found -%} + {%- assign platforms_found = true -%}

Platforms

    - {% endunless %} + {%- endunless -%}
  • {{component.title}}
  • - {% endif %} - {% endif %} - {% endfor %} + {% endif -%} + {%- endif -%} + {%- endfor -%} - {% if platforms_found %} + {%- if platforms_found -%}
- {% endif %} + {%- endif -%} - {% endif %} + {%- endif -%} - {% assign related_found = false %} - {% for component in components %} - {% if component.url != page.url %} - {% assign comp_file_parts = component.url | split: '/' | last | split: '.' %} - {% if comp_file_parts.size == 2 %} - {% assign comp_imp_name = comp_file_parts | last %} - {% else %} - {% assign comp_imp_name = comp_file_parts | first %} - {% endif %} + {%- assign related_found = false -%} + {%- for component in components -%} + {%- if component.url != page.url -%} + {%- assign comp_file_parts = component.url | split: '/' | last | split: '.' -%} + {%- if comp_file_parts.size == 2 -%} + {%- assign comp_imp_name = comp_file_parts | last -%} + {%- else -%} + {%- assign comp_imp_name = comp_file_parts | first -%} + {%- endif -%} - {% if comp_imp_name == imp_name %} - {% unless related_found %} - {% assign related_found = true %} + {%- if comp_imp_name == imp_name -%} + {%- unless related_found -%} + {%- assign related_found = true -%}

Related components

    - {% endunless %} + {%- endunless -%}
  • {{component.title}}
  • - {% endif %} - {% endif %} - {% endfor %} + {%- endif -%} + {%- endif -%} + {%- endfor -%} - {% if related_found %} + {%- if related_found -%}
- {% endif %} + {%- endif -%} - {% if page.ha_category %} + {%- if page.ha_category -%}

Category {{page.ha_category}}

    - {% for component in components %} - {% if component.ha_category == page.ha_category %} + {%- for component in components -%} + {%- if component.ha_category == page.ha_category -%}
  • - {% if component.url == page.url %} + {%- if component.url == page.url -%} {{component.title}} - {% else %} + {%- else -%} {{component.title}} - {% endif %} + {%- endif -%}
  • - {% endif %} - {% endfor %} + {%- endif -%} + {%- endfor -%}
- {% endif %} + {%- endif -%}
diff --git a/source/_layouts/compress.html b/source/_layouts/compress.html deleted file mode 100644 index 8248010b4a8..00000000000 --- a/source/_layouts/compress.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -# Jekyll layout that compresses HTML -# v3.0.2 -# http://jch.penibelst.de/ -# © 2014–2015 Anatol Broder -# MIT License ---- - -{% capture _LINE_FEED %} -{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd p rt rp optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "" %}{% endif %}{% unless _pre_before contains "" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ;; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %}
Step Bytes
raw {{ content | size }}{% if _profile_endings %}
endings {{ _profile_endings }}{% endif %}{% if _profile_startings %}
startings {{ _profile_startings }}{% endif %}{% if _profile_comments %}
comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %}
collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %}
clippings {{ _profile_clippings }}{% endif %}
{% endif %}{% endif %} diff --git a/source/_layouts/default.html b/source/_layouts/default.html index ca7e0199c2b..c0d9e9ca067 100644 --- a/source/_layouts/default.html +++ b/source/_layouts/default.html @@ -1,7 +1,3 @@ ---- -layout: compress ---- - {% capture root_url %}{{ site.root | strip_slash }}{% endcapture %}{% include site/head.html %} diff --git a/source/components/index.html b/source/components/index.html index 836e3152dcb..9839cf555ab 100644 --- a/source/components/index.html +++ b/source/components/index.html @@ -40,11 +40,11 @@ Support for these components is provided by the Home Assistant community. Added in {{ added_one_ago_version }} ({{ one_ago_version_components_count }}) Added in {{ added_two_ago_version }} ({{ two_ago_version_components_count }}) -{% for category in categories %} - {% if category and category != 'Other' %} +{%- for category in categories -%} + {%- if category and category != 'Other' -%} {{ category }} ({{ components | where: 'ha_category', category | size }}) - {% endif %} -{% endfor %} + {%- endif -%} +{%- endfor -%} Other
@@ -61,11 +61,11 @@ Support for these components is provided by the Home Assistant community. {% comment %} ## Pages without categories -{% for component in components %} +{%- for component in components -%} {% unless component.ha_category %}

{{ component.title }}

{% endunless %} -{% endfor %} +{%- endfor -%} {% endcomment %} @@ -89,14 +89,14 @@ Support for these components is provided by the Home Assistant community.