Date: Sat, 6 Oct 2018 21:25:50 +0200
Subject: [PATCH 023/217] Update sensor.miflora configuration variables (#6559)
---
source/_components/sensor.miflora.markdown | 50 +++++++++++++++++-----
1 file changed, 39 insertions(+), 11 deletions(-)
diff --git a/source/_components/sensor.miflora.markdown b/source/_components/sensor.miflora.markdown
index 405da87721a..db6452c2c5e 100644
--- a/source/_components/sensor.miflora.markdown
+++ b/source/_components/sensor.miflora.markdown
@@ -60,17 +60,45 @@ sensor:
- moisture
```
-- **mac** (*Required*): The MAC address of your sensor.
-- **monitored_conditions** array (*Optional*): The parameters that should be monitored (defaults to monitoring all parameters).
- - **moisture**: Moisture in the soil.
- - **light**: Brightness at the sensor's location.
- - **temperature**: Temperature at the sensor's location.
- - **conductivity**: Conductivity in the soil.
- - **battery**: Battery details.
-- **name** (*Optional*): The name displayed in the frontend.
-- **force_update** (*Optional*): Sends update events even if the value hasn't changed.
-- **median** (*Optional*): Sometimes the sensor measurements show spikes. Using this parameter, the poller will report the median of the last 3 (you can also use larger values) measurements. This filters out single spikes. Median: 5 will also filter double spikes. If you never have problems with spikes, `median: 1` will work fine.
-- **adapter** (*Optional*): Define the Bluetooth adapter to use (defaults to hci0). Run `hciconfig` to get a list of available adapters.
+{% configuration %}
+mac:
+ description: The MAC address of your sensor.
+ required: true
+ type: string
+monitored_conditions:
+ description: The parameters that should be monitored.
+ required: false
+ default: [moisture, light, temperature, conductivity, battery]
+ type: list
+ keys:
+ moisture:
+ description: Moisture in the soil.
+ light:
+ description: Brightness at the sensor's location.
+ temperature:
+ description: Temperature at the sensor's location.
+ conductivity:
+ description: Conductivity in the soil.
+ battery:
+ description: Battery details.
+name:
+ description: The name displayed in the frontend.
+ required: false
+ type: string
+force_update:
+ description: Sends update events even if the value hasn't changed.
+ required: false
+ type: boolean
+median:
+ description: "Sometimes the sensor measurements show spikes. Using this parameter, the poller will report the median of the last 3 (you can also use larger values) measurements. This filters out single spikes. Median: 5 will also filter double spikes. If you never have problems with spikes, `median: 1` will work fine."
+ required: false
+ type: integer
+adapter:
+ description: "Define the Bluetooth adapter to use. Run `hciconfig` to get a list of available adapters."
+ required: false
+ default: hci0
+ type: string
+{% endconfiguration %}
By default the sensor is only polled once every 20 minutes (`scan_interval` is 1200 seconds by default). On a Home Assistant restart sensor will report initial value. If you set `median: 3`, it will take _at least_ 40 minutes before the sensor will report an average value. Keep in mind though that reducing polling intervals will have a negative effect on the battery life.
From 9e5bacd9e91c0d64b2851b7c040f3453d14ab98d Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Sun, 7 Oct 2018 09:02:22 +0200
Subject: [PATCH 024/217] Update Yweather component configuration variable
(#6567)
Update style of Yweather component documentation to follow new configuration variables description.
Related to #6385.
---
source/_components/weather.yweather.markdown | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/source/_components/weather.yweather.markdown b/source/_components/weather.yweather.markdown
index 27bbda8214d..055f9daa0ec 100644
--- a/source/_components/weather.yweather.markdown
+++ b/source/_components/weather.yweather.markdown
@@ -31,15 +31,20 @@ weather:
- platform: yweather
```
-Configuration variables:
-
-- **woeid** (*Optional*): See above.
-- **name** (*Optional*): The name of the sensor. To easily recognize each sensor when adding more than one Yahoo weather sensor, it is recommended to use the name option. Defaults to `Yweather`.
-
+{% configuration %}
+woeid:
+ description: Your Where On Earth ID, see above for all the info.
+ required: false
+ type: integer
+name:
+ description: The name of the sensor. To easily recognize each sensor when adding more than one Yahoo weather sensor, it is recommended to use the name option.
+ required: false
+ default: yweather
+ type: string
+{% endconfiguration %}
-This platform is an alternative to the [`yweather`](/components/sensor.yweather/) sensor.
+This platform is an alternative to the [`yweather`](/components/sensor.yweather/) sensor.
Details about the API are available in the [Yahoo! Developer Network](https://developer.yahoo.com/weather/).
-
From a66e28c441d5519a67e5d11cbc8a46cc737e0a1e Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Sun, 7 Oct 2018 09:06:16 +0200
Subject: [PATCH 025/217] Update Spc component configuration variable (#6570)
Update style of Spc component documentation to follow new configuration variables description.
Related to #6385.
---
source/_components/spc.markdown | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/source/_components/spc.markdown b/source/_components/spc.markdown
index 0e8819fb854..1e5d707c860 100644
--- a/source/_components/spc.markdown
+++ b/source/_components/spc.markdown
@@ -25,10 +25,15 @@ spc:
ws_url: WS_URL
```
-Configuration variables:
-
-- **api_url** (*Required*): URL of the SPC Web Gateway command REST API, e.g., `http://:8088`.
-- **ws_url** (*Required*): URL of the SPC Web Gateway websocket, e.g., `ws://:8088`.
+{% configuration %}
+api_url:
+ description: URL of the SPC Web Gateway command REST API, e.g., `http://:8088`.
+ required: true
+ type: string
+ws_url:
+ description: URL of the SPC Web Gateway websocket, e.g., `ws://:8088`.
+ required: true
+ type: string
+{% endconfiguration %}
Supported sensors will be automatically discovered and added, however they will be hidden by default.
-
From 33627109b1cff2445ec204ae92b92dc60d8c4c5f Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Sun, 7 Oct 2018 09:07:05 +0200
Subject: [PATCH 026/217] Update Tellduslive component configuration variable
(#6569)
Update style of Tellduslive component documentation to follow new configuration variables description.
Related to #6385.
---
source/_components/tellduslive.markdown | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/source/_components/tellduslive.markdown b/source/_components/tellduslive.markdown
index 584761f2db8..1b441341db4 100644
--- a/source/_components/tellduslive.markdown
+++ b/source/_components/tellduslive.markdown
@@ -28,9 +28,16 @@ To manually integrate your Telldus Live with Home Assistant, e.g., if your devic
tellduslive:
```
-Configuration variables:
-
-- **host** (*Optional*): Host address to Tellstick Net or Tellstick ZNet for Local API, only useful when automatic discovery is not enabled.
-- **update_interval** (*Optional*): Interval (in seconds) for polling the Telldus Live server (or the local server). Defaults to 60 seconds.
+{% configuration %}
+host:
+ description: Host address to Tellstick Net or Tellstick ZNet for Local API, only useful when automatic discovery is not enabled.
+ required: false
+ type: string
+update_interval:
+ description: Interval (in seconds) for polling the Telldus Live server (or the local server).
+ required: false
+ default: 60
+ type: integer
+{% endconfiguration %}
The component will offer configuration through the Home Assistant user interface where it will let you associate it with your Telldus Live account.
From bae361992cbc063ac0770232b4ad7fa3e4ebddd0 Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Sun, 7 Oct 2018 09:07:48 +0200
Subject: [PATCH 027/217] Update Thingspeak component configuration variable
(#6568)
Update style of Thingspeak component documentation to follow new configuration variables description.
Related to #6385.
---
source/_components/thingspeak.markdown | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/source/_components/thingspeak.markdown b/source/_components/thingspeak.markdown
index 2336a597473..b18969ca64e 100644
--- a/source/_components/thingspeak.markdown
+++ b/source/_components/thingspeak.markdown
@@ -27,9 +27,17 @@ thingspeak:
whitelist: sensor.yr_temperature
```
-Configuration variables:
-
-- **api_key** (*Required*): Your ThingSpeak Channel Write API key.
-- **id** (*Required*): The ID of your desired ThingSpeak channel.
-- **whitelist** (*Required*): The name of the entity whose states should be sent to the channel.
-
+{% configuration %}
+api_key:
+ description: Your ThingSpeak Channel Write API key.
+ required: true
+ type: string
+id:
+ description: The ID of your desired ThingSpeak channel.
+ required: true
+ type: integer
+whitelist:
+ description: The name of the entity whose states should be sent to the channel.
+ required: true
+ type: string
+{% endconfiguration %}
From 7c4c16fc6fc3034141fb7cf9c6e744823771a413 Mon Sep 17 00:00:00 2001
From: fortepc
Date: Sun, 7 Oct 2018 03:26:22 -0400
Subject: [PATCH 028/217] Added a troubleshooting section (#6571)
* Added a troubleshooting section
This issue plagued me for weeks not realizing what was going on, adding it as a troubleshooting section to help other users. Making it it's own section to be expandable by other users with similar issues that may be common enough to add to this list.
* Fix typo
---
source/_components/nest.markdown | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/source/_components/nest.markdown b/source/_components/nest.markdown
index a6e021b94fa..9a22aeba843 100644
--- a/source/_components/nest.markdown
+++ b/source/_components/nest.markdown
@@ -107,3 +107,7 @@ set_nest_eta:
eta: 00:10:30
eta_window: 00:05
```
+
+{% linkable_title Troubleshooting %}
+
+- If you're getting [rickrolled](https://www.youtube.com/watch?v=dQw4w9WgXcQ) instead of being able to see your Nest cameras, you may not have set up your developer account's permissions correctly. Go back through and make sure you've selected read/write under every category that it's an option.
From 8020ba4c0305fe8178d5004a99a4fca643d0e0fa Mon Sep 17 00:00:00 2001
From: spacemanspiff2007
Date: Sun, 7 Oct 2018 09:26:44 +0200
Subject: [PATCH 029/217] Added info about customizing entities (#6572)
* Added info about customizing entities
* Minor change
---
source/_docs/configuration/packages.markdown | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/source/_docs/configuration/packages.markdown b/source/_docs/configuration/packages.markdown
index 9bcd0e2822c..5cb76f6b4f2 100644
--- a/source/_docs/configuration/packages.markdown
+++ b/source/_docs/configuration/packages.markdown
@@ -89,3 +89,12 @@ homeassistant:
This uses the concept splitting the configuration and will include all files in a directory with the keys representing the filenames.
See the documentation about [splitting the configuration](/docs/configuration/splitting_configuration/) for more information about `!include_dir_named` and other include statements that might be helpful.
+
+### {% linkable_title Customizing entities with packages %}
+
+It is possible to [customize entities](docs/configuration/customizing-devices/) within packages. Just create your customization entries under:
+
+```yaml
+homeassistant:
+ customize:
+```
From d4db78e21c12caeb7df44983b55baa6a5a0f0ea9 Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Sun, 7 Oct 2018 09:42:27 +0200
Subject: [PATCH 030/217] Update Zone component configuration variable (#6566)
* Update Zone component configuration variable
Update style of Zone component documentation to follow new configuration variables description.
Related to #6385.
* Update zone.markdown
change name required from true to false
* Minor changes
---
source/_components/zone.markdown | 36 +++++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/source/_components/zone.markdown b/source/_components/zone.markdown
index fd6280eccfc..1e5125b71c1 100644
--- a/source/_components/zone.markdown
+++ b/source/_components/zone.markdown
@@ -37,14 +37,34 @@ zone:
icon: mdi:account-multiple
```
-Configuration variables:
-
-- **name** (*Optional*): Friendly name of the zone.
-- **latitude** (*Required*): Latitude of the center point of the zone.
-- **longitude** (*Required*): Longitude of the center point of the zone.
-- **radius** (*Optional*): Optional radius in meters. Defaults to 100 meters.
-- **icon** (*Optional*): Optional icon to show instead of name.
-- **passive** (*Optional*): Optional boolean to only use the zone for automation and hide it from the UI and not use the zone for device tracker name. Defaults to false.
+{% configuration %}
+name:
+ description: The friendly name of the zone.
+ required: false
+ type: string
+latitude:
+ description: The latitude of the center point of the zone.
+ required: true
+ type: float
+longitude:
+ description: The longitude of the center point of the zone.
+ required: true
+ type: float
+radius:
+ description: The radius of the zone in meters.
+ required: false
+ default: 100
+ type: integer
+icon:
+ description: The icon to show instead of name.
+ required: false
+ type: string
+passive:
+ description: To only use the zone for automation and hide it from the frontend and not use the zone for device tracker name.
+ required: false
+ default: false
+ type: boolean
+{% endconfiguration %}
To find the latitude/longitude of a certain place you can use [Google Maps](https://www.google.com/maps/) or [Bing Maps](https://www.bing.com/maps). Just right click and copy the coordinates from there (Bing) or click on the "What is here?" (Google)
From 15db244e12f96fd7b161b6f53d439e1546193dfb Mon Sep 17 00:00:00 2001
From: Amir Hanan
Date: Sun, 7 Oct 2018 12:29:20 +0300
Subject: [PATCH 031/217] 2 for 1: configuration markdown & usage sample
(#6573)
* 2 for 1: configuration markdown & usage sample
Fixing configuration markdown #6385
also, added a simple switch example for AC management.
* Fix configuration section
Hope I got it right this time :)
---
source/_components/climate.sensibo.markdown | 39 +++++++++++++++++----
1 file changed, 33 insertions(+), 6 deletions(-)
diff --git a/source/_components/climate.sensibo.markdown b/source/_components/climate.sensibo.markdown
index 02003d4aa6a..85577dcdf81 100644
--- a/source/_components/climate.sensibo.markdown
+++ b/source/_components/climate.sensibo.markdown
@@ -24,12 +24,16 @@ climate:
api_key:
```
-Configuration variables:
-
-- **api_key** (*Required*): Your API key.
-- **id** (*Optional*): A unit ID or a list of IDs. If none specified then all units accessible by the `api_key` will be used.
-
-To get your API key visit
+{% configuration %}
+api_key:
+ description: Your Sensibo API key (To get your API key visit ).
+ required: true
+ type: string
+id:
+ description: A unit ID or a list of IDs. If none specified then all units accessible by the `api_key` will be used.
+ required: false
+ type: string
+{% endconfiguration %}
If you create the API key using a dedicated user (and not your main user),
@@ -46,3 +50,26 @@ climate:
- id1
- id2
```
+
+### {% linkable_title Adding a quick switch example %}
+
+If you want a "Quick Switch" to turn your AC On / Off, you can do that using the following `Switch Template`:
+
+{% raw %}
+```yaml
+switch:
+ - platform: template
+ switches:
+ ac:
+ friendly_name: "AC"
+ value_template: "{{ is_state('climate.ac', 'cool') or is_state('climate.ac', 'heat') or is_state('climate.ac', 'dry') or is_state('climate.ac', 'heat')}}"
+ turn_on:
+ service: climate.turn_on
+ data:
+ entity_id: climate.ac
+ turn_off:
+ service: climate.turn_off
+ data:
+ entity_id: climate.ac
+```
+{% endraw %}
From b6356768bcdcfd2100d53d0267921cda926a942f Mon Sep 17 00:00:00 2001
From: DubhAd
Date: Sun, 7 Oct 2018 10:37:51 +0100
Subject: [PATCH 032/217] Replaced examples (#6577)
The examples were only for the services menu, which is unhelpful for users. Replaced with equivalent automation versions.
---
source/_components/notify.pushsafer.markdown | 107 +++++++++----------
1 file changed, 52 insertions(+), 55 deletions(-)
diff --git a/source/_components/notify.pushsafer.markdown b/source/_components/notify.pushsafer.markdown
index 6060016e1c5..886be8aa0ae 100644
--- a/source/_components/notify.pushsafer.markdown
+++ b/source/_components/notify.pushsafer.markdown
@@ -35,69 +35,66 @@ notify:
Message to two devices with formatted text.
-```json
-{
- "title": "Test to 2 devices",
- "message": "Attention [b]bold[/b] text[br][url=https://www.pushsafer.com]Link to Pushsafer[/url]",
- "target": ["1111", "2222"],
- "data": {
- "icon": "2",
- "iconcolor": "#FF0000",
- "sound": "2",
- "vibration": "1",
- "url": "https://www.home-assistant.io/",
- "urltitle": "Open Home Assistant",
- "time2live": "0"
- }
-}
+
+```yaml
+action:
+ service: notify.notify
+ data:
+ title: "Test to 2 devices"
+ message: "Attention [b]bold[/b] text[br][url=https://www.pushsafer.com]Link to Pushsafer[/url]"
+ data:
+ icon: "2"
+ iconcolor: "#FF0000"
+ sound: "2"
+ vibration: "1"
+ url: "https://www.home-assistant.io/"
+ urltitle: "Open Home Assistant"
+ time2live: "0"
```
Message to one device with formatted text and image from an external URL.
-```json
-{
- "title": "Test to 1 device with image from an url",
- "message": "Attention [i]italic[/i] Text[br][url=https://www.home-assistant.io/]Testlink[/url]",
- "target": ["1111"],
- "data": {
- "icon": "14",
- "iconcolor": "#FFFF00",
- "sound": "22",
- "vibration": "3",
- "url": "https://www.home-assistant.io/",
- "urltitle": "Open Home Assistant",
- "time2live": "60",
- "picture1": {
- "url":"https://www.home-assistant.io/images/components/alexa/alexa-512x512.png"
- }
- }
-}
+```yaml
+action:
+ service: notify.notify
+ data:
+ title: "Test to 1 device with image from an url"
+ message: "Attention [i]italic[/i] Text[br][url=https://www.home-assistant.io/]Testlink[/url]"
+ data:
+ icon: "14"
+ iconcolor: "#FFFF00"
+ sound: "22"
+ vibration: "31"
+ url: "https://www.home-assistant.io/"
+ urltitle: "Open Home Assistant"
+ time2live: "60"
+ picture1:
+ url: "https://www.home-assistant.io/images/components/alexa/alexa-512x512.png"
```
Message to two devices and one device group with formatted text and local image.
-```json
-{
- "title": "Test to 3 devices with local image",
- "message": "Attention [i]italic[/i] Text[br][url=https://www.home-assistant.io/]Testlink[/url]",
- "target": ["1111","2222","gs3333"],
- "data": {
- "icon": "20",
- "iconcolor": "#FF00FF",
- "sound": "33",
- "vibration": "0",
- "url": "https://www.home-assistant.io/",
- "urltitle": "Open Home Assistant",
- "time2live": "10",
- "priority": "2",
- "retry": "60",
- "expire": "600",
- "answer": "1",
- "picture1": {
- "path":"C:\\Users\\Kevin\\AppData\\Roaming\\.homeassistant\\image-760-testimage.jpg"
- }
- }
-}
+```yaml
+action:
+ service: notify.notify
+ data:
+ title: "Test to 3 devices with local image"
+ message: "Attention [i]italic[/i] Text[br][url=https://www.home-assistant.io/]Testlink[/url]"
+ target: ["1111","2222","gs3333"],
+ data:
+ icon: "20"
+ iconcolor: "#FF00FF"
+ sound: "33"
+ vibration: "0"
+ url: "https://www.home-assistant.io/"
+ urltitle: "Open Home Assistant"
+ time2live: "10"
+ priority: "2"
+ retry: "60"
+ expire: "600"
+ answer: "1"
+ picture1: {
+ path: "C:\\Users\\Kevin\\AppData\\Roaming\\.homeassistant\\image-760-testimage.jpg"
```
To customize your push-notification you can take a look at the [Pushsafer API description](https://www.pushsafer.com/en/pushapi).
From a1cdeaf43a9c65399351853e166a6edc1372591a Mon Sep 17 00:00:00 2001
From: DubhAd
Date: Sun, 7 Oct 2018 10:42:06 +0100
Subject: [PATCH 033/217] Updating examples (#6576)
* Updating examples
It's not very helpful that our examples are all for the services menu. Providing automation examples.
* Update notify.markdown
---
source/_components/notify.markdown | 35 ++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/source/_components/notify.markdown b/source/_components/notify.markdown
index 7f3225bd73c..63cf49b985d 100644
--- a/source/_components/notify.markdown
+++ b/source/_components/notify.markdown
@@ -55,6 +55,16 @@ A simple way to test if you have set up your notify platform correctly, is to us
"message": "The sun is {% raw %}{% if is_state('sun.sun', 'above_horizon') %}up{% else %}down{% endif %}{% endraw %}!"
}
```
+
+The automation equivalent would be:
+
+```yaml
+action:
+ service: notify.notify
+ data:
+ message: "The sun is {% raw %}{% if is_state('sun.sun', 'above_horizon') %}up{% else %}down{% endif %}{% endraw %}!"
+```
+
For services which have support for sending images.
```json
@@ -67,6 +77,19 @@ For services which have support for sending images.
}
```
+The automation equivalent would be:
+
+```yaml
+action:
+ service: notify.notify
+ data:
+ message: "Test plugin"
+ data:
+ photo:
+ url: "http://www.gbsun.de/gbpics/berge/berge106.jpg"
+```
+
+
If the service support sending the location, the data from this sample can be used.
```json
@@ -80,3 +103,15 @@ If the service support sending the location, the data from this sample can be us
}
```
+The automation equivalent would be:
+
+```yaml
+action:
+ service: notify.notify
+ data:
+ message: "Test plugin"
+ data:
+ location:
+ latitude: 7.3284
+ longitude: 46.38234
+```
From 348c952f850b3184c0d512ca844291449fc74f54 Mon Sep 17 00:00:00 2001
From: DubhAd
Date: Sun, 7 Oct 2018 10:43:54 +0100
Subject: [PATCH 034/217] Little note that triggers are or (#6575)
We don't really call out that triggers are `or`, so adding a little about that here.
---
source/_docs/automation/trigger.markdown | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown
index e682a20c389..9c65538ee4b 100644
--- a/source/_docs/automation/trigger.markdown
+++ b/source/_docs/automation/trigger.markdown
@@ -10,7 +10,7 @@ footer: true
redirect_from: /getting-started/automation-trigger/
---
-Triggers are what starts the processing of an automation rule. It is possible to specify multiple triggers for the same rule. Once a trigger starts, Home Assistant will validate the conditions, if any, and call the action.
+Triggers are what starts the processing of an automation rule. It is possible to specify multiple triggers for the same rule - when _any_ of the triggers becomes true then the automation will start. Once a trigger starts, Home Assistant will validate the conditions, if any, and call the action.
### {% linkable_title Event trigger %}
From 2a7ff828a0af853c10e265b002be584bc7ed4353 Mon Sep 17 00:00:00 2001
From: Pierre-Jean Leger
Date: Sun, 7 Oct 2018 12:01:09 +0200
Subject: [PATCH 035/217] Add KU6100K Samsung TV to supported models list
(#6574)
---
source/_components/media_player.samsungtv.markdown | 1 +
1 file changed, 1 insertion(+)
diff --git a/source/_components/media_player.samsungtv.markdown b/source/_components/media_player.samsungtv.markdown
index 9a80e3ad393..fba12092442 100644
--- a/source/_components/media_player.samsungtv.markdown
+++ b/source/_components/media_player.samsungtv.markdown
@@ -81,6 +81,7 @@ Currently known supported models:
- KS8000 (port must be set to 8001, and `pip3 install websocket-client` must be executed)
- KS8005 (port must be set to 8001, and `pip3 install websocket-client` must be executed)
- KU6020 (port must be set to 8001, and `pip3 install websocket-client` must be executed)
+- KU6100 (port must be set to 8001, and `pip3 install websocket-client` must be executed)
- KU6290 (port must be set to 8001)
- KU7000 (port must be set to 8001)
- MU6170UXZG (port must be set to 8001, and `pip3 install websocket-client` must be executed)
From 59c1717020f7ba6292200de77dd0736509796702 Mon Sep 17 00:00:00 2001
From: Amir Hanan
Date: Sun, 7 Oct 2018 14:45:32 +0300
Subject: [PATCH 036/217] Configuration ezfix (#6579)
#6385 related
---
.../device_tracker.actiontec.markdown | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/source/_components/device_tracker.actiontec.markdown b/source/_components/device_tracker.actiontec.markdown
index fbf21196500..f33d631b8f3 100644
--- a/source/_components/device_tracker.actiontec.markdown
+++ b/source/_components/device_tracker.actiontec.markdown
@@ -33,11 +33,20 @@ device_tracker:
password: YOUR_ADMIN_PASSWORD
```
-Configuration variables:
-
-- **host** (*Required*): The IP address of your router, eg. `192.168.1.1`.
-- **username** (*Required*: The username of an user with administrative privileges, usually `admin`.
-- **password** (*Required*): The password for your given admin account.
+{% configuration %}
+host:
+ description: The IP address of your router, eg. `192.168.1.1`.
+ required: true
+ type: string
+username:
+ description: The username of an user with administrative privileges, usually `admin`.
+ required: true
+ type: string
+password:
+ description: The password for your given admin account.
+ required: true
+ type: string
+{% endconfiguration %}
See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked.
From d3589d95185a75d8faa1bde41989f78f26b9e30b Mon Sep 17 00:00:00 2001
From: Florian Klien
Date: Sun, 7 Oct 2018 16:58:35 +0200
Subject: [PATCH 037/217] typos fixed (#6582)
---
source/_addons/lets_encrypt.markdown | 4 ++--
source/_addons/samba.markdown | 2 +-
source/_addons/snips.markdown | 4 ++--
source/_addons/ssh.markdown | 2 +-
source/_cookbook/fail2ban.markdown | 2 +-
source/_cookbook/google_maps_card.markdown | 2 +-
.../owntracks_two_mqtt_broker.markdown | 4 ++--
...form_actions_based_on_input_select.markdown | 2 +-
source/_docs/asterisk_mbox.markdown | 4 ++--
source/_docs/configuration/events.markdown | 2 +-
.../configuration/group_visibility.markdown | 2 +-
.../splitting_configuration.markdown | 2 +-
source/_docs/configuration/yaml.markdown | 2 +-
source/_docs/ecosystem/appdaemon/api.markdown | 18 +++++++++---------
.../_docs/ecosystem/appdaemon/running.markdown | 2 +-
.../ecosystem/appdaemon/tutorial.markdown | 8 ++++----
.../ecosystem/appdaemon/updating.markdown | 2 +-
.../ecosystem/backup/backup_github.markdown | 4 ++--
.../certificates/lets_encrypt.markdown | 10 +++++-----
.../tls_domain_certificate.markdown | 4 ++--
.../tls_self_signed_certificate.markdown | 2 +-
source/_docs/ecosystem/scenegen.markdown | 4 ++--
source/_docs/frontend/browsers.markdown | 2 +-
source/_docs/installation/docker.markdown | 4 ++--
source/_docs/installation/freenas.markdown | 2 +-
.../hassbian/installation.markdown | 4 ++--
source/_docs/installation/virtualenv.markdown | 2 +-
source/_docs/mqtt/broker.markdown | 4 ++--
source/_docs/z-wave/adding.markdown | 2 +-
source/_docs/z-wave/control-panel.markdown | 8 ++++----
source/_docs/z-wave/device-specific.markdown | 2 +-
source/_docs/z-wave/installation.markdown | 2 +-
source/_docs/z-wave/services.markdown | 2 +-
source/ios/beta.markdown | 2 +-
source/lovelace/views.markdown | 2 +-
35 files changed, 63 insertions(+), 63 deletions(-)
diff --git a/source/_addons/lets_encrypt.markdown b/source/_addons/lets_encrypt.markdown
index 0ac8d019945..755d039a2f7 100644
--- a/source/_addons/lets_encrypt.markdown
+++ b/source/_addons/lets_encrypt.markdown
@@ -14,7 +14,7 @@ featured: false
You should not use this if you are also using the [DuckDNS add-on]. The DuckDNS add-on has integrated Let's Encrypt support.
-Setup and manage a [Let's Encrypt](https://letsencrypt.org/) certificate. This addon will create a certificate on the first run and will auto-renew if the certificate is within 30 days of expiration. This add-on uses port 80 to verify the certificate request. You will need to stop all other add-ons that also use this port.
+Setup and manage a [Let's Encrypt](https://letsencrypt.org/) certificate. This add-on will create a certificate on the first run and will auto-renew if the certificate is within 30 days of expiration. This add-on uses port 80 to verify the certificate request. You will need to stop all other add-ons that also use this port.
```json
{
@@ -43,7 +43,7 @@ If you use another port such as `8123` or an SSL proxy, change the port number.
## {% linkable_title Enabling auto-renewals %}
-Out of the box, the add-on will not automatically renew your certificate. In fact, it only starts, tries to get/renew your certificte, and then stops. It's up to you to manually start it again whenever your certificate comes close to expiry.
+Out of the box, the add-on will not automatically renew your certificate. In fact, it only starts, tries to get/renew your certificate, and then stops. It's up to you to manually start it again whenever your certificate comes close to expiry.
However, you can automate this process using Home Assistant.
diff --git a/source/_addons/samba.markdown b/source/_addons/samba.markdown
index aa7d509c18b..42519d3cfed 100644
--- a/source/_addons/samba.markdown
+++ b/source/_addons/samba.markdown
@@ -10,7 +10,7 @@ footer: true
featured: true
---
-This addon allows you to set up a [Samba](https://samba.org/) server to access Hass.io folders using Windows network shares.
+This add-on allows you to set up a [Samba](https://samba.org/) server to access Hass.io folders using Windows network shares.
```json
{
diff --git a/source/_addons/snips.markdown b/source/_addons/snips.markdown
index e8377a1b5a7..b002ff1a4a1 100644
--- a/source/_addons/snips.markdown
+++ b/source/_addons/snips.markdown
@@ -15,7 +15,7 @@ The Snips add-on depends on the Mosquitto add on to bridge to Home Assistant, so
Home Assistant comes with certain Intents builtin to handle common tasks. A complete list of Intents can be found in this wiki [Hass Snips Bundle](https://github.com/tschmidty69/hass-snips-bundle-intents/wiki).
-The Snips addon by default comes with an assistant that allows you to turn on lights or switches, open covers, or add and list items to a shopping list if that component is enabled.
+The Snips add-on by default comes with an assistant that allows you to turn on lights or switches, open covers, or add and list items to a shopping list if that component is enabled.
If using a USB microphone and speakers plugged into the Raspberry Pi output, Snips will work without any change to the configuration. Trying saying things like:
@@ -71,7 +71,7 @@ There is an active [discord](https://discordapp.com/invite/3939Kqx) channel for
### {% linkable_title Examples %}
-So now you can turn lights on and off, let's check the weather. Log on to the [console](https://console.snips.ai/). If this is your first time, create a new assistant and add the Home Assistant skill, along with the Weather skill by snips. Download your assistant manually and copy it to the `/share` folder on your HassIO installation using the Samba addon.
+So now you can turn lights on and off, let's check the weather. Log on to the [console](https://console.snips.ai/). If this is your first time, create a new assistant and add the Home Assistant skill, along with the Weather skill by snips. Download your assistant manually and copy it to the `/share` folder on your HassIO installation using the Samba add-on.
Next create a weather sensor, e.g., one for (Dark Sky)[/components/sensor.darksky/] and put the `api_key` in your `secrets.yaml` file.
diff --git a/source/_addons/ssh.markdown b/source/_addons/ssh.markdown
index 479b05c98f6..0fa91e88684 100644
--- a/source/_addons/ssh.markdown
+++ b/source/_addons/ssh.markdown
@@ -35,7 +35,7 @@ To start this add-on for the first time, you either need to include a key (enclo
The username for login over SSH is `root`. The complete login command is `ssh root@hassio.local`.
-After logging in, you will find yourself in this add-ons container. The Home Assistant configuration directory is mounted on the path `/config`.
+After logging in, you will find yourself in this add-on's container. The Home Assistant configuration directory is mounted on the path `/config`.
Configuration variables:
diff --git a/source/_cookbook/fail2ban.markdown b/source/_cookbook/fail2ban.markdown
index d5c5275a1c7..a9f7e045612 100644
--- a/source/_cookbook/fail2ban.markdown
+++ b/source/_cookbook/fail2ban.markdown
@@ -163,7 +163,7 @@ eg:
$ sudo fail2ban-client set ha unbanip xxx.xxx.xxx.xxx
```
-Fail2ban should now be configured and running, if an IP address is banned you will recieve an email with WHOIS details about the IP address that attempted to connect, if not you will need configure Postfix or another MTA (Mail Transport Agent).
+Fail2ban should now be configured and running, if an IP address is banned you will receive an email with WHOIS details about the IP address that attempted to connect, if not you will need configure Postfix or another MTA (Mail Transport Agent).
If you want to read more about `fail2ban`, some links are below:
diff --git a/source/_cookbook/google_maps_card.markdown b/source/_cookbook/google_maps_card.markdown
index 9055e4c6726..56b3e14f639 100644
--- a/source/_cookbook/google_maps_card.markdown
+++ b/source/_cookbook/google_maps_card.markdown
@@ -10,7 +10,7 @@ footer: true
ha_category: User Interface
---
-Using the [generic camera platform] you can present any image on the internet as a camera. Starting release 0.27 these urls can also be based on a template. This example uses this functionality to point a generic camera at the Google Maps static image API and pass in the location of a device.
+Using the [generic camera platform] you can present any image on the internet as a camera. Starting release 0.27 these URLs can also be based on a template. This example uses this functionality to point a generic camera at the Google Maps static image API and pass in the location of a device.
As of June 2018, Google has changed the API limits for static maps. You now need to have a Google Maps API key. Instructions for registering a key can be found [here](https://github.com/googlemaps/google-maps-services-python#api-keys). Replace `YOUR_API_KEY` with the key you registered.
diff --git a/source/_cookbook/owntracks_two_mqtt_broker.markdown b/source/_cookbook/owntracks_two_mqtt_broker.markdown
index c4be879045f..bfdee80c666 100644
--- a/source/_cookbook/owntracks_two_mqtt_broker.markdown
+++ b/source/_cookbook/owntracks_two_mqtt_broker.markdown
@@ -25,7 +25,7 @@ Two Docker instances for MQTT
All Docker configuration files are on my NAS so the Docker containers can be destroyed without affecting my actual configuration files.
-#### Docker setup for the mosquitto internal instance. No authentication for use with the MQTT bridge.
+#### Docker setup for the Mosquitto internal instance. No authentication for use with the MQTT bridge.
```bash
$ docker run -ti -p 1883:1883 \
@@ -56,7 +56,7 @@ persistence_file mosquitto.db
try_private true
address 10.0.0.20:1884
start_type automatic
-sername test
+username test
password test
notifications true
topic owntracks/# in
diff --git a/source/_cookbook/perform_actions_based_on_input_select.markdown b/source/_cookbook/perform_actions_based_on_input_select.markdown
index 235ef58351f..87d8e8ae02a 100644
--- a/source/_cookbook/perform_actions_based_on_input_select.markdown
+++ b/source/_cookbook/perform_actions_based_on_input_select.markdown
@@ -1,7 +1,7 @@
---
layout: page
title: "Perform actions based on input select"
-description: "Example playing media to chromecast based on input select element"
+description: "Example playing media to Chromecast based on input select element"
date: 2016-03-07 12:05
sidebar: true
comments: false
diff --git a/source/_docs/asterisk_mbox.markdown b/source/_docs/asterisk_mbox.markdown
index 45bc4071a80..488b254584a 100644
--- a/source/_docs/asterisk_mbox.markdown
+++ b/source/_docs/asterisk_mbox.markdown
@@ -14,7 +14,7 @@ Asterisk Voicemail integration allows Home Assistant to view, listen to and dele
There are two components to the integration:
- A server that runs on the Asterisk PBX host and communicates over an open port.
-- A client which can request inormation from the server.
+- A client which can request information from the server.
Both parts are necessary for Asterisk voicemail integration.
@@ -64,7 +64,7 @@ Before beginning make sure that you have the following:
- **port** (*Optional*): The port to listen on for client requests. Defaults to 12345.
- **password** (*Required*): A password shared between client and server. Use only alpha-numeric characters and spaces
- **mbox\_path** (*Required*): The path to the storage location of mailbox files. This is typically `/var/spool/asterisk/voicemail/default//`
- - **cache\_file** (*Required*): A fully-qualified path to a file thht can be written by the server containing transcriptions of voicemails. Example: `/var/spool/asterisk/transcription.cache`
+ - **cache\_file** (*Required*): A fully-qualified path to a file that can be written by the server containing transcriptions of voicemails. Example: `/var/spool/asterisk/transcription.cache`
- **google\_key** (*Required*): Your 40 characters Google API key.
- **cdr** (*Optional*): Where to find CDR data. Supports various SQL databases as well as a file log. Configuring the CDR will enable the `asterisk_cdr` platfom.
diff --git a/source/_docs/configuration/events.markdown b/source/_docs/configuration/events.markdown
index ff0bcd35140..86494fc7b28 100644
--- a/source/_docs/configuration/events.markdown
+++ b/source/_docs/configuration/events.markdown
@@ -15,7 +15,7 @@ The core of Home Assistant is the event bus. The event bus allows any component
Home Assistant contains a few built-in events that are used to coordinate between various components.
### {% linkable_title Event `homeassistant_start` %}
-Event `homeassistant_start` is fired when all components from the configuration have been intitialized. This is the event that will start the timer firing off `time_changed` events.
+Event `homeassistant_start` is fired when all components from the configuration have been initialized. This is the event that will start the timer firing off `time_changed` events.
Starting 0.42, it is no longer possible to listen for event `homeassistant_start`. Use the 'homeassistant' [platform](/docs/automation/trigger) instead.
diff --git a/source/_docs/configuration/group_visibility.markdown b/source/_docs/configuration/group_visibility.markdown
index c5458e4bf2b..cab429ce404 100644
--- a/source/_docs/configuration/group_visibility.markdown
+++ b/source/_docs/configuration/group_visibility.markdown
@@ -95,7 +95,7 @@ if __name__ == '__main__':
print(get_current_occasion(OCCASIONS))
```
-This script will output "work_morning" from 06:00-07:10 during weekdays (monday-friday), "weekday" during all other time from monday-friday and "weekend" on saturdays and sundays. Adjust according to your needs. To create the sensor, just add it like this:
+This script will output "work_morning" from 06:00-07:10 during weekdays (Monday-Friday), "weekday" during all other time from Monday-Friday and "weekend" on Saturdays and Sundays. Adjust according to your needs. To create the sensor, just add it like this:
```yaml
sensor:
diff --git a/source/_docs/configuration/splitting_configuration.markdown b/source/_docs/configuration/splitting_configuration.markdown
index ec0d021ea53..47e53037928 100644
--- a/source/_docs/configuration/splitting_configuration.markdown
+++ b/source/_docs/configuration/splitting_configuration.markdown
@@ -89,7 +89,7 @@ switch: !include switches.yaml
device_tracker: !include device_tracker.yaml
```
-Note that there can only be one `!include:` for each component so chaining them isn't going to work. If that sounds like greek, don't worry about it.
+Note that there can only be one `!include:` for each component so chaining them isn't going to work. If that sounds like Greek, don't worry about it.
Alright, so we've got the single components and the include statements in the base file, what goes in those extra files?
diff --git a/source/_docs/configuration/yaml.markdown b/source/_docs/configuration/yaml.markdown
index 68503dab96a..c4546d40ebb 100644
--- a/source/_docs/configuration/yaml.markdown
+++ b/source/_docs/configuration/yaml.markdown
@@ -26,7 +26,7 @@ notify:
- A **component** provides the core logic for some functionality (like `notify` provides sending notifications).
- A **platform** makes the connection to a specific software or hardware platform (like `pushbullet` works with the service from pushbullet.com).
-The basics of YAML syntax are block collections and mappings containing key-value pairs. Each item in a collection starts with a `-` while mappings have the format `key: value`. If you specify duplicate keys, the last value for a key is used. This is somewhat similar to a Hashtable or more specifically a dictionary in Python. These can be nested as well.
+The basics of YAML syntax are block collections and mappings containing key-value pairs. Each item in a collection starts with a `-` while mappings have the format `key: value`. If you specify duplicate keys, the last value for a key is used. This is somewhat similar to a Hash table or more specifically a dictionary in Python. These can be nested as well.
Note that indentation is an important part of specifying relationships using YAML. Things that are indented are nested "inside" things that are one level higher. So in the above example, `platform: pushbullet` is a property of (nested inside) the `notify` component.
diff --git a/source/_docs/ecosystem/appdaemon/api.markdown b/source/_docs/ecosystem/appdaemon/api.markdown
index be4a60c0245..4464e699717 100755
--- a/source/_docs/ecosystem/appdaemon/api.markdown
+++ b/source/_docs/ecosystem/appdaemon/api.markdown
@@ -502,7 +502,7 @@ If duration is supplied as a parameter, the callback will not fire unless the st
```
-(Scheduler callbacks are documented in detail laer in this document)
+(Scheduler callbacks are documented in detail later in this document)
##### {% linkable_title \*\*kwargs %}
@@ -937,14 +937,14 @@ The handle returned when the scheduler call was made.
time, interval, kwargs = self.info_timer(handle)
```
-### {% linkable_title Scheduler Ransomization %}
+### {% linkable_title Scheduler Randomization %}
All of the scheduler calls above support 2 additional optional arguments, `random_start` and `random_end`. Using these arguments it is possible to randomize the firing of callbacks to the degree desired by setting the appropriate number of seconds with the parameters.
- `random_start` - start of range of the random time
- `random_end` - end of range of the random time
-`random_start` must always be numerically lower than `random_end`, they can be negative to denote a random offset before and event, or positive to denote a random offset after an event. The event would be an absolute or relative time or sunrise/sunset depending on which scheduler call you use and these values affect the base time by the spcified amount. If not specified, they will default to `0`.
+`random_start` must always be numerically lower than `random_end`, they can be negative to denote a random offset before and event, or positive to denote a random offset after an event. The event would be an absolute or relative time or sunrise/sunset depending on which scheduler call you use and these values affect the base time by the specified amount. If not specified, they will default to `0`.
For example:
@@ -1164,7 +1164,7 @@ self.call_service("notify/notify", title = "Hello", message = "Hello World")
```
### {% linkable_title turn_on() %}
-This is a convenience function for the `homassistant.turn_on` function. It is able to turn on pretty much anything in Home Assistant that can be turned on or run:
+This is a convenience function for the `homeassistant.turn_on` function. It is able to turn on pretty much anything in Home Assistant that can be turned on or run:
- Lights
- Switches
@@ -1197,13 +1197,13 @@ A comma separated list of key value pairs to allow specification of parameters o
```python
self.turn_on("switch.patio_lights")
-self.turn_on("scene.bedrrom_on")
+self.turn_on("scene.bedroom_on")
self.turn_on("light.office_1", color_name = "green")
```
### {% linkable_title turn_off() %}
-This is a convenience function for the `homassistant.turn_off` function. Like `homeassistant.turn_on`, it is able to turn off pretty much anything in Home Assistant that can be turned off.
+This is a convenience function for the `homeassistant.turn_off` function. Like `homeassistant.turn_on`, it is able to turn off pretty much anything in Home Assistant that can be turned off.
#### {% linkable_title Synopsis %}
@@ -1230,7 +1230,7 @@ self.turn_off("light.office_1")
### {% linkable_title toggle() %}
-This is a convenience function for the `homassistant.toggle` function. It is able to flip the state of pretty much anything in Home Assistant that can be turned on or off.
+This is a convenience function for the `homeassistant.toggle` function. It is able to flip the state of pretty much anything in Home Assistant that can be turned on or off.
#### {% linkable_title Synopsis %}
@@ -1850,7 +1850,7 @@ if self.now_is_between("sunset - 00:45:00", "sunrise + 00:45:00"):
### {% linkable_title friendly_name() %}
-`frindly_name()` will return the Friendly Name of an entity if it has one.
+`friendly_name()` will return the Friendly Name of an entity if it has one.
#### {% linkable_title Synopsis %}
@@ -2096,7 +2096,7 @@ $ appdaemon -e "2016-06-06 10:10:00"
...
```
-The `-e` flag is most useful when used in conjuntion with the -s flag and optionally the `-t` flag. For example, to run from just before sunset, for an hour, as fast as possible:
+The `-e` flag is most useful when used in conjunction with the -s flag and optionally the `-t` flag. For example, to run from just before sunset, for an hour, as fast as possible:
```bash
$ appdaemon -s "2016-06-06 19:16:00" -s "2016-06-06 20:16:00" -t 0
diff --git a/source/_docs/ecosystem/appdaemon/running.markdown b/source/_docs/ecosystem/appdaemon/running.markdown
index d4006526d6f..feda9c4ee8a 100755
--- a/source/_docs/ecosystem/appdaemon/running.markdown
+++ b/source/_docs/ecosystem/appdaemon/running.markdown
@@ -26,7 +26,7 @@ In the example above you would use:
$ docker run -d -v /Users/foo/ha-config:/conf --name appdaemon appdaemon:latest
```
-Where you place the `conf` and `conf/apps` directory is up to you - it can be in downloaded repostory, or anywhere else on the host, as long as you use the correct mapping in the `docker run` command.
+Where you place the `conf` and `conf/apps` directory is up to you - it can be in downloaded repository, or anywhere else on the host, as long as you use the correct mapping in the `docker run` command.
You can inspect the logs as follows:
diff --git a/source/_docs/ecosystem/appdaemon/tutorial.markdown b/source/_docs/ecosystem/appdaemon/tutorial.markdown
index 28f325dfa08..14c01f397cb 100755
--- a/source/_docs/ecosystem/appdaemon/tutorial.markdown
+++ b/source/_docs/ecosystem/appdaemon/tutorial.markdown
@@ -12,7 +12,7 @@ redirect_from: /ecosystem/appdaemon/tutorial/
## {% linkable_title Another Take on Automation %}
-If you haven't yet read Paulus' excellent Blog entry on [Perfect Home Automation](/blog/2016/01/19/perfect-home-automation/) I would encourage you to take a look. As a veteran of several Home Automation systems with varying degrees success, it was this article more than anything else that convinced me that Home Assistant had the right philosophy behind it and was on the right track. One of the most important points made is that being able to control your lights from your phone, 9 times out of 10 is harder than using a lightswitch - where Home Automation really comes into its own is when you start removing the need to use a phone or the switch - the "Automation" in Home Automation. A surprisingly large number of systems out there miss this essential point and have limited abilities to automate anything which is why a robust and open system such as Home Assistant is such an important part of the equation in bring this all together in the vast and chaotic ecosystem that is the "Internet of Things".
+If you haven't yet read Paulus' excellent Blog entry on [Perfect Home Automation](/blog/2016/01/19/perfect-home-automation/) I would encourage you to take a look. As a veteran of several Home Automation systems with varying degrees success, it was this article more than anything else that convinced me that Home Assistant had the right philosophy behind it and was on the right track. One of the most important points made is that being able to control your lights from your phone, 9 times out of 10 is harder than using a light switch - where Home Automation really comes into its own is when you start removing the need to use a phone or the switch - the "Automation" in Home Automation. A surprisingly large number of systems out there miss this essential point and have limited abilities to automate anything which is why a robust and open system such as Home Assistant is such an important part of the equation in bring this all together in the vast and chaotic ecosystem that is the "Internet of Things".
So given the importance of Automation, what should Automation allow us to do? I am a pragmatist at heart so I judge individual systems by the ease of accomplishing a few basic but representative tasks:
@@ -82,7 +82,7 @@ This is also fairly easy to achieve with Home Assistant automations, but we are
### Motion Light
-Our next example is to turn on a light when motion is detected and it is dark, and turn it off after a period of time. This time, the `initialize()` function registers a callback on a state change (of the motion sensor) rather than a specific time. We tell AppDaemon that we are only interested in state changesd where the motion detector comes on by adding an additional parameter to the callback registration - `new = "on"`. When the motion is detected, the callack function `motion()` is called, and we check whether or not the sun has set using a built-in convenience function: `sun_down()`. Next, we turn the light on with `turn_on()`, then set a timer using `run_in()` to turn the light off after 60 seconds, which is another call to the scheduler to execute in a set time from now, which results in `AppDaemon` calling `light_off()` 60 seconds later using the `turn_off()` call to actually turn the light off. This is still pretty simple in code terms:
+Our next example is to turn on a light when motion is detected and it is dark, and turn it off after a period of time. This time, the `initialize()` function registers a callback on a state change (of the motion sensor) rather than a specific time. We tell AppDaemon that we are only interested in state changesd where the motion detector comes on by adding an additional parameter to the callback registration - `new = "on"`. When the motion is detected, the callback function `motion()` is called, and we check whether or not the sun has set using a built-in convenience function: `sun_down()`. Next, we turn the light on with `turn_on()`, then set a timer using `run_in()` to turn the light off after 60 seconds, which is another call to the scheduler to execute in a set time from now, which results in `AppDaemon` calling `light_off()` 60 seconds later using the `turn_off()` call to actually turn the light off. This is still pretty simple in code terms:
```python
import appdaemon.appapi as appapi
@@ -132,9 +132,9 @@ class MotionLights(appapi.AppDaemon):
Of course if I wanted to make this App or its predecessor reusable I would have provide parameters for the sensor, the light to activate on motion, the warning light and even the number of flashes and delay between flashes.
-In addition, Apps can write to `AppDaemon`'s logfiles, and there is a system of constraints that allows yout to control when and under what circumstances Apps and callbacks are active to keep the logic clean and simple.
+In addition, Apps can write to `AppDaemon`'s logfiles, and there is a system of constraints that allows you to control when and under what circumstances Apps and callbacks are active to keep the logic clean and simple.
-I have spent the last few weeks moving all of my (fairly complex) automations over to `APPDaemon` and so far it is working very reliably.
+I have spent the last few weeks moving all of my (fairly complex) automations over to `AppDaemon` and so far it is working very reliably.
Some people will maybe look at all of this and say "what use is this, I can already do all of this", and that is fine, as I said this is an alternative not a replacement, but I am hopeful that for some users this will seem a more natural, powerful and nimble way of building potentially very complex automations.
diff --git a/source/_docs/ecosystem/appdaemon/updating.markdown b/source/_docs/ecosystem/appdaemon/updating.markdown
index 132b4dc5d2e..af29d8b578c 100644
--- a/source/_docs/ecosystem/appdaemon/updating.markdown
+++ b/source/_docs/ecosystem/appdaemon/updating.markdown
@@ -16,4 +16,4 @@ To update AppDaemon after I have released new code, just run the following comma
$ sudo pip3 install --upgrade appdaemon
```
-If you are using docker, rerun the steps to grab the latestdocker image.
+If you are using docker, rerun the steps to grab the latest docker image.
diff --git a/source/_docs/ecosystem/backup/backup_github.markdown b/source/_docs/ecosystem/backup/backup_github.markdown
index d43a111f89b..cf526c7b502 100644
--- a/source/_docs/ecosystem/backup/backup_github.markdown
+++ b/source/_docs/ecosystem/backup/backup_github.markdown
@@ -35,7 +35,7 @@ Some best practices to consider before putting your configuration on GitHub:
### {% linkable_title Step 1: Installing and Initializing Git %}
-In order to put your configuration on GitHub, you must install the Git package on your Home Assistant server (instructions below will work on Raspberry Pi, Ubunutu or any Debian-based system) *Note: this isn't required in Hass.io, it's included as default so proceed to step 2*:
+In order to put your configuration on GitHub, you must install the Git package on your Home Assistant server (instructions below will work on Raspberry Pi, Ubuntu or any Debian-based system) *Note: this isn't required in Hass.io, it's included as default so proceed to step 2*:
```bash
$ sudo apt-get update
@@ -140,7 +140,7 @@ Every time you run this script, you will be prompted for a comment to describe t
[Travis CI](https://travis-ci.org) is a continuous integration testing system that runs every time the code in your repository is updated and allows you to validate that your code works on a fresh install.
- [Authorize Travis CI](https://travis-ci.org/auth) to have access to your GitHub repositories.
-- Create the build script that travis will run to test your repository.
+- Create the build script that Travis will run to test your repository.
- Create a dummy `secrets.yaml` for Travis.
Example .travis.yml
diff --git a/source/_docs/ecosystem/certificates/lets_encrypt.markdown b/source/_docs/ecosystem/certificates/lets_encrypt.markdown
index 0b62214a923..bcbecfaccce 100644
--- a/source/_docs/ecosystem/certificates/lets_encrypt.markdown
+++ b/source/_docs/ecosystem/certificates/lets_encrypt.markdown
@@ -27,7 +27,7 @@ This guide was added by mf_social on 16/03/2017 and was valid at the time of wri
* You have a basic understanding of the phrases I have used so far.
* You are not currently running anything on port 80 on your network (you'd know if you were).
* If you are not using Home Assistant on a Debian/Raspian/Hassbian system you will be able to convert any of the terminology I use in to the correct syntax for your system.
- * You understand that this is a 'guide' covering the general application of these things to the general masses and there are things outside of the scope of it, and it does not cover every eventuality (although I have made some notes where people may stumble). Also, I have used some turns of phrase to make it easier to understand for the novice reader which people of advanced knowledge may say is innacurate. My goal here is to get you through this guide with a satisfactory outcome and have a decent understanding of what you are doing and why, not to teach you advanced internet communication protocols.
+ * You understand that this is a 'guide' covering the general application of these things to the general masses and there are things outside of the scope of it, and it does not cover every eventuality (although I have made some notes where people may stumble). Also, I have used some turns of phrase to make it easier to understand for the novice reader which people of advanced knowledge may say is inaccurate. My goal here is to get you through this guide with a satisfactory outcome and have a decent understanding of what you are doing and why, not to teach you advanced internet communication protocols.
* Each step presumes you have fully completed the previous step successfully, so if you did an earlier step following a different guide, please ensure that you have not missed anything out that may affect the step you have jumped to, and ensure that you adapt any commands to take in to account different file placements from other guides.
Steps we will take:
@@ -113,7 +113,7 @@ static routers=192.168.0.1 <---- Your router's IP address
static domain_name_servers=192.168.0.1 <---- Your router's IP address
```
-It is important to note that the first three bytes of your static IP address and your router's IP address should be the same, eg:
+It is important to note that the first three bytes of your static IP address and your router's IP address should be the same, e.g.:
```text
Router: 192.168.0.1
@@ -179,9 +179,9 @@ http://203.0.113.12:8123
Can you see your Home Assistant instance? If not, your router may not support 'loopback' - try the next step anyway and if that works, and this one still doesn't, just remember that you cannot use loopback, so will have to use internal addresses when you're on your home network. More on this later on if it's relevant to you.
-Just to verify this isn't some kind of witchcraft that is actually using your internal network, pick up your phone, disconnect it from your wifi so that you are on your mobile data and not connected to the home network, put the same URL in the browser on your phone.
+Just to verify this isn't some kind of witchcraft that is actually using your internal network, pick up your phone, disconnect it from your WiFi so that you are on your mobile data and not connected to the home network, put the same URL in the browser on your phone.
-Can you see it now, from a device that is definitely not connected to your local network? Excellent! You now have a remotely accesible Home Assistant instance.
+Can you see it now, from a device that is definitely not connected to your local network? Excellent! You now have a remotely accessible Home Assistant instance.
But what if your external IP changes? Plus, remembering all those numbers is pretty hard, isn't it? Read on to get yourself set up with a word-based URL at DuckDNS that will track any changes to your IP address so you don't have to stress anymore.
@@ -222,7 +222,7 @@ What now happens behind the scenes is this:
Did it work? Super!
-You now have a remotely accesible Home Assistant instance that has a text-based URL and will not drop out if your service provider changes your IP. But, it is only as secure as the password you set, which can be snooped during your session by a malicious hacker with relative ease. So we need to set up some encryption with TLS/SSL, read on to find out how.
+You now have a remotely accessible Home Assistant instance that has a text-based URL and will not drop out if your service provider changes your IP. But, it is only as secure as the password you set, which can be snooped during your session by a malicious hacker with relative ease. So we need to set up some encryption with TLS/SSL, read on to find out how.
### {% linkable_title 4 - Obtain a TLS/SSL certificate from Let's Encrypt %}
diff --git a/source/_docs/ecosystem/certificates/tls_domain_certificate.markdown b/source/_docs/ecosystem/certificates/tls_domain_certificate.markdown
index 91198ddd4f7..d6cec084712 100644
--- a/source/_docs/ecosystem/certificates/tls_domain_certificate.markdown
+++ b/source/_docs/ecosystem/certificates/tls_domain_certificate.markdown
@@ -12,7 +12,7 @@ redirect_from: /cookbook/tls_domain_certificate/
If your Home Assistant instance is only accessible from your local network you can still protect the communication between your browsers and the frontend with SSL/TLS. You can use [Self-sign certificate](/cookbook/tls_self_signed_certificate/) but your browser will present a warning and some https-only features might not work.
-### {% linkable_title Prerequirement for this guide %}
+### {% linkable_title Requirement for this guide %}
* Your Home Assistant instance is not exposed to the internet. If it is - use [this guide]({{site_root}}/blog/2015/12/13/setup-encryption-using-lets-encrypt/)
* You control a public domain name. The domain doesn't have to point to a site. A domain controlled by a *trusted* friend will do. (A friend you trust not to MITM you)
@@ -45,7 +45,7 @@ Once this is deployed,
Press Enter to Continue
```
-* Deploy the value to TXT field using your domain registar.
+* Deploy the value to TXT field using your domain registrar.
* Go to a site that queries domain record. For example [this one](https://mxtoolbox.com/TXTLookup.aspx) and look if it sees your brand new TXT field (Don't forget to enter the full domain: `_acme-challenge.mydomain.com`)
* Press Enter at certbot prompt.
diff --git a/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown b/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown
index 757e0b28672..c4f7c536741 100644
--- a/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown
+++ b/source/_docs/ecosystem/certificates/tls_self_signed_certificate.markdown
@@ -20,7 +20,7 @@ Change to your Home Assistant [configuration directory](/getting-started/configu
The certificate **must** be `.pem` extension.
-If you are going to use this certificate with the iOS app, you need to ensure you complete **all** fields during the cetificate creation process, then:
+If you are going to use this certificate with the iOS app, you need to ensure you complete **all** fields during the certificate creation process, then:
* Send **only** the `certificate.pem` file to the iOS device, using airdrop or other transfer method.
* Open the `.pem` file on the iOS device, follow the prompts to trust and install it.
diff --git a/source/_docs/ecosystem/scenegen.markdown b/source/_docs/ecosystem/scenegen.markdown
index 37d2534b086..0463a834242 100644
--- a/source/_docs/ecosystem/scenegen.markdown
+++ b/source/_docs/ecosystem/scenegen.markdown
@@ -10,7 +10,7 @@ footer: true
redirect_from: /ecosystem/scenegen/
---
-Scenegen is a scene generation tool for [Home Assistant](/) home automation software. It creates scenes by example, by reading the current states of devices and outputting a corresponding scene. Scenegen is written in python using Home Assistant's RESTFul API so can be run from anywhere. It currently supports lights and switches only.
+Scenegen is a scene generation tool for [Home Assistant](/) home automation software. It creates scenes by example, by reading the current states of devices and outputting a corresponding scene. Scenegen is written in python using Home Assistant's RESTful API so can be run from anywhere. It currently supports lights and switches only.
## {% linkable_title Installation %}
@@ -86,7 +86,7 @@ entities:
brightness: 28
```
-This output can be cut and pasted into your configuration.yaml file as required (ensuring correct indentatation of course).
+This output can be cut and pasted into your configuration.yaml file as required (ensuring correct indentation of course).
Scenegen supports all documented effects for lights including transitions and flash effects, however generally it is easier to run scenegen to get the basic setup and add any effects manually later.
diff --git a/source/_docs/frontend/browsers.markdown b/source/_docs/frontend/browsers.markdown
index 0003e531ec2..520f77135c4 100644
--- a/source/_docs/frontend/browsers.markdown
+++ b/source/_docs/frontend/browsers.markdown
@@ -10,7 +10,7 @@ footer: true
redirect_from: /getting-started/browsers/
---
-Home Assistant requires a web browser to show the frontend and supports all major modern browsers. We don't test the web interface against all available browsers but this page tracks different browsers on various operating systems and should help you to pick a browser which works. The "Release" column contains the release number which were tested. This doen't mean that older or newer releases not work.
+Home Assistant requires a web browser to show the frontend and supports all major modern browsers. We don't test the web interface against all available browsers but this page tracks different browsers on various operating systems and should help you to pick a browser which works. The "Release" column contains the release number which were tested. This doesn't mean that older or newer releases not work.
If a browser is listed as working but you are still having problems, it is possible that some add-on or extension may be the problem. Some add-ons or extension are known to cause issue with the frontend, but it's not possible to test them all. If you are having issues with the frontend displaying correctly, you should disable all your add-ons or extensions and enable them one at a time.
diff --git a/source/_docs/installation/docker.markdown b/source/_docs/installation/docker.markdown
index 05cf090ec00..7b248911b78 100644
--- a/source/_docs/installation/docker.markdown
+++ b/source/_docs/installation/docker.markdown
@@ -53,7 +53,7 @@ As Synology within DSM now supports Docker (with a neat UI), you can simply inst
The steps would be:
* Install "Docker" package on your Synology NAS
* Launch Docker-app and move to "Registry"-section
-* Find "homeassistant/home-assistant" within registry and click on "Download". Choose the "latest" tag, this will make verison updates easier later on.
+* Find "homeassistant/home-assistant" within registry and click on "Download". Choose the "latest" tag, this will make version updates easier later on.
* Wait for some time until your NAS has pulled the image
* Move to the "Image"-section of the Docker-app
* Click on "Launch"
@@ -185,7 +185,7 @@ $ docker-compose restart
### {% linkable_title Exposing Devices %}
-In order to use Z-Wave, ZigBbee or other components that require access to devices, you need to map the appropriate device into the container. Ensure the user that is running the container has the correct privileges to access the `/dev/tty*` file, then add the device mapping to your docker command:
+In order to use Z-Wave, ZigBee or other components that require access to devices, you need to map the appropriate device into the container. Ensure the user that is running the container has the correct privileges to access the `/dev/tty*` file, then add the device mapping to your docker command:
```bash
$ docker run -d --name="home-assistant" -v /path/to/your/config:/config \
diff --git a/source/_docs/installation/freenas.markdown b/source/_docs/installation/freenas.markdown
index 6679275764c..654f3e084db 100644
--- a/source/_docs/installation/freenas.markdown
+++ b/source/_docs/installation/freenas.markdown
@@ -46,7 +46,7 @@ Make `/etc/rc.local` executable so it runs on startup
# chmod 755 /etc/rc.local
```
-Finally restart the jail from the Freenas GUI.
+Finally restart the jail from the FreeNAS GUI.
USB Z-wave sticks may give `dmesg` warnings similar to "data interface 1, has no CM over data, has no break". This doesn't impact the function of the Z-wave stick in Hass. Just make sure the proper `/dev/cu*` is used in the Home Assistant `configuration.yaml` file.
diff --git a/source/_docs/installation/hassbian/installation.markdown b/source/_docs/installation/hassbian/installation.markdown
index bfc7d4e4d72..41af2edf384 100644
--- a/source/_docs/installation/hassbian/installation.markdown
+++ b/source/_docs/installation/hassbian/installation.markdown
@@ -40,7 +40,7 @@ The following extras are included on the image:
### {% linkable_title Wireless Network %}
-After flashing the image to your SD Card open the partition `boot` and create a new file `wpa_supplicant.conf`. Edit the file and enter your network credentials. For more information visit [Setting up Wifi for Raspbian][wifi-setup]. During start the file will automatically be copied in the right folder and the network connection will be established. The file could look like this:
+After flashing the image to your SD Card open the partition `boot` and create a new file `wpa_supplicant.conf`. Edit the file and enter your network credentials. For more information visit [Setting up WiFi for Raspbian][wifi-setup]. During start the file will automatically be copied in the right folder and the network connection will be established. The file could look like this:
```conf
country=SE
@@ -55,7 +55,7 @@ network={
You may need to adjust the country code depending upon where you are. A list of codes can be found [here](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements).
-If you are running in trouble with your Wifi connection (for [further details](https://www.raspberrypi.org/forums/viewtopic.php?t=207882)), check the output of the following command:
+If you are running in trouble with your WiFi connection (for [further details](https://www.raspberrypi.org/forums/viewtopic.php?t=207882)), check the output of the following command:
```bash
$ sudo rfkill list
diff --git a/source/_docs/installation/virtualenv.markdown b/source/_docs/installation/virtualenv.markdown
index 336ced4598e..59f22869f16 100644
--- a/source/_docs/installation/virtualenv.markdown
+++ b/source/_docs/installation/virtualenv.markdown
@@ -12,7 +12,7 @@ redirect_from: /getting-started/installation-virtualenv/
If you already have Python 3.5.3 or later installed, you can easily give Home Assistant a spin.
-It's recommended when installing Python packages that you use a [virtual environment](https://docs.python.org/3.5/library/venv.html#module-venv). This will make sure that your Python installation and Home Assistant installation won't impact one another. The following steps will work on most unix like systems.
+It's recommended when installing Python packages that you use a [virtual environment](https://docs.python.org/3.5/library/venv.html#module-venv). This will make sure that your Python installation and Home Assistant installation won't impact one another. The following steps will work on most UNIX like systems.
_(If you're on a Debian based system, you will need to install Python virtual environment support using `apt-get install python3-pip python3-venv`.)_
diff --git a/source/_docs/mqtt/broker.markdown b/source/_docs/mqtt/broker.markdown
index 9da45c0aa2b..ddb5ee8f8dd 100644
--- a/source/_docs/mqtt/broker.markdown
+++ b/source/_docs/mqtt/broker.markdown
@@ -59,7 +59,7 @@ mqtt:
### {% linkable_title Run your own %}
-Along with the embedded broker this is the most private option, but it requires a bit more work. There are multiple free and open-source brokers to pick from: eg. [Mosquitto](http://mosquitto.org/), [EMQ](http://emqtt.io/), or [Mosca](http://www.mosca.io/).
+Along with the embedded broker this is the most private option, but it requires a bit more work. There are multiple free and open-source brokers to pick from: e.g. [Mosquitto](http://mosquitto.org/), [EMQ](http://emqtt.io/), or [Mosca](http://www.mosca.io/).
```yaml
# Example configuration.yaml entry
@@ -98,7 +98,7 @@ protocol:
type: string
certificate:
required: false
- description: Path to the certificate file, eg. `/home/user/.homeassistant/server.crt`.
+ description: Path to the certificate file, e.g. `/home/user/.homeassistant/server.crt`.
type: string
tls_insecure:
required: false
diff --git a/source/_docs/z-wave/adding.markdown b/source/_docs/z-wave/adding.markdown
index fdb5a411a20..98c2c5efbae 100644
--- a/source/_docs/z-wave/adding.markdown
+++ b/source/_docs/z-wave/adding.markdown
@@ -24,7 +24,7 @@ Don't use this for [secure devices](/docs/z-wave/adding/#adding-secure-devices),
Don't use the OpenZWave control panel (OZWCP), **or the physical button on a controller**, to add or remove devices. Many devices will only send the information about their capabilities at the time you include them. If you use the OpenZWave control panel, or the button on a device, then Home Assistant won't have that information. Using the physical button on a controller will also result in a non-security inclusion being performed, which may limit the features the device supports.
-When you add a device, it may initially appear without a specific entity ID (eg `zwave.__`) and without other identifying information. Running a *Heal* should help speed this process up, and you'll need to run a *Heal* anyway so that all the devices in your Z-Wave network learn about the new device. You *might* need to restart Home Assistant (not reboot the system) to have the entity ID fully visible.
+When you add a device, it may initially appear without a specific entity ID (e.g. `zwave.__`) and without other identifying information. Running a *Heal* should help speed this process up, and you'll need to run a *Heal* anyway so that all the devices in your Z-Wave network learn about the new device. You *might* need to restart Home Assistant (not reboot the system) to have the entity ID fully visible.
## {% linkable_title Network Key %}
diff --git a/source/_docs/z-wave/control-panel.markdown b/source/_docs/z-wave/control-panel.markdown
index 2556722cb8d..7ee257b0fdc 100644
--- a/source/_docs/z-wave/control-panel.markdown
+++ b/source/_docs/z-wave/control-panel.markdown
@@ -70,7 +70,7 @@ Here is where you [include and exclude](/docs/z-wave/adding/) Z-Wave devices fro
* **retries** How many retries have been made to send messages to this node
* **sentCnt** How many messages have been sent to the node
* **sentFailed** How many messages that were sent weren't acknowledged
-* **sentTS** The date and time the last message was sent to the ndoe
+* **sentTS** The date and time the last message was sent to the node
* **wake_up_interval** *Battery powered devices only* - the wakeup interval of the device, in seconds
@@ -82,7 +82,7 @@ Battery powered devices need to be awake before you can use the Z-Wave control p
This is a dropdown where you can select all the entities of this node. Once selected you can then use:
* **Refresh Entity** to refresh just that entity's values
-* **Entity Attributes** to display the attributes of that entity (eg its friendly name, the ID of the node, etc)
+* **Entity Attributes** to display the attributes of that entity (e.g. its friendly name, the ID of the node, etc)
Here you can mark a device as requiring polling so the controller is aware of changes because the device doesn't send updates itself. Do see the information on [polling here](/docs/z-wave/devices/#polling), since excessive polling can break your Z-Wave network.
@@ -130,7 +130,7 @@ Set the new selection by pressing the **Set Protection** button.
## {% linkable_title Node user codes %}
-If your node has user codes, you can set and delete them. The format is raw hex Ascii code. Below the input you will see your actual code. For normal nodes this is as follows:
+If your node has user codes, you can set and delete them. The format is raw hex ASCII code. Below the input you will see your actual code. For normal nodes this is as follows:
```yaml
\x30 = 0
\x31 = 1
@@ -144,7 +144,7 @@ If your node has user codes, you can set and delete them. The format is raw hex
\x39 = 9
```
Some non compliant device like tag readers, have implemented to use raw hex code.
-Please refer to a hex ascii table to set your code. Example: http://www.asciitable.com/
+Please refer to a hex ASCII table to set your code. Example: http://www.asciitable.com/
Here is a small Python program than will take numbers on the command line and print the correct sequence for compliant devices:
diff --git a/source/_docs/z-wave/device-specific.markdown b/source/_docs/z-wave/device-specific.markdown
index add87e6abdc..72be7d2a796 100644
--- a/source/_docs/z-wave/device-specific.markdown
+++ b/source/_docs/z-wave/device-specific.markdown
@@ -73,7 +73,7 @@ crw-rw---- 1 root dialout 204, 64 Sep 2 14:38 /dev/ttyAMA0
at this point simply add your user (homeassistant) to the dialout group:
```bash
-$ sudo usermod -a -G dialout homeassistant
+$ sudo usermod -a -G dialout homeassistant
```
Finally, reboot again to make those changes active. It's has been tested on hassbian and has been reported that this is also required on the Pi2.
diff --git a/source/_docs/z-wave/installation.markdown b/source/_docs/z-wave/installation.markdown
index a734e976e51..15693c77b63 100644
--- a/source/_docs/z-wave/installation.markdown
+++ b/source/_docs/z-wave/installation.markdown
@@ -104,7 +104,7 @@ device_config / device_config_domain / device_config_glob:
type: integer
default: 2
invert_openclose_buttons:
- description: Inverts function of the open and close buttons for the cover domain. This will not invert the positon and state reporting.
+ description: Inverts function of the open and close buttons for the cover domain. This will not invert the position and state reporting.
required: false
type: boolean
default: False
diff --git a/source/_docs/z-wave/services.markdown b/source/_docs/z-wave/services.markdown
index 8b8d9d32276..a14d9e8539d 100644
--- a/source/_docs/z-wave/services.markdown
+++ b/source/_docs/z-wave/services.markdown
@@ -17,7 +17,7 @@ The `zwave` component exposes multiple services to help maintain the network. Al
| add_node_secure | Put the Z-Wave controller in secure inclusion mode. Allows you to add a new device with secure communications to the Z-Wave network. |
| cancel_command | Cancels a running Z-Wave command. If you have started an add_node or remove_node command, and decide you are not going to do it, then this must be used to stop the inclusion/exclusion command. |
| change_association | Add or remove an association in the Z-Wave network |
-| heal_network | Tells the controller to "heal" the Z-Wave network. Basically asks the nodes to tell the controller all of their neighbors so the controller can refigure out optimal routing. |
+| heal_network | Tells the controller to "heal" the Z-Wave network. Basically asks the nodes to tell the controller all of their neighbors so the controller can re-figure out optimal routing. |
| heal_node | Tells the controller to "heal" a specific node on the network. Requires `node_id` field. You can also force return route update with `return_routes` field.
| print_config_parameter | Prints Z-Wave node's config parameter value to the (console) log. |
| print_node | Print all states of Z-Wave node. |
diff --git a/source/ios/beta.markdown b/source/ios/beta.markdown
index da0a5e1f3d7..100994d7f51 100644
--- a/source/ios/beta.markdown
+++ b/source/ios/beta.markdown
@@ -1,7 +1,7 @@
---
layout: page
title: "Join Home Assistant iOS beta"
-description: "Invititation to join the Home Assistant iOS beta."
+description: "Invitation to join the Home Assistant iOS beta."
release_date: 2016-10-24 15:00:00 -0700
sidebar: true
comments: false
diff --git a/source/lovelace/views.markdown b/source/lovelace/views.markdown
index e25c77b39a4..725f43894f1 100644
--- a/source/lovelace/views.markdown
+++ b/source/lovelace/views.markdown
@@ -82,7 +82,7 @@ Picture card config:
## {% linkable_title Icons %}
-If you define an icon the title will be used as a tooltip.
+If you define an icon the title will be used as a tool-tip.
### {% linkable_title Example %}
From 683362d282d0a571ab560b1946e02419778f6171 Mon Sep 17 00:00:00 2001
From: Tom French
Date: Sun, 7 Oct 2018 16:52:47 +0100
Subject: [PATCH 038/217] Fix typo in sensor.starlingbank.markdown (#6581)
Corrected "Staring" to "Starling"
---
source/_components/sensor.starlingbank.markdown | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/source/_components/sensor.starlingbank.markdown b/source/_components/sensor.starlingbank.markdown
index e997e0da2a3..1a215ac9ccf 100644
--- a/source/_components/sensor.starlingbank.markdown
+++ b/source/_components/sensor.starlingbank.markdown
@@ -24,7 +24,7 @@ You can find more information about Starling Bank at [their website](https://www
## {% linkable_title Access Token %}
-Once you have your own Starling bank account you will need to sign up for a Staring developer account [here](https://developer.starlingbank.com/signup). You won't need to do any development but you will need to get a "Personal Access Token" that will allow the integration to access your account balance.
+Once you have your own Starling bank account you will need to sign up for a Starling developer account [here](https://developer.starlingbank.com/signup). You won't need to do any development but you will need to get a "Personal Access Token" that will allow the integration to access your account balance.
You control what access is granted using this token. This integration only needs very basic access (see below).
From a69a3e51fe4aa679f796855b7a6c4cd44e302d57 Mon Sep 17 00:00:00 2001
From: Mryck
Date: Sun, 7 Oct 2018 18:58:24 +0200
Subject: [PATCH 039/217] Update apple TV configuration variables (#6583)
* Update appleTV configuration variables
* Add missing new line
---
source/_components/apple_tv.markdown | 29 +++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/source/_components/apple_tv.markdown b/source/_components/apple_tv.markdown
index e9008af6385..c9a0e3f0606 100644
--- a/source/_components/apple_tv.markdown
+++ b/source/_components/apple_tv.markdown
@@ -42,13 +42,28 @@ apple_tv:
credentials: CREDENTIALS_2
```
-Configuration variables:
-
-- **host** (*Required*): The IP-address of the device.
-- **login_id** (*Required*): An identifier used to login to the device, see below.
-- **name** (*Optional*): The name of the device used in the frontend.
-- **start_off** (*Optional*): Set to true if the device should start in fake standby.
-- **credentials** (*Optional*): Credentials used for AirPlay playback.
+{% configuration %}
+host:
+ description: The IP-address of the device.
+ required: true
+ type: string
+login_id:
+ description: An identifier used to login to the device, see below.
+ required: true
+ type: string
+name:
+ description: The name of the device used in the frontend.
+ required: false
+ type: string
+start_off:
+ description: Set to true if the device should start in fake standby.
+ required: false
+ type: boolean
+credentials:
+ description: Credentials used for AirPlay playback.
+ required: false
+ type: string
+{% endconfiguration %}
In order to connect to the device, you need a *login id*. The easiest way to obtain this identifier is to use the `apple_tv_scan` service (described below). Additional information about `start_off` and `credentials` can also be found under the guides section.
From e673169e3eec556a7226c709381d2b19eebe9ba7 Mon Sep 17 00:00:00 2001
From: Amir Hanan
Date: Sun, 7 Oct 2018 20:01:32 +0300
Subject: [PATCH 040/217] Configuration ezfix (#6578)
* Configuration ezfix
#6385 related
* update int to integer
Documentation states "int" as possible type - a bit confusing
---
.../switch.acer_projector.markdown | 25 +++++++++++++------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/source/_components/switch.acer_projector.markdown b/source/_components/switch.acer_projector.markdown
index 7599cd6d96e..1e5bfb299c0 100644
--- a/source/_components/switch.acer_projector.markdown
+++ b/source/_components/switch.acer_projector.markdown
@@ -27,10 +27,21 @@ switch:
filename: /dev/ttyUSB0
```
-Configuration variables:
-
-- **filename** (*Required*): The pipe where the projector is connected to.
-- **name** (*Optional*): The name to use when displaying this switch.
-- **timeout** (*Optional*): Timeout for the connection in seconds.
-- **write_timeout** (*Optional*): Write timeout in seconds.
-
+{% configuration %}
+filename:
+ description: The pipe where the projector is connected to.
+ required: true
+ type: string
+name:
+ description: The name to use when displaying this switch.
+ required: false
+ type: string
+timeout:
+ description: Timeout for the connection in seconds.
+ required: false
+ type: integer
+write_timeout:
+ description: Write timeout in seconds.
+ required: false
+ type: integer
+{% endconfiguration %}
From 66f89ed8c65651b980b0572b2e141590c93ce1a3 Mon Sep 17 00:00:00 2001
From: Paulus Schoutsen
Date: Sun, 7 Oct 2018 23:34:21 +0200
Subject: [PATCH 041/217] Add pending log
---
source/_posts/2018-10-12-release-80.markdown | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/source/_posts/2018-10-12-release-80.markdown b/source/_posts/2018-10-12-release-80.markdown
index fddb6e938b6..c7802ae1071 100644
--- a/source/_posts/2018-10-12-release-80.markdown
+++ b/source/_posts/2018-10-12-release-80.markdown
@@ -11,6 +11,14 @@ categories: Release-Notes
og_image: /images/blog/2018-10-release-0.80/components.png
---
+Hacktoberfest!!
+
+Allow setting up MQTT broker from Hass.io via a config entry
+
+IFTTT config entry and new webhook
+
+Tradfri Switches
+
## {% linkable_title New Platforms %}
- Extract lovelace to it's own component ([@balloob] - [#16816]) ([frontend docs]) ([lovelace docs]) (new-platform)
From be03e68f08d561b0d0f0d98dd97961497a323f82 Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Mon, 8 Oct 2018 11:48:53 +0200
Subject: [PATCH 042/217] Update FFMPEG component configuration variable
(#6599)
Update style of FFMPEG component documentation to follow new configuration variables description.
Related to #6385.
---
.../binary_sensor.ffmpeg_motion.markdown | 49 +++++++++++++++----
.../binary_sensor.ffmpeg_noise.markdown | 48 ++++++++++++++----
source/_components/camera.ffmpeg.markdown | 19 +++++--
source/_components/ffmpeg.markdown | 17 +++++--
4 files changed, 103 insertions(+), 30 deletions(-)
diff --git a/source/_components/binary_sensor.ffmpeg_motion.markdown b/source/_components/binary_sensor.ffmpeg_motion.markdown
index 0607a0127af..eaf15a86a79 100644
--- a/source/_components/binary_sensor.ffmpeg_motion.markdown
+++ b/source/_components/binary_sensor.ffmpeg_motion.markdown
@@ -35,16 +35,45 @@ binary_sensor:
input: FFMPEG_SUPPORTED_INPUT
```
-Configuration variables:
-
-- **input** (*Required*): An FFmpeg-compatible input file, stream, or feed.
-- **name** (*Optional*): Override the name of your camera for the frontend.
-- **initial_state** (*Optional*): Start `ffmpeg` with Home Assistant. Defaults to `true`.
-- **changes** (*Optional*): How much needs to change between two frames to detect it as motion (a lower value is more sensitive). Defaults to 10%.
-- **reset** (*Optional*): The time to reset the state after no new motion is detected. Defaults to 20 seconds.
-- **repeat** (*Optional*): How many events need to be detected in *repeat_time* in order to trigger a motion. Defaults to 0 repeats (deactivated).
-- **repeat_time** (*Optional*): The span of time *repeat* events need to occur in before triggering a motion. Defaults to 0 seconds (deactivated).
-- **extra_arguments** (*Optional*): Extra options to pass to `ffmpeg`, e.g., video denoise filtering.
+{% configuration %}
+input:
+ description: An FFmpeg-compatible input file, stream, or feed.
+ required: true
+ type: string
+name:
+ description: Override the name of your camera for the frontend.
+ required: false
+ type: string
+initial_state:
+ description: Start `ffmpeg` with Home Assistant.
+ required: false
+ default: true
+ type: boolean
+changes:
+ description: How much needs to change between two frames to detect it as motion, value in percentage (a lower value is more sensitive).
+ required: false
+ default: 10%
+ type: integer
+reset:
+ description: The time to reset the state after no new motion is detected.
+ required: false
+ default: 20
+ type: integer
+repeat:
+ description: How many events need to be detected in *repeat_time* in order to trigger a motion, 0 repeats means deactivated.
+ required: false
+ default: 0
+ type: integer
+repeat_time:
+ description: The span of time *repeat* events need to occur in before triggering a motion, 0 seconds means deactivated.
+ required: false
+ default: 0
+ type: integer
+extra_arguments:
+ description: Extra options to pass to `ffmpeg`, e.g., video denoise filtering.
+ required: false
+ type: string
+{% endconfiguration %}
To experiment with values (changes/100 is the scene value in `ffmpeg`):
diff --git a/source/_components/binary_sensor.ffmpeg_noise.markdown b/source/_components/binary_sensor.ffmpeg_noise.markdown
index 842be8203e1..ae2077cd298 100644
--- a/source/_components/binary_sensor.ffmpeg_noise.markdown
+++ b/source/_components/binary_sensor.ffmpeg_noise.markdown
@@ -30,16 +30,44 @@ binary_sensor:
input: FFMPEG_SUPPORTED_INPUT
```
-Configuration variables:
-
-- **input** (*Required*): An FFmpeg-compatible input file, stream, or feed.
-- **name** (*Optional*): Override the name of your camera.
-- **initial_state** (*Optional*): Default true. Start ffmpeg with home-assistant.
-- **peak** (*Optional*): Default -30. The threshold of detecting noise, in dB. 0 is very loud and -100 is low.
-- **duration** (*Optional*): Default 1 second. How long the noise needs to be over the peak to trigger the state.
-- **reset** (*Optional*): Default 20 seconds. The time to reset the state after no new noise is over the peak.
-- **extra_arguments** (*Optional*): Extra options to pass to `ffmpeg`, like audio frequency filtering.
-- **output** (*Optional*): Allows you to send the audio output of this sensor to an Icecast server or other FFmpeg-supported output, e.g., to stream with Sonos after a state is triggered.
+{% configuration %}
+input:
+ description: An FFmpeg-compatible input file, stream, or feed.
+ required: true
+ type: string
+name:
+ description: Override the name of your camera.
+ required: false
+ type: string
+initial_state:
+ description: Start ffmpeg with home-assistant.
+ required: false
+ default: true
+ type: boolean
+peak:
+ description: The threshold of detecting noise, in dB. 0 is very loud and -100 is low.
+ required: false
+ default: -30
+ type: integer
+duration:
+ description: How long the noise needs to be over the peak to trigger the state.
+ required: false
+ default: 1
+ type: integer
+reset:
+ description: The time to reset the state after no new noise is over the peak.
+ required: false
+ default: 20
+ type: integer
+extra_arguments:
+ description: Extra options to pass to `ffmpeg`, like audio frequency filtering.
+ required: false
+ type: string
+output:
+ description: Allows you to send the audio output of this sensor to an Icecast server or other FFmpeg-supported output, e.g., to stream with Sonos after a state is triggered.
+ required: false
+ type: string
+{% endconfiguration %}
To experiment with values:
diff --git a/source/_components/camera.ffmpeg.markdown b/source/_components/camera.ffmpeg.markdown
index 481c835a153..e87ea211844 100644
--- a/source/_components/camera.ffmpeg.markdown
+++ b/source/_components/camera.ffmpeg.markdown
@@ -25,11 +25,20 @@ camera:
input: FFMPEG_SUPPORTED_INPUT
```
-Configuration variables:
-
-- **input** (*Required*): An FFmpeg-compatible input file, stream, or feed.
-- **name** (*Optional*): Override the name of your camera.
-- **extra_arguments** (*Optional*): Extra options to pass to `ffmpeg`, e.g., image quality or video filter options.
+{% configuration %}
+input:
+ description: An FFmpeg-compatible input file, stream, or feed.
+ required: true
+ type: string
+name:
+ description: Override the name of your camera.
+ required: false
+ type: string
+extra_arguments:
+ description: Extra options to pass to `ffmpeg`, e.g., image quality or video filter options.
+ required: false
+ type: string
+{% endconfiguration %}
### {% linkable_title Image quality %}
diff --git a/source/_components/ffmpeg.markdown b/source/_components/ffmpeg.markdown
index 38034e4e06a..24f4f30de98 100644
--- a/source/_components/ffmpeg.markdown
+++ b/source/_components/ffmpeg.markdown
@@ -29,10 +29,18 @@ To set it up, add the following information to your `configuration.yaml` file:
ffmpeg:
```
-Configuration variables:
-
-- **ffmpeg_bin** (*Optional*): Default `ffmpeg`. The name or path to the `ffmpeg` binary.
-- **run_test** (*Optional*): Default True. Check if `input` is usable by ffmpeg.
+{% configuration %}
+ffmpeg_bin:
+ description: The name or path to the `ffmpeg` binary.
+ required: false
+ default: ffmpeg
+ type: string
+run_test:
+ description: Check if `input` is usable by ffmpeg.
+ required: false
+ default: True
+ type: boolean
+{% endconfiguration %}
### {% linkable_title Raspbian Debian Jessie Lite Installations %}
To get the binary on Raspbian Debian Jessie Lite on a RPi you need to perform the following:
@@ -100,4 +108,3 @@ Stream mapping:
Press [q] to stop, [?] for help
frame= 223 fps= 40 q=-1.0 Lsize= 16709kB time=00:00:07.40 bitrate=18497.5kbits/s dup=58 drop=0 speed=1.32x
```
-
From a64e0bf9b6ed6ff1291145bb159b4b4dbecdabcc Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Mon, 8 Oct 2018 11:53:18 +0200
Subject: [PATCH 043/217] Update Axis component configuration variable (#6595)
Update style of Axis component documentation to follow new configuration variables description.
---
source/_components/axis.markdown | 74 ++++++++++++++++++++++++--------
1 file changed, 56 insertions(+), 18 deletions(-)
diff --git a/source/_components/axis.markdown b/source/_components/axis.markdown
index 9b2faadd988..fc630149a00 100644
--- a/source/_components/axis.markdown
+++ b/source/_components/axis.markdown
@@ -30,24 +30,62 @@ axis:
- camera
```
-## {% linkable_title Configuration variables %}
-
-- **device** (*Required*): Unique name
-- **host** (*Required*): The IP address to your Axis device.
-- **username** (*Optional*): The username to your Axis device. Default 'root'.
-- **password** (*Optional*): The password to your Axis device. Default 'pass'.
-- **trigger_time** (*Optional*): Minimum time (in seconds) a sensor should keep its positive value. Default 0.
-- **port** (*Optional*): Configure port web server of device is accessible from. Default 80.
-- **location** (*Optional*): Physical location of your Axis device. Default not set.
-- **include** (*Required*): This cannot be empty else there would be no use adding the device at all.
- - **camera**: Stream MJPEG video to Home Assistant.
- - **motion**: The built-in motion detection in Axis cameras.
- - **vmd3**: ACAP Motion Detection app which has better algorithms for motion detection.
- - **pir**: PIR sensor that can trigger on a motion.
- - **sound**: Sound detector.
- - **daynight**: Certain cameras have day/night mode if they have built-in IR lights.
- - **tampering**: Signals when camera believes that it has been tampered with.
- - **input**: Trigger on whatever you have connected to device input port.
+{% configuration %}
+device:
+ description: A unique name
+ required: true
+ type: string
+host:
+ description: The IP address to your Axis device.
+ required: true
+ type: string
+username:
+ description: The username to your Axis device.
+ required: false
+ default: root
+ type: string
+password:
+ description: The password to your Axis device.
+ required: false
+ default: pass
+ type: string
+trigger_time:
+ description: Minimum time (in seconds) a sensor should keep its positive value.
+ required: false
+ default: 0
+ type: integer
+port:
+ description: Configure port web server of device is accessible from.
+ required: false
+ default: 80
+ type: integer
+location:
+ description: Physical location of your Axis device.
+ required: false
+ default: not set
+ type: string
+include:
+ description: This cannot be empty else there would be no use adding the device at all.
+ required: true
+ type: map
+ keys:
+ camera:
+ description: Stream MJPEG video to Home Assistant.
+ motion:
+ description: The built-in motion detection in Axis cameras.
+ vmd3:
+ description: ACAP Motion Detection app which has better algorithms for motion detection.
+ pir:
+ description: PIR sensor that can trigger on a motion.
+ sound:
+ description: Sound detector.
+ daynight:
+ description: Certain cameras have day/night mode if they have built-in IR lights.
+ tampering:
+ description: Signals when camera believes that it has been tampered with.
+ input:
+ description: Trigger on whatever you have connected to device input port.
+{% endconfiguration %}
A full configuration example could look like this:
From c512ab742bfe7529fba90ad8b4453e1c768f04b8 Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Mon, 8 Oct 2018 19:25:17 +0200
Subject: [PATCH 044/217] Update Concord232 binary sensor configuration
variable (#6598)
* Update Concord232 binary sensor configuration variable
Update style of Concord232 binary sensor documentation to follow new configuration variables description.
Related to #6385.
* Update binary_sensor.concord232.markdown
---
.../binary_sensor.concord232.markdown | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/source/_components/binary_sensor.concord232.markdown b/source/_components/binary_sensor.concord232.markdown
index 39320bb6723..f734d4afa5b 100644
--- a/source/_components/binary_sensor.concord232.markdown
+++ b/source/_components/binary_sensor.concord232.markdown
@@ -22,8 +22,15 @@ binary_sensor:
- platform: concord232
```
-Configuration variables:
-
-- **host** (*Optional*): The host where the concord232 server process is running. Defaults to `localhost`.
-- **port** (*Optional*): The port where the Alarm panel is listening. Defaults to 5007.
-
+{% configuration %}
+host:
+ description: The host where the concord232 server process is running.
+ required: false
+ default: localhost
+ type: string
+port:
+ description: The port where the Alarm panel is listening.
+ required: false
+ default: 5007
+ type: integer
+{% endconfiguration %}
From 222402996435d5bd3f28df4a6d3c493a9aa6cbfe Mon Sep 17 00:00:00 2001
From: Gerard
Date: Mon, 8 Oct 2018 19:50:45 +0200
Subject: [PATCH 045/217] Add Device Tracker to page name (#6591)
---
source/_components/device_tracker.mercedesme.markdown | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/source/_components/device_tracker.mercedesme.markdown b/source/_components/device_tracker.mercedesme.markdown
index 3707d5ca1cd..c436e507c84 100644
--- a/source/_components/device_tracker.mercedesme.markdown
+++ b/source/_components/device_tracker.mercedesme.markdown
@@ -1,6 +1,6 @@
---
layout: page
-title: "Mercedes me"
+title: "Mercedes me Device Tracker"
description: "Instructions on for how to integrate Mercedes me into Home Assistant."
date: 2018-01-27 10:00
sidebar: true
From 3af63feb83c8a34e7eca1b448b469825d4f32468 Mon Sep 17 00:00:00 2001
From: Christian Studer
Date: Mon, 8 Oct 2018 19:52:35 +0200
Subject: [PATCH 046/217] Fixes multiple typos (#6588)
---
.../authentication/multi-factor-auth.markdown | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown
index 37abf070cd6..3ba8d508066 100644
--- a/source/_docs/authentication/multi-factor-auth.markdown
+++ b/source/_docs/authentication/multi-factor-auth.markdown
@@ -16,11 +16,11 @@ This is an advanced feature. If misconfigured, you will not be able to access Ho
Besides the authentication providers, it's also possible to configure multi-factor authentication modules. These authentication modules will require the user to solve a second challenge besides just logging in. The idea is that you ask the user for something they know, their username/password, and something they have, like a time-based authentication token from their phone.
-The multi-factor authentication module can be used mixed-matched with authentication providers. After the normal authentication provider validation, the login flow will ask the user for additional challenge(s) if there are multi-factor authentication modules enabled for this user. If more than one mutli-factor authentication module is enabled, the user can select one of them during the login.
+The multi-factor authentication module can be used mixed-matched with authentication providers. After the normal authentication provider validation, the login flow will ask the user for additional challenge(s) if there are multi-factor authentication modules enabled for this user. If more than one multi-factor authentication module is enabled, the user can select one of them during the login.
The multi-factor authentication module has to be enabled for the user before it can be used in the login process. The user can go to the profile page enable it by himself.
-## {% linkable_title Configuring mutli-factor authentication modules %}
+## {% linkable_title Configuring multi-factor authentication modules %}
By configuring your own instead of using the default configuration, you take full responsibility for the authentication of the system.
@@ -34,13 +34,13 @@ homeassistant:
- type: totp
```
-## {% linkable_title Available mutli-factor authentication modules %}
+## {% linkable_title Available multi-factor authentication modules %}
Below is a list of the currently available auth providers.
-### {% linkable_title Time-based One-Time Password mutli-factor authentication module %}
+### {% linkable_title Time-based One-Time Password multi-factor authentication module %}
-[Time-based One-Time Password](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm) is widely adopted in modern authencation system, it combines a secret key with the current timestamp using a cryptographic hash function to generate a one-time password. Whoever possessed the secret key will get same one-time password in certain time period. By verifying that password, Home Assistant knows the user have the right secrt key.
+[Time-based One-Time Password](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm) is widely adopted in modern authentication system, it combines a secret key with the current timestamp using a cryptographic hash function to generate a one-time password. Whoever possessed the secret key will get same one-time password in certain time period. By verifying that password, Home Assistant knows the user have the right secret key.
When trying to set up TOTP module, a QR code will show up. The user can scan it by an authenticator app, or set it up manually using the code showed in the UI. After setup, the user needs to input a six digit number generated in the authenticator app to verify the setup is good. If the verification keeps failing, you need to check whether the clock on Home Assistant is accurate.
@@ -60,16 +60,16 @@ homeassistant:
- type: totp
```
-### {% linkable_title Notify mutli-factor authentication module %}
+### {% linkable_title Notify multi-factor authentication module %}
Notify MFA module using [notify component](https://www.home-assistant.io/components/notify/) to delivery a [HMAC-based One-Time Password](https://en.wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm) to user configured target.
-User need first set up the MFA module by select one of the aviliable notify service. A 6 digit one-time password will be sent by this notify service, user need to input it to verify the setup.
+User need first set up the MFA module by select one of the available notify service. A 6 digit one-time password will be sent by this notify service, user need to input it to verify the setup.
During the login process, an 6 digit one-time password will be sent again, user need to input it to verify his/her identity. If the validation failed, a new one-time password will be sent again.
-Notify MFA module would not verify the one-time password deliveried success, so that if user cannot received the message due any reason, he/she may not be login again. Edit or remove `[your_config_dir]/.storage/auth_module.notify` can disable nofiy MFA module to resolve the issue.
+Notify MFA module would not verify the one-time password delivery success, so that if user cannot received the message due any reason, he/she may not be login again. Edit or remove `[your_config_dir]/.storage/auth_module.notify` can disable notify MFA module to resolve the issue.
Example of configuration
From 87e0cb65233818f187f88da8820b1e5da6587380 Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Mon, 8 Oct 2018 19:57:42 +0200
Subject: [PATCH 047/217] Update Aurora binary sensor component configuration
variable (#6596)
Update style of Aurora binary sensor component documentation to follow new configuration variables description.
Related to #6385.
---
source/_components/binary_sensor.aurora.markdown | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/source/_components/binary_sensor.aurora.markdown b/source/_components/binary_sensor.aurora.markdown
index f1c165381ec..460500c24c3 100644
--- a/source/_components/binary_sensor.aurora.markdown
+++ b/source/_components/binary_sensor.aurora.markdown
@@ -28,10 +28,18 @@ binary_sensor:
- platform: aurora
```
-Configuration variables:
-
-- **forecast_threshold** (*Optional*): Provide your own threshold number above which the sensor will trigger. Defaults to 75.
-- **name** (*Optional*): The name of the sensor. Default is 'Aurora Visibility'.
+{% configuration %}
+forecast_threshold:
+ description: Provide your own threshold number above which the sensor will trigger.
+ required: false
+ default: 75
+ type: integer
+name:
+ description: The name of the sensor.
+ required: false
+ default: Aurora Visibility
+ type: string
+{% endconfiguration %}
```yaml
binary_sensor:
From c34762430eda1bdc16dea21e5bc0d6558c568aee Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Mon, 8 Oct 2018 20:09:01 +0200
Subject: [PATCH 048/217] Update Command Line binary sensor component
configuration variable (#6597)
Update style of Command Line binary sensor component documentation to follow new configuration variables description.
Related to #6385.
---
.../binary_sensor.command_line.markdown | 49 +++++++++++++++----
1 file changed, 39 insertions(+), 10 deletions(-)
diff --git a/source/_components/binary_sensor.command_line.markdown b/source/_components/binary_sensor.command_line.markdown
index c206c3cb927..0bf0512d265 100644
--- a/source/_components/binary_sensor.command_line.markdown
+++ b/source/_components/binary_sensor.command_line.markdown
@@ -27,16 +27,45 @@ binary_sensor:
command: cat /proc/sys/net/ipv4/ip_forward
```
-Configuration variables:
-
-- **command** (*Required*): The action to take to get the value.
-- **name** (*Optional*): Let you overwrite the name of the device. By default *name* from the device is used.
-- **device_class** (*Optional*): The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend.
-- **payload_on** (*Optional*): The payload that represents enabled state. Default is "ON".
-- **payload_off** (*Optional*): The payload that represents disabled state. Default is "OFF".
-- **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload.
-- **scan_interval** (*Optional*): Defines number of seconds for polling interval (defaults to 60 seconds).
-- **command_timeout** (*Optional*): Defines number of seconds for command timeout (defaults to 15 seconds).
+{% configuration %}
+command:
+ description: The action to take to get the value.
+ required: true
+ type: string
+name:
+ description: Let you overwrite the name of the device. By default *name* from the device is used.
+ required: false
+ default: name
+ type: string
+device_class:
+ description: The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend.
+ required: false
+ type: string
+payload_on:
+ description: The payload that represents enabled state.
+ required: false
+ default: ON
+ type: string
+payload_off:
+ description: The payload that represents disabled state.
+ required: false
+ default: OFF
+ type: string
+value_template:
+ description: Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload.
+ required: false
+ type: string
+scan_interval:
+ description: Defines number of seconds for polling interval.
+ required: false
+ default: 60
+ type: integer
+command_timeout:
+ description: Defines number of seconds for command timeout.
+ required: false
+ default: 15
+ type: integer
+{% endconfiguration %}
## {% linkable_title Examples %}
From ee99916d0992342d5832f8babf8d1b2a92d6b040 Mon Sep 17 00:00:00 2001
From: Emeric
Date: Mon, 8 Oct 2018 20:26:32 +0200
Subject: [PATCH 049/217] Update some scene config variables (#6604)
scene.lifx_cloud
scene.hunterdouglas_powerview
---
.../scene.hunterdouglas_powerview.markdown | 9 ++++++---
source/_components/scene.lifx_cloud.markdown | 15 +++++++++++----
2 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/source/_components/scene.hunterdouglas_powerview.markdown b/source/_components/scene.hunterdouglas_powerview.markdown
index 2ef810a113e..a418c8f4ddd 100644
--- a/source/_components/scene.hunterdouglas_powerview.markdown
+++ b/source/_components/scene.hunterdouglas_powerview.markdown
@@ -23,6 +23,9 @@ scene:
address: IP_ADDRESS
```
-Configuration variables:
-
-- **address** (*Required*): IP address of the PowerView Hub, eg. 192.168.1.10.
+{% configuration %}
+address:
+ description: IP address of the PowerView Hub, eg. 192.168.1.10.
+ required: true
+ type: string
+{% endconfiguration %}
diff --git a/source/_components/scene.lifx_cloud.markdown b/source/_components/scene.lifx_cloud.markdown
index 7b6ac7a2799..219dcb48bee 100644
--- a/source/_components/scene.lifx_cloud.markdown
+++ b/source/_components/scene.lifx_cloud.markdown
@@ -21,10 +21,17 @@ scene:
token: YOUR_LIFX_TOKEN
```
-Configuration variables:
-
-- **token** (*Required*): The API token for your LIFX Cloud account.
-- **timeout** (*Optional*): Network timeout in seconds (defaults to 10).
+{% configuration %}
+token:
+ description: The API token for your LIFX Cloud account.
+ required: true
+ type: string
+timeout:
+ description: Network timeout in seconds.
+ required: false
+ default: 10
+ type: integer
+{% endconfiguration %}
### Getting an API token
From 834ca3a007bcecb759688b1bc48412af78fc257c Mon Sep 17 00:00:00 2001
From: Emeric
Date: Mon, 8 Oct 2018 20:28:00 +0200
Subject: [PATCH 050/217] Update BeagleBone configuration variables (#6608)
* Update BeagleBone config variables
* Fixed wrong type
* change type for pin_name
---
.../binary_sensor.bbb_gpio.markdown | 40 ++++++++++++++-----
source/_components/switch.bbb_gpio.markdown | 36 ++++++++++++-----
2 files changed, 58 insertions(+), 18 deletions(-)
diff --git a/source/_components/binary_sensor.bbb_gpio.markdown b/source/_components/binary_sensor.bbb_gpio.markdown
index f35f488a7ea..66e4c98f4fa 100644
--- a/source/_components/binary_sensor.bbb_gpio.markdown
+++ b/source/_components/binary_sensor.bbb_gpio.markdown
@@ -30,14 +30,36 @@ binary_sensor:
name: Window
```
-Configuration variables:
-
-- **pins** array (*Required*): Array of used pins.
- - **pin_name** (*Required*): Pin numbers and corresponding names.
- - **name** (*Required*): Friendly name to use for the frontend.
- - **bouncetime** (*Optional*): Debounce time for reading input pin defined in milliseconds [ms]. Defaults to `50 ms`.
- - **invert_logic** (*Optional*): If `true`, inverts the input logic to ACTIVE LOW. Default is `false` (ACTIVE HIGH).
- - **pull_mode** (*Optional*): Type of internal pull resistor connected to input. Options are `UP` - pull-up resistor and `DOWN` - pull-down resistor. Defaults to `UP`.
+{% configuration %}
+pins:
+ description: List of used pins.
+ required: true
+ type: map
+ keys:
+ pin_name:
+ description: Port numbers and corresponding names.
+ required: true
+ type: map
+ keys:
+ name:
+ description: Friendly name to use for the frontend.
+ required: true
+ type: string
+ bouncetime:
+ description: Debounce time for reading input pin defined in milliseconds [ms].
+ required: false
+ default: 50
+ type: integer
+ invert_logic:
+ description: If `true`, inverts the input logic to ACTIVE LOW
+ required: false
+ default: false
+ type: boolean
+ pull_mode:
+ description: Type of internal pull resistor connected to input. Options are `UP` - pull-up resistor and `DOWN` - pull-down resistor.
+ required: false
+ default: UP
+ type: string
+{% endconfiguration %}
For more details about the GPIO layout, visit the [article](http://elinux.org/Beagleboard:BeagleBoneBlack) about the BeagleBone Black.
-
diff --git a/source/_components/switch.bbb_gpio.markdown b/source/_components/switch.bbb_gpio.markdown
index fc41a25db14..6efd8f88159 100644
--- a/source/_components/switch.bbb_gpio.markdown
+++ b/source/_components/switch.bbb_gpio.markdown
@@ -17,7 +17,7 @@ The `bbb_gpio` switch platform allows you to control the GPIOs of your [BeagleBo
## {% linkable_title Configuration %}
-To use yourBeagleBone Black's GPIO in your installation, add the following to your `configuration.yaml` file:
+To use your BeagleBone Black's GPIO in your installation, add the following to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
@@ -30,13 +30,31 @@ switch:
name: LED Green
```
-Configuration variables:
-
-- **pins** array (*Required*): Array of used ports.
- - **pin_name** (*Required*): Port numbers and corresponding names.
- - **name** (*Optional*): Friendly name to use for the frontend.
- - **initial** (*Optional*): Initial state of the pin. Defaults to `False`.
- - **invert_logic** (*Optional*): If true, inverts the output logic to ACTIVE LOW. Default is `false` (ACTIVE HIGH).
+{% configuration %}
+pins:
+ description: List of used pins.
+ required: true
+ type: map
+ keys:
+ pin_name:
+ description: Port numbers and corresponding names.
+ required: true
+ type: map
+ keys:
+ name:
+ description: Friendly name to use for the frontend.
+ required: false
+ type: string
+ initial:
+ description: Initial state of the pin.
+ required: false
+ default: false
+ type: boolean
+ invert_logic:
+ description: If `true`, inverts the input logic to ACTIVE LOW
+ required: false
+ default: false
+ type: boolean
+{% endconfiguration %}
For more details about the GPIO layout, visit the [article](http://elinux.org/Beagleboard:BeagleBoneBlack) about the BeagleBone Black.
-
From 34dbf8116794332e9cc228ca7f77576108a3e662 Mon Sep 17 00:00:00 2001
From: DubhAd
Date: Mon, 8 Oct 2018 19:31:57 +0100
Subject: [PATCH 051/217] Removed API password warning (#6614)
Given that as of 0.78 auth is unavoidable, removed the warning of enabling the api password.
Also updated the description of the API password, and nudged towards using a long lasting access token.
---
source/_components/http.markdown | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/source/_components/http.markdown b/source/_components/http.markdown
index ef9c3369fec..3c3b20ca888 100644
--- a/source/_components/http.markdown
+++ b/source/_components/http.markdown
@@ -15,11 +15,6 @@ The `http` component serves all files and data required for the Home Assistant
frontend. You only need to add this to your configuration file if you want to
change any of the default settings.
-
-It is HIGHLY recommended that you set the `api_password`,
-especially if you are planning to expose your installation to the internet.
-
-
Don't use option `server_host` on a Hass.io installation!
@@ -32,7 +27,7 @@ http:
{% configuration %}
api_password:
- description: Protect Home Assistant with a password.
+ description: Protect the Home Assistant API with a password - this password can also be used to log in to the frontend. Where possible you should use a long lasting access token instead of this.
required: false
type: string
server_host:
From 3249f7104c993a9689aa8bfa91ef131e66c05d87 Mon Sep 17 00:00:00 2001
From: definitio <37266727+definitio@users.noreply.github.com>
Date: Mon, 8 Oct 2018 22:33:16 +0300
Subject: [PATCH 052/217] Update MPD configuration variables (#6618)
---
source/_components/media_player.mpd.markdown | 26 +++++++++++++++-----
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/source/_components/media_player.mpd.markdown b/source/_components/media_player.mpd.markdown
index 51888be2b20..da37e9c478b 100644
--- a/source/_components/media_player.mpd.markdown
+++ b/source/_components/media_player.mpd.markdown
@@ -27,12 +27,26 @@ media_player:
host: IP_ADDRESS
```
-Configuration variables:
-
-- **host** (*Required*): IP address of the Host where Music Player Daemon is running.
-- **port** (*Optional*): Port of the Music Player Daemon. Defaults to 6600.
-- **name** (*Optional*): Name of your Music Player Daemon. Defaults to "MPD".
-- **password** (*Optional*): Password for your Music Player Daemon.
+{% configuration %}
+host:
+ description: IP address of the Host where Music Player Daemon is running.
+ required: true
+ type: string
+port:
+ description: Port of the Music Player Daemon.
+ required: false
+ type: integer
+ default: 6600
+name:
+ description: Name of your Music Player Daemon.
+ required: false
+ type: string
+ default: MPD
+password:
+ description: Password for your Music Player Daemon.
+ required: false
+ type: string
+{% endconfiguration %}
Example script to load a saved playlist called "DeckMusic" and set the volume:
From a39d89e86f20d118352b85283eafa031b9465ec6 Mon Sep 17 00:00:00 2001
From: Ben Bangert
Date: Mon, 8 Oct 2018 12:42:30 -0700
Subject: [PATCH 053/217] Update support controllers (#6620)
Tested the Zooz z-wave Plus S2 Stick ZST10 with Home-Assistant. Zwave worked, nodes included and communicating using a Raspberriy Pi3 with the latest Hass.io.
---
source/_docs/z-wave/controllers.markdown | 1 +
1 file changed, 1 insertion(+)
diff --git a/source/_docs/z-wave/controllers.markdown b/source/_docs/z-wave/controllers.markdown
index 128b122649b..ad4a38c723a 100644
--- a/source/_docs/z-wave/controllers.markdown
+++ b/source/_docs/z-wave/controllers.markdown
@@ -24,6 +24,7 @@ You need to have a [supported Z-Wave USB stick or module](https://github.com/Ope
| Sigma Designs UZB Stick | | | |
| Tricklestar | | | |
| Vision USB Stick | | | |
+| Zooz Z-Wave ZST10 | ✓ | | |
| ZWave.me Razberry Board | ✓ | | |
| ZWave.me UZB1 | ✓ | | |
From 731e63f7b55094de4d49bd11f3d9ef94ebfd971d Mon Sep 17 00:00:00 2001
From: Luuk
Date: Mon, 8 Oct 2018 23:15:22 +0200
Subject: [PATCH 054/217] Updated harmony configuration to use configuration
variables (#6622)
---
source/_components/remote.harmony.markdown | 32 ++++++++++++++++------
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/source/_components/remote.harmony.markdown b/source/_components/remote.harmony.markdown
index 6785cdb9fc4..3d9743b3715 100644
--- a/source/_components/remote.harmony.markdown
+++ b/source/_components/remote.harmony.markdown
@@ -43,15 +43,31 @@ You can override some default configuration values on a discovered hub (e.g., th
activity: Watch TV
```
-Configuration variables:
+{% configuration %}
+name:
+ description: The hub's name to display in the frontend. This name must match the name you have set on the Hub.
+ required: true
+ type: string
+host:
+ description: The Harmony device's IP address. Leave empty for the IP to be discovered automatically.
+ required: false
+ type: string
+port:
+ description: The Harmony device's port.
+ required: false
+ type: integer
+ default: 5222
+activity:
+ description: Activity to use when `turn_on` service is called without any data. Overrides the `activity` setting for this discovered hub.
+ required: false
+ type: string
+delay_secs:
+ description: Default duration in seconds between sending commands to a device.
+ required: false
+ type: float
+{% endconfiguration %}
-- **name** (*Required*): The hub's name to display in the frontend. This name must match the name you have set on the Hub.
-- **host** (*Optional*): The Harmony device's IP address. Leave empty for the IP to be discovered automatically.
-- **port** (*Optional*): The Harmony device's port. Defaults to 5222.
-- **activity** (*Optional*): Activity to use when `turn_on` service is called without any data. Overrides the `activity` setting for this discovered hub.
-- **delay_secs** (*Optional*): Default duration in seconds between sending commands to a device.
-
-Configuration file:
+### {% linkable_title Configuration file %}
Upon startup one file will be written to your Home Assistant configuration directory per device in the following format: `harmony_REMOTENAME.conf`. The file will contain:
From 1b9fad3ce314f14cd624e3325deb9677aa14fbef Mon Sep 17 00:00:00 2001
From: Olivier DEBAUCHE
Date: Mon, 8 Oct 2018 23:43:05 +0200
Subject: [PATCH 055/217] typo fix (#6621)
---
source/_components/sensor.bme680.markdown | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/source/_components/sensor.bme680.markdown b/source/_components/sensor.bme680.markdown
index aa7b7103a53..814b276edce 100644
--- a/source/_components/sensor.bme680.markdown
+++ b/source/_components/sensor.bme680.markdown
@@ -107,7 +107,7 @@ aq_humidity_baseline:
default: 40
type: integer
aq_humidity_bias:
- description: The bias for humidity to the gas resistance measurement in the air quality calculations expressed as a percentage of the total calculation e.g., 25% hudidtity to 75% gas.
+ description: The bias for humidity to the gas resistance measurement in the air quality calculations expressed as a percentage of the total calculation e.g., 25% humidity to 75% gas.
required: false
default: 25
type: integer
From a4dca7604255633518bc558860298ad6c5e9e26f Mon Sep 17 00:00:00 2001
From: Alok Saboo
Date: Tue, 9 Oct 2018 06:13:54 -0400
Subject: [PATCH 056/217] Fixed typos (#6623)
* Fixed typos
* More typos
---
.../javascripts/libs/swfobject-dynamic.js | 2 +-
plugins/filters.rb | 6 +++---
sass/inuitcss/generic/_helper.scss | 2 +-
sass/inuitcss/objects/_beautons.scss | 4 ++--
sass/inuitcss/objects/_sprite.scss | 2 +-
.../device_tracker.icloud.markdown | 2 +-
source/_components/homekit.markdown | 2 +-
source/_components/homematic.markdown | 2 +-
source/_components/insteon.markdown | 4 ++--
source/_components/konnected.markdown | 2 +-
source/_components/light.markdown | 2 +-
source/_components/lirc.markdown | 2 +-
source/_components/matrix.markdown | 2 +-
source/_components/notify.html5.markdown | 2 +-
.../_components/notify.nfandroidtv.markdown | 2 +-
source/_components/notify.xmpp.markdown | 2 +-
source/_components/sensor.geizhals.markdown | 2 +-
.../_components/sensor.rmvtransport.markdown | 2 +-
.../_components/sensor.starlingbank.markdown | 2 +-
source/_components/snips.markdown | 2 +-
source/_docs/mqtt/broker.markdown | 4 ++--
source/_docs/z-wave/adding.markdown | 2 +-
source/_docs/z-wave/control-panel.markdown | 2 +-
source/_lovelace/entities.markdown | 4 ++--
source/_lovelace/glance.markdown | 2 +-
source/_lovelace/picture-elements.markdown | 20 +++++++++----------
...mped-ui-and-improved-distribution.markdown | 2 +-
source/help/reporting_issues.markdown | 2 +-
source/javascripts/libs/swfobject-dynamic.js | 2 +-
29 files changed, 44 insertions(+), 44 deletions(-)
diff --git a/.themes/classic/source/javascripts/libs/swfobject-dynamic.js b/.themes/classic/source/javascripts/libs/swfobject-dynamic.js
index b021614524f..a9442349422 100644
--- a/.themes/classic/source/javascripts/libs/swfobject-dynamic.js
+++ b/.themes/classic/source/javascripts/libs/swfobject-dynamic.js
@@ -202,7 +202,7 @@ var swfobject = function() {
function hasPlayerVersion(rv) {
var pv = ua.pv, v = rv.split(".");
v[0] = parseInt(v[0], 10);
- v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+ v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g., "9" instead of "9.0.0"
v[2] = parseInt(v[2], 10) || 0;
return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
}
diff --git a/plugins/filters.rb b/plugins/filters.rb
index 41ad3357a8b..9e3324252da 100644
--- a/plugins/filters.rb
+++ b/plugins/filters.rb
@@ -32,7 +32,7 @@ module Jekyll
# input - a url
#
# Returns input with all urls expanded to include the full site url
- # e.g. /images/awesome.gif => http://example.com/images/awesome.gif
+ # e.g., /images/awesome.gif => http://example.com/images/awesome.gif
#
def full_url(input)
expand_url(input, site_url)
@@ -40,8 +40,8 @@ module Jekyll
# Prepends input with a url fragment
#
- # input - An absolute url, e.g. /images/awesome.gif
- # url - The fragment to prepend the input, e.g. /blog
+ # input - An absolute url, e.g., /images/awesome.gif
+ # url - The fragment to prepend the input, e.g., /blog
#
# Returns the modified url, e.g /blog
#
diff --git a/sass/inuitcss/generic/_helper.scss b/sass/inuitcss/generic/_helper.scss
index 3a488142bae..39d45f29a5e 100644
--- a/sass/inuitcss/generic/_helper.scss
+++ b/sass/inuitcss/generic/_helper.scss
@@ -5,7 +5,7 @@
/**
* A series of helper classes to use arbitrarily. Only use a helper class if an
* element/component doesn’t already have a class to which you could apply this
- * styling, e.g. if you need to float `.main-nav` left then add `float:left;` to
+ * styling, e.g., if you need to float `.main-nav` left then add `float:left;` to
* that ruleset as opposed to adding the `.float--left` class to the markup.
*
* A lot of these classes carry `!important` as you will always want them to win
diff --git a/sass/inuitcss/objects/_beautons.scss b/sass/inuitcss/objects/_beautons.scss
index cdb9a3becf2..a6255287853 100644
--- a/sass/inuitcss/objects/_beautons.scss
+++ b/sass/inuitcss/objects/_beautons.scss
@@ -175,7 +175,7 @@
.btn--tertiary{}
/**
- * Positive actions; e.g. sign in, purchase, submit, etc.
+ * Positive actions; e.g., sign in, purchase, submit, etc.
*/
.btn--positive{
background-color:#4A993E;
@@ -183,7 +183,7 @@
}
/**
- * Negative actions; e.g. close account, delete photo, remove friend, etc.
+ * Negative actions; e.g., close account, delete photo, remove friend, etc.
*/
.btn--negative{
background-color:#b33630;
diff --git a/sass/inuitcss/objects/_sprite.scss b/sass/inuitcss/objects/_sprite.scss
index 898646bc7cf..85459fd51bb 100644
--- a/sass/inuitcss/objects/_sprite.scss
+++ b/sass/inuitcss/objects/_sprite.scss
@@ -22,7 +22,7 @@
*
* Where ‘’ might map to a star in your particular icon font.
*
- * These all require extension in your theme stylesheet, e.g. in your own CSS:
+ * These all require extension in your theme stylesheet, e.g., in your own CSS:
*
.sprite{
background-image:url(path/to/your/sprite.png);
diff --git a/source/_components/device_tracker.icloud.markdown b/source/_components/device_tracker.icloud.markdown
index a57ba44d4b4..46e19702c36 100644
--- a/source/_components/device_tracker.icloud.markdown
+++ b/source/_components/device_tracker.icloud.markdown
@@ -50,7 +50,7 @@ To disable the drainage of the battery, a dynamic interval is being used for eac
2 Factor Authentication is the improved version of 2 Steps Authentication, this is still not supported by the pyicloud library. Therefore it's not possible to use it with the device_tracker yet.
4 services are available for this component:
-- **icloud_update**: This service can be used to ask for an update of a certain iDevice. The `account_name` and `device_name` are optional. Request will result in new Home Assistant [state_changed](/docs/configuration/events/#event-state_changed) event describing current iphone location. Can be used in automations when manual location update is needed, e.g. to check if anyone is home when door's been opened.
+- **icloud_update**: This service can be used to ask for an update of a certain iDevice. The `account_name` and `device_name` are optional. Request will result in new Home Assistant [state_changed](/docs/configuration/events/#event-state_changed) event describing current iphone location. Can be used in automations when manual location update is needed, e.g., to check if anyone is home when door's been opened.
- **icloud_lost_iphone**: This service will play the Lost iPhone sound on a certain iDevice. The `account_name` and `device_name` are optional.
- **icloud_set_interval**: This service will change the dynamic interval of an iDevice. The `account_name` and `device_name` are optional. If `interval` is used in the service_data, the iDevice will be updated with that new interval. That interval will be fixed until the iDevice changes zone or if this service is called again. If `interval` isn't used in the service_data, the interval for that iDevice will revert back to its default dynamic interval based on its current zone, its distance towards home and its battery level.
- **icloud_reset_account**: This service can be used to reset an iCloud account. This is helpful when not all devices are being found by the component or if you have added a new iDevice to your account. The `account_name` is optional.
diff --git a/source/_components/homekit.markdown b/source/_components/homekit.markdown
index 2a3adf5adb6..d1a87d7fb48 100644
--- a/source/_components/homekit.markdown
+++ b/source/_components/homekit.markdown
@@ -95,7 +95,7 @@ homekit:
required: false
type: list
entity_config:
- description: Configuration for specific entities. All subordinate keys are the corresponding entity ids to the domains, e.g. `alarm_control_panel.alarm`.
+ description: Configuration for specific entities. All subordinate keys are the corresponding entity ids to the domains, e.g., `alarm_control_panel.alarm`.
required: false
type: map
keys:
diff --git a/source/_components/homematic.markdown b/source/_components/homematic.markdown
index a60d144ec27..39dbc0c4d8e 100644
--- a/source/_components/homematic.markdown
+++ b/source/_components/homematic.markdown
@@ -294,7 +294,7 @@ action:
When the connection to your HomeMatic CCU or Homegear is lost, Home Assistant will stop getting updates from devices. This may happen after rebooting the CCU for example. Due to the nature of the communication protocol this cannot be handled automatically, so you must call *homematic.reconnect* in this case. That's why it is usually a good idea to check if your HomeMatic components are still updated properly, in order to detect connection losses. This can be done in several ways through an automation:
-- If you have a sensor which you know will be updated frequently (e.g. an outdoor temperature sensor or light sensor) you could set up an automation like this:
+- If you have a sensor which you know will be updated frequently (e.g., an outdoor temperature sensor or light sensor) you could set up an automation like this:
```yaml
automation:
diff --git a/source/_components/insteon.markdown b/source/_components/insteon.markdown
index 7cb8e635ec7..403d8da6bd2 100644
--- a/source/_components/insteon.markdown
+++ b/source/_components/insteon.markdown
@@ -244,13 +244,13 @@ events. The following events are available:
- **insteon.button_on**
- **address**: (required) The Insteon device address in lower case without
- dots (e.g. 1a2b3c)
+ dots (e.g., 1a2b3c)
- **button**: (Optional) The button id in lower case. For a 4-button remote
the values are `a` to `d`. For an 8 button remote the values are `a` to `g`. For
a one-button remote this field is not used.
- **insteon.button_of**
- **address**: (required) The Insteon device address in lower case without
- dots (e.g. 1a2b3c)
+ dots (e.g., 1a2b3c)
- **button**: (Optional) The button id in lower case. For a 4-button remote
the values are a to d. For an 8 button remote the values are `a` to `g`. For
a one-button remote this field is not used.
diff --git a/source/_components/konnected.markdown b/source/_components/konnected.markdown
index 1467787a493..cd55944cb37 100644
--- a/source/_components/konnected.markdown
+++ b/source/_components/konnected.markdown
@@ -52,7 +52,7 @@ access_token:
required: true
type: string
api_host:
- description: Override the IP address/host (and port number) of Home Assistant that the Konnected device(s) will use to communicate sensor state updates. If omitted, this is defaulted to the value of `base_url` in the `http` component. If you've set `base_url` to an external hostname, then you'll want to set this value back to your _local_ IP address and port (e.g. `http://192.168.1.101:8123`).
+ description: Override the IP address/host (and port number) of Home Assistant that the Konnected device(s) will use to communicate sensor state updates. If omitted, this is defaulted to the value of `base_url` in the `http` component. If you've set `base_url` to an external hostname, then you'll want to set this value back to your _local_ IP address and port (e.g., `http://192.168.1.101:8123`).
required: false
type: url
default: value of `base_url`
diff --git a/source/_components/light.markdown b/source/_components/light.markdown
index b4e6102c8f6..4c559dfc3fb 100644
--- a/source/_components/light.markdown
+++ b/source/_components/light.markdown
@@ -19,7 +19,7 @@ The light component supports multiple entries in configuration.yaml
To set the default color and brightness values when the light is turned on, create a custom `light_profiles.csv` (as described below in the `profile` attribute of `light.turn_on`).
-The `.default` suffix should be added to the entity identifier of each light to define a default value, e.g. for `light.ceiling_2` the `id` field is `light.ceiling_2.default`. To define a default for all lights, the identifier `group.all_lights.default` can be used. Individual settings always supercede the `all_lights` default setting.
+The `.default` suffix should be added to the entity identifier of each light to define a default value, e.g., for `light.ceiling_2` the `id` field is `light.ceiling_2.default`. To define a default for all lights, the identifier `group.all_lights.default` can be used. Individual settings always supercede the `all_lights` default setting.
### {% linkable_title Service `light.turn_on` %}
diff --git a/source/_components/lirc.markdown b/source/_components/lirc.markdown
index ad96e2316b2..7127b52caf7 100644
--- a/source/_components/lirc.markdown
+++ b/source/_components/lirc.markdown
@@ -41,7 +41,7 @@ For more information have a look at `/usr/share/doc/lirc/README.Debian.gz` where
Now teach LIRC about your particular remote control by preparing a lircd configuration file (`/etc/lirc/lircd.conf`). Search the [LIRC remote database](http://lirc.sourceforge.net/remotes/) for your model. If you can't find it, then you can always use the `irrecord` program to learn your remote. This will create a valid configuration file. Add as many remotes as you want by pasting them into the file. If `irrecord` doesn't work (e.g., for some air conditioner remotes), then the `mode2` program is capable of reading the codes in raw mode, followed by `irrecord -a` to extract hex codes.
-Next, you have to make a `~/.lircrc` file that maps keypresses to system actions. The file has to be in the home dir of the user running Home Assistant, e.g. in `/home/homeassistant/.lircrc` if you're running in a virtual env. [The configuration](http://www.lirc.org/html/configure.html) is a bit tedious but it must be done. Use the `prog = home-assistant` for all keys you want to be recognized by Home Assistant. The values you set for `button` must be the same as in the `lircd.conf` file and the values you put for `config` entry will be the sensor value in Home Assistant when you press the button. An example may look like this:
+Next, you have to make a `~/.lircrc` file that maps keypresses to system actions. The file has to be in the home dir of the user running Home Assistant, e.g., in `/home/homeassistant/.lircrc` if you're running in a virtual env. [The configuration](http://www.lirc.org/html/configure.html) is a bit tedious but it must be done. Use the `prog = home-assistant` for all keys you want to be recognized by Home Assistant. The values you set for `button` must be the same as in the `lircd.conf` file and the values you put for `config` entry will be the sensor value in Home Assistant when you press the button. An example may look like this:
```bash
begin
diff --git a/source/_components/matrix.markdown b/source/_components/matrix.markdown
index 75bd6da0e6a..d965ea1a9f5 100644
--- a/source/_components/matrix.markdown
+++ b/source/_components/matrix.markdown
@@ -31,7 +31,7 @@ Configuration variables:
{% configuration %}
username:
- description: "The matrix username that Home Assistant should use to log in. *Note*: You must specify a full matrix ID here, including the homeserver domain, e.g. '@my_matrix_bot:matrix.org'. Please note also that the '@' character has a special meaning in YAML, so this must always be given in quotes."
+ description: "The matrix username that Home Assistant should use to log in. *Note*: You must specify a full matrix ID here, including the homeserver domain, e.g., '@my_matrix_bot:matrix.org'. Please note also that the '@' character has a special meaning in YAML, so this must always be given in quotes."
required: true
type: string
password:
diff --git a/source/_components/notify.html5.markdown b/source/_components/notify.html5.markdown
index 029f6514478..41a46d12ba4 100644
--- a/source/_components/notify.html5.markdown
+++ b/source/_components/notify.html5.markdown
@@ -99,7 +99,7 @@ Assuming the previous test completed successfully and your browser was registere
1. Open Home Assistant in Chrome or Firefox.
2. Open the sidebar and click the Services button at the bottom (shaped like a remote control), located below the Developer Tools.
-3. From the Services dropdown, search for your HTML5 notify service (E.G. notify.NOTIFIER_NAME) and select it.
+3. From the Services dropdown, search for your HTML5 notify service (e.g., notify.NOTIFIER_NAME) and select it.
4. In the Service Data text box enter: {"message":"hello world"}, then press the CALL SERVICE button.
5. If everything worked you should see a popup notification.
diff --git a/source/_components/notify.nfandroidtv.markdown b/source/_components/notify.nfandroidtv.markdown
index 6ec1639edb2..2933ca01789 100644
--- a/source/_components/notify.nfandroidtv.markdown
+++ b/source/_components/notify.nfandroidtv.markdown
@@ -13,7 +13,7 @@ ha_release: 0.32
---
-Notification platform for [Notifications for Android TV](https://play.google.com/store/apps/details?id=de.cyberdream.androidtv.notifications.google) and [Notifications for FireTV](https://play.google.com/store/apps/details?id=de.cyberdream.firenotifications.google). You can use this plarform to send notifications to your Android TV device. An overlay with the message content will appear for a configurable amount of seconds and then disapper again. Sending images (e.g. security cam) is supported too.
+Notification platform for [Notifications for Android TV](https://play.google.com/store/apps/details?id=de.cyberdream.androidtv.notifications.google) and [Notifications for FireTV](https://play.google.com/store/apps/details?id=de.cyberdream.firenotifications.google). You can use this plarform to send notifications to your Android TV device. An overlay with the message content will appear for a configurable amount of seconds and then disapper again. Sending images (e.g., security cam) is supported too.
The notifications are in the global scope of your Android TV device. They will be displayed regardless of which application is running.
diff --git a/source/_components/notify.xmpp.markdown b/source/_components/notify.xmpp.markdown
index 14105d9bb6d..00303b0f32c 100644
--- a/source/_components/notify.xmpp.markdown
+++ b/source/_components/notify.xmpp.markdown
@@ -38,7 +38,7 @@ Configuration variables:
- **room** (*Optional*): Room's name (e.g., example@conference.jabber.org). If set, send a message to chatroom instead of the sender.
- sleekxmpp, as of version 1.3.2, does not support >TLS1. If you are running your own XMPP server (e.g. Prosody, ejabberd) make sure to allow using TLS1.
+ sleekxmpp, as of version 1.3.2, does not support >TLS1. If you are running your own XMPP server (e.g., Prosody, ejabberd) make sure to allow using TLS1.
All Jabber IDs (JID) must include the domain. Make sure that the password matches the account provided as sender.
diff --git a/source/_components/sensor.geizhals.markdown b/source/_components/sensor.geizhals.markdown
index 636751da35b..575c974b4de 100644
--- a/source/_components/sensor.geizhals.markdown
+++ b/source/_components/sensor.geizhals.markdown
@@ -29,7 +29,7 @@ Configuration variables:
- **name** (*Required*): The internal name of the product in Home Assistant.
- **product_id** (*Required*): ID of the product. Get the ID from the Geizhals website of your chosen product by opening the *Price History* in a new browser tab (right-click on the price history > open in new tab).
-The URL of this site reveals the ID, e.g. `https://geizhals.de/?phist=1696985` with a `product_id` of `1696985`.
+The URL of this site reveals the ID, e.g., `https://geizhals.de/?phist=1696985` with a `product_id` of `1696985`.
- **description** (*Optional*): The name of the product in the front end.
- **locale** (*Optional*): Localisation which should be used for the request. Set this to `AT`, `EU`, `DE`, `UK` or `PL`. Defaults to `DE`.
diff --git a/source/_components/sensor.rmvtransport.markdown b/source/_components/sensor.rmvtransport.markdown
index 6c4cea8129b..05469d650f2 100644
--- a/source/_components/sensor.rmvtransport.markdown
+++ b/source/_components/sensor.rmvtransport.markdown
@@ -34,7 +34,7 @@ name:
default: The default is the station name.
type: string
stationId:
- description: ID of the stop or station, e.g. 3000010. Visit [the RMV OpenData web site](https://opendata.rmv.de) to find a list of valid IDs.
+ description: ID of the stop or station, e.g., 3000010. Visit [the RMV OpenData web site](https://opendata.rmv.de) to find a list of valid IDs.
required: true
type: string
destinations:
diff --git a/source/_components/sensor.starlingbank.markdown b/source/_components/sensor.starlingbank.markdown
index 1a215ac9ccf..5accaf731d5 100644
--- a/source/_components/sensor.starlingbank.markdown
+++ b/source/_components/sensor.starlingbank.markdown
@@ -33,7 +33,7 @@ Once you have your own Starling bank account you will need to sign up for a Star
Once you've signed up:
1. Head to the [Personal Access Section](https://developer.starlingbank.com/personal/token) of your developer account.
2. Click "Create Token".
-3. Give your token a name e.g. "Home Assistant".
+3. Give your token a name e.g., "Home Assistant".
4. Tick the permissions "account:read" and "balance:read". The others you can leave un-ticked.
5. Click "Create" and make a note of the newly created token, you will need this for your Home Assistant configuration.
diff --git a/source/_components/snips.markdown b/source/_components/snips.markdown
index b4e752ebc28..9a03d1c9d36 100644
--- a/source/_components/snips.markdown
+++ b/source/_components/snips.markdown
@@ -141,7 +141,7 @@ Alternatively, MQTT can be configured to bridge messages between servers if usin
In Home Assistant, we trigger actions based on intents produced by Snips using the [`intent_script`](/components/intent_script) component. For instance, the following block handles a `ActivateLightColor` intent to change light colors:
-Note: If your Snips action is prefixed with a username (e.g. `john:playmusic` or `john__playmusic`), the Snips component in Home Assistant [will try and strip off the username](https://github.com/home-assistant/home-assistant/blob/c664c20165ebeb248b98716cf61e865f274a2dac/homeassistant/components/snips.py#L126-L129). Bear this in mind if you get the error `Received unknown intent` even when what you see on the MQTT bus looks correct. Internally the Snips component is trying to match the non-username version of the intent (i.e., just `playmusic`).
+Note: If your Snips action is prefixed with a username (e.g., `john:playmusic` or `john__playmusic`), the Snips component in Home Assistant [will try and strip off the username](https://github.com/home-assistant/home-assistant/blob/c664c20165ebeb248b98716cf61e865f274a2dac/homeassistant/components/snips.py#L126-L129). Bear this in mind if you get the error `Received unknown intent` even when what you see on the MQTT bus looks correct. Internally the Snips component is trying to match the non-username version of the intent (i.e., just `playmusic`).
{% raw %}
```yaml
diff --git a/source/_docs/mqtt/broker.markdown b/source/_docs/mqtt/broker.markdown
index ddb5ee8f8dd..3bd4a98369a 100644
--- a/source/_docs/mqtt/broker.markdown
+++ b/source/_docs/mqtt/broker.markdown
@@ -59,7 +59,7 @@ mqtt:
### {% linkable_title Run your own %}
-Along with the embedded broker this is the most private option, but it requires a bit more work. There are multiple free and open-source brokers to pick from: e.g. [Mosquitto](http://mosquitto.org/), [EMQ](http://emqtt.io/), or [Mosca](http://www.mosca.io/).
+Along with the embedded broker this is the most private option, but it requires a bit more work. There are multiple free and open-source brokers to pick from: e.g., [Mosquitto](http://mosquitto.org/), [EMQ](http://emqtt.io/), or [Mosca](http://www.mosca.io/).
```yaml
# Example configuration.yaml entry
@@ -98,7 +98,7 @@ protocol:
type: string
certificate:
required: false
- description: Path to the certificate file, e.g. `/home/user/.homeassistant/server.crt`.
+ description: Path to the certificate file, e.g., `/home/user/.homeassistant/server.crt`.
type: string
tls_insecure:
required: false
diff --git a/source/_docs/z-wave/adding.markdown b/source/_docs/z-wave/adding.markdown
index 98c2c5efbae..e40a86276e6 100644
--- a/source/_docs/z-wave/adding.markdown
+++ b/source/_docs/z-wave/adding.markdown
@@ -24,7 +24,7 @@ Don't use this for [secure devices](/docs/z-wave/adding/#adding-secure-devices),
Don't use the OpenZWave control panel (OZWCP), **or the physical button on a controller**, to add or remove devices. Many devices will only send the information about their capabilities at the time you include them. If you use the OpenZWave control panel, or the button on a device, then Home Assistant won't have that information. Using the physical button on a controller will also result in a non-security inclusion being performed, which may limit the features the device supports.
-When you add a device, it may initially appear without a specific entity ID (e.g. `zwave.__`) and without other identifying information. Running a *Heal* should help speed this process up, and you'll need to run a *Heal* anyway so that all the devices in your Z-Wave network learn about the new device. You *might* need to restart Home Assistant (not reboot the system) to have the entity ID fully visible.
+When you add a device, it may initially appear without a specific entity ID (e.g., `zwave.__`) and without other identifying information. Running a *Heal* should help speed this process up, and you'll need to run a *Heal* anyway so that all the devices in your Z-Wave network learn about the new device. You *might* need to restart Home Assistant (not reboot the system) to have the entity ID fully visible.
## {% linkable_title Network Key %}
diff --git a/source/_docs/z-wave/control-panel.markdown b/source/_docs/z-wave/control-panel.markdown
index 7ee257b0fdc..018857fb5bc 100644
--- a/source/_docs/z-wave/control-panel.markdown
+++ b/source/_docs/z-wave/control-panel.markdown
@@ -82,7 +82,7 @@ Battery powered devices need to be awake before you can use the Z-Wave control p
This is a dropdown where you can select all the entities of this node. Once selected you can then use:
* **Refresh Entity** to refresh just that entity's values
-* **Entity Attributes** to display the attributes of that entity (e.g. its friendly name, the ID of the node, etc)
+* **Entity Attributes** to display the attributes of that entity (e.g., its friendly name, the ID of the node, etc)
Here you can mark a device as requiring polling so the controller is aware of changes because the device doesn't send updates itself. Do see the information on [polling here](/docs/z-wave/devices/#polling), since excessive polling can break your Z-Wave network.
diff --git a/source/_lovelace/entities.markdown b/source/_lovelace/entities.markdown
index a025b721e38..5e91cb65d80 100644
--- a/source/_lovelace/entities.markdown
+++ b/source/_lovelace/entities.markdown
@@ -74,7 +74,7 @@ name:
type: string
icon:
required: true
- description: "Icon to display (e.g. `mdi:home`)"
+ description: "Icon to display (e.g., `mdi:home`)"
type: string
action_name:
required: true
@@ -103,7 +103,7 @@ name:
type: string
icon:
required: true
- description: "Icon to display (e.g. `mdi:home`)"
+ description: "Icon to display (e.g., `mdi:home`)"
type: string
url:
required: true
diff --git a/source/_lovelace/glance.markdown b/source/_lovelace/glance.markdown
index beb4b852641..9b12e8db29a 100644
--- a/source/_lovelace/glance.markdown
+++ b/source/_lovelace/glance.markdown
@@ -71,7 +71,7 @@ tap_action:
default: more-info
service:
required: false
- description: "For `call-service`, e.g. `media_player.media_play_pause`"
+ description: "For `call-service`, e.g., `media_player.media_play_pause`"
type: string
service_data:
required: false
diff --git a/source/_lovelace/picture-elements.markdown b/source/_lovelace/picture-elements.markdown
index e9da937b142..8dd83c9c005 100644
--- a/source/_lovelace/picture-elements.markdown
+++ b/source/_lovelace/picture-elements.markdown
@@ -76,11 +76,11 @@ tap_action:
default: more-info
navigation_path:
required: false
- description: Url path to navigate to (e.g. `/lovelace/1`)
+ description: Url path to navigate to (e.g., `/lovelace/1`)
type: string
service:
required: false
- description: "Service to call (e.g. `light.turn_on`)"
+ description: "Service to call (e.g., `light.turn_on`)"
type: string
service_data:
required: false
@@ -119,11 +119,11 @@ tap_action:
default: more-info
navigation_path:
required: false
- description: Url path to navigate to (e.g. `/lovelace/1`)
+ description: Url path to navigate to (e.g., `/lovelace/1`)
type: string
service:
required: false
- description: "Service to call (e.g. `light.turn_on`)"
+ description: "Service to call (e.g., `light.turn_on`)"
type: string
service_data:
required: false
@@ -171,7 +171,7 @@ type:
type: string
icon:
required: true
- description: Icon to display (e.g. `mdi:home`)
+ description: Icon to display (e.g., `mdi:home`)
type: string
title:
required: false
@@ -188,11 +188,11 @@ tap_action:
default: more-info
navigation_path:
required: false
- description: Url path to navigate to (e.g. `/lovelace/1`)
+ description: Url path to navigate to (e.g., `/lovelace/1`)
type: string
service:
required: false
- description: "Service to call (e.g. `light.turn_on`)"
+ description: "Service to call (e.g., `light.turn_on`)"
type: string
service_data:
required: false
@@ -223,11 +223,11 @@ tap_action:
default: more-info
navigation_path:
required: false
- description: Url path to navigate to (e.g. `/lovelace/1`)
+ description: Url path to navigate to (e.g., `/lovelace/1`)
type: string
service:
required: false
- description: "Service to call (e.g. `light.turn_on`)"
+ description: "Service to call (e.g., `light.turn_on`)"
type: string
service_data:
required: false
@@ -265,7 +265,7 @@ style:
{% configuration %}
type:
required: true
- description: 'Card name with `custom:` prefix (e.g. `custom:my-custom-card`)'
+ description: 'Card name with `custom:` prefix (e.g., `custom:my-custom-card`)'
type: string
style:
required: true
diff --git a/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown b/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown
index 37178a2d669..131273eb98c 100644
--- a/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown
+++ b/source/_posts/2015-08-31-version-7-revamped-ui-and-improved-distribution.markdown
@@ -90,7 +90,7 @@ device_tracker:
password: YOUR_ADMIN_PASSWORD
```
-__DHT temperature and humidty sensors__
+__DHT temperature and humidity sensors__
[@MakeMeASandwich](https://github.com/makemeasandwich) has contributed support for DHT temperature and humidity sensors. It allows you to get the current temperature and humidity from a DHT11, DHT22, or AM2302 device.
```yaml
diff --git a/source/help/reporting_issues.markdown b/source/help/reporting_issues.markdown
index d2290788c55..2bc89b048ca 100644
--- a/source/help/reporting_issues.markdown
+++ b/source/help/reporting_issues.markdown
@@ -31,7 +31,7 @@ If possible, provide the latest release of which you know that the component or
### {% linkable_title Operating environment (Hass.io/Docker/Windows/etc.) %}
-There are many different ways to run Home Assistant. In this section please mention which you are using, e.g. manual installation, [Hass.io](/hassio/), Hasbian or as container (Docker). It can help if you mention which operating system you are using because not all are supported on the same level.
+There are many different ways to run Home Assistant. In this section please mention which you are using, e.g., manual installation, [Hass.io](/hassio/), Hasbian or as container (Docker). It can help if you mention which operating system you are using because not all are supported on the same level.
### {% linkable_title Component/platform %}
diff --git a/source/javascripts/libs/swfobject-dynamic.js b/source/javascripts/libs/swfobject-dynamic.js
index b021614524f..a9442349422 100644
--- a/source/javascripts/libs/swfobject-dynamic.js
+++ b/source/javascripts/libs/swfobject-dynamic.js
@@ -202,7 +202,7 @@ var swfobject = function() {
function hasPlayerVersion(rv) {
var pv = ua.pv, v = rv.split(".");
v[0] = parseInt(v[0], 10);
- v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+ v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g., "9" instead of "9.0.0"
v[2] = parseInt(v[2], 10) || 0;
return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
}
From ac2827112b41c63f181fc62dc078fe44ea3db597 Mon Sep 17 00:00:00 2001
From: DubhAd
Date: Tue, 9 Oct 2018 11:35:05 +0100
Subject: [PATCH 057/217] Minor tweaks (#6627)
* Minor tweaks
Changed the title to be linkable, and took the opportunity to update the config block at the same time
* :ambulance: Fixes build error
---
source/_components/media_player.denon.markdown | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/source/_components/media_player.denon.markdown b/source/_components/media_player.denon.markdown
index ebfe0177bae..61fc86002fe 100644
--- a/source/_components/media_player.denon.markdown
+++ b/source/_components/media_player.denon.markdown
@@ -24,7 +24,8 @@ Supported devices:
To add a Denon Network Receiver to your installation, add the following to your `configuration.yaml` file:
-**Telnet platform**
+## {% linkable_title Telnet platform %}
+
```yaml
# Example configuration.yaml entry
media_player:
@@ -32,10 +33,16 @@ media_player:
host: IP_ADDRESS
```
-Configuration variables:
-
-- **host** (*Required*): IP address of the device. Example: 192.168.1.32
-- **name** (*Optional*): Name of the device.
+{% configuration %}
+host:
+ description: "IP address of the device. Example: 192.168.1.32"
+ required: true
+ type: string
+name:
+ description: The name of the device
+ required: false
+ type: string
+{% endconfiguration %}
A few notes for platform: denon
From 1dd1d815a199be5dac3321563371b3fa73047e87 Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Tue, 9 Oct 2018 12:39:19 +0200
Subject: [PATCH 058/217] Update Camera Dispatcher component configuration
variable (#6625)
Update style of Camera Dispatcher component documentation to follow new configuration variables description.
Related to #6385.
---
source/_components/camera.dispatcher.markdown | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/source/_components/camera.dispatcher.markdown b/source/_components/camera.dispatcher.markdown
index 26eb74febcd..b0f3c63b851 100644
--- a/source/_components/camera.dispatcher.markdown
+++ b/source/_components/camera.dispatcher.markdown
@@ -36,6 +36,13 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send
async_dispatcher_send(hass, 'name_of_dispatcher_signal', image_data)
```
-Configuration variables:
-- **signal** (*Required*): The signal name of dispatcher signal they send image data to this camera.
-- **name** (*Optional*): This parameter allows you to override the name of your camera.
+{% configuration %}
+signal:
+ description: The signal name of dispatcher signal they send image data to this camera.
+ required: true
+ type: string
+name:
+ description: This parameter allows you to override the name of your camera.
+ required: false
+ type: string
+{% endconfiguration %}
From b5cd4dc92105bd176765ea80d380b228cb6c98d5 Mon Sep 17 00:00:00 2001
From: Dav0815 <35415680+Dav0815@users.noreply.github.com>
Date: Tue, 9 Oct 2018 20:44:46 +1000
Subject: [PATCH 059/217] Alignment to new doc standards (#6624)
* Fixes to configuration description and example.
Alignment with new documentation guidelines (https://developers.home-assistant.io/docs/en/documentation_standards.html)
* Fixed of sample config and documentation
Alignment with new documentation guidelines.
* Update sensor.waqi.markdown
* Update sensor.bom.markdown
* Update sensor.bom.markdown
---
source/_components/sensor.bom.markdown | 75 ++++++++++++++++++++++---
source/_components/sensor.waqi.markdown | 21 ++++---
2 files changed, 82 insertions(+), 14 deletions(-)
diff --git a/source/_components/sensor.bom.markdown b/source/_components/sensor.bom.markdown
index 7774077d9cf..c3cc033404c 100644
--- a/source/_components/sensor.bom.markdown
+++ b/source/_components/sensor.bom.markdown
@@ -25,8 +25,6 @@ To add the BOM weather observation to your installation, add the following to yo
# Example configuration.yaml entry
sensor:
- platform: bom
- station: IDS60801.94675
- name: Adelaide
monitored_conditions:
- apparent_t
- cloud
@@ -64,11 +62,74 @@ To get the station ID for any BOM station:
- The URL will look like: http://www.bom.gov.au/products/IDx60801/[station].shtml
- For Adelaide, the URL will look like `http://www.bom.gov.au/products/IDS60801/IDS60801.94675.shtml`; the station ID is `IDS60801.94675`.
-Configuration variables:
-
-- **station** (*Optional*): The station ID string as identified from the BOM website. If not given, defaults to the closest station.
-- **name** (*Optional*): The name you would like to give to the weather station.
-- **monitored_conditions** (*Required*): A list of the conditions to monitor.
+{% configuration %}
+station:
+ description: The station ID string as identified from the BOM website.
+ required: false
+ type: string
+ default: If not given, defaults to the closest station based on location data in configuration.yaml.
+name:
+ description: The name you would like to give to the weather station.
+ required: false
+ type: string
+monitored_conditions:
+ description: A list of the conditions to monitor.
+ required: true
+ type: list
+ keys:
+ apparent_t:
+ description: Feels like temperature in C.
+ cloud:
+ description: Cloud cover.
+ cloud_base_m:
+ description: Cloud Base in m.
+ cloud_oktas:
+ description: Cloud Oktas.
+ cloud_type_id:
+ description: Cloud type ID.
+ cloud_type:
+ description: Cloud type description.
+ delta_t:
+ description: Delta temperature in C.
+ gust_kmh:
+ description: Wind gust in km/h.
+ gust_kt:
+ description: Wing gust in kt.
+ air_temp:
+ description: Air temperature in C.
+ dewpt:
+ description: Drew point in C.
+ press:
+ description: Pressure in mbar.
+ press_qnh:
+ description: Pressure in qnh.
+ press_msl:
+ description: Pressure in msl.
+ press_tend:
+ description: Pressure trend.
+ rain_trace:
+ description: Raing today in mm.
+ rel_hum:
+ description: Relative Humidity in %.
+ sea_state:
+ description: Sea state.
+ swell_dir_worded:
+ description: Swell direction.
+ swell_height:
+ description: Swell hight in m.
+ swell_period:
+ description: Swell period.
+ vis_km:
+ description: Visibility in km.
+ weather:
+ description: Weather summary.
+ wind_dir:
+ description: Wind direction.
+ wind_spd_kmh:
+ description: Wind speed in km/h.
+ wind_spd_kt:
+ description: Wind speed in kt.
+{% endconfiguration %}
This sensor is an alternative to the [`bom`](/components/weather.bom/) weather platform.
diff --git a/source/_components/sensor.waqi.markdown b/source/_components/sensor.waqi.markdown
index 163ce64ee68..f428d28db64 100644
--- a/source/_components/sensor.waqi.markdown
+++ b/source/_components/sensor.waqi.markdown
@@ -26,15 +26,22 @@ sensor:
token: AQICN_API_TOKEN
locations:
- beijing
- stations:
- - Beijing US Embassy, Beijing
```
-Configuration variables:
-
-- **locations** (*Required*): A list of location names to look for air quality data. In case a specific location has multiple registered stations all of them will be added to Home Assistant.
-- **token** (*Required*): The token for the AQICN public API.
-- **stations** (*Optional*): A list of station names to look for air quality data. Station should be within locations specified above.
+{% configuration %}
+token:
+ description: The token for the AQICN public API.
+ required: true
+ type: string
+locations:
+ description: A list of location names to look for air quality data. In case a specific location has multiple registered stations all of them will be added to Home Assistant.
+ required: true
+ type: list
+stations:
+ description: A list of station names to look for air quality data. Station should be within locations specified above.
+ required: false
+ type: list
+{% endconfiguration %}
The value reported is an overall AQ index for the location. The values of the index can be interpreted as following:
From ad207b4ce37ed1159e6e4c4cfd665a3c818810cc Mon Sep 17 00:00:00 2001
From: Klaas Schoute
Date: Tue, 9 Oct 2018 12:54:07 +0200
Subject: [PATCH 060/217] Update Foscam camera component configuration variable
(#6630)
Update style of Foscam camera component documentation to follow new configuration variables description.
Related to #6385.
---
source/_components/camera.foscam.markdown | 32 +++++++++++++++++------
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/source/_components/camera.foscam.markdown b/source/_components/camera.foscam.markdown
index c9d1aabd505..8215b0f2ffb 100644
--- a/source/_components/camera.foscam.markdown
+++ b/source/_components/camera.foscam.markdown
@@ -28,18 +28,34 @@ camera:
password: YOUR_PASSWORD
```
-Configuration variables:
-
-- **ip** (*Required*): The IP address your camera.
-- **port** (*Optional*): The port that the camera is running on. The default is 88.
-- **username** (*Required*): The username for accessing your camera.
-- **password** (*Required*): The password for accessing your camera.
-- **name** (*Optional*): This parameter allows you to override the name of your camera.
+{% configuration %}
+ip:
+ description: The IP address your camera.
+ required: true
+ type: string
+port:
+ description: The port that the camera is running on.
+ required: false
+ default: 88
+ type: integer
+username:
+ description: The username for accessing your camera.
+ required: true
+ type: string
+password:
+ description: The password for accessing your camera.
+ required: true
+ type: string
+name:
+ description: This parameter allows you to override the name of your camera.
+ required: false
+ type: string
+{% endconfiguration %}
There seems to be some issues within Foscam with lengthy passwords and passwords containing certain symbols. Be sure to check your camera's documentation.
-
+
### {% linkable_title Control Foscam PTZ (Pan/Tilt/Zoom) - Home/Away %}
Foscam Webcams which support CGI Commands can be controlled by Home Assistant ([Source](http://www.ipcamcontrol.net/files/Foscam%20IPCamera%20CGI%20User%20Guide-V1.0.4.pdf)). For an example of how this can be done, see the [Foscam IP Camera Pan, Tilt, Zoom Control](/cookbook/foscam_away_mode_PTZ/) Cookbook entry.
From 203b2292cc3143a5bc9ab919e3b0575577a99d68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Per=20Sandstr=C3=B6m?=
Date: Sat, 6 Oct 2018 21:16:35 +0200
Subject: [PATCH 061/217] Update verisure.markdown (#6558)
---
source/_components/verisure.markdown | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/source/_components/verisure.markdown b/source/_components/verisure.markdown
index 686ab4ed017..799c43e6c32 100644
--- a/source/_components/verisure.markdown
+++ b/source/_components/verisure.markdown
@@ -46,4 +46,4 @@ Configuration variables:
- **door_window** (*Optional*): Set to 1 to show door and window sensors, 0 to disable. Default 1.
- **code_digits** (*Optional*): Number of digits in PIN code. Default 4.
- **giid** (*Optional*): The GIID of your installation (If you have more then one alarm system). To find the GIID for your systems run 'python verisure.py EMAIL PASSWORD installations'
-- **polling_rate** (*Optional*): Polling rate in minutes, Default 1
+- **scan_interval** (*Optional*): Scan interval in ```hh:mm:ss``` format. Default ```00:01:00```
From 03d134ce5ef51ebcaad2d0e05a761cabb0cf0643 Mon Sep 17 00:00:00 2001
From: Jason Hu
Date: Sun, 7 Oct 2018 02:21:55 -0700
Subject: [PATCH 062/217] Cleanup google assistant document (#6562)
* Cleanup google assistant document
* Add screenshot for google assistant account linking
* Add migration guide
* Update the additonal users step
* Add note for HTML5 App
* Minor fix
* :pencil2: Tweaks
* :pencil2: Tweaks
---
source/_components/google_assistant.markdown | 103 +++++++++++-------
.../google_assistant/accountlinking.png | Bin 0 -> 79373 bytes
2 files changed, 63 insertions(+), 40 deletions(-)
create mode 100644 source/images/components/google_assistant/accountlinking.png
diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown
index 2badda04992..b4c686990fd 100644
--- a/source/_components/google_assistant.markdown
+++ b/source/_components/google_assistant.markdown
@@ -25,43 +25,74 @@ The Google Assistant component requires a bit more setup than most due to the wa
To use Google Assistant, your Home Assistant configuration has to be externally accessible with a hostname and SSL certificate. If you haven't already configured that, you should do so before continuing.
+## {% linkable_title Migrate to release 0.80 and above %}
+
+Since release 0.80, the `Authorization Code` type of `OAuth` account linking is supported. To migrate your configuration, you need:
+
+1. Change your `Account linking` setting in [Actions on Google console](https://console.actions.google.com/), look for the `Advanced Options` in the bottom left of the sidebar.
+ - Change `Linking type` to `OAuth` and `Authorization Code`.
+ - In the `Client information` section:
+ - Change `Client ID` to `https://oauth-redirect.googleusercontent.com/`, the trailing slash is important.
+ - Input any string you like into `Client Secret`, Home Assistant doesn't need this field.
+ - Change `Authorization URL` to `https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize` (replace with your actual URL).
+ - Change `Token URL` to `https://[YOUR HOME ASSISTANT URL:PORT]/auth/token` (replace with your actual URL).
+ - In the `Client information` section:
+ - Do **NOT** check `Google to transmit clientID and secret via HTTP basic auth header`.
+ - Click 'Save' at the top right corner, then click 'Test' to generate a new draft version of the Test App.
+2. Change your `configuration.yaml` file:
+ - Remove `client_id`, `access_token`, `agent_uer_id` config from `google_assistant:` since they are no longer needed.
+3. Restart Home Assistant, open the `Google Assistant` app on your mobile phone then go to `Settings > Home Control`, re-link `[test] your app name`.
+4. A browser will be open and asking you to login to your Home Assistant instance, it will edirect back to `Google Assistant` app right afterward.
+
+
+If you've added Home Assistant to the home screen, you have to first remove it from home screen, otherwise, this HTML5 app will show up instead of a browser. Using it would prevent Home Assistant to redirect back to the `Google Assistant` app.
+
+
## {% linkable_title Setup %}
-You need to create an API Key with the [Google Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview) which allows you to update devices without unlinking and relinking an account (see [below](/#troubleshooting-the-request_sync-service)). If you don't provide it the `google_assistant.request_sync` service is not exposed. It is recommended to set up this configuration key as it also allows the usage of the following command, "Ok Google, sync my devices". Once you have setup this component you will need to call this service (or command) each time you add a new device that you wish to control via the Google Assistant integration.
+You need to create an API Key with the [Google Cloud API Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview) which allows you to update devices without unlinking and relinking an account (see [below](#troubleshooting-the-request_sync-service)). If you don't provide one, the `google_assistant.request_sync` service is not exposed. It is recommended to set up this configuration key as it also allows the usage of the following command, "Ok Google, sync my devices". Once you have set up this component, you will need to call this service (or command) each time you add a new device that you wish to control via the Google Assistant integration.
1. Create a new project in the [Actions on Google console](https://console.actions.google.com/).
- a. Add/Import project, give it a name
- b. Click on `Home Control` card, select the `Smart home` recommendation.
- c. Create an Action, under the build section. Add in your Home Assistant URL: `https://[YOUR HOME ASSISTANT URL:PORT]/api/google_assistant`, replace the `[YOUR HOME ASSISTANT URL:PORT]` with the domain / ip address and the port under which your Home Assistant is reachable.
- d. Click `Done`. Then click on `Overview`, which will lead you back to the app details screen.
-2. `Account linking` is required for your app to interact with Home Assistant. Set this up under the `Quick Setup` section
- a. Leave it at the default `No, I only want to allow account creation on my website` and select Next
- b. For the `Linking type` select `OAuth` and `Authorization Code`
- c. Client ID: `https://oauth-redirect.googleusercontent.com/`, the trailing slash is important
- d. Client Secret: Anything you like, Home Assistant don't need this field
- e. Authorization URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize`.
- f. Token URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/token`.
- g. Configure your client. Add scopes for `email` and `name`.
- h. Do NOT check `Google to transmit clientID and secret via HTTP basic auth header`
- i. Testing instructions: Enter anything. It doesn't matter since you won't submit this app.
-3. Back on the overview page. Click `Simulator` under `TEST`. It will create a new draft version Test App. You don't have to actually test.
+ 1. Add/Import a project and give it a name.
+ 2. Click on the `Home Control` card, select the `Smart home` recommendation.
+ 3. Create an Action, under the build section. Add your Home Assistant URL: `https://[YOUR HOME ASSISTANT URL:PORT]/api/google_assistant`, replace the `[YOUR HOME ASSISTANT URL:PORT]` with the domain / IP address and the port under which your Home Assistant is reachable.
+ 4. Click `Done`. Then click on `Overview`, which will lead you back to the app details screen.
+2. `Account linking` is required for your app to interact with Home Assistant. Set this up under the `Quick Setup` section.
+ 1. Leave it at the default `No, I only want to allow account creation on my website` and select Next.
+ 2. For the `Linking type` select `OAuth` and `Authorization Code`.
+ 3. Client ID: `https://oauth-redirect.googleusercontent.com/`, the trailing slash is important.
+ 4. Client Secret: Anything you like, Home Assistant doesn't need this field.
+ 5. Authorization URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize`.
+ 6. Token URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/token`.
+ 7. Configure your client. Add scopes for `email` and `name`.
+ 8. Do **NOT** check `Google to transmit clientID and secret via HTTP basic auth header`.
+ 9. Testing instructions: Enter anything. It doesn't matter since you won't submit this app.
+
+
+
+3. Back on the overview page. Click `Simulator` under `TEST`. It will create a new draft version Test App. You don't have to actually test, but you need to generate this draft version Test App.
4. If you haven't already added the component configuration to `configuration.yaml` file and restarted Home Assistant, you'll be unable to continue until you have.
-5. Open the Google Assistant app and go into `Settings > Home Control`
+5. Open the Google Assistant app and go into `Settings > Home Control`.
6. Click the `+` sign, and near the bottom, you should have `[test] your app name`. Selecting that should lead you to a browser to login your Home Assistant instance, then redirect back to a screen where you can set rooms for your devices or nicknames for your devices.
+
+If you've added Home Assistant to the home screen, you have to first remove it from home screen, otherwise, this HTML5 app will show up instead of a browser. Using it would prevent Home Assistant to redirect back to the `Google Assistant` app.
+
7. If you want to allow other household users to control the devices:
- a. Go to the settings for the project you created in point 1 in the developer console.
- b. Under the gear icon, click `Permissions`
- c. Click `Add`, type the new user's e-mail address and choose `Project -> Editor` role
- d. Have the new user go to [developer console](https://console.actions.google.com/) and repeat steps starting from point 3
+ 1. Go to the settings for the project you created in the [Actions on Google console](https://console.actions.google.com/).
+ 2. Click `Test -> Simulator`, then click `Share` icon in the right top corner. Follow the on-screen instruction:
+ 1. Add team members: Got to `Settings -> Permission`, click `Add`, type the new user's e-mail address and choose `Project -> Viewer` role.
+ 2. Copy and share the link with the new user.
+ 3. New user clicks the link with their own Google account, it will enable our draft test app under their account.
+ 3. Have the new user go to their `Google Assistant` app to add `[test] your app name` to their account.
8. If you want to use the `google_assistant.request_sync` service, to update devices without unlinking and relinking, in Home Assistant, then enable Homegraph API for your project:
- a. Go to the [cloud console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview)
- b. Select your project and click Enable Homegraph API
- c. Go to Credentials, which you can find on the left navigation bar under the key icon, and select API Key from Create Credentials
- d. Note down the generated API Key and use this in the configuration
+ 1. Go to the [Google API Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview).
+ 2. Select your project and click Enable Homegraph API.
+ 3. Go to Credentials, which you can find on the left navigation bar under the key icon, and select API Key from Create Credentials.
+ 4. Note down the generated API Key and use this in the configuration.
## {% linkable_title Configuration %}
-To enable this, add the following lines to your `configuration.yaml` file:
+Now add the following lines to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
@@ -85,7 +116,7 @@ google_assistant:
{% configuration %}
project_id:
- description: Project ID from the Google Developer console (looks like `words-2ab12`)
+ description: Project ID from the Actions on Google console (looks like `words-2ab12`)
required: true
type: string
api_key:
@@ -144,25 +175,17 @@ Currently, the following domains are available to be used with Google Assistant,
- media_player (on/off/set volume (via set brightness))
- climate (temperature setting)
-It's very important that you use very long strings for `client_id` and `access_token`. Those are essentially the credentials to your Home Assistant instance. You can generate them with the following command:
-
-```bash
-$ cat /dev/urandom | fold -w 120 | head -n 1 | base64 -w 0 | tr -dc '0-9A-Za-z' | cut -c -80
-```
-
-If you're not using Linux, you can use sites such as [this one](https://www.browserling.com/tools/random-string) to generate a random string (containing mixed case letters and numbers) of up to 80 characters.
-
### {% linkable_title Troubleshooting the request_sync service %}
-The request_sync service requires that the initial sync from Google includes the agent_user_id. If not, the service will log an error that reads something like "Request contains an invalid argument". If this happens, then [unlink the account](https://support.google.com/googlehome/answer/7506443?hl=en-GB) from Home Control and relink.
+The request_sync service requires that the initial sync from Google includes the agent_user_id. If not, the service will log an error that reads something like "Request contains an invalid argument". If this happens, then [unlink the account](https://support.google.com/googlehome/answer/7506443) from Home Control and relink.
-The request_sync service may fail with a 404 if the project_id of the Homegraph API differs from the project_id of the Actions SDK found in the preferences of your project on [developer console](https://console.actions.google.com). Resolve this by:
+The request_sync service may fail with a 404 if the project_id of the Homegraph API differs from the project_id of the Actions SDK found in the preferences of your project on [Actions on Google console](https://console.actions.google.com). Resolve this by:
- 1. Removing your project from the [developer console](https://console.actions.google.com).
- 2. Add a new project to the [cloud console](https://console.cloud.google.com). Here you get a new `project_id`.
+ 1. Removing your project from the [Actions on Google console](https://console.actions.google.com).
+ 2. Add a new project to the [Google Cloud API Console](https://console.cloud.google.com). Here you get a new `project_id`.
3. Enable Homegraph API to the new project.
4. Generate a new API key.
- 5. Again, create a new project in the [developer console](https://console.actions.google.com/). Described above. But at the step 'Build under the Actions SDK box' choose your newly created project. By this, they share the same `project_id`.
+ 5. Again, create a new project in the [Actions on Google console](https://console.actions.google.com/). Described above. But at the step 'Build under the Actions SDK box' choose your newly created project. By this, they share the same `project_id`.
### {% linkable_title Troubleshooting with NGINX %}
diff --git a/source/images/components/google_assistant/accountlinking.png b/source/images/components/google_assistant/accountlinking.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae3198cdd2a17fe2e509f200bf2656fc9848589e
GIT binary patch
literal 79373
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