From 3ce8cd71c5d0dfadedbdbb45d9ae678153b8b56d Mon Sep 17 00:00:00 2001 From: Nate Clark Date: Thu, 23 Aug 2018 14:49:30 -0400 Subject: [PATCH 01/48] update documentation for device id format validation --- source/_components/konnected.markdown | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/source/_components/konnected.markdown b/source/_components/konnected.markdown index 8a5f245af0e..df50d5abc37 100644 --- a/source/_components/konnected.markdown +++ b/source/_components/konnected.markdown @@ -23,7 +23,7 @@ The component currently supports the following device types in Home Assistant: This component requires the [`discovery`](https://www.home-assistant.io/components/discovery) component to be enabled. -## {% linkable_title Configuration %} +### {% linkable_title Configuration %} A `konnected` section must be present in the `configuration.yml` file that specifies the Konnected devices on the network and the sensors or actuators attached to them: @@ -32,13 +32,13 @@ A `konnected` section must be present in the `configuration.yml` file that speci konnected: access_token: REPLACE_ME_WITH_A_RANDOM_STRING devices: - - id: 8bcd53 + - id: 6001948bcd53 binary_sensors: - zone: 1 type: door switches: - zone: out - - id: 438a38 + - id: 5ccf7f438a38 binary_sensors: - pin: 2 type: door @@ -62,7 +62,7 @@ devices: type: list keys: id: - description: The MAC address of the WiFi module with colons/punctuation removed. You can either use the full 12-character MAC address or only the last 6 characters. This is visible in the device's WiFi SSID and hostname. + description: The MAC address of the NodeMCU WiFi module with colons/punctuation removed, for example `68c63a8bcd53`. You can usually find the mac address in your router's client list. Or, check the home-assistant.log for log messages from automatically discovered devices. required: true type: string binary_sensors: @@ -118,14 +118,14 @@ devices: - Either **pin** or **zone** is required for each actuator or sensor. Do not use both in the same definition. - Pin `D8` or the `out` zone will only work when activation is set to high (the default). -## {% linkable_title Full Configuration %} +### {% linkable_title Extended Configuration %} ```yaml # Example configuration.yaml entry konnected: access_token: REPLACE_ME_WITH_A_RANDOM_STRING devices: - - id: 8bcd53 + - id: 6001948bcd53 binary_sensors: - zone: 1 type: door @@ -149,7 +149,7 @@ konnected: momentary: 65 pause: 55 repeat: -1 - - id: 438a38 + - id: 5ccf7f438a38 binary_sensors: - pin: 1 type: motion @@ -179,3 +179,16 @@ Konnected runs on an ESP8266 board with the NodeMCU firmware. It is commonly use | 5 | D7 | 7 | GPIO13 | | 6 | RX | 9 | GPIO3 | | ALARM or OUT | D8 | 8 | GPIO15 | + +### {% linkable_title Revision History %} + +#### 0.77 +* Added support for momentary and beep/blink switches. [[#15973](https://github.com/home-assistant/home-assistant/pull/15973)] +* Decouple entity initialization from discovery, enabling devices to recover faster after a Home Assistant reboot. [[#16146](https://github.com/home-assistant/home-assistant/pull/16146)] +* **Breaking change:** Device `id` in `configuration.yaml` must now be the full 12-character device MAC address. Previously, omitting the first 6 characters was allowed. + +#### 0.72 +* Adds `api_host` configuration option [[#14896](https://github.com/home-assistant/home-assistant/pull/14896)] + +#### 0.70 +* Initial release From 61239943c6dedd2688345379a7de3386126991c2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 25 Aug 2018 11:38:16 +0200 Subject: [PATCH 02/48] Add 'moon_phase' to Dark Sky sensor (#6076) --- source/_components/sensor.darksky.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.darksky.markdown b/source/_components/sensor.darksky.markdown index 2480baeb92e..919b6566dfa 100644 --- a/source/_components/sensor.darksky.markdown +++ b/source/_components/sensor.darksky.markdown @@ -108,6 +108,7 @@ Configuration variables: - **apparent_temperature_low**: Today's overnight expected apparent low temperature. - **precip_intensity_max**: Today's expected maximum intensity of precipitation. - **uv_index**: The current UV index. + - **moon_phase**: The fractional part of the lunation number during the given day. - **units** (*Optional*): Specify the unit system. Default to `si` or `us` based on the temperature preference in Home Assistant. Other options are `auto`, `us`, `si`, `ca`, `uk` and `uk2`. `auto` will let Dark Sky decide the unit system based on location. - **update_interval** (*Optional*): Minimum time interval between updates. Default is 2 minutes. Supported formats: From c90749a3d1f17a0d0f9c45f8d9e3114a4c6051b5 Mon Sep 17 00:00:00 2001 From: Comic Chang Date: Sun, 26 Aug 2018 16:49:09 +0800 Subject: [PATCH 03/48] fix documents related with xiaoyi xiaofang camera (#6083) 1. remove xiaofang as the source file was removed. 2. fix default path value in xiaoyi doc. (https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/camera/xiaomi.py#L23) --- source/_components/camera.xiaofang.markdown | 86 --------------------- source/_components/camera.xiaomi.markdown | 2 +- 2 files changed, 1 insertion(+), 87 deletions(-) delete mode 100644 source/_components/camera.xiaofang.markdown diff --git a/source/_components/camera.xiaofang.markdown b/source/_components/camera.xiaofang.markdown deleted file mode 100644 index cfe319bec8c..00000000000 --- a/source/_components/camera.xiaofang.markdown +++ /dev/null @@ -1,86 +0,0 @@ ---- -layout: page -title: "Xiaomi Cameras" -description: "Instructions on how to integrate a video feed (via FFmpeg) as a camera within Home Assistant." -date: 2018-06-20 13:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: xiaomi.png -ha_category: Camera -ha_release: 0.72 -ha_iot_class: "Local Polling" ---- - -The `Xiaomi` camera platform allows you to utilize Xiaomi Cameras within Home Assistant. - -To successfully implement this platform, the Home Assistant host should be capable of multiple simultaneous reads. For every concurrent Home Assistant user, a connection will be made to the camera every 10 seconds. This should normally not be a problem. - -## {% linkable_title Preparing the Device %} - -### {% linkable_title Installing Alternative Firmware %} - -In order to integrate the camera with Home Assistant, it is necessary to install a custom firmware on the device. Instructions for doing so can be found for each models. - -* [Yi 720p](https://github.com/fritz-smh/yi-hack) -* [Yi Home 17CN / 27US / 47US / 1080p Home / Dome / 1080p Dome](https://github.com/shadow-1/yi-hack-v3) -* [Xiaofang 1080p Camera](https://github.com/samtap/fang-hacks) - -Once installed, please ensure that you have enabled FTP. - -

-Currently, version 0.1.4-beta2 of the custom firmware is the highest supported. Firmwares higher than this version use [Pure-FTPd](https://www.pureftpd.org/project/pure-ftpd), which has a bug that prevents FFmpeg from correctly rendering video files. -

- -

-Hassbian users: don't forget to install ffmpeg support on your platform, otherwise, you'll not see video. -

- -

-The live stream writing by the camera is not an supported format when the hass reads through FTP for Yi 720p and Xiaofang Cameras, so this component retrives the video which was saved 1 minute earlier. -

- -

-If you enabled RTSP server, you can connect to your camera via other Home Assistant camera platforms. However, this RTSP server disables the ability to use the supremely-useful Mi Home app. In order to maintain both Home Assistant compatibility _and_ the native app, this platform retrieves videos via FTP. -

- -## {% linkable_title Configuring the Platform %} - -To enable the platform, add the following lines to your`configuration.yaml` file: - -```yaml -camera: - - platform: xiaomi - name: Camera - host: '192.168.1.100' - model: 'yi' - password: my_password_123 -``` - -Configuration variables: - -- **name** (*Required*): A human-friendly name for the camera. -- **host** (*Required*): The IP address or hostname of the camera. -- **model** (*Required*): The model of Xiaomi Camera, currently supporting yi and xiaofang. -- **password** (*Required*): The password to the FTP server on the camera (from above), can be any string as the current firmware doesn't allow setting ftp passwords. -- **path** (*Optional*): The path to the raw MP4 files. Defaults to `/tmp/sd/record`. -- **username** (*Optional*): The user that can access the FTP server. Defaults to `root`. -- **ffmpeg_arguments** (*Optional*): Extra options to pass to `ffmpeg` (e.g., image quality or video filter options). - -## {% linkable_title Image quality %} - -Any option supported by [`ffmpeg` camera](/components/camera.ffmpeg/) can be utilized via the `ffmpeg_arguments` configuration parameter. - -One particularly useful adjustment deals with video size. Since Yi videos are fairly large (especially on the 1080p cameras), the following configuration will bring them down to a manageable size: - -```yaml -camera: - - platform: xiaomi - name: My Camera - host: '192.168.1.100' - model: 'xiaofang' - password: my_password_123 - path: /home/camera/feed - ffmpeg_arguments: '-vf scale=800:450' -``` diff --git a/source/_components/camera.xiaomi.markdown b/source/_components/camera.xiaomi.markdown index 96649e18e48..d326e7b9c20 100644 --- a/source/_components/camera.xiaomi.markdown +++ b/source/_components/camera.xiaomi.markdown @@ -62,7 +62,7 @@ Configuration variables: - **host** (*Required*): The IP address or hostname of the camera. - **model** (*Required*): The model of Xiaomi Camera, currently supporting yi and xiaofang. - **password** (*Required*): The password to the FTP server on the camera (from above), can be any string as the current firmware doesn't allow setting ftp passwords. -- **path** (*Optional*): The path to the raw MP4 files. Defaults to `/tmp/sd/record`. +- **path** (*Optional*): The path to the raw MP4 files. Defaults to `/media/mmcblk0p1/record`. - **username** (*Optional*): The user that can access the FTP server. Defaults to `root`. - **ffmpeg_arguments** (*Optional*): Extra options to pass to `ffmpeg` (e.g., image quality or video filter options). From 26e44b58959e4a160643499222fe5a16907ccca6 Mon Sep 17 00:00:00 2001 From: Maikel Punie Date: Mon, 27 Aug 2018 07:07:03 +0200 Subject: [PATCH 04/48] Velbus temperature sensors (#6085) * Velbus temperature sensors * Worked on requested changes * Worked on requested changes --- source/_components/sensor.velbus.markdown | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 source/_components/sensor.velbus.markdown diff --git a/source/_components/sensor.velbus.markdown b/source/_components/sensor.velbus.markdown new file mode 100644 index 00000000000..7ec537b6e57 --- /dev/null +++ b/source/_components/sensor.velbus.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "Velbus Sensor" +description: "Instructions how to integrate Velbus sensors into Home Assistant." +date: 2018-08-22 06:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: velbus.png +ha_category: Sensor +ha_iot_class: "Local Push" +ha_release: 0.78 +--- + +The `velbus` sensor allows you to control [Velbus](http://www.velbus.eu) connected temperature sensors. + +For hub configuration, see [the Velbus component](/components/velbus/). From b119c4674b9440a7b97020ecf1cdc0273f01ec92 Mon Sep 17 00:00:00 2001 From: Marcel Hoppe Date: Mon, 27 Aug 2018 09:16:13 +0200 Subject: [PATCH 05/48] Add documentation for hangouts and notify.hangouts components (#6044) * Add documentation for hangouts and notify.hangouts components * use {% configuration %} * name is not required * Update hangouts.markdown remove email and password from config add integrations description * Update hangouts.markdown Add notice for 2fa * Typo * More fixes * Update notify.hangouts.markdown * Update notify.hangouts.markdown add hint to hangouts.conversations * cleaner doc removing name option from conversations entries --- source/_components/hangouts.markdown | 126 ++++++++++++++++++++ source/_components/notify.hangouts.markdown | 52 ++++++++ source/images/supported_brands/hangouts.png | Bin 0 -> 28244 bytes 3 files changed, 178 insertions(+) create mode 100644 source/_components/hangouts.markdown create mode 100644 source/_components/notify.hangouts.markdown create mode 100644 source/images/supported_brands/hangouts.png diff --git a/source/_components/hangouts.markdown b/source/_components/hangouts.markdown new file mode 100644 index 00000000000..ba290e276f1 --- /dev/null +++ b/source/_components/hangouts.markdown @@ -0,0 +1,126 @@ +--- +layout: page +title: "Google Hangouts" +description: "Hangouts chatbot support" +date: 2018-08-18 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: hangouts.png +ha_category: Hub +ha_release: 0.77 +--- + +This component allows you to send messages to [Google Hangouts](http://hangouts.google.com) conversations, as well as to react to messages in conversations. Reacting to commands is accomplished by firing an event when one of the configured commands is triggered. + +## {% linkable_title Setup the component via the frontend %} + +Menu: *Configuration* -> *Integrations* + +Fill the form: +* Your **Google Mail Address** and **Password** +* If needed, you will be asked for a 2-factor authorization token + +**IMPORTANT:** If you secured your account with 2 factor authorization: Only verification by app or SMS are supported. There is no support for verification by prompt on your phone. + +The authentication token will be generated and stored internally. + +```yaml +# Example configuration.yaml entry +hangouts: + commands: + - word: testword + conversations: + - id: CONVERSATION_ID1 + - id: CONVERSATION_ID2 + - expression: "My name is (?P.*)" + name: introduction +``` +{% configuration %} +commands: + description: "A list of commands that the bot should listen for. If a command is triggered (via its *word* or *expression*, see below), an event is fired that you can handle using automations. Every command consists of these possible configuration options:" + required: false + type: map + default: empty + keys: + word: + description: "Specifies a word that the bot should listen for. If you specify 'my_command' here, the bot will react to any message starting with 'my_command'." + required: false + type: string + expression: + description: "Specifies a regular expression (in python regexp syntax) that the bot should listen to. The bot will react to any message that matches the regular expression." + required: false + type: string + name: + description: "The name of the command. This will be an attribute of the event that is fired when this command triggers." + required: true + type: string + conversations: + description: "A list of conversations that the bot should listen for this command in. If this is not given, all conversations are used." + required: false + type: [map] + default: empty + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" + required: true + type: string +{% endconfiguration %} + +The conversations has to be precreated, the conversation id can be obtained from the `hangouts.conversations` entity. Make sure to use quotes around the conversation id or alias to escape special characters (`!`, and `#`) in YAML. + +### {% linkable_title Event Data %} + +If a command is triggered, a `hangouts_command` event is fired. The event contains the name of the command in the `command` field. + +If the command is a word command, the `data` field contains a list of the command's arguments, i.e., everything that stood behind the word, split at spaces. If the command is an expression command, the `data` field contains the [group dictionary](https://docs.python.org/3.6/library/re.html?highlight=re#re.match.groupdict) of the regular expression that matched the message. + +There are these additional fields: `conversation_id`, `user_id` and `user_name`. + +### {% linkable_title Comprehensive Configuration Example %} + +```yaml +# The Hangouts component +hangouts: + commands: + - word: testword + conversations: + - name: "someothertest" + - expression: "My name is (?P.*)" + name: introduction + +automation: + - alias: 'React to !testword' + trigger: + platform: event + event_type: hangouts_command + event_data: + command: testword + action: + service: hangouts.send_message + data_template: + target: + - name: "hasstest" + message: + - text: 'It looks like you wrote testword' + - alias: 'React to an introduction' + trigger: + platform: event + event_type: hangouts_command + event_data: + command: introduction + action: + service: hangouts.send_message + data_template: + target: + - id: '{{ trigger.event.data.conversation_id}}' + message: + - text: "Hello {{ trigger.event.data.data.name }}" + +``` + +This configuration will: +- Listen for "testword" in the room "someothertest" (and only) there. + If such a message is encountered, it will answer with "It looks like you wrote testword" into the "hasstest" conversation. +- Listen in all conversations for any message matching "My name is (any name)" and answer with "Hello (the given name)" into the same conversation. diff --git a/source/_components/notify.hangouts.markdown b/source/_components/notify.hangouts.markdown new file mode 100644 index 00000000000..e1dcdf83e54 --- /dev/null +++ b/source/_components/notify.hangouts.markdown @@ -0,0 +1,52 @@ +--- +layout: page +title: "Google Hangouts" +description: "Instructions on how to add Google Hangouts notifications to Home Assistant." +date: 2018-08-18 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: hangouts.png +ha_category: Notifications +ha_release: 0.77 +--- + + +The `hangouts` platform allows you to deliver notifications from Home Assistant to [Google Hangouts](http://hangouts.google.com) conversations. Conversations can be both direct as well as group chats. + +## {% linkable_title Configuration %} + +To enable Hangouts notifications in your installation, you first need to configure +the [Hangouts component](/components/hangouts/). Then, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +notify: + - name: NOTIFIER_NAME + platform: hangouts + default_conversations: + - id: CONVERSATION_ID1 + - id: CONVERSATION_ID2 +``` + +{% configuration %} +name: + description: "Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`." + required: false + type: string +default_conversations: + description: "The conversations all messages will be sent to, when no other target is given." + required: true + type: [map] + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" + required: true + type: string +{% endconfiguration %} + +The conversations has to be precreated, the conversation id can be obtained from the `hangouts.conversations` entity. Make sure to use quotes around the conversation id or alias to escape special characters (`!`, and `#`) in YAML. + +To use notifications, please see the [getting started with automation page](/getting-started/automation/). + diff --git a/source/images/supported_brands/hangouts.png b/source/images/supported_brands/hangouts.png new file mode 100644 index 0000000000000000000000000000000000000000..30df744826caa772ffa31b474c00d4157ef87bec GIT binary patch literal 28244 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 e1Q>zyhrs{)!kw1$S$ Date: Mon, 27 Aug 2018 00:23:08 -0700 Subject: [PATCH 06/48] Add TOTP MFA docs (#6089) * Add TOTP MFA docs * Remove configuration options --- .../authentication/multi-factor-auth.markdown | 49 +++++++++++++++++-- .../_docs/authentication/providers.markdown | 8 ++- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown index 751f2010569..fd229645c24 100644 --- a/source/_docs/authentication/multi-factor-auth.markdown +++ b/source/_docs/authentication/multi-factor-auth.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Multi-factor authentication" -description: "Guide on configuring different multi-factor authentication providers." +description: "Guide on configuring different multi-factor authentication modules." date: 2018-08-23 09:40 redirect_from: /components/auth/ sidebar: true @@ -14,6 +14,49 @@ footer: true This is an advanced feature. If misconfigured, you will not be able to access Home Assistant anymore!

-Besides the normal authentication providers, it's also possible to configure multi-factor authentication providers. These authentication providers will require the user to solve a second challenge besides just logging in. The idea is that you ask the user for something they know, their username/password, and something they have, like a time-based authentication token from their phone. +Besides the authentication providers, it's also possible to configure multi-factor authentication modules. These authentication modules will require the user to solve a second challenge besides just logging in. The idea is that you ask the user for something they know, their username/password, and something they have, like a time-based authentication token from their phone. -This feature is currently a work in progress and no configurable multi-factor authentication providers are currently available. +Multi-factor authentication module can be used mixed-match with authentication providers. After normal authentication provider validation, the login flow will ask user for addional challenge if there are multi-factor authentication modules enabled for this user. If more than one mutli-factor authentication module enabled, user can select one of them during the login. + +Multi-factor authentication module has to be enabled for user before it can be used in the login process, user can go to profile page enable it by himself. + +## {% linkable_title Configuring mutli-factor authentication modules %} + +

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

+ +Multi-factor authentication modules are configured in your `configuration.yaml` under the `homeassistant:` block: + +```yaml +homeassistant: + auth_mfa_modules: + - type: totp +``` + +## {% linkable_title Available mutli-factor authentication modules %} + +Below is a list of currently available auth providers. + +### {% linkable_title Time-based One-Time Password mutli-factor authentication module %} + +[Time-based One-Time Password](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm) is widely adopted in modern authencation system, it combines a secret key with the current timestamp using a cryptographic hash function to generate a one-time password. Whoever possessed the secret key will get same one-time password in certain time period. By verifying that password, Home Assistant knows the user have the right secrt key. + +When try to set up TOTP module, a QR code will show up, user can scan it by an authenticator app, or set it up manauly using the code showed in UI. After setup, user need to input a six digit number generate in the autendicator app to verify the setup is good. If the verificaiton keep falling, you need to check whether the clock on Home Asistant is accurate. + +There are several authenctior apps on the market, we recommend either [Google Authenticator](https://support.google.com/accounts/answer/1066447) or [Authy](https://authy.com/) + +

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

+ + +By default one TOTP multi-factor named "Authenticator app" will be auto loaded if no `auth_mfa_modules` config section defined in `configuration.yaml`. + +Example of configuration + +```yaml +homeassistant: + auth_mfa_modules: + - type: totp +``` \ No newline at end of file diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index 1a190543355..a2949c2f557 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -51,9 +51,13 @@ homeassistant: - type: homeassistant ``` -### {% linkable_title Trusted Network %} +### {% linkable_title Trusted Networks %} -With the trusted network auth provider you can whitelist an IP range for which no authentication will be required. The user will be prompted to pick a user to log in as. +With the trusted networks auth provider you can whitelist an IP range for which no authentication will be required. The user will be prompted to pick a user to log in as. + +

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

```yaml homeassistant: From 878194555a6929868b83fa88863c2ccd89551016 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 27 Aug 2018 14:14:50 +0200 Subject: [PATCH 07/48] Add Volkszaehler docs (#6081) --- .../_components/sensor.volkszaehler.markdown | 79 ++++++++++++++++++ .../images/supported_brands/volkszaehler.png | Bin 0 -> 1559 bytes 2 files changed, 79 insertions(+) create mode 100644 source/_components/sensor.volkszaehler.markdown create mode 100644 source/images/supported_brands/volkszaehler.png diff --git a/source/_components/sensor.volkszaehler.markdown b/source/_components/sensor.volkszaehler.markdown new file mode 100644 index 00000000000..ee04e55db80 --- /dev/null +++ b/source/_components/sensor.volkszaehler.markdown @@ -0,0 +1,79 @@ +--- +layout: page +title: "Volkszaehler" +description: "Instructions on how to integrate Volkszaehler sensors into Home Assistant." +date: 2018-08-25 08:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: volkszaehler.png +ha_category: System Monitor +ha_iot_class: "Local Polling" +ha_release: 0.78 +--- + +The `volkszaehler` sensor platform is consuming the system information provided by the [Volkszaehler](https://wiki.volkszaehler.org/) API. + +## {% linkable_title Configuration %} + +To enable the Volkszaehler sensor, add the following lines to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: volkszaehler + uuid: DEVICE_UUID +``` + +{% configuration %} +uuid: + description: The UUID of the device to track. + required: true + type: string +host: + description: The IP address of the host where Volkszaehler is running. + required: false + type: string + default: localhost +port: + description: The port where Volkszaehler is listening. + required: false + type: int + default: 80 +name: + description: The prefix for the sensors. + required: false + type: string + default: Volkszaehler +monitored_conditions: + description: Entries to monitor. + required: false + type: map + default: average + keys: + average: + description: The average power. + consumption: + description: The power consumption. + max: + description: The maximum power. + min: + description: The minimum power. +{% endconfiguration %} + +## {% linkable_title Full examples %} + +```yaml +# Example configuration.yaml entry +sensor: + - platform: volkszaehler + host: demo.volkszaehler.org + uuid: '57acbef0-88a9-11e4-934f-6b0f9ecd95a8' + monitored_conditions: + - average + - consumption + - min + - max +``` + diff --git a/source/images/supported_brands/volkszaehler.png b/source/images/supported_brands/volkszaehler.png new file mode 100644 index 0000000000000000000000000000000000000000..82a6a2a5d1156a0c7c0e87dd694a80806add5afa GIT binary patch literal 1559 zcmZ{kdpOez7{`B`&6wMAn@-0bYn!!W6&A$KR2D3d5o4vB+0 zxrDiADy5X%noBg9gCor)>a0J{ALn_W_x(Qa_kBOl``?>Nc5zgI{{ja9K*8C`;h03x zKT}3pQoX?I$r6DC5=aC9sLhnyq(ddW))}W`BmlUi3jnbR0I(skVrKy$QUcD=0Kl3H z07%yDCvG^&K>G9%M+e}?&$!!CmLqXwSxzS+B-h^mOwa+nf(sH8#&#wVVH03Ac?^j2 zKD`}P0qRK1~sxMo4?Pk8(o_*Tu*ELFX(h?awKxc9FbLPhxypT#=n89cA zSF44aFE18-+xos>)jGa-TNA2fPJ((v?n%|Q$t<{-f@bW^$z&dh&`83|c}wYC?dx|g zZ_}j}Zl7E)b|@P4eGkA$DQ8V``9Z{c1&D|%n z*fJsG>I4QoCfAH3avb-XjwNjDAV-O(kw)zBMafs^{h0etS2qNL2G}$S1mO=DN_%@`AFyv3;bbZ>aJ>*S**>7$hS; zs}{Xa{kcmEteB3f6u>Pg(>%2Z`uE>J@D%wZFJx~WrD|zJ zeQiNW_^Hfbtp)5EBd^eBUQp6D;+IYFRi+)IZDF^Gs%GcoE%3?9`i1#HtP1r(=G8jI zg1%QU?9H#J?n|m@P7=Su=d$PSWxvUpUaG%$uBzCa5eVg0DY4|p?J^-LS|>*pFyt8s$#v#lG*yK7vgXdluU-0_sa zPQXn(*!eZnQdX&5E`s^@ob^98;-RnUV@0Sv%Cu_mR9UKwU-#ofmMitV>4Q%@Y;KjG zuC*U@v0C;HTaovD@`rYivKmXWr~AAR=F&jb6hn=b_?Kl5ZHzF9rL2a${xSbJL@Hs4 zJXpKLcr(%^1h&>oucz2^PhK1E-~Y-k3V|W0CXO(Ds8C|^250q+8Kc=h$N)ZOQw#%% zd#9f%SSc#0;;C7U$J`4&+3b#|g*t-OWTSK$T^~rsL))muRLW>qMg7$D#noP^$|G^# z7PEtG#O;mN!qzYzYSS!Qy2`{?pwbkdXhP(_EfHgJt%Tf}OKmj~#pQ^}7(;iphvz># z3ecb{cpX7>^fPfwayRdU>#UKz+eB3<0=0W|$1VC7R12pM0QI`^ZIVSl)V9UPqhti-^|i*0Y1K}M9=y2;9N%Ltp7}n#k^fo~S+lt> z<<10&(Dm6T zK(UzzovTh)smtVHif|faxoazl&ML+3!aj0nziqae`MA}xCx{fn@n7oqJ1}OeQK4s{ zZRDa+w-=4j&k6>^5y-ts*JVWhnP6y=II`deC=h;OxRj+VC3%v2*hFu(AD!)QeJ0#r zA^;YRF*ihG4Y3$^4A$Dz${LL^Kx3@Y==-?SNB;u^hx(ljxcL9T5Pf7x0sziL7l%I& H(Bl6E_Vl%A literal 0 HcmV?d00001 From b31ed71670ca2c4632dc244bc69c0e27905b535b Mon Sep 17 00:00:00 2001 From: Jonas Karlsson <1937941+endor-force@users.noreply.github.com> Date: Mon, 27 Aug 2018 16:13:30 +0200 Subject: [PATCH 08/48] Added multiple sensor types for Trafikverket - Breaking change in configuration (#6006) Add multiple sensor types for Trafikverket --- ...ensor.trafikverket_weatherstation.markdown | 91 +++++++++++++------ 1 file changed, 65 insertions(+), 26 deletions(-) diff --git a/source/_components/sensor.trafikverket_weatherstation.markdown b/source/_components/sensor.trafikverket_weatherstation.markdown index 272c4e09941..ebbb7724a55 100644 --- a/source/_components/sensor.trafikverket_weatherstation.markdown +++ b/source/_components/sensor.trafikverket_weatherstation.markdown @@ -10,13 +10,15 @@ footer: true logo: trafikverket.png ha_category: Sensor ha_release: 0.66.0 +ha_iot_class: "Cloud Polling" --- -Showing weather information for air and road temperature provided by [Trafikverket](https://www.trafikverket.se/) in Sweden. +Showing weather information provided by [Trafikverket](https://www.trafikverket.se/) weather stations in Sweden. + Potential use cases: -- Get weather data in general -- You live near a weather station and want to know the current temperature at home +- Get weather data in general. +- You live near a weather station and want to know the current weather conditions at home. - Setup automations for your car heating system. If the road is frozen along the way to work, you might want the car heating system to start earlier. ##### {% linkable_title Configuration %} @@ -29,31 +31,48 @@ sensor: name: Trafikverket Road WeatherStation Kungälv api_key: eXXcbXXXacXXXXc39XX3aXXX4aXX46XX station: Kungälv - type: road + monitored_conditions: + - air_temp + - road_temp + - humidity + - precipitation + - wind_direction + - wind_direction_text + - wind_speed ``` {% configuration %} -name: - description: Unique name of the device in the frontend. - required: true +name: + description: Your unique name of the device in the frontend. + required: true type: string -api_key: - description: API key from Trafikverket. - required: true - type: string -station: - description: Name of the weather station. - required: true - type: string -type: - description: Defines which temperature you want (`air` or `road`). - required: true - type: string -scan_interval: - description: How frequently to query for new data (in seconds). - required: false - type: int - default: 300 +api_key: + description: Your personal API key from Trafikverket. + required: true + type: string +station: + description: Name of the weather station from Trafikverket. + required: true + type: string +monitored_conditions: + description: Specify what measurement data to retreive from the weather station. + required: true + type: map + keys: + air_temp: + description: Air temperature. + road_temp: + description: The temperature in the road. + humidity: + description: Relative humidity. + precipitation: + description: Type of precipitation (Swedish text). + wind_direction: + description: Wind direction in degrees. + wind_direction_text: + description: Rough wind direction in twelve variants (Swedish text). + wind_speed: + description: Average wind speed during the last 10 minutes. {% endconfiguration %} ##### {% linkable_title Obtaining API key %} @@ -76,11 +95,31 @@ sensor: name: Trafikverket Road WeatherStation Kungälv api_key: eXXcbXXXacXXXXc39XX3aXXX4aXX46XX station: Kungälv - type: road + monitored_conditions: + - air_temp + - road_temp + - humidity + - precipitation + - wind_direction + - wind_direction_text + - wind_speed - platform: trafikverket_weatherstation name: Trafikverket Air WeatherStation Lanna api_key: eXXcbXXXacXXXXc39XX3aXXX4aXX46XX station: Lanna - type: air + monitored_conditions: + - air_temp + - road_temp + - humidity + scan_interval: 600 + - platform: trafikverket_weatherstation + name: Trafikverket Precipitation WeatherStation Nöbbele + api_key: eXXcbXXXacXXXXc39XX3aXXX4aXX46XX + station: Nöbbele + monitored_conditions: + - air_temp + - road_temp + - humidity + - precipitation scan_interval: 600 ``` From fb55608ffd17de90595b023c56efa4ec3680b35c Mon Sep 17 00:00:00 2001 From: Marcel Hoppe Date: Tue, 28 Aug 2018 00:39:59 +0200 Subject: [PATCH 09/48] rewrite the doc for hangouts with intents instead of commands (#6096) * rewrite the doc for hangouts with intents instead of commands * Typos --- source/_components/hangouts.markdown | 179 ++++++++++++++++----------- 1 file changed, 109 insertions(+), 70 deletions(-) diff --git a/source/_components/hangouts.markdown b/source/_components/hangouts.markdown index ba290e276f1..66340a0e49f 100644 --- a/source/_components/hangouts.markdown +++ b/source/_components/hangouts.markdown @@ -29,98 +29,137 @@ The authentication token will be generated and stored internally. ```yaml # Example configuration.yaml entry hangouts: - commands: - - word: testword + intents: + LivingRoomTemperature: + sentences: + - What is the temperature in the living room conversations: - id: CONVERSATION_ID1 - id: CONVERSATION_ID2 - - expression: "My name is (?P.*)" - name: introduction + error_suppressed_conversations: + - id: CONVERSATION_ID2 + ``` {% configuration %} -commands: - description: "A list of commands that the bot should listen for. If a command is triggered (via its *word* or *expression*, see below), an event is fired that you can handle using automations. Every command consists of these possible configuration options:" +intents: + description: "Intents that the hangouts component should understand." required: false type: map default: empty keys: - word: - description: "Specifies a word that the bot should listen for. If you specify 'my_command' here, the bot will react to any message starting with 'my_command'." - required: false - type: string - expression: - description: "Specifies a regular expression (in python regexp syntax) that the bot should listen to. The bot will react to any message that matches the regular expression." - required: false - type: string - name: - description: "The name of the command. This will be an attribute of the event that is fired when this command triggers." + '``': + description: "Single intent entry." + required: true + type: map + keys: + sentences: + description: "Sentences that should trigger this intent." + required: true + type: list + conversations: + description: "A list of conversations that triggers this intent. If no conversation are given, every conversations triggers the intent." + required: false + type: [map] + default: empty + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" + required: true + type: string +error_suppressed_conversations: + description: "A list of conversations that won't get a message if the intent is not known." + required: false + type: [map] + default: empty + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" required: true type: string - conversations: - description: "A list of conversations that the bot should listen for this command in. If this is not given, all conversations are used." - required: false - type: [map] - default: empty - keys: - id: - description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" - required: true - type: string {% endconfiguration %} The conversations has to be precreated, the conversation id can be obtained from the `hangouts.conversations` entity. Make sure to use quotes around the conversation id or alias to escape special characters (`!`, and `#`) in YAML. -### {% linkable_title Event Data %} - -If a command is triggered, a `hangouts_command` event is fired. The event contains the name of the command in the `command` field. - -If the command is a word command, the `data` field contains a list of the command's arguments, i.e., everything that stood behind the word, split at spaces. If the command is an expression command, the `data` field contains the [group dictionary](https://docs.python.org/3.6/library/re.html?highlight=re#re.match.groupdict) of the regular expression that matched the message. - -There are these additional fields: `conversation_id`, `user_id` and `user_name`. - -### {% linkable_title Comprehensive Configuration Example %} +## {% linkable_title Adding sentences %} ```yaml # The Hangouts component hangouts: - commands: - - word: testword + intents: + HassLightSet: + sentences: + - Toggle {name}. conversations: - - name: "someothertest" - - expression: "My name is (?P.*)" - name: introduction + - id: CONVERSATION_ID1 + Ping: + sentences: + - How many Conversation do you know + error_suppressed_conversations: + - id: CONVERSATION_ID2 -automation: - - alias: 'React to !testword' - trigger: - platform: event - event_type: hangouts_command - event_data: - command: testword - action: - service: hangouts.send_message - data_template: - target: - - name: "hasstest" - message: - - text: 'It looks like you wrote testword' - - alias: 'React to an introduction' - trigger: - platform: event - event_type: hangouts_command - event_data: - command: introduction - action: - service: hangouts.send_message - data_template: - target: - - id: '{{ trigger.event.data.conversation_id}}' - message: - - text: "Hello {{ trigger.event.data.data.name }}" +intent_script: + Ping: + speech: + text: I know {% raw %}{{ states.hangouts.conversations.state }}{% endraw %} conversations ``` This configuration will: -- Listen for "testword" in the room "someothertest" (and only) there. - If such a message is encountered, it will answer with "It looks like you wrote testword" into the "hasstest" conversation. -- Listen in all conversations for any message matching "My name is (any name)" and answer with "Hello (the given name)" into the same conversation. +- Toggle the light in the given location in a specific conversation. +- Return the conversations the bot know. + +## {% linkable_title Adding advanced custom sentences %} + +Sentences can contain slots (marked with curly braces: `{name}`) and optional words (marked with square brackets: `[the]`). The values of slots will be passed on to the intent and are available inside the templates. + +The following configuration can handle the following sentences: + + - Change the lights to red + - Change the lights to green + - Change the lights to blue + - Change the lights to the color red + - Change the lights to the color green + - Change the lights to the color blue + +```yaml +# Example configuration.yaml entry +hangouts: + intents: + ColorLight: + sentences: + - Change the lights to [the color] {color} +{% raw %} +intent_script: + ColorLight: + speech: + text: Changed the lights to {{ color }}. + action: + service: light.turn_on + data_template: + rgb_color: + - "{% if color == 'red' %}255{% else %}0{% endif %}" + - "{% if color == 'green' %}255{% else %}0{% endif %}" + - "{% if color == 'blue' %}255{% else %}0{% endif %}" +{% endraw %} +``` + +## {% linkable_title Services %} + +### {% linkable_title Service `hangouts.update` %} + +Updates the list of conversations. + +| Service data attribute | Optional | Description | +|------------------------|----------|--------------------------------------------------| +| | | | + +### {% linkable_title Service `hangouts.send_message` %} + +Sends a message to the given conversations. + +| Service data attribute | Optional | Description | +|------------------------|----------|--------------------------------------------------| +| target | List of targets with id or name. [Required] | [{"id": "UgxrXzVrARmjx_C6AZx4AaABAagBo-6UCw"}, {"name": "Test Conversation"}] | +| message | List of message segments, only the "text" field is required in every segment. [Required] | [{"text":"test", "is_bold": false, "is_italic": false, "is_strikethrough": false, "is_underline": false, "parse_str": false, "link_target": "http://google.com"}, ...] | + + From 7a258cf3a8ef5369e438d02ac3747a3a19213b8a Mon Sep 17 00:00:00 2001 From: Marcel Hoppe Date: Wed, 29 Aug 2018 10:57:15 +0200 Subject: [PATCH 10/48] Update hangouts.markdown (#6105) * Update hangouts.markdown Add an important hint for captchas and a best practice for using a second google account as bot. * typo --- source/_components/hangouts.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/hangouts.markdown b/source/_components/hangouts.markdown index 66340a0e49f..5400f81ecd0 100644 --- a/source/_components/hangouts.markdown +++ b/source/_components/hangouts.markdown @@ -22,8 +22,12 @@ Fill the form: * Your **Google Mail Address** and **Password** * If needed, you will be asked for a 2-factor authorization token +**BEST PRACTICE:** You can't write messages to yourself or get notifications in a group, if "you" write the message. The best way is to create a own google account for your hangouts bot. + **IMPORTANT:** If you secured your account with 2 factor authorization: Only verification by app or SMS are supported. There is no support for verification by prompt on your phone. +**IMPORTANT 2:** If you are sure your email and password is correct, but the component says the login is invalid. Wait a few hours and try it again, it might be, that google asks for a captcha which we can't support. Google official don't support bots at hangouts, that's why we have to work around this. + The authentication token will be generated and stored internally. ```yaml From 99f9466fba728c0a8bd004e5425e605692a2f41c Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Wed, 29 Aug 2018 02:58:39 -0700 Subject: [PATCH 11/48] Fix a link (#6106) --- source/_docs/authentication/providers.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index a2949c2f557..aa1508255d7 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -56,7 +56,7 @@ homeassistant: With the trusted networks auth provider you can whitelist an IP range for which no authentication will be required. The user will be prompted to pick a user to log in as.

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

```yaml From d20ed0c81e2b87eec956e631949c1f478fb476a1 Mon Sep 17 00:00:00 2001 From: Malte Franken Date: Thu, 30 Aug 2018 23:26:51 +1000 Subject: [PATCH 12/48] introduction to new geo location component with demo platform (#6094) --- source/_components/demo.markdown | 1 + source/_components/geo_location.markdown | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 source/_components/geo_location.markdown diff --git a/source/_components/demo.markdown b/source/_components/demo.markdown index f1c25737208..5f25f13646c 100644 --- a/source/_components/demo.markdown +++ b/source/_components/demo.markdown @@ -22,6 +22,7 @@ Available demo platforms: - [Climate](/components/climate/) (`climate`) - [Cover](/components/cover/) (`cover`) - [Fan](/components/fan/) (`fan`) +- [Geo Location](/components/geo_location/) (`geo_location`) - [Image Processing](/components/image_processing/) (`image_processing`) - [Light](/components/light/) (`light`) - [Lock](/components/lock/) (`lock`) diff --git a/source/_components/geo_location.markdown b/source/_components/geo_location.markdown new file mode 100644 index 00000000000..2990c019514 --- /dev/null +++ b/source/_components/geo_location.markdown @@ -0,0 +1,16 @@ +--- +layout: page +title: "Geo Location" +description: "Instructions on how to integrate geo location aware platforms into Home Assistant." +date: 2018-08-27 08:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Other +ha_release: "0.78" +--- + +Geo Location aware entities are typically related to events in the real world in the vicinity of Home Assistant's location, like for example weather events, bush fires or earthquakes. + +Entities can have associated geo location coordinates (latitude and longitude) so that they are displayed on the map. The distance from the entity's coordinates to Home Assistant's location can be used for filtering. From bf00119cfa076c86506ffb16fa8fe4532fc7424d Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Sat, 1 Sep 2018 09:34:02 +0200 Subject: [PATCH 13/48] deCONZ - documentation for new refresh device service --- source/_components/deconz.markdown | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/source/_components/deconz.markdown b/source/_components/deconz.markdown index ae079650aef..4ca7b31935c 100644 --- a/source/_components/deconz.markdown +++ b/source/_components/deconz.markdown @@ -29,7 +29,7 @@ See [deCONZ wiki](https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/ Home Assistant will automatically discover deCONZ presence on your network, if `discovery:` is present in your `configuration.yaml` file. -If you don't have the API key, you can generate an API key for deCONZ by using the one-click functionality similar to Philips Hue. Go to **Menu** -> **Settings** -> **Unlock Gateway** in deCONZ and then use the deCONZ configurator in Home Assistant frontend to create an API key. When you're done setting up deCONZ it will be stored as a config entry. +If you don't have the API key, you can generate an API key for deCONZ by using the one-click functionality similar to Philips Hue. Go to **Settings** -> **Gateway** -> **Advanced** -> **Authenticate app** in deCONZ and then use the deCONZ configurator in Home Assistant frontend to create an API key. When you're done setting up deCONZ it will be stored as a config entry. You can add the following to your configuration.yaml file if you are not using the `discovery:` component: @@ -79,11 +79,11 @@ logger: ## {% linkable_title Device services %} -Available services: `configure`. +Available services: `configure` and `deconz.refresh_devices`. #### {% linkable_title Service `deconz.configure` %} -Set attribute of device in Deconz using [Rest API](http://dresden-elektronik.github.io/deconz-rest-doc/rest/). +Set attribute of device in deCONZ using [Rest API](http://dresden-elektronik.github.io/deconz-rest-doc/rest/). | Service data attribute | Optional | Description | |-----------|----------|-------------| @@ -99,9 +99,13 @@ Field and entity are exclusive, i.e you can only use one in a request. { "field": "/config", "data": {"permitjoin": 60} } +#### {% linkable_title Service `deconz.refresh_devices` %} + +Refresh with devices added to deCONZ after Home Assistants latest restart. + ## {% linkable_title Remote control devices %} -Remote controls (ZHASwitch category) will be not be exposed as a regular entity, but as events named 'deconz_event' with a payload of 'id' and 'event'. Id will be the device name from deCONZ and Event will be the momentary state of the switch. However, a sensor entity will be created that shows the battery level of the switch as reported by deCONZ, named sensor.device_name_battery_level. +Remote controls (ZHASwitch category) will be not be exposed as regular entities, but as events named `deconz_event` with a payload of `id` and `event`. Id will be the device name from deCONZ and Event will be the momentary state of the switch. However, a sensor entity will be created that shows the battery level of the switch as reported by deCONZ, named sensor.device_name_battery_level. Typical values for switches, the event codes are 4 numbers where the first and last number are of interest here. From 4ae009940d44dacc0bf70fb5b40dd26317491477 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Sat, 1 Sep 2018 09:37:29 +0200 Subject: [PATCH 14/48] Update deconz.markdown --- source/_components/deconz.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_components/deconz.markdown b/source/_components/deconz.markdown index 4ca7b31935c..5d17fde193f 100644 --- a/source/_components/deconz.markdown +++ b/source/_components/deconz.markdown @@ -88,7 +88,7 @@ Set attribute of device in deCONZ using [Rest API](http://dresden-elektronik.git | Service data attribute | Optional | Description | |-----------|----------|-------------| | `field` | No | String representing a specific device in deCONZ. | -| `entity` | No | String representing a specific HASS entity of a device in deCONZ. | +| `entity` | No | String representing a specific Home Assistant entity of a device in deCONZ. | | `data` | No | Data is a JSON object with what data you want to alter. | Field and entity are exclusive, i.e you can only use one in a request. @@ -103,6 +103,8 @@ Field and entity are exclusive, i.e you can only use one in a request. Refresh with devices added to deCONZ after Home Assistants latest restart. +Note: deCONZ automatically signals Home Assistant when new sensors are added, but other devices must at this point in time (deCONZ v2.05.35) be added manually using this service or a restart of Home Assistant. + ## {% linkable_title Remote control devices %} Remote controls (ZHASwitch category) will be not be exposed as regular entities, but as events named `deconz_event` with a payload of `id` and `event`. Id will be the device name from deCONZ and Event will be the momentary state of the switch. However, a sensor entity will be created that shows the battery level of the switch as reported by deCONZ, named sensor.device_name_battery_level. From 968783c45ce5acb852b60c364391b49a625bcf22 Mon Sep 17 00:00:00 2001 From: Tom Harris Date: Sat, 1 Sep 2018 14:47:39 -0400 Subject: [PATCH 15/48] Add Cover platform to Insteon component (#6090) * Add Cover platform to Insteon Component * Fix reference to insteon component * Update .gitignore Remove VS pro file * Update cover.insteon.markdown Change version to 0.78 --- source/_components/cover.insteon.markdown | 22 ++++++++++++++++++++++ source/_components/insteon_local.markdown | 4 ++-- source/_components/insteon_plm.markdown | 5 ++--- 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 source/_components/cover.insteon.markdown diff --git a/source/_components/cover.insteon.markdown b/source/_components/cover.insteon.markdown new file mode 100644 index 00000000000..568e671a6ca --- /dev/null +++ b/source/_components/cover.insteon.markdown @@ -0,0 +1,22 @@ +--- +layout: page +title: "Insteon Cover" +description: "Instructions on how to setup the Insteon cover locally within Home Assistant." +date: 2018-08-20 16:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: Cover +ha_iot_class: "Local Push" +ha_version: 0.78 +--- + +The `insteon` cover platform lets you control your [Open/Close Micro Module] +through an INSTEON Modem (PLM and Hub) device connected directly to your system +on a USB, serial port or TCPIP connection. To add support, set up the primary +[insteon] component. + +[insteon]: /components/insteon/ +[Open/Close Micro Module]: https://www.insteon.com/open-close-micro-module/ diff --git a/source/_components/insteon_local.markdown b/source/_components/insteon_local.markdown index 513e640778c..c79b46b2e4e 100644 --- a/source/_components/insteon_local.markdown +++ b/source/_components/insteon_local.markdown @@ -13,6 +13,6 @@ ha_iot_class: "Local Polling" ha_version: 0.36 --- -The `insteon_local` component is depreciated and has been replaced by the [Insteon] component. +The `insteon_local` component is depreciated and has been replaced by the [insteon] component. -[Insteon] /component/insteon +[insteon]: /component/insteon diff --git a/source/_components/insteon_plm.markdown b/source/_components/insteon_plm.markdown index b438d90e4fd..bed0e71ccb6 100644 --- a/source/_components/insteon_plm.markdown +++ b/source/_components/insteon_plm.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Local Push" ha_version: 0.39 --- -The `insteon_plm` component is depreciated and has been replaced by the [Insteon] component. - -[Insteon] /component/insteon +The `insteon_plm` component is depreciated and has been replaced by the [insteon] component. +[insteon]: /component/insteon From 6f413c66dcefc42a91f168e46073ff24a5e6c341 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Sat, 1 Sep 2018 23:37:24 +0200 Subject: [PATCH 16/48] Add unique_id (#6121) --- source/_components/light.mqtt.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/light.mqtt.markdown b/source/_components/light.mqtt.markdown index e92f859fb7c..b7ca1ff13a5 100644 --- a/source/_components/light.mqtt.markdown +++ b/source/_components/light.mqtt.markdown @@ -35,6 +35,10 @@ name: required: false type: string default: MQTT Light +unique_id: + description: An ID that uniquely identifies this light. If two lights have the same unique ID, Home Assistant will raise an exception. + required: false + type: string command_topic: description: The MQTT topic to publish commands to change the switch state. required: true From 4611a4349d6d9e34485e8f915210a06cecad566a Mon Sep 17 00:00:00 2001 From: Censored3 Date: Sat, 1 Sep 2018 23:54:46 +0200 Subject: [PATCH 17/48] Update addon/git_pull for PR home-assistant/hassio-addons#386 (#6073) --- source/_addons/git_pull.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_addons/git_pull.markdown b/source/_addons/git_pull.markdown index 8cb2c3a852b..9bfc6f8cca2 100644 --- a/source/_addons/git_pull.markdown +++ b/source/_addons/git_pull.markdown @@ -18,6 +18,7 @@ Load and update configuration files for Home Assistant from a [Git](https://git- "git_branch": "master", "git_command": "pull", "git_remote": "origin", + "git_prune": "false", "repeat": { "active": false, "interval": 300 @@ -38,8 +39,9 @@ Load and update configuration files for Home Assistant from a [Git](https://git- ``` - **repository** (*Required*): Git URL to your repository (make sure to use double quotes). You have to add `.git` to your GitHub repository URL (see example configuration) -- **git_branch** (*Required*): Branch name of the Git repo, leave this as 'master' if you are unsure. +- **git_branch** (*Required*): Branch name of the Git repo. If left empty, the currently checked out branch will be updated. Leave this as 'master' if you are unsure. - **git_remote** (*Required*): Name of the tracked repository. Leave this as `origin` if you are unsure. +- **git_prune** (*Required*): If set to true, the add-on will cleanup branches that are deleted on the remote repository, but still have cached entries on the local machine. Leave this as `false` if you are unsure. - **git_command** (*Required*): Must be either `pull` or `reset`. Leave this as `pull` if you are unsure. * **pull**: Incorporates changes from a remote repository into the current branch. Will preserve any local changes to tracked files. From 377fa82b8e9d5434f445319395580dcbbb0be9bb Mon Sep 17 00:00:00 2001 From: Jesse Rizzo <32472573+jesserizzo@users.noreply.github.com> Date: Sat, 1 Sep 2018 17:08:49 -0500 Subject: [PATCH 18/48] IP address is no longer required for Enphase Envoy component (#6088) * IP address is no longer required * Change keys in monitored conditions from '7_days' to 'seven_days' * Minor changes --- .../_components/sensor.enphase_envoy.markdown | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/source/_components/sensor.enphase_envoy.markdown b/source/_components/sensor.enphase_envoy.markdown index fb04d906ed4..ec6d8002162 100644 --- a/source/_components/sensor.enphase_envoy.markdown +++ b/source/_components/sensor.enphase_envoy.markdown @@ -23,33 +23,44 @@ To enable this sensor, add the following lines to your `configuration.yaml` file # Example configuration.yaml entry sensor: - platform: enphase_envoy - ip_address: ENVOY_LOCAL_IP_ADDRESS +``` + +```yaml +# Example configuration.yaml entry +sensor: + - platform: enphase_envoy + ip_address: LOCAL_IP_FOR_ENVOY + monitored_conditions: + - production + - consumption + - lifetime_production + - lifetime_consumption ``` {% configuration %} ip_address: - description: The local IP Address of your Envoy - required: true + description: The local IP Address of your Envoy. Leave blank to search for it, but this may not always be reliable. + required: false type: string monitored_conditions: - description: The list of conditions to monitor + description: The list of conditions to monitor. required: false type: list keys: production: - description: The power in W being produced by the solar panels + description: The power in W being produced by the solar panels. daily_production: - description: The energy in Wh produced that day - 7_days_production: - description: The energy in Wh produced the last 7 days + description: The energy in Wh produced that day. + seven_days_production: + description: The energy in Wh produced the last 7 days. lifetime_production: - description: The energy in Wh produced in the lifetime of the Envoy + description: The energy in Wh produced in the lifetime of the Envoy. consumption: - description: The power in W being consumed in the whole house + description: The power in W being consumed in the whole house. daily_consumption: - description: The energy in Wh consumed that day - 7_days_consumption: - description: The energy in Wh consumed the last 7 days + description: The energy in Wh consumed that day. + seven_days_consumption: + description: The energy in Wh consumed the last 7 days. lifetime_consumption: - description: The energy in Wh consumed in the lifetime of the Envoy + description: The energy in Wh consumed in the lifetime of the Envoy. {% endconfiguration %} From 1b6a78baca6187145b8750e5ee82a5af15914f67 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 2 Sep 2018 00:38:58 +0200 Subject: [PATCH 19/48] Tschmidty69 patch 2 (#6141) * Added session_id and slotname_raw values. * Added session_id and slotname_raw values (#6078) * Added session_id and slotname_raw values * Minor changes --- source/_components/snips.markdown | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/source/_components/snips.markdown b/source/_components/snips.markdown index f69b7f0b138..afe3d1f7e0a 100644 --- a/source/_components/snips.markdown +++ b/source/_components/snips.markdown @@ -38,17 +38,17 @@ $ sudo apt-get update $ sudo apt-get install -y snips-platform-voice ``` -Note: if the keyserver pgp.mit.edu is down try to use another one in the 4th line , like pgp.surfnet.nl: +Note that if the keyserver pgp.mit.edu is down then try to use another one in the 4th line, like pgp.surfnet.nl: ```bash -sudo apt-key adv --keyserver pgp.surfnet.nl --recv-keys D4F50CDCA10A2849 +$ sudo apt-key adv --keyserver pgp.surfnet.nl --recv-keys D4F50CDCA10A2849 ``` ### {% linkable_title Creating an assistant %} Head over to the [Snips Console](https://console.snips.ai) to create your assistant. Launch the training and download by clicking on the "Download Assistant" button. -The next step is to get the assistant to work on your device. Unzip and copy the assistant folder that you downloaded from the web console to the path. Assuming your downloaded assistant folder is on your desktop, just run: +The next step is to get the assistant to work on your device. Unzip and copy the `assistant` folder that you downloaded from the web console to the path. Assuming your downloaded `assistant` folder is on your desktop, just run: ```bash $ scp -r ~/Desktop/assistant pi@:/home/pi/. @@ -68,7 +68,7 @@ Then, move the assistant to the right folder: (pi) $ sudo mv /home/pi/assistant /usr/share/snips/assistant ``` -Note: if you already have an assistant installed and wish to replace it, start by removing the previous one, and then move the new one in its place: +Note that if you already have an assistant installed and wish to replace it then start by removing the previous one and then move the new one in its place: ```bash (pi) $ sudo rm -r /usr/share/snips/assistant @@ -161,22 +161,28 @@ In the `data_template` block, we have access to special variables, corresponding ### {% linkable_title Special slots %} -Two special values for slots are populated with the siteId the intent originated from and the probability value for the intent. +Several special values for slots are populated with the `siteId `the intent originated from and the probability value for the intent, the `sessionId` generate by the dialogue manager, and `slote_name` raw which will contain the raw, uninterpreted text of the slot value. -In the above example, the slots are plain strings. However, snips has a duration builtin value used for setting timers and this will be parsed to a seconds value. +In the above example, the slots are plain strings. However, Snips has a duration builtin value used for setting timers and this will be parsed to a seconds value. + +In this example if we had an intent triggered with 'Set a timer for five minutes', `duration:` would equal 300 and `duration_raw:` would be set to 'five minutes'. The duration can be easily used to trigger Home Assistant events and the `duration_raw:` could be used to send a human readable response or alert. + +In this example if we had an intent triggered with 'Set a timer for five minutes', duration would equal 300 and duration_raw would be set to 'five minutes'. The duration can be easily used to trigger HA events, and the duration_raw could be used to send a human readable response or alert. {% raw %} ```yaml SetTimer: speech: type: plain - text: weather + text: 'Set a timer' action: service: script.set_timer data_template: name: "{{ timer_name }}" duration: "{{ timer_duration }}" siteId: "{{ site_id }}" + sessionId: "{{ session_id }}" + duration_raw: "{{ raw_value }}" probability: "{{ probability }}" ``` {% endraw %} @@ -185,7 +191,7 @@ SetTimer: ### {% linkable_title Sending TTS Notifications %} -You can send TTS notifications to Snips using the snips.say and snips.say_action services. Say_action starts a session and waits for user response, "Would you like me to close the garage door?", "Yes, close the garage door". +You can send TTS notifications to Snips using the `snips.say` and `snips.say_action` services. `say_action` starts a session and waits for user response, "Would you like me to close the garage door?", "Yes, close the garage door". #### {% linkable_title Service `snips.say` %} @@ -240,9 +246,7 @@ intent_script: ##### {% linkable_title Intiating a query %} -Here is a more complex example. The automation is triggered if the garage door is open for more than 10 minutes. -Snips will then ask you if you want to close it and if you respond with something like "Close the garage door" it -will do so. Unfortunately there is no builtin support for yes and no responses. +Here is a more complex example. The automation is triggered if the garage door is open for more than 10 minutes. Snips will then ask you if you want to close it and if you respond with something like "Close the garage door" it will do so. Unfortunately there is no builtin support for yes and no responses. ```yaml automation: From ba46f2e850f4dedf63911095012ce044761cc0bb Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 2 Sep 2018 15:51:29 +0200 Subject: [PATCH 20/48] Update APCUPSd docs (#6159) --- source/_components/apcupsd.markdown | 18 ++++++-- .../binary_sensor.apcupsd.markdown | 12 +++-- source/_components/sensor.apcupsd.markdown | 44 ++----------------- 3 files changed, 27 insertions(+), 47 deletions(-) diff --git a/source/_components/apcupsd.markdown b/source/_components/apcupsd.markdown index fd25d00d0d5..ff6f732484e 100644 --- a/source/_components/apcupsd.markdown +++ b/source/_components/apcupsd.markdown @@ -14,6 +14,8 @@ ha_release: 0.13 [APCUPSd](http://www.apcupsd.org/) status information can be integrated into Home Assistant when the Network Information Server (NIS) [is configured](http://www.apcupsd.org/manual/manual.html#nis-server-client-configuration-using-the-net-driver) is enabled on the APC device. +## {% linkable_title Configuration %} + To enable this sensor, add the following lines to your `configuration.yaml`: ```yaml @@ -21,8 +23,16 @@ To enable this sensor, add the following lines to your `configuration.yaml`: apcupsd: ``` -Configuration variables: - -- **host** (*Optional*): The hostname/IP address on which the APCUPSd NIS is being served. Defaults to `localhost`. -- **port** (*Optional*): The port on which the APCUPSd NIS is listening. Defaults to `3551`. +{% configuration %} +host: + description: The hostname/IP address on which the APCUPSd NIS is being served. + required: false + type: string + default: localhost +port: + description: The port on which the APCUPSd NIS is listening. + required: false + type: int + default: 3551 +{% endconfiguration %} diff --git a/source/_components/binary_sensor.apcupsd.markdown b/source/_components/binary_sensor.apcupsd.markdown index 6c599b75b15..30a124785a2 100644 --- a/source/_components/binary_sensor.apcupsd.markdown +++ b/source/_components/binary_sensor.apcupsd.markdown @@ -15,6 +15,8 @@ ha_iot_class: "Local Polling" In addition to the [APCUPSd Sensor](/components/sensor.apcupsd/) devices, you may also create a device which is simply "on" when the UPS status is online and "off" at all other times. +## {% linkable_title Configuration %} + To enable this sensor, you first have to set up [apcupsd](/components/apcupsd/), and add the following lines to your `configuration.yaml` file: ```yaml @@ -23,6 +25,10 @@ binary_sensor: - platform: apcupsd ``` -Configuration variables: - -- **name** (*Optional*): Name to use in the front end. +{% configuration %} +name: + description: Name to use in the frontend. + required: false + type: string + default: UPS Online Status +{% endconfiguration %} diff --git a/source/_components/sensor.apcupsd.markdown b/source/_components/sensor.apcupsd.markdown index 54db50e7520..bfaf33769b6 100644 --- a/source/_components/sensor.apcupsd.markdown +++ b/source/_components/sensor.apcupsd.markdown @@ -15,6 +15,8 @@ ha_iot_class: "Local Polling" The `apcupsd` sensor platform allows you to monitor a UPS (battery backup) by using data from the [apcaccess](http://linux.die.net/man/8/apcaccess) command. +## {% linkable_title Configuration %} + To use this sensor platform, you first have to set up [apcupsd](/components/apcupsd/), and add the following to your `configuration.yaml` file: ```yaml @@ -24,14 +26,6 @@ sensor: resources: - bcharge - linev - - loadpct - - nominv - - nompower - - numxfers - - outputv - - status - - timeleft - - tonbatt ``` Configuration variables: @@ -64,37 +58,7 @@ MAXTIME : 0 Seconds MAXLINEV : 249.6 Volts MINLINEV : 244.4 Volts OUTPUTV : 218.4 Volts -SENSE : High -DWAKE : 0 Seconds -DSHUTD : 180 Seconds -DLOWBATT : 2 Minutes -LOTRANS : 196.0 Volts -HITRANS : 253.0 Volts -RETPCT : 15.0 Percent -ITEMP : 30.6 C -ALARMDEL : Low Battery -BATTV : 27.6 Volts -LINEFREQ : 50.0 Hz -LASTXFER : High line voltage -NUMXFERS : 0 -TONBATT : 0 Seconds -CUMONBATT: 0 Seconds -XOFFBATT : N/A -SELFTEST : NO -STESTI : 336 -STATFLAG : 0x0500000A -DIPSW : 0x00 -REG1 : 0x00 -REG2 : 0x00 -REG3 : 0x00 -MANDATE : 07/13/99 -SERIALNO : GS9888761008 -BATTDATE : 13/11/15 -NOMOUTV : 230 Volts -NOMBATTV : 24.0 Volts -EXTBATTS : 0 -FIRMWARE : 70.11.I -END APC : 2016-02-09 17:13:46 +0000 +[...] ``` Use the (case insensitive) values from the left hand column: @@ -105,5 +69,5 @@ sensor: resources: - linev - loadpct - - itemp + - timeleft ``` From 27a53313ca2298b97cec1d5c5ddb3f1e387b310f Mon Sep 17 00:00:00 2001 From: Totoo Date: Sun, 2 Sep 2018 19:14:45 +0200 Subject: [PATCH 21/48] Added image attachment example for discord component (#6135) * Added image attachment to example * Minor addition --- source/_components/notify.discord.markdown | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/_components/notify.discord.markdown b/source/_components/notify.discord.markdown index 01029fb4b1c..16c82bbfc1f 100644 --- a/source/_components/notify.discord.markdown +++ b/source/_components/notify.discord.markdown @@ -35,7 +35,7 @@ Configuration variables: ### {% linkable_title Setting up the bot %} -Bots can only send messages to servers. To add the bot to a server you are an admin on, get the details of the bot from the [Discord My Apps page](https://discordapp.com/developers/applications/me). +Bots can only send messages to servers or attach local available images. To add the bot to a server you are an admin on, get the details of the bot from the [Discord My Apps page](https://discordapp.com/developers/applications/me).

@@ -69,7 +69,12 @@ This channel ID has to be used as the target when calling the notification servi "target": [ "1234567890", "0987654321" - ] + ], + "data": { + "images": [ + "/tmp/garage_cam.jpg" + ] + } } ``` From 95102edbd41ec311aa63096538bd9a2656a52fe3 Mon Sep 17 00:00:00 2001 From: Wim Haanstra Date: Sun, 2 Sep 2018 22:20:26 +0200 Subject: [PATCH 22/48] Ritassist dependency update to 0.9.2 (#6038) * Ritassist dependency update to 0.9.2 * Try #1, Fix table rendering * Removed double line --- source/_components/device_tracker.ritassist.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_components/device_tracker.ritassist.markdown b/source/_components/device_tracker.ritassist.markdown index e8f170f2026..255d17fe79a 100644 --- a/source/_components/device_tracker.ritassist.markdown +++ b/source/_components/device_tracker.ritassist.markdown @@ -78,5 +78,8 @@ See the [device tracker component page](/components/device_tracker/) for instruc | coolant_temperature | Temperature of the coolant [1] | | power_voltage | Power voltage measured by the hardware [1] | | distance_from_home | How far is your vehicle located from your Home Assistant Home location | +| current_max_speed | The maximum speed on the road the device is currently on (if available) | +| current_address | Object with address information the device is currently on. This resolves to the closest address to the coordinates of the device. | -[1] Only available on certain cars and hardware revisions. + +[1] Only available on certain cars and hardware revisions. \ No newline at end of file From 2c1fdc2cd86e620e6109b5b14d8586cf3b240fad Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 5 Sep 2018 12:54:48 +0200 Subject: [PATCH 23/48] Add title --- source/_components/binary_sensor.knx.markdown | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/source/_components/binary_sensor.knx.markdown b/source/_components/binary_sensor.knx.markdown index d51c9effbb4..6f5ff097906 100644 --- a/source/_components/binary_sensor.knx.markdown +++ b/source/_components/binary_sensor.knx.markdown @@ -15,26 +15,24 @@ ha_iot_class: "Local Polling" The `knx` sensor platform allows you to monitor [KNX](http://www.knx.org) binary sensors. +## {% linkable_title Configuration %} + The `knx` component must be configured correctly, see [KNX Component](/components/knx). ```yaml # Example configuration.yaml entry binary_sensor: - platform: knx - name: "Entrance.Motion.Sensor" address: '6/0/2' - device_class: 'motion' - #significant_bit: 2 - #reset_after: 100 ``` Configuration variables: +- **address** (*Required*): KNX group address of the binary sensor. - **name** (*Optional*): A name for this device used within Home Assistant. -- **address**: KNX group address of the binary sensor. -- **device_class** (Optional): HASS device class e.g., "motion". -- **significant_bit** (Optional): Specify which significant bit of the KNX value should be used. Default is 1. -- **reset_after** (Optional): Reset back to OFF state after specified milliseconds. +- **device_class** (*Optional*): HASS device class e.g., "motion". +- **significant_bit** (*Optional*): Specify which significant bit of the KNX value should be used. Default is 1. +- **reset_after** (*Optional*): Reset back to OFF state after specified milliseconds. You can also attach actions to binary sensors (e.g., to switch on a light when a switch was pressed). In this example, one light is switched on when the button was pressed once and two others when the button was pressed a second time. From 0192766d3bc08e9eec6d4e8391b5bbeb2c418772 Mon Sep 17 00:00:00 2001 From: Paul Annekov Date: Thu, 6 Sep 2018 08:06:02 +0300 Subject: [PATCH 24/48] Update Miflora documentation (#6163) * Update sensor.miflora.markdown * removed scan_interval from parameters list, added to note --- source/_components/sensor.miflora.markdown | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source/_components/sensor.miflora.markdown b/source/_components/sensor.miflora.markdown index 92d2a4ea4fd..0e82f9a6e32 100644 --- a/source/_components/sensor.miflora.markdown +++ b/source/_components/sensor.miflora.markdown @@ -70,13 +70,10 @@ sensor: - **name** (*Optional*): The name displayed in the frontend. - **force_update** (*Optional*): Sends update events even if the value hasn't changed. - **median** (*Optional*): Sometimes the sensor measurements show spikes. Using this parameter, the poller will report the median of the last 3 (you can also use larger values) measurements. This filters out single spikes. Median: 5 will also filter double spikes. If you never have problems with spikes, `median: 1` will work fine. -- **timeout** (*Optional*): Define the timeout value in seconds when polling (defaults to 10 if not defined) -- **retries** (*Optional*): Define the number of retries when polling (defaults to 2 if not defined) -- **cache_value** (*Optional*): Define cache expiration value in seconds (defaults to 1200 if not defined) - **adapter** (*Optional*): Define the Bluetooth adapter to use (defaults to hci0). Run `hciconfig` to get a list of available adapters.

-By default the sensor is only polled once every 20 minutes. So, if you set `median: 3` it will take _at least_ 40 minutes before the sensor will report a value after a Home Assistant restart. Since the values usually change very slowly, this usually isn't a big problem. Keep in mind though that reducing polling intervals will have a negative effect on the battery life. +By default the sensor is only polled once every 20 minutes (`scan_interval` is 1200 seconds by default). On a Home Assistant restart sensor will report initial value. If you set `median: 3`, it will take _at least_ 40 minutes before the sensor will report an average value. Keep in mind though that reducing polling intervals will have a negative effect on the battery life.

A full configuration example could look like the one below: From 4ef8be77ce945f70dc1874f3239fa66bfce3273b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Thu, 6 Sep 2018 11:17:31 +0200 Subject: [PATCH 25/48] Create switch.switchbot.markdown (#6186) * Create switch.switchbot.markdown * Add files via upload --- source/_components/switch.switchbot.markdown | 35 +++++++++++++++++++ source/images/supported_brands/switchbot.png | Bin 0 -> 28540 bytes 2 files changed, 35 insertions(+) create mode 100644 source/_components/switch.switchbot.markdown create mode 100644 source/images/supported_brands/switchbot.png diff --git a/source/_components/switch.switchbot.markdown b/source/_components/switch.switchbot.markdown new file mode 100644 index 00000000000..3eca50f1113 --- /dev/null +++ b/source/_components/switch.switchbot.markdown @@ -0,0 +1,35 @@ +--- +layout: page +title: "Switchbot" +description: "Instructions on how to set up Switchmate switches." +date: 2018-09-03 22:41 +sidebar: true +comments: false +sharing: true +footer: true +logo: switchbot.png +ha_category: Switch +ha_release: 0.78 +ha_iot_class: "Local Polling" +--- + +This `Switchbot` switch platform allow you to control Switchbot [devices]( https://www.switch-bot.com/). + +To enable it, add the following lines to your `configuration.yaml`: + +```yaml +switch: + - platform: switchbot + mac: 'cb:25:0b......' +``` + +{% configuration %} +mac: + description: Device MAC address. + required: true + type: string +name: + description: The name used to display the switch in the frontend. + required: false + type: string +{% endconfiguration %} diff --git a/source/images/supported_brands/switchbot.png b/source/images/supported_brands/switchbot.png new file mode 100644 index 0000000000000000000000000000000000000000..da31c5feb002fbe93c134b29efcb889d067c4386 GIT binary patch literal 28540 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

^@tVWk0P0d;X_w(6A|J}9 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 Date: Thu, 6 Sep 2018 13:53:53 +0100 Subject: [PATCH 26/48] Update sensor.twitch.markdown (#6201) * Update sensor.twitch.markdown * Add setup instructions --- source/_components/sensor.twitch.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/_components/sensor.twitch.markdown b/source/_components/sensor.twitch.markdown index d1265c1b1d5..660488a7675 100644 --- a/source/_components/sensor.twitch.markdown +++ b/source/_components/sensor.twitch.markdown @@ -16,6 +16,10 @@ ha_iot_class: "Cloud Polling" The `twitch` platform will allow you to monitor [Twitch](http://www.twitch.tv/) channel status from within Home Assistant and setup automation based on the information. +## {% linkable_title Setup %} + +Create a new app at "Register Your Application" in the [Twitch developer portal](https://glass.twitch.tv/console/apps). Then get the **Client ID** for the new app. + ## {% linkable_title Configuration %} To use Twitch with your installation, add the following to your `configuration.yaml` file: @@ -24,12 +28,17 @@ To use Twitch with your installation, add the following to your `configuration.y # Example configuration.yaml entry sensor: platform: twitch + client_id: YOUR_TWITCH_CLIENT_ID channels: - channel1 - channel2 ``` {% configuration %} +clientid: + description: Your Twitch client ID. + required: true + type: string channels: description: List of channels. required: true From 3e278811c54b8311bb29e7aa05e19c11f83bdbd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Fri, 7 Sep 2018 09:35:09 +0200 Subject: [PATCH 27/48] Minor fix in switchbot doc (#6212) --- source/_components/switch.switchbot.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/switch.switchbot.markdown b/source/_components/switch.switchbot.markdown index 3eca50f1113..ff7e8911b50 100644 --- a/source/_components/switch.switchbot.markdown +++ b/source/_components/switch.switchbot.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Switchbot" -description: "Instructions on how to set up Switchmate switches." +description: "Instructions on how to set up Switchbot switches." date: 2018-09-03 22:41 sidebar: true comments: false From 37aced25852ab5d490b4522adf38b6e0c93bd69b Mon Sep 17 00:00:00 2001 From: Dom Date: Fri, 7 Sep 2018 11:23:08 +0100 Subject: [PATCH 28/48] Yale Smart Alarm component docs (#6176) * Add New Yale Smart Alarm Component Documentation * Update Yale Alarm Documentation --- ...rm_control_panel.yale_smart_alarm.markdown | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 source/_components/alarm_control_panel.yale_smart_alarm.markdown diff --git a/source/_components/alarm_control_panel.yale_smart_alarm.markdown b/source/_components/alarm_control_panel.yale_smart_alarm.markdown new file mode 100644 index 00000000000..f2dc607b157 --- /dev/null +++ b/source/_components/alarm_control_panel.yale_smart_alarm.markdown @@ -0,0 +1,60 @@ +--- +layout: page +title: "Yale Smart Alarm Control" +description: "Instructions on how to integrate Yale Smart Alarms into Home Assistant." +date: 2018-09-01 11:11 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Alarm +ha_release: 0.78 +--- + +The `yale_smart_alarm` platform provides connectivity with the Yale Smart Alarm systems and Smart Hub through Yale's API. + +This platform supports the following services: `alarm_arm_away`, `alarm_arm_home`, `alarm_arm_night` (duplicate of home) and `alarm_disarm`. +Currently only one alarm is supported. + + +To enable, add the following lines to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +alarm_control_panel: + - platform: yale_smart_alarm + username: YOUR_USERNAME + password: YOUR_PASSWORD +``` + +Configuration variables: + +- **name** (*Optional*): Name of device in Home Assistant. +- **username** (*Required*): Username used to sign into the Yale app/web client. +- **password** (*Required*): Password used to sign into the Yale app/web client. +- **area_id** (*Optional*): Area ID of the device when talking to Yale's API if required ('1' by default). + +Automation example: + +```yaml +automation: + - alias: "Alarm: Disarmed Daytime" + trigger: + platform: state + entity_id: alarm_control_panel.yale_smart_alarm + to: 'disarmed' + condition: + condition: sun + before: sunset + action: + service: scene.turn_on + entity_id: scene.OnDisarmedDaytime + - alias: "Alarm: Armed Away" + trigger: + platform: state + entity_id: alarm_control_panel.yale_smart_alarm + to: 'armed_away' + action: + service: scene.turn_on + entity_id: scene.OnArmedAway +``` From baba8e85ec4c1fb731b8500173498deb8b9886fd Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Fri, 7 Sep 2018 13:29:55 +0200 Subject: [PATCH 29/48] Update switch.snmp.markdown (#5483) * Update switch.snmp.markdown Depends on https://github.com/home-assistant/home-assistant/pull/14754 * :pencil2: Removed old configuration variables header --- source/_components/switch.snmp.markdown | 123 +++++++++++++++++++++--- 1 file changed, 108 insertions(+), 15 deletions(-) diff --git a/source/_components/switch.snmp.markdown b/source/_components/switch.snmp.markdown index 59d9b239044..0d2cb6fd0fa 100644 --- a/source/_components/switch.snmp.markdown +++ b/source/_components/switch.snmp.markdown @@ -15,7 +15,7 @@ ha_release: 0.57 The `snmp` switch platform allows you to control SNMP-enabled equipment. -Currently, only SNMP OIDs that accept integer values are supported. SNMP v1 and v2c are supported. SNMP v3 is **not** supported. +Currently, only SNMP OIDs that accept integer values are supported. SNMP v1, v2c and v3 are supported. To use an SNMP switch in your installation: @@ -27,30 +27,123 @@ switch: baseoid: 1.3.6.1.4.1.19865.1.2.1.4.0 ``` -Configuration variables: - -- **baseoid** (*Required*): The SNMP BaseOID which to poll for the state of the switch. -- **command_oid** (*Optional*): The SNMP OID which to set in order to turn the switch on and off, if different from `baseoid`. -- **host** (*Optional*): The IP/host which to control. Defaults to `localhost`. -- **port** (*Optional*): The port on which to communicate. Defaults to `161`. -- **community** (*Optional*): community string to use for authentication. Defaults to `private`. -- **version** (*Optional*): SNMP version to use - either `1` or `2c`. Defaults to `1`. -- **payload_on** (*Optional*): What return value represents an `On` state for the switch. The same value is used in writes to turn on the switch if `command_payload_on` is not set. Defaults to `1`. -- **payload_off** (*Optional*): What return value represents an `Off` state for the switch. The same value is used in writes to turn off the switch if `command_payload_off` is not set. Defaults to `0`. -- **command_payload_on** (*Optional*): The value to write to turn on the switch, if different from `payload_on`. -- **command_payload_off** (*Optional*): The value to write to turn off the switch, if different from `payload_off`. +{% configuration %} +baseoid: + description: The SNMP BaseOID which to poll for the state of the switch. + required: true + type: string +command_oid: + description: The SNMP OID which to set in order to turn the switch on and off, if different from `baseoid`. + required: false + type: string +host: + description: The IP/host which to control. + required: false + type: string + default: 'localhost' +port: + description: The port on which to communicate. + required: false + type: string + default: '161' +community: + description: community string to use for authentication (SNMP v1 and v2c). + required: false + type: string + default: 'private' +username: + description: Username to use for authentication. + required: false + type: string + default: '' +auth_key: + description: Authentication key to use for SNMP v3. + required: false + type: string + default: no key +auth_protocol: + description: Authentication protocol to use for SNMP v3. + required: false + type: string + default: 'none' +priv_key: + description: Privacy key to use for SNMP v3. + required: false + type: string + default: no key +priv_protocol: + description: Privacy protocol to use for SNMP v3. + required: false + type: string + default: 'none' +version: + description: SNMP version to use - either `1`, `2c` or `3`. + required: false + type: string + default: '1' +payload_on: + description: What return value represents an `On` state for the switch. The same value is used in writes to turn on the switch if `command_payload_on` is not set. + required: false + type: string + default: '1' +payload_off: + description: What return value represents an `Off` state for the switch. The same value is used in writes to turn off the switch if `command_payload_off` is not set. + required: false + type: string + default: '0' +command_payload_on: + description: The value to write to turn on the switch, if different from `payload_on`. + required: false + type: string +command_payload_off: + description: The value to write to turn off the switch, if different from `payload_off`. + required: false + type: string +{% endconfiguration %} You should check with your device's vendor to find out the correct BaseOID and what values turn the switch on and off. -A complete example: +Valid values for auth_protocol: + +- **none** +- **hmac-md5** +- **hmac-sha** +- **hmac128-sha224** +- **hmac192-sha256** +- **hmac256-sha384** +- **hmac384-sha512** + +Valid values for priv_protocol: + +- **none** +- **des** +- **3des-ede** +- **aes-cfb-128** +- **aes-cfb-192** +- **aes-cfb-256** + +Complete examples: ```yaml switch: - platform: snmp - name: SNMP switch + name: SNMP v1 switch host: 192.168.0.2 community: private baseoid: 1.3.6.1.4.1.19865.1.2.1.4.0 payload_on: 1 payload_off: 0 + + - platform: snmp + name: SNMP v3 switch + host: 192.168.0.3 + version: '3' + username: 'myusername' + auth_key: 'myauthkey' + auth_protocol: 'hmac-sha' + priv_key: 'myprivkey' + priv_protocol: 'aes-cfb-128' + baseoid: 1.3.6.1.4.1.19865.1.2.1.4.0 + payload_on: 1 + payload_off: 0 ``` From c8f7e3f9bbb8f87048aa1dd067793e87e4372cca Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Fri, 7 Sep 2018 14:03:22 +0200 Subject: [PATCH 30/48] Update sensor.snmp.markdown (#5484) * Update sensor.snmp.markdown Depends on https://github.com/home-assistant/home-assistant/pull/14753 * :pencil2: Minor tweaks * Minor changes --- source/_components/sensor.snmp.markdown | 112 ++++++++++++++++++++---- 1 file changed, 96 insertions(+), 16 deletions(-) diff --git a/source/_components/sensor.snmp.markdown b/source/_components/sensor.snmp.markdown index f492d5ef3a7..9c78766582b 100644 --- a/source/_components/sensor.snmp.markdown +++ b/source/_components/sensor.snmp.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Local Polling" ha_release: "0.22" --- - The `snmp` sensor platform displays information available through the [Simple Network Management Protocol (SNMP)](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol). SNMP uses a tree-like hierarchy where each node is an object, and is mainly supported by network-oriented devices such as routers, modems, and printers. To enable this sensor in your installation, add the following to your `configuration.yaml` file: @@ -26,28 +25,107 @@ sensor: baseoid: 1.3.6.1.4.1.2021.10.1.3.1 ``` -Configuration variables: +{% configuration %} +host: + description: The IP address of your host, eg. `192.168.1.32`. + required: true + type: string + default: 'localhost' +baseoid: + description: The OID where the information is located. It's advised to use the numerical notation. + required: true + type: string +port: + description: The SNMP port of your host. + required: Option + type: string + default: '161' +community: + description: "The SNMP community which is set for the device for SNMP v1 and v2c. Most devices have a default community set to `public` with read-only permission (which is sufficient)." + required: false + type: string + default: 'public' +username: + description: Username to use for authentication. + required: false + type: string + default: '' +auth_key: + description: Authentication key to use for SNMP v3. + required: false + type: string + default: no key +auth_protocol: + description: Authentication protocol to use for SNMP v3. + required: false + type: string + default: 'none' +priv_key: + description: Privacy key to use for SNMP v3. + required: false + type: string + default: no key +priv_protocol: + description: Privacy protocol to use for SNMP v3. + required: false + type: string + default: 'none' +version: + description: "Version of SNMP protocol, `1`, `2c` or `3`. Version `2c` or higher is needed to read data from 64-bit counters." + required: false + type: string + default: '1' +name: + description: Name of the SNMP sensor. + required: false + type: string +unit_of_measurement: + description: Defines the unit of measurement of the sensor, if any. + required: false + type: string +value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to parse the value." + required: false + type: template +accept_errors: + description: "Determines whether the sensor should start and keep working even if the SNMP host is unreachable or not responding. This allows the sensor to be initialized properly even if, for example, your printer is not on when you start Home Assistant." + required: false + type: string + default: false +default_value: + description: "Determines what value the sensor should take if `accept_errors` is set and the host is unreachable or not responding. If not set, the sensor will have value `unknown` in case of errors." + required: false + type: string +{% endconfiguration %} -- **host** (*Required*): The IP address of your host, eg. `192.168.1.32`. -- **baseoid** (*Required*): The OID where the information is located. It's advised to use the numerical notation. -- **port** (*Option*): The SNMP port of your host. Defaults to `161`. -- **community** (*Optional*): The SNMP community which is set for the device. Most devices have a default community set to `public` with read-only permission (which is sufficient). -- **version** (*Optional*) version of SNMP protocol, `1` or `2c`. Defaults to `1`. Version `2c` is needed to read data from 64-bit counters. -- **name** (*Optional*): Name of the SNMP sensor. -- **unit_of_measurement** (*Optional*): Defines the unit of measurement of the sensor, if any. -- **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to parse the value. -- **accept_errors** (*Optional*): Determines whether the sensor should start and keep working even if the SNMP host is unreachable or not responding. This allows the sensor to be initialized properly even if, for example, your printer is not on when you start Home Assistant. Defaults to `false`. -- **default_value** (*Optional*): Determines what value the sensor should take if `accept_errors` is set and the host is unreachable or not responding. If not set, the sensor will have value `unknown` in case of errors. +Valid values for auth_protocol: + +- **none** +- **hmac-md5** +- **hmac-sha** +- **hmac128-sha224** +- **hmac192-sha256** +- **hmac256-sha384** +- **hmac384-sha512** + +Valid values for priv_protocol: + +- **none** +- **des** +- **3des-ede** +- **aes-cfb-128** +- **aes-cfb-192** +- **aes-cfb-256** ## {% linkable_title Finding OIDs %} -OIDs may vary on different systems because they are vendor-specific. Beside the device's manual, the [OID Repository](http://www.oid-info.com/) is a good place to start if you are looking for OIDs. As an example, the following OIDs are for the load of a Linux systems. +OIDs may vary on different systems because they are vendor-specific. Besides the device's manual, the [OID Repository](http://www.oid-info.com/) is a good place to start if you are looking for OIDs. As an example, the following OIDs are for the load of a Linux system. - 1 minute Load: `1.3.6.1.4.1.2021.10.1.3.1` - 5 minute Load: `1.3.6.1.4.1.2021.10.1.3.2` - 15 minute Load: `1.3.6.1.4.1.2021.10.1.3.3` -There is a large amount of tools available to work with SNMP. `snmpwalk` let you easily retrieve the value of a OID. +There is a large amount of tools available to work with SNMP. `snmpwalk` let you easily retrieve the value of an OID. ```bash $ snmpwalk -Os -c public -v 2c 192.168.1.32 1.3.6.1.4.1.2021.10.1.3.1 @@ -58,10 +136,11 @@ laLoad.1 = STRING: 0.19 ### {% linkable_title Printer uptime minutes %} -According to the most common SNMP standard, the uptime of a device is accessible under OID `1.3.6.1.2.1.1.3.0`. The value represented using a format called `TimeTicks`, in units of hundredth of a second. +According to the most common SNMP standard, the uptime of a device is accessible under OID `1.3.6.1.2.1.1.3.0`. The value represented using a format called `TimeTicks`, in units of hundredths of a second. To create a sensor that displays the uptime for your printer in minutes, you can use this configuration: +{% raw %} ```yaml # Example configuration.yaml entry sensor: @@ -71,8 +150,9 @@ sensor: baseoid: 1.3.6.1.2.1.1.3.0 accept_errors: true unit_of_measurement: 'minutes' - value_template: {% raw %}'{{((value | int) / 6000) | int}}'{% endraw %} + value_template: '{{((value | int) / 6000) | int}}' ``` +{% endraw %} The `accept_errors` option will allow the sensor to work even if the printer is not on when Home Assistant is first started: the sensor will just display a `-` instead of a minute count. From 60b694bf0f00b98261ca32552cc7eed284e7dcf8 Mon Sep 17 00:00:00 2001 From: mvn23 Date: Sat, 8 Sep 2018 00:04:09 +0200 Subject: [PATCH 31/48] Documentation for OpenTherm Gateway climate platform (#6118) * Add documentation for component climate.opentherm_gw * Update to adhere to standards * Changed wording from "component" to "device" as it is not a component * Minor changes * Add quotes * Fix location of space --- .../_components/climate.opentherm_gw.markdown | 61 ++++++++++++++++++ source/images/supported_brands/opentherm.png | Bin 0 -> 20615 bytes 2 files changed, 61 insertions(+) create mode 100644 source/_components/climate.opentherm_gw.markdown create mode 100644 source/images/supported_brands/opentherm.png diff --git a/source/_components/climate.opentherm_gw.markdown b/source/_components/climate.opentherm_gw.markdown new file mode 100644 index 00000000000..bbed48193d3 --- /dev/null +++ b/source/_components/climate.opentherm_gw.markdown @@ -0,0 +1,61 @@ +--- +layout: page +title: "OpenTherm Gateway" +description: "Control your OpenTherm Gateway from Home Assistant." +date: 2018-08-29 16:23 +sidebar: true +comments: false +sharing: true +footer: true +logo: opentherm.png +ha_category: Climate +ha_release: 0.78 +ha_iot_class: "Local Push" +--- + + +The `opentherm_gw` climate platform is used to control the [OpenTherm Gateway](http://otgw.tclcode.com/) from Home Assistant. + +# {% linkable_title Configuration %} + +```yaml +# Example configuration.yaml entry +climate: + - platform: opentherm_gw + device: /dev/ttyUSB0 +``` + +{% configuration %} +device: + description: "Path to OpenTherm Gateway device as supported by [PySerial](https://pythonhosted.org/pyserial/url_handlers.html)." + required: true + type: string +name: + description: The name for the device within Home Assistant. + required: false + type: string + default: OpenTherm Gateway +precision: + description: "The desired precision for this device. Can be used to match your actual thermostat's precision. Supported values are `0.1`, `0.5` and `1.0`." + required: false + type: float + default: "`0.5` for Celsius and `1.0` for Fahrenheit." +floor_temperature: + description: Some thermostats round all temperatures down to the lower value according to their precision. Default behaviour for Home Assistant is to round temperatures to the nearest value. Set this to `True` to override Home Assistant and round to the lower value according to the configured `precision`. + required: false + type: boolean +{% endconfiguration %} + +# {% linkable_title Example %} + +A full configuration example with the OpenTherm Gateway connected to a remote host running `ser2net` looks like the one below. + +```yaml +# Full example configuration.yaml entry +climate: + - platform: opentherm_gw + device: socket://otgw.example.org:2345 + name: Thermostat + precision: 0.5 + floor_temperature: True +``` diff --git a/source/images/supported_brands/opentherm.png b/source/images/supported_brands/opentherm.png new file mode 100644 index 0000000000000000000000000000000000000000..459f60e67369392ffee6022c3fad0b619b8ed5a4 GIT binary patch literal 20615 zcmXsUV{j$SHnwfswr$_owr_0P$tKy@wry?fjkOzXY`=UzUQKm(%{kr2r!h4ht)e82 z2!{s;0s?|4DhV4%M1TJ5?#5D-=u9}R7HH4{$~XICdn8+!{9cW-A45(_UI zOArvRjoKWm3BKq1|_1 zpKo1Xuk~MWtYIfjE1EvEd0(z`f=EI(pLe^*X4fwtZ=ZU*0ayW_eQ%$k6YXfkOUJ)l z`wWGj`#v7vIRpIzKi~be*4Exy>bc=|cb`9gxLf#tK6E`kNYMuL5%=|Ze4IZ?eeQeo zeI}ltJM{0ouhqL*u(jO;&~|yL$>asb)}`Qx+S**JevK^`_o+X>-+k1qeQa-aUgdwX zdG89pSzNw9zXrT|)8#N5G1K%=c=Qz;drHFL~5RD#QZh{rCfj<-OJ}u6*b@>UzNI zDR8mY;`_f`0-t8Sj^>`YyR-`NL!5SxV_YOhIfmz_PK^vlL&DxT%OC$feYgmZ#DAHX zpwnABW#e=6yubI1wp?r3m$uJFuVu~62C9)Se>^}bpssO2p`+37$;)8LU2~4%f!(cZ z=MPSpO}R9I4KiHrG1;Z6nYidKx4z`!?bsEM&b0?)VGYToO)cJYXxHS#KUa35iVvq) zSXqu%ah`L@(RFImmSUMKS5*GBZC%#Yy8yN0X*To$_CD;4?-hl% z6TLs~VVX_zEKM(2W&zuNA8UurP5si;0k*EJt-F*fzFsv|Z#p~)D)EFZPL3<_KC~>& zb&PB%avOF3S>1H(KYXk5uRWWq#tP8s3^Z)LZnf2Id^gnk(&g+kIB#!<2|-`VZZu_u z*6gu`ggL3;ykk5fXm!?=RrM)Ze*cz%0Nj9(ycO zN?jv>l#0dYCJ_3QHc$V-LYuQ3apZT_sbgI}E{J^I&jQkuT^?#L83_Wc{iIO#@>VV0 z(G`J7Y53v?_Fz*Ho>~9PKQpfVPYY6~qWPSchyE?so8epS^zq(SIL(Fwl{4M)+LeZu zzL1XBtKM^6{H}pBn-hTb{%7uMo67QTcc({}@e+B=5B|lc_WRee*0U!AvyVgTZDGVG zyO#LDv_aq6j87hor}4%<(ofFy`u$fUsCWO4%laF(gt@5x_$T&t;)t`4_CdO|q2t4~ zpzVH~8)3xf@=oB_>Cq=&`=xO1mQm!HQiCe!1fk`u+ojLyO|HpRgLKtN1DIbB-PTB_ zfr}kTVxOvqP1{n}l95{@!tPQ|Yf1X0+-VpGvYPSbjEL;3fE|DL&xh1w5GK8rRa_ns z95*A{oSg*m)Y3Lb(n(FQor9fW`?g$U@(BuKW~n{+~RK zyvOR9D(-&+&|@HQtyy>sYh?Q+@Rh6`LLoUxmI_Zn356NGM_ zgtF{KPQ4{4Yec|5zYwS6NG^RNe$I2tRJ%<@ZJy!JX02hC)ot=33Ru7ePh>(`Ow7SpG zqTrx{UpTkC^r?$ZH!5CLB_vR-4+)mF0K$|lBno?%Yg=uXk;WOA)YZ*jM2m)8406>U zeTtdIKSOGHIuz#Oc?pvMS%%PG8Bo;nO2f0qk2V-w`xNBY<>A4Glv)ntjtd~&WM{Tb z(yb8#>g>rKcDRM(^jI{Owz0;R$#;%N^bd_$Sns$WSPCi8=o0+sTp$oPh<^O;3&!99 z9jkbWyNEQv3K`HPt35gvnay2JNcU**Qdls)z_&R{Ky@#Fbb0GD`>Xb%XdtfZ)6=mL zYlE&+KySHmLqzWP7U4UaSFNdS(KQ=B7@o_VrD;dq$6dG>%^OmiCIUz5{<8SA!gvPn zdRBJE8S-yG^>-{UPhTDG6JK|2G8)EDT=iR1E-5ade2%XRGrV}cdOZ5BjRE*YbGF|@ zy&|t-mSa`udAEqf_<`vM3D z`#)*82%IG3PrvHy`SE|nOIS;#u|3=sQpqwv!pDIsMVX#9F#lViJF(d*=Hh z7|Gzz-JCGi^Z7UQ1I*g(Nbfe1bl$KBIY(9-Nd{JAG(B$KRIE`ycIrr z?+$HAdFMLThEROt2Y5nA27Wed5mtT>HgsLFmn@2Ypkx8s&U&ufF%1Pp2#!w|5!-eW z4F{$tI1WD>GCcffFdJfwKtdrIO%}m~@!FL6vwBiw`n4#E+u&w3N3Qi57sYKtXRu5d z9WAPf(7?R{Hdru-z~xL;NSYt&y>MAIZ9jer+iEJ?^J%@b;hY!hPtXFI8n8NCG?D~5 zpJ#g#hdvU}nmzr+gno(E{0_?l>?jgukIsQTU4NGJb&C+%7Oc=#6@Bqiv7cLdJ#7Un z9Fnc-=+{$QZJmOZ;&FxtxK$J~B9-3p-X9gV5#A=r!b3CI>mY0)_$tR*HL4*2^HQ=G zM0@Y>9iot|!e4RRm%C5|X-n7}?~JP=(t+Q*3{XUKCsOf$BPc1%XLt5h$-(?vN80Ag z+jT?65O#caz5#h$tI&7DwFKnw1LzQFxP4Up0V16$XV=rq+0V>WNna_oN0)snTGBJY zs&Aq5pUViG1y{xyl%*I(7`BZ~O-Uyk&OqzD^TRy>SzlCr7_3DMN|iYfcD@L7mnHT> zxZ>u3NT3~U!7Yh`BO1Av;_oHCXC5{7#2S;f_n?|+DK%E|s8=Q{>O-#iz_!73IV`ur zj%jB4bA}>eq|TFdk79RaxDj$1!$CT2w>z$IIUtNBY59zCUcQG7-~O7@1wLCG0a>oFCe z)L8_k{kRSx;d$xhhFuGc#}Fz$&Aq#~VTI27FoR+q80Rgt8WNV77r7N0`apqX6!Tpp z_$YQq`3jI>%~*b(5zSDaH)Sw$k~NC?CdR1+_UO}p6|rPsrz}JT@+)dseP}9#Luv^~ zkiK>Z$UG$9eaRua69)vSA`9#IyjWNNOowa#kQuiSk;F}dOmcQG@cjA1<;B%NVvLm! zMGOi8#J<>_?52WXkrZcHKojzu9bdnj>S$pfqE96T1OotnLb#l0Yz$d;3H?G#SAW19 z5T}wu^CvV2R4U=DQtz_^_|l=Pf(79i!qxW62ovGEJL?2w)q z1Ft_~TOMKh<|6~!NGDkKi<9|Nh(16L?x}wwCSRz_s9CJ&>FQQ&@|8R5Mv!%@KFb6W zwjF8#FAH&N`0lZR-_FV_aiRy>*ry5w5=*Z51{<*1Wp5}(8==^tut<58ils{J4N^z> zk54E3oQC!XrBNIKD+2~DrIGf&OXQ<5Um2tc=hwjmsxqwWxaY*F2zQbfQHV#0niK)4 zp=(HtN->R?H7J9}iALYQDiHJro`l~~STtPDxQ3Gs@=T_Ej;xj@dpoGa`zZwokC&aK zp+~CZk(h{*-m}QHxlrfZ5U8l=>$llZ7$`}znY0vic`suwYl=-d-7lk*7XZ6~M0iIM z`6Or>tP+!L14md%@U);i9AFkj^Srs-n!=4`8hR6TL@lPXj2ed@eUNGn`E>AKin~Ij zm!_yo^4Mfg`QIXNZ*Y3(j1BN!YHTM3l++~qmiKa${%28h^<^4DMaA;1ZNj5_b7}jZ z?6c3gY+GNV9zBVd7Se!=Qnxw$5yVR1r^$y#{NRhq5;U5a^6G_l!Z+hqs3So7*di82YEP&OHsga0XDJH0t zT#cS2HnKQmc3Ib?9D1pEB9DLCX|+_4;c+IzHmZUs-Qo)BsR*qrdJN&al*Fin?~yv% zD4ft`Zywe1IShO}jpjV|9^x6u_xdkM5NvNf_gq!fdxD;+9x1!}KMiBU+mmO=M|23y zA|@f9Y-gXP9ledgP>i>vB8%=ECL>`LY+@0Tod{JCe6dAjk2=i_x!Ac{NRJ09mBWYX zwZSNa8-OQm!RIR>!;hF*QQ@KOld2qcwn^}vTOV_S?D1Y%RO&BGsP3~^-^s;B=FBEar*Qf zAwsyS%cermYLhcajS?pk42#w)6{3Kzd6wLpxz!VZ_&9-i`HBYy312krTvHAJKz6HPOz)@&zU~;eN(bwXyfL4Uu(g?4A`d z$qyc8>=Z){Wr9y`o6NpfPVH5w{aSyX9;J)0^*|UmheUg{?gr;(56PVbIQSe2$&9uf z##&rdk~iVNCVNOl*IbYsD;`WY1a#zVLraY|t}+$a53N>I3cn)a*i`__rvYgN`4g zL~wOiJ7J?(9Q8?86sIHW57lSEdMj>wJ#Z`_n~uHY_t0#A(Pz4*>;}{zVG;W=B}&uJ z-1YDC36InJ-?7Z%*LwYT=5WQQ+NPI&M*A+O^qH@khTqcGHmv^RlPu%Sb41DM!vw{4 zLUF-osY{ZSDQS=u@VMSh_z={o3x$iuzGS?~N`Gat8Q^`jZ%RJE{l>chTd^yXLUzQE zRajvud~$E2ADS3Aoe?#}Djdyw=8$c1anxskM_awFx|i_}0G>Rjhj|&Yc|2y>^MC>9 zjz!W2l*vn18#{@b1eTa6{z`HWRW~^}r8S*n^q+8cr@1Kj9;|cx4UuZ^G)(NJKaG0B ztQlkYDKuasbt#z@qU0gjS2<0AKRQFkRUK=*nSV8?ZISIy0jX^d2(*F`3+XhdtJI`G z?<;5jz#2zr$#@QD$u1vuOZTabBsy+gWw!{c->Lg3l{sgP{50FtkII3G2R%3W8d?w^T zvZ0wBNUG9UHq!<&T0_X$FG0D1yjDWk86>x<1C&jtLRG)%L(Q#4BtoSS;dSn1Jjqq_ zz9H60F3XOoQmdfD$@dI=v$J*%+ooe?PEW8db0+9O78zk1Q#!FP0Tlt^g~S}k#W!O4 z73G`?1&*CE)zzf4kmsi?_TYFz4hsDgFy8;89NPV%X@CFXu!7A;)KPlKc8>MMa6}Zg zF678GDsSF=`Ut&i$@2mpVJtU3TW4L%UuCRm4719Z4$!OKNii%&0Wu#iFIpPRlf~+g#^CXx zz9+hF+kb#buPPCE$10C+>kH?W!7h{x8&r8c5KR$XMwPo}SthfPAd8RAJEVXD4O=!k z3`S{t5Rw}`%VvW1-c)s38}e+O4tN5RO8iAIm#23yaXx23pbc!{P6iw`61EHm_n9B4 z_65HwEn-Q&Ex|Akly$n1p)tar|AZk5IS=t$YNIKzM_>shBpm=u=;gN-blfC-ss71{ z8ZLm2lxdXqW(PHpfzkg`eK>($Z2Ot5OP3rQRuzA>C!G_6f*T!e%ma~o;Suq6NM?}3R_m1`Bk6_CTpwgu17Kk~QTXt<$5J}M zP|t|toM9acDWF!^o3`c@i(KDOO@~!;R4u9f``JX>zp~WW&rOQ=1J0-aVz~gpJGF%r zQUV4}l|RVv;1eV9w*{T_omKPoJW&@|c#@%HtUQ~Iv;%fnP*TVUxJqNJdM-Llt_Q0l z1A2;fILoC)BDKa1iw(9W5c27fM57#k1B{`}nLF!OXp^xsyn|2jv>Tne4pt7Vt%(^s zOeo|o{O6QQ6p!hTq(oaG8LnlcQGPRb5`zm}1P5b(T*1p%|1!UB^UrOv#_CB@AaamRS_;?^tiIx<*!T9Q7TgtEIvO(gd$90W+ z?PDrIOYk7G_2YpsHiSexAo;j0HYWK5g(7?{uZw&V{QEetLrOHyrZ(&Uur9sKU*n@%(YkEhNWvmHprA+ zCyf^ZRQJpU(6>Y=OP>AFqZLv>s^`f_W666=+4alPgkNd`LZfNN%J{;jf-_cu8?eR&YwpZkKVy?eB@Gh%nnep6wQ690gS0&~Vsw+oUGeu*{W17aLG!aG zkmYov$QEUKww#S=EjMN#2@E^T#OvoLPho0jsi;a)&a7^2@!ILPaf1v)WJv2D^7Sm5vs3Yr(9DW?jq2PA74B^DLhCd+%<|- zL=T~BMd@evKOgQ>-69QOdu82z%|V~7XJ%NUu=!-$)_`172|Y^w;eu(9|w) zI0_Fsx^j|pBXab=!BLR%*SO|RTEzu%9-_?B-g%JOWbrFrWjwS;>|))i=$%!?UsU&~ zd#Q#dIQaaIAzY~8owDrW5Gb(pfkx0tTKLD@pQ_}$iT8&LsjRBEs6itwsc?{KVbgo| z*P_-Pbg!UeKQhx)mC?8W;~SyrSEg_TG$!iG3KzCF1j$F8lP@CI}ks+;Q{P70=JeJDuu z2uXaA?gCZR?i0d;I*S{@1n5Qe2Zmm4qR*f`eRs3#40Wx9e*&4}apVDMZqw06oWV6- zklft6_@wghH2Rjz>-XU$=Ih19a0&D*(6(F;b#yW+Q(XF@H^!I(R4#QhjubbJHhb?K~ zRYY#PT5oW{qV-^EH8f=6-vynhFs3HsO2I|9p|VV{1#~r5UjS=t#-r*F&P_+Hr89^# z$GYpd2|l(rK%O}~#aBB)bt;i7;QNfnyqt>k0<0RWm(q*I9SDW)$SgCi^BGy z)zg3~NUQzsyMZ%rnjirQz$Jj)Ko)W4!KyD%pOiHnI?{EN7-R?6*1P;oZ^uy;HbGj# zO2Hqo3fK&%O**P7A&iE}M1^Y&#x_^NH!3!6d(=mDMSrKx&xX4%QJ4%4GPl6wfTJpb zVw?PN0XIZL(lTbYI5&1S%OXZ4i4IXQ=2B#64lY(bJXn2OeIgM%WsgQ+!FS2=Z@CdE zj^|GAO3IyauH$yl2`#k-1q!(kV^B2=4yV$CH{u6s;8uV$RI+%Ak+(2e03v5x)DkQ? z6_T*JT|UpFZ-eAUY6nFt-V@S0mmF4#y}(6WCQrpGi0}c15oDJsuXGO`)*6j%wsrF> zUhC&F&RM`Yf+S{UgOAB@5NeV-BFt7Fm(+aTvv(_wW5?-u8+N4W5G(YTG7z=K7oOZ| zfv^H9=wMez*@69T4Aa<9$@f{+saM)Z5&LY+_!Fjy8mgd6sg5n4T(VWkP`o(l7l{ae zbpek$$UlN25k^=UfS4q(uW(@)Ne{DrTU^cQkcoVs+*JJyd&rmCZ_U3O?}X$!L_d@X zN}KKr5=sx-Nye4Qtf^r~5gLlhHKcu0db`GO+hPK@)d1Ya#j<<+^k|5GEYzOB$u3;R zFf2OeXDGz*J&5SzX$4@#X?@|8ctWfRQCBMAP?7-#VGu(b{i(R(;z;dILU;>dtD?(z zqqr+7g?II`Dmrbj6@5RRE=rr`N33}*N;l&JQeoG>0u#Qm^sRdMb#m9X?6UgDfKVv0 zEybcDFOG}5nO5uxIB6B@umE$Eeu=3Qx~gp6{{ z5A<^&t=nBgJH86H>5s)pcQF}hLM{UNQi6WIeX(K(KGeu6P8jHkTRJ>NXpjg>pD;%b zY=*QLS{4O0a4)kcK&aBv7!*rpV?jeY(4ZD9R2s55%xl0>Ns7-v1u#SX&tB)mm<0v8 zoanf!4!aVW5GnWx8_o{b^YQ6p;qnRUH2<|2I0jD-+fC{k!!<-@93e5D(QrGQf@Lii z?-hE1P)##eb?9c(45QnavHTY{(<+8eXl2$}?Y-4<~#o&OERsv}`J}UlS3xm)E#A`!) z5Lk-a^!ffV?K<>@Q8PY}_|w@Am2_G<3jiDvg83UzCc|%*rL)So|AI3|<2W@~@F-B1r4wp%tASqE29j)V zKvuLb?=3G$LtF5rok#gnq<&+&IY8L^LlYLaRW{=Xqq!LVs;|=rq5qEx;;LS6R-D!B zJ#dwT4F}RgIStg`(eHogP3fiV70kU0fsryLB@~4~MK_Bi5AJ+cc zb3`~_Q;Loc03~lAi}LZfs|2QO2;AX(^!$K#esa=iG6e^+#rSIrj$ zES(f(QIiOnDNb)`Z)&oMKeVC84y>po88mP)zL{vZ!XY2$itaTH6>9&}{L^dY&yvJt zPiV}J469a4VN8S^3EoqT6oonQni=U0agB0)_(_(E;6T{X&-EZrvDi+YsGLw;giFGP z1zI7(6M7cZM{w@AfneiWtn>?YKs{+N3`#MtZeQ)CTz}(lR!D{ZqQVuMK5HN+So(^(HDJyXl z@r?y9JnhC?-7QqTi0o?sbU{5HaOWo3W`Knjj@q{h=y=0_&A~^Y18;wW zT_A06i1>ECsPZRBRx33ekI+TWnD7@Ir9O5mZz8@lLu&Mfgw{_1s<=%UgK_gD?;|$T zEJ($aIAc--^9>MDfb{A1B0;--zIX{A&WKoB9atxvllhc9z+FI{92&|zM3@J4$q)`b z+>zy<#1bpAA9_xipl=2~MR+l5;yN#mQYo28COAG47>N1&@{rL@IJ;&3jn#&XL zG!(H!z*Lg}(6W$ffxkQJeS9xZ>c_HveaMqy5HwGXcpshPx5fw?0F!vV(^ zRC8+EP1Q4@d_m}#3rWDI0@wFQ?ly9-LD;GO!_0Xvh=_Lo4yS1xsO7*wt8G)1=S#-x)UjGWd%qhtpZ#iB^cf6UuHr30+nNrVWZJLD z6SWUftKvO`pGMW6#ZUv91Enj2f;Mz^j%GeWf0Kpd z2RZs7Yc8=|4<%1gDpO(QQQcTf8Je_~dU?VJQb5+`z=5*`m0BrHr^RI`YT<#(o^@4* z%bu+s{aLzTO}my}l#dYbY+ZrcTm>wAQU`5&T>@xoI;rk%Xoa+!Cv2*O*z^tvN3Se? zY^WuNJ98jB4MokrlRxXUe>~KoIlfxcskn>md)3lc<>z`;;fD=0c7B2n|5~1vyd0tm zQrZO!DUEFu(H!^W8GI$s`VvYm%DOl_+8C6tN%e8zqRL%ke zFt*Vt_2?^d|8$2=M5&O**EdMFPd^2`jfo#7M4`SsiL6$ai4yIj`B^|lAUTv*Q z6KzvEvND1Gi$3!kI^zt8fc#6iN_2}YPOZjr4%adEUhMAttFmGzYMYPm`XEIqoNOd1 z&GvXroKEJEX0o6zf*usleL8$Vy2T#0(=(gnp;QVo@nHM{%IX$YAH@n({d55{id+JF z@o@8|JX6??3D5&h;{0#>s(4mSjNBubNiagqd(0V`WO9{(;y4xn z4251~qJWlE)SQFCG8noYowBBaI{YNy7ih^%7m*6>ZP*@mTUCr+mn0Ac#Q-pChhE28 zZAD;EJ>)fXRCA~3Uwt8ZHl;8}xKG7uAX4e0D?3~e%JcS{;o0?PwyHQHofj{ZaCZnq zsgOz3_0&ZLbMEYwnH_(zEk54CE_g5u>;d{pQ`ihCp9-*>^rI^V8-lc2#@4o-tdIo< z^vO_`h2>A~y_4;!EuS!v*IO;)bvt3PVShNHdsQWYdGF)LAxY7SimJ7AQ;Wj89(ouqA*D>=RJVKbyr*GVitu4##AIs;L&}l&eRHWoY+oEm#Zs z7M5?dUVsFVzsLiZ>~b0q(wxHd(G&C znNluSzE7$u65_qEhbL5}&Lox*+ve{yCDn*hTe;1})I5`Umul@6^2jH&i_)&JU;%Gn z+^VD2uPqwf)!GxC==f~=2{MDxIEu$j6F*f!mw7ABCPj_Yn^ zY~YIDTR`sEUV#uzwrYl@ZH0l24f}uxa_I_it1|}|?Ew=lxoypkap3xwkzGLsUwh00 zkxLj-t--TZ?^kJMTYn zS^0DIBa3jwT&*x8mxw?**J1@-M1m%dN2}X7US<@O&1Ws<@gh@?bLQWBOQgXBngV1D zvVIX3yn8x#E%V=AsMffHV3<9!csHOXhS`;8z|Ts(#Ki$>HZX?Y3Re_ekl3OnxZH%rAj*v{@x%P)Ek2(B zgheKqDoX%J%9J=CtC{WEwZ~2>qKr2zj9=O50utR>gEL>}6H-xU6)m;i94f1%C1aZ@mjv$2V#v+eNF_#>6eOpfQrNR{E3 zJf8WWOT{?Q2Dh+9!*hFSZ*=jC2Z@skLO+-(QP6qT{uXzVR*4z~ef3CxQ=boQZ75gC z@lYs^!XL$^9lSk$^p4`vZnk#Jl@e41BH%xp;w8lyJa4cw7UeS03~ld6K1Q;(YtNuF7o&aM9nRvUb2oWS;6j@+OI z&8Q3Tloi*nQ*u0IVc@GKD@8F-y)bCVY!h-8ZLWqVxf8z(xpug$I@D;xVI1WLlitt~ z-hgt_FPYrMx)3_E;i?jKR0Q}&0@X)1+&Ry@G!+3qE2LGPU0ksWD$4=@`IOp8Kc=n< z%P~&ZR~KdB6bMzUXzxf~e8G&9cm=Qy;ZelSFjpRXG%x z=v+l<;YWKkm~oN7TYSiAbV|b$);Aj9Y~M|idlIAry{vQ>u?~-B*c?sHG4lBGOi~Lj zVSp=IV7k(VEsDXpaBfwe_Jd>__0KSLN0KJi=iOp&fC665GO;kgT+2yDGTIrj1}|9k zbQtjcVr)@RkgZ*Mh~Rg1**(8`-5H_&(y5EQZ6q_m;*~ji7bpi?XYC^ptedfnQe-6E zR#G#Ev)-qsv#~iOQ+*aWz3^MNOwvE{S~vmO-d8ztp38T^-MD1e(h<;4YYRshDL=!9 z8*cjh4_^T??!eE2%y!!-mMwBi7FbD56_J1mv!8Y2{XuFC?|^})sxM58jE>zpqOogT zDEA)VDXl!88OeD;Y6#ioZB4T~iH0&1*%^hbkTU$}3_!4fgQ-O#pg zbheNvU07Fj+pPW_X}#J6&+#Be2U`DekxFB+(SO3c%Hj4Lp*_aZh7ae;MHd3q{U4p; zi2X7u3Z_Wr=nbH0@iTV=#{C)AoV>Zkj!JIXtrF~4JtI&3VGvF%tXoA#B*oN~^)tU@ zQ&@-dVFC?01H?!K!ou&=8zem~XJq3|V-sTMYg1t79srh$LQpj+O*)HwxG@j<8P=4< z`^8U{)gbYhhmAzF_E^DN2G&bsxaUz5(78yf7AdHMc*Qodr%oF^a+}+;}cIH%2*HUF<1=c zch@IuEK(m|j5gdxIcp1M1QIEIY*hA+0X|W6?`3^zUr$SfX~OEL2rrD4faz6col3@} ze_+kV>OQ>?PIGN}Z|he+tBRo%W-2UYbKy8D0vCR-4(Hx$NHd6qnN8vG%|=-S&M01} zt3-?yz7!Hj#-qS@hzO2?r2-y~W)GYf4I(?;OH9s!pq@)h6K%`9B*m|##=%;!6WG=Y z`7{(P92M~&(beI~2&fT_m|VTVIE(o2rN$G^C31;itofXl?{fqM7m(d*KGwS%mA%q^ z1*Y~5-6MU0raTbVBDVwe&a|qDlkB_{*Vns4D9q%4f3V_nO|?och3QADUpPR23YLszCuQ}SJ+_8Tj9f1|{rU%5`fr^+{ zoy2<>?4_UD;0k`w)iO*`v=xAP#MZHWg0hrbLU2pMsWC5LuABBoI_>Mu;vf>m=XpfX z-3}2+jNbUgp9GNSmxnYt?SGv6)#{HslNVc_L;nQt)hc&e=+`wG7O%1+K41TlrvAwT z`BYIzg7J69sLH$USne-d6cQ+j6wx2q*z?4t#ZW!ogrc>*TZ>ZZ@PXU!V?Mh#o)w

wW+lU+Mmns1v<~mwta-a(Ldc%P(l)oQo{rE-B!1Ya*g9vb3%r zXO9`XdOEuO)bp{qeArp6%m?kxm#)zqp3D68zQlL7P@W%(@njbQ8+k6274HS}vfJ^P z-#94f%)qIdRq0l_|B@x)ANfM zoO}4wb|fDO1O&{`MqFG)R$QD!MNL^sRzdRn%0t%gvrQ&>Wh!bhWNioL`NX(?lce&KfWMT zi~8r{fc)6>K%kox_e0ERzrr3aN<3-@iNG(=h4OwqB^F=2 z=r@P1!KMzCZM&Iw(gprvW6j7^zf8;z#Km#!`y6+E`VfwYb^2mg2>iI3s_sYFAmR1K zipZ6PiX+0%3xT3T`ZUc{5WVx_0jsh|^49ufOUf6-!P!vMo>Tk92o5S@@nY$3DdhyX z4Y?<3(Cqly7amS;|H5hO`@Cv-+x+V7SjLiNR~2+yCVZKhfAQgPD*%6Q%%TA+L>9OJ zNfam8JEbrcIM`3Mswb%_S0>64?DD;smKri1I!i?sK8(sczk7>j3D%$Q%kQc*{k3c( z-|o2C>^t7Zc}LZPejL$vT3z=(mdt0Ab5dA%ReAOG)oq!27Ph*b=!{ior8PgaBonmp zY4z;tflK?yJ+u3C`AeC=viEnpGgz$v5~RkH@bIR5b#z-V@Zx53&IR}W6cl8!`SmB2 z=cD%bZ67F8d1(odum7Hc-tyFM2&}V=jvELF6ZwAy)T>n3;~NO=E~_XBeE>s6GX-@7!xzzH#~f(#DKhbvb!spv+W3}P zT9mbQ04z0i*-Moysx#Ww|MJ*G;L~&jb&$Z&R7Ayu;62&*3;Xc)PikBW9&e=|e`rk# zo`3XRJ$d)hpLQWdnAF9O)Cb*AG12nL(YvSVFRGeAgHe(+QIXOq1W`1QC~%tD6~+u7 zbJ#Pl+|;ufXgQ(G-&Y3*9~O-gzj0%u>cnoj29A(o9XhJPY5e1{)T|@@{!0Pg z*hM`!@5Izh6z7ZNE-gYaoGy=XnU47srr{t5+_qrz*08N*VqSRM(Axq}cNt3?WvqKr zu-Zg4A_UW-j@J4C;>cnf4`qqwD3Nq6;gBvsJ*aO+Lj4%~nciG~GD2*|!WCoy7m+c; ziZ1Z=sbq}oa$3c8?YMG~zgC39`nL^1 z@=J5&^f4nP5Z<*xVVr#w5C7l~M@oY)-u&bRCm=5bv@wujmJkn4Bq4^>7vLWcg}1u# zaxnX?C$>I)SB2K$*O#wXSylb4=6gGoN#+-2R1ob$G+!jVHI7(R<;QVA@(Bwl#9j4{?f+X_#o zI6|&2&g0LI7zfy4b z3Mn&;srmmr#vxu#+1hfemn)S>8cE`;GSO-0qcq8MBfFWce*@Lro}0^=PAb&%Ax*a8 zXh8J3*M<7AOb9U$iANFUoxvB1DK8+u2 z8N9E*fyWQn+9+ik4Ob;_R)3|e*Rr6dLs$YP{~l&j9-D~b^qYGWdJJXFdDaHwGQg-a z$_SPfDTtF>CE#LEIwKBgAg>Yt0}3PfIHMp<-t!M!3E|~)j3i4P{Od$BZ3oKyj_nd7 z&(I8<3Mk-*o-vvKRMF=OT3V-`+YNkk5tj>&8HO9<^VP2}Bm2e+($cIx+v67Xh;xVcsvW%d69 zDNL$1=Lk~mM3naa{5Exdvu%F}8sg1&7j`MXt%bQJk~n2G!^*=#@iSPfL~@W1Jsu(H zJV+D26wEh_@?$@cfgYOR9G$`BZ%{%{GhP`6&St`uQ{!xH!%zr|(0Gb}OyMC_IJ$w; z4)nKXkf)<`J2aeawfEo--ss9>bKdN~*87fAhoTSgVZP<*|Ho5zPz--rE%=`j+Bu~W zUCoci-|CT;ij1DYee@)oQIFsn73Y4l3(;y?PLN9I?&nf{ivas3&RqRS|NPn1w>i;> zJeH-W^DSmi_P1vak*Xrl?)b$k0)Eh7h25C#{4O4-!{>jz;WDlKecntGx0a$=V!A^c zDlQj7yShMn@hwPdPs_NrDH6yM`iMULW$-tp6boPT;pi7~U~~$eUh@S${E*l8@rzTy zSz;-k=t~0n{ITrY5A|lNOq9zfjrAN@6#&8Saqp=sZGY*305FuaGUHS}MyoNx#VG zhw7a)C=kP4N^-4HXZGlq?F)(@!pQJL+G7`k7+-2lwNrB+DfOn8w1UJdYd)QgBGIU1-ww5U?rO$ZYVlYZwHZXh&4Me#>s8Xi zFB4js`P+7EDvGnjkce4fwNw?j(9d6!iByY4DHjX*pJ$=ehodjAv>%v#c61QM*#U0e z(qSTkKcgJ|g|Na{6~0Ke`1-Aa%*aaVSS|0ZsrP4W3@F=$zm>xgqcFBfaS$&6w|H#j zz}?kfPR#7wNl92dGRFTlyVJFLkwooqHIvZKJAeS7A`7n8lAG*oQ{jHX?K|?9YN9YF zlKnpua@U-#B3##}TT{TDcjHPx5(Vkuhj>QgA|#%G?loD!TQ15b4RLw)H9f!7`+x$7 z?6vc^@NosJmY0~&NVbwpU%F;Zc zzr)%>#TnSrJaahro#X&95Fxpgyo3q>(1ll{%4EXO?Sl})*hGtV7eDVi{Hx3jpp((? z0EB1Od@MGRThi>_z03!aF}25plBwV5X>cfBo?YKZEdI|A`~X(B-pPlkh;doNyLSc{ zH-kI`YF7^A=d*$kZ>n*f)|BgodnT@WALwtKBGj@-`ww6KRa4+zOT@m;-&-UQ?L3-z zI~=j^yx8WzXt>HX*ULTP`ZwE=AVn+o#-McFM zmjTjkQ`^dR)@FaRi|thBQwNV|L~1nsTgwl&WLi-xCC5*e#j_AIU4WFN-bLpI0G zQ2(Jf?R7)>UQ^zG^abPe^|Ys*o($Q2&$?2&EOF+#9f$M<-xGm!ROn)+7)^9yepl@|8S;!7AAlhe$2siqjas4BSW5}uTIyN7bJb2R9PzF z1HD&ADd>>?`K;8dmLzV)fw1N9sa4B&BWpKa{>yL%za3)lH`EwKrEJH$VbjIkbv6Xn z2%>%pP@qeZXuyYOR=O6VtGl;zJ@DI2Jt(K|kD2&ga)Y(!FHR+wK;=jKn7DlU8*psj zaW7%b0#?{nim|z;1`}2EaY`LRX0<2lh5FrkE!bPfh`4r!%tlQEZ7lNnUM%E4nHwt+ z7OVjITf?|L_rAkeuNibl;j)85f%repNl&H_*-6^11X<-A7`baCc0r0DWMYsb+$he) zhL^C>ToCeX+ioWtyW_FRV2TPYfY_&hm?1d~Ypg;BFJZC0hpt-{L4R`=uEq0Wtl&BS zG$mA??iz76eF+8mgQm0vGzdLYxQ0;L^YjJNKY=_b7Xq` z`{#cF?hg_0Sez!K)h1b=T%hTHmg9Fc0Mn0adYfNleaUjakJcTb-8}t$hkM$vHI>5dD8X%-lK_#9|r|) zuM3e-^x6FcA!SX#azPYF$;o^T| zmQ^9giEqgIY}0=`$*eVh=9AWr4Ie2ur{RE%2dupIK^gZKI5CPkt3*TZRR0}0=T<>>6{~nWpF^t~ z@mZYc@W8_}zq#gBmO6Oe!t)wNZIj=r^y6>Ttv%^ar7Oc&f$Ot6-nsc46)tKps<2o6 znes{<52VOFvlTq-&){VHSqZ%Fa? z@5L>Gq!y`|ew;(AYhfc`V;6~fHgSH~c-M@6PJEN`T7*`8ZQC-61IW*;)WAVg-6W+4{*wBic%sT+iInJws|z z>oM*BZ0&(k4YzDpj#bw%z$HbnpiINKL*}aE6|n*}4)Y&FzDW>Wx)s3Un*%VtzA;Je z3MJbIH`@+h{qKck8b)uCUp=RxF<21mcs0Y^0J^Duu&=}w>Ix{>*pk0T{ErkFD8FQSMtB=WlH!92*iCwx~OGtCVrdA+OcM@M%;@@9sIP@}hd+DP>=1Dovl_M(1>n^Y_oWaU1^)Nqoe%>_zm==*ucli@_KxnOaF z;}>+~muWbBR>Qy;35{x1Enh?kAtJ=_8f?-=J64|OH3BRbr09Z%`*MsY<^yZsrbj#b zerUBYTA*p&%s)q^3LHAEA@`hyy=Qd%U*EQ*^VW=aGz@g z`B#<-GwoIjZnCBO@{1$@>pF-usHL%2ns-*i(J~!bXEc0&TEAt(CH?2?Hey5xmdi1F zi;P!Jvm7oFdX6Q3xOUqxaHW|g9?UcIUkfh5l)shi!I$HV-nBs zbgdwB_bEM%9{WmTfx1Nb-tzgi1e{;jNvhqanX!9cv0KK3Tw?{Zf0SUE96bHGYD~TD zFR~TGv&y;!;0Y^Qd)&>SU`pJ3v(2y^bG8|m0|2bZ)mRQU)F7pobli79EjN1nYaOMx z1Rv`UoY|0Qj){#br*5)i@fqXc=%8REMu!S4hc5{7VWxr#9U(@Jo!v+O#m_F-n_0Dw*=!mIZ(SPr+UaZw9#5ZEA@nJ+Scelal{q8xTV(<=S zOOc9Xv-eU*!0~nl1^Hl)j0bu5F82s>?7W7j4AvgQYEsl4ZG5Blc%!L6PjoTfi12-m zg4_41mUT@(9VtW`Iqs8vGXBo%AiFQb`ocu*@pOB!*xO%7O9`KD=_;9$q*~5SxcYp*g1Zi|9BvJk~hhl zt(2p)4bP?Zu{kZrCz&$K;fWgL$0Lg2;p~rf@Xo}1W<#RqlLKzJXLwb7b4bC^Olu3| zfEv_oc`qp~(#cN25BJKrH-~c$j|eg|S2HxI@XcldwW#A=L)k+J6<>A`YyCCWoVfo; zm+{C^YYXJKFruZsogW>%EJMZv+?4AXK{g&$QK+K7vnLNG*e7^d?J+KlXl_>t(I%G^ zn(?b03reg_#;1i78QF*Y?Q|KB9c4K@Cdl%`s-aT;W(y(En-*Yrzokg`niTf<1r1ZS zDdAsM=%=l`x7iT_y=Y)Hmv=K*4vz}5zeK}l<+`D*S_Z^=M`He$AoN?*#kR4%$&s)r z1u90SD;Xy>BwBfYZ#ENXl7UHM@9&ZE5QkNs73AOf#ySS)MhO&E%k#O%g2n<(PclEO z-c@1D$E^gqC&Bsq`*@#>`?!bP^MX8Muw!s^YtPmm18Sh#oJ1+DbELWZI8m-+#tzx? z4P!(CzV9f}Ut^rVzt6H1jO8A3&kOQHjsn@h*YJFVKrwYaQ+p7AWi17|zk~T&BcoWw zm^9_x1B$gf$=)1@q3?9JebXk~`FFHxzk<8Dhuk{^c|TVRH*(Ukah|C?#)lEj>MX$u zIlnxhV8njw3*uvSiRK$zmF>jn!4@qL zJ#V{=nMKwY#J8FWWON0Wm$u1xzL@3k8bLM`7)#DaySe4+nFd6YI~gBfcy+$<^mZ8^ zU$8dcAOPQW6ltKrj>##T?0Dl0FY4wAuKQE}bfNRVR=oppm%COnZ!h8Xjh!WWxp#mi za{Q97BI!T&4OYt$BVtWPvSdh((u+EV|74G3IlQa}`RRzU3LBCJ=w)( z**0biw#%5|f{L55~c5wESgu6Ria^9n%vXq(nUAop*lp1dfQ-RB*EU3Du!%VHW(S+!?;+GL#4)g z&YuV;ig4jv^Q1@tPj|O{XVv*uXDb-xqFr0(MhWy>cVo%;rhFCsb}1ZFd8;7%N;E?! z8rj0NwMTD@Y9~zxW^J)!{weFrpg_R43C34=UzM$3bT;>Kcy*G#-GCqs1nlqO1M6HJ zKBHmK_m$mUA;({X(Ca{7n_)TLNtam;U#LNr7-%t>+e~QZ?GO6xAqB&-RNWOta7II- zIXwelbfw6dDR#^|#Zi^l3v%R)1|!?W_l)-5+9Us*hB@g9{#E9h0=TNJNF&=Ct2NGD z)-fr?`hFM2MIlyEh4bH2BN4mf>U-zrH=kxHXz{bGyF!jmHq6dQmJG{reN=^0tTCds4+qyVc0G7tJsCc`fb>Bbwjc2BSOJ?kZ9-FjYBlT07t?+BVx_+MCs1H&5Y+;i+9SHTEGJieKrS)s6`kP>i8C4BSR>xVNK7@ zIZrQEG5C9X$I%B|C&$!qqOE@kFf2!<0!-d$XE}Vm1_6MyMZ9R4#5lUV{L@sCE*99IO=Dd8qa3 zryK?Cf3W}LN;yW?qM)39HdAt>9#_$QqnyEV_)!f40RL<$(7g`KdG652y@F(%P_baI zYWb2oSMy$sKob+qP1*f4OTj%nHP-)X5C9mTV8iqVH_k=Igpu2lkHYgBW~A8Bd8?wk zQjR`>7@3|dnU-T#ik;=~=Nbe67W584>pe1EZ}XMpdan25*aZ!%52%K>TyTaLB7Pr% zYi6C^W9KzIzDQ58=e({y(QC7}Y&e%My5H`JmXb~)c*K`iH|BMLsu)dD{+*MD>8 z1I~#QXkrHmRt>y5?0@iH4F29XVwh)|cqfUsvdb z?k-VQhEu@ri^|PTm9e~x^9>f{e+ae_hPRRM_(nVamZt1z8AOY23#Bgv0)m5p%XUE5 zfMUCjEf+DP(5{a?t$J>rgVo^_0BkK(F+N@SGFQcLE;200pAZOmyI%mpezhkpDAD!J z7rpOCG=xy`c1y9=-R&e(oqbos+ncc<4l}=Z0D`y6G^@ya3XH47D7v8GnH>r~;VH2! zh%?OWZbQ9vnI7@*uWADU`xmzq+l`F3Rtx~xoUdY3hO+mRh6FAmEQr%Q+}VcE0GY-d za=#?4Bz!ctl{juhTh}zeEl!g$wU9$9=66i>q`Px|^|(-?u`we0$GC2Zp`Ar4E?nY5 zVG0507bCJDSNJ7g#VsycOEyBpu9un#UHUW?(Xy_4C?WWkXaSufMgE2u-xuTxYY!-R;jp?WQ^r(hkDXGVXk-f!Nzp6?ZqvHasD@;Q79oi hh-F|{5Qg!2{ttCVVLRmt5W4^X002ovPDHLkV1g)ppN{|l literal 0 HcmV?d00001 From d02b9106f0a9ccfc0b9023612e7e9ac6f7fbc960 Mon Sep 17 00:00:00 2001 From: Florian Werner Date: Sat, 8 Sep 2018 01:10:31 +0200 Subject: [PATCH 32/48] Update statistics sensor (#6034) --- source/_components/sensor.statistics.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.statistics.markdown b/source/_components/sensor.statistics.markdown index a169c2cc71d..d28f73eabee 100644 --- a/source/_components/sensor.statistics.markdown +++ b/source/_components/sensor.statistics.markdown @@ -14,7 +14,7 @@ ha_release: "0.30" --- -The `statistics` sensor platform consumes the state from other sensors. Besides the maximum and the minimum values, the total, mean, median, variance and the standard deviation are also available as attributes. If it's a binary sensor then only state changes are counted. +The `statistics` sensor platform consumes the state from other sensors. It exports the `mean` value as state and the following values as attributes: `count`, `mean`, `median`, `stdev`, `variance`, `total`, `min`, `max`, `min_age`, `max_age`, `change`, `average_change` and `change_rate`. If it's a binary sensor then only state changes are counted. If you are running the [recorder](/components/recorder/) component, on startup the data is read from the database. So after a restart of the platform, you will immediately have data available. If you're using the [history](/components/history/) component, this will automatically also start the `recorder` component on startup. If you are *not* running the `recorder` component, it can take time till the sensor starts to work because a couple of attributes need more than one value to do the calculation. @@ -43,6 +43,7 @@ Configuration variables: - **name** (*Optional*): Name of the sensor to use in the frontend. Defaults to `Stats`. - **sampling_size** (*Optional*): Size of the sampling. If the limit is reached then the values are rotated. Defaults to `20`. - **max_age** (*Optional*): Maximum age of measurements. Setting this to a time interval will cause older values to be discarded. +- **precision** (*Optional*): Defines the precision of the calculated values, through the argument of round(). Defaults to `2`.

From 7218029b3405581284959b30a357c27a852fe194 Mon Sep 17 00:00:00 2001 From: Pavel Pletenev Date: Sat, 8 Sep 2018 14:34:56 +0200 Subject: [PATCH 33/48] Docs for Habitica component (#5923) * Docs for Habitica component (1/2) Signed-off-by: delphi * Added sensor docs. Updated docs to match habitica code. Signed-off-by: delphi * Fix docs according to docs Signed-off-by: delphi * Fix typos and code review Signed-off-by: delphi --- source/_components/habitica.markdown | 132 ++++++++++++++++++ source/_components/sensor.habitica.markdown | 21 +++ .../images/screenshots/habitica_new_task.png | Bin 0 -> 2535 bytes source/images/supported_brands/habitica.png | Bin 0 -> 5677 bytes 4 files changed, 153 insertions(+) create mode 100644 source/_components/habitica.markdown create mode 100644 source/_components/sensor.habitica.markdown create mode 100644 source/images/screenshots/habitica_new_task.png create mode 100644 source/images/supported_brands/habitica.png diff --git a/source/_components/habitica.markdown b/source/_components/habitica.markdown new file mode 100644 index 00000000000..fbd51c31267 --- /dev/null +++ b/source/_components/habitica.markdown @@ -0,0 +1,132 @@ +--- +layout: page +title: "Habitica" +description: "Instructions on enabling Habitica support for your Home Assistant" +date: 2018-08-09 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: habitica.png +ha_category: Hub +ha_version: 0.78 +ha_iot_class: "Cloud Polling" +--- + +This component allows you to monitor and manage your Habitica profile. This component exposes the [Habitica's API](https://habitica.com/apidoc/) as a Home Assistant service. It supports multiple users and allows you to automate checking out your habits and daily tasks or casting magics using Home Assistant. +This component enables usage of [`sensor.habitica` platform.](/components/sensor.habitica/) +To use the component you should use this example configuration: + +```yaml +# Minimum viable configuration.yaml entry +habitica: + - api_user: 'REPLACE_ME_WITH_YOUR_USER_ID' + api_key: 'REPLACE_ME_WITH_YOUR_API_KEY' +``` + +You can specify several users, providing `api_user` and `api_key` for each. +At runtime you will be able to use API for each respective user by their Habitica's username. +You can override this by passing `name` key, this value will be used instead of the username. +If you are hosting your own instance of Habitica, you can specify a URL to it in `url` key. + +{% configuration %} +api_user: + description: "Habitica's API user ID. This value can be grabbed from [account setting](https://habitica.com/user/settings/api)" + required: true + type: string +api_key: + description: "Habitica's API password (token). This value can be grabbed from [account setting](https://habitica.com/user/settings/api) by pressing 'Show API token'" + required: true + type: string +name: + description: "Override for Habitica's username. Will be used for service calls" + required: false + type: string + default: Deduced at startup +url: + description: "URL to your Habitica instance, if you are hosting your own" + required: false + type: string + default: http://habitica.com +sensors: + description: List of sensors to generate for this user. If you don't specify this entry then the default (all sensors) will be generated. If you specify this entry empty then no sensors will be generated. + required: false + type: list + default: all (`name`, `hp`, `maxHealth`, `mp`, `maxMP`, `exp`, `toNextLevel`, `lvl`, `gp`, `class`) +{% endconfiguration %} + +### {% linkable_title API Service Parameters %} + +The API is exposed to Home Assistant as a service called `habitica.api_call`. To call it you should specify this keys in service data: + +| Service data attribute | Required | Type | Description | +|----------------------|--------|--------|----------------| +| `name` | yes | string | Habitica's username as per `configuration.yaml` entry. | +| `path` | yes | [string] | Items from API URL in form of an array with method attached at the end. See the example below. | +| `args` | no | map | Any additional json or url parameter arguments. See the example below and [apidoc](https://habitica.com/apidoc/). | + +A successful call to this service will fire an event `habitica_api_call_success`. + +| Event data attribute | Type | Description | +|----------------------|--------|----------------| +| `name` | string | Copied from service data attribute. | +| `path` | [string] | Copied from service data attribute. | +| `data` | map | Deserialized `data` field of JSON object Habitica's server returned in response to api call. For more info see [docs](https://habitica.com/apidoc/). | + +#### Let's consider some examples on how to call the service. + +For example, let's say that there is a configured `habitica` platform for user `xxxNotAValidNickxxx` with their respective `api_user` and `api_key`. +Let's create a new task (a todo) for this user via Home Assistant. There is an [API call](https://habitica.com/apidoc/#api-Task-CreateUserTasks) for this purpose. +To create a new task one should hit `https://habitica.com/api/v3/tasks/user` endpoint with `POST` request with a json object with task properties. +So let's call the API on `habitica.api_call`. +* The `name` key becomes `xxxNotAValidNickxxx`. +* The `path` key is trickier. + * Remove 'https://habitica.com/api/v3/' at the beginning of the endpoint URL. + * Split the remaining on slashes (/) and **append the lowercase method** at the end. + * You should get `["tasks", "user", "post"]`. To get a better idea of the API you are recommended to try all of the API calls in IPython console [using this package](https://github.com/ASMfreaK/habitipy/blob/master/README.md). +* The `args` key is more or less described in the [docs](https://habitica.com/apidoc/). + +Combining all together: +call `habitica.api_call` with data +``` +{ + "name": "xxxNotAValidNickxxx", + "path": ["tasks", "user", "post"], + "args": {"text": "Use API from Home Assistant", "type": "todo"} +} +``` + +This call will create a new todo on `xxxNotAValidNickxxx`'s account with text `Use API from Home Assistant` like this: + +![example task created](/images/screenshots/habitica_new_task.png) + +Also an event `habitica_api_call_success` will be fired with the following data: +``` +{ + "name": "xxxNotAValidNickxxx", + "path": ["tasks", "user", "post"], + "data": { + "challenge": {}, + "group": {"approval": {"required": false, + "approved": false, + "requested": false}, + "assignedUsers": [], + "sharedCompletion": "recurringCompletion"}, + "completed": false, + "collapseChecklist": false, + "type": "todo", + "notes": "", + "tags": [], + "value": 0, + "priority": 1, + "attribute": "str", + "text": "Use API from Home Assistant", + "checklist": [], + "reminders": [], + "_id": "NEW_TASK_UUID", + "createdAt": "2018-08-09T18:03:27.759Z", + "updatedAt": "2018-08-09T18:03:27.759Z", + "userId": "xxxNotAValidNickxxx's ID", + "id": "NEW_TASK_UUID"} +} +``` diff --git a/source/_components/sensor.habitica.markdown b/source/_components/sensor.habitica.markdown new file mode 100644 index 00000000000..4e94148bb9f --- /dev/null +++ b/source/_components/sensor.habitica.markdown @@ -0,0 +1,21 @@ +--- +layout: page +title: "Habitica Sensor" +description: "Instructions on enabling Habitica support for your Home Assistant" +date: 2018-08-09 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: habitica.png +ha_category: Sensor +ha_iot_class: "Cloud Polling" +ha_version: 0.78 +--- + +The `habitica` sensor platform allows you to view and monitor your player data from [Habitica](https://habitica.com/) in Home Assistant. + +

+You must have the [`habitica` component](/components/habitica/) +configured to use this platform. After configuring that component, sensors specified there will automatically appear. +

diff --git a/source/images/screenshots/habitica_new_task.png b/source/images/screenshots/habitica_new_task.png new file mode 100644 index 0000000000000000000000000000000000000000..dd21d3a3b6c8a1c60824ba028f9df04422d14c17 GIT binary patch literal 2535 zcmb7GXHb*t68_*IgaAi#L{T6JMg*jb5+y(+M+}4_N;lGbmqU>r3mzgMMIcBCC?SA! z>4F4=fI$?cgVIargdTw$ax-`4&fI@@?w@^kc6Mf;eP;LB_qmBNS_mu(1^_@vU+?B! z0N{GY@wGtQ9Q(CmrkeBo7J$+>1A#z4r*BUI0DrFjO&zn4?6vVwvy;OTd>aTg{%E6{ z+>b5&fP_7C;w1sWB44f6D3Ys|}QNmKxVt_pR%zg!n*x69v8X{!>bfl zHWn=xif0WYI|Q;ePqtH{deJjui`9+8uu!jn^FYYSjqEV#H1H6khVX(e)2WYLU zEX{ElEf_|NcUP6E!huRfh3+lC;b?+P=!K*EllCe#Z394SCw{VYQ>>;}jp`)>JR&${ zs&_JmWn<6(N`L?#0O2>XpIQ6fz@s6TY_#xcJzxW65`Fogi*E=GNS>m>fTY;EWb~<1 zX*yiXS#ZD2j2(=-zrFl4Tjva7D_0yoFLZ^UF1ZF!R=m07Yn2Sp}3m zE8tNt@tI2wdZ!S6Fpv=tx^NB|rQmCqTDdVb{Y4R*(#=S%ux>7Y4xt?Gy}A|P6M*TH zuQ;gPaK>6Vk=;exRqmw7goT!TS$`4t;@b#i#oEo$TG`#rTQxDNnU#flv)I?Mu$rOi z-xL#5g=Ll>9W{$6K4|+ydaTh}-OY71 zDXG$0jc(f#_4Gs=QtGO-qW7<&cO=;Mwz2{qE4($d(J=Ds$B#yOi(&Vzx>Df+>8n2c zU=tBx;mq~eGt7@~Q{4Lc>u`;(P^tVPJv9$hAg$FQz_ruD!h*klVmpYAfPIQThtM}Q zGX$wFAL9_d0O_uhC*UqGJ*CAHm(rEl!5gg(39|$RTh)*UG)k!rRHNa7pP}kn8j&bA zhE!?5**k>>GHivUsI{b$(PlP2<1FO5lJ^|mFHvF!ySld4Ur+u^JiRjH{cVxl@$lfl zm7$=`Pu3scsHAMAw;FvMIa!-qHhs;QB&XD3s_heY z#i$>WJS|U%bQ~a8Rbfoc#KpxI7w4>OA}csU8IxP_i~nAky3?VO-DJ9!W~%G)OX=M% zm(RAVfS={<-BFZs9?D*tn6R}Jh{G7*CO6F+Q&OB*c@5tk7&daUJ9~TQqrc>6+02u} za63gWy~w5ok$RvzC48x=EMJX~nOJkq93kai+9H)A1f}v9i#wkrE6P9f&^N+n7PX+> zygqwRDdp$r=({lW&~9EN((e6zi8Eu$3~$PJfB&|&9&P33?Fm|Bcom34!R>vSnBcO} zQ0ESn^U*Y6>TXcp*U%mZPD6Qx#yLpFERD9&bJdOf^!lImxr{?|ScEP!#i zcNc~CFmT!xX*qqXQ{@U24!0%A4SB8{QhL!N()B6Zrh`Mn@M@a9Kqe7wAxLsNm&CSn z-lKE-Z#(@h2(3}nf;mQ*VU}+ZT*k-7E(epvc2CVYFA!2wDT6p!sc0AL1X#azEdAl8 z_0-gBlh6$IT#?7E7QuXX0}8z-*L0zNAE*j(jx%sD>(f4JHo`{hWR8&gmrg6`y;AXy z_?+H#xaUf|9=T_IiL0*2CmXpuNAIM)D*k-w$U#?^jG5O5$;mfGO0Fce;1~nSDTB+8 z537F<4GYr@*|_mGkh!_^g$+q0^)K~g_Z%){re#<+sZ|HdNaLcGW?ZHNu4oG=2*6PI z`g%)_0yH*i9NjQaGoQe1*Rif5nKVLLTTOm}Vww>Z{fs=KcU12wv5sH;jMBI!?_$aBsD6cL;+yL?FcbURlg-~rpAnsNIW zO4%TeXHDlP4Thp^QKi?{iS(~F4bGdfkD~lKsXZ5?Lqba|aE*Uq4-$%=n-Ymc?M&6d zo}Tr%{2GMsUi|m&m)ttxI-AU= zbIS4g!z*H7JSA@k26z zyvyA0Y{_}xIXyD-;1cw;)=7f4LU$iWFjGTRcaZlMT?NWT42hhd8=$Xie6t*7|Kwkf CPt$e) literal 0 HcmV?d00001 diff --git a/source/images/supported_brands/habitica.png b/source/images/supported_brands/habitica.png new file mode 100644 index 0000000000000000000000000000000000000000..a90f684be213adf6285e98e8e5c21671b3f7f52a GIT binary patch literal 5677 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 LGwhK~K+^vJ50@73 literal 0 HcmV?d00001 From c43ac57f4217c95ee2e83420d4d430c52bcb4cc3 Mon Sep 17 00:00:00 2001 From: Rohan Kapoor Date: Sat, 8 Sep 2018 06:56:44 -0700 Subject: [PATCH 34/48] Demonstrate that complex templates can be used for script delays (#6224) * Demonstrate that complex templates can be used for script delays * Fix escaping * Start comments with a capital letter --- source/_docs/scripts.markdown | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown index 7534ae05787..9d8b8a218b6 100644 --- a/source/_docs/scripts.markdown +++ b/source/_docs/scripts.markdown @@ -67,10 +67,19 @@ Delays are useful for temporarily suspending your script and start it at a later ```yaml # Waits 1 minute - delay: - # supports milliseconds, seconds, minutes, hours, days + # Supports milliseconds, seconds, minutes, hours, days minutes: 1 ``` +{% raw %} +```yaml +# Waits however many seconds input_number.second_delay is set to +- delay: + # Supports milliseconds, seconds, minutes, hours, days + seconds: "{{ states('input_number.second_delay') }}" +``` +{% endraw %} + {% raw %} ```yaml # Waits however many minutes input_number.minute_delay is set to @@ -85,14 +94,14 @@ Wait until some things are complete. We support at the moment `wait_template` fo {% raw %} ```yaml -# wait until media player have stop the playing +# Wait until media player have stop the playing - wait_template: "{{ is_state('media_player.floor', 'stop') }}" ``` {% endraw %} {% raw %} ```yaml -# wait for sensor to trigger or 1 minute before continuing to execute. +# Wait for sensor to trigger or 1 minute before continuing to execute. - wait_template: "{{ is_state('binary_sensor.entrance', 'on') }}" timeout: '00:01:00' continue_on_timeout: 'true' @@ -125,7 +134,7 @@ You can also get the script to abort after the timeout by using `continue_on_tim {% raw %} ```yaml -# wait until a valve is < 10 or continue after 1 minute. +# Wait until a valve is < 10 or continue after 1 minute. - wait_template: "{{ states.climate.kitchen.attributes.valve|int < 10 }}" timeout: '00:01:00' continue_on_timeout: 'false' From 40d816c7ba384c40d18ba3bc5bc2471ad6bf3450 Mon Sep 17 00:00:00 2001 From: mvn23 Date: Sun, 9 Sep 2018 09:42:25 +0200 Subject: [PATCH 35/48] Add note to OpenTherm Gateway documentation (#6230) Add a note about update propagation speed to the OpenTherm Gateway documentation. --- source/_components/climate.opentherm_gw.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/climate.opentherm_gw.markdown b/source/_components/climate.opentherm_gw.markdown index bbed48193d3..4b67af4667b 100644 --- a/source/_components/climate.opentherm_gw.markdown +++ b/source/_components/climate.opentherm_gw.markdown @@ -46,6 +46,10 @@ floor_temperature: type: boolean {% endconfiguration %} +

+The OpenTherm protocol is based on polling. The thermostat sends requests to the boiler at specific intervals. As a result, it may take some time for changes to propagate between Home Assistant and the thermostat. +

+ # {% linkable_title Example %} A full configuration example with the OpenTherm Gateway connected to a remote host running `ser2net` looks like the one below. From 817498f2e8d00def3509340b6891c9e9fce3fe48 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 9 Sep 2018 10:16:29 +0200 Subject: [PATCH 36/48] Add service data sample --- source/_components/wake_on_lan.markdown | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/_components/wake_on_lan.markdown b/source/_components/wake_on_lan.markdown index 93787c4aaef..87603ad2338 100644 --- a/source/_components/wake_on_lan.markdown +++ b/source/_components/wake_on_lan.markdown @@ -36,3 +36,13 @@ Send a _magic packet_ to wake up a device with 'Wake-On-LAN' capabilities. |---------------------------|----------|-------------------------------------------------------| | `mac` | no | MAC address of the device to wake up. | | `broadcast_address` | yes | Optional broadcast IP where to send the magic packet. | + + +Sample service data: + +```json +{ + "mac":"00:40:13:ed:f1:32" +} +``` + From 1d7b020ce26ffb4337efa14a6ae8ef8068591a09 Mon Sep 17 00:00:00 2001 From: Julian Kahnert Date: Mon, 10 Sep 2018 12:40:22 +0200 Subject: [PATCH 37/48] update geizhals doc (#6026) * update geizhals doc * :pencil2: Tweak --- source/_components/sensor.geizhals.markdown | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/source/_components/sensor.geizhals.markdown b/source/_components/sensor.geizhals.markdown index c9780740569..636751da35b 100644 --- a/source/_components/sensor.geizhals.markdown +++ b/source/_components/sensor.geizhals.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Cloud Polling" ha_release: "0.51" --- - The `geizhals` sensor will give you the best price of a product from [Geizhals](https://geizhals.de) or related site. With this information can be used in e.g., automations to notify you when a price drops. To enable this sensor, add the following lines to your `configuration.yaml` file: @@ -23,16 +22,16 @@ To enable this sensor, add the following lines to your `configuration.yaml` file sensor: - platform: geizhals name: qc35 - product_id: 1453021 + product_id: 1696985 ``` Configuration variables: - **name** (*Required*): The internal name of the product in Home Assistant. -- **product_id** (*Required*): ID of the product. Get the ID from the geizhals website of your chosen product by clicking on the *Price History* tab, e.g., [here](https://geizhals.de/?phist=1453021). The URL of this site reveals the ID, e.g., with `product_id: 1453021`. +- **product_id** (*Required*): ID of the product. Get the ID from the Geizhals website of your chosen product by opening the *Price History* in a new browser tab (right-click on the price history > open in new tab). +The URL of this site reveals the ID, e.g. `https://geizhals.de/?phist=1696985` with a `product_id` of `1696985`. - **description** (*Optional*): The name of the product in the front end. -- **domain** (*Optional*): Domain which should be used for the request. Set this to `geizhals.at`, `geizhals.eu`, `geizhals.de`, `skinflint.co.uk` or `cenowarka.pl`. Defaults to `geizhals.de`. -- **regex** (*Optional*): Regular expression to parse the price. Default: `\D\s(\d*)[\,|\.](\d*)`. +- **locale** (*Optional*): Localisation which should be used for the request. Set this to `AT`, `EU`, `DE`, `UK` or `PL`. Defaults to `DE`. #### {% linkable_title Extended example %} @@ -41,8 +40,7 @@ Configuration variables: sensor: - platform: geizhals name: qc35 - product_id: 1453021 + product_id: 1696985 description: "Bose QC35" - domain: 'geizhals.de' - regex: '\D\s(\d*)[\,|\.](\d*)' + locale: "DE" ``` From 3d76207eeafdec7556f1f047e2cffcc10e5a325a Mon Sep 17 00:00:00 2001 From: Pawel Date: Mon, 10 Sep 2018 13:19:44 +0200 Subject: [PATCH 38/48] Support for switch radio preset Onkyo (#6107) --- .../_components/media_player.onkyo.markdown | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/source/_components/media_player.onkyo.markdown b/source/_components/media_player.onkyo.markdown index 630182ba6df..0737d7a9124 100644 --- a/source/_components/media_player.onkyo.markdown +++ b/source/_components/media_player.onkyo.markdown @@ -79,3 +79,26 @@ List of source names: - multi-ch - xm - sirius + +### {% linkable_title Example `play_media` script %} + +The `play_media` function can be used in script to play radio station by preset number. +Not working for NET radio. + +```yaml +# Example play_media script +# +script: + radio1: + alias: "Radio 1" + sequence: + - service: media_player.turn_on + data: + entity_id: media_player.onkyo + - service: media_player.play_media + data: + entity_id: media_player.onkyo + media_content_type: "radio" + media_content_id: "1" + +``` From 769c6323d893a79b8b5e31d3133726cef3d85056 Mon Sep 17 00:00:00 2001 From: Louis-Dominique Dubeau Date: Mon, 10 Sep 2018 07:21:06 -0400 Subject: [PATCH 39/48] Add the documentation for the new base_url option for tts. (#6219) * Add the documentation for the new base_url option for tts. * Clarify where base_url may be set. * Convert the parameter table to use the configuration template. * :pencil2: Tweaks --- source/_components/tts.markdown | 56 +++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/source/_components/tts.markdown b/source/_components/tts.markdown index 5fc0d8de47b..0b333959348 100644 --- a/source/_components/tts.markdown +++ b/source/_components/tts.markdown @@ -10,11 +10,11 @@ footer: true ha_release: 0.35 --- -Text-to-speech (TTS) enables Home Assistant to speak to you. +Text-to-Speech (TTS) enables Home Assistant to speak to you. ## {% linkable_title Configuring a `tts` platform %} -To get started, add the following lines to your `configuration.yaml` (example for google): +To get started, add the following lines to your `configuration.yaml` (example for Google): ```yaml # Example configuration.yaml entry for google tts service @@ -23,28 +23,66 @@ tts: ```

-Depending on your setup, you might need to set a base URL (`base_url`) inside the [http component](/components/http/). +Depending on your setup, you might need to set a base URL (`base_url`) inside the [http component](/components/http/) or in the parameters of this component.

The following optional parameters can be used with any platform. However, the TTS component will only look for global settings under the configuration of the first configured platform: -| Parameter | Default | Description | -|---------------------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `cache` | True | Allow TTS to cache voice file to local storage. | -| `cache_dir` | tts | Folder name or path to a folder for caching files. | -| `time_memory` | 300 | Time to hold the voice data inside memory for fast play on a media player. Minimum is 60 s and the maximum 57600 s (16 hours). | +{% configuration %} +cache: + description: Allow TTS to cache voice file to local storage. + required: false + type: boolean + default: True +cache_dir: + description: Folder name or path to a folder for caching files. + required: false + type: string + default: tts +time_memory: + description: Time to hold the voice data inside memory for fast play on a media player. Minimum is 60 s and the maximum 57600 s (16 hours). + required: false + type: int + default: 300 +base_url: + description: A base URL to use *instead* of the one set in the [http component](/components/http/). It is used as-is by the `tts` component. In particular, you need to include the protocol scheme `http://` or `https://` and the correct port number. They will not be automatically added for you. + required: false + type: string + default: value of ``http.base_url`` +{% endconfiguration %} The extended example from above would look like the following sample: ```yaml -# Example configuration.yaml entry for google tts service +# Example configuration.yaml entry for Google TTS service tts: - platform: google cache: true cache_dir: /tmp/tts time_memory: 300 + base_url: http://192.168.0.10:8123 ``` +## {% linkable_title When do you need to set `base_url` here? %} + +The general answer is "whenever the global `base_url` set in [http component](/components/http/) is not adequate to allow the `say` service to run". The `say` service operates by generating a media file that contains the speech corresponding to the text passed to the service. Then the `say` service sends a message to the media device with a URL pointing to the file. The device fetches the media file at the URL and plays the media. Some combinations of a media device, network configuration and Home Assistant configuration can make it so that the device cannot fetch the media file. + +The following sections describe some of the problems encountered with media devices. + +### {% linkable_title Self-signed certificates %} + +This problem occurs when your Home Assistant instance is configured to be accessed through SSL, and you are using a self-signed certificate. + +The `tts` service will send an `https://` URL to the media device, which will check the certificate, and reject it. So it won't play your file. If you could make the device accept your certificate, it would play the file. However, many media devices do not allow changing settings to accept self-signed certificates. Ultimately, your option may be to serve files to the device as `http://` rather than `https://`. To do this, you *could* change the `base_url` setting in [http component](/components/http/), but that would turn off SSL for all services that use `base_url`. Instead, setting a `base_url` for the `tts` service allows turning off SSL only for this component. + +### {% linkable_title Google cast devices %} + +The Google cast devices (Google Home, Chromecast, etc.) present the following problems: + +* They [reject self-signed certificates](#self-signed-certificates). + +* They do not work with URLs that contain hostnames established by local naming means. Let's say your Home Assistant instance is running on a machine made known locally as `ha`. All your machines on your local network are able to access it as `ha`. However, try as you may, your cast device won't download the media files from your `ha` machine. That's because your cast device ignores your local naming setup. In this example, the `say` service creates a URL like `http://ha/path/to/media.mp3` (or `https://...` if you are using SSL). Setting a `base_url` that contains the IP address of your server works around this issue. By using an IP address, the cast device does not have to resolve the hostname. + ## {% linkable_title Service say %} The `say` service support `language` and on some platforms also `options` for set, i.e., *voice, motion, speed, etc*. The text for speech is set with `message`. From a390b8d2faebb876af44f7d74270712c4c967a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Mon, 10 Sep 2018 13:49:50 +0200 Subject: [PATCH 40/48] Adds Switchmate documentation (#6031) * Create switch.switchmate.markdown * Add switchmate logo * Update switch.switchmate.markdown * Update switch.switchmate.markdown * Update switch.switchmate.markdown * Update switch.switchmate.markdown * Update switch.switchmate.markdown * Update switch.switchmate.markdown * :pencil2: Typo fix --- source/_components/switch.switchmate.markdown | 36 ++++++++++++++++++ .../supported_brands/switchmate-logo-rgb.png | Bin 0 -> 17081 bytes 2 files changed, 36 insertions(+) create mode 100644 source/_components/switch.switchmate.markdown create mode 100644 source/images/supported_brands/switchmate-logo-rgb.png diff --git a/source/_components/switch.switchmate.markdown b/source/_components/switch.switchmate.markdown new file mode 100644 index 00000000000..b6e53624eed --- /dev/null +++ b/source/_components/switch.switchmate.markdown @@ -0,0 +1,36 @@ +--- +layout: page +title: "Switchmate" +description: "Instructions on how to set up Switchmate switches." +date: 2018-08-17 22:41 +sidebar: true +comments: false +sharing: true +footer: true +logo: switchmate-logo-rgb.png +ha_category: Switch +ha_release: 0.78 +ha_iot_class: "Local Polling" +--- + +This `Switchmate` switch platform allows you to control Switchmate [devices]( https://www.mysimplysmarthome.com/products/switchmate-switches/). + +To enable it, add the following lines to your `configuration.yaml`: + +```yaml +switch: + - platform: switchmate + mac: 'cb:25:0b......' +``` + +{% configuration %} +mac: + description: Device MAC address. + required: true + type: string +name: + description: The name used to display the switch in the frontend. + required: false + type: string +{% endconfiguration %} + diff --git a/source/images/supported_brands/switchmate-logo-rgb.png b/source/images/supported_brands/switchmate-logo-rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..97030d5c6a552399aed0bab6c3e199a592977d32 GIT binary patch literal 17081 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 literal 0 HcmV?d00001 From 0600c2cabddf4b9b3c9244822dd568484c8d4bfd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 10 Sep 2018 13:57:31 +0200 Subject: [PATCH 41/48] Add draft blog post --- _config.yml | 4 +- source/_posts/2018-09-15-release-78.markdown | 393 +++++++++++++++++++ 2 files changed, 395 insertions(+), 2 deletions(-) create mode 100644 source/_posts/2018-09-15-release-78.markdown diff --git a/_config.yml b/_config.yml index 60823e3e2d0..59c65eb54bb 100644 --- a/_config.yml +++ b/_config.yml @@ -141,9 +141,9 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 77 +current_minor_version: 78 current_patch_version: 0 -date_released: 2018-08-29 +date_released: 2018-09-15 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2018-09-15-release-78.markdown b/source/_posts/2018-09-15-release-78.markdown new file mode 100644 index 00000000000..b595c05b9a8 --- /dev/null +++ b/source/_posts/2018-09-15-release-78.markdown @@ -0,0 +1,393 @@ +--- +layout: post +title: "0.78: XXX - Update date" +description: "XXX" +date: 2018-09-10 00:01:00 +date_formatted: "September 15, 2018" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2018-09-0.78/social.png +--- + + + +## {% linkable_title New Platforms %} + +- Add temperature sensors to the velbus component ([@Cereal2nd] - [#16203]) ([velbus docs]) ([sensor.velbus docs]) (new-platform) +- Add Volkszaehler sensor ([@fabaff] - [#16188]) ([sensor.volkszaehler docs]) (new-platform) +- Switchmate ([@Danielhiversen] - [#15535]) ([switch.switchmate docs]) (new-platform) +- Add support for Habitica ([@ASMfreaK] - [#15744]) ([habitica docs]) ([sensor.habitica docs]) (new-platform) +- Geo Location component ([@exxamalte] - [#15953]) ([feedreader docs]) ([geo_location docs]) (new-platform) +- Add Cover to the Insteon component ([@teharris1] - [#16215]) ([insteon docs]) ([cover.insteon docs]) (new-platform) +- switchbot ([@Danielhiversen] - [#16396]) ([switch.switchbot docs]) (new-platform) +- Add Yale Smart Alarm component ([@domwillcode] - [#16377]) ([alarm_control_panel.yale_smart_alarm docs]) (new-platform) +- Add OpenTherm Gateway climate platform ([@mvn23] - [#16299]) ([climate.opentherm_gw 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 %} + +- Rewrite of Trafikverket weather - Multiple sensor types supported ([@endor-force] - [#15935]) ([sensor.trafikverket_weatherstation docs]) (breaking change) +- Fix geizhals price parsing ([@JulianKahnert] - [#15990]) ([sensor.geizhals docs]) (breaking change) +- Update to EnvoyReader 0.2, support for more hardware ([@jesserizzo] - [#16212]) ([sensor.enphase_envoy docs]) (breaking change) +- Fix Mi Flora median calculation ([@PaulAnnekov] - [#16085]) ([sensor.miflora docs]) (breaking change) +- Added Twitch v5 support to the twitch platform ([@ioangogo] - [#16428]) ([sensor.twitch docs]) (breaking change) +- Update radiotherm ([@cpw] - [#15031]) ([climate.radiotherm docs]) (breaking change) + +## {% linkable_title All changes %} + +- Add 'moon_phase' to Dark Sky sensor ([@fabaff] - [#16179]) ([sensor.darksky docs]) +- Zoneminder SSL fix ([@djm300] - [#16157]) ([zoneminder docs]) +- update python-velbus library version ([@thomasdelaet] - [#16194]) ([velbus docs]) +- MQTT: Log transmitted as well as received messages ([@smurfix] - [#16195]) ([mqtt docs]) +- Upgrade sqlalchemy to 1.2.11 ([@fabaff] - [#16192]) ([sensor.sql docs]) +- Add battery warning, rssi level and check for availability ([@fucm] - [#16193]) ([sensor.tahoma docs]) +- Inconsistent entity_id when multiple sensors ([@grea09] - [#16205]) ([sensor.dnsip docs]) +- Add temperature sensors to the velbus component ([@Cereal2nd] - [#16203]) ([velbus docs]) ([sensor.velbus docs]) (new-platform) +- Rewrite of Trafikverket weather - Multiple sensor types supported ([@endor-force] - [#15935]) ([sensor.trafikverket_weatherstation docs]) (breaking change) +- Add device_tracker.bluetooth_update service ([@kariudo] - [#15252]) ([device_tracker docs]) +- Fix geizhals price parsing ([@JulianKahnert] - [#15990]) ([sensor.geizhals docs]) (breaking change) +- Add Volkszaehler sensor ([@fabaff] - [#16188]) ([sensor.volkszaehler docs]) (new-platform) +- openalpr flag `WITH_TEST` should be `WITH_TESTS` ([@vrih] - [#16218]) +- Upgrade alpha_vantage to 2.1.0 ([@fabaff] - [#16217]) ([sensor.alpha_vantage docs]) +- Store devices as dict instead of list ([@Kane610] - [#16229]) +- Improve package loadable ([@balloob] - [#16237]) +- Switchmate ([@Danielhiversen] - [#15535]) ([switch.switchmate docs]) (new-platform) +- Add support for discrete states to MyQ cover ([@schmittx] - [#16251]) ([cover.myq docs]) +- bump version ([@dgomes] - [#16262]) ([upnp docs]) +- Replace Authorization by Authentication ([@cgtobi] - [#16259]) ([hangouts docs]) +- Add device info to Chromecast ([@balloob] - [#16261]) ([media_player.cast docs]) +- Add device info for sonos ([@balloob] - [#16263]) ([media_player.sonos docs]) +- Add device info Nest ([@balloob] - [#16265]) ([climate.nest docs]) +- Add Hue device info ([@balloob] - [#16267]) ([hue docs]) ([light.hue docs]) +- Nest Thermostat has software version ([@awarecan] - [#16275]) ([climate.nest docs]) +- Add support for Habitica ([@ASMfreaK] - [#15744]) ([habitica docs]) ([sensor.habitica docs]) (new-platform) +- Fix so that entities are properly unloaded with config entry ([@Kane610] - [#16281]) ([deconz docs]) ([binary_sensor.deconz docs]) ([light.deconz docs]) ([scene.deconz docs]) ([sensor.deconz docs]) ([switch.deconz docs]) +- Geo Location component ([@exxamalte] - [#15953]) ([feedreader docs]) ([geo_location docs]) (new-platform) +- Bump songpal dependency ([@rytilahti] - [#16297]) ([media_player.songpal docs]) +- Use asterisk_mbox 0.5.0 client ([@PhracturedBlue] - [#16296]) ([asterisk_mbox docs]) +- Upgrade Adafruit-DHT to 1.3.4 ([@thomaslian] - [#16327]) ([sensor.dht docs]) +- Add unique ID ([@schmittx] - [#16323]) ([cover.myq docs]) +- Add Cover to the Insteon component ([@teharris1] - [#16215]) ([insteon docs]) ([cover.insteon docs]) (new-platform) +- Fix missing humidity sensor ([@danielperna84] - [#16337]) ([homematic docs]) +- Support Sonos Beam HDMI input ([@phil65] - [#16340]) ([media_player.sonos docs]) +- Make last_seen attribute a timezone aware datetime in UTC ([@pnbruckner] - [#16348]) ([device_tracker docs]) +- Handle netatmo exception ([@Danielhiversen] - [#16344]) ([sensor.netatmo docs]) +- Add support for sound_mode for Yamaha rxv media_player ([@Joshi425] - [#16352]) ([media_player.yamaha docs]) +- Add unique_id to MQTT Light ([@bieniu] - [#16303]) ([light.mqtt docs]) +- Update to EnvoyReader 0.2, support for more hardware ([@jesserizzo] - [#16212]) ([sensor.enphase_envoy docs]) (breaking change) +- Snips: Added special slot values, session_id and slotname_raw ([@tschmidty69] - [#16185]) ([snips docs]) +- Upgrade hbmqtt to 0.9.4 ([@awarecan] - [#16356]) ([mqtt docs]) +- Upgrade Sphinx to 1.7.7 ([@fabaff] - [#16359]) +- Upgrade qnapstats to 0.2.7 ([@fabaff] - [#16360]) ([sensor.qnap docs]) +- Upgrade mutagen to 1.41.1 ([@fabaff] - [#16361]) ([tts docs]) +- Upgrade shodan to 1.10.0 ([@fabaff] - [#16363]) ([sensor.shodan docs]) +- Upgrade to youtube_dl to 2018.09.01 ([@fabaff] - [#16365]) ([media_extractor docs]) +- Added 'nomapnt', 'outcurnt', 'loadapnt' fields ([@MarcSN311] - [#16176]) ([sensor.apcupsd docs]) +- Generic Thermostat: add support for climate.turn_on/climate.turn_off ([@aronsky] - [#16080]) ([climate.generic_thermostat docs]) +- Add support for Tahoma Lighting Receiver on/off io ([@fucm] - [#15925]) ([tahoma docs]) ([switch.tahoma docs]) +- Update discord.py ([@htotoo] - [#16248]) ([notify docs]) +- Upgrade python-telegram-bot to 11.0.0 ([@fabaff] - [#16373]) ([telegram_bot docs]) +- Upgrade attrs to 18.2.0 ([@fabaff] - [#16372]) +- Update server.py ([@awarecan] - [#16375]) ([mqtt docs]) +- add_entities for switchmate ([@Danielhiversen] - [#16368]) ([switch.switchmate docs]) +- Support for playing radio preset by Onkyo media_player ([@pszafer] - [#16258]) ([cover.mqtt docs]) ([media_player.onkyo docs]) +- Bug fix for Tibber ([@Danielhiversen] - [#16397]) ([sensor.tibber docs]) +- zha: Bump to zigpy 0.2.0/bellows 0.7.0 ([@rcloran] - [#16404]) ([zha docs]) +- Fix SystemMonitor IP address sensor ([@ReneNulschDE] - [#16394]) ([sensor.systemmonitor docs]) +- add ExpressBus icon key to sensor.mvg ([@9R] - [#16387]) ([sensor.mvglive docs]) +- Device and entity registry remove config entry on unload ([@Kane610] - [#16247]) +- Add config flow for OpenUV ([@bachya] - [#16159]) ([openuv docs]) ([binary_sensor.openuv docs]) ([sensor.openuv docs]) +- Service to load new deCONZ devices without restart ([@Kane610] - [#16308]) ([deconz docs]) +- Delegate mqtt topic match validation to the paho mqtt client ([@rohankapoorcom] - [#16403]) ([mqtt docs]) +- Clean up dlink and some bug fix ([@Danielhiversen] - [#16346]) ([switch.dlink docs]) +- Implement correct state for RFlink cover ([@nudded] - [#16304]) ([cover.rflink docs]) +- Fix Mi Flora median calculation ([@PaulAnnekov] - [#16085]) ([sensor.miflora docs]) (breaking change) +- Add context to scripts and automations ([@balloob] - [#16415]) ([automation docs]) ([script docs]) ([automation.event docs]) ([automation.homeassistant docs]) ([automation.numeric_state docs]) ([automation.state docs]) ([automation.template docs]) ([automation.zone docs]) +- Fix openuv.config_flow unit test ([@awarecan] - [#16419]) +- Upgrade sense library to 0.4.2 ([@kbickar] - [#16429]) ([sensor.sense docs]) +- switchbot ([@Danielhiversen] - [#16396]) ([switch.switchbot docs]) (new-platform) +- Fix camera proxy to not require api_password to function ([@PhracturedBlue] - [#16450]) ([camera docs]) ([camera.proxy docs]) +- Upgrade shodan to 1.10.1 ([@fabaff] - [#16460]) ([sensor.shodan docs]) +- Upgrade Sphinx to 1.7.8 ([@fabaff] - [#16459]) +- update rfxtrx lib ([@Danielhiversen] - [#16463]) ([rfxtrx docs]) +- Added Twitch v5 support to the twitch platform ([@ioangogo] - [#16428]) ([sensor.twitch docs]) (breaking change) +- Fix waze_travel_time component startup ([@tsvi] - [#16465]) ([sensor.waze_travel_time docs]) +- Update license to official GitHub template ([@OverloadUT] - [#16470]) +- Add Yale Smart Alarm component ([@domwillcode] - [#16377]) ([alarm_control_panel.yale_smart_alarm docs]) (new-platform) +- Update radiotherm ([@cpw] - [#15031]) ([climate.radiotherm docs]) (breaking change) +- Support SNMPv3 and asyncio in snmp switch ([@mtdcr] - [#14754]) ([switch.snmp docs]) +- Fix GitHub change to resolve conflicts ([@fabaff] - [#16477]) ([switch.snmp docs]) +- Add OpenTherm Gateway climate platform ([@mvn23] - [#16299]) ([climate.opentherm_gw docs]) (new-platform) +- Support SNMPv3 and asyncio in snmp sensor ([@mtdcr] - [#14753]) ([sensor.snmp docs]) +- Add rate of change to statistics sensor ([@flo-wer] - [#15632]) ([sensor.statistics docs]) +- Restore status attribute for xiaomi_vacuum ([@tamasv] - [#16366]) ([vacuum docs]) ([vacuum.xiaomi_miio docs]) +- Check if API key is valid and users available ([@fabaff] - [#16494]) ([sensor.lastfm docs]) +- Update name legacy api password ([@balloob] - [#16455]) +- Fix Netgear LTESensor docstring ([@scop] - [#16501]) ([sensor.netgear_lte docs]) +- Update pyHS100 to 0.3.3 ([@amelchio] - [#16502]) ([light.tplink docs]) ([switch.tplink docs]) +- Move voluptuous-serialize to core requirement ([@awarecan] - [#16507]) ([config docs]) +- adds listener for OnAVStart and OnAVChange ([@tadly] - [#16495]) ([media_player.kodi docs]) +- Order imports ([@fabaff] - [#16515]) +- Upgrade aiohttp to 3.4.4 ([@awarecan] - [#16486]) +- Add a base_url configuration setting to tts. ([@lddubeau] - [#16478]) ([tts docs]) +- Upgrade youtube_dl to 2018.09.10 ([@fabaff] - [#16534]) ([media_extractor docs]) +- Upgrade keyring to 15.0.0 ([@fabaff] - [#16536]) + +[#14753]: https://github.com/home-assistant/home-assistant/pull/14753 +[#14754]: https://github.com/home-assistant/home-assistant/pull/14754 +[#15031]: https://github.com/home-assistant/home-assistant/pull/15031 +[#15252]: https://github.com/home-assistant/home-assistant/pull/15252 +[#15535]: https://github.com/home-assistant/home-assistant/pull/15535 +[#15632]: https://github.com/home-assistant/home-assistant/pull/15632 +[#15744]: https://github.com/home-assistant/home-assistant/pull/15744 +[#15925]: https://github.com/home-assistant/home-assistant/pull/15925 +[#15935]: https://github.com/home-assistant/home-assistant/pull/15935 +[#15953]: https://github.com/home-assistant/home-assistant/pull/15953 +[#15990]: https://github.com/home-assistant/home-assistant/pull/15990 +[#16080]: https://github.com/home-assistant/home-assistant/pull/16080 +[#16085]: https://github.com/home-assistant/home-assistant/pull/16085 +[#16157]: https://github.com/home-assistant/home-assistant/pull/16157 +[#16159]: https://github.com/home-assistant/home-assistant/pull/16159 +[#16176]: https://github.com/home-assistant/home-assistant/pull/16176 +[#16179]: https://github.com/home-assistant/home-assistant/pull/16179 +[#16185]: https://github.com/home-assistant/home-assistant/pull/16185 +[#16188]: https://github.com/home-assistant/home-assistant/pull/16188 +[#16192]: https://github.com/home-assistant/home-assistant/pull/16192 +[#16193]: https://github.com/home-assistant/home-assistant/pull/16193 +[#16194]: https://github.com/home-assistant/home-assistant/pull/16194 +[#16195]: https://github.com/home-assistant/home-assistant/pull/16195 +[#16203]: https://github.com/home-assistant/home-assistant/pull/16203 +[#16205]: https://github.com/home-assistant/home-assistant/pull/16205 +[#16212]: https://github.com/home-assistant/home-assistant/pull/16212 +[#16215]: https://github.com/home-assistant/home-assistant/pull/16215 +[#16217]: https://github.com/home-assistant/home-assistant/pull/16217 +[#16218]: https://github.com/home-assistant/home-assistant/pull/16218 +[#16229]: https://github.com/home-assistant/home-assistant/pull/16229 +[#16237]: https://github.com/home-assistant/home-assistant/pull/16237 +[#16247]: https://github.com/home-assistant/home-assistant/pull/16247 +[#16248]: https://github.com/home-assistant/home-assistant/pull/16248 +[#16251]: https://github.com/home-assistant/home-assistant/pull/16251 +[#16258]: https://github.com/home-assistant/home-assistant/pull/16258 +[#16259]: https://github.com/home-assistant/home-assistant/pull/16259 +[#16261]: https://github.com/home-assistant/home-assistant/pull/16261 +[#16262]: https://github.com/home-assistant/home-assistant/pull/16262 +[#16263]: https://github.com/home-assistant/home-assistant/pull/16263 +[#16265]: https://github.com/home-assistant/home-assistant/pull/16265 +[#16267]: https://github.com/home-assistant/home-assistant/pull/16267 +[#16275]: https://github.com/home-assistant/home-assistant/pull/16275 +[#16281]: https://github.com/home-assistant/home-assistant/pull/16281 +[#16296]: https://github.com/home-assistant/home-assistant/pull/16296 +[#16297]: https://github.com/home-assistant/home-assistant/pull/16297 +[#16299]: https://github.com/home-assistant/home-assistant/pull/16299 +[#16303]: https://github.com/home-assistant/home-assistant/pull/16303 +[#16304]: https://github.com/home-assistant/home-assistant/pull/16304 +[#16308]: https://github.com/home-assistant/home-assistant/pull/16308 +[#16323]: https://github.com/home-assistant/home-assistant/pull/16323 +[#16327]: https://github.com/home-assistant/home-assistant/pull/16327 +[#16337]: https://github.com/home-assistant/home-assistant/pull/16337 +[#16340]: https://github.com/home-assistant/home-assistant/pull/16340 +[#16344]: https://github.com/home-assistant/home-assistant/pull/16344 +[#16346]: https://github.com/home-assistant/home-assistant/pull/16346 +[#16348]: https://github.com/home-assistant/home-assistant/pull/16348 +[#16352]: https://github.com/home-assistant/home-assistant/pull/16352 +[#16356]: https://github.com/home-assistant/home-assistant/pull/16356 +[#16359]: https://github.com/home-assistant/home-assistant/pull/16359 +[#16360]: https://github.com/home-assistant/home-assistant/pull/16360 +[#16361]: https://github.com/home-assistant/home-assistant/pull/16361 +[#16363]: https://github.com/home-assistant/home-assistant/pull/16363 +[#16365]: https://github.com/home-assistant/home-assistant/pull/16365 +[#16366]: https://github.com/home-assistant/home-assistant/pull/16366 +[#16368]: https://github.com/home-assistant/home-assistant/pull/16368 +[#16372]: https://github.com/home-assistant/home-assistant/pull/16372 +[#16373]: https://github.com/home-assistant/home-assistant/pull/16373 +[#16375]: https://github.com/home-assistant/home-assistant/pull/16375 +[#16377]: https://github.com/home-assistant/home-assistant/pull/16377 +[#16387]: https://github.com/home-assistant/home-assistant/pull/16387 +[#16394]: https://github.com/home-assistant/home-assistant/pull/16394 +[#16396]: https://github.com/home-assistant/home-assistant/pull/16396 +[#16397]: https://github.com/home-assistant/home-assistant/pull/16397 +[#16403]: https://github.com/home-assistant/home-assistant/pull/16403 +[#16404]: https://github.com/home-assistant/home-assistant/pull/16404 +[#16415]: https://github.com/home-assistant/home-assistant/pull/16415 +[#16419]: https://github.com/home-assistant/home-assistant/pull/16419 +[#16428]: https://github.com/home-assistant/home-assistant/pull/16428 +[#16429]: https://github.com/home-assistant/home-assistant/pull/16429 +[#16450]: https://github.com/home-assistant/home-assistant/pull/16450 +[#16455]: https://github.com/home-assistant/home-assistant/pull/16455 +[#16459]: https://github.com/home-assistant/home-assistant/pull/16459 +[#16460]: https://github.com/home-assistant/home-assistant/pull/16460 +[#16463]: https://github.com/home-assistant/home-assistant/pull/16463 +[#16465]: https://github.com/home-assistant/home-assistant/pull/16465 +[#16470]: https://github.com/home-assistant/home-assistant/pull/16470 +[#16477]: https://github.com/home-assistant/home-assistant/pull/16477 +[#16478]: https://github.com/home-assistant/home-assistant/pull/16478 +[#16486]: https://github.com/home-assistant/home-assistant/pull/16486 +[#16494]: https://github.com/home-assistant/home-assistant/pull/16494 +[#16495]: https://github.com/home-assistant/home-assistant/pull/16495 +[#16501]: https://github.com/home-assistant/home-assistant/pull/16501 +[#16502]: https://github.com/home-assistant/home-assistant/pull/16502 +[#16507]: https://github.com/home-assistant/home-assistant/pull/16507 +[#16515]: https://github.com/home-assistant/home-assistant/pull/16515 +[#16534]: https://github.com/home-assistant/home-assistant/pull/16534 +[#16536]: https://github.com/home-assistant/home-assistant/pull/16536 +[@9R]: https://github.com/9R +[@ASMfreaK]: https://github.com/ASMfreaK +[@Cereal2nd]: https://github.com/Cereal2nd +[@Danielhiversen]: https://github.com/Danielhiversen +[@Joshi425]: https://github.com/Joshi425 +[@JulianKahnert]: https://github.com/JulianKahnert +[@Kane610]: https://github.com/Kane610 +[@MarcSN311]: https://github.com/MarcSN311 +[@OverloadUT]: https://github.com/OverloadUT +[@PaulAnnekov]: https://github.com/PaulAnnekov +[@PhracturedBlue]: https://github.com/PhracturedBlue +[@ReneNulschDE]: https://github.com/ReneNulschDE +[@amelchio]: https://github.com/amelchio +[@aronsky]: https://github.com/aronsky +[@awarecan]: https://github.com/awarecan +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@bieniu]: https://github.com/bieniu +[@cgtobi]: https://github.com/cgtobi +[@cpw]: https://github.com/cpw +[@danielperna84]: https://github.com/danielperna84 +[@dgomes]: https://github.com/dgomes +[@djm300]: https://github.com/djm300 +[@domwillcode]: https://github.com/domwillcode +[@endor-force]: https://github.com/endor-force +[@exxamalte]: https://github.com/exxamalte +[@fabaff]: https://github.com/fabaff +[@flo-wer]: https://github.com/flo-wer +[@fucm]: https://github.com/fucm +[@grea09]: https://github.com/grea09 +[@htotoo]: https://github.com/htotoo +[@ioangogo]: https://github.com/ioangogo +[@jesserizzo]: https://github.com/jesserizzo +[@kariudo]: https://github.com/kariudo +[@kbickar]: https://github.com/kbickar +[@lddubeau]: https://github.com/lddubeau +[@mtdcr]: https://github.com/mtdcr +[@mvn23]: https://github.com/mvn23 +[@nudded]: https://github.com/nudded +[@phil65]: https://github.com/phil65 +[@pnbruckner]: https://github.com/pnbruckner +[@pszafer]: https://github.com/pszafer +[@rcloran]: https://github.com/rcloran +[@rohankapoorcom]: https://github.com/rohankapoorcom +[@rytilahti]: https://github.com/rytilahti +[@schmittx]: https://github.com/schmittx +[@scop]: https://github.com/scop +[@smurfix]: https://github.com/smurfix +[@tadly]: https://github.com/tadly +[@tamasv]: https://github.com/tamasv +[@teharris1]: https://github.com/teharris1 +[@thomasdelaet]: https://github.com/thomasdelaet +[@thomaslian]: https://github.com/thomaslian +[@tschmidty69]: https://github.com/tschmidty69 +[@tsvi]: https://github.com/tsvi +[@vrih]: https://github.com/vrih +[alarm_control_panel.yale_smart_alarm docs]: /components/alarm_control_panel.yale_smart_alarm/ +[asterisk_mbox docs]: /components/asterisk_mbox/ +[automation docs]: /components/automation/ +[automation.event docs]: /docs/automation/trigger/#event-trigger +[automation.homeassistant docs]: /docs/automation/trigger/#home-assistant-trigger +[automation.numeric_state docs]: /docs/automation/trigger/#numeric-state-trigger +[automation.state docs]: /docs/automation/trigger/#state-trigger +[automation.template docs]: /docs/automation/trigger/#template-trigger +[automation.zone docs]: /docs/automation/trigger/#zone-trigger +[binary_sensor.deconz docs]: /components/binary_sensor.deconz/ +[binary_sensor.openuv docs]: /components/binary_sensor.openuv/ +[camera docs]: /components/camera/ +[camera.proxy docs]: /components/camera.proxy/ +[climate.generic_thermostat docs]: /components/climate.generic_thermostat/ +[climate.nest docs]: /components/climate.nest/ +[climate.opentherm_gw docs]: /components/climate.opentherm_gw/ +[climate.radiotherm docs]: /components/climate.radiotherm/ +[config docs]: /components/config/ +[cover.insteon docs]: /components/cover.insteon/ +[cover.mqtt docs]: /components/cover.mqtt/ +[cover.myq docs]: /components/cover.myq/ +[cover.rflink docs]: /components/cover.rflink/ +[deconz docs]: /components/deconz/ +[device_tracker docs]: /components/device_tracker/ +[feedreader docs]: /components/feedreader/ +[geo_location docs]: /components/geo_location/ +[habitica docs]: /components/habitica/ +[hangouts docs]: /components/hangouts/ +[homematic docs]: /components/homematic/ +[hue docs]: /components/hue/ +[insteon docs]: /components/insteon/ +[light.deconz docs]: /components/light.deconz/ +[light.hue docs]: /components/light.hue/ +[light.mqtt docs]: /components/light.mqtt/ +[light.tplink docs]: /components/light.tplink/ +[media_extractor docs]: /components/media_extractor/ +[media_player.cast docs]: /components/media_player.cast/ +[media_player.kodi docs]: /components/media_player.kodi/ +[media_player.onkyo docs]: /components/media_player.onkyo/ +[media_player.songpal docs]: /components/media_player.songpal/ +[media_player.sonos docs]: /components/media_player.sonos/ +[media_player.yamaha docs]: /components/media_player.yamaha/ +[mqtt docs]: /components/mqtt/ +[notify docs]: /components/notify/ +[openuv docs]: /components/openuv/ +[rfxtrx docs]: /components/rfxtrx/ +[scene.deconz docs]: /components/scene.deconz/ +[script docs]: /components/script/ +[sensor.alpha_vantage docs]: /components/sensor.alpha_vantage/ +[sensor.apcupsd docs]: /components/sensor.apcupsd/ +[sensor.darksky docs]: /components/sensor.darksky/ +[sensor.deconz docs]: /components/sensor.deconz/ +[sensor.dht docs]: /components/sensor.dht/ +[sensor.dnsip docs]: /components/sensor.dnsip/ +[sensor.enphase_envoy docs]: /components/sensor.enphase_envoy/ +[sensor.geizhals docs]: /components/sensor.geizhals/ +[sensor.habitica docs]: /components/sensor.habitica/ +[sensor.lastfm docs]: /components/sensor.lastfm/ +[sensor.miflora docs]: /components/sensor.miflora/ +[sensor.mvglive docs]: /components/sensor.mvglive/ +[sensor.netatmo docs]: /components/sensor.netatmo/ +[sensor.netgear_lte docs]: /components/sensor.netgear_lte/ +[sensor.openuv docs]: /components/sensor.openuv/ +[sensor.qnap docs]: /components/sensor.qnap/ +[sensor.sense docs]: /components/sensor.sense/ +[sensor.shodan docs]: /components/sensor.shodan/ +[sensor.snmp docs]: /components/sensor.snmp/ +[sensor.sql docs]: /components/sensor.sql/ +[sensor.statistics docs]: /components/sensor.statistics/ +[sensor.systemmonitor docs]: /components/sensor.systemmonitor/ +[sensor.tahoma docs]: /components/sensor.tahoma/ +[sensor.tibber docs]: /components/sensor.tibber/ +[sensor.trafikverket_weatherstation docs]: /components/sensor.trafikverket_weatherstation/ +[sensor.twitch docs]: /components/sensor.twitch/ +[sensor.velbus docs]: /components/sensor.velbus/ +[sensor.volkszaehler docs]: /components/sensor.volkszaehler/ +[sensor.waze_travel_time docs]: /components/sensor.waze_travel_time/ +[snips docs]: /components/snips/ +[switch.deconz docs]: /components/switch.deconz/ +[switch.dlink docs]: /components/switch.dlink/ +[switch.snmp docs]: /components/switch.snmp/ +[switch.switchbot docs]: /components/switch.switchbot/ +[switch.switchmate docs]: /components/switch.switchmate/ +[switch.tahoma docs]: /components/switch.tahoma/ +[switch.tplink docs]: /components/switch.tplink/ +[tahoma docs]: /components/tahoma/ +[telegram_bot docs]: /components/telegram_bot/ +[tts docs]: /components/tts/ +[upnp docs]: /components/upnp/ +[vacuum docs]: /components/vacuum/ +[vacuum.xiaomi_miio docs]: /components/vacuum.xiaomi_miio/ +[velbus docs]: /components/velbus/ +[zha docs]: /components/zha/ +[zoneminder docs]: /components/zoneminder/ From 136993ea07af32cd0f164d8161efb9428cb3678a Mon Sep 17 00:00:00 2001 From: Kevin Siml Date: Mon, 10 Sep 2018 14:00:38 +0200 Subject: [PATCH 42/48] add new Pushsafer Parameter (#6049) * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Change format * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown --- source/_components/notify.pushsafer.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_components/notify.pushsafer.markdown b/source/_components/notify.pushsafer.markdown index 5b1ce8ed54c..6060016e1c5 100644 --- a/source/_components/notify.pushsafer.markdown +++ b/source/_components/notify.pushsafer.markdown @@ -12,7 +12,6 @@ ha_category: Notifications ha_release: 0.39 --- - The [Pushsafer service](https://www.pushsafer.com/) is a platform for the notify component. This allows you to send messages to the user using Pushsafer. In order to get a private or alias key you need to go to the [Pushsafer website](https://www.pushsafer.com) and register. @@ -90,6 +89,10 @@ Message to two devices and one device group with formatted text and local image. "url": "https://www.home-assistant.io/", "urltitle": "Open Home Assistant", "time2live": "10", + "priority": "2", + "retry": "60", + "expire": "600", + "answer": "1", "picture1": { "path":"C:\\Users\\Kevin\\AppData\\Roaming\\.homeassistant\\image-760-testimage.jpg" } From c80fafcdc0d073d56c283b52aa859781654f8dfe Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 16 Sep 2018 21:30:03 +0200 Subject: [PATCH 43/48] Update blog --- source/_posts/2018-09-15-release-78.markdown | 61 ++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/source/_posts/2018-09-15-release-78.markdown b/source/_posts/2018-09-15-release-78.markdown index b595c05b9a8..80659a88e5d 100644 --- a/source/_posts/2018-09-15-release-78.markdown +++ b/source/_posts/2018-09-15-release-78.markdown @@ -44,6 +44,24 @@ Experiencing issues introduced by this release? Please report them in our [issue - Added Twitch v5 support to the twitch platform ([@ioangogo] - [#16428]) ([sensor.twitch docs]) (breaking change) - Update radiotherm ([@cpw] - [#15031]) ([climate.radiotherm docs]) (breaking change) +## {% linkable_title Beta Fixes %} + +- Replace api_password in Camera.Push ([@dgomes] - [#16339]) ([camera.push docs]) (beta fix) +- Fail fetch auth providers if onboarding required ([@balloob] - [#16454]) ([auth docs]) (beta fix) +- Fix insteon Hub v1 support ([@teharris1] - [#16472]) ([insteon docs]) (beta fix) +- bugfix - incorrect camera type and missing sensors when multiple netatmo cameras ([@vikramgorla] - [#16490]) ([netatmo docs]) (beta fix) +- Fix arlo intilization when no base station available ([@zellux] - [#16529]) ([arlo docs]) (beta fix) +- Long-lived access token ([@awarecan] - [#16453]) ([auth docs]) (beta fix) +- Fix typo ([@balloob] - [#16556]) (beta fix) +- Fix invalid state ([@balloob] - [#16558]) (beta fix) +- Add websocket commands for refresh tokens ([@balloob] - [#16559]) ([auth docs]) (beta fix) +- Return if refresh token is current used one in WS API ([@awarecan] - [#16575]) ([auth docs]) ([websocket_api docs]) (beta fix) +- Track refresh token last usage information ([@awarecan] - [#16408]) ([auth docs]) (beta fix) +- Increasing python-websockets' version number ([@zoe1337] - [#16578]) ([media_player.webostv docs]) (beta fix) +- Add retry limit for chromecast connection ([@awarecan] - [#16471]) ([media_player.cast docs]) (beta fix) +- Fix broken bluetooth tracker ([@awarecan] - [#16589]) ([device_tracker docs]) (beta fix) +- Rewrite bluetooth le ([@pvizeli] - [#16592]) ([device_tracker docs]) (beta fix) + ## {% linkable_title All changes %} - Add 'moon_phase' to Dark Sky sensor ([@fabaff] - [#16179]) ([sensor.darksky docs]) @@ -143,6 +161,22 @@ Experiencing issues introduced by this release? Please report them in our [issue - Add a base_url configuration setting to tts. ([@lddubeau] - [#16478]) ([tts docs]) - Upgrade youtube_dl to 2018.09.10 ([@fabaff] - [#16534]) ([media_extractor docs]) - Upgrade keyring to 15.0.0 ([@fabaff] - [#16536]) +- Updates documentation repo URL in PR template ([@frenck] - [#16537]) +- Replace api_password in Camera.Push ([@dgomes] - [#16339]) ([camera.push docs]) (beta fix) +- Fail fetch auth providers if onboarding required ([@balloob] - [#16454]) ([auth docs]) (beta fix) +- Fix insteon Hub v1 support ([@teharris1] - [#16472]) ([insteon docs]) (beta fix) +- bugfix - incorrect camera type and missing sensors when multiple netatmo cameras ([@vikramgorla] - [#16490]) ([netatmo docs]) (beta fix) +- Fix arlo intilization when no base station available ([@zellux] - [#16529]) ([arlo docs]) (beta fix) +- Long-lived access token ([@awarecan] - [#16453]) ([auth docs]) (beta fix) +- Fix typo ([@balloob] - [#16556]) (beta fix) +- Fix invalid state ([@balloob] - [#16558]) (beta fix) +- Add websocket commands for refresh tokens ([@balloob] - [#16559]) ([auth docs]) (beta fix) +- Return if refresh token is current used one in WS API ([@awarecan] - [#16575]) ([auth docs]) ([websocket_api docs]) (beta fix) +- Track refresh token last usage information ([@awarecan] - [#16408]) ([auth docs]) (beta fix) +- Increasing python-websockets' version number ([@zoe1337] - [#16578]) ([media_player.webostv docs]) (beta fix) +- Add retry limit for chromecast connection ([@awarecan] - [#16471]) ([media_player.cast docs]) (beta fix) +- Fix broken bluetooth tracker ([@awarecan] - [#16589]) ([device_tracker docs]) (beta fix) +- Rewrite bluetooth le ([@pvizeli] - [#16592]) ([device_tracker docs]) (beta fix) [#14753]: https://github.com/home-assistant/home-assistant/pull/14753 [#14754]: https://github.com/home-assistant/home-assistant/pull/14754 @@ -196,6 +230,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16323]: https://github.com/home-assistant/home-assistant/pull/16323 [#16327]: https://github.com/home-assistant/home-assistant/pull/16327 [#16337]: https://github.com/home-assistant/home-assistant/pull/16337 +[#16339]: https://github.com/home-assistant/home-assistant/pull/16339 [#16340]: https://github.com/home-assistant/home-assistant/pull/16340 [#16344]: https://github.com/home-assistant/home-assistant/pull/16344 [#16346]: https://github.com/home-assistant/home-assistant/pull/16346 @@ -219,28 +254,43 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16397]: https://github.com/home-assistant/home-assistant/pull/16397 [#16403]: https://github.com/home-assistant/home-assistant/pull/16403 [#16404]: https://github.com/home-assistant/home-assistant/pull/16404 +[#16408]: https://github.com/home-assistant/home-assistant/pull/16408 [#16415]: https://github.com/home-assistant/home-assistant/pull/16415 [#16419]: https://github.com/home-assistant/home-assistant/pull/16419 [#16428]: https://github.com/home-assistant/home-assistant/pull/16428 [#16429]: https://github.com/home-assistant/home-assistant/pull/16429 [#16450]: https://github.com/home-assistant/home-assistant/pull/16450 +[#16453]: https://github.com/home-assistant/home-assistant/pull/16453 +[#16454]: https://github.com/home-assistant/home-assistant/pull/16454 [#16455]: https://github.com/home-assistant/home-assistant/pull/16455 [#16459]: https://github.com/home-assistant/home-assistant/pull/16459 [#16460]: https://github.com/home-assistant/home-assistant/pull/16460 [#16463]: https://github.com/home-assistant/home-assistant/pull/16463 [#16465]: https://github.com/home-assistant/home-assistant/pull/16465 [#16470]: https://github.com/home-assistant/home-assistant/pull/16470 +[#16471]: https://github.com/home-assistant/home-assistant/pull/16471 +[#16472]: https://github.com/home-assistant/home-assistant/pull/16472 [#16477]: https://github.com/home-assistant/home-assistant/pull/16477 [#16478]: https://github.com/home-assistant/home-assistant/pull/16478 [#16486]: https://github.com/home-assistant/home-assistant/pull/16486 +[#16490]: https://github.com/home-assistant/home-assistant/pull/16490 [#16494]: https://github.com/home-assistant/home-assistant/pull/16494 [#16495]: https://github.com/home-assistant/home-assistant/pull/16495 [#16501]: https://github.com/home-assistant/home-assistant/pull/16501 [#16502]: https://github.com/home-assistant/home-assistant/pull/16502 [#16507]: https://github.com/home-assistant/home-assistant/pull/16507 [#16515]: https://github.com/home-assistant/home-assistant/pull/16515 +[#16529]: https://github.com/home-assistant/home-assistant/pull/16529 [#16534]: https://github.com/home-assistant/home-assistant/pull/16534 [#16536]: https://github.com/home-assistant/home-assistant/pull/16536 +[#16537]: https://github.com/home-assistant/home-assistant/pull/16537 +[#16556]: https://github.com/home-assistant/home-assistant/pull/16556 +[#16558]: https://github.com/home-assistant/home-assistant/pull/16558 +[#16559]: https://github.com/home-assistant/home-assistant/pull/16559 +[#16575]: https://github.com/home-assistant/home-assistant/pull/16575 +[#16578]: https://github.com/home-assistant/home-assistant/pull/16578 +[#16589]: https://github.com/home-assistant/home-assistant/pull/16589 +[#16592]: https://github.com/home-assistant/home-assistant/pull/16592 [@9R]: https://github.com/9R [@ASMfreaK]: https://github.com/ASMfreaK [@Cereal2nd]: https://github.com/Cereal2nd @@ -269,6 +319,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [@exxamalte]: https://github.com/exxamalte [@fabaff]: https://github.com/fabaff [@flo-wer]: https://github.com/flo-wer +[@frenck]: https://github.com/frenck [@fucm]: https://github.com/fucm [@grea09]: https://github.com/grea09 [@htotoo]: https://github.com/htotoo @@ -283,6 +334,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [@phil65]: https://github.com/phil65 [@pnbruckner]: https://github.com/pnbruckner [@pszafer]: https://github.com/pszafer +[@pvizeli]: https://github.com/pvizeli [@rcloran]: https://github.com/rcloran [@rohankapoorcom]: https://github.com/rohankapoorcom [@rytilahti]: https://github.com/rytilahti @@ -296,9 +348,14 @@ Experiencing issues introduced by this release? Please report them in our [issue [@thomaslian]: https://github.com/thomaslian [@tschmidty69]: https://github.com/tschmidty69 [@tsvi]: https://github.com/tsvi +[@vikramgorla]: https://github.com/vikramgorla [@vrih]: https://github.com/vrih +[@zellux]: https://github.com/zellux +[@zoe1337]: https://github.com/zoe1337 [alarm_control_panel.yale_smart_alarm docs]: /components/alarm_control_panel.yale_smart_alarm/ +[arlo docs]: /components/arlo/ [asterisk_mbox docs]: /components/asterisk_mbox/ +[auth docs]: /components/auth/ [automation docs]: /components/automation/ [automation.event docs]: /docs/automation/trigger/#event-trigger [automation.homeassistant docs]: /docs/automation/trigger/#home-assistant-trigger @@ -310,6 +367,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [binary_sensor.openuv docs]: /components/binary_sensor.openuv/ [camera docs]: /components/camera/ [camera.proxy docs]: /components/camera.proxy/ +[camera.push docs]: /components/camera.push/ [climate.generic_thermostat docs]: /components/climate.generic_thermostat/ [climate.nest docs]: /components/climate.nest/ [climate.opentherm_gw docs]: /components/climate.opentherm_gw/ @@ -338,8 +396,10 @@ Experiencing issues introduced by this release? Please report them in our [issue [media_player.onkyo docs]: /components/media_player.onkyo/ [media_player.songpal docs]: /components/media_player.songpal/ [media_player.sonos docs]: /components/media_player.sonos/ +[media_player.webostv docs]: /components/media_player.webostv/ [media_player.yamaha docs]: /components/media_player.yamaha/ [mqtt docs]: /components/mqtt/ +[netatmo docs]: /components/netatmo/ [notify docs]: /components/notify/ [openuv docs]: /components/openuv/ [rfxtrx docs]: /components/rfxtrx/ @@ -389,5 +449,6 @@ Experiencing issues introduced by this release? Please report them in our [issue [vacuum docs]: /components/vacuum/ [vacuum.xiaomi_miio docs]: /components/vacuum.xiaomi_miio/ [velbus docs]: /components/velbus/ +[websocket_api docs]: /components/websocket_api/ [zha docs]: /components/zha/ [zoneminder docs]: /components/zoneminder/ From 54063a66415611ac6e80c0b1464d498c719cc8ce Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Tue, 11 Sep 2018 10:30:09 +0100 Subject: [PATCH 44/48] Adds token parameter to Camera.Push (#6130) * Adds token parameter to Camera.Push * update require --- source/_components/camera.push.markdown | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/_components/camera.push.markdown b/source/_components/camera.push.markdown index c70dee014c0..be639978032 100644 --- a/source/_components/camera.push.markdown +++ b/source/_components/camera.push.markdown @@ -25,11 +25,9 @@ The `push` camera can as an example be used with [motionEye](https://github.com/ In motionEye, under **File Storage -> Run A Command** type in: ```bash -curl -X POST -F "image=@%f" http://my.hass.server.com:8123/api/camera_push/camera.push_camera +curl -X POST -F "image=@%f" http://my.hass.server.com:8123/api/camera_push/camera.push_camera?token=12345678 ``` -Please take note that you might need to add `-H "x-ha-access: YOUR_PASSWORD"` if you have API authentication enabled. - Optionally configure motionEye to save only motion triggered images by going into **Still Images -> Capture Mode** and setting **Motion Triggered**. Tune your preferences under **Motion Detection**. In this setup, you can configure the push camera to continuously replay the last motion triggered event using a configuration such as: @@ -40,6 +38,7 @@ camera: name: MotionEye Outdoor buffer: 3 timeout: 5 + token: 12345678 ``` ## {% linkable_title Configuration %} @@ -51,6 +50,7 @@ To enable this camera in your installation, add the following to your `configura camera: - platform: push name: My Push Camera + token: 12345678 ``` {% configuration %} @@ -69,6 +69,10 @@ timeout: required: false default: 5 seconds type: time +token: + description: User provided token acting as access control, should be a large string (more then 8 chars). Required if you can't use HA new auth system (0.77). + required: false + type: string field: description: HTTP POST field containing the image file required: false From 5973770fa0db1eae1e03251c6e61fcac89b20bf6 Mon Sep 17 00:00:00 2001 From: Tom Harris Date: Mon, 10 Sep 2018 13:23:36 -0400 Subject: [PATCH 45/48] Support for Insteon Hub Version 1 (#6211) * Support for Insteon Hub Version 1 * Spelling and gramar fixes * :pencil2: Tweaks --- .gitignore | 1 + source/_components/insteon.markdown | 98 +++++++++++++++++------------ 2 files changed, 60 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index f02128325f5..933ece07209 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ source/.jekyll-metadata /.vs/slnx.sqlite-journal /.vs/VSWorkspaceState.json .vscode +*.suo diff --git a/source/_components/insteon.markdown b/source/_components/insteon.markdown index e2518a09784..7cb8e635ec7 100644 --- a/source/_components/insteon.markdown +++ b/source/_components/insteon.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Insteon" -description: "Instructions on how to setup an Insteon Modem (PLM or Hub) locally within Home Assistant." +description: "Instructions on how to set up an Insteon Modem (PLM or Hub) locally within Home Assistant." date: 2018-08-20 16:00 sidebar: true comments: false @@ -18,19 +18,20 @@ linked INSTEON devices to be used within Home Assistant as binary sensors, lights, fans, sensors and switches. Device support is provided by the underlying [insteonplm] package. It is known to work with the [2413U] USB and [2412S] RS242 flavors of PLM and the [2448A7] USB stick. It has also been -tested to work with the [2245] Hub. +tested to work with the [2242] and [2245] Hubs. [insteonplm]: https://github.com/nugget/python-insteonplm [2413U]: https://www.insteon.com/powerlinc-modem-usb [2412S]: https://www.insteon.com/powerlinc-modem-serial [2448A7]: https://www.smarthome.com/insteon-2448a7-portable-usb-adapter.html [2245]: https://www.insteon.com/insteon-hub/ +[2242]: https://www.insteon.com/support-knowledgebase/2014/9/26/insteon-hub-owners-manual ### {% linkable_title INSTEON Modem configuration %} -To setup a Powerline Modem (PLM) device such as the [2413U], use the following -configuration: +To set up an INSTEON Powerline Modem (PLM) device such as the [2413U], use the +following configuration: ```yaml # PLM configuration variables @@ -38,15 +39,26 @@ insteon: port: SERIAL_PORT ``` -To setup an INSTEON Hub such as the [2245], use the following configuration: - +To set up an INSTEON Hub model [2245], use the following configuration: + ```yaml -# Hub configuration variables +# Hub 2245 configuration variables insteon: host: HOST ip_port: IP_PORT username: USERNAME password: PASSWORD + hub_version: 2 +``` + +To set up an INSTEON Hub model [2242], use the following configuration: + +```yaml +# Hub 2242 configuration variables +insteon: + host: HOST + ip_port: IP_PORT + hub_version: 1 ``` Addtional configuration items are available: @@ -71,14 +83,23 @@ insteon: ``` Configuration variables: - **port** (*Required for PLM setup*): The serial or USB port for your device, - e.g., `/dev/ttyUSB0` -- **host** (*Required for Hub setup*): The host name or IP address of the Hub -- **ip_port** (*Optional for Hub setup*): The IP port number of the Hub. - (default value is 25105) -- **username** (*Required for Hub setup*): The username to login to the local - Hub -- **password** (*Required for Hub setup*): The password to login to the local - Hub + e.g., `/dev/ttyUSB0` or `COM3` +- **host** (*Required for Hub setup*): The host name or IP address of the Hub. +- **ip_port** (*Optional for Hub setup*): The IP port number of the Hub. For + Hub model [2245] (i.e. Hub version 2) the default port is 25105. For the Hub + model [2242] (i.e. Hub version 1) the default port is 9761. Use the Insteon + app to find the port number for your specific Hub. +- **username** (*Required for Hub version 2 setup*): The username to login in + to the local Hub. This is required for Hub [2245] (i.e. Hub version 2) setup. + You can find your Hub username on the bottom of the Hub or you can use the + Insteon app. +- **password** (*Required for Hub version 2 setup*): The password to login in + to the local Hub. This is required for Hub [2245] (i.e. Hub version 2) setup. + You can find your Hub password on the bottom of the Hub or you can use the + Insteon app. +- **hub_version** (*Required for Hub version 1 setup*): The Hub version number + where model [2242] is Hub version 1 and model [2245] is Hub version 2. + (Default is 2) - **device_override** (*Optional*): Override the default device definition - *ADDRESS* is found on the device itself in the form 1A.2B.3C or 1a2b3c - *CATEGORY* is found in the back of the device's User Guide in the form of @@ -92,16 +113,16 @@ Configuration variables: - *UNITCODE* is the X10 unit code values 1 - 16 - *PLATFORM* is the Home Assistant Platform to associate the device with. The following platforms are supported - - binary_sensor: Used for on/off devices or keypad buttons that are read only. + - binary_sensor: Used for on/off devices or keypad buttons that are read-only. - light: Used for dimmable X10 devices - switch: Used for On/Off X10 devices - *STEPS* is the number of dim/bright steps the device supports. Used for dimmable X10 devices only. Default value is 22. -- **x10_all_units_off** (*Optional*): Creates an binary_sensor that responds +- **x10_all_units_off** (*Optional*): Creates a binary_sensor that responds to the X10 standard command for All Units Off. -- **x10_all_lights_on** (*Optional*): Creates an binary_sensor that responds +- **x10_all_lights_on** (*Optional*): Creates a binary_sensor that responds to the X10 standard command for All Lights On -- **x10_all_lights_off** (*Optional*): Creates an binary_sensor that responds +- **x10_all_lights_off** (*Optional*): Creates a binary_sensor that responds to the X10 standard command for All Lights Off ### {% linkable_title Autodiscovery %} @@ -111,27 +132,27 @@ per device. Subsequent startups will occur much quicker using cached device information. If a device is not recognized during autodiscovery, you can add the device to the **device_override** configuration. -In order for a device to be discovered it must be linked to the INSTEON Modem +In order for a device to be discovered, it must be linked to the INSTEON Modem as either a responder or a controller. ### {% linkable_title Linking Devices to the INSTEON Modem %} In order for any two Insteon devices to talk with one another, they must be -linked. For an overview of device linking please read the Insteon page on +linked. For an overview of device linking, please read the Insteon page on [understanding linking]. The Insteon Modem module supports All-Linking through [Development Tools] service calls. The following services are available: - **insteon.add_all_link**: Puts the Insteon Modem (IM) into All-Linking -mode. The IM can be set as as controller or a responder. If the IM is a -controler, put the IM into linking mode then press the SET button on the -device. If the IM is a responer, press the SET button on the device then +mode. The IM can be set as a controller or a responder. If the IM is a +controller, put the IM into linking mode then press the SET button on the +device. If the IM is a responder, press the SET button on the device then put the IM into linking mode. - **insteon.delete_all_link**: Tells the Insteon Modem (IM) to remove an All-Link record from the All-Link Database of the IM and a device. Once the IM is set to delete the link, press the SET button on the corresponding device to complete the process. - **insteon.load_all_link_database**: Load the All-Link Database for a -device. WARNING - Loading a device All-Link database may take a LONG time and +device. WARNING - Loading a device All-Link database may take a LONG time and may need to be repeated to obtain all records. - **insteon.print_all_link_database**: Print the All-Link Database for a device. Requires that the All-Link Database is loaded first. @@ -174,7 +195,7 @@ devices. INSTEON devices are added to Home Assistant using the platform(s) that make the most sense given the model and features of the hardware. The features of the -INSTEON device are built into the Home Assistant platform. Changing the +INSTEON devices are built into the Home Assistant platform. Changing the platform is not recommended. There are two primary uses for the **device_override** feature. - Devices that do not respond during autodiscovery. This is common for battery @@ -185,7 +206,7 @@ platform is not recommended. There are two primary uses for the ### {% linkable_title Example Configuration with Options%} ```yaml -# Full example of insteon configuration with customizations and overrides +# Full example of Insteon configuration with customizations and overrides homeassistant: customize: @@ -205,7 +226,7 @@ insteon: ### {% linkable_title What NOT to do %} -Insteon Modem is a top level component and device discovery will identify +Insteon Modem is a top-level component and device discovery will identify the Home Assistant platform the device belongs in. As such, do not declare Insteon devices in other platforms. For example, this configuration will NOT work: @@ -224,19 +245,18 @@ events. The following events are available: - **insteon.button_on** - **address**: (required) The Insteon device address in lower case without dots (e.g. 1a2b3c) - - **button**: (Optional) The button id in lower case. For an 4 button remote - the values are a to d. For an 8 button remote the values are a to g. For - a one button remote this field is not used. + - **button**: (Optional) The button id in lower case. For a 4-button remote + the values are `a` to `d`. For an 8 button remote the values are `a` to `g`. For + a one-button remote this field is not used. - **insteon.button_of** - **address**: (required) The Insteon device address in lower case without dots (e.g. 1a2b3c) - - **button**: (Optional) The button id in lower case. For an 4 button remote - the values are a to d. For an 8 button remote the values are a to g. For - a one button remote this field is not used. + - **button**: (Optional) The button id in lower case. For a 4-button remote + the values are a to d. For an 8 button remote the values are `a` to `g`. For + a one-button remote this field is not used. -This allows the mini-remotes to be configured as - -Here is an example of how to use these events for automations: +This allows the mini-remotes to be configured as triggers for automations. Here +is an example of how to use these events for automations: ``` automation: @@ -276,8 +296,8 @@ The INSTEON Hub has three known issues that are inherent to the design of the Hub: 1. If you see multiple error messages in the log file stating the Hub -connection is closed and reconnection has failed, this generally requires -the Hub to be restarted in order to reconnect. +connection is closed, and reconnection has failed, this generally requires +the Hub to be restarted to reconnect. 2. You cannot use both Home Assistant and the INSTEON app. If you do, the changes made in the app will not appear in Home Assistant. Changes made in From 9898267aa50b58e17c8568019ba7ca0bc5c2bd7f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 16 Sep 2018 21:42:05 +0200 Subject: [PATCH 46/48] Add breaking changes --- source/_posts/2018-09-15-release-78.markdown | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/source/_posts/2018-09-15-release-78.markdown b/source/_posts/2018-09-15-release-78.markdown index 80659a88e5d..9d4eaefade9 100644 --- a/source/_posts/2018-09-15-release-78.markdown +++ b/source/_posts/2018-09-15-release-78.markdown @@ -13,6 +13,12 @@ og_image: /images/blog/2018-09-0.78/social.png +It's time for a new release and oh boy, what a time to be alive! Today marks our 5th (!!!) anniversary. That's 5 years we've been bringing privacy focused and locally controlled home automation to your home. Happy birthday to us. + +This release includes two new features for the auth system. The first one is long-lived access tokens. These are tokens that don't expire and can be used in your scripts instead of API password. Instructions on how to create and use them can be found on your profile. + +Also on your profile page is a new list of existing refresh tokens. These are all the tokens that are currently active for your account. If you ran into issues that the remember login dialog didn't show, you might have a lot. Don't worry, you can delete them all. + ## {% linkable_title New Platforms %} - Add temperature sensors to the velbus component ([@Cereal2nd] - [#16203]) ([velbus docs]) ([sensor.velbus docs]) (new-platform) @@ -37,12 +43,13 @@ Experiencing issues introduced by this release? Please report them in our [issue ## {% linkable_title Breaking Changes %} -- Rewrite of Trafikverket weather - Multiple sensor types supported ([@endor-force] - [#15935]) ([sensor.trafikverket_weatherstation docs]) (breaking change) -- Fix geizhals price parsing ([@JulianKahnert] - [#15990]) ([sensor.geizhals docs]) (breaking change) -- Update to EnvoyReader 0.2, support for more hardware ([@jesserizzo] - [#16212]) ([sensor.enphase_envoy docs]) (breaking change) -- Fix Mi Flora median calculation ([@PaulAnnekov] - [#16085]) ([sensor.miflora docs]) (breaking change) -- Added Twitch v5 support to the twitch platform ([@ioangogo] - [#16428]) ([sensor.twitch docs]) (breaking change) -- Update radiotherm ([@cpw] - [#15031]) ([climate.radiotherm docs]) (breaking change) +- Trafikverket weather: Instead of having multiple sensor configurations per station, add only one configuration per station and select the type of measurement data to subscribe to using monitored_conditions. +The configuration value type should no longer be used. ([@endor-force] - [#15935]) ([sensor.trafikverket_weatherstation docs]) (breaking change) +- Geizhals: config has changed. Remove domain and regex, specify locale instead: `AT`, `EU`, `DE`, `UK` or `PL`. ([@JulianKahnert] - [#15990]) ([sensor.geizhals docs]) (breaking change) +- Update to EnvoyReader 0.2, support for more hardware. Change keys in monitored_conditions from `7_days_production` and `7_days_consumption` to `seven_days_production` and `seven_days_consumption` ([@jesserizzo] - [#16212]) ([sensor.enphase_envoy docs]) (breaking change) +- Fix Mi Flora median calculation. Removed `retries` and `timeout` config parameters, they were not used for several months. Replaced `cache_value` config with `scan_interval` to fix a bug in the PR. ([@PaulAnnekov] - [#16085]) ([sensor.miflora docs]) (breaking change) +- Twitch now requires a `client_id` and so the platform got updated. ([@ioangogo] - [#16428]) ([sensor.twitch docs]) (breaking change) +- The radiotherm `fan` and `mode` state attributes were updated to reflect the real-time fan and mode states of the thermostat, rather than the overall selected state (automatic, mostly). The mode attributes still contain the selected modes (fan on/auto, heat/cool/auto). ([@cpw] - [#15031]) ([climate.radiotherm docs]) (breaking change) ## {% linkable_title Beta Fixes %} From 6523eb0e9d193b1984495f05f252343f17b52f8d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 16 Sep 2018 21:46:03 +0200 Subject: [PATCH 47/48] add component image --- .../blog/2018-09-release-0.78/components.png | Bin 0 -> 34224 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 source/images/blog/2018-09-release-0.78/components.png diff --git a/source/images/blog/2018-09-release-0.78/components.png b/source/images/blog/2018-09-release-0.78/components.png new file mode 100644 index 0000000000000000000000000000000000000000..c02f11a8c8aca57a71277e3d3b8162d55a0c5437 GIT binary patch literal 34224 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 Tdk0@yv8UM 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 literal 0 HcmV?d00001 From 3b8e9eb550a0625cb6c71a429379721acf2c7ae0 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 17 Sep 2018 18:39:44 +0200 Subject: [PATCH 48/48] Update date --- source/_posts/2018-09-15-release-78.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_posts/2018-09-15-release-78.markdown b/source/_posts/2018-09-15-release-78.markdown index 9d4eaefade9..a149ccd1df6 100644 --- a/source/_posts/2018-09-15-release-78.markdown +++ b/source/_posts/2018-09-15-release-78.markdown @@ -1,9 +1,9 @@ --- layout: post -title: "0.78: XXX - Update date" -description: "XXX" -date: 2018-09-10 00:01:00 -date_formatted: "September 15, 2018" +title: "0.78: More auth, Switchmate, Yale Smart Alarm, OpenTherm" +description: "We're 5! We got some great new auth stuff in this release and support for Switchmate, Yale Smart Alarm and OpenTherm." +date: 2018-09-17 00:01:00 +date_formatted: "September 17, 2018" author: Paulus Schoutsen author_twitter: balloob comments: true