From 87f0a66244542759717cc2132beb4108cfb893cd Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 2 Nov 2017 22:18:04 +0100 Subject: [PATCH 01/46] pyLoad download sensor (#3742) * Create sensor.pyload.markdown * pyload image * added pyload image * Update sensor.pyload.markdown * Updates according to code --- source/_components/sensor.pyload.markdown | 39 ++++++++++++++++++ .../images/components/pyload/pyload_speed.png | Bin 0 -> 8994 bytes source/images/supported_brands/pyload.png | Bin 0 -> 19419 bytes 3 files changed, 39 insertions(+) create mode 100644 source/_components/sensor.pyload.markdown create mode 100644 source/images/components/pyload/pyload_speed.png create mode 100644 source/images/supported_brands/pyload.png diff --git a/source/_components/sensor.pyload.markdown b/source/_components/sensor.pyload.markdown new file mode 100644 index 00000000000..4ad24e38938 --- /dev/null +++ b/source/_components/sensor.pyload.markdown @@ -0,0 +1,39 @@ +--- +layout: page +title: "pyLoad Sensor" +description: "Instructions how to integrate pyLoad download sensor within Home Assistant." +date: 2017-10-23 09:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: pyload.png +ha_category: Downloading +ha_release: 0.58 +ha_iot_class: "Local Polling" +--- + + +The `pyload` platform allows you to monitor your downloads with [pyLoad](https://pyload.net/) from within Home Assistant and setup automation based on the information. + +To enable this sensor, add the following lines to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: pyload +``` + +Configuration variables: + +- **host** (*Optional*): This is the IP address of your pyLoad download manager, eg. 192.168.0.100. Defaults to `localhost`. +- **port** (*Optional*): The port your pyLoad interface uses. Defaults to 8000. +- **name** (*Optional*): The name to use when displaying this pyLoad instance. +- **username** (*Optional*): Your pyLoad username. +- **password** (*Optional*): Your pyLoad password. + +If everything is setup correctly, the download speed will show up in the frontend. + +

+ +

diff --git a/source/images/components/pyload/pyload_speed.png b/source/images/components/pyload/pyload_speed.png new file mode 100644 index 0000000000000000000000000000000000000000..a4251c0402589f3ff2741d34a54b7583dc8b544f GIT binary patch literal 8994 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 literal 0 HcmV?d00001 From 88bc7d34eb54a8b276d35908310dfc84ff6752ac Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 3 Nov 2017 17:16:41 +0100 Subject: [PATCH 02/46] Add new host/port option --- source/_components/tellstick.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/tellstick.markdown b/source/_components/tellstick.markdown index a26638c0521..652e77a15c4 100644 --- a/source/_components/tellstick.markdown +++ b/source/_components/tellstick.markdown @@ -24,4 +24,6 @@ tellstick: Configuration variables: - **signal_repetitions** (*Optional*): Because the tellstick sends its actions via radio and from most receivers it's impossible to know if the signal was received or not. Therefore you can configure the switch and light to try to send each signal repeatedly. +- **host** (*Optional*): If you run tellstick on a other server or with a hass.io add-on. +- **port** (*Optional*): If needed with host config option. From 9e3ccea4226cb623e09f676a4745954d6c78c7a8 Mon Sep 17 00:00:00 2001 From: Heiko Thiery Date: Fri, 3 Nov 2017 17:55:34 +0100 Subject: [PATCH 03/46] Add documenation for LaCrosse platform (#3829) * add documenation for lacrosse component Signed-off-by: Heiko Thiery * fix documentation Signed-off-by: Heiko Thiery * change to new style Signed-off-by: Heiko Thiery * fix after changing to new style Signed-off-by: Heiko Thiery * renamed config value Signed-off-by: Heiko Thiery * Add configuration sample * Revert change * Add quotes --- source/_components/sensor.lacrosse.markdown | 99 +++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 source/_components/sensor.lacrosse.markdown diff --git a/source/_components/sensor.lacrosse.markdown b/source/_components/sensor.lacrosse.markdown new file mode 100644 index 00000000000..d024d174403 --- /dev/null +++ b/source/_components/sensor.lacrosse.markdown @@ -0,0 +1,99 @@ +--- +layout: page +title: "LaCrosse Sensor" +description: "Instructions how to integrate LaCrosse sensor data received from Jeelink into Home Assistant." +date: 2017-10-29 15:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_category: Sensor +ha_release: 0.58 +ha_iot_class: "Local Polling" +--- + +The `lacrosse` sensor platform is using the data provided by a [Jeelink](https://www.digitalsmarties.net/products/jeelink) USB dongle or this [Arduino sketch](https://svn.fhem.de/trac/browser/trunk/fhem/contrib/arduino/36_LaCrosse-LaCrosseITPlusReader.zip). + +#### {% linkable_title Tested Devices %} + +- Technoline TX 29 IT (temperature only) +- Technoline TX 29 DTH-IT (including humidity) + +## {% linkable_title Setup %} + +Since the sensor change their ID after each powercycle/battery change you can check what sensor IDs are availble by using the command-line tool `pylacrosse` from the pylacrosse package. + +```bash +$ sudo pylacrosse -D /dev/ttyUSB0 scan +``` +To use your `lacrosse` compatible sensor in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: lacrosse + sensors: + sensor_identifier: + type: SENSOR_TYPE + id: SENSOR_ID +``` + +{% configuration %} + device: + description: The serial baudrate. + required: true + type: string + default: /dev/ttyUSB0 + baud: + description: The serial baudrate. + required: true + type: int + default: 57600 + sensors: + description: A list of your sensors. + required: true + type: map + keys: + name: + description: The name of the sensor. + required: false + type: string + type: + description: "The type of the sensor. Options: `battery`, `humidity`, `temperature`" + required: true + type: string + id: + description: The LaCrosse Id of the sensor. + required: true + type: int +{% endconfiguration %} + + +## {% linkable_title Examples %} + +To setup a lacrosse sensor with multiple sensors, add the following to your `configuration.yaml` file: + +{% raw %} +```yaml +# Example configuration.yaml entry +sensor: + - platform: lacrosse + device: /dev/ttyUSB0 + baud: 57600 + sensors: + kitchen_humidity: + name: Kitchen Humidity + type: humidity + id: 72 + kitchen_temperature: + name: Kitchen Temperature + type: temperature + id: 72 + kitchen_lacrosse_battery: + name: Kitchen Sensor Battery + type: battery + id: 72 +``` +{% endraw %} + From 766d612dbfb385d726aa3c34e01a7c573b32649a Mon Sep 17 00:00:00 2001 From: Alok Saboo Date: Fri, 3 Nov 2017 16:08:02 -0400 Subject: [PATCH 04/46] Add option to overwrite file to the downloader component (#3876) * Add option to overwrite file to the downloader component * Add period --- source/_components/downloader.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/downloader.markdown b/source/_components/downloader.markdown index c616cc40688..53063587d69 100644 --- a/source/_components/downloader.markdown +++ b/source/_components/downloader.markdown @@ -38,7 +38,7 @@ This will download the file from the given URL. | Service data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | -| `url` | no | The url of the file to download. | +| `url` | no | The URL of the file to download. | | `subdir` | yes | Download into subdirectory of **download_dir** | | `filename` | yes | Determine the filename. | - +| `overwrite` | yes | Whether to overwrite the file or not, defaults to `false`. | From 01887c96fdd9860cb014a1be88ca49d5eace952b Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Fri, 3 Nov 2017 23:58:22 +0100 Subject: [PATCH 05/46] Unneeded parameter "mac" removed. (#3880) --- source/_components/xiaomi_aqara.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/_components/xiaomi_aqara.markdown b/source/_components/xiaomi_aqara.markdown index bbbbc06aee2..61d3ed9231d 100644 --- a/source/_components/xiaomi_aqara.markdown +++ b/source/_components/xiaomi_aqara.markdown @@ -60,8 +60,7 @@ To enable {{ page.title }} in your installation, add the following to your `conf xiaomi_aqara: discovery_retry: 5 gateways: - - mac: - key: xxxxxxxxxxxxxxxx + - key: xxxxxxxxxxxxxxxx ``` ### {% linkable_title Multiple Gateways %} From 7c34e7c888b5afcd02abb68b57dd9ea0d6cf8628 Mon Sep 17 00:00:00 2001 From: ChristianKuehnel Date: Sat, 4 Nov 2017 05:49:43 +0100 Subject: [PATCH 06/46] added initial documentation for new component remember_the_milk (#3581) * added initial documentation for new component remember_the_milk * updated documentation, based on comments from @fabaff. I did not change the logo, as we have to ask for permission first. * fix stuff --- source/_components/remember_the_milk.markdown | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 source/_components/remember_the_milk.markdown diff --git a/source/_components/remember_the_milk.markdown b/source/_components/remember_the_milk.markdown new file mode 100644 index 00000000000..b6407396484 --- /dev/null +++ b/source/_components/remember_the_milk.markdown @@ -0,0 +1,68 @@ +--- +layout: page +title: "Remember The Milk" +description: "Instructions on how to use Remember The Milk with Home Assistant." +date: 2017-10-10 10:10 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Automation +ha_release: 0.57 +--- + +The `Remember The Milk` (RTM) component allows you to create tasks in [remember_the_milk](https://www.rememberthemilk.com) from Home Assistant. You can use this if you want Home Assistant to send you a task that you should not forget, e.g. water the plants. The component allows you to have several RTM accounts in parallel. + +# {% linkable_title Setup %} + +The setup consists of two steps: getting an API key and registering your account + +## {% linkable_title step 1: API key %} + +To be able to use this component, you need a Remember The Milk account and you need to apply for your own [API key](https://www.rememberthemilk.com/services/api/keys.rtm). With the API key you will also receive your personal `shared secret`. Both of them need to be stored in your Home Assistant configuration: + +```yaml +# Example configuration.yaml entry + +remember_the_milk: + your_rtm_account: + api_key: + shared_secret: + +``` + +Configuration variables: +{% configuration %} + account_name + description: Name of the RTM account, as you can have serveral accounts in RTM. The name must be unique. + required: true + type: string + api_key: + description: Put the API key you've received in here. + required: true + type: string + shared_secret: + description: Put the shared secret you've received in here. + required: true + type: string +{% endconfiguration %} + +## {% linkable_title step 2: registering your account %} + +After saving the configuration, you need to (re-)start Home Assistant. On the first start you will notice a new "Configuration" panel appearing on the Home Assistant page. After opening the configuration page, follow the link "Remember The Milk login". This will take you to a login page where you have to log in with your normal Rember The Milk credentials. This will authorize Home Assistant to access your Remember The Milk account. + +After that click on the "login completed" button. This will tell Home Assistant that you have completed the login process on the Remember The Milk page and Home Assistant should try to register with this account. + +If the registration was successful, the Configuration panel will disappear from your Home Assistant screen and a Remember The Milk panel should appear. This completes the setup process. + +In the background Home Assistant downloaded a "token" from the Remember The Milk server which is stored in the `remember_the_milk.conf` file locally. So you only need to register once. After that the token is used to authenticate with the server. + +# {% linkable_title Creating tasks %} + +This component offers a new service domain ```remember_the_milk``` with the service ```create_task```. You can call this service with the argument ```name``` to create a new task in your Remember The Milk account. You can call this service from your usual automations. + +The task creation supports the "smart syntax", so to create a task with the tag "from_hass" which is due today you can create a task with the name ```test task created in Home Assistant ^today #from_hass```. More info about the smart syntax is available on the [Remember The Milk documentation](https://www.rememberthemilk.com/help/answer/basics-smartadd-howdoiuse). + + +# {% linkable_title Disclaimer %} +This product uses the Remember The Milk API but is not endorsed or certified by Remember The Milk. From 345dbfd1c32b6229d9a8b96be2ba776a13ceb32e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20Osb=C3=A4ck?= Date: Sat, 4 Nov 2017 10:49:52 +0100 Subject: [PATCH 07/46] fix hasbian typo (that means something different) (#3886) --- source/_docs/installation/hassbian/upgrading.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/installation/hassbian/upgrading.markdown b/source/_docs/installation/hassbian/upgrading.markdown index 0ba2173e832..7ef479edcb7 100644 --- a/source/_docs/installation/hassbian/upgrading.markdown +++ b/source/_docs/installation/hassbian/upgrading.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Upgrading Hassbian" -description: "Instructions how to upgrade Hasbian to the latest version." +description: "Instructions how to upgrade Hassbian to the latest version." date: 2016-09-26 21:00 sidebar: true comments: false From ac9aedad90c34d08b446638d2944f16522b40fa2 Mon Sep 17 00:00:00 2001 From: PeteBa Date: Sat, 4 Nov 2017 09:51:48 +0000 Subject: [PATCH 08/46] Adjusted to reflect updated purge scheduling (#3860) * Adjusted to reflect updated purge scheduling * Minor changes --- source/_components/recorder.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/recorder.markdown b/source/_components/recorder.markdown index e4fbca17b5f..6531fdf71a0 100644 --- a/source/_components/recorder.markdown +++ b/source/_components/recorder.markdown @@ -27,7 +27,7 @@ recorder: Configuration variables: -- **purge_interval** (*Optional*): (days) Enable scheduled purge of older events and states. The purge task runs every x days, starting from when Home Assistant is started. If you restart your instance more frequently, than the purge will never take place. You can use [service](#service-purge) call `recorder.purge` when needed. +- **purge_interval** (*Optional*): (days) Enable scheduled purge of older events and states. The purge task runs every x days from when the `recorder component` is first enabled. If a scheduled purge is missed (e.g. if Home Assistant was not running) then the schedule will resume soon after Home Assistant restarts. You can use [service](#service-purge) call `recorder.purge` when required without impacting the purge schedule. - **purge_keep_days** (*Required with `purge_interval`*): Specify number of history days to keep in recorder database after purge. - **exclude** (*Optional*): Configure which components should be excluded from recordings. - **entities** (*Optional*): The list of entity ids to be excluded from recordings. From e8949f411965cc49655304ce41b16bf6329e1254 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 4 Nov 2017 17:31:01 +0100 Subject: [PATCH 09/46] remove file with the wrong extension --- source/_components/climate.ephember | 33 ----------------------------- 1 file changed, 33 deletions(-) delete mode 100644 source/_components/climate.ephember diff --git a/source/_components/climate.ephember b/source/_components/climate.ephember deleted file mode 100644 index 962b34746e2..00000000000 --- a/source/_components/climate.ephember +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: page -title: "EPH Controls Ember Thermostat" -description: "Instructions on how to integrate EPH Controls Ember thermostats within Home Assistant." -date: 2017-10-07 12:40 -sidebar: true -comments: false -sharing: true -footer: true -logo: ephcontrolsember.png -ha_category: Climate -ha_release: "0.55" -ha_iot_class: "Local Polling" ---- - - -The `ephember` climate platform lets you control [EPH Controls](http://emberapp.ephcontrols.com/) thermostats. The module only works if you have a WiFi gateway to control your EPH system and an account on the ember app. - -To set it up, add the following information to your `configuration.yaml` file: - -```yaml -climate: - - platform: ephember - username: YOUR_EMAIL - password: YOUR_PASSWORD -``` - -A single interface can handle up to 32 connected devices. - -Configuration variables: - -- **username** (*Required*): The email address you used to sign up to the ember app -- **password** (*Required*): The password you used to sign up to the ember app From d3c22d70b3af47a34e4b86e8b1d42f5122ad35a6 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 4 Nov 2017 17:37:34 +0100 Subject: [PATCH 10/46] Add checklist --- .github/PULL_REQUEST_TEMPLATE.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7e57b113669..cb3d41a9271 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,3 +3,8 @@ **Pull request in [home-assistant](https://github.com/home-assistant/home-assistant) (if applicable):** home-assistant/home-assistant# +## Checklist: + + - [ ] Branch: Fixes, changes and adjustments should be created against `current`. New documentation for platforms/components and features should go to `next`. + - [ ] The documention follow the [standards](https://home-assistant.io/developers/documentation/standards/). + From df50d5145275c0b93a8e69e9b7094253759de3e6 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 4 Nov 2017 17:43:01 +0100 Subject: [PATCH 11/46] Fix link and typo --- .github/PULL_REQUEST_TEMPLATE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index cb3d41a9271..30f074df148 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,5 +6,6 @@ ## Checklist: - [ ] Branch: Fixes, changes and adjustments should be created against `current`. New documentation for platforms/components and features should go to `next`. - - [ ] The documention follow the [standards](https://home-assistant.io/developers/documentation/standards/). + - [ ] The documentation follow the [standards][standards]. +[standards]: https://home-assistant.io/developers/documentation/standards/ From e32f1cdabdc58567d651989f118cb8f8dbf16403 Mon Sep 17 00:00:00 2001 From: Adam Cooper Date: Sun, 5 Nov 2017 13:11:54 +0000 Subject: [PATCH 12/46] Adding in docs for Vultr platform and sensors (#3663) * Added Vultr logo * Added v1 Vultr hub * Added init sensor docs for Vultr * Updated Vultr components to next version * Updating Vultr components * Added more details to vultr sensors * Updated Vultr component docs * Corrected Vultr name default values, added vultr sensor {} name option --- .../_components/binary_sensor.vultr.markdown | 42 +++++++++++++ source/_components/sensor.vultr.markdown | 59 ++++++++++++++++++ source/_components/switch.vultr.markdown | 42 +++++++++++++ source/_components/vultr.markdown | 35 +++++++++++ source/images/supported_brands/vultr.png | Bin 0 -> 6317 bytes 5 files changed, 178 insertions(+) create mode 100644 source/_components/binary_sensor.vultr.markdown create mode 100644 source/_components/sensor.vultr.markdown create mode 100644 source/_components/switch.vultr.markdown create mode 100644 source/_components/vultr.markdown create mode 100644 source/images/supported_brands/vultr.png diff --git a/source/_components/binary_sensor.vultr.markdown b/source/_components/binary_sensor.vultr.markdown new file mode 100644 index 00000000000..cb1421e38e1 --- /dev/null +++ b/source/_components/binary_sensor.vultr.markdown @@ -0,0 +1,42 @@ +--- +layout: page +title: "Vultr Binary Sensor" +description: "Instructions on how to set up Vultr binary sensors within Home Assistant." +date: 2017-10-17 21:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: System Monitor +logo: vultr.png +ha_release: "0.57" +ha_iot_class: "Cloud Polling" +--- + +The `vultr` binary sensor platform allows you to monitor your [Vultr](https://www.vultr.com/) subscription to see if it is powered on or not. + +To use this binary sensor, you first have to set up your [Vultr hub](/components/vultr/). + +

+The following examples assume a subscription that has an ID of `123456` and a label of `Web Server` +

+ +Minimal `configuration.yaml` (produces `binary_sensor.vultr_web_server`): +```yaml +binary_sensor: + - platform: vultr + subscription: 123456 +``` + +Full `configuration.yaml` (produces `binary_sensor.totally_awesome_server`): +```yaml +binary_sensor: + - platform: vultr + name: totally_awesome_server + subscription: 12345 +``` + +Configuration variables: + +- **subscription** (*Required*): The subscription you want to monitor, this can be found in the URL when viewing a server +- **name** (*Optional*): The name you want to give this binary sensor, defaults to `Vultr {subscription label}` diff --git a/source/_components/sensor.vultr.markdown b/source/_components/sensor.vultr.markdown new file mode 100644 index 00000000000..154a21ba044 --- /dev/null +++ b/source/_components/sensor.vultr.markdown @@ -0,0 +1,59 @@ +--- +layout: page +title: "Vultr Sensor" +description: "Instructions on how to integrate Vultr sensor within Home Assistant." +date: 2017-10-17 21:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: vultr.png +ha_release: "0.57" +ha_category: System Monitor +ha_iot_class: "Cloud Polling" +--- + + +The `vultr` sensor will allow you to view current bandwidth usage and pending charges against your [Vultr](https://www.vultr.com/) subscription. + +To use this sensor, you must set up your [Vultr hub](/components/vultr/). + +

+The following examples assume a subscription that has an ID of `123456` and a label of `Web Server` +

+ +Minimal `configuration.yaml` (produces `sensor.vultr_web_server_current_bandwidth_used` and `sensor.vultr_web_server_pending_charges`): +```yaml +sensor: + - platform: vultr + subscription: 123456 +``` + +Full `configuration.yaml` using `{}` to format condition name (produces `sensor.server_current_bandwidth_used` and `sensor.server_pending_charges`): +```yaml +sensor: + - platform: vultr + name: Server {} + subscription: 123456 + monitored_conditions: + - current_bandwidth_used + - pending_charges +``` + +Custom `configuration.yaml` with only one condition monitored (produces `sensor.web_server_bandwidth`): +```yaml +sensor: + - platform: vultr + name: Web Server Bandwidth + subscription: 123456 + monitored_conditions: + - current_bandwidth_used +``` + +Configuration variables: + +- **subscription** (*Required*): The Vultr subscription to monitor, this can be found in the URL when viewing a subscription +- **name** (*Optional*): The name to give this sensor, defaults to `Vultr {Vultr subscription label} {monitored condition name}`. +- **monitored_conditions** array (*Optional*): List of items you want to monitor for each subscription. Defaults to all of them if omitted. + - **current_bandwidth_used**: The current (invoice period) bandwidth usage in Gigabytes (GB). + - **pending_charges**: The current (invoice period) charges that have built up for this subscription. Value is in US Dollars (US$). diff --git a/source/_components/switch.vultr.markdown b/source/_components/switch.vultr.markdown new file mode 100644 index 00000000000..0ac0bb3ad1e --- /dev/null +++ b/source/_components/switch.vultr.markdown @@ -0,0 +1,42 @@ +--- +layout: page +title: "Vultr Switch" +description: "Instructions on how to set up Vultr switches within Home Assistant." +date: 2017-10-17 21:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: vultr.png +ha_category: Switch +ha_release: "0.57" +ha_iot_class: "Cloud Polling" +--- + +The `vultr` switch platform allows you to control (start/stop) your [Vultr](https://www.vultr.com/) subscription. + +To control your Vultr subscription, you first have to set up your [Vultr hub](/components/vultr/). + +

+The following examples assume a subscription that has an ID of `123456` and a label of `Web Server` +

+ +Minimal `configuration.yaml` (produces `switch.vultr_web_server`): +```yaml +switch: + - platform: vultr + subscription: 123456 +``` + +Full `configuration.yaml` (produces `switch.amazing_server`): +```yaml +switch: + - platform: vultr + name: Amazing Server + subscription: 123456 +``` + +Configuration variables: + +- **subscription** (*Required*): List of droplets you want to control. +- **name** (*Optional*): The name you want to give this switch, defaults to `Vultr {subscription label}` diff --git a/source/_components/vultr.markdown b/source/_components/vultr.markdown new file mode 100644 index 00000000000..411f89f2c52 --- /dev/null +++ b/source/_components/vultr.markdown @@ -0,0 +1,35 @@ +--- +layout: page +title: "Vultr" +description: "Instructions on how to integrate Vultr within Home Assistant." +date: 2017-10-17 21:00 +sidebar: true +comments: false +sharing: true +footer: true +featured: false +ha_category: Hub +ha_release: "0.57" +logo: vultr.png +ha_iot_class: "Cloud Polling" +--- + + +The `vultr` component allows you to access information about and interact with your [Vultr](https://www.vultr.com) subscriptions (Virtual Private Servers) from Home Assistant. + +Obtain your API key from your [Vultr Account](https://my.vultr.com/settings/#settingsapi). + +

+Ensure you allow the public IP of Home Assistant under the Access Control heading. +

+ +To integrate your Vultr subscriptions with Home Assistant, add the following section to your `configuration.yaml` file: + +```yaml +vultr: + api_key: ABCDEFG12345 +``` + +Configuration variables: + +- **api_key** (*Required*): Your Vultr API key. diff --git a/source/images/supported_brands/vultr.png b/source/images/supported_brands/vultr.png new file mode 100644 index 0000000000000000000000000000000000000000..86595f312c1a7312b4643ec68847465c1e4f9903 GIT binary patch literal 6317 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 Date: Sun, 5 Nov 2017 15:29:40 +0100 Subject: [PATCH 13/46] Update config style and 'ha_release' (#3897) * Update config style and 'ha_release' * Minor changes --- .../_components/binary_sensor.vultr.markdown | 22 +++++++++--- source/_components/sensor.vultr.markdown | 35 ++++++++++++++----- source/_components/switch.vultr.markdown | 21 ++++++++--- source/_components/vultr.markdown | 11 ++++-- 4 files changed, 68 insertions(+), 21 deletions(-) diff --git a/source/_components/binary_sensor.vultr.markdown b/source/_components/binary_sensor.vultr.markdown index cb1421e38e1..a78cb30dc37 100644 --- a/source/_components/binary_sensor.vultr.markdown +++ b/source/_components/binary_sensor.vultr.markdown @@ -9,7 +9,7 @@ sharing: true footer: true ha_category: System Monitor logo: vultr.png -ha_release: "0.57" +ha_release: "0.58" ha_iot_class: "Cloud Polling" --- @@ -22,13 +22,29 @@ The following examples assume a subscription that has an ID of `123456` and a la

Minimal `configuration.yaml` (produces `binary_sensor.vultr_web_server`): + ```yaml +# Example configuration.yaml entry binary_sensor: - platform: vultr subscription: 123456 ``` +{% configuration %} +subscription: + description: The subscription you want to monitor, this can be found in the URL when viewing a server. + required: true + type: string +name: + description: The name you want to give this binary sensor. + required: false + default: "Vultr {subscription label}" + type: string +{% endconfiguration %} + + Full `configuration.yaml` (produces `binary_sensor.totally_awesome_server`): + ```yaml binary_sensor: - platform: vultr @@ -36,7 +52,3 @@ binary_sensor: subscription: 12345 ``` -Configuration variables: - -- **subscription** (*Required*): The subscription you want to monitor, this can be found in the URL when viewing a server -- **name** (*Optional*): The name you want to give this binary sensor, defaults to `Vultr {subscription label}` diff --git a/source/_components/sensor.vultr.markdown b/source/_components/sensor.vultr.markdown index 154a21ba044..5aa03c73931 100644 --- a/source/_components/sensor.vultr.markdown +++ b/source/_components/sensor.vultr.markdown @@ -8,13 +8,13 @@ comments: false sharing: true footer: true logo: vultr.png -ha_release: "0.57" +ha_release: "0.58" ha_category: System Monitor ha_iot_class: "Cloud Polling" --- -The `vultr` sensor will allow you to view current bandwidth usage and pending charges against your [Vultr](https://www.vultr.com/) subscription. +The `vultr` sensor platform will allow you to view current bandwidth usage and pending charges against your [Vultr](https://www.vultr.com/) subscription. To use this sensor, you must set up your [Vultr hub](/components/vultr/). @@ -23,13 +23,37 @@ The following examples assume a subscription that has an ID of `123456` and a la

Minimal `configuration.yaml` (produces `sensor.vultr_web_server_current_bandwidth_used` and `sensor.vultr_web_server_pending_charges`): + ```yaml sensor: - platform: vultr subscription: 123456 ``` +{% configuration %} +subscription: + description: The Vultr subscription to monitor, this can be found in the URL when viewing a subscription. + required: true + type: string +name: + description: The name to give this sensor. + required: false + default: "Vultr {Vultr subscription label} {monitored condition name}" + type: string +monitored_conditions: + description: List of items you want to monitor for each subscription. + required: false + detault: All conditions + type: list + keys: + current_bandwidth_used: + description: The current (invoice period) bandwidth usage in Gigabytes (GB). + temperature: + pending_charges: The current (invoice period) charges that have built up for this subscription. Value is in US Dollars (US$). +{% endconfiguration %} + Full `configuration.yaml` using `{}` to format condition name (produces `sensor.server_current_bandwidth_used` and `sensor.server_pending_charges`): + ```yaml sensor: - platform: vultr @@ -50,10 +74,3 @@ sensor: - current_bandwidth_used ``` -Configuration variables: - -- **subscription** (*Required*): The Vultr subscription to monitor, this can be found in the URL when viewing a subscription -- **name** (*Optional*): The name to give this sensor, defaults to `Vultr {Vultr subscription label} {monitored condition name}`. -- **monitored_conditions** array (*Optional*): List of items you want to monitor for each subscription. Defaults to all of them if omitted. - - **current_bandwidth_used**: The current (invoice period) bandwidth usage in Gigabytes (GB). - - **pending_charges**: The current (invoice period) charges that have built up for this subscription. Value is in US Dollars (US$). diff --git a/source/_components/switch.vultr.markdown b/source/_components/switch.vultr.markdown index 0ac0bb3ad1e..087be7fe925 100644 --- a/source/_components/switch.vultr.markdown +++ b/source/_components/switch.vultr.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: vultr.png ha_category: Switch -ha_release: "0.57" +ha_release: "0.58" ha_iot_class: "Cloud Polling" --- @@ -22,13 +22,29 @@ The following examples assume a subscription that has an ID of `123456` and a la

Minimal `configuration.yaml` (produces `switch.vultr_web_server`): + ```yaml +# Example configuration.yaml entry switch: - platform: vultr subscription: 123456 ``` +{% configuration %} +subscription: + description: List of droplets you want to control. + required: true + type: string +name: + description: The name you want to give this switch. + required: false + default: "Vultr {subscription label}" + type: string +{% endconfiguration %} + + Full `configuration.yaml` (produces `switch.amazing_server`): + ```yaml switch: - platform: vultr @@ -36,7 +52,4 @@ switch: subscription: 123456 ``` -Configuration variables: -- **subscription** (*Required*): List of droplets you want to control. -- **name** (*Optional*): The name you want to give this switch, defaults to `Vultr {subscription label}` diff --git a/source/_components/vultr.markdown b/source/_components/vultr.markdown index 411f89f2c52..187ddaab3f3 100644 --- a/source/_components/vultr.markdown +++ b/source/_components/vultr.markdown @@ -9,7 +9,7 @@ sharing: true footer: true featured: false ha_category: Hub -ha_release: "0.57" +ha_release: "0.58" logo: vultr.png ha_iot_class: "Cloud Polling" --- @@ -26,10 +26,15 @@ Ensure you allow the public IP of Home Assistant under the Access Control headin To integrate your Vultr subscriptions with Home Assistant, add the following section to your `configuration.yaml` file: ```yaml +# Example configuration.yaml entry vultr: api_key: ABCDEFG12345 ``` -Configuration variables: +{% configuration %} +api_key: + description: Your Vultr API key. + required: true + type: string +{% endconfiguration %} -- **api_key** (*Required*): Your Vultr API key. From f78c4f3971294b6d755e1cff65e34d7890c379c7 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 5 Nov 2017 20:53:06 +0100 Subject: [PATCH 14/46] Added documentation for new device class 'plug' (#3889) * Added documentation for new device class 'plug' See https://github.com/home-assistant/home-assistant-polymer/issues/550 * use term "unplugged" * add the entry to the right place --- source/_components/binary_sensor.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/binary_sensor.markdown b/source/_components/binary_sensor.markdown index 53a5b46a023..afc028a2bcb 100644 --- a/source/_components/binary_sensor.markdown +++ b/source/_components/binary_sensor.markdown @@ -24,6 +24,7 @@ The way these sensors are displayed in the frontend can be modified in the [cust - **moving**: `On` means moving, `Off` means stopped - **occupancy**: `On` means occupied, `Off` means not occupied - **opening**: `On` means open, `Off` means closed +- **plug**: `On` means device is plugged in, `Off` means device is unplugged - **power**: Power, over-current, etc. - **safety**: `On` means unsafe, `Off` means safe - **smoke**: `On` means smoke detected From a417716f69730540b5f638d771a33b2f0b600baa Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Mon, 6 Nov 2017 15:15:30 +0100 Subject: [PATCH 15/46] Add new Z-Wave services (#3898) Documentation to https://github.com/home-assistant/home-assistant/pull/10369 --- source/_docs/z-wave/services.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_docs/z-wave/services.markdown b/source/_docs/z-wave/services.markdown index 84ff12b01f1..61c2ff7a860 100644 --- a/source/_docs/z-wave/services.markdown +++ b/source/_docs/z-wave/services.markdown @@ -18,6 +18,7 @@ The `zwave` component exposes multiple services to help maintain the network. Al | cancel_command | Cancels a running Z-Wave command. If you have started a 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_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. | | refresh_entity | Refresh the Z-Wave entity by refreshing dependent values. | @@ -33,6 +34,7 @@ The `zwave` component exposes multiple services to help maintain the network. Al | start_network | Starts the Z-Wave network. | | stop_network | Stops the Z-Wave network. | | test_network | Tells the controller to send no-op commands to each node and measure the time for a response. In theory, this can also bring back nodes which have been marked "presumed dead." | +| test_node | Tells the controller to send no-op command(s) to a specific node. Requires `node_id` field. You can specify amount of test_messages to send by specifying it with `messages` field. In theory, this could bring back nodes marked as "presumed dead" The `soft_reset` and `heal_network` commands can be used as part of an automation script to help keep a Z-Wave network running reliably as shown in the example below. By default, Home Assistant will run a `heal_network` at midnight. This is a configuration option for the `zwave` component. The option defaults to `true` but can be disabled by setting `autoheal` to false. If you're having issues with your Z-Wave network, try disabling this automation. From cb90c05c476511ca1f809d5e1c9d2096ec6647d1 Mon Sep 17 00:00:00 2001 From: Ryan McLean Date: Mon, 6 Nov 2017 22:01:16 +0000 Subject: [PATCH 16/46] Fixed terminology for consistancy (#3916) Updated to add location to get Access Token from as non-obvious. --- source/_components/linode.markdown | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/source/_components/linode.markdown b/source/_components/linode.markdown index 08a44bda7ce..49336ba74a1 100644 --- a/source/_components/linode.markdown +++ b/source/_components/linode.markdown @@ -13,16 +13,21 @@ ha_release: 0.57 ha_iot_class: "Cloud Polling" --- -The `linode` component allows you to access the information about your [Linode](https://welcome.linode.com) systems from Home Assistant. +The `linode` component allows you to access the information about your [Linode](https://www.linode.com) systems from Home Assistant. -Obtain your API key from Linode account. +Obtain your oAuth2 Access Token from Linode account. +* +* Log in +* Select API Tokens +* Create a Personal Access Token, +* Assigned scope (Please choose the least possible access required.) To integrate Linode with Home Assistant, add the following section to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry linode: - access_token: YOUR_API_KEY + access_token: YOUR_ACCESS_TOKEN ``` {% configuration %} @@ -31,4 +36,3 @@ linode: required: true type: string {% endconfiguration %} - From 472ea0bca17651ea206334f208f898a6f3b9a9d8 Mon Sep 17 00:00:00 2001 From: Sam Birch Date: Tue, 7 Nov 2017 11:42:52 +1300 Subject: [PATCH 17/46] Update binary_sensor.trend for linear trend detection (#3584) * Update binary_sensor.trend.markdown * Update binary_sensor.trend.markdown * Added max_samples documentation --- .../_components/binary_sensor.trend.markdown | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/source/_components/binary_sensor.trend.markdown b/source/_components/binary_sensor.trend.markdown index 15f49c2a2fc..41ac39437eb 100644 --- a/source/_components/binary_sensor.trend.markdown +++ b/source/_components/binary_sensor.trend.markdown @@ -13,7 +13,7 @@ ha_release: 0.28 ha_iot_class: "Local Push" --- -The `trend` platform allows you to create sensors which show the trend of numeric `state` or`state_attributes` from other entities. This sensor requires two updates of the underlying sensor to establish a trend. Thus it can take some time to show an accurate state. It can be useful as part of automations, where you want to base an action on a trend. +The `trend` platform allows you to create sensors which show the trend of numeric `state` or`state_attributes` from other entities. This sensor requires at least two updates of the underlying sensor to establish a trend. Thus it can take some time to show an accurate state. It can be useful as part of automations, where you want to base an action on a trend. To enable Trend binary sensors in your installation, add the following to your `configuration.yaml` file: @@ -29,39 +29,54 @@ binary_sensor: Configuration variables: - **sensors** array (*Required*): List of your sensors. - - **friendly_name** (*Optional*): Name to use in the Frontend. - - **device_class** (*Optional*): The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. - **entity_id** (*Required*): The entity that this sensor tracks. - **attribute** (*Optional*): The attribute of the entity that this sensor tracks. If no attribute is specified then the sensor will track the state. - - **invert** (*Optional*): Invert the result (so `true` means descending rather than ascending) + - **device_class** (*Optional*): The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. + - **friendly_name** (*Optional*): Name to use in the Frontend. + - **invert** (*Optional*): Invert the result (so `true` means descending rather than ascending). Defaults to `False` + - **max_samples** (*Optional*): Limit the maximum number of stored samples. Defaults to `2`. + - **min_gradient** (*Optional*): The minimum rate at which the observed value must be changing for this sensor to switch on. Defaults to `0.0` + - **sample_duration** (*Optional*): The duration **in seconds** to store samples for. Samples older than this value will be discarded. Defaults to `0` + +## {% linkable_title Using Multiple Samples %} + +If the optional `sample_duration` and `max_samples` parameters are specified then multiple samples can be stored and used to detect long-term trends. + +Each time the state changes, a new sample is stored along with the sample time. Samples older than `sample_duration` seconds will be discarded. + +A trend line is then fitted to the available samples, and the gradient of this line is compared to `min_gradient` to determine the state of the trend sensor. The gradient is measured in sensor units per second - so if you want to know when the temperature is falling by 2 degrees per hour, use a gradient of (-2) / (60 x 60) = -0.00055 + +The current number of stored samples is displayed on the States page. ## {% linkable_title Examples %} In this section you find some real life examples of how to use this sensor. -### {% linkable_title Temperature trend %} - -This example indicates `true` if the temperature is rising: +This example indicates `true` if the sun is still rising: ```yaml binary_sensor: - platform: trend sensors: - temperature_up: - friendly_name: 'Temp increasing' - entity_id: sensor.skylight_temperature + sun_rising: + entity_id: sun.sun +``` + +This example creates two sensors to indicate whether the temperature is rising or falling at a rate of at least 3 degrees an hour, and collects samples over a two hour period: + +```yaml +binary_sensor: + - platform: trend + sensors: + temp_falling: + entity_id: sensor.outside_temperature + sample_duration: 7200 + min_gradient: -0.0008 + device_class: cold + + temp_rising: + entity_id: sensor.outside_temperature + sample_duration: 7200 + min_gradient: 0.0008 device_class: heat ``` - -And this one indicates `true` if the temperature is falling: - -```yaml -binary_sensor: - - platform: trend - sensors: - temperature_down: - friendly_name: 'Temp decreasing' - entity_id: sensor.skylight_temperature - device_class: cold - invert: Yes -``` From 9cd72c0dbcb4f127e5d3c2db84ca649c45ff3fe0 Mon Sep 17 00:00:00 2001 From: Dan C Williams Date: Tue, 7 Nov 2017 02:46:28 -0600 Subject: [PATCH 18/46] Add note to iOS actionable notifications for clarity (#3720) * Update actions.markdown Added note to remind users to update push settings within the app. There are multiple community questions around this and performing this update will take care of many issues when implementing actionable notifications. * Correcting spelling Corrected `Setting` to `Settings` * Remove space --- source/_docs/ecosystem/ios/notifications/actions.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/ecosystem/ios/notifications/actions.markdown b/source/_docs/ecosystem/ios/notifications/actions.markdown index 7ed22d6c33c..df7caf240c0 100644 --- a/source/_docs/ecosystem/ios/notifications/actions.markdown +++ b/source/_docs/ecosystem/ios/notifications/actions.markdown @@ -141,3 +141,4 @@ Notes: * `textInput` will only exist if `behavior` was set to `textInput`. * `actionData` is a dictionary with parameters passed in the `action_data` dictionary of the `push` dictionary in the original notification. +* When adding or updating push categories be sure to update push settings within the Home Assistant iOS app. This can be found within the app at **Settings** (gear icon) > **Notification Settings**. From c9e1a09d8ced1b74ddf44cbba09b01fade3173e0 Mon Sep 17 00:00:00 2001 From: Gabor SZOLLOSI Date: Tue, 7 Nov 2017 09:55:13 +0100 Subject: [PATCH 19/46] Raspihats platform update, added smbus, i2c install (#3483) * Raspihats platform update, added smbus, i2c install * Raspihats platform update, added smbus, i2c install --- .../binary_sensor.raspihats.markdown | 43 ++++++++++++++++++ source/_components/switch.raspihats.markdown | 44 +++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/source/_components/binary_sensor.raspihats.markdown b/source/_components/binary_sensor.raspihats.markdown index 5a76cbe2559..4815aa2de7b 100644 --- a/source/_components/binary_sensor.raspihats.markdown +++ b/source/_components/binary_sensor.raspihats.markdown @@ -44,4 +44,47 @@ Configuration variables: - **invert_logic** (*Optional*): Inverts the input logic, default is `false`. - **device_class** (*Optional*): See device classes in [binary_sensor component](/components/binary_sensor/), default is `None` +## {% linkable_title Directions for installing smbus support on Raspberry Pi %} + +Enable I2c interface with the Raspberry Pi configuration utility: + +```bash +# pi user environment: Enable i2c interface +$ sudo raspi-config +``` + +Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish`. + +Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: + +```bash +# pi user environment: Install i2c dependencies and utilities +$ sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev + +# pi user environment: Add homeassistant user to the i2c group +$ sudo usermod -a -G i2c homeassistant +``` + +### {% linkable_title Check the i2c address of the sensor %} + +After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors, so you can see the sensor address: + +```bash +$ /usr/sbin/i2cdetect -y 1 +``` + +It will output a table like this: + +```text + 0 1 2 3 4 5 6 7 8 9 a b c d e f +00: -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: 40 -- -- -- -- -- UU -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- 77 +``` + For more details about the `raspihats` add-on boards for Raspberry PI, visit [raspihats.com](http://www.raspihats.com/). diff --git a/source/_components/switch.raspihats.markdown b/source/_components/switch.raspihats.markdown index 674f2f99e49..b2fa067e130 100644 --- a/source/_components/switch.raspihats.markdown +++ b/source/_components/switch.raspihats.markdown @@ -45,4 +45,48 @@ Configuration variables: - **invert_logic** (*Optional*): Inverts the output logic, default is `False`. - **initial_state** (*Optional*): Initial state, default is `None`, can also be `True` or `False`. `None` means no state is forced on the corresponding digital output when this switch is instantiated. + +## {% linkable_title Directions for installing smbus support on Raspberry Pi %} + +Enable I2c interface with the Raspberry Pi configuration utility: + +```bash +# pi user environment: Enable i2c interface +$ sudo raspi-config +``` + +Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish`. + +Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: + +```bash +# pi user environment: Install i2c dependencies and utilities +$ sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev + +# pi user environment: Add homeassistant user to the i2c group +$ sudo usermod -a -G i2c homeassistant +``` + +### {% linkable_title Check the i2c address of the sensor %} + +After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors, so you can see the sensor address: + +```bash +$ /usr/sbin/i2cdetect -y 1 +``` + +It will output a table like this: + +```text + 0 1 2 3 4 5 6 7 8 9 a b c d e f +00: -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: 40 -- -- -- -- -- UU -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- 77 +``` + For more details about the Raspihats add-on boards for Raspberry PI, visit [raspihats.com](http://www.raspihats.com/). From 6158057ec16cddb25068d3f2d5b3188f7334e653 Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Tue, 7 Nov 2017 21:32:24 +0000 Subject: [PATCH 20/46] Serial sensor (#3926) * sensor serial correction + Fixes configuration mismatch (serial_port) + adds option (baudrate) * Minimize config sample and fix description --- source/_components/sensor.serial.markdown | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.serial.markdown b/source/_components/sensor.serial.markdown index d03daed3906..c66fe9386ad 100644 --- a/source/_components/sensor.serial.markdown +++ b/source/_components/sensor.serial.markdown @@ -27,11 +27,11 @@ To setup a serial sensor to your installation, add the following to your `config # Example configuration.yaml entry sensor: - platform: serial - port: /dev/ttyACM0 + serial_port: /dev/ttyACM0 ``` {% configuration %} - port: + serial_port: description: Local serial port where the sensor is connected and access is granted. required: true type: string @@ -39,6 +39,11 @@ sensor: description: Friendly name to use for the frontend. Default to "Serial sensor". required: false type: string + baudrate: + description: Baudrate of the serial port. + required: false + default: 9600 Bps + type: int {% endconfiguration %} From 6f553ed23cc790e6ddb4e499919076689babe670 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 9 Nov 2017 09:45:16 +0100 Subject: [PATCH 21/46] Add examples --- source/_components/sensor.serial.markdown | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/source/_components/sensor.serial.markdown b/source/_components/sensor.serial.markdown index c66fe9386ad..52646cf648a 100644 --- a/source/_components/sensor.serial.markdown +++ b/source/_components/sensor.serial.markdown @@ -57,4 +57,35 @@ sensor: ``` {% endraw %} +## {% linkable_title Examples %} +### {% linkable_title Arduino %} + +For controllers of the Arduino family a possible sketch to read the temperature and the humidity could look like the sample below. + +``` +#include + +void setup() { + Serial.begin(115200); +} + +void loop() { + StaticJsonBuffer<100> jsonBuffer; + JsonObject& json = prepareResponse(jsonBuffer); + json.printTo(Serial); + Serial.println(); + delay(2000); +} + +JsonObject& prepareResponse(JsonBuffer& jsonBuffer) { + JsonObject& root = jsonBuffer.createObject(); + root["temperature"] = analogRead(A0); + root["humidity"] = analogRead(A1); + return root; +} +``` + +### {% linkable_title Digispark USB Development Board %} + +This [blog post](/blog/2017/10/23/simple-analog-sensor/) describes the setup with a Digispark USB Development Board. From d291868644889cda489b0466c56c458304dccc32 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Thu, 9 Nov 2017 18:27:53 +0100 Subject: [PATCH 22/46] Update control-panel.markdown Updates for new services and buttons. --- source/_docs/z-wave/control-panel.markdown | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/_docs/z-wave/control-panel.markdown b/source/_docs/z-wave/control-panel.markdown index 342d2947c5a..2327e51117f 100644 --- a/source/_docs/z-wave/control-panel.markdown +++ b/source/_docs/z-wave/control-panel.markdown @@ -28,6 +28,7 @@ Here is where you [include and exclude](/docs/z-wave/adding/) Z-Wave devices fro * **Stop Network** stops the Z-Wave network * **Soft Reset** tells the controller to do a "soft reset." This is not supposed to lose any data, but different controllers can behave differently to a "soft reset" command, and may cause the Z-Wave network to hang. * **Test Network** tells the controller to send no-op commands to each node and measure the time for a response. In theory, this can also bring back nodes which have been marked "presumed dead". +* **Save Config** Saves the current cache of the network to zwcfg_[home_id].xml ## {% linkable_title Z-Wave Node Management %} @@ -35,9 +36,12 @@ Here is where you [include and exclude](/docs/z-wave/adding/) Z-Wave devices fro * **Remove Failed Node** will remove a failed node from the network. The node needs to be on the controller's Failed Node List (marked as `is_failed: true`), otherwise this command will fail. * **Replace Failed Node** will replace a failed device with another. If the node is not in the controller's Failed Node List, or the node responds, this command will fail. * **Print Node** prints all state of Z-Wave node to the console log - * **Rename Node** sets a node's name +* **Heal Node** starts healing of the node.(Update neighbour list and update return routes) + +* **Test Node** sends no_op test messages to the node. This could in theory bring back a dead node. +

Battery powered devices need to be awake before you can use the Z-Wave control panel to update their settings. How to wake your device is device specific, and some devices will stay awake for only a couple of seconds. Please refer to the manual of your device for more details.

From 4d4212bca4f01c5c56cc946b8844cae0ed2101f2 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Fri, 10 Nov 2017 00:13:42 +0100 Subject: [PATCH 23/46] Harmony remote now does push (#3845) --- source/_components/remote.harmony.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/remote.harmony.markdown b/source/_components/remote.harmony.markdown index 41cc37cdc53..03813d77cb8 100755 --- a/source/_components/remote.harmony.markdown +++ b/source/_components/remote.harmony.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: logitech.png ha_category: Remote -ha_iot_class: "Local Polling" +ha_iot_class: "Local Push" ha_release: "0.34" --- @@ -54,7 +54,7 @@ Configuration variables: - **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 turnon service is called without any data. -- **scan_interval** (*Optional*): Amount in seconds in between polling for device's current activity. Defaults to 30 seconds. +- **delay_secs** (*Optional*): Default duration in seconds between sending commands to a device. Configuration file: @@ -67,7 +67,7 @@ Upon startup one file will be written to your Home Assistant configuration direc Supported services: - **Turn Off**: Turn off all devices that were switched on from the start of the current activity.s -- **Turn On**: Start an activity, will start the default activity from configuration.yaml if no activity is specified. The specified activity can either be the activity name or the activity ID from the configuration file written to your [Home Assistant configuration directory](/docs/configuration/). The service will respond faster if the activity ID is passed instead of the name. +- **Turn On**: Start an activity, will start the default activity from configuration.yaml if no activity is specified. The specified activity can either be the activity name or the activity ID from the configuration file written to your [Home Assistant configuration directory](/docs/configuration/). - **Send Command**: Send a single command or a set of commands to one device, device ID and available commands are written to the configuration file at startup. You can optionally specify the number of times you wish to repeat the command(s) and delay you want between repeated command(s). - **Sync**: Synchronizes the Harmony device with the Harmony web service if any changes are made from the web portal or app. From 93cb701387d7dea36eb4205fd4e93a10b2b1810a Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Fri, 10 Nov 2017 16:27:59 +0000 Subject: [PATCH 24/46] Serial json (#3942) * add value_template option * Set type to template * Remove tab --- source/_components/sensor.serial.markdown | 30 +++++++++++++---------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/source/_components/sensor.serial.markdown b/source/_components/sensor.serial.markdown index 52646cf648a..ea1ad91a0b7 100644 --- a/source/_components/sensor.serial.markdown +++ b/source/_components/sensor.serial.markdown @@ -31,19 +31,23 @@ sensor: ``` {% configuration %} - serial_port: - description: Local serial port where the sensor is connected and access is granted. - required: true - type: string - name: - description: Friendly name to use for the frontend. Default to "Serial sensor". - required: false - type: string - baudrate: - description: Baudrate of the serial port. - required: false - default: 9600 Bps - type: int +serial_port: + description: Local serial port where the sensor is connected and access is granted. + required: true + type: string +name: + description: Friendly name to use for the frontend. Default to "Serial sensor". + required: false + type: string +baudrate: + description: Baudrate of the serial port. + required: false + default: 9600 Bps + type: int +value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the serial line." + required: false + type: template {% endconfiguration %} From c974f513438181382eed9b6f4deeb14a5cdede05 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Sun, 12 Nov 2017 11:04:46 +0100 Subject: [PATCH 25/46] Update control-panel.markdown (#3965) * Update control-panel.markdown Info for https://github.com/home-assistant/home-assistant-polymer/pull/604 * Update control-panel.markdown * Update control-panel.markdown --- source/_docs/z-wave/control-panel.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/z-wave/control-panel.markdown b/source/_docs/z-wave/control-panel.markdown index 48e654ffaa8..b3eb7f50e8c 100644 --- a/source/_docs/z-wave/control-panel.markdown +++ b/source/_docs/z-wave/control-panel.markdown @@ -112,4 +112,5 @@ Underneath that you can select any supported configuration parameter to see the ## {% linkable_title OZW Log %} +If you want to only retrieve some lines at the end of the log, you can specify that with the selection field. Max is the last 1000 lines and minimum is 0 which equals the whole log. If this is not specified, you will retrieve the whole log. Select **Refresh** to display the log if you need it to check activities. From d93979e251669b67d3ee09334d358030ce636750 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sun, 12 Nov 2017 13:32:32 -0700 Subject: [PATCH 26/46] Adds docs for Tile (#3938) * Adds docs for Tile * Collaborator-requested changes --- .../_components/device_tracker.tile.markdown | 46 ++++++++++++++++++ source/images/supported_brands/tile.png | Bin 0 -> 3198 bytes 2 files changed, 46 insertions(+) create mode 100644 source/_components/device_tracker.tile.markdown create mode 100644 source/images/supported_brands/tile.png diff --git a/source/_components/device_tracker.tile.markdown b/source/_components/device_tracker.tile.markdown new file mode 100644 index 00000000000..0db52dfefe6 --- /dev/null +++ b/source/_components/device_tracker.tile.markdown @@ -0,0 +1,46 @@ +--- +layout: page +title: "Tile" +description: "Instructions how to use Tile to track devices in Home Assistant." +date: 2017-11-08 20:40:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: tile.png +ha_release: 0.58 +ha_category: Presence Detection +ha_iot_class: "Cloud Polling" +--- + +The `tile` platform allows Home Assistant to utilize [Tile® Bluetooth trackers](https://www.thetileapp.com). +The official Tile mobile app handles the actual tracking of Tile devices using +the mobile device's Bluetooh and GPS. + +To integrate Tile into Home Assistant, add the following section to your +`configuration.yaml` file: + +```yaml +device_tracker: + - platform: tile + username: email@address.com + password: MY_PASSWORD_123 + monitored_variables: + - TILE + - PHONE +``` + +{% configuration %} + username: + description: the email address for the Tile account + required: true + type: string + password: + description: the password for the Tile account + required: true + type: string + monitored_variables: + description: the Tile types to monitor; valid values are `TILE` and `PHONE` (default is for all types to be included) + required: false + type: list +{% endconfiguration %} \ No newline at end of file diff --git a/source/images/supported_brands/tile.png b/source/images/supported_brands/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8e559fcf786aaeb01da3eaace7b7bd8ded85a7 GIT binary patch literal 3198 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 literal 0 HcmV?d00001 From 17c00727dda370f012001caa91c04fa9ebd70954 Mon Sep 17 00:00:00 2001 From: Martin Berg Date: Tue, 14 Nov 2017 12:57:39 +0100 Subject: [PATCH 27/46] Add doc for new changed_by attribute (#3650) --- .../_components/alarm_control_panel.spc.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/_components/alarm_control_panel.spc.markdown b/source/_components/alarm_control_panel.spc.markdown index 673e687fa3b..78e7066f00e 100644 --- a/source/_components/alarm_control_panel.spc.markdown +++ b/source/_components/alarm_control_panel.spc.markdown @@ -18,3 +18,19 @@ The `spc` alarm control panel platform allows you to control your [Vanderbilt SP The requirement is that you have setup your [SPC hub](/components/spc/). +The `changed_by` attribute enables one to be able to take different actions depending on who armed/disarmed the alarm in [automation](/getting-started/automation/). + +```yaml +automation: + - alias: Alarm status changed + trigger: + - platform: state + entity_id: alarm_control_panel.alarm_1 + action: + - service: notify.notify + data_template: + message: > + {% raw %}Alarm changed from {{ trigger.from_state.state }} + to {{ trigger.to_state.state }} + by {{ trigger.to_state.attributes.changed_by }}{% endraw %} +``` From 9a404b9a8877c68c55a8e208c0b6c6b024be3f2c Mon Sep 17 00:00:00 2001 From: ziotibia81 Date: Tue, 14 Nov 2017 14:57:57 +0100 Subject: [PATCH 28/46] Modbus sensor types (#3980) * Typo * Added more sensor options * Style fix --- source/_components/sensor.modbus.markdown | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/source/_components/sensor.modbus.markdown b/source/_components/sensor.modbus.markdown index fd3b7157560..70cbfb494c2 100644 --- a/source/_components/sensor.modbus.markdown +++ b/source/_components/sensor.modbus.markdown @@ -49,13 +49,15 @@ Configuration variables: - **name** (*Required*): Name of the sensor. - **slave** (*Required*): The number of the slave (Optional for tcp and upd Modbus). - **register** (*Required*): Register number. - - **register_type** (*Optional*): Modbus register type (holding, input), default holding + - **register_type** (*Optional*): Modbus register type (holding, input), default holding. - **unit_of_measurement** (*Optional*): Unit to attach to value. - **count** (*Optional*): Number of registers to read. - - **scale** (*Optional*): Scale factor (output = scale * value + offset), default 1 - - **offset** (*Optional*): Final offset (output = scale * value + offset), default 0 - - **precision** (*Optional*): Number of valid decimals, default 0 - - **data_type** (*Optional*): Response representation (int, float). If float selected, value will be converted to IEEE 754 floating point format. default int + - **reverse_order** (*Optional*): Reverse the order of registers when count >1, default False. + - **scale** (*Optional*): Scale factor (output = scale * value + offset), default 1. + - **offset** (*Optional*): Final offset (output = scale * value + offset), default 0. + - **precision** (*Optional*): Number of valid decimals, default 0. + - **data_type** (*Optional*): Response representation (int, uint, float, custom). If float selected, value will be converted to IEEE 754 floating point format. Default int. + - **structure** (*Optional*): If data_type is custom specify here a double quoted python struct format string to unpack the value. See python documentation for details. Ex: ">i". It's possible to change the default 30 seconds scan interval for the sensor updates as shown in the [Platform options](/docs/configuration/platform_options/#scan-interval) documentation. @@ -72,7 +74,6 @@ sensor: slave: 10 register: 0 register_type: holding - update_interval: 2.5 unit_of_measurement: °C count: 1 scale: 0.1 From 9bba1df831eaa9e12ef33703e08f5e5b88860ded Mon Sep 17 00:00:00 2001 From: marthoc <30442019+marthoc@users.noreply.github.com> Date: Tue, 14 Nov 2017 23:19:24 -0500 Subject: [PATCH 29/46] Add Cover to MQTT Discovery (#3983) Adds Cover to the list of MQTT components supported by MQTT discovery. --- source/_docs/mqtt/discovery.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index 98daf5e74ea..e9139095d75 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -16,6 +16,7 @@ The discovery of MQTT devices will enable one to use MQTT devices with only mini Supported by MQTT discovery: - [Binary sensors](/components/binary_sensor.mqtt/) +- [Covers](/components/cover.mqtt/) - [Fans](/components/fan.mqtt/) - [Lights](/components/light.mqtt/) - [Sensors](/components/sensor.mqtt/) From 4881ec195b0cd90fbcb148cb7523512b8b7605ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20St=C3=A5hl?= Date: Thu, 16 Nov 2017 07:56:36 +0100 Subject: [PATCH 30/46] Add documentation for system_log (#3972) * Add system_log documentation * Clarify that system_log is loaded by frontend * Update to reflect that system_log is not a panel * Add ha_release and use new style --- source/_components/system_log.markdown | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 source/_components/system_log.markdown diff --git a/source/_components/system_log.markdown b/source/_components/system_log.markdown new file mode 100644 index 00000000000..fae6692223e --- /dev/null +++ b/source/_components/system_log.markdown @@ -0,0 +1,37 @@ +--- +layout: page +title: "System Log" +description: "Summary of errors and warnings in Home Assistant during runtime." +date: 2017-11-11 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_category: Other +ha_release: 0.58 +--- + +The `system_log` component stores information about all logged errors and warnings in Home Assistant. All collected information is accessible directly in the frontend, just navigate to the `Info` section under `Developer Tools`. In order to not overload Home Assistant with log data, only the 50 last errors and warnings will be stored. Older entries are automatically discarded from the log. It is possible to change the amount of stored log entries using the parameter `max_entries`. + +This component is automatically loaded by the `frontend` (so no need to do anything if you are using the frontend). If you are not doing so, or if you wish to change a parameter, add the following section to your `configuration.yaml` file: + +```yaml +system_log: + max_entries: MAX_ENTRIES +``` + +{% configuration %} +max_entries: + description: Number of entries to store (older entries are discarded). + required: false + type: int + default: 50 +{% endconfiguration %} + +## {% linkable_title Services %} + +### {% linkable_title Service `clear` %} + +To manually clear the system log, call this service. + From 8dad2f30b7c3580eead125dfa41694a0dc4c039d Mon Sep 17 00:00:00 2001 From: ziotibia81 Date: Thu, 16 Nov 2017 08:02:48 +0100 Subject: [PATCH 31/46] Modbus switch register support (#3978) * Update switch.modbus.markdown * Style fix --- source/_components/switch.modbus.markdown | 25 +++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/source/_components/switch.modbus.markdown b/source/_components/switch.modbus.markdown index d664731534e..bac21bbd812 100644 --- a/source/_components/switch.modbus.markdown +++ b/source/_components/switch.modbus.markdown @@ -14,7 +14,7 @@ ha_iot_class: "Local Push" --- -The `modbus` switch platform allows you to control [Modbus](http://www.modbus.org/) coils. +The `modbus` switch platform allows you to control [Modbus](http://www.modbus.org/) coils or registers. To use your Modbus switches in your installation, add the following to your `configuration.yaml` file: @@ -30,11 +30,28 @@ switch: - name: Switch2 slave: 2 coil: 14 + registers: + - name: Register1 + slave: 1 + register: 11 + command_on: 1 + command_off: 0 ``` Configuration variables: -- **coils** (*Optional*): A list of relevant coils to read from/write to +- **coils** (*Optional*): A list of relevant coils to read from/write to. - **slave** (*Required*): The number of the slave (can be omitted for tcp and udp Modbus). - - **name** (*Required*): Name of the sensor - - **coil** (*Required*): Coil number + - **name** (*Required*): Name of the switch. + - **coil** (*Required*): Coil number. +- **registers** (*Optional*): A list of relevant registers to read from/write to. + - **slave** (*Required*): The number of the slave (can be omitted for tcp and udp Modbus). + - **name** (*Required*): Name of the switch. + - **register** (*Required*): Register number. + - **command_on** (*Required*): Value to write to turn on the switch. + - **command_off** (*Required*): Value to write to turn off the switch. + - **verify_state** (*Optional*): Define if is possible to readback the status of the switch. (default: True) + - **verify_register** (*Optional*): Register to readback. (default: same as register) + - **register_type** (*Optional*): Modbus register type: holding or input. (default: holding) + - **state_on** (*Optional*): Register value when switch is on. (default: same as command_on) + - **state_off** (*Optional*): Register value when switch is off. (default: same as command_off) From fced7ece08239a3bc2c5cd6eb0d19e4190213ff3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 16 Nov 2017 22:16:08 -0800 Subject: [PATCH 32/46] Version bump to 0.58 --- _config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index 3c544f2b400..3f5b224ff88 100644 --- a/_config.yml +++ b/_config.yml @@ -139,12 +139,12 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 57 -current_patch_version: 3 -date_released: 2017-11-11 +current_minor_version: 58 +current_patch_version: 0 +date_released: 2017-11-18 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. # Major release: -patch_version_notes: "#release-0573---november-11" +patch_version_notes: "#" # Minor release (Example #release-0431---april-25): From b96a940e142df643c6be02a49b91c7e65067e1f6 Mon Sep 17 00:00:00 2001 From: Ari Lotter Date: Sat, 18 Nov 2017 04:09:32 -0500 Subject: [PATCH 33/46] Create device_tracker.hitron_coda.markdown (#3512) * Create device_tracker.hitron_coda.markdown * Fix minor grammar issues * :hammer: Processed review comments --- .../device_tracker.hitron_coda.markdown | 44 ++++++++++++++++++ source/images/supported_brands/hitron.png | Bin 0 -> 5581 bytes 2 files changed, 44 insertions(+) create mode 100644 source/_components/device_tracker.hitron_coda.markdown create mode 100644 source/images/supported_brands/hitron.png diff --git a/source/_components/device_tracker.hitron_coda.markdown b/source/_components/device_tracker.hitron_coda.markdown new file mode 100644 index 00000000000..fecdc2fd5ed --- /dev/null +++ b/source/_components/device_tracker.hitron_coda.markdown @@ -0,0 +1,44 @@ +--- +layout: page +title: "Hitron CODA Routers" +description: "Instructions on how to integrate Hitron CODA Routers into Home Assistant." +date: 2017-10-03 15:40 +sidebar: true +comments: false +sharing: true +footer: true +logo: hitron.png +ha_category: Presence Detection +ha_release: 0.58 +--- + +This component offers presence detection by examining devices connected to a [Rogers Hitron CODA](https://www.rogers.com/customer/support/article/wi-fi-password-hitron-coda4582-cgn3amr-cgnm3552-cgn3acr-cgn3) +Router. + +To use a Hitron router in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +device_tracker: + - platform: hitron_coda + host: !secret router_ip + username: !secret router_username + password: !secret router_password +``` + +{% configuration %} +host: + description: The IP address of your router, e.g., `192.168.0.1`. + required: true + type: string +username: + description: The username to login into the router (user should have read access to the web interface of the router). Usually "cusadmin". + required: true + type: string +password: + description: The password for the specified username. Usually your WiFi password. + required: true + type: string +{% endconfiguration %} + +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/images/supported_brands/hitron.png b/source/images/supported_brands/hitron.png new file mode 100644 index 0000000000000000000000000000000000000000..bc553996251c5587467dd301064e52659a8728d7 GIT binary patch literal 5581 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 b(dz#J(-ypwl2vR^00000NkvXXu0mjfoF>7e literal 0 HcmV?d00001 From 635d0338451da62127c63d93d31a6f3a4c203448 Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Sat, 18 Nov 2017 11:11:34 -0600 Subject: [PATCH 34/46] Add signal_strength monitor documentation (#3641) --- source/_components/sensor.arlo.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/sensor.arlo.markdown b/source/_components/sensor.arlo.markdown index 72fc0ae36bb..309795f7952 100644 --- a/source/_components/sensor.arlo.markdown +++ b/source/_components/sensor.arlo.markdown @@ -26,6 +26,7 @@ sensor: - last_capture - total_cameras - battery_level + - signal_strength ``` Configuration variables: @@ -35,5 +36,6 @@ Configuration variables: - **last_capture**: Return the timestamp from the last video captured by your Arlo camera. - **total_cameras**: Return the number of recognized and active cameras linked on your Arlo account. - **battery_level**: Return the battery level of your Arlo camera. + - **signal_strength**: Return the wireless signal strength of your Arlo camera. If no **monitored_conditions** are specified, all of above will be enabled by default. From 1a2b45f3ffa7ec88923ca237dae88e935dbd3070 Mon Sep 17 00:00:00 2001 From: r4nd0mbr1ck <23737685+r4nd0mbr1ck@users.noreply.github.com> Date: Sat, 18 Nov 2017 19:01:07 +1100 Subject: [PATCH 35/46] Add new configuration variables for request_sync (#3807) * Add new configuration variables for request_sync * Update google_assistant.markdown Include note about initial sync with agent_user_id * Change to api_key - remove homegraph prefix * :pencil2: Small spelling/grammar fixes --- source/_components/google_assistant.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown index 23c1ce73397..15a3730096b 100644 --- a/source/_components/google_assistant.markdown +++ b/source/_components/google_assistant.markdown @@ -28,6 +28,8 @@ google_assistant: project_id: someproject-2d0b8 client_id: [long URL safe random string] access_token: [a different long URL safe random string] + agent_user_id: [a string to identify user] + api_key: [an API Key generated for the Google Actions project] exposed_domains: - switch - light @@ -43,6 +45,8 @@ google_assistant: * *project_id* (Required): Project ID from the Google Developer console (looks like `words-2ab12`) * *client_id* (Required): A long random URL safe string (no spaces or special characters) that will be used for Implicit OAuth. * *access_token* (Required): Another different long random URL safe string. +* *agent_user_id* (Optional): A string to identify the user, e.g., email address. If not provided, the component will generate one. +* *api_key* (Optional): An API Key generated for the project from Google Console. See setup below. If not provided then the request_sync service is not exposed * *exposed_domains* (Optional): An array of Home Assistant domains to expose to Google Assistant. Options include: - `switch` - `light` @@ -123,3 +127,10 @@ homeassistant: 2. Under the gear icon, click `Permissions` 3. Click `Add`, type the new user's e-mail address and choose `Project -> Editor` role 4. Have the new user go to [developer console](https://console.actions.google.com/) and repeat steps starting from point 7. +11. If you want to use the request_sync service in Home Assistant, then Enable Homegraph API for your project: + 1. Go to https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview + 2. Select your project and click Enable Homegraph API + 3. Go to Credentials and select API Key from Create Credentials + 4. Note down the generated API Key and use this in the configuration + +*Note:* 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 from Home Control and relink. From 33d064393c087495e19376387f5b87420b1c1935 Mon Sep 17 00:00:00 2001 From: Matthew Donoughe Date: Sat, 18 Nov 2017 09:41:05 -0500 Subject: [PATCH 36/46] documentation for Lutron Caseta update (#3883) * initial documentation for caseta update * get zip from home-assistant.github.io --- source/_components/lutron_caseta.markdown | 10 +++++++++- source/assets/get_lutron_cert.zip | Bin 0 -> 2468 bytes 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 source/assets/get_lutron_cert.zip diff --git a/source/_components/lutron_caseta.markdown b/source/_components/lutron_caseta.markdown index c2a3f41f7c6..912bd82dc41 100644 --- a/source/_components/lutron_caseta.markdown +++ b/source/_components/lutron_caseta.markdown @@ -27,17 +27,25 @@ The currently supported Caseta devices are: When configured, the `lutron_caseta` component will automatically discover the currently supported devices as setup in the Lutron Smart Bridge. The name assigned in the Lutron mobile app will be used to form the `entity_id` used in Home Assistant. e.g. a dimmer called 'Bedroom Lamp' becomes `light.bedroom_lamp` in Home Assistant. -To use Lutron Caseta devices in your installation, add the following to your `configuration.yaml` file using the IP of your Smart Bridge: +To use Lutron Caseta devices in your installation, you must first log in to your Lutron account and generate a certificate that allows Home Assistant to connect to your bridge. This can be accomplished by downloading and executing [this script](/assets/get_lutron_cert.zip), which will generate three files: caseta.key, caseta.crt, caseta-bridge.crt when you run it. See the instructions at the top of the script for more information. + +Once you have the three necessary files, place them in your configuration directory and add the following to your `configuration.yaml`: ```yaml # Example configuration.yaml entry lutron_caseta: host: IP_ADDRESS + keyfile: caseta.key + certfile: caseta.crt + ca_certs: caseta-bridge.crt ``` Configuration variables: - **host** (*Required*): The IP address of the Lutron Smart Bridge. +- **keyfile** (*Required*): The private key that Home Assistant will use to authenticate to the bridge. +- **certfile** (*Required*): The certificate chain that Home Assistant will use to authenticate to the bridge. +- **ca_certs** (*Required*): The list of certificate authorities (usually only one) that Home Assistant will expect when connecting to the bridge.

It is recommended to assign a static IP address to your Lutron Smart Bridge. This ensures that it won't change IP address, so you won't have to change the `host` if it reboots and comes up with a different IP address. diff --git a/source/assets/get_lutron_cert.zip b/source/assets/get_lutron_cert.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3849e8a4120cd5d2e6eda0c985e064a715ffb89 GIT binary patch literal 2468 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 literal 0 HcmV?d00001 From af29799b40e1b62656fb8f87b19c51f263985462 Mon Sep 17 00:00:00 2001 From: Matt White Date: Sat, 18 Nov 2017 11:26:22 -0600 Subject: [PATCH 37/46] Add include/exclude filter to mqtt_statestream docs (#3893) * Add include/exclude filter to mqtt_statestream docs * :pencil2: Small changes --- source/_components/mqtt_statestream.markdown | 58 +++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/source/_components/mqtt_statestream.markdown b/source/_components/mqtt_statestream.markdown index 1fa88b4469f..5b7b832fe91 100644 --- a/source/_components/mqtt_statestream.markdown +++ b/source/_components/mqtt_statestream.markdown @@ -32,6 +32,12 @@ Configuration variables: Default is false. - **publish_timestamps** (*Optional*): Publish the last_changed and last_updated timestamps for the entity. Default is false. +- **exclude** (*Optional*): Configure which components should be excluded from recordings. See *Include/Exclude* section below for details. + - **entities** (*Optional*): The list of entity ids to be excluded from recordings. + - **domains** (*Optional*): The list of domains to be excluded from recordings. +- **include** (*Optional*): Configure which components should be included in recordings. If set, all other entities will not be recorded. + - **entities** (*Optional*): The list of entity ids to be included from recordings. + - **domains** (*Optional*): The list of domains to be included from recordings. ## Operation @@ -44,6 +50,56 @@ For example, with the example configuration above, if an entity called 'light.ma If that entity also has an attribute called `brightness`, the component will also publish the value of that attribute to `homeassistant/light/master_bedroom_dimmer/brightness`. -All states and attributes are passed through JSON serialization before publishing. **Please note** that this causes strings to be quoted (e.g., the string 'on' will be published as '"on"'). You can access the JSON deserialized values (as well as unquoted strings) at many places by using `value_json` instead of `value`. +All states and attributes are passed through JSON serialization before publishing. **Please note** that this causes strings to be quoted (e.g., the string 'on' will be published as '"on"'). You can access the JSON deserialized values (as well as unquoted strings) at many places by using `value_json` instead of `value`. The last_updated and last_changed values for the entity will be published to `homeassistant/light/master_bedroom_dimmer/last_updated` and `homeassistant/light/master_bedroom_dimmer/last_changed`, respectively. The timestamps are in ISO 8601 format - for example, `2017-10-01T23:20:30.920969+00:00`. + +## Include/exclude + +The **exclude** and **include** configuration variables can be used to filter the items that are published to MQTT. + +1\. If neither **exclude** or **include** are specified, all entities are published. + +2\. If only **exclude** is specified, then all entities except the ones listed are published. + +```yaml +# Example of excluding entities +mqtt_statestream: + base_topic: homeassistant + exclude: + domains: + - switch + entities: + - sensor.nopublish +``` +In the above example, all entities except for *switch.x* and *sensor.nopublish* will be published to MQTT. + +3\. If only **include** is specified, then only the specified entries are published. + +```yaml +# Example of excluding entities +mqtt_statestream: + base_topic: homeassistant + include: + domains: + - sensor + entities: + - lock.important +``` +In this example, only *sensor.x* and *lock.important* will be published. + +4\. If both **include** and **exclude** are specified then all entities specified by **include** are published except for the ones +specified by **exclude**. + +```yaml +# Example of excluding entities +mqtt_statestream: + base_topic: homeassistant + include: + domains: + - sensor + exclude: + entities: + - sensor.noshow +``` +In this example, all sensors except for *sensor.noshow* will be published. From 2be4e2df70f38d0bf6805e5a9173f334614e937f Mon Sep 17 00:00:00 2001 From: Julius Mittenzwei Date: Sat, 18 Nov 2017 18:15:05 +0100 Subject: [PATCH 38/46] Improvement of KNX climate component (#3903) * Documentation for https://github.com/home-assistant/home-assistant/pull/10388 * added note that the knx plattform is not supported on Windows. Reason: HAss on windows uses asyncio.ProactorEventLoop() which has poor UDP support. See related issue: https://github.com/home-assistant/home-assistant/issues/6820 * :pencil2: Fixed note markup --- source/_components/climate.knx.markdown | 35 ++++++++++++++++--------- source/_components/knx.markdown | 4 +++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/source/_components/climate.knx.markdown b/source/_components/climate.knx.markdown index 1c740bba30c..b5b59a01e36 100644 --- a/source/_components/climate.knx.markdown +++ b/source/_components/climate.knx.markdown @@ -25,10 +25,11 @@ To use your KNX thermostats in your installation, add the following lines to you climate: - platform: knx name: HASS-Kitchen.Temperature - temperature_address: '6/2/1' - setpoint_address: '5/1/2' - target_temperature_address: '5/1/1' - operation_mode_address: '5/1/3' + temperature_address: '5/1/1' + setpoint_shift_address: '5/1/2' + setpoint_shift_state_address: '5/1/3' + target_temperature_address: '5/1/4' + operation_mode_address: '5/1/5' ``` Alternatively, if your device has dedicated binary group addresses for frost/night/comfort mode: @@ -38,12 +39,13 @@ Alternatively, if your device has dedicated binary group addresses for frost/nig climate: - platform: knx name: HASS-Kitchen.Temperature - temperature_address: '6/2/1' - setpoint_address: '5/1/2' - target_temperature_address: '5/1/1' - operation_mode_frost_protection_address: '5/1/3' - operation_mode_night_address: '5/1/4' - operation_mode_comfort_address: '5/1/5' + temperature_address: '5/1/1' + setpoint_shift_address: '5/1/2' + setpoint_shift_state_address: '5/1/3' + target_temperature_address: '5/1/4' + operation_mode_frost_protection_address: '5/1/5' + operation_mode_night_address: '5/1/6' + operation_mode_comfort_address: '5/1/7' ``` Configuration variables: @@ -51,7 +53,16 @@ Configuration variables: - **name** (*Optional*): A name for this device used within Home Assistant. - **temperature_address**: KNX group address for reading current room temperature from KNX bus. - **target_temperature_address**: KNX group address for reading current target temperature from KNX bus. -- **setpoint_address**: KNX group address for basis setpoint + +The `knx` component sets the desired target temperature by modifying the setpoint_shift. The module provides the following configuration options: + +* **setpoint_shift_address**: (*Optional*) KNX address for setpoint_shift +* **setpoint_shift_state_address**: (*Optional*) Explicit KNX address for reading setpoint_shift. +* **setpoint_shift_step**: (*Optional*) Defines for step size in Kelvin for each step of setpoint_shift. Default is 0.5 K. +* **setpoint_shift_min**: (*Optional*) Minimum value of setpoint shift. Default is "-6". +* **setpoint_shift_max**: (*Optional*) Maximum value of setpoint shift. Default is "6". + +The operation modes may be controlled with the following directives: - **operation_mode_address** (*Optional*): KNX address for operation mode (Frost protection/night/comfort). - **operation_mode_state_address** (*Optional*): Explicit KNX address for reading operation mode @@ -63,5 +74,3 @@ Configuration variables: - **operation_mode_comfort_address** (*Optional*): KNX address for switching on/off comfort mode. `operation_mode_frost_protection_address` / `operation_mode_night_address` / `operation_mode_comfort_address` are not necessary if `operation_mode_address` was specified. - - diff --git a/source/_components/knx.markdown b/source/_components/knx.markdown index b813ac3aee4..b48642e7ce5 100644 --- a/source/_components/knx.markdown +++ b/source/_components/knx.markdown @@ -18,6 +18,10 @@ The [KNX](http://www.knx.org) integration for Home Assistant allows you to conne The component requires a local KNX/IP interface like the [Weinzierl 730](http://www.weinzierl.de/index.php/en/all-knx/knx-devices-en/knx-ip-interface-730-en). Through this, it will send and receive commands to and from other devices to the KNX bus. +

+ Please note, the `knx` platform does not support Windows and needs at least python version 3.5. +

+ There is currently support for the following device types within Home Assistant: - [Binary Sensor](/components/binary_sensor.knx) From 0ed0151609f8628339dea38fe88a8ab7bde383d3 Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Sat, 18 Nov 2017 18:04:30 +0100 Subject: [PATCH 39/46] Add `state_template` docs and example for the universal media player (#3907) * Add state_template docs and example * fix template and adjust to doc standards * :pencil2: Some minor changes --- .../media_player.universal.markdown | 119 +++++++++++++++++- 1 file changed, 114 insertions(+), 5 deletions(-) diff --git a/source/_components/media_player.universal.markdown b/source/_components/media_player.universal.markdown index 1d19ddadcf6..48d46311e67 100644 --- a/source/_components/media_player.universal.markdown +++ b/source/_components/media_player.universal.markdown @@ -51,18 +51,26 @@ Configuration variables: - **name** (*Required*): The name to assign the player - **children** (*Required*): Ordered list of child media players this entity will control +- **state_template** (*Optional*): A [template](/topics/templating/) can be specified to render the state of the media player. This way, the state could depend on entities different from media players, like Switches or Input Booleans. - **commands** (*Optional*): Commands to be overwritten. Possible entries are *turn_on*, *turn_off*, *select_source*, *volume_set*, *volume_up*, *volume_down*, and *volume_mute*. - **attributes** (*Optional*): Attributes that can be overwritten. Possible entries are *is_volume_muted*, *state*, *source*, *source_list, and *volume_level*. The values should be an entity id and state attribute separated by a bar (\|). If the entity id's state should be used, then only the entity id should be provided. -The universal media player will primarily imitate one of its *children*. The first child in the list that is active (not idle/off) will be controlled the universal media player. The universal media player will also inherit its state from the first active child. Entities in the *children* list must be media players. +The Universal Media Player will primarily imitate one of its *children*. The Universal Media Player will control the first child on the list that is active (not idle/off). The Universal Media Player will also inherit its state from the first active child if a `state_template` is not provided. Entities in the *children* list must be media players, but the state template can contain any entity. -It is recommended that the command *turn_on*, the command *turn_off*, and the attribute *state* all be provided together. The *state* attribute indicates if the Media Player is on or off. If *state* indicates the media player is off, this status will take precedent over the states of the children. If all the children are idle/off and *state* is on, the universal media player's state will be on. +It is recommended that the command *turn_on*, the command *turn_off*, and the attribute *state* all be provided together. The *state* attribute indicates if the Media Player is on or off. If *state* indicates the media player is off, this status will take precedence over the states of the children. If all the children are idle/off and *state* is on, the Universal Media Player's state will be on. It is also recommended that the command *volume_up*, the command *volume_down*, the command *volume_mute*, and the attribute *is_volume_muted* all be provided together. The attribute *is_volume_muted* should return either True or the on state when the volume is muted. The *volume_mute* service should toggle the mute setting. When providing *select_source* as a command, it is recommended to also provide the attributes *source*, and *source_list*. The *source* attribute is the currently select source, while the *source_list* attribute is a list of all available sources. -Below is an example configuration. +## {% linkable_title Usage examples %} + +#### {% linkable_title Chromecast & Kodi control with switches %} + +In this example, a switch is available to control the power of the television. Switches are also available to turn the volume up, turn the volume down, and mute the audio. These could be command line switches or any other entity in Home Assistant. The *turn_on* and *turn_off* commands will be redirected to the television, and the volume commands will be redirected to an audio receiver. The *select_source* command will be passed directly to an A/V receiver. + +The children are a Chromecast and a Kodi player. If the Chromecast is playing, the Universal Media Player will reflect its status. If the Chromecast is idle and Kodi is playing, the Universal Media player will change to reflect its status. + ```yaml media_player: @@ -112,6 +120,107 @@ media_player: ``` -In this example, a switch is available to control the power of the television. Switches are also available to turn the volume up, turn the volume down, and mute the audio. These could be command line switches or any other entity in Home Assistant. The *turn_on* and *turn_off* commands will be redirected to the television and the volume commands will be redirected to an audio receiver. The *select_source* command will be passed directly to an A/V receiver. +#### {% linkable_title Kodi CEC-TV control %} -The children are a Chromecast and a Kodi player. If the Chromecast is playing, the Universal Media Player will reflect its status. If the Chromecast is idle and Kodi is playing, the Universal Media player will change to reflect its status. +In this example, a [Kodi Media Player](/components/media_player.kodi/) runs in a CEC capable device (OSMC/OpenElec running in a Raspberry Pi 24/7, for example), and, with the JSON-CEC Kodi addon installed, it can turn on and off the attached TV. + +We store the state of the attached TV in a hidden [Input Boolean](/components/input_boolean/), so we can differentiate the TV being on or off, while Kodi is always 'idle', and use the Universal Media Player to render its state with a template. We can hide the Kodi Media Player too, and only show the universal one, which now can differentiate between the 'idle' and the 'off' state (being the second when it is idle and the TV is off). + +Because the Input Boolean used to store the TV state is only changing when using the Home Assistant `turn_on` and `turn_off` actions, and Kodi could be controlled by so many ways, we also define some automations to update this Input Boolean when needed. + +In an Apple HomeKit scene, we can now expose this Universal Media Player as an on/off switch in Homebridge, and, that way, use Siri to turn on and off the TV. + +The complete yaml config is: + +```yaml +homeassistant: + customize: + input_boolean.kodi_tv_state: + hidden: true + homebridge_hidden: true + media_player.kodi: + hidden: true + homebridge_hidden: true + media_player.kodi_tv: + friendly_name: Kodi + homebridge_name: Kodi + homebridge_media_player_switch: on_off + +input_boolean: + kodi_tv_state: + +media_player: +- platform: universal + name: Kodi TV + state_template: > + {% raw %}{% if (is_state('media_player.kodi', 'idle') and (is_state('input_boolean.kodi_tv_state', 'off') %} + off + {% else %} + {{ states('media_player.kodi') }} + {% endif %}{% endraw %} + children: + - media_player.kodi + commands: + turn_on: + service: media_player.turn_on + data: + entity_id: media_player.kodi + turn_off: + service: media_player.turn_off + data: + entity_id: media_player.kodi + attributes: + is_volume_muted: media_player.kodi|is_volume_muted + volume_level: media_player.kodi|volume_level + +- platform: kodi + name: Kodi + host: 192.168.1.10 + turn_on_action: + - service: input_boolean.turn_on + data: + entity_id: input_boolean.kodi_tv_state + - service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Addons.ExecuteAddon + addonid: script.json-cec + params: + command: activate + turn_off_action: + - service: input_boolean.turn_off + data: + entity_id: input_boolean.kodi_tv_state + - service: media_player.media_stop + data: + entity_id: media_player.kodi + - service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Addons.ExecuteAddon + addonid: script.json-cec + params: + command: standby + +automation: +- alias: Turn on the TV when Kodi is activated + trigger: + platform: state + entity_id: media_player.kodi_tv + from: 'off' + to: 'playing' + action: + - service: media_player.turn_on + entity_id: media_player.kodi_tv + +- alias: Turn off the TV when Kodi is in idle > 15 min + trigger: + platform: state + entity_id: media_player.kodi_tv + to: 'idle' + for: + minutes: 15 + action: + - service: media_player.turn_off + entity_id: media_player.kodi_tv +``` From c38c00b00df1d3a8341ff62bf3f7526c830b9a4f Mon Sep 17 00:00:00 2001 From: Fabrizio Furnari Date: Sat, 18 Nov 2017 11:07:09 +0100 Subject: [PATCH 40/46] ViaggiaTreno sensor documentation (#3924) * ViaggiaTreno sensor documentation * :pencil2: Spelling, grammar, styling, and configuration fixes --- .../_components/sensor.viaggiatreno.markdown | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 source/_components/sensor.viaggiatreno.markdown diff --git a/source/_components/sensor.viaggiatreno.markdown b/source/_components/sensor.viaggiatreno.markdown new file mode 100644 index 00000000000..d8ad4e16a00 --- /dev/null +++ b/source/_components/sensor.viaggiatreno.markdown @@ -0,0 +1,62 @@ +--- +layout: page +title: "ViaggiaTreno Italian Railroads" +description: "Instructions on how to integrate Italian Railroads data (from ViaggiaTreno API) into Home Assistant." +date: 2017-11-07 14:35 +sidebar: true +comments: false +sharing: true +footer: true +logo: train.png +ha_category: Transport +ha_iot_class: "Cloud Polling" +ha_release: 0.58 +--- + +The `viaggiatreno` sensor will give you information about configured train ids and stations using the public [ViaggiaTreno](http://viaggiatreno.it) API. + +To activate the sensor you need at least two parameters: the `train_id` and the `station_id`. + +The first is available just looking at the [ViaggiaTreno](http://viaggiatreno.it/) timetable, the latter can be obtained using the dedicated API endpoint: +`http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/autocompletaStazione/` +(e.g., `http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/autocompletaStazione/ROMA` will list all station names (with ids) that starts with *ROMA*). + +

+Note that the `station_id` is referred to the train's **departing station**. If a train number does not match with the station id, no data will be returned to the sensor. +

+ +Then add the data to your `configuration.yaml` file as shown in the example: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: viaggiatreno + train_id: 12279 + station_id: S08409 +``` + +{% configuration %} +train_id: + description: The ID of the train. + required: true + type: int +station_id: + description: The ID of the starting station. + required: true + type: int +train_name: + description: The name of the sensor. Defaults to 'Train from '. + required: false + type: string +{% endconfiguration %} + +

+In a future implementation, the station name could be used to automatically search best-matching station id, without the need to specify it. +

+ +The public timetables are coming from [ViaggiaTreno](http://viaggiatreno.it). + +

+Instructions (in Italian) for the API are available at: +https://github.com/bluviolin/TrainMonitor/wiki/API-del-sistema-Viaggiatreno +

From 1af229c14629ccbb9f23ff5bce51064b61531d82 Mon Sep 17 00:00:00 2001 From: Vignesh Venkat Date: Sat, 18 Nov 2017 01:29:41 -0800 Subject: [PATCH 41/46] telegram_bot: Support for sending video (#3936) * telegram_bot: Support for sending video Documentation for video support. Very similar to photo/document. * :pencil2: Spelling & grammar fixes --- source/_components/notify.telegram.markdown | 29 +++++++++++++++++++++ source/_components/telegram_bot.markdown | 17 ++++++++++++ 2 files changed, 46 insertions(+) diff --git a/source/_components/notify.telegram.markdown b/source/_components/notify.telegram.markdown index 7df967d6289..ac89f6f23c7 100644 --- a/source/_components/notify.telegram.markdown +++ b/source/_components/notify.telegram.markdown @@ -156,6 +156,35 @@ homeassistant: ```

+### {% linkable_title Video support %} + +```yaml +... +action: + service: notify.NOTIFIER_NAME + data: + title: Send a video + message: That's an example that sends a video. + data: + video: + - url: http://192.168.1.28/camera.mp4 + username: admin + password: secrete + - file: /tmp/video.mp4 + caption: Video Title xy + - url: http://somebla.ie/video.mp4 + caption: I.e. for a Title +``` + +Configuration variables: + +- **url** or **file** (*Required*): For local or remote path to a video. +- **caption** (*Optional*): The title of the video. +- **username** (*Optional*): Username for a URL which require HTTP authentication. +- **password** (*Optional*): Username for a URL which require HTTP authentication. +- **authentication** (*Optional*): Set to 'digest' to use HTTP digest authentication, defaults to 'basic'. +- **keyboard** (*Optional*): List of rows of commands, comma-separated, to make a custom keyboard. +- **inline_keyboard** (*Optional*): List of rows of commands, comma-separated, to make a custom inline keyboard with buttons with associated callback data. ### {% linkable_title Document support %} diff --git a/source/_components/telegram_bot.markdown b/source/_components/telegram_bot.markdown index c4d93c43bc5..be2dcff5e5c 100644 --- a/source/_components/telegram_bot.markdown +++ b/source/_components/telegram_bot.markdown @@ -52,6 +52,23 @@ Send a photo. | `keyboard` | yes | List of rows of commands, comma-separated, to make a custom keyboard. Example: `["/command1, /command2", "/command3"]` | | `inline_keyboard` | yes | List of rows of commands, comma-separated, to make a custom inline keyboard with buttons with associated callback data. Example: `["/button1, /button2", "/button3"]` or `[[["Text btn1", "/button1"], ["Text btn2", "/button2"]], [["Text btn3", "/button3"]]]` | + +#### {% linkable_title Service `telegram_bot/send_video` %} +Send a video. + +| Service data attribute | Optional | Description | +|---------------------------|----------|--------------------------------------------------| +| `url` | no | Remote path to a video. | +| `file` | no | Local path to a video. | +| `caption` | yes | The title of the video. | +| `username` | yes | Username for a URL which requires HTTP basic authentication. | +| `password` | yes | Password for a URL which requires HTTP basic authentication. | +| `authentication` | yes | Define which authentication method to use. Set to `digest` to use HTTP digest authentication. Defaults to `basic`. | +| `target` | yes | An array of pre-authorized chat_ids to send the notification to. Defaults to the first allowed chat_id. | +| `disable_notification` | yes | True/false to send the message silently. iOS users and web users will not receive a notification. Android users will receive a notification with no sound. Defaults to False. | +| `keyboard` | yes | List of rows of commands, comma-separated, to make a custom keyboard. Example: `["/command1, /command2", "/command3"]` | +| `inline_keyboard` | yes | List of rows of commands, comma-separated, to make a custom inline keyboard with buttons with associated callback data. Example: `["/button1, /button2", "/button3"]` or `[[["Text btn1", "/button1"], ["Text btn2", "/button2"]], [["Text btn3", "/button3"]]]` | + #### {% linkable_title Service `telegram_bot/send_document` %} Send a document. From a90d5ebc24e85ddb5bb839a1414ca8715a7c1f34 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 18 Nov 2017 11:09:04 +0200 Subject: [PATCH 42/46] Documentation for es5 / untranspiled JS (#3948) * Documentation for es5/es6 code * Update frontend.markdown * :pencil2: Small typo corrections --- source/_components/frontend.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/frontend.markdown b/source/_components/frontend.markdown index ee89044b2ed..40274f80623 100644 --- a/source/_components/frontend.markdown +++ b/source/_components/frontend.markdown @@ -19,6 +19,11 @@ frontend: ``` {% configuration %} + javascript_version: + description: "Version of the JavaScript to serve to clients. Options: `es5` - transpiled so old browsers understand it. `latest` - not transpiled, so will work on recent browsers only. `auto` - select a version according to the browser user-agent. The value in the config can be overiden by putting `es5` or `latest` in the URL. For example `http://localhost:8123/states?es5` " + required: false + type: string + default: es5 themes: description: Allow to define different themes. See below for further details. required: false From 6630a5f54a2e3c33f0c798df05a7e9be4137b48a Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Sat, 18 Nov 2017 03:09:51 -0600 Subject: [PATCH 43/46] Added a brief explanation and screenshot of Alexa Skills Kit and slot type synonyms (#3995) * Added a brief explanation and screenshot of Alexa Skills Kit and slot type synonyms * :pencil2: Added missing comma --- source/_components/alexa.markdown | 7 +++++++ .../components/alexa/scene_slot_synonyms.png | Bin 0 -> 100030 bytes 2 files changed, 7 insertions(+) create mode 100644 source/images/components/alexa/scene_slot_synonyms.png diff --git a/source/_components/alexa.markdown b/source/_components/alexa.markdown index 179fb4076c1..bccf44f2e77 100644 --- a/source/_components/alexa.markdown +++ b/source/_components/alexa.markdown @@ -135,6 +135,13 @@ Custom slot type for scene support. The names must exactly match the scene names (minus underscores - amazon discards them anyway and we later map them back in with the template). +In the new Alexa Skills Kit, you can also create synonyms for slot type values, which can be used in place of the base value in utterances. Synonyms will be replaced with their associated slot value in the intent request sent to the Alexa API endpoint, but only if there are not multiple synonym matches. Otherwise, the value of the synonym that was spoken will be used. + +

+ +Custom slot values with synonyms. +

+ Add a sample utterance: ```text diff --git a/source/images/components/alexa/scene_slot_synonyms.png b/source/images/components/alexa/scene_slot_synonyms.png new file mode 100644 index 0000000000000000000000000000000000000000..48f9b0950e614da5417141b7294743d9bf38df8d GIT binary patch literal 100030 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
Zm;`|}-ZId?Aa1_lNe78X>-JN1~mZ3guZ7n?b- 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 z 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
    ;Nb#J`+wnKlt6fKfeX^=16H6fLZ`07uy} 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

    5Jn>J4qq%XZNzBjdf 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 z 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 literal 0 HcmV?d00001 From 40e4229f6894cfd3368516ac5debf58504645a9e Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Sat, 18 Nov 2017 17:31:24 +0100 Subject: [PATCH 44/46] Fix line endings on rainbird switch (#4009) --- source/_components/switch.rainbird.markdown | 92 ++++++++++----------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/source/_components/switch.rainbird.markdown b/source/_components/switch.rainbird.markdown index 44134393a61..5a8598c3021 100644 --- a/source/_components/switch.rainbird.markdown +++ b/source/_components/switch.rainbird.markdown @@ -1,46 +1,46 @@ ---- -layout: page -title: "Rain Bird Switch" -description: "Instructions on how to integrate your Rain Bird LNK WiFi Module as Switches within Home Assistant." -date: 2017-08-25 12:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: rainbird.png -ha_category: Hub -ha_release: 0.57 -ha_iot_class: "Local Polling" ---- - -This `rainbird` switch platform allows interacting with [LNK WiFi](http://www.rainbird.com/landscape/products/controllers/LNK-WiFi.htm) module of the Rain Bird Irrigation system in Home Assistant. - -To enable stations as switches inside Home Assistant, add the following to your `configuration.yaml` file: - -```yaml -switch: - platform: rainbird - host: '1.1.1.1' - password: 'secretpassword' - sprinkler_1: - zone: 1 - friendly_name: "Front sprinklers" - trigger_time: 20 - scan_interval: 10 - sprinkler_2: - friendly_name: "Back sprinklers" - zone: 2 - trigger_time: 20 - scan_interval: 10 -``` - -Configuration variables: - -- **stickip** (*Required*): The IP address of your LNK WiFi Module. -- **password** (*Required*): The password for accessing the module. -- **zone** (*Required*): Station zone identifier. -- **friendly_name** (*Optional*): Just a friendly name for the station. -- **trigger_time** (*Required*): The default duration to sprinkle the zone. -- **scan_interval** (*Optional*): How fast to refresh the switch. - -Please note that due to the implementation of the API within the LNK Module, there is a concurrency issue. For example, the Rain Bird app will give connection issues (like already a connection active). +--- +layout: page +title: "Rain Bird Switch" +description: "Instructions on how to integrate your Rain Bird LNK WiFi Module as Switches within Home Assistant." +date: 2017-08-25 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: rainbird.png +ha_category: Hub +ha_release: 0.57 +ha_iot_class: "Local Polling" +--- + +This `rainbird` switch platform allows interacting with [LNK WiFi](http://www.rainbird.com/landscape/products/controllers/LNK-WiFi.htm) module of the Rain Bird Irrigation system in Home Assistant. + +To enable stations as switches inside Home Assistant, add the following to your `configuration.yaml` file: + +```yaml +switch: + platform: rainbird + host: '1.1.1.1' + password: 'secretpassword' + sprinkler_1: + zone: 1 + friendly_name: "Front sprinklers" + trigger_time: 20 + scan_interval: 10 + sprinkler_2: + friendly_name: "Back sprinklers" + zone: 2 + trigger_time: 20 + scan_interval: 10 +``` + +Configuration variables: + +- **stickip** (*Required*): The IP address of your LNK WiFi Module. +- **password** (*Required*): The password for accessing the module. +- **zone** (*Required*): Station zone identifier. +- **friendly_name** (*Optional*): Just a friendly name for the station. +- **trigger_time** (*Required*): The default duration to sprinkle the zone. +- **scan_interval** (*Optional*): How fast to refresh the switch. + +Please note that due to the implementation of the API within the LNK Module, there is a concurrency issue. For example, the Rain Bird app will give connection issues (like already a connection active). From 17d3be1616b04fb76562617c4ff0b01f0e74b800 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 18 Nov 2017 10:27:33 -0800 Subject: [PATCH 45/46] Rename wrongly named files --- ...rkdown => 2017-09-16-hassbian-1.3-a-bit-of-a-stretch.markdown} | 0 ...ystem.markdown => 2017-09-25-new-hassio-build-system.markdown} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename source/_posts/{2019-09-16-hassbian-1.3-a-bit-of-a-stretch.markdown => 2017-09-16-hassbian-1.3-a-bit-of-a-stretch.markdown} (100%) rename source/_posts/{2019-09-25-new-hassio-build-system.markdown => 2017-09-25-new-hassio-build-system.markdown} (100%) diff --git a/source/_posts/2019-09-16-hassbian-1.3-a-bit-of-a-stretch.markdown b/source/_posts/2017-09-16-hassbian-1.3-a-bit-of-a-stretch.markdown similarity index 100% rename from source/_posts/2019-09-16-hassbian-1.3-a-bit-of-a-stretch.markdown rename to source/_posts/2017-09-16-hassbian-1.3-a-bit-of-a-stretch.markdown diff --git a/source/_posts/2019-09-25-new-hassio-build-system.markdown b/source/_posts/2017-09-25-new-hassio-build-system.markdown similarity index 100% rename from source/_posts/2019-09-25-new-hassio-build-system.markdown rename to source/_posts/2017-09-25-new-hassio-build-system.markdown From 70d3d0084b120997f218f8160dcc902b1f5be4ad Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 18 Nov 2017 12:19:10 -0800 Subject: [PATCH 46/46] Add release notes for 0.58 --- Gemfile.lock | 3 + ....markdown => switch.hikvisioncam.markdown} | 0 source/_posts/2017-11-18-release-58.markdown | 486 ++++++++++++++++++ .../images/blog/2017-11-0.58/components.png | Bin 0 -> 18349 bytes .../images/blog/2017-11-0.58/system_log.png | Bin 0 -> 23275 bytes 5 files changed, 489 insertions(+) rename source/_components/{switch.hikvision.markdown => switch.hikvisioncam.markdown} (100%) create mode 100644 source/_posts/2017-11-18-release-58.markdown create mode 100644 source/images/blog/2017-11-0.58/components.png create mode 100644 source/images/blog/2017-11-0.58/system_log.png diff --git a/Gemfile.lock b/Gemfile.lock index 5fc8a009c40..4a9684644f8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -109,5 +109,8 @@ DEPENDENCIES sinatra (~> 1.4.2) stringex (~> 1.4) +RUBY VERSION + ruby 2.4.1p111 + BUNDLED WITH 1.15.4 diff --git a/source/_components/switch.hikvision.markdown b/source/_components/switch.hikvisioncam.markdown similarity index 100% rename from source/_components/switch.hikvision.markdown rename to source/_components/switch.hikvisioncam.markdown diff --git a/source/_posts/2017-11-18-release-58.markdown b/source/_posts/2017-11-18-release-58.markdown new file mode 100644 index 00000000000..197e267cdfd --- /dev/null +++ b/source/_posts/2017-11-18-release-58.markdown @@ -0,0 +1,486 @@ +--- +layout: post +title: "0.58: More translations, faster frontend, system log" +description: "We now have 445 translators helping out and the frontend is receiving some polishing." +date: 2017-11-18 04:00:00 +date_formatted: "November 18, 2017" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2017-11-0.58/languages.png +--- + + + +

    +The Hass.io release of 0.58 will be delayed by a couple of days because Pascal is moving this weekend. +

    + +## {% linkable_title Translation update %} + +Translations are up and running in full speed. Shortly after the last release we got our translation pipeline figured out. [@armills] and [@c727] are doing an amazing job managing this project. We've doubled the number of supported languages to 42 and the amount of keys to translate went from 8 to 130. Our translaters are on top of their game and 79% is already translated. + +Talking about our translators, we now have 445 people with an account to help with translations. Not bad for 3 weeks! + +And because more translations is more better, [@robbiet480] has added the iOS app to Lokalise, our translation management platform. The iOS app is currently supported in 7 different languages. + +[Learn more about how to help with translations](https://home-assistant.io/blog/2017/11/05/frontend-translations/) + +## {% linkable_title Frontend improvements continue %} + +Thanks to [@Andrey-git] we now are able to serve the frontend in modern JavaScript. Leveraging modern JavaScript makes the frontend faster to load and run. For now it's opt-in but we're looking into making it opt-out in the future. The ES5 version of the frontend will remain available for older devices. + +To try it once, add `?latest` to your Home Assistant bookmark. To make it the default on your installation, update your config to look like this: + +``` +frontend: + javascript_version: latest +``` + +

    +For Custom UI users: your custom UI will need to be updated before it can work with the new version of the frontend. +

    + +### {% linkable_title System log enhanced %} + +Our about screen that shows the error logs has gained a nice upgrade by [@postlund]. Now the 50 latest exceptions will be displayed with the option to get more information. + +

    + Screenshot of the about screen showing the system log. + Screenshot of the about screen showing the system log. +

    + +## {% linkable_title New Platforms %} + +- pyLoad download sensor ([@iMarkus] - [#10089]) ([sensor.pyload docs]) (new-platform) +- Add LaCrosse sensor platform ([@hthiery] - [#10195]) ([sensor.lacrosse docs]) (new-platform) +- Refactor Neato botvac components as a vacuum ([@jabesq] - [#9946]) ([neato docs]) ([sensor.neato docs]) ([switch.neato docs]) ([vacuum.neato docs]) (breaking change) (new-platform) +- Add platform and sensors for Vultr VPS ([@GenericStudent] - [#9928]) ([vultr docs]) ([binary_sensor.vultr docs]) ([sensor.vultr docs]) (new-platform) +- Adds support for Tile® Bluetooth trackers ([@bachya] - [#10478]) ([device_tracker.tile docs]) (new-platform) +- Support presence detection using Hitron Coda router ([@arilotter] - [#9682]) ([device_tracker.hitron_coda docs]) (new-platform) +- Add basic backend support for a system log ([@postlund] - [#10492]) ([system_log docs]) (new-platform) +- New sensor viaggiatreno. ([@fabfurnari] - [#10522]) ([sensor.viaggiatreno docs]) (new-platform) + +## {% linkable_title If you need help... %} + +...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. + +## {% linkable_title Reporting Issues %} + +Experiencing issues introduced by this release? Please report them in our [issue tracker](https://github.com/home-assistant/home-assistant/issues). Make sure to fill in all fields of the issue template. + + + +## {% linkable_title Breaking Changes %} + + - `hass.states.is_state_attr(entity_id, attribute, value)` has been removed. The template version still exists. Unused method parameter `wait` has been removed from `hass.bus.async_fire` ([@balloob] - [#10305]) (breaking change) +- Refactor Neato botvac components as a vacuum ([@jabesq] - [#9946]) ([neato docs]) ([switch.neato docs]) ([vacuum.neato docs]) (breaking change) (new-platform) +- Lutron released a firmware updated for the Caseta system which removed our ability to connect to and control the bridge device over SSH, breaking compatibility with pylutron_caseta and Home Assistant. Component has been updated to work again, please see the docs on how to set it up. ([@mdonoughe] - [#10286]) ([lutron_caseta docs]) (breaking change) + +## {% linkable_title All changes %} + +- Bump python-miio for improved device support ([@syssi] - [#10294]) ([light.xiaomi_miio docs]) ([switch.xiaomi_miio docs]) +- pyLoad download sensor ([@iMarkus] - [#10089]) ([sensor.pyload docs]) (new-platform) +- Add LaCrosse sensor platform ([@hthiery] - [#10195]) ([sensor.lacrosse docs]) (new-platform) +- Clean up core ([@balloob] - [#10305]) (breaking change) +- Refactor Neato botvac components as a vacuum ([@jabesq] - [#9946]) ([neato docs]) ([sensor.neato docs]) ([switch.neato docs]) ([vacuum.neato docs]) (breaking change) (new-platform) +- Move constants to setup.py ([@fabaff] - [#10312]) ([no_ip docs]) +- Add option to overwrite file to the downloader component ([@arsaboo] - [#10298]) ([downloader docs]) +- Use constants for HTTP headers ([@fabaff] - [#10313]) ([binary_sensor.aurora docs]) ([device_tracker.tplink docs]) ([device_tracker.upc_connect docs]) ([media_player.bluesound docs]) ([sensor.haveibeenpwned docs]) ([sensor.zamg docs]) ([telegram_bot.polling docs]) +- fix a import in test causing vs code to fail to discover ([@perosb] - [#10358]) +- Upgrade sqlalchemy to 1.1.15 ([@fabaff] - [#10330]) +- Move counter component ([@fabaff] - [#10332]) ([counter docs]) +- Add platform and sensors for Vultr VPS ([@GenericStudent] - [#9928]) ([vultr docs]) ([binary_sensor.vultr docs]) ([sensor.vultr docs]) (new-platform) +- Add heal_node and test_node services. ([@turbokongen] - [#10369]) ([zwave docs]) +- Addition of new binary sensor class 'plug' ([@echox] - [#10336]) ([binary_sensor docs]) +- Upgrae simplepush to 1.1.4 ([@fabaff] - [#10365]) ([notify.simplepush docs]) +- Update aiohttp to 2.3.1 ([@pvizeli] - [#10139]) +- Device model identification of the Xiaomi Philips Ceiling Lamp fixed. ([@syssi] - [#10401]) ([light.xiaomi_miio docs]) +- Zwave save cache to file now. ([@turbokongen] - [#10381]) +- Bump to 0.12.2 to fix urllib3 dependency ([@MisterWil] - [#10420]) ([abode docs]) +- Remove extra info from zwave entity states ([@armills] - [#10413]) ([zwave docs]) +- Fixes issue #10425 ([@robmarkcole] - [#10426]) ([sensor.london_air docs]) +- Add baudrate option to Serial sensor ([@dgomes] - [#10439]) ([sensor.serial docs]) (breaking change) +- Remove model info from state ([@balloob] - [#10399]) ([light.tradfri docs]) +- update tibber library ([@danielhiversen] - [#10460]) ([sensor.tibber docs]) +- update pywebpush==1.3.0 ([@perosb] - [#10374]) ([notify.html5 docs]) +- Fix slow WOL switch test ([@balloob] - [#10455]) +- Fix recorder stop on SQLite vacuuming error ([@milanvo] - [#10405]) +- Add include/exclude filter to mqtt_statestream ([@mw-white] - [#10354]) ([mqtt_statestream docs]) +- Upgrade to 0.1.2 ([@TopdRob] - [#10348]) ([notify.free_mobile docs]) +- Upgrade pyatv to 0.3.6 ([@TopdRob] - [#10349]) ([apple_tv docs]) +- Remove useless temp converting ([@pvizeli] - [#10465]) ([climate.homematic docs]) +- Upgrade apns2 to 0.3.0 ([@TopdRob] - [#10347]) ([notify.apns docs]) +- Improvement of KNX climate component ([@Julius2342] - [#10388]) ([knx docs]) ([climate.knx docs]) +- Updated gc100 package requirement to 1.0.3a ([@davegravy] - [#10484]) ([gc100 docs]) +- Remove lag from Harmony remote platform ([@amelchio] - [#10218]) ([remote docs]) ([remote.harmony docs]) +- Improve error handling. ([@cgtobi] - [#10482]) ([influxdb docs]) +- Upgrade psutil to 5.4.1 ([@fabaff] - [#10490]) ([sensor.systemmonitor docs]) +- Upgrade youtube_dl to 2017.11.06 ([@fabaff] - [#10491]) ([media_extractor docs]) +- Fix for telegram polling. (added pausing when error occurs) ([@sander76] - [#10214]) ([telegram_bot.polling docs]) +- add JSON processing capabilities to sensor_serial ([@dgomes] - [#10476]) ([sensor.serial docs]) +- upgrade to new pylutron_caseta with TLS ([@mdonoughe] - [#10286]) ([lutron_caseta docs]) (breaking change) +- Bump dev to 0.58.0.dev0 ([@fabaff] - [#10510]) +- OwnTracks Message Handling ([@ehagan] - [#10489]) ([device_tracker.owntracks docs]) +- Add support for Alexa intent slot synonyms. ([@kmdm] - [#10469]) +- Introduce media progress for Yamaha Musiccast devices ([@jalmeroth] - [#10256]) ([media_player.yamaha_musiccast docs]) +- Add an option to serve ES6 JS to clients ([@andrey-git] - [#10474]) +- Adapt to new yarl API ([@tinloaf] - [#10527]) ([tts.google docs]) +- Update nederlandse_spoorwegen.py to include platform information ([@hmmbob] - [#10494]) ([sensor.nederlandse_spoorwegen docs]) +- Pin yarl ([@tinloaf] - [#10528]) +- Support configuration of region (no service url neccessary ([@molobrakos] - [#10513]) ([volvooncall docs]) +- Fix import in tests ([@andrey-git] - [#10525]) +- Update axis.py ([@Kane610] - [#10412]) ([axis docs]) +- Add attribute to show who last un/set alarm (SPC) ([@mbrrg] - [#9906]) ([spc docs]) ([alarm_control_panel.spc docs]) ([binary_sensor.spc docs]) +- Fixed Wink Quirky Aros bugs. ([@w1ll1am23] - [#10533]) ([climate.wink docs]) +- Adds support for Tile® Bluetooth trackers ([@bachya] - [#10478]) ([device_tracker.tile docs]) (new-platform) +- telegram_bot: Support for sending videos ([@vickyg3] - [#10470]) ([telegram_bot docs]) ([notify.telegram docs]) +- Pre-construct frontend index.html ([@balloob] - [#10520]) +- notify.html5: use new json save and load functions ([@perosb] - [#10416]) ([notify.html5 docs]) +- Change to device state attributes ([@dgomes] - [#10536]) ([sensor.serial docs]) +- Google Assistant request sync service ([@r4nd0mbr1ck] - [#10165]) +- Optimize concurrent access to media player image cache ([@amelchio] - [#10345]) ([media_player docs]) +- webostv: set current source correctly ([@KapJI] - [#10548]) ([media_player.webostv docs]) +- Upgrade pysnmp to 4.4.2 ([@fabaff] - [#10539]) ([device_tracker.snmp docs]) ([sensor.snmp docs]) ([switch.snmp docs]) +- Fix and clean lametric ([@MartinHjelmare] - [#10391]) ([lametric docs]) ([notify.lametric docs]) +- Support presence detection using Hitron Coda router ([@arilotter] - [#9682]) ([device_tracker.hitron_coda docs]) (new-platform) +- Better support for int types ([@ziotibia81] - [#10409]) ([sensor.modbus docs]) +- Don't use the 'id' field since it can be autogenerated (fixes #10551). ([@kmdm] - [#10554]) +- pad packets to multiple of 4 characters ([@SteveEdson] - [#10560]) ([switch.broadlink docs]) +- Move temperature display helper from components to helpers ([@fabaff] - [#10555]) ([climate docs]) ([weather docs]) ([climate.eq3btsmart docs]) +- webostv: Reduce default timeout to prevent log spamming ([@abmantis] - [#10564]) ([media_player.webostv docs]) +- Fix lametric sound ([@MartinHjelmare] - [#10562]) ([lametric docs]) ([notify.lametric docs]) +- Use a template for the Universal media player state ([@azogue] - [#10395]) ([media_player.universal docs]) +- Verisure: Added option to set installation giid ([@abjorshammar] - [#10504]) ([verisure docs]) +- Bump ring_doorbell to 0.1.7 ([@tchellomello] - [#10566]) ([ring docs]) +- Add code to enable discovery for mqtt cover ([@marthoc] - [#10580]) ([cover.mqtt docs]) +- Google Assistant for climate entities: Support QUERY and respect system-wide unit_system setting. ([@emosenkis] - [#10346]) +- turn service call handler into coroutine ([@NovapaX] - [#10576]) ([configurator docs]) +- Add basic backend support for a system log ([@postlund] - [#10492]) ([system_log docs]) (new-platform) +- Tradfri unique identities ([@NovapaX] - [#10414]) ([tradfri docs]) +- Add panel build type ([@balloob] - [#10589]) +- Cloud updates ([@balloob] - [#10567]) +- Upgrade youtube_dl to 2017.11.15 ([@fabaff] - [#10592]) ([media_extractor docs]) +- Fix Yahoo Weather icons over SSL ([@OnFreund] - [#10602]) ([sensor.yweather docs]) +- Arlo - Fixes for updated library ([@jwillaz] - [#9892]) ([arlo docs]) ([camera.arlo docs]) ([sensor.arlo docs]) +- Do not add panel from system_log ([@postlund] - [#10600]) ([system_log docs]) +- Fix ValueError exception ([@ziotibia81] - [#10596]) ([sensor.modbus docs]) +- Fix Hikvision (motion) switch bug ([@arsaboo] - [#10608]) ([switch.hikvisioncam docs]) +- Allow unicode when dumping yaml ([@andrey-git] - [#10607]) +- Support script execution for Alexa ([@micbase] - [#10517]) ([alexa.smart_home docs]) +- bump client version ([@wardcraigj] - [#10610]) ([alarm_control_panel.totalconnect docs]) +- New sensor viaggiatreno. ([@fabfurnari] - [#10522]) ([sensor.viaggiatreno docs]) (new-platform) +- Modbus switch register support ([@ziotibia81] - [#10563]) ([switch.modbus docs]) +- Upgrade mypy to 0.550 ([@fabaff] - [#10591]) +- Small fix to be able to use mac and vendor in "device_tracker_new_device" event. ([@Boltgolt] - [#10537]) ([device_tracker docs]) +- add support for color temperature and color to Google Assistant ([@perosb] - [#10039]) +- Cleanup old stale restore feature ([@pvizeli] - [#10593]) ([light docs]) +- Correct input_datetime initial value parsing ([@colindunn] - [#10417]) ([input_datetime docs]) +- Change generic thermostat to control heating on mode change Off -> Auto ([@milanvo] - [#10601]) ([climate.generic_thermostat docs]) +- Improve WUnderground config validation ([@milanvo] - [#10573]) ([sensor.wunderground docs]) +- update hbmqtt to 0.9.1 ([@masarliev] - [#10611]) +- Allow to pass YandexTTS options via sevice call ([@andrey-git] - [#10578]) ([tts docs]) ([tts.yandextts docs]) +- Snapcast: bump version and enable reconnect. ([@janLo] - [#10626]) ([media_player.snapcast docs]) +- Fix async missing decorators ([@armills] - [#10628]) +- Alexa slot synonym fix ([@devspacenine] - [#10614]) +- Adjust logging in downloader component ([@amelchio] - [#10622]) ([downloader docs]) +- Added sorted() to python_script ([@etsinko] - [#10621]) ([python_script docs]) +- Add loglinefetch for frontend API call ([@turbokongen] - [#10579]) +- Fixes AirVisual bug regarding incorrect location data ([@bachya] - [#10054]) ([sensor.airvisual docs]) +- Make MQTT reconnection logic more resilient and fix race condition ([@cezarsa] - [#10133]) ([mqtt docs]) +- Alexa improvements ([@robbiet480] - [#10632]) ([alexa.smart_home docs]) +- Print entity type in "too slow" warnings ([@andrey-git] - [#10641]) +- Bump pyatv to 0.3.8 ([@postlund] - [#10643]) ([apple_tv docs]) +- Implement entity and domain exclude/include for Alexa ([@robbiet480] - [#10647]) + +[#10039]: https://github.com/home-assistant/home-assistant/pull/10039 +[#10054]: https://github.com/home-assistant/home-assistant/pull/10054 +[#10089]: https://github.com/home-assistant/home-assistant/pull/10089 +[#10133]: https://github.com/home-assistant/home-assistant/pull/10133 +[#10139]: https://github.com/home-assistant/home-assistant/pull/10139 +[#10165]: https://github.com/home-assistant/home-assistant/pull/10165 +[#10195]: https://github.com/home-assistant/home-assistant/pull/10195 +[#10214]: https://github.com/home-assistant/home-assistant/pull/10214 +[#10218]: https://github.com/home-assistant/home-assistant/pull/10218 +[#10256]: https://github.com/home-assistant/home-assistant/pull/10256 +[#10286]: https://github.com/home-assistant/home-assistant/pull/10286 +[#10294]: https://github.com/home-assistant/home-assistant/pull/10294 +[#10298]: https://github.com/home-assistant/home-assistant/pull/10298 +[#10305]: https://github.com/home-assistant/home-assistant/pull/10305 +[#10312]: https://github.com/home-assistant/home-assistant/pull/10312 +[#10313]: https://github.com/home-assistant/home-assistant/pull/10313 +[#10330]: https://github.com/home-assistant/home-assistant/pull/10330 +[#10332]: https://github.com/home-assistant/home-assistant/pull/10332 +[#10336]: https://github.com/home-assistant/home-assistant/pull/10336 +[#10345]: https://github.com/home-assistant/home-assistant/pull/10345 +[#10346]: https://github.com/home-assistant/home-assistant/pull/10346 +[#10347]: https://github.com/home-assistant/home-assistant/pull/10347 +[#10348]: https://github.com/home-assistant/home-assistant/pull/10348 +[#10349]: https://github.com/home-assistant/home-assistant/pull/10349 +[#10354]: https://github.com/home-assistant/home-assistant/pull/10354 +[#10358]: https://github.com/home-assistant/home-assistant/pull/10358 +[#10365]: https://github.com/home-assistant/home-assistant/pull/10365 +[#10369]: https://github.com/home-assistant/home-assistant/pull/10369 +[#10374]: https://github.com/home-assistant/home-assistant/pull/10374 +[#10381]: https://github.com/home-assistant/home-assistant/pull/10381 +[#10388]: https://github.com/home-assistant/home-assistant/pull/10388 +[#10391]: https://github.com/home-assistant/home-assistant/pull/10391 +[#10395]: https://github.com/home-assistant/home-assistant/pull/10395 +[#10399]: https://github.com/home-assistant/home-assistant/pull/10399 +[#10401]: https://github.com/home-assistant/home-assistant/pull/10401 +[#10405]: https://github.com/home-assistant/home-assistant/pull/10405 +[#10409]: https://github.com/home-assistant/home-assistant/pull/10409 +[#10412]: https://github.com/home-assistant/home-assistant/pull/10412 +[#10413]: https://github.com/home-assistant/home-assistant/pull/10413 +[#10414]: https://github.com/home-assistant/home-assistant/pull/10414 +[#10416]: https://github.com/home-assistant/home-assistant/pull/10416 +[#10417]: https://github.com/home-assistant/home-assistant/pull/10417 +[#10420]: https://github.com/home-assistant/home-assistant/pull/10420 +[#10426]: https://github.com/home-assistant/home-assistant/pull/10426 +[#10439]: https://github.com/home-assistant/home-assistant/pull/10439 +[#10455]: https://github.com/home-assistant/home-assistant/pull/10455 +[#10460]: https://github.com/home-assistant/home-assistant/pull/10460 +[#10465]: https://github.com/home-assistant/home-assistant/pull/10465 +[#10469]: https://github.com/home-assistant/home-assistant/pull/10469 +[#10470]: https://github.com/home-assistant/home-assistant/pull/10470 +[#10474]: https://github.com/home-assistant/home-assistant/pull/10474 +[#10476]: https://github.com/home-assistant/home-assistant/pull/10476 +[#10478]: https://github.com/home-assistant/home-assistant/pull/10478 +[#10482]: https://github.com/home-assistant/home-assistant/pull/10482 +[#10484]: https://github.com/home-assistant/home-assistant/pull/10484 +[#10489]: https://github.com/home-assistant/home-assistant/pull/10489 +[#10490]: https://github.com/home-assistant/home-assistant/pull/10490 +[#10491]: https://github.com/home-assistant/home-assistant/pull/10491 +[#10492]: https://github.com/home-assistant/home-assistant/pull/10492 +[#10494]: https://github.com/home-assistant/home-assistant/pull/10494 +[#10504]: https://github.com/home-assistant/home-assistant/pull/10504 +[#10510]: https://github.com/home-assistant/home-assistant/pull/10510 +[#10513]: https://github.com/home-assistant/home-assistant/pull/10513 +[#10517]: https://github.com/home-assistant/home-assistant/pull/10517 +[#10520]: https://github.com/home-assistant/home-assistant/pull/10520 +[#10522]: https://github.com/home-assistant/home-assistant/pull/10522 +[#10525]: https://github.com/home-assistant/home-assistant/pull/10525 +[#10527]: https://github.com/home-assistant/home-assistant/pull/10527 +[#10528]: https://github.com/home-assistant/home-assistant/pull/10528 +[#10533]: https://github.com/home-assistant/home-assistant/pull/10533 +[#10536]: https://github.com/home-assistant/home-assistant/pull/10536 +[#10537]: https://github.com/home-assistant/home-assistant/pull/10537 +[#10539]: https://github.com/home-assistant/home-assistant/pull/10539 +[#10548]: https://github.com/home-assistant/home-assistant/pull/10548 +[#10554]: https://github.com/home-assistant/home-assistant/pull/10554 +[#10555]: https://github.com/home-assistant/home-assistant/pull/10555 +[#10560]: https://github.com/home-assistant/home-assistant/pull/10560 +[#10562]: https://github.com/home-assistant/home-assistant/pull/10562 +[#10563]: https://github.com/home-assistant/home-assistant/pull/10563 +[#10564]: https://github.com/home-assistant/home-assistant/pull/10564 +[#10566]: https://github.com/home-assistant/home-assistant/pull/10566 +[#10567]: https://github.com/home-assistant/home-assistant/pull/10567 +[#10573]: https://github.com/home-assistant/home-assistant/pull/10573 +[#10576]: https://github.com/home-assistant/home-assistant/pull/10576 +[#10578]: https://github.com/home-assistant/home-assistant/pull/10578 +[#10579]: https://github.com/home-assistant/home-assistant/pull/10579 +[#10580]: https://github.com/home-assistant/home-assistant/pull/10580 +[#10589]: https://github.com/home-assistant/home-assistant/pull/10589 +[#10591]: https://github.com/home-assistant/home-assistant/pull/10591 +[#10592]: https://github.com/home-assistant/home-assistant/pull/10592 +[#10593]: https://github.com/home-assistant/home-assistant/pull/10593 +[#10596]: https://github.com/home-assistant/home-assistant/pull/10596 +[#10600]: https://github.com/home-assistant/home-assistant/pull/10600 +[#10601]: https://github.com/home-assistant/home-assistant/pull/10601 +[#10602]: https://github.com/home-assistant/home-assistant/pull/10602 +[#10607]: https://github.com/home-assistant/home-assistant/pull/10607 +[#10608]: https://github.com/home-assistant/home-assistant/pull/10608 +[#10610]: https://github.com/home-assistant/home-assistant/pull/10610 +[#10611]: https://github.com/home-assistant/home-assistant/pull/10611 +[#10614]: https://github.com/home-assistant/home-assistant/pull/10614 +[#10621]: https://github.com/home-assistant/home-assistant/pull/10621 +[#10622]: https://github.com/home-assistant/home-assistant/pull/10622 +[#10626]: https://github.com/home-assistant/home-assistant/pull/10626 +[#10628]: https://github.com/home-assistant/home-assistant/pull/10628 +[#10632]: https://github.com/home-assistant/home-assistant/pull/10632 +[#10641]: https://github.com/home-assistant/home-assistant/pull/10641 +[#10643]: https://github.com/home-assistant/home-assistant/pull/10643 +[#10647]: https://github.com/home-assistant/home-assistant/pull/10647 +[#9682]: https://github.com/home-assistant/home-assistant/pull/9682 +[#9892]: https://github.com/home-assistant/home-assistant/pull/9892 +[#9906]: https://github.com/home-assistant/home-assistant/pull/9906 +[#9928]: https://github.com/home-assistant/home-assistant/pull/9928 +[#9946]: https://github.com/home-assistant/home-assistant/pull/9946 +[@Boltgolt]: https://github.com/Boltgolt +[@GenericStudent]: https://github.com/GenericStudent +[@Julius2342]: https://github.com/Julius2342 +[@Kane610]: https://github.com/Kane610 +[@KapJI]: https://github.com/KapJI +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@MisterWil]: https://github.com/MisterWil +[@NovapaX]: https://github.com/NovapaX +[@OnFreund]: https://github.com/OnFreund +[@SteveEdson]: https://github.com/SteveEdson +[@TopdRob]: https://github.com/TopdRob +[@abjorshammar]: https://github.com/abjorshammar +[@abmantis]: https://github.com/abmantis +[@amelchio]: https://github.com/amelchio +[@andrey-git]: https://github.com/andrey-git +[@arilotter]: https://github.com/arilotter +[@armills]: https://github.com/armills +[@arsaboo]: https://github.com/arsaboo +[@azogue]: https://github.com/azogue +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@cezarsa]: https://github.com/cezarsa +[@cgtobi]: https://github.com/cgtobi +[@colindunn]: https://github.com/colindunn +[@danielhiversen]: https://github.com/danielhiversen +[@davegravy]: https://github.com/davegravy +[@devspacenine]: https://github.com/devspacenine +[@dgomes]: https://github.com/dgomes +[@echox]: https://github.com/echox +[@ehagan]: https://github.com/ehagan +[@emosenkis]: https://github.com/emosenkis +[@etsinko]: https://github.com/etsinko +[@fabaff]: https://github.com/fabaff +[@fabfurnari]: https://github.com/fabfurnari +[@hmmbob]: https://github.com/hmmbob +[@hthiery]: https://github.com/hthiery +[@iMarkus]: https://github.com/iMarkus +[@jabesq]: https://github.com/jabesq +[@jalmeroth]: https://github.com/jalmeroth +[@janLo]: https://github.com/janLo +[@jwillaz]: https://github.com/jwillaz +[@kmdm]: https://github.com/kmdm +[@marthoc]: https://github.com/marthoc +[@masarliev]: https://github.com/masarliev +[@mbrrg]: https://github.com/mbrrg +[@mdonoughe]: https://github.com/mdonoughe +[@micbase]: https://github.com/micbase +[@milanvo]: https://github.com/milanvo +[@molobrakos]: https://github.com/molobrakos +[@mw-white]: https://github.com/mw-white +[@perosb]: https://github.com/perosb +[@postlund]: https://github.com/postlund +[@pvizeli]: https://github.com/pvizeli +[@r4nd0mbr1ck]: https://github.com/r4nd0mbr1ck +[@robbiet480]: https://github.com/robbiet480 +[@c727]: https://github.com/c727 +[@robmarkcole]: https://github.com/robmarkcole +[@sander76]: https://github.com/sander76 +[@syssi]: https://github.com/syssi +[@tchellomello]: https://github.com/tchellomello +[@tinloaf]: https://github.com/tinloaf +[@turbokongen]: https://github.com/turbokongen +[@vickyg3]: https://github.com/vickyg3 +[@w1ll1am23]: https://github.com/w1ll1am23 +[@wardcraigj]: https://github.com/wardcraigj +[@ziotibia81]: https://github.com/ziotibia81 +[abode docs]: https://home-assistant.io/components/abode/ +[alarm_control_panel.spc docs]: https://home-assistant.io/components/alarm_control_panel.spc/ +[alarm_control_panel.totalconnect docs]: https://home-assistant.io/components/alarm_control_panel.totalconnect/ +[alexa.const docs]: https://home-assistant.io/components/alexa.const/ +[alexa.intent docs]: https://home-assistant.io/components/alexa.intent/ +[alexa.smart_home docs]: https://home-assistant.io/components/alexa.smart_home/ +[apple_tv docs]: https://home-assistant.io/components/apple_tv/ +[arlo docs]: https://home-assistant.io/components/arlo/ +[axis docs]: https://home-assistant.io/components/axis/ +[binary_sensor docs]: https://home-assistant.io/components/binary_sensor/ +[binary_sensor.aurora docs]: https://home-assistant.io/components/binary_sensor.aurora/ +[binary_sensor.spc docs]: https://home-assistant.io/components/binary_sensor.spc/ +[binary_sensor.vultr docs]: https://home-assistant.io/components/binary_sensor.vultr/ +[camera.arlo docs]: https://home-assistant.io/components/camera.arlo/ +[climate docs]: https://home-assistant.io/components/climate/ +[climate.eq3btsmart docs]: https://home-assistant.io/components/climate.eq3btsmart/ +[climate.generic_thermostat docs]: https://home-assistant.io/components/climate.generic_thermostat/ +[climate.homematic docs]: https://home-assistant.io/components/climate.homematic/ +[climate.knx docs]: https://home-assistant.io/components/climate.knx/ +[climate.wink docs]: https://home-assistant.io/components/climate.wink/ +[cloud docs]: https://home-assistant.io/components/cloud/ +[cloud.auth_api docs]: https://home-assistant.io/components/cloud.auth_api/ +[cloud.const docs]: https://home-assistant.io/components/cloud.const/ +[cloud.http_api docs]: https://home-assistant.io/components/cloud.http_api/ +[cloud.iot docs]: https://home-assistant.io/components/cloud.iot/ +[config.zwave docs]: https://home-assistant.io/components/config.zwave/ +[configurator docs]: https://home-assistant.io/components/configurator/ +[counter docs]: https://home-assistant.io/components/counter/ +[cover.mqtt docs]: https://home-assistant.io/components/cover.mqtt/ +[device_tracker docs]: https://home-assistant.io/components/device_tracker/ +[device_tracker.hitron_coda docs]: https://home-assistant.io/components/device_tracker.hitron_coda/ +[device_tracker.owntracks docs]: https://home-assistant.io/components/device_tracker.owntracks/ +[device_tracker.snmp docs]: https://home-assistant.io/components/device_tracker.snmp/ +[device_tracker.tile docs]: https://home-assistant.io/components/device_tracker.tile/ +[device_tracker.tplink docs]: https://home-assistant.io/components/device_tracker.tplink/ +[device_tracker.upc_connect docs]: https://home-assistant.io/components/device_tracker.upc_connect/ +[downloader docs]: https://home-assistant.io/components/downloader/ +[gc100 docs]: https://home-assistant.io/components/gc100/ +[google_assistant.smart_home docs]: https://home-assistant.io/components/google_assistant.smart_home/ +[hassio docs]: https://home-assistant.io/components/hassio/ +[influxdb docs]: https://home-assistant.io/components/influxdb/ +[input_datetime docs]: https://home-assistant.io/components/input_datetime/ +[knx docs]: https://home-assistant.io/components/knx/ +[lametric docs]: https://home-assistant.io/components/lametric/ +[light docs]: https://home-assistant.io/components/light/ +[light.tradfri docs]: https://home-assistant.io/components/light.tradfri/ +[light.xiaomi_miio docs]: https://home-assistant.io/components/light.xiaomi_miio/ +[lutron_caseta docs]: https://home-assistant.io/components/lutron_caseta/ +[media_extractor docs]: https://home-assistant.io/components/media_extractor/ +[media_player docs]: https://home-assistant.io/components/media_player/ +[media_player.bluesound docs]: https://home-assistant.io/components/media_player.bluesound/ +[media_player.snapcast docs]: https://home-assistant.io/components/media_player.snapcast/ +[media_player.universal docs]: https://home-assistant.io/components/media_player.universal/ +[media_player.webostv docs]: https://home-assistant.io/components/media_player.webostv/ +[media_player.yamaha_musiccast docs]: https://home-assistant.io/components/media_player.yamaha_musiccast/ +[mqtt docs]: https://home-assistant.io/components/mqtt/ +[mqtt.discovery docs]: https://home-assistant.io/components/mqtt.discovery/ +[mqtt.server docs]: https://home-assistant.io/components/mqtt.server/ +[mqtt_statestream docs]: https://home-assistant.io/components/mqtt_statestream/ +[neato docs]: https://home-assistant.io/components/neato/ +[no_ip docs]: https://home-assistant.io/components/no_ip/ +[notify.apns docs]: https://home-assistant.io/components/notify.apns/ +[notify.free_mobile docs]: https://home-assistant.io/components/notify.free_mobile/ +[notify.html5 docs]: https://home-assistant.io/components/notify.html5/ +[notify.lametric docs]: https://home-assistant.io/components/notify.lametric/ +[notify.simplepush docs]: https://home-assistant.io/components/notify.simplepush/ +[notify.telegram docs]: https://home-assistant.io/components/notify.telegram/ +[python_script docs]: https://home-assistant.io/components/python_script/ +[remote docs]: https://home-assistant.io/components/remote/ +[remote.harmony docs]: https://home-assistant.io/components/remote.harmony/ +[ring docs]: https://home-assistant.io/components/ring/ +[sensor.airvisual docs]: https://home-assistant.io/components/sensor.airvisual/ +[sensor.arlo docs]: https://home-assistant.io/components/sensor.arlo/ +[sensor.haveibeenpwned docs]: https://home-assistant.io/components/sensor.haveibeenpwned/ +[sensor.lacrosse docs]: https://home-assistant.io/components/sensor.lacrosse/ +[sensor.london_air docs]: https://home-assistant.io/components/sensor.london_air/ +[sensor.modbus docs]: https://home-assistant.io/components/sensor.modbus/ +[sensor.neato docs]: https://home-assistant.io/components/sensor.neato/ +[sensor.nederlandse_spoorwegen docs]: https://home-assistant.io/components/sensor.nederlandse_spoorwegen/ +[sensor.pyload docs]: https://home-assistant.io/components/sensor.pyload/ +[sensor.serial docs]: https://home-assistant.io/components/sensor.serial/ +[sensor.snmp docs]: https://home-assistant.io/components/sensor.snmp/ +[sensor.systemmonitor docs]: https://home-assistant.io/components/sensor.systemmonitor/ +[sensor.tibber docs]: https://home-assistant.io/components/sensor.tibber/ +[sensor.viaggiatreno docs]: https://home-assistant.io/components/sensor.viaggiatreno/ +[sensor.vultr docs]: https://home-assistant.io/components/sensor.vultr/ +[sensor.wunderground docs]: https://home-assistant.io/components/sensor.wunderground/ +[sensor.yweather docs]: https://home-assistant.io/components/sensor.yweather/ +[sensor.zamg docs]: https://home-assistant.io/components/sensor.zamg/ +[spc docs]: https://home-assistant.io/components/spc/ +[switch.broadlink docs]: https://home-assistant.io/components/switch.broadlink/ +[switch.hikvisioncam docs]: https://home-assistant.io/components/switch.hikvisioncam/ +[switch.modbus docs]: https://home-assistant.io/components/switch.modbus/ +[switch.neato docs]: https://home-assistant.io/components/switch.neato/ +[switch.snmp docs]: https://home-assistant.io/components/switch.snmp/ +[switch.xiaomi_miio docs]: https://home-assistant.io/components/switch.xiaomi_miio/ +[system_log docs]: https://home-assistant.io/components/system_log/ +[telegram_bot docs]: https://home-assistant.io/components/telegram_bot/ +[telegram_bot.polling docs]: https://home-assistant.io/components/telegram_bot.polling/ +[tradfri docs]: https://home-assistant.io/components/tradfri/ +[tts docs]: https://home-assistant.io/components/tts/ +[tts.google docs]: https://home-assistant.io/components/tts.google/ +[tts.yandextts docs]: https://home-assistant.io/components/tts.yandextts/ +[vacuum.neato docs]: https://home-assistant.io/components/vacuum.neato/ +[verisure docs]: https://home-assistant.io/components/verisure/ +[volvooncall docs]: https://home-assistant.io/components/volvooncall/ +[vultr docs]: https://home-assistant.io/components/vultr/ +[weather docs]: https://home-assistant.io/components/weather/ +[weather.demo docs]: https://home-assistant.io/components/weather.demo/ +[websocket_api docs]: https://home-assistant.io/components/websocket_api/ +[zwave docs]: https://home-assistant.io/components/zwave/ diff --git a/source/images/blog/2017-11-0.58/components.png b/source/images/blog/2017-11-0.58/components.png new file mode 100644 index 0000000000000000000000000000000000000000..bc985562a5433ac9f1107a6367afb607c72fbb0c GIT binary patch literal 18349 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 literal 0 HcmV?d00001 diff --git a/source/images/blog/2017-11-0.58/system_log.png b/source/images/blog/2017-11-0.58/system_log.png new file mode 100644 index 0000000000000000000000000000000000000000..06b363917a07197e073c6c5432b61923f5bf1d07 GIT binary patch literal 23275 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 literal 0 HcmV?d00001