From 0ded1ab76f83caf032df6e876e467367e8ca25e6 Mon Sep 17 00:00:00 2001 From: Martin Eberhardt Date: Sat, 21 Oct 2017 16:14:35 +0200 Subject: [PATCH 001/118] Update the list of Danish region on CLA signature page (#3697) --- source/developers/cla_sign.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/developers/cla_sign.html b/source/developers/cla_sign.html index 94965ccd5cb..c16b88be66f 100644 --- a/source/developers/cla_sign.html +++ b/source/developers/cla_sign.html @@ -155,7 +155,7 @@ footer: true s_a[56] = "Camaguey|Ciego de Avila|Cienfuegos|Ciudad de La Habana|Granma|Guantanamo|Holguin|Isla de la Juventud|La Habana|Las Tunas|Matanzas|Pinar del Rio|Sancti Spiritus|Santiago de Cuba|Villa Clara"; s_a[57] = "Famagusta|Kyrenia|Larnaca|Limassol|Nicosia|Paphos"; s_a[58] = "Brnensky|Budejovicky|Jihlavsky|Karlovarsky|Kralovehradecky|Liberecky|Olomoucky|Ostravsky|Pardubicky|Plzensky|Praha|Stredocesky|Ustecky|Zlinsky"; - s_a[59] = "Arhus|Bornholm|Fredericksberg|Frederiksborg|Fyn|Kobenhavn|Kobenhavns|Nordjylland|Ribe|Ringkobing|Roskilde|Sonderjylland|Storstrom|Vejle|Vestsjalland|Viborg"; + s_a[59] = "Nordjylland|Midtjylland|Syddanmark|Hovedstaden|Sjaelland"; s_a[60] = "'Ali Sabih|Dikhil|Djibouti|Obock|Tadjoura"; s_a[61] = "Saint Andrew|Saint David|Saint George|Saint John|Saint Joseph|Saint Luke|Saint Mark|Saint Patrick|Saint Paul|Saint Peter"; s_a[62] = "Azua|Baoruco|Barahona|Dajabon|Distrito Nacional|Duarte|El Seibo|Elias Pina|Espaillat|Hato Mayor|Independencia|La Altagracia|La Romana|La Vega|Maria Trinidad Sanchez|Monsenor Nouel|Monte Cristi|Monte Plata|Pedernales|Peravia|Puerto Plata|Salcedo|Samana|San Cristobal|San Juan|San Pedro de Macoris|Sanchez Ramirez|Santiago|Santiago Rodriguez|Valverde"; @@ -424,7 +424,7 @@ footer: true var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)")); return match && decodeURIComponent(match[1].replace(/\+/g, " ")); } - + $(document).ready(function(){ populateCountries("country", "region"); var spinner = new Spinner().spin(document.getElementById('spinner')); From 3b001c7a12b1c7ff462a77c71786d157f3ad7788 Mon Sep 17 00:00:00 2001 From: Martin Eberhardt Date: Sat, 21 Oct 2017 17:36:46 +0200 Subject: [PATCH 002/118] Documentation for scrape sensor attribute option (#3696) * Documentation for scrape sensor attribute option * Move comment up --- source/_components/sensor.scrape.markdown | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/source/_components/sensor.scrape.markdown b/source/_components/sensor.scrape.markdown index 6f48598d961..85738eeaaa3 100644 --- a/source/_components/sensor.scrape.markdown +++ b/source/_components/sensor.scrape.markdown @@ -30,6 +30,7 @@ Configuration variables: - **resource** (*Required*): The URL to the website that contains the value. - **select** (*Required*): Defines the HTML tag to search for. Check Beautifulsoup's [CSS selectors](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors) for details. +- **attribute** (*optional*): Get value of an attribute on the selected tag. - **name** (*Optional*): Name of the sensor. - **unit_of_measurement** (*Optional*): Defines the units of measurement of the sensor, if any. @@ -67,11 +68,11 @@ sensor: ### {% linkable_title Get a value out of a tag %} -The German [Federal Office for Radiation protection (Bundesamt für Strahlenschutz)](http://www.bfs.de/) is publishing various details about optical radiation including an UV index. This example is getting the index for a region in Germany. +The German [Federal Office for Radiation protection (Bundesamt für Strahlenschutz)](http://www.bfs.de/) is publishing various details about optical radiation including an UV index. This example is getting the index for a region in Germany. ```yaml -sensor: # Example configuration.yaml entry +sensor: - platform: scrape resource: http://www.bfs.de/DE/themen/opt/uv/uv-index/prognose/prognose_node.html name: Coast Ostsee @@ -84,11 +85,24 @@ sensor: If you make heavy use of the [IFTTT](/components/ifttt/) web service for your automations and are curious about the [status of IFTTT](http://status.ifttt.com/) then you can display the current state of IFTTT in your frontend. ```yaml -sensor: # Example configuration.yaml entry +sensor: - platform: scrape resource: http://status.ifttt.com/ name: IFTTT status select: '.component-status' ``` +### {% linkable_title Get the latest podcast episode file URL %} + +If you want to get the file URL for the latest episode of your [favourite podcast](https://hasspodcast.io/), so you can pass it on to a compatible media player. + +```yaml +# Example configuration.yaml entry +sensor: + - platform: scrape + resource: https://hasspodcast.io/feed/podcast + name: Home Assistant Podcast + select: 'enclosure:nth-of-type(1)' + attribute: url +``` From 75c5aaae4020276bb4cb485855dfbb381e8b05f3 Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Sat, 21 Oct 2017 11:37:40 -0400 Subject: [PATCH 003/118] Added Ring Camera component documentation and added new sensors (#3682) * Added Ring Camera component documentation and added new sensors * Kept only the basic as example for the component * Added scan_interval option to camera ring documentation * Rephrased statement --- .../_components/binary_sensor.ring.markdown | 8 ++--- source/_components/camera.ring.markdown | 33 +++++++++++++++++++ source/_components/sensor.ring.markdown | 16 ++++----- 3 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 source/_components/camera.ring.markdown diff --git a/source/_components/binary_sensor.ring.markdown b/source/_components/binary_sensor.ring.markdown index 8a7c204df61..e663d6838cc 100644 --- a/source/_components/binary_sensor.ring.markdown +++ b/source/_components/binary_sensor.ring.markdown @@ -10,6 +10,7 @@ footer: true logo: ring.png ha_category: Binary Sensor ha_release: 0.42 +ha_iot_class: "Cloud Polling" --- To get your [Ring.com](https://ring.com/) binary sensors working within Home Assistant, please follow the instructions for the general [Ring component](/components/ring). @@ -20,15 +21,12 @@ Once you have enabled the [Ring component](/components/ring), add the following # Example configuration.yaml entry binary_sensor: - platform: ring - monitored_conditions: - - ding - - motion ``` Configuration variables: -- **monitored_conditions** array (*Required*): Conditions to display in the frontend. The following conditions can be monitored. +- **monitored_conditions** array (*Optional*): Conditions to display in the frontend. The following conditions can be monitored. If not specified, all conditions below will be enabled. - **ding**: Return a boolean value when the doorbell button was pressed. - **motion**: Return a boolean value when a movement was detected by the Ring doorbell. -Currently only doorbells are supported by this sensor. +Currently it supports doorbell, external chimes and stickup cameras. diff --git a/source/_components/camera.ring.markdown b/source/_components/camera.ring.markdown new file mode 100644 index 00000000000..30d1fab1052 --- /dev/null +++ b/source/_components/camera.ring.markdown @@ -0,0 +1,33 @@ +--- +layout: page +title: "Ring Binary Camera" +description: "Instructions on how to integrate your Ring.com devices within Home Assistant." +date: 2017-10-20 10:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: ring.png +ha_category: Camera +ha_release: 0.57 +ha_iot_class: "Cloud Polling" +--- + +To get your [Ring.com](https://ring.com/) cameras working within Home Assistant, please follow the instructions for the general [Ring component](/components/ring). + +Once you have enabled the [Ring component](/components/ring), add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +camera: + - platform: ring +``` + +Configuration variables: + +- **ffmpeg_arguments**: (*Optional*): Extra options to pass to ffmpeg, e.g., image quality or video filter options. +- **scan_interval**: (*Optional*): How frequently to query for new video. Defaults to 90 seconds. + +**Note:** To be able to playback the last capture, it is required to install the `ffmpeg` component. Make sure to follow the steps mentioned at [FFMPEG](https://home-assistant.io/components/ffmpeg/) documentation. + +Currently it supports doorbell and stickup cameras. diff --git a/source/_components/sensor.ring.markdown b/source/_components/sensor.ring.markdown index 494e803a29e..898a76ffa4c 100644 --- a/source/_components/sensor.ring.markdown +++ b/source/_components/sensor.ring.markdown @@ -21,21 +21,17 @@ Once you have enabled the [Ring component](/components/ring), add the following # Example configuration.yaml entry sensor: - platform: ring - monitored_conditions: - - battery - - last_activity - - last_ding - - last_motion - - volume ``` Configuration variables: -- **monitored_conditions** array (*Required*): Conditions to display in the frontend. The following conditions can be monitored. +- **monitored_conditions** array (*Optional*): Conditions to display in the frontend. The following conditions can be monitored. If not specified, all conditions below will be enabled. - **battery**: Return the battery level from device - - **last_activity**: Return the timestamp from the last event captured (ding/motion/on_demand) by the Ring doorbell camera + - **last_activity**: Return the timestamp from the last event captured (ding/motion/on demand) by the Ring doorbell camera - **last_ding**: Return the timestamp from the last time the Ring doorbell button was pressed - **last_motion**: Return the timestamp from the last motion event captured by the Ring doorbell camera - - **volume**: Return the volume level from the device. Currently supported by external chimes and doorbells. + - **volume**: Return the volume level from the device. + - **wifi_signal_category**: Return the WiFi signal level from the device. + - **wifi_signal_strength**: Return the WiFi signal strength (dBm) from the device. -Currently it supports doorbells and external chimes only. +Currently it supports doorbell, external chimes and stickup cameras. From 42846163ba45fd10eb8f887bbd2b41b07bf70b97 Mon Sep 17 00:00:00 2001 From: cgtobi Date: Sat, 21 Oct 2017 18:48:22 +0200 Subject: [PATCH 004/118] Add support for multiple disks. (#3678) * Add support for multiple disks. * Make disks optional. --- source/_components/sensor.hddtemp.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_components/sensor.hddtemp.markdown b/source/_components/sensor.hddtemp.markdown index 8827856b46c..73c84fd8a19 100644 --- a/source/_components/sensor.hddtemp.markdown +++ b/source/_components/sensor.hddtemp.markdown @@ -26,6 +26,8 @@ To setup a HDDTemp to your installation, add the following to your `configuratio # Example configuration.yaml entry sensor: - platform: hddtemp + disks: + - /dev/sda1 ``` Configuration variables: @@ -33,4 +35,5 @@ Configuration variables: - **name** (*Optional*): Friendly name to use for the frontend. Default to "HD Temperature". - **host** (*Optional*): Host where `hddtemp` is running. Default to `localhost`. - **port** (*Optional*): Port that is used by `hddtemp` . Default to `7634`. +- **disks** (*Optional*): Disk to be monitored. Example: `/dev/sda1` From 8d7c97549e05bb1f07316ab5ecd57e8dd947e0ee Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 21 Oct 2017 22:12:33 +0200 Subject: [PATCH 005/118] Renaming API.AI to Dialogflow (#3699) --- .../{apiai.markdown => dialogflow.markdown} | 46 ++++++++++-------- source/images/supported_brands/apiai.png | Bin 13412 -> 0 bytes source/images/supported_brands/dialogflow.png | Bin 0 -> 13122 bytes 3 files changed, 25 insertions(+), 21 deletions(-) rename source/_components/{apiai.markdown => dialogflow.markdown} (57%) delete mode 100644 source/images/supported_brands/apiai.png create mode 100644 source/images/supported_brands/dialogflow.png diff --git a/source/_components/apiai.markdown b/source/_components/dialogflow.markdown similarity index 57% rename from source/_components/apiai.markdown rename to source/_components/dialogflow.markdown index 4e6d73d024f..45b9634c3c0 100644 --- a/source/_components/apiai.markdown +++ b/source/_components/dialogflow.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "Api.AI" -description: "Instructions how integrate api.ai with Home Assistant." +title: "Dialogflow" +description: "Instructions how integrate Dialogflow with Home Assistant." date: 2017-01-27 11:28 sidebar: true comments: false @@ -10,16 +10,21 @@ footer: true logo: apiai.png ha_category: Voice featured: false -ha_release: 0.38 +ha_release: 0.56 +redirect_from: /components/apiai/ --- -This component is designed to be used with the "webhook" integration in [api.ai][apiai-web]. When a conversation ends with a user, api.ai sends an action and parameters to the webhook. +

+Before 0.56 this component was named `apiai`. +

-api.ai requires a public endpoint (HTTPS recommended), so your Home Assistant should be exposed to the Internet. api.ai will return fallback answers if your server does not answer, or takes too long (more than 5 seconds). +The `dialogflow` component is designed to be used with the [webhook](https://dialogflow.com/docs/fulfillment#webhook) integration of [Dialogflow](https://dialogflow.com/). When a conversation ends with a user, Dialogflow sends an action and parameters to the webhook. -api.ai could be integrated with many popular messaging, virtual assistant and IoT platforms, eg.: Google Assistant (Google Actions), Skype, Messenger. [See here](https://docs.api.ai/docs/integrations) the complete list. +Dialogflow requires a public endpoint (HTTPS recommended), so your Home Assistant should be exposed to the Internet. Dialogflow will return fallback answers if your server does not answer or takes too long (more than 5 seconds). -Using Api.ai will be easy to create conversations like: +Dialogflow could be [integrated](https://dialogflow.com/docs/integrations/) with many popular messaging, virtual assistant and IoT platforms. + +Using Dialogflow will be easy to create conversations like: > User: What is the temperature at home? > @@ -33,40 +38,41 @@ Using Api.ai will be easy to create conversations like: > > Bot: Turning on kitchen light -To use this integration, you should define a conversation (intent) in Api.ai, configure Home Assistant with the speech to return and, optionally, the action to execute. +To use this integration, you should define a conversation (intent) in Dialogflow, configure Home Assistant with the speech to return and, optionally, the action to execute. -### {% linkable_title Configuring your api.ai account %} +### {% linkable_title Configuring your Dialogflow account %} -- [Login][apiai-web] with your Google account. +- [Login](https://console.dialogflow.com/) with your Google account - Click on "Create Agent" -- Select name, language (if you are planning to use it with Google Actions check [here](https://support.google.com/assistant/answer/7108196?hl=en) supported languages) and time zone +- Select name, language (if you are planning to use Google Actions check their [supported languages](https://support.google.com/assistant/answer/7108196?hl=en)) and time zone - Click "Save" - Go to "Fulfillment" (in the left menu) -- Enable Webhook and set your Home Assistant URL with the Api.ai endpoint. Eg.: ``https://myhome.duckdns.org/api/apiai?api_password=HA_PASSWORD`` +- Enable Webhook and set your Home Assistant URL with the Dialogflow endpoint, e.g. `https://myhome.duckdns.org/api/dialogflow?api_password=HA_PASSWORD` - Click "Save" - Create a new intent -- Below "User says" write one phrase that you, the user, will tell Api.ai. Eg.: Which is the temperature at home? +- Below "User says" write one phrase that you, the user, will tell Dialogflow, e.g. `What is the temperature at home?` - In "Action" set some key (this will be the bind with Home Assistant configuration), eg.: GetTemperature - In "Response" set "Cannot connect to Home Assistant or it is taking to long" (fall back response) - At the end of the page, click on "Fulfillment" and check "Use webhook" - Click "Save" - On the top right, where is written "Try it now...", write, or say, the phrase you have previously defined and hit enter -- Api.ai has send a request to your Home Assistant server +- Dialogflow has send a request to your Home Assistant server Take a look to "Integrations", in the left menu, to configure third parties. ### {% linkable_title Configuring Home Assistant %} -When activated, the Alexa component will have Home Assistant's native intent support handle the incoming intents. If you want to run actions based on intents, use the [`intent_script`](/components/intent_script) component. +When activated, the [`alexa` component](/components/alexa/) will have Home Assistant's native intent support handle the incoming intents. If you want to run actions based on intents, use the [`intent_script`](/components/intent_script) component. ## {% linkable_title Examples %} -Download [this zip](https://github.com/home-assistant/home-assistant.github.io/blob/next/source/assets/HomeAssistant_APIAI.zip) and load it in your Api.ai agent (Settings -> Export and Import) for examples intents to use with this configuration: +Download [this zip](https://github.com/home-assistant/home-assistant.github.io/blob/next/source/assets/HomeAssistant_APIAI.zip) and load it in your Dialogflow agent (**Settings** -> **Export and Import**) for examples intents to use with this configuration: +{% raw %} ```yaml -{% raw %}# Example configuration.yaml entry -apiai: +# Example configuration.yaml entry +dialogflow: intent_script: Temperature: @@ -109,8 +115,6 @@ intent_script: {%- endif -%} data_template: entity_id: "switch.light_{{ Room | replace(' ', '_') }}" -{% endraw %} ``` +{% endraw %} -[apiai-web]: https://api.ai/ -[templates]: /topics/templating/ diff --git a/source/images/supported_brands/apiai.png b/source/images/supported_brands/apiai.png deleted file mode 100644 index af7a481a524f48a38d4b7aa372ecb7785759ac6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13412 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 V%&lztGY^EMrlhUdAa4`%e*nQb-hKc8 diff --git a/source/images/supported_brands/dialogflow.png b/source/images/supported_brands/dialogflow.png new file mode 100644 index 0000000000000000000000000000000000000000..8be89e7af993b6252d80bfc2df71b3d1b23cf469 GIT binary patch literal 13122 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%0D)FJ8L}+_cvHVhm*PgGs+N1dsvK+ z4M^G}hNsG>-(9-_4+_nIUWdPx~%U5yKRJ zIhoA)Y0=QK^CrV-?!FVeT(bP%tCB11?elhUW{Um<-!swkQTV|-4OKA{Z&W1zvy5-L w2o7|7fBWPM`Q0l_|9{Jk=YG;H@)+?)gegK4WK^ZAB~9P_f4&3gN&o-= literal 0 HcmV?d00001 From 5f68226a58a68b31bf3a00d7aa8961720733a652 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 22 Oct 2017 00:33:29 +0200 Subject: [PATCH 006/118] Add Toon docs (#3706) --- source/_components/climate.toon.markdown | 18 +++++++++++ source/_components/sensor.toon.markdown | 18 +++++++++++ source/_components/switch.toon.markdown | 18 +++++++++++ source/_components/toon.markdown | 37 +++++++++++++++++++++++ source/images/supported_brands/toon.png | Bin 0 -> 37683 bytes 5 files changed, 91 insertions(+) create mode 100644 source/_components/climate.toon.markdown create mode 100644 source/_components/sensor.toon.markdown create mode 100644 source/_components/switch.toon.markdown create mode 100644 source/_components/toon.markdown create mode 100644 source/images/supported_brands/toon.png diff --git a/source/_components/climate.toon.markdown b/source/_components/climate.toon.markdown new file mode 100644 index 00000000000..78bd06be1ca --- /dev/null +++ b/source/_components/climate.toon.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "Toon" +description: "Instructions how to integrate Toon Climate devices within Home Assistant." +date: 2017-10-21 12:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Climate +ha_release: 0.56 +logo: toon.png +ha_iot_class: "Cloud Polling" +--- + +The `toon` climate platform allows you to interact with your Toon device. + +The requirement is that you have setup the [`toon`](/components/toon/) component. diff --git a/source/_components/sensor.toon.markdown b/source/_components/sensor.toon.markdown new file mode 100644 index 00000000000..54a069b0cc3 --- /dev/null +++ b/source/_components/sensor.toon.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "Toon" +description: "Instructions how to integrate Toon Climate devices within Home Assistant." +date: 2017-10-21 12:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Sensor +ha_release: 0.56 +logo: toon.png +ha_iot_class: "Cloud Polling" +--- + +The `toon` sensor platform allows you to observe your Toon device. + +The requirement is that you have setup the [`toon`](/components/toon/) component. diff --git a/source/_components/switch.toon.markdown b/source/_components/switch.toon.markdown new file mode 100644 index 00000000000..679ce3aa787 --- /dev/null +++ b/source/_components/switch.toon.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "Toon" +description: "Instructions how to integrate Toon Climate devices within Home Assistant." +date: 2017-10-21 12:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Switch +ha_release: 0.56 +logo: toon.png +ha_iot_class: "Cloud Polling" +--- + +The `toon` switch platform allows you to control your Toon device. + +The requirement is that you have setup the [`toon`](/components/toon/) component. diff --git a/source/_components/toon.markdown b/source/_components/toon.markdown new file mode 100644 index 00000000000..02553163255 --- /dev/null +++ b/source/_components/toon.markdown @@ -0,0 +1,37 @@ +--- +layout: page +title: "Toon" +description: "Instructions how to integrate Toon within Home Assistant." +date: 2017-10-21 12:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Hub +ha_release: 0.56 +logo: toon.png +ha_iot_class: "Cloud Polling" +--- + +The `toon` component platform can be used to control your Toon thermostat. This component adds a climate device for your Toon thermostat and sensors for power and gas consumption. The component also auto-detects any smart plugs, solar panels and smoke detectors connected to Toon and adds sensors and switches for them. + +For the `toon` component to work, you'll need an active Toon subscription with Eneco. The component uses your Mijn Eneco credentials to control your thermostat through the [toonopafstand](https://toonopafstand.eneco.nl) website. + +To use your Toon thermostat in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +toon: + username: YOUR_USERNAME + password: YOUR_PASSWORD +``` + +Configuration variables: + +- **username** (*Required*): Username for Mijn Eneco. +- **password** (*Required*): Password for Mijn Eneco. + +Toon is a smart thermostat delivered by the Eneco power company in The Netherlands. It can measure energy consumption (power and gas), but also the amount of energy generated in case solar panels are connected to it. Toon also acts as a z-wave hub for supported Fibaro devices like the wall plug and the smoke detector. This component uses the [toonlib library](https://github.com/costastf/toonlib) by Costas Tyfoxylos that connects to the unofficial API on [https://toonopafstand.eneco.nl](https://toonopafstand.eneco.nl). + +The current version of this component supports setting any of the four built-in programs and setting the temperature manually. It polls the Toon API at 30 second intervals so the status is relatively fresh without overloading the API. + diff --git a/source/images/supported_brands/toon.png b/source/images/supported_brands/toon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0661cad8858567ded831c76786b25779c7a2747 GIT binary patch literal 37683 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 V%;RGSb*caW002ovPDHLkV1mn~h8O?< literal 0 HcmV?d00001 From 22acb5b1a91a3a4b20748bd09cd9cf46293e8be2 Mon Sep 17 00:00:00 2001 From: Uli Date: Sun, 22 Oct 2017 10:38:11 +0200 Subject: [PATCH 007/118] typofix in z-wave docs (#3710) --- source/_docs/z-wave.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/z-wave.markdown b/source/_docs/z-wave.markdown index af094e63b8b..832b6a7bbb0 100644 --- a/source/_docs/z-wave.markdown +++ b/source/_docs/z-wave.markdown @@ -10,7 +10,7 @@ footer: true redirect_from: /getting-started/z-wave/ --- -[Z-Wave](http://www.z-wave.com/) integration for Home Assistant allows you to observe and control connected Z-Wave devices. Z-Wave support requires a [supported Z-Wave USB stick or module](/docs/z-wave/controllers/)) to be plugged into the host. +[Z-Wave](http://www.z-wave.com/) integration for Home Assistant allows you to observe and control connected Z-Wave devices. Z-Wave support requires a [supported Z-Wave USB stick or module](/docs/z-wave/controllers/) to be plugged into the host. There is currently support for climate, covers, lights, locks, sensors, switches, and thermostats. All will be picked up automatically after configuring this platform. From 56678e43e4bd6e178cc6d1a0d2ef8b3ca3de8d54 Mon Sep 17 00:00:00 2001 From: Uli Date: Sun, 22 Oct 2017 10:40:42 +0200 Subject: [PATCH 008/118] fixed dead link to retrieving access token for xiaomi vacuum and switch (#3709) --- source/_components/switch.xiaomi_miio.markdown | 2 +- source/_components/vacuum.xiaomi_miio.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/switch.xiaomi_miio.markdown b/source/_components/switch.xiaomi_miio.markdown index e4375733237..f8d03291d0d 100644 --- a/source/_components/switch.xiaomi_miio.markdown +++ b/source/_components/switch.xiaomi_miio.markdown @@ -17,7 +17,7 @@ The `xiaomi_miio` switch platform allows you to control the state of your Xiaomi Currently, the supported features are `on`, `off`. If the device provides the current load, it will be reported. -Please follow the instructions on [Retrieving the Access Token](/components/vacuum.xiaomi/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. +Please follow the instructions on [Retrieving the Access Token](/components/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. To add a plug to your installation, add the following to your `configuration.yaml` file: diff --git a/source/_components/vacuum.xiaomi_miio.markdown b/source/_components/vacuum.xiaomi_miio.markdown index 17f608a4e75..884d840339f 100644 --- a/source/_components/vacuum.xiaomi_miio.markdown +++ b/source/_components/vacuum.xiaomi_miio.markdown @@ -28,7 +28,7 @@ Currently supported features are: - `set_fanspeed` - remote control of your robot. -Please follow [Retrieving the Access Token](/components/vacuum.xiaomi/#retrieving-the-access-token) to retrieve the API token used in +Please follow [Retrieving the Access Token](/components/vacuum.xiaomi_miio/#retrieving-the-access-token) to retrieve the API token used in `configuration.yaml`. ## {% linkable_title Configuring the Platform %} From a789821b69db2375d54bf5795686fa33ea3076ac Mon Sep 17 00:00:00 2001 From: Klaas Hoekema Date: Sun, 22 Oct 2017 11:29:59 -0400 Subject: [PATCH 009/118] Update description of default EmonCMS sensor names (#3708) Revises the section on default names to match the changes I'm proposing to use the feed names defined in EmonCMS if available. --- source/_components/sensor.emoncms.markdown | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.emoncms.markdown b/source/_components/sensor.emoncms.markdown index cf11b14dd50..3fb5f1aeab7 100644 --- a/source/_components/sensor.emoncms.markdown +++ b/source/_components/sensor.emoncms.markdown @@ -41,7 +41,11 @@ sensor: ## {% linkable_title Default naming scheme %} -The names of the sensors created by this component, will be a combination of static text, `id` from the config and `feedid` from the Emoncms feed, unless `sensor_names` is used. An example name would be `emoncms1_feedid_10`. +The names of the sensors created by this component will use the feed names defined in EmonCMS if available, +or the feed ID otherwise, and will be prefixed with "EmonCMS", e.g. "EmonCMS Total Power" or "EmonCMS Feed 5". +If the `id` property is anything but `1`, the ID will be shown as well, e.g. "EmonCMS 2 Feed 5". + +If `sensor_names` is used, any feeds with defined names will get those names exactly, with no prefix. ### {% linkable_title Examples %} From 2073c792a082192ef019d2da766abb2402472eb4 Mon Sep 17 00:00:00 2001 From: Uli Date: Sun, 22 Oct 2017 21:57:59 +0200 Subject: [PATCH 010/118] typofix in hass.io docs (#3711) --- source/addons/index.html | 2 +- source/developers/hassio/addon_development.markdown | 2 +- source/hassio/index.markdown | 2 +- source/hassio/zwave.markdown | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/addons/index.html b/source/addons/index.html index 55f74248817..5abc6504b76 100644 --- a/source/addons/index.html +++ b/source/addons/index.html @@ -10,7 +10,7 @@ footer: true regenerate: false --- -

Add-ons for Hass.io allows the user to extend the functionality around Home Assistant. This can be running an application that Home Assistant can integrate with (like an MQTT broker) or to share the configuration via Samba for easy editing from other computers. Add-ons can be configured via the Hass.io panel in Home Assistant.

+

Add-ons for Hass.io allow the user to extend the functionality around Home Assistant. This can be running an application that Home Assistant can integrate with (like an MQTT broker) or to share the configuration via Samba for easy editing from other computers. Add-ons can be configured via the Hass.io panel in Home Assistant.

Check the Hass.io forums for add-on repositories managed by the community. diff --git a/source/developers/hassio/addon_development.markdown b/source/developers/hassio/addon_development.markdown index 6e775760f9b..40680cd1415 100644 --- a/source/developers/hassio/addon_development.markdown +++ b/source/developers/hassio/addon_development.markdown @@ -10,7 +10,7 @@ footer: true redirect_from: /hassio/addon_development/ --- -Add-ons for Hass.io allows the user to extend the functionality around Home Assistant. This can be running an application that Home Assistant can integrate with (like an MQTT broker) or to share the configuration via Samba for easy editing from other computers. Add-ons can be configured via the Hass.io panel in Home Assistant. +Add-ons for Hass.io allow the user to extend the functionality around Home Assistant. This can be running an application that Home Assistant can integrate with (like an MQTT broker) or to share the configuration via Samba for easy editing from other computers. Add-ons can be configured via the Hass.io panel in Home Assistant. Under the hood, add-ons are Docker images published in [Docker Hub](https://hub.docker.com/). Developers can create [GitHub](https://github.com) repositories that contain multiple references to add-ons for easy sharing with the community. diff --git a/source/hassio/index.markdown b/source/hassio/index.markdown index 84cb5ac4027..35eb09a523b 100644 --- a/source/hassio/index.markdown +++ b/source/hassio/index.markdown @@ -16,7 +16,7 @@ Hass.io turns your Raspberry Pi (or another device) into the ultimate home autom The advantages of using Hass.io: - Free and open source - - Optimized for embedded device like Raspberry Pi + - Optimized for embedded devices like Raspberry Pi - 100% local home automation - Easy installation and updates (powered by [ResinOS] and [Docker]) - Management user interface integrated into Home Assistant diff --git a/source/hassio/zwave.markdown b/source/hassio/zwave.markdown index 6d14fabcabc..d05a07b3608 100644 --- a/source/hassio/zwave.markdown +++ b/source/hassio/zwave.markdown @@ -16,7 +16,7 @@ zwave: usb_path: /dev/ttyACM0 ``` -If you need GPIO on raspberry-pi3 for you Z-Wave module add follow line into `config.txt`: +If you need GPIO on raspberry-pi3 for you Z-Wave module add the following line into `config.txt`: ``` dtoverlay=pi3-miniuart-bt ``` From 7776584bd613b75c3c01a51f40cd9267300c59ca Mon Sep 17 00:00:00 2001 From: Thom Troy Date: Mon, 23 Oct 2017 07:25:36 +0100 Subject: [PATCH 011/118] Add irish rail docs (#3633) * Add irish rail docs * make main example be basic * Small spelling & grammar fixes --- .../sensor.irish_rail_transport.markdown | 52 ++++++++++++++++++ source/images/supported_brands/irishrail.png | Bin 0 -> 5062 bytes 2 files changed, 52 insertions(+) create mode 100644 source/_components/sensor.irish_rail_transport.markdown create mode 100644 source/images/supported_brands/irishrail.png diff --git a/source/_components/sensor.irish_rail_transport.markdown b/source/_components/sensor.irish_rail_transport.markdown new file mode 100644 index 00000000000..2735bad819e --- /dev/null +++ b/source/_components/sensor.irish_rail_transport.markdown @@ -0,0 +1,52 @@ +--- +layout: page +title: "Irish Rail Transport" +description: "Instructions on how to integrate timetable data for traveling on Irish Rail within Home Assistant." +date: 2017-10-15 16:50 +sidebar: true +comments: false +sharing: true +footer: true +logo: irishrail.png +ha_category: Transport +ha_iot_class: "Cloud Polling" +ha_release: 0.56 +--- + + +The `irish_rail_transport` sensor will give you the time until the next two departures (within 90 minutes) from an Irish Rail station using the RTPI information. + +A station name is the full station name as specified on the Irish Rail search site, for example, `Tara Street` or `Dublin Connolly`. + +To activate the sensor add the data to your `configuration.yaml` file as shown in the example: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: irish_rail_transport + station: "Tara Street" + name: "To Greystones" +``` + +Configuration variables: + +- **station** (*Required*): The name of the station. +- **direction** (*Optional*): The direction of the train. Typically either `Northbound` or `Southbound`. +- **destination** (*Optional*): The name of the destination station to filter by. +- **stops_at** (*Optional*): An optional filter based on the name of a station that the train stops at. +- **name** (*Optional*): A friendly name for this sensor. + +Using the `stops_at` option will cause an extra request per train found. Therefore, if you are looking at a busy station, it is recommended that you also use at least one other filter. For example: + +```yaml +# Example full configuration.yaml entry +sensor: + - platform: irish_rail_transport + station: "Tara Street" + direction: Southbound + destination: Greystones + stops_at: "Dun Laoghaire" + name: "To Greystones" +``` + +The above example will show the next 2 `Southbound` trains that leave `Tara Street` station, going to `Greystones` via `Dun Laoghaire`: diff --git a/source/images/supported_brands/irishrail.png b/source/images/supported_brands/irishrail.png new file mode 100644 index 0000000000000000000000000000000000000000..204e1c2f899f50189c6e40b212902a6c25cdae30 GIT binary patch literal 5062 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 literal 0 HcmV?d00001 From fc13d871686be3f0a6a28d8bb743208e97f281c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoffer=20Kylv=C3=A5g?= Date: Mon, 23 Oct 2017 08:32:28 +0200 Subject: [PATCH 012/118] Update faulty link, website => documentation (#3729) --- source/developers/development_checklist.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/development_checklist.markdown b/source/developers/development_checklist.markdown index a7a585701f2..1a1fdb3deff 100644 --- a/source/developers/development_checklist.markdown +++ b/source/developers/development_checklist.markdown @@ -16,5 +16,5 @@ Before you commit any changes, check your work against these requirements: - New dependencies are added to `requirements_all.txt` (if applicable), using `script/gen_requirements_all.py` - The `.coveragerc` file is updated to exclude your platform if there are no tests available or your new code uses a third-party library for communication with the device, service, or sensor - Documentation is developed for [home-assistant.io](https://home-assistant.io/) - * It's OK to start with adding a docstring with configuration details (for example, sample entry for `configuration.yaml` file) to the file header. Visit the [website documentation](/developers/website/) for more information about contributing to [home-assistant.io](https://github.com/home-assistant/home-assistant.github.io). + * It's OK to start with adding a docstring with configuration details (for example, sample entry for `configuration.yaml` file) to the file header. Visit the [website documentation](/developers/documentation/) for more information about contributing to [home-assistant.io](https://github.com/home-assistant/home-assistant.github.io). From 0afea9e8870c0d551c62654e7a7c75b9951956e1 Mon Sep 17 00:00:00 2001 From: Kevin Fronczak Date: Mon, 23 Oct 2017 03:24:36 -0400 Subject: [PATCH 013/118] Fail2Ban Sensor Documentation (#3679) * Initial revision of sensor.fail2ban docs * Bumped version --- source/_components/sensor.fail2ban.markdown | 185 ++++++++++++++++++++ source/images/supported_brands/fail2ban.png | Bin 0 -> 17857 bytes 2 files changed, 185 insertions(+) create mode 100644 source/_components/sensor.fail2ban.markdown create mode 100644 source/images/supported_brands/fail2ban.png diff --git a/source/_components/sensor.fail2ban.markdown b/source/_components/sensor.fail2ban.markdown new file mode 100644 index 00000000000..c96b3109910 --- /dev/null +++ b/source/_components/sensor.fail2ban.markdown @@ -0,0 +1,185 @@ +--- +layout: page +title: "Fail2Ban Sensor" +description: "Instructions how to integrate a fail2ban sensor into Home Assistant." +date: 2017-10-19 10:30 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Sensor +ha_iot_class: "Local Polling" +logo: fail2ban.png +ha_release: 0.57 +--- + + +The `fail2ban` sensor allows for IPs banned by [fail2ban](https://www.fail2ban.org/wiki/index.php/Main_Page) to be displayed in the Home Assistant front-end. + +

+Your system must have fail2ban installed and correctly configured for this sensor to work. In addition, Home Assistant must be able to read the fail2ban log file. +

+ +To enable this sensor, add the following lines to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: fail2ban + jails: + - ssh + - hass-iptables + file_path: /var/log/fail2ban.log +``` + +Configuration variables: + +- **jails** (*Required*): List of configured jails you want to display (each jail is its own sensor). +- **name** (*Optional*): Name of the sensor. Defaults to `fail2ban`. +- **file_path** (*Optional*): Path to the fail2ban log. Defaults to `/var/log/fail2ban.log`. +- **scan_interval** (*Optional*): Used to limit how often log file is read and must be a positive integer (representing number of seconds to wait). Defaults to 120. + +### {% linkable_title Set up Fail2Ban %} + +For most set-ups, you can follow [this tutorial](https://home-assistant.io/cookbook/fail2ban/) to set up fail2ban on your system. It will walk you through creating jails and filters, allowing you to monitor IPs that have been banned for too many failed ssh login attempts, as well as too many failed Home Assistant log in attempts. + +### {% linkable_title Fail2Ban with Docker %} + +

+These steps assume you already have the Home Assistant docker running behind nginx and that it is externally accessible. It also assumes the docker is running with the `--net='host'` flag. +

+ +For those of us using Docker, the above tutorial may not be sufficient. The following steps specifically outline how to set up `fail2ban` and Home Assistant when running Home Assistant within a Docker behind nginx. The setup this was tested on was an unRAID server using the [let's encrypt docker](https://github.com/linuxserver/docker-letsencrypt) from linuxserver.io. + +#### Set http logger + +In your `configuration.yaml` file, add the following to the `logger` component to ensure that Home Assistant prints failed login attempts to the log. + +```yaml +logger: + logs: + homeassistant.components.http.ban: warning +``` + +#### Edit the `jail.local` file + +Next, we need to edit the `jail.local` file that is included with the Let's Encrypt docker linked above. Note, for this tutorial, we'll only be implementing the `[hass-iptables]` jail from the [previously linked tutorial](https://home-assistant.io/cookbook/fail2ban/). + +Edit `/mnt/user/appdata/letsencrypt/fail2ban/jail.local` and append the following to the end of the file: + +``` +[hass-iptables] +enabled = true +filter = hass +action = iptables-allports[name=HASS] +logpath = /hass/home-assistant.log +maxretry = 5 +``` + +#### Create a filter for the Home Assistant jail + +Now we need to create a filter for `fail2ban` so that it can properly parse the log. This is done with a `failregex`. Create a file called `hass.local` within the `filter.d` directory in `/mnt/user/appdata/letsencrypt/fail2ban` and add the following: + +``` +[INCLUDES] +before = common.conf + +[Definition] +failregex = ^%(__prefix_line)s.*Login attempt or request with invalid authentication from .*$ + +ignoreregex = + +[Init] +datepattern = ^%%Y-%%m-%%d %%H:%%M:%%S +``` + +#### Map log file directories + +First, we need to make sure that fail2ban log can be passed to Home Assistant and that the Home Assistant log can be passed to fail2ban. When starting the Let's Encrypt docker, you need to add the following argument (adjust paths based on your setup): + +``` +/mnt/user/appdata/home-assistant:/hass +``` + +This will map the Home Assistant configuration directory to the Let's Encrypt docker, allowing `fail2ban` to parse the log for failed login attempts. + +Now do the same for the Home Assistant docker, but this time we'll be mapping the `fail2ban` log directory to Home Assistant so that the fail2ban sensor is able to read that log: + +``` +/mnt/user/appdata/letsencrypt/log/fail2ban:/fail2ban +``` + + +#### Send client IP to Home Assistant + +By default, the IP address that Home Assistant sees will be that of the container (something like `172.17.0.16`). What this means is that for any failed login attempt, assuming you have correctly configured `fail2ban`, the Docker IP will be logged as banned, but the originating IP is still allowed to make attempts. We need `fail2ban` to recognize the originating IP to properly ban it. + +First, we have to add the following to the nginx configuration file located in `/mnt/user/appdata/letsencrypt/nginx/site-confs/default`. + +``` +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +``` + +This snippet should be added within your Home Assistant server config, so you have something like the following: + +``` +server { + ... + location / { + proxy_pass http://192.168.0.100:8123; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /api/websocket { + proxy_pass http://192.168.0.100:8123/api/websocket; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + ... +} +``` + +Once that's added to the nginx configuration, we need to modify the Home Assistant `configuration.yaml` such that the `X-Forwarded-For` header can be parsed. This is done by adding the following to the `http` component: + +```yaml +http: + use_x_forwarded_for: True +``` + +At this point, once the Let's Encrypt and Home Assistant dockers are restarted, Home Assistant should be correctly logging the originating IP of any failed login attempt. Once that's done and verified, we can move onto the final step. + +#### Add the fail2ban sensor + +Now that we've correctly set everything up for Docker, we can add our sensors to `configuration.yaml` with the following: + +```yaml +sensor: + - platform: fail2ban + jails: + - hass-iptables + file_path: /fail2ban/fail2ban.log +``` + +Assuming you've followed all of the steps, you should have one fail2ban sensor, `sensor.fail2ban_hassiptables`, within your front-end. + +### {% linkable_title Other debug tips %} + +If, after following these steps, you're unable to get the fail2ban sensor working, here are some other steps you can take that may help: + +- Add `logencoding = utf-8` to the `[hass-iptables]` entry +- Ensure the `failregex` you added to `filter.d/hass.local` matches the output within `home-assistant.log` +- Try changing the datepattern in `filter.d/hass/local` by adding the following entry (change the datepattern to fit your needs). [source](https://github.com/fail2ban/fail2ban/issues/174) + ``` + [Init] + datepattern = ^%%Y-%%m-%%d %%H:%%M:%%S + ``` diff --git a/source/images/supported_brands/fail2ban.png b/source/images/supported_brands/fail2ban.png new file mode 100644 index 0000000000000000000000000000000000000000..e834a38bf869997a2dd1ba688fdd00b6ff66fb4e GIT binary patch literal 17857 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 r?~Xm#v5c?pMIRH7Cc56J Date: Mon, 23 Oct 2017 12:02:03 +0200 Subject: [PATCH 014/118] Fix sentence (fixes #3713) (#3734) --- source/_docs/backend.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/backend.markdown b/source/_docs/backend.markdown index 23659871a0e..01b28b17a49 100644 --- a/source/_docs/backend.markdown +++ b/source/_docs/backend.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -The frontend of Home Assistant is running with [Python 3](https://www.python.org/). +The backend of Home Assistant is running with [Python 3](https://www.python.org/). The [Architecture page](/developers/architecture/) show the details about the elements running in the background of Home Assistant. From 166faf4e49b7dbe2a88ac39c1b612dd9e1f93db2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 23 Oct 2017 15:53:43 +0200 Subject: [PATCH 015/118] Make host optional (#3733) --- source/_components/namecheapdns.markdown | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/source/_components/namecheapdns.markdown b/source/_components/namecheapdns.markdown index 73fbc9d1f1b..3331080fa93 100644 --- a/source/_components/namecheapdns.markdown +++ b/source/_components/namecheapdns.markdown @@ -13,7 +13,7 @@ featured: false ha_release: 0.56 --- -With the namecheapDNS component you can automatically update your dynamic DNS entry. +With the `namecheapdns` component you can automatically update your dynamic DNS entry at [namecheapdns](https://www.namecheap.com/store/domains/freedns/).

Namecheap only supports IPv4 adresses to update. @@ -24,22 +24,21 @@ To use the component in your installation, add the following to your `configurat ```yaml # Example configuration.yaml entry namecheapdns: - host: '@' domain: example.com - access_token: 0123_Dynamic_DNS_Password + password: YOUR_PASSWORD ``` {% configuration %} host: - description: The host part or "subdomain" part you want to update (If you want your domain leave the @ sign) - required: true + description: The host part or "subdomain" part you want to update. + required: false type: string domain: description: Your namecheap TLD (example.com). required: true type: string - access_token: - description: The namecheap "Dynamic DNS Password" you can find under the "Advanced DNS" Tab + password: + description: The namecheap "Dynamic DNS Password" you can find under the "Advanced DNS" tab. required: true type: string {% endconfiguration %} From fcc8ae4955c5ced36a238ab4b662021421e5f10b Mon Sep 17 00:00:00 2001 From: Thom Troy Date: Mon, 23 Oct 2017 22:23:56 +0100 Subject: [PATCH 016/118] Create climate.ephember (#3561) * Create climate.ephember * add logo * Small grammar corrections --- source/_components/climate.ephember | 33 ++++++++++++++++++ .../supported_brands/ephcontrolsember.png | Bin 0 -> 2518 bytes 2 files changed, 33 insertions(+) create mode 100644 source/_components/climate.ephember create mode 100644 source/images/supported_brands/ephcontrolsember.png diff --git a/source/_components/climate.ephember b/source/_components/climate.ephember new file mode 100644 index 00000000000..962b34746e2 --- /dev/null +++ b/source/_components/climate.ephember @@ -0,0 +1,33 @@ +--- +layout: page +title: "EPH Controls Ember Thermostat" +description: "Instructions on how to integrate EPH Controls Ember thermostats within Home Assistant." +date: 2017-10-07 12:40 +sidebar: true +comments: false +sharing: true +footer: true +logo: ephcontrolsember.png +ha_category: Climate +ha_release: "0.55" +ha_iot_class: "Local Polling" +--- + + +The `ephember` climate platform lets you control [EPH Controls](http://emberapp.ephcontrols.com/) thermostats. The module only works if you have a WiFi gateway to control your EPH system and an account on the ember app. + +To set it up, add the following information to your `configuration.yaml` file: + +```yaml +climate: + - platform: ephember + username: YOUR_EMAIL + password: YOUR_PASSWORD +``` + +A single interface can handle up to 32 connected devices. + +Configuration variables: + +- **username** (*Required*): The email address you used to sign up to the ember app +- **password** (*Required*): The password you used to sign up to the ember app diff --git a/source/images/supported_brands/ephcontrolsember.png b/source/images/supported_brands/ephcontrolsember.png new file mode 100644 index 0000000000000000000000000000000000000000..e57df2a577e7610e0435084634f790ae38df03da GIT binary patch literal 2518 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 literal 0 HcmV?d00001 From 775c5a6c60b211aa6025145d8d0b1f4678cc7b06 Mon Sep 17 00:00:00 2001 From: Alok Saboo Date: Tue, 24 Oct 2017 03:05:30 -0400 Subject: [PATCH 017/118] Added minutes to uptime sensor (#3741) --- source/_components/sensor.uptime.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.uptime.markdown b/source/_components/sensor.uptime.markdown index 5aa633d57a9..3df1ea9a5a1 100644 --- a/source/_components/sensor.uptime.markdown +++ b/source/_components/sensor.uptime.markdown @@ -27,4 +27,4 @@ sensor: Configuration variables: - **name** (*Optional*): Name of the sensor. Defaults to `Uptime`. -- **unit_of_measurement** (*Optional*): Units for uptime measurement in either `days` or `hours`. Defaults to `days`. +- **unit_of_measurement** (*Optional*): Units for uptime measurement in either `days`, `hours`, or `minutes`. Defaults to `days`. From 2bf0eb9e18b89e8ceee19261d6e82b96a36babba Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Tue, 24 Oct 2017 09:06:22 +0200 Subject: [PATCH 018/118] set emulated_hue_hidden to true in example (#3740) this will make the setting correspond to the comment above. This is also noticed after merge in #3554 --- source/_components/emulated_hue.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/emulated_hue.markdown b/source/_components/emulated_hue.markdown index b6dfa32c7e5..0244bc546aa 100644 --- a/source/_components/emulated_hue.markdown +++ b/source/_components/emulated_hue.markdown @@ -100,7 +100,7 @@ homeassistant: customize: light.bedroom_light: # Don't allow light.bedroom_light to be controlled by the emulated Hue bridge - emulated_hue_hidden: false + emulated_hue_hidden: true light.office_light: # Address light.office_light as "back office light" emulated_hue_name: "back office light" From 65464f3c86ccc1297b7c71d61b7a40f951df884d Mon Sep 17 00:00:00 2001 From: Adam Cooper Date: Tue, 24 Oct 2017 08:10:55 +0100 Subject: [PATCH 019/118] Whois Sensor (#3744) * Init whois sensor docs * Fixed glaring typo (hostname => domain) --- source/_components/sensor.whois.markdown | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 source/_components/sensor.whois.markdown diff --git a/source/_components/sensor.whois.markdown b/source/_components/sensor.whois.markdown new file mode 100644 index 00000000000..215e7aa01e1 --- /dev/null +++ b/source/_components/sensor.whois.markdown @@ -0,0 +1,30 @@ +--- +layout: page +title: "Whois Sensor" +description: "Instructions on how to integrate WHOIS lookup sensor within Home Assistant." +date: 2017-10-22 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_category: Sensor +ha_release: "0.57" +ha_iot_class: "Cloud Polling" +--- + + +`whois` sensor allows you to perform daily WHOIS lookups against your owned domains. This provides you with information such as `expiration_date`, `name_servers`, and `registrar` details. + +```yaml +# Example configuration.yaml entry +sensor: + - platform: whois + domain: example.net + name: primary +``` + +Configuration variables: + +- **domain** (*Required*): The domain you want to perform WHOIS lookups against. +- **name** (*Optional*): A friendly name to apply to this sensor. From e7d99e5b16f57b7f12b194dfc212541b528d8c2a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 24 Oct 2017 14:46:19 +0200 Subject: [PATCH 020/118] Add support for HTTP Basic/Digest authentication (#3737) --- source/_components/sensor.scrape.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_components/sensor.scrape.markdown b/source/_components/sensor.scrape.markdown index 85738eeaaa3..2ab59be72c6 100644 --- a/source/_components/sensor.scrape.markdown +++ b/source/_components/sensor.scrape.markdown @@ -33,6 +33,9 @@ Configuration variables: - **attribute** (*optional*): Get value of an attribute on the selected tag. - **name** (*Optional*): Name of the sensor. - **unit_of_measurement** (*Optional*): Defines the units of measurement of the sensor, if any. +- **authentication** (*Optional*): Type of the HTTP authentication. Either `basic` or `digest`. +- **username** (*Optional*): The username for accessing the website. +- **password** (*Optional*): The password for accessing the website. ## {% linkable_title Examples %} From 978a3f2867ed54ad8255db761413d6837d19b74a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 24 Oct 2017 15:56:54 +0200 Subject: [PATCH 021/118] Update default name (#3756) --- source/_components/binary_sensor.bayesian.markdown | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/_components/binary_sensor.bayesian.markdown b/source/_components/binary_sensor.bayesian.markdown index b5d20c509ff..d344cb9ae1f 100644 --- a/source/_components/binary_sensor.bayesian.markdown +++ b/source/_components/binary_sensor.bayesian.markdown @@ -14,7 +14,7 @@ ha_release: 0.53 --- -The `bayesian` binary sensor platform observes the state from multiple sensors and uses Bayes' rule to estimate the probability that an event has occurred given the state of the observed sensors. If the estimated posterior probability is above the `probability_threshold`, the sensor is `on` otherwise it is `off`. +The `bayesian` binary sensor platform observes the state from multiple sensors and uses [Bayes' rule](https://en.wikipedia.org/wiki/Bayes%27_theorem) to estimate the probability that an event has occurred given the state of the observed sensors. If the estimated posterior probability is above the `probability_threshold`, the sensor is `on` otherwise it is `off`. This allows for the detection of complex events that may not be readily observable, e.g., cooking, showering, in bed, the start of a morning routine, etc. It can also be used to gain greater confidence about events that _are_ directly observable, but for which the sensors can be unreliable, e.g., presence. @@ -23,7 +23,7 @@ To enable the Bayesian sensor, add the following lines to your `configuration.ya ```yaml # Example configuration.yaml entry binary_sensor: - - platform: 'bayesian' + - platform: bayesian prior: 0.1 observations: - entity_id: 'switch.kitchen_lights' @@ -36,14 +36,14 @@ binary_sensor: Configuration variables: - **prior** (*Required*): The prior probability of the event. At any point in time (ignoring all external influences) how likely is this event to occur? +- **probability_threshold** (*Optional*): The probability at which the sensor should trigger to `on`. +- **name** (*Optional*): Name of the sensor to use in the frontend. Defaults to `Bayesian Binary sensor`. - **observations** array (*Required*): The observations which should influence the likelihood that the given event has occurred. - **entity_id** (*Required*): Name of the entity to monitor. - **prob_given_true** (*Required*): The probability of the observation occurring, given the event is `true`. - **prob_given_false** (*Optional*): The probability of the observation occurring, given the event is `false` can be set as well. If `prob_given_false` is not set, it will default to `1 - prob_given_true`. - **platform** (*Required*): The only supported observation platforms are `state` and `numeric_state`, which are modeled after their corresponding triggers for automations, requiring `before` and/or `after` instead of `to_state`. - **to_state** (*Required*): The target state. -- **probability_threshold** (*Optional*): The probability at which the sensor should trigger to `on`. -- **name** (*Optional*): Name of the sensor to use in the frontend. Defaults to `Bayesian Binary`. ## {% linkable_title Full examples %} @@ -74,6 +74,8 @@ binary_sensor: platform: 'state' to_state: 'below_horizon' ``` + + ```yaml # Example configuration.yaml entry binary_sensor: From 81c56e5e7ec0299b382ca2056bc2ae7c6c00a02a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 24 Oct 2017 23:53:17 -0700 Subject: [PATCH 022/118] Update duckdns.markdown --- source/_components/duckdns.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/duckdns.markdown b/source/_components/duckdns.markdown index 93caf14341b..bd18114a18e 100644 --- a/source/_components/duckdns.markdown +++ b/source/_components/duckdns.markdown @@ -24,7 +24,7 @@ duckdns: access_token: abcdefgh ``` -{% configuration binary_sensor.template %} +{% configuration duckdns %} domain: description: Your duckdns subdomain (without the `.duckdns.org` suffix). required: true From c19c3ae2e383694bf3f6a55e63b95e44faf0b662 Mon Sep 17 00:00:00 2001 From: Kane610 Date: Wed, 25 Oct 2017 09:27:30 +0200 Subject: [PATCH 023/118] Remove external dependency guide lines (#3673) With the next PR for axis component (home-assistant/home-assistant#9791) the external dependencies for event stream has been removed. --- source/_components/axis.markdown | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/source/_components/axis.markdown b/source/_components/axis.markdown index 49f9ec87315..a23a97c2dfc 100644 --- a/source/_components/axis.markdown +++ b/source/_components/axis.markdown @@ -17,36 +17,6 @@ ha_iot_class: "Local Polling" Home Assistant will automatically discover their presence on your network. -## {% linkable_title Dependencies %} - -```bash -$ sudo apt-get install python3-gst-1.0 gir1.2-gstreamer-1.0 gir1.2-gst-plugins-base-1.0 gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools python3-gi -``` - -Depending on how you run Home Assistant, you may need to symlink the `gi` module into your environment. - -Hassbian: - -```bash -$ ln -s /usr/lib/python3/dist-packages/gi /srv/homeassistant/lib/python3.4/site-packages -``` - -Raspberry Pi All-In-One Installer: - -```bash -$ ln -s /usr/lib/python3/dist-packages/gi /srv/homeassistant/homeassistant_venv/lib/python3.4/site-packages -``` - -[Virtualenv](https://home-assistant.io/docs/installation/virtualenv/) installation: - -```bash -$ ln -s /usr/lib/python3/dist-packages/gi /srv/homeassistant/lib/python3.5/site-packages -``` - -

- Adjust "python3.5" in command above to match your version as stored in "/srv/homeassistant/lib/pythonX.X" -

- You can also manually configure your devices by adding the following lines to your `configuration.yaml` file: ```yaml From e1f4413691a3bca6deb1af411b4125914d53c69d Mon Sep 17 00:00:00 2001 From: jbarrancos <31309880+jbarrancos@users.noreply.github.com> Date: Wed, 25 Oct 2017 09:41:19 +0200 Subject: [PATCH 024/118] Rain Bird LNK WiFi Irrigation Implementation (#3242) * Add Rainbird logo Add Rainbird logo * Add Rainbird docset Add Rainbird docset * Added service description Start and stop irrigation explaination * Changed paramaters * Corrected to official names * Fixed more typos * Added additional configuration documentation * Corrected unnecessary line. * Per discussion moved everything to switch * Update switch.rainbird.markdown * Not needed --- source/_components/switch.rainbird.markdown | 46 ++++++++++++++++++++ source/images/supported_brands/rainbird.png | Bin 0 -> 2427 bytes 2 files changed, 46 insertions(+) create mode 100644 source/_components/switch.rainbird.markdown create mode 100644 source/images/supported_brands/rainbird.png diff --git a/source/_components/switch.rainbird.markdown b/source/_components/switch.rainbird.markdown new file mode 100644 index 00000000000..455c9118ac8 --- /dev/null +++ b/source/_components/switch.rainbird.markdown @@ -0,0 +1,46 @@ +--- +layout: page +title: "Rain Bird Switch" +description: "Instructions on how to integrate your Rain Bird LNK WiFi Module as Switches within Home Assistant." +date: 2017-08-25 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: rainbird.png +ha_category: Hub +ha_release: 0.50 +ha_iot_class: "Local Polling" +--- + +This `rainbird` switch platform allows interacting with [LNK WiFi](http://www.rainbird.com/landscape/products/controllers/LNK-WiFi.htm) module of the Rain Bird Irrigation system in Home Assistant. + +To enable stations as switches inside Home Assistant, add the following to your `configuration.yaml` file: + +```yaml +switch: + platform: rainbird + host: '1.1.1.1' + password: 'secretpassword' + sprinkler_1: + zone: 1 + friendly_name: "Front sprinklers" + trigger_time: 20 + scan_interval: 10 + sprinkler_2: + friendly_name: "Back sprinklers" + zone: 2 + trigger_time: 20 + scan_interval: 10 +``` + +Configuration variables: + +- **stickip** (*Required*): The IP address of your LNK WiFi Module. +- **password** (*Required*): The password for accessing the module. +- **zone** (*Required*): Station zone identifier. +- **friendly_name** (*Optional*): Just a friendly name for the station. +- **trigger_time** (*Required*): The default duration to sprinkle the zone. +- **scan_interval** (*Optional*): How fast to refresh the switch. + +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). diff --git a/source/images/supported_brands/rainbird.png b/source/images/supported_brands/rainbird.png new file mode 100644 index 0000000000000000000000000000000000000000..fee1def08e802b568a52ab9b7686874f456373bc GIT binary patch literal 2427 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 literal 0 HcmV?d00001 From dead790973368881da0af68e4983582a63c7320f Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Wed, 25 Oct 2017 12:31:25 +0200 Subject: [PATCH 025/118] Allow folder selection for IMAP unread sensor (#3767) --- source/_components/sensor.imap.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/sensor.imap.markdown b/source/_components/sensor.imap.markdown index d6ce85c67af..34fd3df9231 100644 --- a/source/_components/sensor.imap.markdown +++ b/source/_components/sensor.imap.markdown @@ -10,7 +10,7 @@ footer: true logo: smtp.png ha_category: Sensor ha_release: 0.25 -ha_iot_class: "Local Polling" +ha_iot_class: "Cloud Push" --- @@ -31,8 +31,8 @@ sensor: Configuration variables: - **server** (*Required*): The IP address or hostname of the IMAP server. -- **port** (*Required*): The port where the server is accessible. +- **port** (*Optional*): The port where the server is accessible. - **name** (*Optional*): Name of the IMAP sensor. - **username** (*Required*): Username for the IMAP server. - **password** (*Required*): Password for the IMAP server. - +- **folder** (*Optional*): The IMAP folder to watch. From fb7fc0b23f07c6160411beb2e88355fe5743d54e Mon Sep 17 00:00:00 2001 From: Trevor Date: Wed, 25 Oct 2017 05:32:17 -0500 Subject: [PATCH 026/118] Add Google Domains component (#3739) * Add Google Domains component * Add Google Domains image * Add timeout to Google Domains component * Update google_domains.markdown * Update google_domains.markdown --- source/_components/google_domains.markdown | 46 ++++++++++++++++++ .../supported_brands/google_domains.png | Bin 0 -> 5060 bytes 2 files changed, 46 insertions(+) create mode 100644 source/_components/google_domains.markdown create mode 100644 source/images/supported_brands/google_domains.png diff --git a/source/_components/google_domains.markdown b/source/_components/google_domains.markdown new file mode 100644 index 00000000000..cfee608eb67 --- /dev/null +++ b/source/_components/google_domains.markdown @@ -0,0 +1,46 @@ +--- +layout: page +title: "Google Domains" +description: "Keep your computer registered with the Google Domains dynamic DNS." +date: 2017-10-23 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: google_domains.png +ha_category: Utility +featured: false +ha_release: 0.57 +--- + +With the Google Domains component you can keep your Google Domains record up to date. + +To use the component in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +google_domains: + domain: subdomain.domain.com + username: abc123 + password: xyz345 +``` + +{% configuration binary_sensor.template %} + domain: + description: Your FQDN. + required: true + type: string + username: + description: The generated username for this DDNS record. + required: true + type: string + password: + description: The generated password for this DDNS record. + required: true + type: string + timeout + description: Timeout (in seconds) for the API calls. + required: false + type: number + default: 10 +{% endconfiguration %} diff --git a/source/images/supported_brands/google_domains.png b/source/images/supported_brands/google_domains.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b6ca9461070aa80602e06863329446ce98ded6 GIT binary patch literal 5060 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 a-txcQs(^}l9sHC40000 Date: Wed, 25 Oct 2017 12:33:18 +0200 Subject: [PATCH 027/118] Docs of the Xiaomi Air Purifier 2 integration (#3605) * Docs for the Xiaomi Air Purifier 2 component added. * Service domain ("fan") updated and services properly prefixed by xiaomi_miio. * Update 'ha_release' --- source/_components/fan.xiaomi_miio.markdown | 111 ++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 source/_components/fan.xiaomi_miio.markdown diff --git a/source/_components/fan.xiaomi_miio.markdown b/source/_components/fan.xiaomi_miio.markdown new file mode 100644 index 00000000000..9b8d2c0e0fc --- /dev/null +++ b/source/_components/fan.xiaomi_miio.markdown @@ -0,0 +1,111 @@ +--- +layout: page +title: "Xiaomi Air Purifier 2" +description: "Instructions how to integrate your Xiaomi Air Purifier 2 within Home Assistant." +date: 2017-10-13 12:35 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Switch +ha_version: 0.57 +ha_iot_class: "Local Polling" +--- + +The `xiaomi_miio` fan platform allows you to control the Xiaomi Air Purifier 2. The Air Purifier Pro isn't supported right now. + +Currently, the supported features are + +* On, Off +* Operation modes (auto, silent, favorite, idle) +* Buzzer (on, off) +* LED (on, off), LED brightness (bright, dim, off) +* Favorite Level +* States + - power + - aqi + - humidity + - temperature + - mode + - led + - led_brightness + - buzzer + - child_lock + - brightness + - favorite_level + - filter1_life + - f1_hour_used + - use_time + - motor1_speed + +## {% linkable_title Setup %} + +Please follow the instructions on [Retrieving the Access Token](/components/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. + +To add a Xiaomi Air Purifier to your installation, add the following to your `configuration.yaml` file: + +```yaml +fan: + - platform: xiaomi_miio + name: Xiaomi Air Purifier 2 + host: 192.168.130.66 + token: YOUR_TOKEN +``` + +Configuration variables: +- **host** (*Required*): The IP of your plug. +- **token** (*Required*): The API token of your plug. +- **name** (*Optional*): The name of your plug. + +## {% linkable_title Platform Services %} + +### Service fan/xiaomi_miio_set_buzzer_on + +Turn the buzzer on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | yes | Only act on specific air purifier. Else targets all. | + +### Service fan/xiaomi_miio_set_buzzer_off + +Turn the buzzer off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | yes | Only act on specific air purifier. Else targets all. | + +### Service fan/xiaomi_miio_set_led_on + +Turn the led on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | yes | Only act on specific air purifier. Else targets all. | + +### Service fan/xiaomi_miio_set_led_off + +Turn the led off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | yes | Only act on specific air purifier. Else targets all. | + +### Service fan/xiaomi_miio_set_led_brightness + +Set the led brightness. Supported values are 0 (Bright), 1 (Dim), 2 (Off). + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | yes | Only act on specific air purifier. Else targets all. | +| `brightness` | no | Brightness, between 0 and 2. | + +### Service fan/xiaomi_miio_set_favorite_level + +Set the favorite level of the operation mode "favorite". + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | yes | Only act on specific air purifier. Else targets all. | +| `level` | no | Level, between 0 and 17. | From 2bd74fdf254e448d55a280f307e5f9f170bc137b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Wr=C3=B3bel?= Date: Mon, 23 Oct 2017 05:07:14 -0400 Subject: [PATCH 028/118] Add instructions for multi-user configuration (#3721) --- source/_components/google_assistant.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown index 040c76c7821..8d54e38324f 100644 --- a/source/_components/google_assistant.markdown +++ b/source/_components/google_assistant.markdown @@ -102,3 +102,8 @@ homeassistant: 7. Back on the main app draft page. Click `Test Draft`. That will take you to the simulator (which won't work) so just close that window. 8. Open the Google Assistant app and go into `Settings > Home Control` 9. Click the `+` sign, and near the bottom, you should have `[test] your app name`. Selecting that should lead to you the screen where you can set rooms for your devices or nicknames for your devices. +10. If you want to allow other houshold users to control the devices: + 1. Go to the developer console using address from point 4. + 2. Under the gear icon, click `Permissions` + 3. Click `Add`, type the new user's e-mail address and choose `Project -> Editor` role + 4. Have the new user go to [developer console](https://console.actions.google.com/) and repeat steps starting from point 7. From 782d175a487046cd2303d80f80d8a0ab063454ad Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 23 Oct 2017 12:20:42 +0200 Subject: [PATCH 029/118] Add details about bugfix releases --- source/developers/releasing.markdown | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/source/developers/releasing.markdown b/source/developers/releasing.markdown index 1963ea07f27..55ef646a995 100644 --- a/source/developers/releasing.markdown +++ b/source/developers/releasing.markdown @@ -60,6 +60,15 @@ Checkout the `master` branch and run `script/release` to publish the new release ### {% linkable_title Social media %} -1. Use [hootsuite] to publish a link to the release post on social media. +1. Use [hootsuite](https://hootsuite.com/dashboard) to publish a link to the release post on social media. -[hootsuite]: https://hootsuite.com/dashboard +## {% linkable_title Bugfix Release %} + +1. Checkout `master` and update it. `git checkout master && git pull --rebase` +2. Create a new release branch from `master`. `git checkout -b release-0-56-2` +3. Cherry-pick the PRs which were milestoned. +4. Update `homeassistant/const.py` with the correct version number (increment `PATCH_VERSION`) and push that commit to release branch. +5. Create a pull request from the release branch to `master` with the upcoming release number as the title. +6. Merge pull request (DO NOT SQUASH!). Use `Merge pull request`. +7. Go to [releases](https://github.com/home-assistant/home-assistant/releases), click `Draft a new release` and tag a new release on the `master` branch. "Tag version" and "Release title" are the version number (`O.x` for major version, `0.x.y` for minor and bug fix releases). Release description is the text from PR. Press "Publish release" to finish the process. +8. [Publish](/developers/releasing/#python-package-index) the new release on PyPI. From a1fcd5fd1fd9c78203010e89fd595ed587ebb216 Mon Sep 17 00:00:00 2001 From: Phill Price Date: Mon, 23 Oct 2017 11:24:58 +0100 Subject: [PATCH 030/118] remove ssl and port in configuration.yaml (#3691) * remove ssl and port in configuration.yaml Make clear to remove SSL and port in configuration.yaml to avoid 502 errors * Update nginx_proxy.markdown * Minor change --- source/_addons/nginx_proxy.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_addons/nginx_proxy.markdown b/source/_addons/nginx_proxy.markdown index 7f14e50bee6..318b9768d9c 100644 --- a/source/_addons/nginx_proxy.markdown +++ b/source/_addons/nginx_proxy.markdown @@ -9,7 +9,9 @@ sharing: true footer: true --- -Setup a SSL proxy with NGINX and redirect port 80 to 443. Make sure you have generate certificate before you start this add-on. +Setup a SSL proxy with NGINX and redirect port 80 to 443. Make sure you have generated a certificate before you start this add-on. + +In the `http` section of the `configuration.yaml` file remove `ssl_certificate` and `ssl_key` and don't enter the port in the `base_url` to avoid a HTTP 502 error. ```json From 0dc78f4ba978b791e75a6231896b3763e0f31290 Mon Sep 17 00:00:00 2001 From: Nicholas Griffin Date: Mon, 23 Oct 2017 14:55:31 +0100 Subject: [PATCH 031/118] Update Arlo Control Panel with away mode variable (#3732) * Update Arlo Control Panel with away mode variable Just a simple change to add a description about adding an away mode to the Arlo Control Panel. * Remove blank line --- source/_components/alarm_control_panel.arlo.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/alarm_control_panel.arlo.markdown b/source/_components/alarm_control_panel.arlo.markdown index c58bb46d992..bc94d594a54 100644 --- a/source/_components/alarm_control_panel.arlo.markdown +++ b/source/_components/alarm_control_panel.arlo.markdown @@ -29,3 +29,4 @@ alarm_control_panel: Configuration variables: - **home_mode_name**: (*Optional*): Arlo base station does not have a built-in home mode. You can map one of your custom modes to home assistant's home mode by setting the name of the custom mode in this configuration variable. The name of the custom mode should match exactly as you set it up in the Arlo app. +- **away_mode_name**: (*Optional*): Like the home mode, the Arlo base station does not have a built-in away mode, however, you can map a custom mode from the Arlo app to Home Assistant with this variable, just make sure the name matches exactly what you have set up in the Arlo app. From df26b1db1764be0ad270069da107710db508286d Mon Sep 17 00:00:00 2001 From: Erik-jan Riemers Date: Mon, 23 Oct 2017 16:00:42 +0200 Subject: [PATCH 032/118] Point to component used in recorder (#3712) * Update recorder.markdown * It's a platform and not a component --- source/_components/recorder.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/recorder.markdown b/source/_components/recorder.markdown index b96abb90a48..49117b4974e 100644 --- a/source/_components/recorder.markdown +++ b/source/_components/recorder.markdown @@ -52,8 +52,8 @@ recorder: - weblink - updater entities: - - sun.sun # Don't record sun data - - sensor.last_boot + - sun.sun # Don't record sun data + - sensor.last_boot # Comes from 'systemmonitor' sensor platform - sensor.date ``` From 99cf2c5e8ca24ecae241575f9e3d2962f20ab4cf Mon Sep 17 00:00:00 2001 From: Hugo Gresse Date: Mon, 23 Oct 2017 16:08:09 +0200 Subject: [PATCH 033/118] Maybe fix SQL indentation in warning node (#3668) --- source/_components/sensor.onewire.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.onewire.markdown b/source/_components/sensor.onewire.markdown index 19396863493..aaa616d8dab 100644 --- a/source/_components/sensor.onewire.markdown +++ b/source/_components/sensor.onewire.markdown @@ -37,12 +37,12 @@ When an interface adapter is used, sensors can be accessed on Linux hosts via [o This component has been modified to work with devices with multiple sensors which will cause a discontinuity in recorded values. Existing devices will receive a new ID and therefore show up as new devices. If you wish to maintain continuity it can be resolved in the database by renaming the old devices to the new names. -Connect to your database using the instructions from [home-assistant.io/docs/backend/database/](https://home-assistant.io/docs/backend/database/). Check the names of sensors: +Connect to your database using the instructions from [home-assistant.io/docs/backend/database/](https://home-assistant.io/docs/backend/database/). Check the names of sensors: ```sql SELECT entity_id, COUNT(*) as count FROM states GROUP BY entity_id ORDER BY count DESC LIMIT 10; ``` -Alter the names of sensors using the following examples: +Alter the names of sensors using the following examples: ```sql UPDATE states SET entity_id='sensor._temperature' WHERE entity_id LIKE 'sensor.%' AND attributes LIKE '%\u00b0C%'; From 7b11c0b70cb41016870335e81e9180ceb671ca56 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 23 Oct 2017 18:19:14 +0200 Subject: [PATCH 034/118] Update for 0.56.2 (#3736) --- _config.yml | 6 +++--- source/_posts/2017-10-21-release-56.markdown | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/_config.yml b/_config.yml index fb78ca7c0c5..60aeac7847b 100644 --- a/_config.yml +++ b/_config.yml @@ -140,11 +140,11 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 56 -current_patch_version: 1 -date_released: 2017-10-22 +current_patch_version: 2 +date_released: 2017-10-23 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. # Major release: -patch_version_notes: "#release-0561---october-22" +patch_version_notes: "#release-0562---october-23" # Minor release (Example #release-0431---april-25): diff --git a/source/_posts/2017-10-21-release-56.markdown b/source/_posts/2017-10-21-release-56.markdown index 2f228c63872..593d4ef1f98 100644 --- a/source/_posts/2017-10-21-release-56.markdown +++ b/source/_posts/2017-10-21-release-56.markdown @@ -58,6 +58,13 @@ Why not observe your [Travis CI](https://travis-ci.org) jobs with Home Assistant - Fix device update / entity_id with names ([@pvizeli] - [#10029]) - fix temperature/humidity sensors valid values ([@bieniu] - [#10024]) ([sensor.xiaomi_aqara docs]) +## {% linkable_title 0.56.2 - October 23 %} + +- Fix gateway illumination sensor value ([@bieniu] - [#10045]) ([sensor.xiaomi_aqara docs]) +- Fix device update/`entity_id` with names ([@rytilahti] - [#10053]) ([switch.tplink docs]) +- Remove warning component / Update event trigger for UI created ([@pvizeli] - [#10060]) + + ## {% 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 9569df30c0c7fb722ac9383c2ab5c245afc59437 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 23 Oct 2017 19:27:07 +0200 Subject: [PATCH 035/118] Fix link --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 60aeac7847b..1c6a0ee81c4 100644 --- a/_config.yml +++ b/_config.yml @@ -146,5 +146,5 @@ date_released: 2017-10-23 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. # Major release: -patch_version_notes: "#release-0562---october-23" +patch_version_notes: "#0562---october-23" # Minor release (Example #release-0431---april-25): From ab83497d1a3804c9f296462547cedc5e6b4d1bf7 Mon Sep 17 00:00:00 2001 From: DubhAd Date: Mon, 23 Oct 2017 19:04:07 +0100 Subject: [PATCH 036/118] updated docs to add path details --- source/_components/google_assistant.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown index 8d54e38324f..4a2d6e8a0be 100644 --- a/source/_components/google_assistant.markdown +++ b/source/_components/google_assistant.markdown @@ -62,8 +62,8 @@ homeassistant: ### {% linkable_title Setup %} -1. Install the [gactions CLI](https://developers.google.com/actions/tools/gactions-cli) (you'll use this later) -2. Create a new file named `project.json` and replace the `[YOUR HOME ASSISTANT URL]` below with the URL you use to access Home Assistant. +1. Install the [gactions CLI](https://developers.google.com/actions/tools/gactions-cli) (you'll use this later) - you can download this anywhere, just remember where you put it for later (and don't forget to run `chmod +x gactions`) +2. Create a new file named `project.json` (in the same directory you downloaded `gactions` to) and replace the `[YOUR HOME ASSISTANT URL]` below with the URL you use to access Home Assistant. Note: This must be an HTTPS URL to work. ```json @@ -91,7 +91,7 @@ homeassistant: 2. Go to Build under the Actions SDK box 3. Copy the command that looks like: `gactions update --action_package PACKAGE_NAME --project doctest-2d0b8` -4. Replace `PACKAGE_NAME` with `project.json` and run that command from the same directory you saved `project.json` in. It should output a URL like `https://console.actions.google.com/project/doctest-2d0b8/overview` Go there. +4. Replace `PACKAGE_NAME` with `project.json` and run that command from the same directory you saved `project.json` in (you'll need to put `./` before `gactions` so that it reads `./gactions`). It should output a URL like `https://console.actions.google.com/project/doctest-2d0b8/overview` - go there. 5. You'll need to fill out most of the information on that page, but none of it really matters since you won't be addressing the App directly, only through the Smart Home functionality built into Google Assistant. 6. The final item on that page `Account linking` is required for your app to interact with Home Assistant. 1. Grant type: `Implicit` From 62685b56b3a6b102f5526c6fe059881a7c294f4a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 23 Oct 2017 21:49:46 +0200 Subject: [PATCH 037/118] Add PRs --- source/_posts/2017-10-21-release-56.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_posts/2017-10-21-release-56.markdown b/source/_posts/2017-10-21-release-56.markdown index 593d4ef1f98..97699b6b47d 100644 --- a/source/_posts/2017-10-21-release-56.markdown +++ b/source/_posts/2017-10-21-release-56.markdown @@ -357,6 +357,9 @@ Experiencing issues introduced by this release? Please report them in our [issue [#9959]: https://github.com/home-assistant/home-assistant/pull/9959 [#9963]: https://github.com/home-assistant/home-assistant/pull/9963 [#9997]: https://github.com/home-assistant/home-assistant/pull/9997 +[#10045]: https://github.com/home-assistant/home-assistant/pull/10045 +[#10053]: https://github.com/home-assistant/home-assistant/pull/10053 +[#10060]: https://github.com/home-assistant/home-assistant/pull/10060 [@Bahnburner]: https://github.com/Bahnburner [@Boltgolt]: https://github.com/Boltgolt [@ChristianKuehnel]: https://github.com/ChristianKuehnel From 57c29938c35d4506ba7ab1d7f23a062533966097 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 23 Oct 2017 22:18:08 +0200 Subject: [PATCH 038/118] Add Android IP Webcam docs --- .../camera.android_ip_webcam.markdown | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 source/_components/camera.android_ip_webcam.markdown diff --git a/source/_components/camera.android_ip_webcam.markdown b/source/_components/camera.android_ip_webcam.markdown new file mode 100644 index 00000000000..04c6e41d8e8 --- /dev/null +++ b/source/_components/camera.android_ip_webcam.markdown @@ -0,0 +1,27 @@ +--- +layout: page +title: "Android IP Webcam Camera" +description: "Instructions how to integrate Android IP Webcam cameras within Home Assistant." +date: 2015-07-11 0:36 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Camera +logo: android_ip_webcam.png +ha_release: "0.40" +ha_iot_class: "Local Polling" +--- + + +The `android_ip_webcam` component adds a camera by default if you choose not to use the component but still want to see the video feed then the [`mjpeg` camera](/components/camera.mjpeg/) platform can be used. + +To enable only the camera in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +camera: + - platform: mjpeg + mjpeg_url: http://IP_ADDRESS:8080/video +``` + From 7e426154917dce2e9ff057651c42c4e30560c376 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 23 Oct 2017 22:43:49 +0200 Subject: [PATCH 039/118] Add example --- source/_components/android_ip_webcam.markdown | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/source/_components/android_ip_webcam.markdown b/source/_components/android_ip_webcam.markdown index 2823143f968..5a62ccefdeb 100644 --- a/source/_components/android_ip_webcam.markdown +++ b/source/_components/android_ip_webcam.markdown @@ -15,7 +15,7 @@ ha_iot_class: "Local Polling" The `android_ip_webcam` component turns an Android phone into a network camera with multiple viewing options. -It's setup as an M-JPEG camera and all settings as switches inside of Home Assistant. You can also expose the sensors. If you have multiple phones, you can use all options inside a list. +It's setup as an MJPEG camera and all settings as switches inside of Home Assistant. You can also expose the sensors. If you have multiple phones, you can use all options inside a list. To set it up, download [the IP Webcam app][app], and add the following information to your `configuration.yaml` file: @@ -49,7 +49,7 @@ Sensors: - motion - pressure -Settings: +Settings (Switches): - exposure_lock - ffc @@ -61,4 +61,37 @@ Settings: - whitebalance_lock - video_recording +## {% linkable_title Full example %} + +```yaml +# Example configuration.yaml entry +android_ip_webcam: + - host: 192.168.1.202 + port: 8000 + sensors: + - audio_connections + - battery_level + - battery_temp + - battery_voltage + - light + - motion + - pressure + switches: + - exposure_lock + - ffc + - focus + - gps_active + - night_vision + - overlay + - torch + - whitebalance_lock + - video_recording + - host: 192.168.1.203 + port: 8000 + sensors: + - light + switches: + - torch +``` + [app]: https://play.google.com/store/apps/details?id=com.pas.webcam From 31a9197ae1c37ec1a83d36c24468c609ae38312b Mon Sep 17 00:00:00 2001 From: Taylor Peet Date: Mon, 23 Oct 2017 23:44:52 -0700 Subject: [PATCH 040/118] Readability changes to min max sensor docs (#3749) --- source/_components/sensor.min_max.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_components/sensor.min_max.markdown b/source/_components/sensor.min_max.markdown index ec6907c1ca5..db4db382a48 100644 --- a/source/_components/sensor.min_max.markdown +++ b/source/_components/sensor.min_max.markdown @@ -14,9 +14,9 @@ ha_release: "0.31" --- -The `min_max` sensor platform is consuming the state from other sensors and determine the minimum, maximum, and the mean of the collected states. The sensor will always show you the highest/lowest value which was received from your all monitored sensors. If you have spikes in your values, it's recommended filter/equalize your values with a [statistics sensor](/components/sensor.statistics/) first. +The `min_max` sensor platform consumes the state from other sensors to determine the minimum, maximum, and the mean of the collected states. The sensor will always show you the lowest/highest value which was received from all monitored sensors. If you have spikes in your values, it's recommended to filter/equalize your values with a [statistics sensor](/components/sensor.statistics/) first. -It's an alternative to the [template sensor](/components/sensor.template/)'s `value_template:` to get the average of multiple sensors. +This sensor is an alternative to the [template sensor](/components/sensor.template/)'s `value_template:` to get the average of multiple sensors. ```yaml {% raw %}{{ ((float(states.sensor.kitchen_temperature.state) + @@ -25,9 +25,9 @@ It's an alternative to the [template sensor](/components/sensor.template/)'s `va }}{% endraw %} ``` -Sensors with an unknown state will be ignored in the calculation. If the unit of measurement of the sensors differs, the `min_max` sensor will go to an error state where the value is `UNKNOWN` and the unit of measurement is `ERR`. +Sensors with an unknown state will be ignored in the calculation. If the unit of measurement of the sensors differs, the `min_max` sensor will go to an error state where the value is `UNKNOWN` and unit of measurement is `ERR`. -To enable the minimum/maximum sensor, add the following lines to your `configuration.yaml`: +To enable the `min_max` sensor, add the following lines to your `configuration.yaml`: ```yaml # Example configuration.yaml entry From 0170ff3909088f386286248efc74f7015575abed Mon Sep 17 00:00:00 2001 From: Taylor Peet Date: Mon, 23 Oct 2017 23:59:26 -0700 Subject: [PATCH 041/118] Fix unintended typo in Bayesian Documentation (#3748) Got distracted and typed before/after instead of below/above --- source/_components/binary_sensor.bayesian.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/binary_sensor.bayesian.markdown b/source/_components/binary_sensor.bayesian.markdown index d344cb9ae1f..e8398c02869 100644 --- a/source/_components/binary_sensor.bayesian.markdown +++ b/source/_components/binary_sensor.bayesian.markdown @@ -42,7 +42,7 @@ Configuration variables: - **entity_id** (*Required*): Name of the entity to monitor. - **prob_given_true** (*Required*): The probability of the observation occurring, given the event is `true`. - **prob_given_false** (*Optional*): The probability of the observation occurring, given the event is `false` can be set as well. If `prob_given_false` is not set, it will default to `1 - prob_given_true`. - - **platform** (*Required*): The only supported observation platforms are `state` and `numeric_state`, which are modeled after their corresponding triggers for automations, requiring `before` and/or `after` instead of `to_state`. + - **platform** (*Required*): The only supported observation platforms are `state` and `numeric_state`, which are modeled after their corresponding triggers for automations, requiring `below` and/or `above` instead of `to_state`. - **to_state** (*Required*): The target state. ## {% linkable_title Full examples %} From 81229e695ec8809b85768d8432a5feb4da25481f Mon Sep 17 00:00:00 2001 From: Taylor Peet Date: Tue, 24 Oct 2017 00:00:18 -0700 Subject: [PATCH 042/118] Readability updates to statistics sensor docs (#3750) --- source/_components/sensor.statistics.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.statistics.markdown b/source/_components/sensor.statistics.markdown index d37adc192fa..01abb92ca24 100644 --- a/source/_components/sensor.statistics.markdown +++ b/source/_components/sensor.statistics.markdown @@ -14,7 +14,7 @@ ha_release: "0.30" --- -The `statistics` sensor platform is consuming the state from other sensors. Beside the maximal and the minimal value also the total, the mean, the median, the variance, and the standard deviation are as attributes available. If it's a binary sensor then only the state changes are counted. +The `statistics` sensor platform consumes the state from other sensors. Besides the maximum and the minimum values, the total, mean, median, variance and the standard deviation are also available as attributes. If it's a binary sensor then only state changes are counted. If you are running the [recorder](/components/recorder/) component, on startup the data is read from the database. So after a restart of the platform, you will immediately have data available. If you're using the [history](/components/history/) component, this will automatically also start the recoder component on startup. If you are *not* running the `recorder` component, it can take time till the sensor starts to work because a couple of attributes need more than one value to do the calculation. From 2e5aaeac299dc21b27ce6d9930b859df8499e47f Mon Sep 17 00:00:00 2001 From: DubhAd Date: Tue, 24 Oct 2017 08:02:15 +0100 Subject: [PATCH 043/118] Updating Z-Wave links Updating the navigation links for Z-Wave --- source/_includes/asides/docs_navigation.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_includes/asides/docs_navigation.html b/source/_includes/asides/docs_navigation.html index cd1fb5c0601..98b5ef661c7 100644 --- a/source/_includes/asides/docs_navigation.html +++ b/source/_includes/asides/docs_navigation.html @@ -93,8 +93,10 @@
  • {% active_link /docs/z-wave/ Z-Wave %}
      +
    • {% active_link /docs/z-wave/adding/ Adding devices %}
    • +
    • {% active_link /docs/z-wave/control-panel/ The Z-Wave control panel %}
    • {% active_link /docs/z-wave/controllers/ Controllers %}
    • -
    • {% active_link /docs/z-wave/settings/ Modifying Settings %}
    • +
    • {% active_link /docs/z-wave/devices/ Devices %}
    • {% active_link /docs/z-wave/device-specific/ Device Specific %}
  • From a8e9628ea1ccb1caad595c0188caf4c0092b1905 Mon Sep 17 00:00:00 2001 From: jvimont Date: Tue, 24 Oct 2017 09:51:50 +0200 Subject: [PATCH 044/118] Add info in connection problem section --- source/_components/xiaomi_aqara.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/xiaomi_aqara.markdown b/source/_components/xiaomi_aqara.markdown index 7ebc568b642..373d9c3d99b 100644 --- a/source/_components/xiaomi_aqara.markdown +++ b/source/_components/xiaomi_aqara.markdown @@ -178,3 +178,4 @@ That means that Home Assistant is not getting any response from your Xiaomi gate - Try to set `discovery_retry: 10`. - Try to disable and then enable LAN access. - Hard reset the gateway: Press the button of the gateway 30 seconds and start again from scratch. +- If you are using Home Assistant in Docker, use --net=host in your docker run. From 2b35483d7677793bef8aa39425d592593a9688d7 Mon Sep 17 00:00:00 2001 From: ntalekt Date: Tue, 24 Oct 2017 02:16:38 -0700 Subject: [PATCH 045/118] added note: type names differ from entity names (#3746) * added note: type names differ from entity names * Minor changes --- .../_components/sensor.systemmonitor.markdown | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/source/_components/sensor.systemmonitor.markdown b/source/_components/sensor.systemmonitor.markdown index 3ec9bbcb338..283e302217f 100644 --- a/source/_components/sensor.systemmonitor.markdown +++ b/source/_components/sensor.systemmonitor.markdown @@ -35,30 +35,38 @@ Configuration variables: The table contains types and their argument to use in your `configuration.yaml` file. -| Type (`type:`) | Argument (`arg:`) | +| Type (`type:`) | Argument (`arg:`) | +| :------------------ |:--------------------------| +| disk_use_percent | Path, eg. `/` | +| disk_use | Path, eg. `/` | +| disk_free | Path, eg. `/` | +| memory_use_percent | | +| memory_use | | +| memory_free | | +| swap_use_percent | | +| swap_use | | +| swap_free | | +| load_1m | | +| load_5m | | +| load_15m | | +| network_in | Interface, eg. `eth0` | +| network_out | Interface, eg. `eth0` | +| packets_in | Interface, eg. `eth0` | +| packets_out | Interface, eg. `eth0` | +| ipv4_address | Interface, eg. `eth0` | +| ipv6_address | Interface, eg. `eth0` | +| processor_use | | +| process | Binary, e.g. `octave-cli` | +| last_boot | | +| since_last_boot | | + +**Note**: Some `type:` names used in the `configuration.yaml` file differ from the entity names. + +| Sensor type | Entity ID | | :------------------ |:-------------------------| -| disk_use_percent | Path, eg. `/` | -| disk_use | Path, eg. `/` | -| disk_free | Path, eg. `/` | -| memory_use_percent | | -| memory_use | | -| memory_free | | -| swap_use_percent | | -| swap_use | | -| swap_free | | -| load_1m | | -| load_5m | | -| load_15m | | -| network_in | Interface, eg. `eth0` | -| network_out | Interface, eg. `eth0` | -| packets_in | Interface, eg. `eth0` | -| packets_out | Interface, eg. `eth0` | -| ipv4_address | Interface, eg. `eth0` | -| ipv6_address | Interface, eg. `eth0` | -| processor_use | | -| process | Binary, eg. `octave-cli` | -| last_boot | | -| since_last_boot | | +| memory_free | sensor.ram_available | +| memory_use_percent | sensor.ram_used | +| processor_use | sensor.cpu_used | ## {% linkable_title Linux specific %} From eb399abbad8e07fbe58b45ede8fb6fe1f1bf5ece Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 24 Oct 2017 11:17:27 +0200 Subject: [PATCH 046/118] Update toon docs (#3752) --- source/_components/climate.toon.markdown | 2 +- source/_components/sensor.toon.markdown | 2 +- source/_components/switch.toon.markdown | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/climate.toon.markdown b/source/_components/climate.toon.markdown index 78bd06be1ca..6822b9038c5 100644 --- a/source/_components/climate.toon.markdown +++ b/source/_components/climate.toon.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Toon" +title: "Toon Climate" description: "Instructions how to integrate Toon Climate devices within Home Assistant." date: 2017-10-21 12:00 sidebar: true diff --git a/source/_components/sensor.toon.markdown b/source/_components/sensor.toon.markdown index 54a069b0cc3..79e04e8202c 100644 --- a/source/_components/sensor.toon.markdown +++ b/source/_components/sensor.toon.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Toon" +title: "Toon Sensor" description: "Instructions how to integrate Toon Climate devices within Home Assistant." date: 2017-10-21 12:00 sidebar: true diff --git a/source/_components/switch.toon.markdown b/source/_components/switch.toon.markdown index 679ce3aa787..ffc63e22e2b 100644 --- a/source/_components/switch.toon.markdown +++ b/source/_components/switch.toon.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Toon" +title: "Toon Switch" description: "Instructions how to integrate Toon Climate devices within Home Assistant." date: 2017-10-21 12:00 sidebar: true From d713d82b42626fd85c7a6472de4ee07a07304458 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 24 Oct 2017 11:21:01 +0200 Subject: [PATCH 047/118] Add link to Docker docs --- source/_components/xiaomi_aqara.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/xiaomi_aqara.markdown b/source/_components/xiaomi_aqara.markdown index 373d9c3d99b..0dc1b12dcc3 100644 --- a/source/_components/xiaomi_aqara.markdown +++ b/source/_components/xiaomi_aqara.markdown @@ -178,4 +178,4 @@ That means that Home Assistant is not getting any response from your Xiaomi gate - Try to set `discovery_retry: 10`. - Try to disable and then enable LAN access. - Hard reset the gateway: Press the button of the gateway 30 seconds and start again from scratch. -- If you are using Home Assistant in Docker, use --net=host in your docker run. +- If you are using Home Assistant in [Docker](/docs/installation/docker/), make sure to use `--net=host`. From 46889a59c2625efec462e9fa9b349eebcb8962af Mon Sep 17 00:00:00 2001 From: DubhAd Date: Tue, 24 Oct 2017 11:36:41 +0100 Subject: [PATCH 048/118] Fixing some tabs that snuck in --- source/_docs/z-wave/entities.markdown | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/source/_docs/z-wave/entities.markdown b/source/_docs/z-wave/entities.markdown index 0d48e989d66..79bcc03045d 100644 --- a/source/_docs/z-wave/entities.markdown +++ b/source/_docs/z-wave/entities.markdown @@ -29,11 +29,11 @@ Devices (usually sensors) that support the Alarm command class will create entit - **alarm_type**: Reports the type of the sensor - **0**: General purpose - - **1**: Smoke sensor - - **2**: Carbon Monoxide (CO) sensor - - **3**: Carbon Dioxide (CO2) sensor - - **4**: Heat sensor - - **5**: Water leak sensor + - **1**: Smoke sensor + - **2**: Carbon Monoxide (CO) sensor + - **3**: Carbon Dioxide (CO2) sensor + - **4**: Heat sensor + - **5**: Water leak sensor - **6**: Access control ### {% linkable_title Alarm Level %} @@ -114,10 +114,10 @@ The meaning of the `alarm_level` entity depends on the nature of the alarm senso ### {% linkable_title Access Control %} - **access_control**: These *may* vary between brands - - **22**: Open - - **23**: Closed - - **254**: Deep sleep - - **255**: Case open + - **22**: Open + - **23**: Closed + - **254**: Deep sleep + - **255**: Case open If your device has an `access_control` entity, but not a `binary_sensor` equivalent, you can use a [template binary sensor](omponents/binary_sensor.template/) to create one: @@ -140,13 +140,13 @@ sensor: - **burglar**: These *may* vary between brands - **0**: Not active - - **2**: Smoke (?) - - **3**: Tamper - - **8**: Motion - - **22**: Open - - **23**: Closed - - **254**: Deep sleep - - **255**: Case open + - **2**: Smoke (?) + - **3**: Tamper + - **8**: Motion + - **22**: Open + - **23**: Closed + - **254**: Deep sleep + - **255**: Case open If your device has an `burglar` entity, but not a `binary_sensor` equivalent, you can use a [template binary sensor](omponents/binary_sensor.template/) to create one: From 18fcb411b15ad235174627c0c2de9c4348d7d535 Mon Sep 17 00:00:00 2001 From: DubhAd Date: Tue, 24 Oct 2017 11:39:54 +0100 Subject: [PATCH 049/118] And some missing raw tags --- source/_docs/z-wave/entities.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_docs/z-wave/entities.markdown b/source/_docs/z-wave/entities.markdown index 79bcc03045d..a8d7c5eea7b 100644 --- a/source/_docs/z-wave/entities.markdown +++ b/source/_docs/z-wave/entities.markdown @@ -129,11 +129,11 @@ sensor: sensor_class: opening friendly_name: "Friendly name here" value_template: >- - {%- if is_state('sensor.YOUR_SENSOR_access_control', '22') -%} + {% raw %}{%- if is_state('sensor.YOUR_SENSOR_access_control', '22') -%} open {%- else -%} closed - {%- endif -%} + {%- endif -%}{% endraw %} ``` ### {% linkable_title Burglar %} @@ -157,12 +157,12 @@ sensor: YOUR_SENSOR: sensor_class: motion friendly_name: "Friendly name here" - value_template: >- - {%- if is_state('sensor.YOUR_SENSOR_burglar', '8') -%} + value_template: >- + {% raw %}{%- if is_state('sensor.YOUR_SENSOR_burglar', '8') -%} on {%- else -%} off - {%- endif -%} + {%- endif -%}{% endraw %} ``` ### {% linkable_title Source Node ID %} From ae0e2321dce13cb83e6f3a34f5b7c8ab68de1941 Mon Sep 17 00:00:00 2001 From: adamp237 Date: Tue, 24 Oct 2017 23:30:15 +1030 Subject: [PATCH 050/118] Change 'set_fanspeed' to 'set_fan_speed' (#3755) I tried creating a script using set_fanspeed. After much trial and error, it worked when I used set_fan_speed. Suggest this page is updated. --- source/_components/vacuum.xiaomi_miio.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/vacuum.xiaomi_miio.markdown b/source/_components/vacuum.xiaomi_miio.markdown index 884d840339f..b702071e60a 100644 --- a/source/_components/vacuum.xiaomi_miio.markdown +++ b/source/_components/vacuum.xiaomi_miio.markdown @@ -25,7 +25,7 @@ Currently supported features are: - `turn_off` (stop all activity and return to dock) - `locate` - `clean_spot` -- `set_fanspeed` +- `set_fan_speed` - remote control of your robot. Please follow [Retrieving the Access Token](/components/vacuum.xiaomi_miio/#retrieving-the-access-token) to retrieve the API token used in @@ -52,7 +52,7 @@ Configuration variables: In addition to [all of the services provided by the `vacuum` component] ]) (`turn_on`, `turn_off`, `start_pause`, `stop`, `return_to_home`, `locate`, -`set_fanspeed` and `send_command`), the `xiaomi` platform introduces specific +`set_fan_speed` and `send_command`), the `xiaomi` platform introduces specific services to access the remote control mode of the robot. These are: - `xiaomi_remote_control_start` From 5e20b56f83556c3849e2831e3fffb5f9a6efdb2c Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Wed, 25 Oct 2017 06:10:35 +1100 Subject: [PATCH 051/118] Update the RFLink Docs to read better (#3758) Makes some slight adjustments to the RFLink component documentation to remove some grammer and spelling mistakes. Alos changes the domain which the docs point to, as the domain name mentioned has been moved. --- source/_components/rflink.markdown | 34 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/source/_components/rflink.markdown b/source/_components/rflink.markdown index 3df73deaf35..26515b5f8c3 100644 --- a/source/_components/rflink.markdown +++ b/source/_components/rflink.markdown @@ -12,17 +12,17 @@ ha_category: Hub ha_release: 0.38 --- -The `rflink` component support devices that use [RFLink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo RFLink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). RFLink gateway is an Arduino Mega firmware that allows two-way communication with a multitude of RF wireless devices using cheap hardware (Arduino + transceiver). +The `rflink` component supports devices that use [RFLink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo RFLink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). RFLink Gateway is an Arduino Mega firmware that allows two-way communication with a multitude of RF wireless devices using cheap hardware (Arduino + transceiver). The 433 MHz spectrum is used by many manufacturers mostly using their own protocol/standard and includes devices like: light switches, blinds, weather stations, alarms and various other sensors. -RFLink Gateway supports a number of RF frequencies, using a wide range of low-cost hardware. Their website provides details for various RF transmitter, receiver and transceiver modules for 433MHz, 868MHz and 2.4 GHz [here.](http://www.nemcon.nl/blog2/wiring) +RFLink Gateway supports a number of RF frequencies, using a wide range of low-cost hardware. [Their website](http://www.rflink.nl/blog2/) provides details for various RF transmitters, receivers and transceiver modules for 433MHz, 868MHz and 2.4 GHz.

    - Note: Versions later than R44 adds support for Ikea Ansluta, Philips Living Colors Gen1, MySensors devices. + Note: Versions later than R44 add support for Ikea Ansluta, Philips Living Colors Gen1 and MySensors devices.

    -A complete list of devices supported by RFLink can be found [here](http://www.nemcon.nl/blog2/devlist) +A complete list of devices supported by RFLink can be found [here](http://www.rflink.nl/blog2/devlist). This component is tested with the following hardware/software: @@ -41,7 +41,7 @@ Configuration variables: - **port** (*Required*): The path to RFLink USB/serial device or TCP port in TCP mode. - **host** (*Optional*): Switches to TCP mode, connects to host instead of to USB/serial. - **wait_for_ack** (*Optional*): Wait for RFLink to acknowledge commands sent before sending new command (slower but more reliable). Defaults to `True` -- **ignore_devices** (*Optional*): List of devices id's to ignore. Supports wildcards (*) at the end. +- **ignore_devices** (*Optional*): List of device id's to ignore. Supports wildcards (*) at the end. - **reconnect_interval** (*Optional*): Time in seconds between reconnect attempts. Complete example: @@ -58,7 +58,7 @@ rflink: ### {% linkable_title TCP mode %} -TCP mode allows connect to a RFLink device over TCP/IP network. This is for example useful if placing the RFLink device next to the HA server is not optimal or desired (eg: bad reception). +TCP mode allows you to connect to an RFLink device over a TCP/IP network. This is useful if placing the RFLink device next to the HA server is not optimal or desired (eg: bad reception). To expose the USB/serial interface over TCP on a different host (Linux) the following command can be used: @@ -71,7 +71,7 @@ Other methods of exposing the serial interface over TCP are possible (eg: ESP826 Tested with Wifi serial bridge [esp-link V2.2.3](https://github.com/jeelabs/esp-link/releases/tag/v2.2.3) running on a NodeMCU (ESP8266 Wifi module) with ESP8266 TXD0 (pin D10) and RXD0 (pin D9) connected to Arduino MEGA 2560 RX (Pin 2) and TX (Pin 3) respectively.

    -Due to different logic levels, a voltage level shifter is required between the 3.3V NodeMCU and 5V Arduino MEGA 2560 pins. The BSS138 bidirectional logic level converter has been tested for serial pins and the [link](https://www.aliexpress.com/item/8CH-IIC-I2C-Logic-Level-Converter-Bi-Directional-Module-DC-DC-5V-to-3-3V-Setp/32238089139.html) is recommended for the CC2500 transceiver (used for Ikea Ansluta and Living Colors) +Due to different logic levels, a voltage level shifter is required between the 3.3V NodeMCU and 5V Arduino MEGA 2560 pins. The BSS138 bidirectional logic level converter has been tested for serial pins and the [link](https://www.aliexpress.com/item/8CH-IIC-I2C-Logic-Level-Converter-Bi-Directional-Module-DC-DC-5V-to-3-3V-Setp/32238089139.html) is recommended for the CC2500 transceiver (used for Ikea Ansluta and Philips Living Colors)

    @@ -87,7 +87,7 @@ rflink: ### {% linkable_title Adding devices Automatically %} -In order to have your devices being detected and added automatically, you need to add the following to the configuration. +In order to have your devices discovered automatically, you need to add the following to the configuration. When pressing the button on the physical remote, RFLink detects the signal and the device should be added automatically to Home Assistant. ```yaml @@ -104,7 +104,7 @@ sensor: ### {% linkable_title Ignoring devices %} -RFLink platform can be configured to completely ignore a device on a platform level. This is useful when you have neighbors which also use 433 MHz technology. +The RFLink platform can be configured to completely ignore a device on a platform level. This is useful when you have neighbors which also use 433 MHz technology. For example: @@ -121,7 +121,9 @@ rflink: This configuration will ignore the button `1` of the `newkaku` device with ID `000001`, all devices of the `digitech` protocol and all switches of the `kaku` protocol device with codewheel ID `1`. -Wildcards only work at the end of the ID, not in the middle of front! +

    +Wildcards only work at the end of the ID, not in the middle or front! +

    ### {% linkable_title Device support %} @@ -129,16 +131,16 @@ Even though a lot of devices are supported by RFLink, not all have been tested/i ### {% linkable_title Device Incorrectly Identified %} -If you find a device is recognized differently, with different protocols or the ON OFF is swapped or detected as two ON commands, it can be overcome with the RFLink 'RF Signal Learning' mechanism from RFLink Rev 46 (11 March 2017). [Link to further detail.](http://www.nemcon.nl/blog2/faq#RFFind) +If you find a device is recognized differently, with different protocols or the ON OFF is swapped or detected as two ON commands, it can be overcome with the RFLink 'RF Signal Learning' mechanism from RFLink Rev 46 (11 March 2017). [Link to further detail.](http://www.rflink.nl/blog2/faq#RFFind) -### {% linkable_title Technical overview %} +### {% linkable_title Technical Overview %} -- The`rflink` Python module a asyncio transport/protocol is setup that fires an callback for every (valid/supported) packet received by the RFLink gateway. -- This component uses this callback to distribute 'rflink packet events' over Home Assistant's bus which can be subscribed to by entities/platform implementations. -- The platform implementation takes care of creating new devices (if enabled) for unseen incoming packet id's. +- The`rflink` Python module is a asyncio transport/protocol which is setup to fire a callback for every (valid/supported) packet received by the RFLink gateway. +- This component uses this callback to distribute 'rflink packet events' over [Home Assistant's event bus](https://home-assistant.io/docs/configuration/events/) which can be subscribed to by entities/platform implementations. +- The platform implementation takes care of creating new devices (if enabled) for unseen incoming packet ID's. - Device entities take care of matching to the packet ID, interpreting and performing actions based on the packet contents. Common entity logic is maintained in this main component. -### {% linkable_title Debug logging %} +### {% linkable_title Debug Logging %} For debugging purposes or context when investigating issues you can enable debug logging for Rflink with the following config snippet: From 6fafd3ebaf930f52937a222a229b29a766d48e14 Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Wed, 25 Oct 2017 06:12:33 +1100 Subject: [PATCH 052/118] Update MQTT docs for consistency (#3759) Makes some updates to the MQTT docs pages for spelling and grammar, and also consistency. --- source/_components/climate.mqtt.markdown | 2 +- source/_components/cover.mqtt.markdown | 2 +- source/_components/fan.mqtt.markdown | 6 +++--- source/_components/light.mqtt.markdown | 10 +++++----- source/_components/lock.mqtt.markdown | 8 ++++---- source/_components/notify.mqtt.markdown | 2 +- source/_components/switch.mqtt.markdown | 12 ++++++------ source/_components/vacuum.mqtt.markdown | 2 +- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/source/_components/climate.mqtt.markdown b/source/_components/climate.mqtt.markdown index 162acec8257..bde12c97ccd 100644 --- a/source/_components/climate.mqtt.markdown +++ b/source/_components/climate.mqtt.markdown @@ -13,7 +13,7 @@ ha_release: 0.55 ha_iot_class: "Local Polling" --- -The `mqtt` climate platform let you control your MQTT enabled HVAC devices. +The `mqtt` climate platform lets you control your MQTT enabled HVAC devices. The platform currently works in optimistic mode, which means it does not obtain states from MQTT topics, but it sends and remembers control commands. diff --git a/source/_components/cover.mqtt.markdown b/source/_components/cover.mqtt.markdown index fb501ea9bae..e466514cadd 100755 --- a/source/_components/cover.mqtt.markdown +++ b/source/_components/cover.mqtt.markdown @@ -65,7 +65,7 @@ Configuration variables: ## {% linkable_title Examples %} -In this section you find some real life examples of how to use this platform. +In this section you will find some real life examples of how to use this platform. ### {% linkable_title Full configuration without tilt %} diff --git a/source/_components/fan.mqtt.markdown b/source/_components/fan.mqtt.markdown index 43e2da29363..82c5193ba30 100644 --- a/source/_components/fan.mqtt.markdown +++ b/source/_components/fan.mqtt.markdown @@ -13,9 +13,9 @@ ha_release: 0.27 ha_iot_class: depends --- -The `mqtt` fan platform let you control your MQTT enabled fans. +The `mqtt` fan platform lets you control your MQTT enabled fans. -In an ideal scenario, the MQTT device will have a `state_topic` to publish state changes. If these messages are published with `RETAIN` flag, the MQTT fan will receive an instant state update after subscription and will start with correct state. Otherwise, the initial state of the fan will be `false`. +In an ideal scenario, the MQTT device will have a `state_topic` to publish state changes. If these messages are published with a `RETAIN` flag, the MQTT fan will receive an instant state update after subscription and will start with the correct state. Otherwise, the initial state of the fan will be `false` / `off`. When a `state_topic` is not available, the fan will work in optimistic mode. In this mode, the fan will immediately change state after every command. Otherwise, the fan will wait for state confirmation from the device (message from `state_topic`). @@ -56,7 +56,7 @@ Configuration variables: - **speeds** array (*Optional*): Valid entries for the list are `off`, `low`, `medium`, and `high`.

    -Make sure that your topic is an exact match. `some-topic/` and `some-topic` are different topics. +Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics.

    ## {% linkable_title Examples %} diff --git a/source/_components/light.mqtt.markdown b/source/_components/light.mqtt.markdown index b90de5ae569..26496730b0a 100644 --- a/source/_components/light.mqtt.markdown +++ b/source/_components/light.mqtt.markdown @@ -14,11 +14,11 @@ ha_iot_class: depends The `mqtt` light platform lets you control your MQTT enabled lights. It supports setting brightness, color temperature, effects, flashing, on/off, RGB colors, transitions, XY colors and white values. -In an ideal scenario, the MQTT device will have a state topic to publish state changes. If these messages are published with RETAIN flag, the MQTT light will receive an instant state update after subscription and will start with correct state. Otherwise, the initial state of the switch will be false/off. +In an ideal scenario, the MQTT device will have a state topic to publish state changes. If these messages are published with a `RETAIN` flag, the MQTT light will receive an instant state update after subscription and will start with the correct state. Otherwise, the initial state of the switch will be `false` / `off`. -When a state topic is not available, the light will work in optimistic mode. In this mode, the light will immediately change state after every command. Otherwise, the light will wait for state confirmation from device (message from `state_topic`). +When a state topic is not available, the light will work in optimistic mode. In this mode, the light will immediately change state after every command. Otherwise, the light will wait for state confirmation from the device (message from `state_topic`). -Optimistic mode can be forced, even if state topic is available. Try to enable it, if experiencing incorrect light operation. +Optimistic mode can be forced, even if the `state_topic` is available. Try to enable it, if experiencing incorrect light operation. ```yaml # Example configuration.yml entry @@ -61,7 +61,7 @@ Configuration variables: - **xy_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the XY value.

    - Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. + Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics.

    @@ -83,7 +83,7 @@ Configuration variables: ## {% linkable_title Examples %} -In this section you find some real life examples of how to use this sensor. +In this section you will find some real life examples of how to use this sensor. ### {% linkable_title Brightness and RGB support %} diff --git a/source/_components/lock.mqtt.markdown b/source/_components/lock.mqtt.markdown index d66c4c8c76b..6f91de7d133 100644 --- a/source/_components/lock.mqtt.markdown +++ b/source/_components/lock.mqtt.markdown @@ -13,9 +13,9 @@ ha_release: 0.15 ha_iot_class: depends --- -The `mqtt` lock platform let you control your MQTT enabled locks. +The `mqtt` lock platform lets you control your MQTT enabled locks. -In an ideal scenario, the MQTT device will have a `state_topic` to publish state changes. If these messages are published with `RETAIN` flag, the MQTT lock will receive an instant state update after subscription and will start with correct state. Otherwise, the initial state of the lock will be false/unlocked. +In an ideal scenario, the MQTT device will have a `state_topic` to publish state changes. If these messages are published with a `RETAIN` flag, the MQTT lock will receive an instant state update after subscription and will start with correct state. Otherwise, the initial state of the lock will be `false` / unlocked. When a `state_topic` is not available, the lock will work in optimistic mode. In this mode, the lock will immediately change state after every command. Otherwise, the lock will wait for state confirmation from the device (message from `state_topic`). @@ -43,12 +43,12 @@ Configuration variables: - **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload.

    -Make sure that your topic match exact. `some-topic/` and `some-topic` are different topics. +Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics.

    ## {% linkable_title Examples %} -In this section you find some real life examples of how to use this lock. +In this section you will find some real life examples of how to use this lock. ### {% linkable_title Full configuration %} diff --git a/source/_components/notify.mqtt.markdown b/source/_components/notify.mqtt.markdown index 34b4b8c0d7b..7aefb8743f0 100644 --- a/source/_components/notify.mqtt.markdown +++ b/source/_components/notify.mqtt.markdown @@ -12,7 +12,7 @@ ha_category: Notifications ha_iot_class: depends --- -The MQTT notification support is different than the other [notification](/components/notify/) platforms. It is a service. This means that you don't have to create a configuration entry but you need to provide more details while calling the service. +The MQTT notification support is different than the other [notification](/components/notify/) platforms. It is a service. This means that you don't have to create a configuration entry but you need to provide more details when calling the service. **Call Service** section from the **Developer Tools** allows you to send MQTT messages. Choose *mqtt/publish* from the list of **Available services:** and enter something like the sample below into the **Service Data** field and hit **CALL SERVICE**. diff --git a/source/_components/switch.mqtt.markdown b/source/_components/switch.mqtt.markdown index a32b94b0c2c..4ad0a6c1f87 100644 --- a/source/_components/switch.mqtt.markdown +++ b/source/_components/switch.mqtt.markdown @@ -13,13 +13,13 @@ ha_release: 0.7 ha_iot_class: depends --- -The `mqtt` switch platform let you control your MQTT enabled switch. +The `mqtt` switch platform lets you control your MQTT enabled switches. -In an ideal scenario, the MQTT device will have a `state_topic` to publish state changes. If these messages are published with `RETAIN` flag, the MQTT switch will receive an instant state update after subscription and will start with correct state. Otherwise, the initial state of the switch will be false/off. +In an ideal scenario, the MQTT device will have a `state_topic` to publish state changes. If these messages are published with a `RETAIN` flag, the MQTT switch will receive an instant state update after subscription, and will start with the correct state. Otherwise, the initial state of the switch will be `false` / `off`. -When a `state_topic` is not available, the switch will work in optimistic mode. In this mode, the switch will immediately change state after every command. Otherwise, the switch will wait for state confirmation from device (message from `state_topic`). +When a `state_topic` is not available, the switch will work in optimistic mode. In this mode, the switch will immediately change state after every command. Otherwise, the switch will wait for state confirmation from the device (message from `state_topic`). -Optimistic mode can be forced, even if state topic is available. Try to enable it, if experiencing incorrect switch operation. +Optimistic mode can be forced, even if the `state_topic` is available. Try to enable it, if experiencing incorrect switch operation. To enable this switch in your installation, add the following to your `configuration.yaml` file: @@ -46,12 +46,12 @@ Configuration variables: - **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload.

    -Make sure that your topic match exact. `some-topic/` and `some-topic` are different topics. +Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics.

    ## {% linkable_title Examples %} -In this section you find some real life examples of how to use this sensor. +In this section you will find some real life examples of how to use this sensor. ### {% linkable_title Full configuration %} diff --git a/source/_components/vacuum.mqtt.markdown b/source/_components/vacuum.mqtt.markdown index 34f98401703..df5a01a8cf8 100644 --- a/source/_components/vacuum.mqtt.markdown +++ b/source/_components/vacuum.mqtt.markdown @@ -12,7 +12,7 @@ ha_category: Vacuum ha_release: 0.54 --- -The `mqtt` component allows you to control your MQTT-enabled vacuum. +The `mqtt` vacuum component allows you to control your MQTT-enabled vacuum. To add your MQTT vacuum to your installation, add the following to your `configuration.yaml` file: From 53be7972091c7fb03f0fea5bd6d6f2af4d8782f3 Mon Sep 17 00:00:00 2001 From: Ryan Bahm Date: Tue, 24 Oct 2017 22:25:24 -0700 Subject: [PATCH 053/118] Added some punctuation to the last paragraph (#3770) For greater clarity. --- source/developers/maintenance.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/maintenance.markdown b/source/developers/maintenance.markdown index 0a509231e84..4f48326ceb3 100644 --- a/source/developers/maintenance.markdown +++ b/source/developers/maintenance.markdown @@ -36,7 +36,7 @@ If you update the requirements of a component/platform through the `REQUIREMENTS $ script/gen_requirements_all.py ``` -Start a test run of Home Assistant if that was successful include all files in a Pull Request. Add a short summary of the changes, a sample configuration entry, details about the tests you performed to ensure the update works, and other useful information to the description. +Start a test run of Home Assistant. If that was successful, include all files in a Pull Request. Add a short summary of the changes, a sample configuration entry, details about the tests you performed to ensure the update works, and other useful information to the description. From 1a4cd30b506804b9b4e4b723a4f692e261712e1f Mon Sep 17 00:00:00 2001 From: Nicholas Griffin Date: Wed, 25 Oct 2017 06:34:22 +0100 Subject: [PATCH 054/118] Fixing Typo that was mentioned in #3764 (#3766) --- source/_data/glossary.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_data/glossary.yml b/source/_data/glossary.yml index 1b18f1539de..f1c27b24443 100644 --- a/source/_data/glossary.yml +++ b/source/_data/glossary.yml @@ -5,7 +5,7 @@ - topic: Service description: "[Services](/docs/scripts/service-calls/) are called to perform actions." - topic: Event - description: When somethings happen. + description: When something happens. - topic: Entity description: An entity is the representation of a single device, unit or web service. - topic: Device From b9f47267de416e0c060675decfceb503d225ae89 Mon Sep 17 00:00:00 2001 From: Nicholas Griffin Date: Wed, 25 Oct 2017 07:50:22 +0100 Subject: [PATCH 055/118] Cleaning up some other things in glossary (#3768) * Fixing Typo that was mentioned in #3764 * Cleaning up some other things in glossary As I was making the other commit (#3766) I noticed some other things in the glossary that could be changed. One of the main things is that each example read differently so there was a lot of jumping between how examples were written, I've made them a bit more unified. I also added a bit more explanatory text and added some links as suggested in #3764. I made this a seperate pull because I figured it might be a bit more opinionated than the typo error. * Missed discovery. * Add quotes --- source/_data/glossary.yml | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/source/_data/glossary.yml b/source/_data/glossary.yml index f1c27b24443..d9e75f950af 100644 --- a/source/_data/glossary.yml +++ b/source/_data/glossary.yml @@ -1,42 +1,43 @@ - topic: Platform - description: A platform makes the connection to a specific software or hardware platform. The `pushbullet` platform works with the service from pushbullet.com. + description: "[Platforms](/docs/configuration/platform_options/) make the connection to a specific software or hardware platform. For example, the `pushbullet` platform works with the service pushbullet.com to send notifications." - topic: Component - description: "The components provide the core logic for the functionality in Home Assistant. Like `notify` provides sending notifications." + description: "[Components](/docs/configuration/platform_options/) provide the core logic for the functionality in Home Assistant. Like `notify` provides sending notifications." - topic: Service description: "[Services](/docs/scripts/service-calls/) are called to perform actions." - topic: Event + description: "An [event](/docs/configuration/events/) is when something happens." description: When something happens. - topic: Entity - description: An entity is the representation of a single device, unit or web service. + description: An [entity](/docs/configuration/platform_options/) is the representation of a single device, unit or web service. - topic: Device - description: "Usually this is a physical unit which can do or observe something." + description: "A device is usually a physical unit which can do or observe something." - topic: hass - description: "Often used abbreviation for Home Assistant." + description: "HASS or hass is often used as an abbreviation for Home Assistant." - topic: Discovery - description: The automatic setup of zeroconf/mDNS and uPnP devices after they are discovered. + description: Discovery is the automatic setup of zeroconf/mDNS and uPnP devices after they are discovered. - topic: Groups description: "Groups are a way to organize your entities into a single unit." - topic: Automation - description: "Capability to call a service based on a simple or complex trigger. Automation allows a condition such as sunset to cause an event, such as a light turning on." + description: "[Automations](/docs/automation/) offer the capability to call a service based on a simple or complex trigger. Automation allows a condition such as sunset to cause an event, such as a light turning on." - topic: Trigger - description: "Values or conditions of a platform that are defined to cause an automation to run." + description: "A [trigger](/docs/automation/trigger/) is a set of values or conditions of a platform that are defined to cause an automation to run." - topic: Template - description: "An automation definition can include variables for the service or data from the trigger values. This allows automations to generate dynamic actions." + description: "A [template](/docs/automation/templating/) is an automation definition that can include variables for the service or data from the trigger values. This allows automations to generate dynamic actions." - topic: Script - description: "A component that allows users to specify a sequence of actions to be executed by Home Assistant when turned on" + description: "[Scripts](/docs/scripts/) are components that allow users to specify a sequence of actions to be executed by Home Assistant when turned on" - topic: Scene - description: "You can create scenes that capture the states you want certain entities to be. For example a scene can specify that light A should be turned on and light B should be bright red." + description: "Scenes capture the states you want certain entities to be. For example a scene can specify that light A should be turned on and light B should be bright red." - topic: hassio - description: "An operating system to manage Home Assistant easily using various HASS.io add-ons" + description: see Hass.io - topic: HADashboard - description: "HADashboard is a modular, skinnable dashboard for Home Assistant that is intended to be wall mounted, and is optimized for distance viewing." + description: "[HADashboard](/docs/ecosystem/hadashboard/) is a modular, skinnable dashboard for Home Assistant that is intended to be wall mounted, and is optimized for distance viewing." - topic: Hass.io - description: "Hass.io is an operating system that will take care of installing and updating Home Assistant, is managed from the Home Assistant UI, allows creating/restoring snapshots of your configuration and can easily be extended" + description: "Hass.io is an operating system that will take care of installing and updating Home Assistant, is managed from the Home Assistant UI, allows creating/restoring snapshots of your configuration, and can easily be extended" - topic: Cookbook - description: "Home Assistant configuration examples of the community" + description: "The [Cookbook](/cookbook/) contains a set of configuration examples of Home Assistant from the community" - topic: Packages - description: "Packages allow to bundle different component configuations together." + description: "Packages allow you to bundle different component configuations together." - topic: Customizing - description: "Customization allows overwriting default parameter of the devices in the configuration." + description: "[Customization](/docs/configuration/customizing-devices/) allows you to overwrite the default parameter of your devices in the configuration." - topic: Zones - description: "Area used for presence detection." + description: "Zones are areas that can be used for presence detection." From 14f710f7468445a124d17e0fb2bae62c754b274c Mon Sep 17 00:00:00 2001 From: ntalekt Date: Tue, 24 Oct 2017 23:51:19 -0700 Subject: [PATCH 056/118] Updated: Added missing components (#3761) --- source/_components/discovery.markdown | 70 +++++++++++++++------------ 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/source/_components/discovery.markdown b/source/_components/discovery.markdown index 726da20c46c..62f9c0c1b34 100644 --- a/source/_components/discovery.markdown +++ b/source/_components/discovery.markdown @@ -14,25 +14,29 @@ ha_category: Other Home Assistant can discover and automatically configure [zeroconf](https://en.wikipedia.org/wiki/Zero-configuration_networking)/[mDNS](https://en.wikipedia.org/wiki/Multicast_DNS) and [uPnP](https://en.wikipedia.org/wiki/Universal_Plug_and_Play) devices on your network. Currently the `discovery` component can detect: - * Google Chromecast - * Belkin WeMo switches - * Philips Hue - * Netgear routers - * Plex media server - * Panasonic Viera - * Roku media player - * Sonos Speakers - * Yamaha media player - * Logitech media server (Squeezebox) - * DirecTV - * Apple TV - * Yeelight Sunflower Bulb - * Linn / Openhome - * Denon Network Receivers - * Bose Soundtouch speakers - * Axis Communications security devices - * IKEA Trådfri (Tradfri) - * Harmony Hub + * [Apple TV](https://home-assistant.io/components/apple_tv/) + * [Axis Communications security devices](https://home-assistant.io/components/axis/) + * [Belkin WeMo switches](https://home-assistant.io/components/wemo/) + * [Bluesound speakers](https://home-assistant.io/components/media_player.bluesound/) + * [Bose Soundtouch speakers](https://home-assistant.io/components/media_player.soundtouch/) + * [Denon network receivers](https://home-assistant.io/components/media_player.denonavr/) + * [DirecTV receivers](https://home-assistant.io/components/media_player.directv/) + * [Frontier Silicon internet radios](https://home-assistant.io/components/media_player.frontier_silicon/) + * [Google Cast](https://home-assistant.io/components/media_player.cast/) + * [IKEA Trådfri (Tradfri)](https://home-assistant.io/components/tradfri/) + * [Linn / Openhome](https://home-assistant.io/components/media_player.openhome/) + * [Logitech Harmony Hub](https://home-assistant.io/components/remote.harmony/) + * [Logitech media server (Squeezebox)](https://home-assistant.io/components/media_player.squeezebox/) + * [Netgear routers](https://home-assistant.io/components/device_tracker.netgear/) + * [Panasonic Viera](https://home-assistant.io/components/media_player.panasonic_viera/) + * [Philips Hue](https://home-assistant.io/components/light.hue/) + * [Plex media server](https://home-assistant.io/components/media_player.plex/) + * [Roku media player](https://home-assistant.io/components/media_player.roku/) + * [SABnzbd downloader](https://home-assistant.io/components/sensor.sabnzbd/) + * [Samsung TVs](https://home-assistant.io/components/media_player.samsungtv/) + * [Sonos speakers](https://home-assistant.io/components/media_player.sonos/) + * [Yamaha media player](https://home-assistant.io/components/media_player.yamaha/) + * [Yeelight Sunflower bulb](https://home-assistant.io/components/light.yeelightsunflower/) It will be able to add Google Chromecasts and Belkin WeMo switches automatically, for Philips Hue it will require some configuration from the user. @@ -54,25 +58,27 @@ Valid values for ignore are: * `apple_tv`: Apple TV * `axis`: Axis Communications security devices - * `bluesound` + * `belkin_wemo`: Belkin WeMo switches + * `bluesound`: Bluesound speakers * `bose_soundtouch`: Bose Soundtouch speakers - * `denonavr`: Denon Network Receivers - * `directv`: DirecTV - * `frontier_silicon` - * `google_cast`: Google Chromecast - * `harmony`: Harmony Hub - * `ikea_tradfri`: IKEA Trådfri - * `logitech_mediaserver`: Logitech media server - Squeezebox player - * `openhome`: Linn/Openhome + * `denonavr`: Denon network receivers + * `directv`: DirecTV receivers + * `frontier_silicon`: Frontier Silicon internet radios + * `google_cast`: Google Cast + * `harmony`: Logitech Harmony Hub + * `ikea_tradfri`: IKEA Trådfri (Tradfri) + * `logitech_mediaserver`: Logitech media server (Squeezebox) + * `netgear_router`: Netgear routers + * `openhome`: Linn / Openhome * `panasonic_viera`: Panasonic Viera * `philips_hue`: Philips Hue * `plex_mediaserver`: Plex media server * `roku`: Roku media player - * `sabnzbd` - * `samsung_tv`: Samsung TV - * `sonos`: Sonos Speakers + * `sabnzbd`: SABnzbd downloader + * `samsung_tv`: Samsung TVs + * `sonos`: Sonos speakers * `yamaha`: Yamaha media player - * `yeelight`: Yeelight Sunflower Bulb + * `yeelight`: Yeelight Sunflower bulb

    Home Assistant must be on the same network as the devices for uPnP discovery to work. From 1cf5bddd762ba57bc721b81ae7878d8775442b0e Mon Sep 17 00:00:00 2001 From: DubhAd Date: Wed, 25 Oct 2017 10:53:12 +0100 Subject: [PATCH 057/118] Added setup link for Z-Wave --- source/_includes/asides/docs_navigation.html | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_includes/asides/docs_navigation.html b/source/_includes/asides/docs_navigation.html index 98b5ef661c7..b6c07f6f979 100644 --- a/source/_includes/asides/docs_navigation.html +++ b/source/_includes/asides/docs_navigation.html @@ -93,6 +93,7 @@

  • {% active_link /docs/z-wave/ Z-Wave %}