From fea19c14762c9af1ae34fd2529fbe9133823cea3 Mon Sep 17 00:00:00 2001 From: Dougal Matthews Date: Fri, 14 Jul 2017 04:53:37 +0200 Subject: [PATCH 01/50] Add the new rgb support to switch.flux (#2956) --- source/_components/switch.flux.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/switch.flux.markdown b/source/_components/switch.flux.markdown index a48b0367b13..3cdb2e82342 100644 --- a/source/_components/switch.flux.markdown +++ b/source/_components/switch.flux.markdown @@ -51,5 +51,5 @@ Configuration variables: - **stop_colortemp** (*Optional*): The color temperature at the end. Defaults to `1900`. - **brightness** (*Optional*): The brightness of the lights. Calculated with `RGB_to_xy` by default. - **disable_brightness_adjust** (*Optional*): If true, brightness will not be adjusted besides color temperature. Defaults to False. -- **mode** (*Optional*): Select how color temperature is passed to lights. Valid values are `xy` and `mired`. Defaults to `xy`. +- **mode** (*Optional*): Select how color temperature is passed to lights. Valid values are `xy`, `mired` and `rgb`. Defaults to `xy`. From c760f9943f248f5b99292509e3a9ecdd6f2a485c Mon Sep 17 00:00:00 2001 From: Sean Gollschewsky Date: Fri, 14 Jul 2017 11:38:41 +0100 Subject: [PATCH 02/50] Added new configuration variable visibility_distance (#2968) --- source/_components/sensor.metoffice.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.metoffice.markdown b/source/_components/sensor.metoffice.markdown index 98c331b8504..c855095d050 100644 --- a/source/_components/sensor.metoffice.markdown +++ b/source/_components/sensor.metoffice.markdown @@ -33,6 +33,7 @@ sensor: - wind_direction - wind_gust - visibility + - visibility_distance - uv - precipitation - humidity From 603fba68de2aac1e1c4960d38e157e23ba4f43ab Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Sun, 16 Jul 2017 05:53:42 +0200 Subject: [PATCH 03/50] add doc for new wake_on_lan component with service send_magic_packet (#2950) * add doc for new wake_on_lan component with service send_magic_packet * use Hub as ha_category --- source/_components/wake_on_lan.markdown | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 source/_components/wake_on_lan.markdown diff --git a/source/_components/wake_on_lan.markdown b/source/_components/wake_on_lan.markdown new file mode 100644 index 00000000000..e4a1e5a9f49 --- /dev/null +++ b/source/_components/wake_on_lan.markdown @@ -0,0 +1,36 @@ +--- +layout: page +title: "Wake on LAN" +description: "Instructions how to setup the Wake on LAN component in Home Assistant." +date: 2017-07-8 15:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: ethernet.png +ha_category: Hub +ha_release: "0.49" +ha_iot_class: "Local Push" +--- + +The `wake_on_lan` component enables the ability to send _magic packets_ to [Wake on LAN](https://en.wikipedia.org/wiki/Wake-on-LAN) capable devices, in order to turn them on. + +To use this component in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +wake_on_lan: +``` + +### {% linkable_title Component services %} + +Available services: `send_magic_packet`. + +#### {% linkable_title Service `wake_on_lan/send_magic_packet` %} + +Send a _magic packet_ to wake up a device with 'Wake-On-LAN' capabilities. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `mac` | no | MAC address of the device to wake up. | +| `broadcast_address` | yes | Optional broadcast IP where to send the magic packet. | From 824e2c2ce5f83c9e4126ef1572e0495d1ccf7ece Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Sat, 15 Jul 2017 23:54:19 -0400 Subject: [PATCH 04/50] Updated Amcrest documentation to use hub component (#2881) * Updated Amcrest documentation to use hub component * Set default streaming source to snapshot * updated version to 0.49 --- source/_components/amcrest.markdown | 63 ++++++++++++++++++++++ source/_components/camera.amcrest.markdown | 23 +------- source/_components/sensor.amcrest.markdown | 25 +-------- 3 files changed, 67 insertions(+), 44 deletions(-) create mode 100644 source/_components/amcrest.markdown diff --git a/source/_components/amcrest.markdown b/source/_components/amcrest.markdown new file mode 100644 index 00000000000..194592081bd --- /dev/null +++ b/source/_components/amcrest.markdown @@ -0,0 +1,63 @@ +--- +layout: page +title: "Amcrest IP Camera" +description: "Instructions how to integrate Amcrest IP cameras within Home Assistant." +date: 2017-06-24 10:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: amcrest.png +ha_category: Hub +ha_iot_class: "Local Polling" +ha_release: 0.49 +--- + +The `amcrest` platform allows you to integrate your [Amcrest](https://amcrest.com/) IP camera in Home Assistant. + +To enable your camera in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +amcrest: + - host: IP_ADDRESS + username: USERNAME + password: PASSWORD + sensors: + - motion_detector + - sdcard + + - host: IP_ADDRESS + username: USERNAME + password: PASSWORD + resolution: low + stream_source: snapshot + sensors: + - ptz_preset +``` + +Configuration variables: + +- **host** (*Required*): The IP address or hostname of your camera. If using hostname, make sure the DNS works as expected. +- **username** (*Required*): The username for accessing your camera. +- **password** (*Required*): The password for accessing your camera. +- **name** (*Optional*): This parameter allows you to override the name of your camera. The default is "Amcrest Camera". +- **port** (*Optional*): The port that the camera is running on. The default is 80. +- **resolution** (*Optional*): This parameter allows you to specify the camera resolution. For a high resolution (1080/720p), specify the option `high`. For VGA resolution (640x480p), specify the option `low`. If omitted, it defaults to *high*. +- **stream_source** (*Optional*): The data source for the live stream. `mjpeg` will use the camera's native MJPEG stream, whereas `snapshot` will use the camera's snapshot API to create a stream from still images. You can also set the `rtsp` option to generate the streaming via RTSP protocol. If omitted, it defaults to *snapshot*. +- **ffmpeg_arguments**: (*Optional*): Extra options to pass to ffmpeg, e.g. image quality or video filter options. +- **authentication**: (*Optional*): Defines which authentication method to use only when **stream_source** is **mjpeg**. Currently *aiohttp* only support *basic*. It defaults to *basic*. +- **scan_interval** (*Optional*): Defines the update interval of the sensor in seconds. The default is 10 seconds. +- **sensors** array (*Optional*): Conditions to display in the frontend. By default, *none* of the conditions are enabled. The following conditions can be monitored. + - **motion_detector**: Return True/False when a motion is detected + - **sdcard**: Return the SD card usage by reporting the total and used space + - **ptz_preset**: Return the number of PTZ preset positions configured for the given camera + +**Note:** Amcrest cameras with newer firmwares no longer have the ability to stream `high` definition video with MJPEG encoding. You may need to use `low` resolution stream or the `snapshot` stream source instead. If the quality seems too poor, lower the `Frame Rate (FPS)` and max out the `Bit Rate` settings in your camera's configuration manager. If you defined the *stream_source* to **mjpeg**, make sure your camera supports *Basic* HTTP authentication. Newer Amcrest firwmares may not work, then **rtsp** is recommended instead. + +**Note:** If you set the `stream_source` option to `rtsp`, make sure to follow the steps mentioned at +[FFMPEG](https://home-assistant.io/components/ffmpeg/) documentation to install the `ffmpeg`. + +Finish its configuration by visiting the [Amcrest sensor page](/components/sensor.amcrest/) or [Amcrest camera page](/components/camera.amcrest/). + +To check if your Amcrest camera is supported/tested, visit the [supportability matrix](https://github.com/tchellomello/python-amcrest#supportability-matrix) link from the `python-amcrest` project. diff --git a/source/_components/camera.amcrest.markdown b/source/_components/camera.amcrest.markdown index ee9d7761118..2c1a042c877 100644 --- a/source/_components/camera.amcrest.markdown +++ b/source/_components/camera.amcrest.markdown @@ -13,33 +13,14 @@ ha_iot_class: "Local Polling" ha_release: 0.34 --- -The `amcrest` platform allows you to integrate your [Amcrest](https://amcrest.com/) IP camera in Home Assistant. +To get your [Amcrest](https://amcrest.com/) cameras working within Home Assistant, please follow the instructions for the general [Amcrest component](/components/amcrest). -To enable your camera in your installation, add the following to your `configuration.yaml` file: +Once you have enabled the [Amcrest component](/components/amcrest), add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry camera: - platform: amcrest - host: IP_ADDRESS - username: USERNAME - password: PASSWORD ``` -Configuration variables: - -- **host** (*Required*): The IP address or hostname of your camera. If using hostname, make sure the DNS works as expected. -- **username** (*Required*): The username for accessing your camera. -- **password** (*Required*): The password for accessing your camera. -- **name** (*Optional*): This parameter allows you to override the name of your camera. The default is "Amcrest Camera". -- **port** (*Optional*): The port that the camera is running on. The default is 80. -- **resolution** (*Optional*): This parameter allows you to specify the camera resolution. For a high resolution (1080/720p), specify the option `high`. For VGA resolution (640x480p), specify the option `low`. If omitted, it defaults to *high*. -- **stream_source** (*Optional*): The data source for the live stream. `mjpeg` will use the camera's native MJPEG stream, whereas `snapshot` will use the camera's snapshot API to create a stream from still images. You can also set the `rtsp` option to generate the streaming via RTSP protocol. If omitted, it defaults to *mjpeg*. -- **ffmpeg_arguments**: (*Optional*): Extra options to pass to ffmpeg, e.g. image quality or video filter options. - -**Note:** Amcrest cameras with newer firmwares no longer have the ability to stream `high` definition video with MJPEG encoding. You may need to use `low` resolution stream or the `snapshot` stream source instead. If the quality seems too poor, lower the `Frame Rate (FPS)` and max out the `Bit Rate` settings in your camera's configuration manager. - -**Note:** If you set the `stream_source` option to `rtsp`, make sure to follow the steps mentioned at -[FFMPEG](https://home-assistant.io/components/ffmpeg/) documentation to install the `ffmpeg`. - To check if your Amcrest camera is supported/tested, visit the [supportability matrix](https://github.com/tchellomello/python-amcrest#supportability-matrix) link from the `python-amcrest` project. diff --git a/source/_components/sensor.amcrest.markdown b/source/_components/sensor.amcrest.markdown index dcdb919a014..538369de5a3 100644 --- a/source/_components/sensor.amcrest.markdown +++ b/source/_components/sensor.amcrest.markdown @@ -13,34 +13,13 @@ ha_release: 0.37 ha_iot_class: "Local Polling" --- -The `amcrest` sensor allows you to integrate your [Amcrest](https://amcrest.com/) IP camera in Home Assistant. +To get your [Amcrest](https://amcrest.com/) cameras working within Home Assistant, please follow the instructions for the general [Amcrest component](/components/amcrest). -To enable the `amcrest` sensors on your camera, add the following to your `configuration.yaml` file: +Once you have enabled the [Amcrest component](/components/amcrest), add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry sensor: - platform: amcrest - host: IP_ADDRESS - username: USERNAME - password: PASSWORD - monitored_conditions: - - motion_detector - - sdcard - - ptz_preset ``` - -Configuration variables: - -- **host** (*Required*): The IP address or hostname of your camera. If using hostname, make sure the DNS works as expected. -- **username** (*Required*): The username for accessing your camera. -- **password** (*Required*): The password for accessing your camera. -- **name** (*Optional*): This parameter allows you to override the name of your camera. The default is "Amcrest Camera". -- **port** (*Optional*): The port that the camera is running on. The default is 80. -- **scan_interval** (*Optional*): Defines the update interval of the sensor in seconds. The default is 10 seconds. -- **monitored_conditions** array (*Required*): Conditions to display in the frontend. The following conditions can be monitored. - - **motion_detector**: Return True/False when a motion is detected - - **sdcard**: Return the SD card usage by reporting the total and used space - - **ptz_preset**: Return the number of PTZ preset positions configured for the given camera - To check if your Amcrest camera is supported/tested, visit the [supportability matrix](https://github.com/tchellomello/python-amcrest#supportability-matrix) link from the `python-amcrest` project. From 64b08028a62d7d195d411d066de73ece4e2a4a14 Mon Sep 17 00:00:00 2001 From: Phil Hawthorne Date: Tue, 18 Jul 2017 02:00:07 +1000 Subject: [PATCH 05/50] Add blog post for Podcast Episode 4 (#2996) * Add blog post for Podcast Episode 4 Adds a blog post about Home Assistant Podcast 4 * Update description --- .../2017-07-17-hasspodcast-ep-4.markdown | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 source/_posts/2017-07-17-hasspodcast-ep-4.markdown diff --git a/source/_posts/2017-07-17-hasspodcast-ep-4.markdown b/source/_posts/2017-07-17-hasspodcast-ep-4.markdown new file mode 100644 index 00000000000..565a3755748 --- /dev/null +++ b/source/_posts/2017-07-17-hasspodcast-ep-4.markdown @@ -0,0 +1,18 @@ +--- +layout: post +title: "Home Assistant Podcast #4" +description: "We quickly cover off a few community items including the move to Discord and Carlo talks with Phil about his use of Floorplan." +date: 2017-07-17 00:01:00 +0000 +date_formatted: "July 17, 2017" +author: Phil Hawthorne +author_twitter: philhawthorne +comments: true +categories: Media +og_image: /images/hasspodcast.jpg +--- + +We quickly cover off a few community items including the move to Discord and Carlo talks with Phil about his use of Floorplan. + +[Listen online][episode] + +[episode]: https://hasspodcast.io/ha004/ From 1a79ed2b7bbb52ecb1b60672d96e536e544507bc Mon Sep 17 00:00:00 2001 From: Ken Davidson Date: Tue, 18 Jul 2017 06:17:45 -0400 Subject: [PATCH 06/50] Update rpi_pfio.markdown (#3000) --- source/_components/rpi_pfio.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_components/rpi_pfio.markdown b/source/_components/rpi_pfio.markdown index 041693be588..51feb22b704 100644 --- a/source/_components/rpi_pfio.markdown +++ b/source/_components/rpi_pfio.markdown @@ -13,5 +13,6 @@ ha_release: 0.45 ha_iot_class: "Local Push" --- -The `rpi_pfio` component is the base for all related [PiFace Digital I/O (PFIO)](http://www.piface.org.uk/) platforms in Home Assistant. There is no setup needed for the component itself, for the platforms please check their corresponding pages. +The `rpi_pfio` component is the base for all related [PiFace Digital I/O (PFIO)](http://www.piface.org.uk/) platforms in Home Assistant. There is no setup needed for the component itself; for the platforms, please check their corresponding pages. +Set the jumpers on the PiFace board for address 0 (JP1: 1-2, JP2: 1-2). From fb3821bd237ed63742aaae2065ddfa9ecd7d1689 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Tue, 18 Jul 2017 12:18:33 +0200 Subject: [PATCH 07/50] Remove deprecated automation keywords (#2997) --- source/_docs/automation/trigger.markdown | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index 8614cbba115..ad97a001315 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -94,9 +94,6 @@ automation:

Use quotes around your values for `from` and `to` to avoid the YAML parser interpreting values as booleans.

-

- Using `state` as an alias for `to` is deprecated. -

### {% linkable_title Sun trigger %} Trigger when the sun is setting or rising. An optional time offset can be given to have it trigger for example 45 minutes before sunset, when dusk is setting in. From 15eba5ac2870e0e438a0900b98497c7d4c5941c4 Mon Sep 17 00:00:00 2001 From: Ken Davidson Date: Tue, 18 Jul 2017 15:34:14 -0400 Subject: [PATCH 08/50] Update sensor.pushbullet.markdown (#3003) --- source/_components/sensor.pushbullet.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.pushbullet.markdown b/source/_components/sensor.pushbullet.markdown index 608da2131db..18d9007b393 100644 --- a/source/_components/sensor.pushbullet.markdown +++ b/source/_components/sensor.pushbullet.markdown @@ -14,9 +14,9 @@ ha_iot_class: "Cloud Polling" --- The `pushbullet` sensor platform reads messages from [Pushbullet](https://www.pushbullet.com/), a free service to send information between your phones, browsers, and friends. -This sensor platform provide sensors that show the properties of the latest recevied pushbullet notification mirror. +This sensor platform provides sensors that show the properties of the latest received Pushbullet notification mirror. -Notification Mirroring allows users to see their Android device's notifications on their computer. It must be first enabled in the app and is currently only available on the Android platform. For more information, please see [this announcement](https://blog.pushbullet.com/2013/11/12/real-time-notification-mirroring-from-android-to-your-computer/) on the Pushbullet Blog +Notification Mirroring allows users to see their Android device's notifications on their computer. It must be first enabled in the app and is currently only available on the Android platform. For more information, please see [this announcement](https://blog.pushbullet.com/2013/11/12/real-time-notification-mirroring-from-android-to-your-computer/) on the Pushbullet Blog. To enable the Pushbullet sensor in your installation, add the following to your `configuration.yaml` file: From fda6aa2be657af609e12c93fc563a6b66039624c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20St=C3=A5hl?= Date: Tue, 18 Jul 2017 21:39:12 +0200 Subject: [PATCH 09/50] Correct documentation for Apple TV (#3004) * Correct documentation for Apple TV * Minor style updates --- source/_components/apple_tv.markdown | 146 ++++++++++++++++++ .../media_player.apple_tv.markdown | 39 +---- source/_components/remote.apple_tv.markdown | 44 ++++++ .../images/components/apple_tv/auth_pin.jpg | Bin 0 -> 35323 bytes .../images/components/apple_tv/auth_start.jpg | Bin 0 -> 26766 bytes .../components/apple_tv/scan_result.jpg | Bin 0 -> 24653 bytes .../images/components/apple_tv/scan_start.jpg | Bin 0 -> 21455 bytes 7 files changed, 192 insertions(+), 37 deletions(-) create mode 100644 source/_components/apple_tv.markdown create mode 100644 source/_components/remote.apple_tv.markdown create mode 100644 source/images/components/apple_tv/auth_pin.jpg create mode 100644 source/images/components/apple_tv/auth_start.jpg create mode 100644 source/images/components/apple_tv/scan_result.jpg create mode 100644 source/images/components/apple_tv/scan_start.jpg diff --git a/source/_components/apple_tv.markdown b/source/_components/apple_tv.markdown new file mode 100644 index 00000000000..2d01f193f42 --- /dev/null +++ b/source/_components/apple_tv.markdown @@ -0,0 +1,146 @@ +--- +layout: page +title: "Apple TV" +description: "Instructions how to integrate Apple TV devices into Home Assistant." +date: 2017-06-26 20:47 +sidebar: true +comments: false +sharing: true +footer: true +logo: apple.png +ha_category: Hub +ha_iot_class: "Local Push" +ha_release: 0.49 +featured: true +--- + +The `apple_tv` platform allows you to control an Apple TV (3rd and 4th generation). See the [remote platform](/components/remote.apple_tv/) if you want to send remote control buttons, e.g. arrow keys. + +

+Currently you must have Home Sharing enabled for this to work. Support for pairing Home Assistant with your device will be supported in a later release. +

+ +To use this component, you must first install some system libraries and a compiler. For Debian or a similar system, this should be enough: + +```shell +$ sudo apt-get install build-essential libssl-dev libffi-dev python-dev +``` + +If you want to automatically discover new devices, just make sure you have `discovery:` in your `configuration.yaml` file. To manually add one or more Apple TVs to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +apple_tv: + - host: IP_1 + login_id: LOGIN_ID_1 + name: NAME_1 + start_off: START_OFF_1 + credentials: CREDENTIALS_1 + - host: IP_2 + login_id: LOGIN_ID_2 + name: NAME_2 + start_off: START_OFF_2 + credentials: CREDENTIALS_2 +``` + +Configuration variables: + +- **host** (*Required*): The IP-address of the device. +- **login_id** (*Required*): An identifier used to login to the device, see below. +- **name** (*Optional*): The name of the device used in the frontend. +- **start_off** (*Optional*): Set to true if device should start in fake standby. +- **credentials** (*Optional*): Credentials used for AirPlay playback. + +In order to connect to the device you need a *login id*. The easiest way to obtain this identifier is to use the `apple_tv_scan` service (described below). Additional information about `start_off` and `credentials` can also be found under the guides section. + +## {% linkable_title Guides %} + +### {% linkable_title Scanning for devices %} + +To scan for devices, press the icon in the upper left corner and select the leftmost icon according to the image: + + + +Select `apple_tv` as domain and `apple_tv_scan` as service then press the button: + + + +Scanning will be done for three seconds and notification will be shown in the state view with all found devices: + + + +Alternatively you may use the application ``atvremote``. Install it with ``pip3 install --upgrade pyatv`` in your Home Assistant environment (note: do *not* use sudo). Then run ``atvremote scan`` to scan for all devices (try again if a device is missing): + +```bash +$ atvremote scan +Found Apple TVs: + - Apple TV at 10.0.10.22 (login id: 00000000-1234-5678-9012-345678901234) + +Note: You must use 'pair' with devices that have home sharing disabled +``` + +Just copy and paste the login id from the device you want to add. For more details about `atvremote`, see: [this page](http://pyatv.readthedocs.io/en/master/atvremote.html). + +### {% linkable_title My Apple TV turns on when I restart Home Assistant %} + +The Apple TV will automatically turn on if a request is sent to it, e.g. if a button is pressed, something is streamed to it via AirPlay or if current state (currently playing) is accessed. This is how Apple has designed it and it will cause problems if you are using HDMI CEC. Every time Home Assistant is started, a new request is sent to the device to figure out what is currently playing. When using CEC, this will wake up your TV and other devices you have configured. + +So, if your TV is randomly turning on, this is probably the reason. As stated, this is by design and there is no real fix for it. There's also no known way to turn off the Apple TV via the procotol used for communication. You basically have the following options: + +- Do not use this platform +- Disable HDMI CEC on your Apple TV +- Use "fake standby" + +The first two points are quite obvious. Fake standby is a concept implemented in this platform that disables all requests to the device and make it appear as being "off" in the web interface. This will make sure that the device is not woken up, but it will of course not show any information or allow you to control it. It is however easy to turn it on (or off) in the web interface or using an automation with `turn_on`. To make it more useful, you can write automations that turns it on or off depending on some other device, like the input source on your receiver. + +To put a device into fake standby when starting Home Assistant, add `start_off: true` to your configuration. + +

+Turning the device on/off in the user interface will *not* turn the physical device on/off according to description above. +

+ + +### {% linkable_title Setting up device authentication %} + +If you, when playing media with `play_url`, get the following error message: + +*“This AirPlay connection requires iOS 7.1 or later, OS X 10.10 or later, or iTunes 11.2 or later.”* + +then device authentication is required. Press the icon in the upper left corner and select the leftmost icon according to the image below: + + + +Select `apple_tv` as domain, `apple_tv_authenticate` as service and enter `{'entity_id': 'XXX'}` into "Service Data", but replace XXX with the entity id of your device (e.g. `media_player.apple_tv`). Press the button and hopefully you are presented with an input dialog asking for a pin code: + + + +If no dialog appears, go back to the states view and display it from there (press `CONFIGURE` as displayed in the image): + + + +A PIN code should now be visible on your TV, just enter it into the dialog and press "Confirm". You should see if it succeeded in the state view. Copy the credentials and insert it into your configuration (make sure you copy everything, it should be 81 characters) after ``credentials:`` with no line-break: + +```yaml +# Example configuration.yaml entry +apple_tv: + - host: 10.0.0.20 + login_id: 00000000-1234-5678-9012-345678901234 + credentials: 1B8C387DDB59BDF6:CF5ABB6A2C070688F5926ADB7C010F6DF847252C15F9BDB6DA3E09D6591E90E5 +``` + +Restart Home Assistant and you should now be able to use `play_url` as before. + +## {% linkable_title Services %} + +### {% linkable_title Service `apple_tv_authenticate` %} + +In order to play media on an Apple TV with device authentication enabled (e.g. ATV4 with tvOS 10.2+), Home Assistant must properly authenticated. This method starts the process and presents the credentials needed for playback as a persistent notification. Please see guide above for usage. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`s of Apple TVs. + +### {% linkable_title Service `apple_tv_scan` %} + +Scans the local network for Apple TVs. All found devices are presented as a persistent notification. + diff --git a/source/_components/media_player.apple_tv.markdown b/source/_components/media_player.apple_tv.markdown index 9b49da82a6c..3fd91fbe0a3 100644 --- a/source/_components/media_player.apple_tv.markdown +++ b/source/_components/media_player.apple_tv.markdown @@ -9,43 +9,8 @@ sharing: true footer: true logo: apple.png ha_category: Media Player -ha_iot_class: "Local Polling" +ha_iot_class: "Local Push" ha_release: 0.38 -featured: true --- -The `apple_tv` platform allows you to control an Apple TV (3rd and 4th generation). - -

-Currently you must have Home Sharing enabled for this to work. Support for pairing Home Assistant with your device will be supported in a later release. -

- -If you want to automatically discover new devices, just make sure you have `discovery:` in your `configuration.yaml` file. To manually add an Apple TV to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -media_player: - - platform: apple_tv - host: IP_ADDRESS - login_id: LOGIN_ID -``` - -Configuration variables: - -- **host** (*Required*): The IP-address of the device -- **login_id** (*Required*): An identifier used to login to the device, see below -- **name** (*Optional*): The name of the device used in the frontend - -In order to connect to the device you need a *login id*. The easiest way to obtain this identifier is to use the application ``atvremote``. It should be available in the same environment as you installed Home-Assistant. To install this utility, run ``pip3 install --upgrade pyatv``. The run atvremote scan for all devices (try again if a device is missing): - -```bash -$ atvremote scan -Found Apple TVs: - - Apple TV at 10.0.10.22 (login id: 00000000-1234-5678-9012-345678901234) -``` - -Just copy and paste the login id from the device you want to add. For more details about `atvremote`, see: [this page](https://github.com/postlund/pyatv/blob/master/docs/atvremote.rst). - -## {% linkable_title Notes and Limitations %} - -- Pairing is currently not supported +To setup the `apple_tv` platform, please follow the instructions on the [Apple TV Component page](/components/apple_tv/). diff --git a/source/_components/remote.apple_tv.markdown b/source/_components/remote.apple_tv.markdown new file mode 100644 index 00000000000..e1bba9e0659 --- /dev/null +++ b/source/_components/remote.apple_tv.markdown @@ -0,0 +1,44 @@ +--- +layout: page +title: "Apple TV" +description: "Instructions how to integrate Apple TV remote into Home Assistant." +date: 2017-06-26 20:50 +sidebar: true +comments: false +sharing: true +footer: true +logo: apple.png +ha_category: Remote +ha_iot_class: "Local Push" +ha_release: 0.49 +--- + + +The `apple_tv` remote platform allows you to send remote control buttons to an Apple TV. It is automatically setup when an Apple TV is configured, please see [Apple TV Component](/components/apple_tv/) for configuration details. + +At the moment, the following buttons are supported: + +- up +- down +- left +- right +- menu +- top_menu +- select + +A typical service call for press several buttons looks like this. + +```yaml +service: remote.send_command +data: + entity_id: remote.apple_tv + command: + - left + - left + - menu + - select + device: '' + +``` + +Please note that `device` must be specified (because of validation) but is not used by this platform. So you may specify any value. diff --git a/source/images/components/apple_tv/auth_pin.jpg b/source/images/components/apple_tv/auth_pin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b87b2a7d6ca5e6776e18175b3e37abf441fd570b GIT binary patch literal 35323 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 CD|tfz literal 0 HcmV?d00001 diff --git a/source/images/components/apple_tv/auth_start.jpg b/source/images/components/apple_tv/auth_start.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a35609c9962ea81c074b60639f62c16bf48b3db GIT binary patch literal 26766 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 literal 0 HcmV?d00001 diff --git a/source/images/components/apple_tv/scan_result.jpg b/source/images/components/apple_tv/scan_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0051f451666fbd1f1022b1b27c3c67f68540b1bd GIT binary patch literal 24653 zcmeFZWmsIzwl3NP*I>cj-Q9z`I|PDjH|`Q3xVuYmZ3xoPK#(N32A9U&2@)ho4&Qh7 zT5Ing=kER7^XER#UDZA3teQ3I9iv87j~cUTR{vT2vjM3=eqq62pHvOj9EP$S+sim&5fF903013ilW7 zr&s?dg|Pey{vUDpmX~}04;Qzf2-nM(mx@bRgjZ06pC9m6M@C8MB~Qo7-Npv=BDm+D zP1G=ZPfu47PEL>qhlRC^r45Ib3y{;-!j+SogNqX&Ch6;HVdZ4wNo8qc=KvC?Iq&SD zp>nVmr!nAH<5F{#v9Whh^mn(>@mJTi@^`Wlwx*Gkpc3;H@ddg9Z9FZge1Xm&4-sE+ zn!mwCUgCe<=A@zeo5a&eoW@X1lS;cAVV8!or+fJe)i{>@O7T9)2KC3tx7S2kk!)WNkdG+#Os!9b7|db^oDe z8qSw0aQ;Uf{)+xn84^_g4*%A`zcui04g6aJ|JK02HSqsG4gAZUvH`t#4?Zu>65tOE zAoJo^{@;baK>qI#UP}Mz1>m5-p~IQM!_fd<;lRP;!2Rh1P`tRBuU@@^|I0c3kARAX zi~@)B3LX*RC0_{}00)l%2Zw-&h6sm%^5Ur?As`|H;9kL_;Gp6XQgdsiX3pW^zaf6B zqh~NZOF(1c7Memt$D@r#OK(}+IQ5fP*e9$Bdhr594)+%;_?PoP10wRP7glKSs4v;< zI4_*w;gAslFC_n)=G6;lL?j$!B5Hk$%%3Q@Hg12hqM@h#vkbs^5&0DkJPtq-pq<_z zjhyDDtR14A{t3UF36WVD?*Dy4;%BD^YdbBv5j8`|<}IN$Q(+u_D~G?jz+!1I$-MZv zz0)5+Oa3oGhf#Xr;vG^CeI|2MQ6LPvsBAz z{oSrhzlUUV{uk6XjpnB!lGB-yHK^#q!h;@n3v5lzsU2qAxN?qd=#7?n$zJ84#(sXn z&S#S0VI3g*2hc&2UQu))RoSLyVGtfAz-xIoPa4qtZhhGK?rB7ZP+&Q6chf~{Z>i2! zPk*`8#A`|64?qN3Q`3E{H}hQ6@Py#-f)*d~E`2|FSOwePIQ91j8+K9Od$%}go3r0&dDhShbP|kn803|w zTHUs15l^RhdR45p)1&&aG0^dsw*+vp7czjS`k^%+wnrMel;?N$dgkM1Zbt0}>vHJ3 z1q5AMV8x==N!0T|G&ijUdL6sgO4DbxN}!&upBmqYp2qE`nZJhdjb&2buf0bf;X#*va@^F{*p%;Q>yer6{alG8HlV$;VH)FiqZGvV+)xDR}KrBNrU)pXTlj?lL>b?pc zN|3;J%766gY!*27@Fq?x{=x0@j45c#*JR)_Gt9o zG;=SqEpH9Cn%WwjF3Dsv6Ph%)^LMM&%PN$}>k5<_F;ed;B%N#bF3^ z?XQYFs5JocPiVz~LIv9~ zTe(`2YV3pLAM8{KY~%dLp~o2E`n{X4U7d7v@{Hfr$>Zg9#?jd61`r@`9E(FlnxB}m zl;c}@PCMmEZc6lP5tdw}Ge@*f7W3XURaJ?~jh)rD_Jz$$tkmWuvobHRWyP>tUY1$4 zcO3<@`XuJ<$c^?G?N|{EHPe;owMDG2?H2Nwh8lVJkf)xU4Xw_5eN)%IW|c7@k%?b> z`#y%2FM^PDsaxE6+!=Q+aYB~N@`;eAOQWsNoqVkZoOGAnJyt6yBK_>ZvinnQdm##c0p1C6AYl~7MnrMl# z4x<6K`;=vbO)K_9AKx|^oSgTlq|Pb3jfj9|uc8GG)az$#+;#VWSFm)bOE2VeUIj1K z?Q6<3lR_1=7-$#&AvTUDC?M90JIio!HpdafQ_c>U#b z12Rkm%sI)6GQO+j;X?JiGvD))?ChqD2H0C@PZ=3`Dq?mDBzHP3-#|_S%oZRGPRmcg z0P~3j$mwo?*_wCPmj*|JW3!4;0}i9a1XMSDi18O4`aw4Bil%Z=T_X`^kLLh}DPR#z z;nE*~c*|z}%Z0zeJhhemO-*tJvqV2Lb4?of%_-PHc}`>|!m|O>;ai83jCQ`V_SSU7 z9{>$5gr4&ReK~j+Ntf~L=SptIqSZX>rQ}Rdr?Z0rqO?gP ztW7nT)$2J<=MSKV750j+&A9uCPkyifMnK6+>yCE;CNv2e;g1Xu_|=xKB=?QZaj8_; zI}2?-E|zvA_|zpycxQT_W--rHa;JSP?ECW6G9CqzT>h6#8GsQsMqK$a%idZq%*g@d zvi6(k+x2mEBcuOanM_*h91CBGMk2G8NzgUpLbZel#G?EcP5$>>nROguR9ZHN?A?1T zWgu^E`M~FLi!IfgSGJ3E^!WYY$(v;viyKyp&Vb{sg6tqJFhe|hS1@Voeu>DDx%K4g z+R`)E+?m+G9_-|%)3`!Ix98OC!$hle{L`-U3T;1h(9v^8MOSyy2DhwF25&{>!%8W8 zFL0VYOk$3g@nTs2mVLqGY40)*236y2G6aBACC7;Jt4o%ZXo9_a_3HFH_xqIPlOL5u=3x2{+y=MA=?$= zXSY5Se*mRDtAjl=mFfl01!n~k6J3(!A|{g~Yr#dVUOl%xu%kA!F806aCG^j>r`NpO zyjQt@`2c4s#3d#QM1s=0h1PDmE(Y#Rp2->#1xG2{?%lf@G9`k84Im!>V~5UMsbF`- zYp&~8=v;roX|Y)rQe|XB4QT->VZ{Ut4=mNiFwT-vtI;$+sT}^`bvjo7&Lm!b_PTN~ z6oR=3Y^%3M8GE4t=kulYVF~pa$}l&ya_ts&{u=!V?P_f&-I|PYCz*qp`p?HMpO53e zj7EE9jjB+W%~`#V zI=gR}&lvtc@Duo1kaj_64rDxa*c4^l;^{8{I6Mp zPi_+JZ@r^bu$~=!p8MorTJ$e5bdGZP9#1fC`SP~(tXxo+ByqfMri14T{|PDB46787 zJ*{)9?7O~71ow&axYJFXk4gHB2e;H~{7a1LU#hvm-bewtY8NbxZQ&`` zgv?tyoynu|p68$0^7k9m-=fG7#ZQFtV z=3sCl$;{f4*I|IodRK?>&Dq*5b`G}b7&+b9=F1z87geUO;+BSW}J65B&H8xGiWvhuk>VL8oQ4?$HHro2|o-Xt+{i1 z`&H9<{Q=ldGXaKo>jj4q!`h^E?pk(fqMI33p1sRuMtyqNeVvBjfCGP<=bXJs2pKwi{i zJA07$R@~`Lf0laF8s(ni@8V9GJvA0oG+gV-U`R)+x$LcnX?#{1+0{u&>{hqhM582S zyWHTj#SmgG^obTaIJ(mt8Dek0$f~x6Ygx;XaE#mO)I^Jv{#y+RMpo#FBJsMxcWt){ z^%-*d;Yq}7;SWIN{tv)~Q?dzqZt{{UQt$HjJU%#H7_Btx3LdHP+)@z!DHa8BiYyjO zDWVg~Q?T}onkW>*QBG~wTA3XD*eXbi0zc}f=B}N@`3xmptJ6L@s zC($C?DdV1fTMkEqOwa}505w=UrFUB++{-<7TBNmyj)16X(1RU6Y;Cwujunm*KwHi& z*fb=X3B>rRtwCxTtI1X5^UOUm6$@f+(+!s6#8h2B7g}3ymW*GjS~+!i_<^I_;M#n2 za^&{%s;1#mC2dcPZ`bFEx?Xuu(PV*A?os08)EE_fC^<#zYaNbSnYNklrenz9UyWP-Yz0&4M)ZhTc%CNMVcW#MRp$%|%R*ju?JA4$I zl6hW|GuII}Sn~@Sk!w<)V_viZIsZQ}D5Mn_)wZzeOcu>h(7}jK3 zB%LxhFV(a_&VqALZCWayeHpXBB9r>(hEk z&&84=)#t0Q?5XX6U1Q~v{?Sm#`Q|{4QV6eUG2Z4&djWH#;}QW5*KXW*7B8sd;>LO* znhuQJ$b===WbJk#%lzKG&E)#(aDMfilXLHIVRS*Wct^+YlIL~#!iR7mo+xG}K^c-t7hej|z z?tX?WW&s8|@AX0<`X4Q=Sj&MlS>o+Jv$piL==%XqgQP(e{d;=Ti%CqK3L|(-y=g5P z$vc;t6eF9^^iUblR6BdZ&%CH|4!eIx`MHWc8Wpv%b36K zEB@g6TJhp%3+I?@`Q`#bXxog;9FlS47=F}&PxF;(-TAyM#4EHS$aJ?#6u*?`_Kw~|a{b1>ME71)wy#Sik6Tlw z=`_HkB|R!xlAqpf5CKaxg+((<|H)DFkRtG<3=+h zrKpBb>C(2~SW3VVJi%d@P#*MzzKwBV_QJGkv?^%EK9*P<{Z*;rW1ZXQoHXNn!ox`) zH#3Lc#wh=_p3@Iae*ktW=2HQ`9z=fC2h2l$2X&k2L(T)duDuQyD$U;=b#qm|YS-2n zG~>TK<2!w|;}IpKnnTU}P0l;Z=A(8n(=bq>V?ed+z-=^PY?0{|UP2wi&7~xH4Lqe2 zEs2{{@5S{%fJ9LD-F6m7STi!09~J(#xOcTXU96xqMjt<>w>>1M-)#YnY~}kevGNhk z3QwcY@j7ou`x}D~tWvBC^CbT~Y*k$DjiLd-KVLrJ03=DV4v>;Pg#b z!*kZ5f0d>=ji1RVNcaz6>TLQCU_`ivMR4c3YglL?Fm=nWEOgHud&PombWFI)Uk1#Q z;zTIHAL_8`191lF$%Ukrh-PnkPkmd5yYj#nnSy z-qil}w|Kga`q_ofuRg4#H|?2~6s%T@IRUjagZ#{HzA9m5cSi%uKYLM^UmmiVl{L|{ z(_f|k{lxu$POuuZmk%14nOwL#ZmZ~)Jz(4|64ZdZChOze}3=rXC*s+-6t!xM6S*XliyokS8ugWQ=7l7EU#L3L3nwQ~7M z>bh3UP78xP7JwTWtbW(6cPv1iEwXIGwoKF-!QjNs=Uf(8 zCv<0L^JTldWMT+qv;RdtSg|EbgdIT?+l0>kP1rPaT!&<9YOjn1HjmX){G&@8>=d{B z(h?8;ufD95Y;Yssd;`rFs;cR<+i?h6iTw081bC;uquoQ<4Y6f~OTZvR?sKzN$1h$Y zT0GOJPkh}lKfH9fQGG8DshPFvG*?@%K|1NnY)2eC!)tPv$#*ZS?R&39Aux_2RB?7 zMZTjSp*o=P2lln^#nPs5yW#e?uaoj`iZrx6;gGr-g`?$Bx1beb$qBjNTdbpnBzy}M zyjU31!?9`ZyTb_j;5TE{yKQrKo#tV?KUdlCKZynOjIKTxh&**CW>h4F#t`YU7r*rAHsYS&>Fq1%IO9K*mp!CHZC5fI&L&(J(oQhYkYS zj3gXY2?&mJ9$AF-wDlA`UUnT*X@?|s>;J?HT;~nBtU)PKzsnjm{P|{?L4i9wK5B?f zf$IUbmTKc>-APDZwk+XK6H=rWqrh4HHR7k+m173D{to6dY>`+zF=l!_s%=i?S2|=F z3{suu!&c~jazfeuJmk%e5~8O2czuGxzzVlmEh4@j+nL3|=uhJx=%!XG%?C?9XoUeY zay79tnU~0!sPGb?8(zyeqKabJ(L)FZkr&ObRDiOupOhqBWgp^8j6~Bun&>FXU--uE zwaT`)l-d$g(OTPpY=UWZlk`V{XAwc!xSgt3LrMzqf!A5kPV&o@;ToA8Q*CZSIfXMU zyIgq_X~p=>9Iiv$!6DP+&sxRp=(*RYh`B!+G(I--SS#xYZbZIkmXguMTSEGdg6!>r z$XGanM*1LBp0lQcWw?Viln|I6>FAWQ?3I9b_TzWSxTqZ7P{560M9-VpXu;Ow#l}}` znZWL@DV09kot2w+6M1CqwkK`T2STO3YbVjpQ{Z-t&ThlLr8bM-Lp;x)i#$V zG94?MR->TXdyu~x=IEdLKuWal*(q!Pk>W?y?d*GL7Tp);SUd>Ud3%qO6${ zB@g;z`gE2I+T$uH$0hoDB)8H<_zt}5zp2}yU+K=F9$FSjBi@d32vKzw&~aWdsh8+=fhC9XCOKYJM6Qe&8cRMM`y@VXpTgcsBaLgpIN~bVp zF1IFSOzQX8DmE}WID-~BDV3q9IeOPMgc$A8l+hMjd^);F1uJ-VG=X8HFRBXdPLKZH zU5!7SvO-ehV~83Xg?WLp1<9w2>H?bbojj`eyhtrjo<9J*l6&_|(77($Y2fC?kkyw& zuxdZ0LJaisVuagDN#J#|^pXvVv&FTpYU4BeY$HUaF)#VTZ-Z#yYq(l&wD~(Mgyz>S z^iIJp?kfnT+7RAEvHpa678w>qtk}`U!)xYfB<=Tflf>Qf*4t(bO`^ESW`_k=nh`LS zG*Xd_2SRSBuwY5IVX=OLPGQ7>mIF`l{Nh-mdxD#Vq9$`+C6<5(X$phKbvbTfRBTq* z#rOoeYCqjKIVTAz1-k#0^z-drRi7Iel$MFvN@Rydk@G9+cgjq_pX#niS1C|8#%g#*R*twDPMt zA5ufPkYLoQ{YjAB#`brSImPxbty>~gOR9^5OlcUml15-bO6B4ur!2!nDM)PqI;uh) z!7+90#3B!23uDTsgKv}nIT$%8@Pi&VgN(DQD$vUkk0Ka4`*@i@Q4T5L69QUJQe|)U)9|Kn*WhLLjZ(l$t=3gcFT}HaBW%sQoi+N$YPUZ zOc}1Qq9u)xU%Wv@QGY4VB8se7wWwE}2fdowoyCT zZlhPK+;wICH1w>F)DZBzWfDG}#R0j6Tw zKeYSWt8cwCL|r~%mX^QWCkim0g1Y6BXWnxN(u<7Xsj4523}$cPZYwQ=lLd)=-gOL5 zs3y~MiTn5`=J=c$M|-Q@dvE0wX(LxAS0%8xEzDvD95xq;0XzM+zx$b#Zqo&@xh0bN z1X5DC`P#a(?rt#wN3acfwo;cEX$WaRg|v`brM$~=NDgc4>8N`vyJH7j`*qbm#i{(( z_R{Z-O3bEg9TsT{rO1lRGL(F%G=ZPMmPlz5B|?sM6yLmqt2?q)LgFaTy9RaI2AQyM z7NWHkvK(^bDa&l1mhXWJBa8rQ`$S6_47&j$kPXSa4m>6LX!rykBelNl_Mr0#M=jU5 zDZd4K!hlA-iP2P7IB&@Ze?Ikb+o!takj$h1&S`BRYdkleKc2b&Ji0WpIo!YQ4_T9y7wPj0oC}jm)ZB@sLWXlP{&RgUTvqFidT`^Q~^a%J^5`z%nTVl zTT?kXBAKHt^$a>%Pn=*BHNpGwa95m!anapY26diQ+v4;C9SARv<$7X)(yzm)X0P4C zw`dw|$!Pj+C2YGG1!Ice&|1u<R8j4`rw!`@OU;qcsWwoLOU zpZ%i4qypcNeJvl*agdV!S!Df+>#hB^VkHd)juLj6*3uRpHU(?^vH>KC4T8JxX^K&|;E)HfP}#alaC1f|K=#5ms*$&gZgb6LWv0#Qs4?lKnF6D~iCrHXz2 z*(`;97*ae*Ecb>dj!+nc9Jq1{LFI;bk`C$=90xO@B%B;X-wURfj!nq8=M)4ePsnhD zA|V(L13p@Y8Ng**a{Cbl1-Qn2EnnIM=!gzeJAD(7)zBVh)+xkHZI*i*tQD>Q3`y&Rr$JiI@*TKt5V-KT>Ci|$dlXCdJP@P5{#Zc#6 zuV*7PR9bSc9mBDj>?XeUB=ji4KTGPh7kEwG*>i5(AFt!pUT3|uf~B8n=+D6>PTKI z@?sGI&4z?D+z6Jd|IO`Wm$)lzB_JX7G_QF?DMGdMkhy@@0WNtFJvsm$X3U*qUJh3r zn6g3VGTbdKg%|UE>lBFnv#yr_NOE`k;ekXGQ4JGYUyvO2kbz zKS)&dEk#STT)CKZf`#V6`5w1rkWa$US8^o_1|Axs?i2XUrFhYfLH0wf7R!`L{kaR? zn9~)T1kBK1^kK9&;_wl+qaA%D2D@xJ;_Hird8694jpKgsHE6&D&3*0We9n>iLK{w_N;EDN*)P}0f zTj+1!2~&J`_Ti@RwDu?IT3%j|+LgYyO2d2K&n<6v_ayHA@(bxNsZsN5+mME_Mxu*=#Xf{rjfti_?|y99TMBN zHcI7z9iq4~q4~iNi!?vrEq$sdlL8JeC+GW90Oc;xupvd382P-l@Z+nQ;RRFTm}^FN z&C5@E1i#qXdz7ob68;E>(n|DSraENTW~pj3U&+FuyQRc{0zvi!paG89Ju*6jTN;8{ zp3+24ZQWF^;*GZ}1xR~v#earXY3jO4K&mf?Og=w6>uv0!PIb7Nq7IFD!%)kEPg#LsFXi>*87}*?@JF9zs^m`yK4l<87tg&pt}yFl(P@i z+-q$1csFx?F48VIh`FI;^A7Ktv4hKaV{0~6evUQd1m19OBExat`?`WCdBsb5uS~6; zl`Q4ReOw#AihxP4Qa>Hm+>5cP-1iM{mXa#@2p2wktJxB~1+2`Km!*^1vLx?47ouC9 zu&GW-ISeSAG5|XLIB}+#&tmYpV^hi1%X8Byc@RUkJ7DXgncGU^(^QRUnd=sCGZv>s z>Y{T=A=f_yI=?b4Z#>mck4)rX!TTh|+9U2VN^m}#!GhU&V-e9inhrMG?cucO#_u1Z zUuyTbd@D%%`QVA6F;Xp@Q+v`dz#{fU+uJwS+n*{{bj=Y(w z@hR;$F+X6zJFuVgNV?^gtIgrO6;cX#Cz+*e^o)pT)5Qs`l+nkMhQ(bF-kHSo;yem& zI<5Au97_YQ4$oFQ2&-lKahpZhyWg$5AB)Xg-)fJM;;J|Ft73o0n7xzcLKx=EK|~er z!F`>Z5^gOq>E&`K*drmtLAKTiuR_v>_<+Nz5ID2lBL>+*+MI5=%@OOf-L!V@Fyjul zi_sRQunMLXrH{xdH5lhU=EVXUpM5U)vZtLyfgi-2R$(r8@WzEfDJG-w_)zVd~dn`$#FKlVP?cZ zku~|govxe;{k3gb)_@H{xLTvV)EATVuuMx`@*wB0+wDu}W@?jF!-cn8AoF_v`7xaD zfla(fwe&MJI$Uu4>BtBt5euMOD#Md-Cf)uAWOhXlTMcl|vn(cP9Jh@e%Zb;2p}mWw zWti|xB{g9Fxw}E`4`5;H;Oc60%0;5>vJ1{Mojd~%O{fWgf`Auq0k2QY3t1b`)>OaP zs|7g8Ud8JLJwUn-M}r6>)>>MN?!VR=}Dx>-(AV{Q%|r#ZNGN7+f5TXnKyFUHx)ay zis{vuv!H5CA2<4<)No=`^@DKH?{aWpOrW`rpERDBI6g%085v|3KHO$t)M?n3sHw;O z9Qdu(Kx?bk#_DWVxOC0@2axhPionW8*dtk6bIgc>@1)6#PWH&>c)l2{!D-O_t~@to-AzHW=P8)XYWR#W*-C11%wR7#&Z0vOAhP}UY}mYiGhd*j|O9->AV zi>)pOR&6UEHlJbByL~~Tjm@fq`nSnsEs&9~4LnjT7D7krsVMKZEg~6sEDx!r(%ngP zHHRr8xp0%(iE?}R1hCMzZhj=}_S43dAUN`{eH^Ni=7>(aMEP=&Bc^{4&FF-hhHHR_ zPGmtV+`_Mb*?Sr~e%^0;RbG*GZ^=lC_U$Ka2{yOd5FXUYu|e;qx(o`8$;EH$va)A=UH0y^s*%RZ z?}%U~(Rm}>rIR*-Ycf-?60Yu^m6;u zQHui1tZqnxDWuqVEOxSHE1!UrKaY8wiMq47yuHmVndaG&g&QAU)@<=a6*CI+P4O5P zk;M03lhHAMXfCwhrh8X<7b{O6sw2PUOGJ3I1erU0ML;LwjZNC#_UWr}xnV1CZ9@v& zNTANr&6GG^bc0?aQXiY69xf8eaYfmPY1{J8#2A@4?#UZp>VuX=~?8(n2xFT|3h zDzEj){R3fg7@h4~9e~e3Yo&f0cnFP{BO-qX>-$w^ zt93frZcZn~njn^jJf5+B%!C-@*fIV(Lqp#MPpxe1lf_!;J;&Z>?1J0;z(aVd{fiy@454F*W*XYV&J-Slz|?ZT=M0rxga5A>oWpVTC*Kp@a*24(piank@|(*& zMg+h2vHH{=;X7xBm&jK8fO|?xTLqfo-l`Q?zFE7>H|_QKdrVzvSywdM80%?W?V+vf_x8)ntsm|i z+h8B=T;|tr1E1b(&*(LtT`#QmTzMWQc|RxZ9Ufd?U;Vm%@Yj6vH3a(QM3~!E+c5|F zVt&K0Fg+$vX{4BDm1sK^YO_WxBDiWvZ?=c|emwJl(tNLBEPM)5oOThpG>Fp-rXE8* z=nVFHP49#OSf9R!;1MAhk@d7ddoErn;>K_7vM*~A@^boz6-CK>l}K9Kszv&yYhW5; z;HdHi*yMGy5@%I-D#=u8JHtnWj4e)p(U|gC3>(lc(3IQQ+FopYM00Y}yQn?AD7#h! z>Sr4*Kr+jvOfGxZAiwK;W>3bqnXBjTZMS9bN=SwQ%^pIO38lgK1K{mn%m(j51B03m zkr5J5*t(Wx{H;;hAXEMXv#sl$ud_@WS=8R0!hUTgW49X9^0{3nMK_n)X=Q0~)* zGXlC%f9m5bU@KN=OWKu8j8zM0SrJH&Y^*c1$#lSscBiu6ZtDD|(?$)nU;B2ckbN`S zc;Y>b^8Ni~C80aP_3vFJNj4#9x0%sk-%3ZI58jn0PSKL*%1QPl>#2!-vZ~lpdVt$GJ-NI*+Ah+m(xj1~Xy1Lc?vRwO)BjMCagvtDzE^Ar50C(4Gc+CFDqjxS|U-M45Z=B zQA-eKwLd2KgZMmz!z5_Zv~%mzj;f?6wz~k9ZG_6g`$bL`;So6d?Mnl-Ji^0aaB^k9 z0LEE;t~a0PMq@h(_&E6qC;@)U$fn@xdV4+6mtpfn=D?5_rrt)V+l!JVc^Nc(<=P#cG1qWzV`0>Sn1_O zdL8z|ch}8h7Y$58b0naI8AZGmj@RAh{S=F(N~)Oz-}4j7M-NW0YmtA;ZA#D$WdZ$d zR5QL7(JSKD1llN-t2>&JLYRMx3gZo4H@_^apXO|(Uo}O-L=U4p#0cgXK%h>Li@sin zy1H-jexho}O_x>u5ND47P_*FZTp9=*+X!zOz(<>QP#IlH?QY*W=Y*4Po?ef=ST&=}|Mh1N(`#w>|aG%Lyj7SLW;!~18q~m@gjdNTz zjjwJEtk^kR6X1^Hqy)OVnB63t`qN`7F3_#@n8o8ec1ziG=r=j<_YGFw_dmLP={;6S7Uf^mprCzbq+v|^=VMr|k z+LiC-pkT!$xn|8${V$EV9Hti*15{c=_@;>;b>AwHwKcP3|IBy=Bx3Ycec8D)%Ls$)W(0mkz^J>YnRv=+K3OXin9GeF zAx?r;_Bnzzj|2j2;6#~YP(4|JknEj4KsKw5<&gNABSS>4ct}EOiFc)2y{C zeB@WtnxGzU?^>6*S%Wb<3R{`h-hgLlF!g7LidolAg+DbVu+>b90cSp17NFh0r~ZRA=0H#6j?lq}6xLfvI!e*n@5}ut_P=ov2B;0iM%KguLZm=Nxg82+m4HDA96t9^53W*Gm4 z-@(^udBHa#Jo*W&^%rf7WY~KfNu>3_VYy#N9x_u-!TroGm$OK=f^OPs@;;#^y%&w}&mF0q|2LC6A7HH|D z&q`n(^;8z`o+Y!on59o_sJ1e$he><#l}ETADQEu!ALHJ^oRFg?3rRDarSo*E__6GC zDco({b7{VOIt5iI4W!>j|D*-f%Fj*%w)0TspKr}^Vdn|}Mk zR&Fe(ug#z~j2qDgg$8`TjgtGoLc`tQ4!em$qCv&)D;j=!gFoi)QN$6#QNCmvquR<^ zq8t}K0V8Etvcw#I+;D8>+7Oilx-50IYYYLqGl*ek2A@fdloz_bv~1mkLHqE0XsE?) z({#{rbfuZ|KM}`ZWb^6Oif<)tj0^fTP20MIjobD(Hs;EeEk)_|Y}Mi}l}pLZU3F4^ zpw8yophb*xTUhsyA1;47<0KO&^pn7zE>PB0zQI9l>u~XR?0+?Pda%;%o%C*bUZ{=U zy-5x|)oBIEzWn{-dRo3mb{c72ETeCjk`f71hY_l#SR$2rHltUgNk&hsE^lY;^kAhe zd*TNg@SttDqeOyRYXm7r=)0ERlQX<&ANxR37%+H)$+o8V?N|?2GNs3L*syrHrw}WAub~3eAgaJK+@J|{Mrc^)WQT#j) z5WFpuXObG-XEDOQfB;;);XXA~Ywmp928SdRKe`mr7}`<1V{enPUDD)IT4yf3gvOK0 z62H%X0G~hKN8h44Dx~LOD)r7d^V!qWWhx4aGV^r5>o?8 z@bUI0G{U%d(PG=gt~1z)%Ey_P*z-uQ2=RI%v9pDTNXPRUN&#(JH+do{Z1Q5;9H!-% zIvm~~ZXyOAKX|9^(0=#b&j|rz(w!lzb9UO;rIZrbp&U^1u40bhq8(FdJ#qlngqt?( z^XBMOX*MCL%jvo)KHSG^&ra)eflb{KW=XqU53PqY;0}|K=iuD^a!5O%+K-2{z_B^SBw3JBK%^^)uf@l)#{BLB6Dr8&j`mO+Nphh3iWT< z>B`ZBJ_|F-(p^$iaJS``%AerTcazLV2~peq*3#Lgvm4e7c2Tro#0V5--cxW`l6u<# z{dDmaoMyUD3kch3QN0dypkfj4)NaYQKFhJ7SGBT^^TKL3!p_5s-8R0uJ~f zSY$4`pK%WAu4~A+Y`g2KUKy;^*n7SiWwp8S_kcVsT$?nQ++VlVgjBLBlAh4_8By@( zQ!NP#4>AQ{Blu4C_kP*@$g|(Cy|yHoo5c3$GF=c3JSTdV2E7%&s0K~(1br0ZJ+SK^ z1g$Dr4nkz|l&U;4>J4WG>^7S1B(%V%)scR{>sIJvyE37KyT$=)v?+ZD z3k6g7g2*ZJY|kr96B=jO31p7ecvRG!)V%!hbY?Eo@YnMb4A%A3bnGJf`&|9BPcsJ&z=9R|E~vsujdv-p0$!C0{tyE&i=c4+BE!2!MJw?PZf<(%zcmn`V)}DXj%AI zAYq~)ws2z`R{^%W=dX;7A)GqD>yO03uijNcPu4zqSBgKFbA3rrZ5}HhUG$d__1$`p zf4cbdiYA3RqKp8+#b0Q{XL!NEFah85h-}(YKM`P`DRg<_xiL?-|5;Q@eQ)A?a_g23 zBQv5^;IH?DuMYp(S_+<-S{=CUYWxE@g}kV}{B(c+W}U4e3wAJadu}olT)+t`aG9Br zlA%N}v~_>HN2MCX#MxGOv;XYnE}^zK&N0Zt>kt_C8ZS}qTOPXQfOCF--eC5QRZ5Ox zDdJ!lhy*iLlAcdG%gT>(l8pN&$|KxB6)VJV`Tcfo7M7^|m;cqynFq7kZ*knNs@9fL zON*jZt4a~nnxeHYrG(fTTWqDTE!MX7rIwdyd1+}%y)P*dsS=7dLa2&Ltf69QYTreL zo0&Uvd*}Xh@67$@{&DA-dFGipGru`==KP-D_c`Z$o+G1+Xh(IjIwvMhh2jmv%n}j zpEl436N7`p!zy)&s3Dj~z2+vSSPR`j+U5+UJ_Cz|=J3Uwbn+eT?j4&h0NOX4mFtXd z4A$&A6o&J7cJ9~QdhFn3II6^6V0QK9C%l&#&!7d{{qXGU)q}d7dl4}uH3>Re_)#tR zCv3q3V0dXda!xNH>m5|3;;LYm;RkCYmAQjLpE|X&T4(OFJU?{sZb82EaGje^B!<3& zdldS-O)|yKId{s9i%veB+n^2CCr;06GU*oas8$lDo{91@(DTG8o%jmk9-4{%l9$K_ zJ4>XbbZK9-r9xONJjAB8_2V_%Gf?Jr3+dG>J-QHD-w9dP-;L(t*Bsay2kcdR1Ejdb z1ulGbb3HAri}1WZ@+=U?`PY^DJ4BpOvR;oo^4nx9KBhL7ml~w2wfh8Rs@HaY_H9JN z*z0*dp+YTz*HtC)xKkQJf(bHWQ~0-DJTC89?-OB>3$Tn=0?q*Sg=P{4-H5R`X88tV zo{T!wVlAW@izM#!L`eT(Q2KL1r4Bwu`%GT*7z)9LE)prVY^Txh!`b0OWIt8O z7;dRn{$l(L%VgtXeG%&&TuDKuF(9Lz*JLe+AbdGU;!+u%t64uxArlqtI6EYn)X$cC z8)by#n`n|@>3{QQ6T5=YLmMZU*?7@St7SbKnG~C#B;moy0KFWsmSvm1i|G=H880{8 zv+U18L}U|zdR2}&m7;#~N2)xb5*C5w#Y^PF*wEph+e^d9it1|6!BXx&_G&p6#=K(b zJ2Wz~!j%m@g~+Q`y1~z^A7G4#)3WrzE+SL6f22yr{$W)xHfq~vE&r5X#<^*AZD0cy zYams4xfrY%zL6xfXxpIlK>S?xqvkZgfqdjyt^kX?!{8`Bt;Bhb-tnTbZhW+VwI$el z= zG8yWDV4@*Nx2Rw;c9B^FLk=HO$*s&S02<%Jz-yCI^UXs9bLkf2xTN=I{G_NtQ3CIt z*P42YW|Y~Vz^h~yZe`%0R){C3VD>G7&qn@OQ=MJtWC-|%{G0~mE018I-M$F1$Eo&4 zigMPz;M*Itaj6`?HAwLQV~oH&Bh2A#jPxpmA^s<(N}vf0Nl z_{0jvq&2NEUPwmWVl}h*5zK8_)_YlHRvj)$nUS~4ZnomLIpN-t>fWo7^E7$EP%rIj zB2ZH!$Kp{lbr~Smqv%1a9PRa|N|*3c3HyalH@k}IQ(>i9NnpQB33NU~;(>&>uoEtNWaNt%3?b8Q8v`;FV|YioXX zGJe%~yv{~toc1OhsHPe%ubtq6E1LUBYIQcjM}l;?{CHj z`%Dh>7}cCVLzY&Q_IED4w<+fSz$n){JG{B)?$ILnTDVQzW?I%;LVD-=pqNJFi;8hi zpA3Zd`nQJZ=NpzaZ6`Gf7Q7i&LM~ogO$|DH@2{8$0g7u>EJQT>!WHaLd0Q3$&T3>1 zG6A#1XdMGdFv_FH8Ix^oZ7YeWk-(^6(%v@Zi0S>!NDOGY6}pW9fe^^uFCvtgcWt5g zfM(H96CR|Cpb4W;NL7R`ET?F^=3N;qycJX-t)F8EF}Z#MWnrhLVV|dL4&K!)lAzvm zssw^|S4Uoq@LPLuspYfnr;K%eqR!%#)IYAv^jf=RZa|vGwep72yL;?yWa%oMF)9n4 zFOfEC*|rA4t-9~>@|&}kqocUp(;xa4eMtJ2e2#E_LIPB`Lat-PK;YFQ6zl<0Y#}-j zswqe)sNVg`;(U2z2OZmpUSl8=DrkXh%x{<|X{!F*3(z9D|aam z1Q7R;GiekjXUJOBWgqlKKu2(6iQ-;1ClM7oD5VH-CS#85un zuj_TUYp6r%Zn#Az_qBdHuKns_zwdW%Vp)s~zg3vx250wfv8jV#WXh>grSsS6tX00k zFHN;N(bm-5bAoy(1K9@z3_P-0)PL?3mKzwSSDleRTfYwCN1bL)m~(| zi*S(OHFj*>Zufr5rwo^8i>BG;t&H#biEkX4lr4T1l`yNT3laoyXd8>`m^6~l`(^_~ z6fi)UQwMa*0c@&VZUv{MR4LrT;8S0{zSv2m5y6NxLVx?1vKep7{#>)96JgHxp4fHOQc^6kQ{i2_@2nKqAuIcOi!1!U{nAF6BA33gX zHGlj&*y^9s;a>o)%a$;p_UPUItAgQa*(_^S-JGab8a@&Nf+7sXL+vl$&7X4g!u6(} zoz6m(ZbNd`+P@3_=>P?j$yJbJmST*~@0>9Ul)hE>@R_sl)VTD*{bd0Dc3Lu0k0aT{ zYdbvQyQ%8a6ISDM1yuHKbw}Nc?2p;KJ2!woQ2~6O{=yPxfRyBxo!)_g34`i>YXY-j z<`f7tCOUsKeRZlpMZ=3{bLm>dHE`7WoTZfEovQTOOP6w8@*Auky@GPxF5(X^vP=`k zDCAd&_mA?GK6hOyN)9k|R^s-ye9|1wmyd@e0a@w~zs)<+@H0kp0)cPKv=^cX1A5*2 z-ry-xvU#PfZWo^fC;%Q8v&TI-uaDSEc7wOuiw_Jdn1m zMB3o}^m2Xs^CR}>!os0(nliUibuo{b%;MvMC|*~(kWc&ui(uP;5=zRf%!LX~{)v=~ zrc9DVN41S}uYoSU@QnXjX(Myz#Y`un45)qOHlR0qE`z6n(gN~p9 zii#Gsq~@DyJ>VyU=N<-jOZWtZk(qJwfx3=Tp)t;b>vPVlV8*KI{tBxqK3%|@Z{I?S3*C?~hvcnf) z=BpX=r>c*^u=Nhs1txy8G%e}tQ7c1 zHlxS5x_U~t>~E(lnWF#z literal 0 HcmV?d00001 diff --git a/source/images/components/apple_tv/scan_start.jpg b/source/images/components/apple_tv/scan_start.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b40fbf2265be2eb03b7729a9ce3f6fae6f15aff GIT binary patch literal 21455 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 literal 0 HcmV?d00001 From 6680c0df2fd48c0a65ba816ed51357da370894a3 Mon Sep 17 00:00:00 2001 From: Justin Dray Date: Wed, 19 Jul 2017 18:55:51 +1000 Subject: [PATCH 10/50] Add documentation on using credstash as a secret store (#2988) --- source/_docs/configuration/secrets.markdown | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/source/_docs/configuration/secrets.markdown b/source/_docs/configuration/secrets.markdown index 14170759340..36705981102 100644 --- a/source/_docs/configuration/secrets.markdown +++ b/source/_docs/configuration/secrets.markdown @@ -89,3 +89,26 @@ Please enter password for encrypted keyring:

If you are using the Python Keyring, [autostarting](/getting-started/autostart/) of Home Assistant will no longer work.

+ +### {% linkable_title Storing passwords in a keyring managed by your OS %} + +Using [Credstash](https://github.com/fugue/credstash) is an alternative way to `secrets.yaml`. They can be managed from the command line via the credstash script. + +Before using credstash, you need to set up AWS credentials either via the `aws` command line tool, or using environment variables as explained in the [AWS CLI docs](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html) as well as creating a KMS key named 'credstash' as explained in the [credstash readme](https://github.com/fugue/credstash#setting-up-kms). After that is complete, you can use the provided script to add secrets to your Home Assistant secret store in credstash + +```bash +$ hass --script credstash --help +``` + +To store a password in credstash, replace your password or API key with `!secret` and an identifier in `configuration.yaml` file. + +```yaml +http: + api_password: !secret http_password +``` + +Create an entry in your credstash store. + +```bash +$ hass --script credstash set http_password +``` From 6bbdf5cd422968d6e08b9c9db0051c5bc7adafd5 Mon Sep 17 00:00:00 2001 From: Kevin Fronczak Date: Wed, 19 Jul 2017 04:56:48 -0400 Subject: [PATCH 11/50] Google Wifi documentation (#2984) * Google Wifi documentation * Update sensor.google_wifi.markdown --- .../_components/sensor.google_wifi.markdown | 40 ++++++++++++++++++ .../images/supported_brands/google_wifi.png | Bin 0 -> 19087 bytes 2 files changed, 40 insertions(+) create mode 100644 source/_components/sensor.google_wifi.markdown create mode 100644 source/images/supported_brands/google_wifi.png diff --git a/source/_components/sensor.google_wifi.markdown b/source/_components/sensor.google_wifi.markdown new file mode 100644 index 00000000000..ad628259793 --- /dev/null +++ b/source/_components/sensor.google_wifi.markdown @@ -0,0 +1,40 @@ +--- +layout: page +title: "Google Wifi" +description: "Instructions how to integrate Google Wifi/OnHub routers into Home Assistant." +date: 2017-07-15 21:22 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: System Monitor +logo: google_wifi.png +ha_iot_class: "Local Polling" +ha_release: "0.50" +--- + + +The `google_wifi` sensor platform is displaying the exposed status of a [Google Wifi](https://madeby.google.com/wifi/) (or OnHub) router. + +The sensor is able to report network status, up-time, current IP address, and firmware versions. + +To enable this sensor, add the following lines to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: google_wifi +``` + +Configuration variables: + +- **host** (*Optional*): The address to retreive status from the router. Defaults to `testwifi.here` (other options include `onhub.here` and your router's IP such as `192.168.86.1`). +- **name** (*Optional*): Name to give the Google Wifi sensor. Defaults to `google_wifi`. +- **monitored_conditions** (*Optional*): Defines the data to monitor as sensors. Defaults to all of the listed options below. + - **current_version**: Current firmware version of the router. + - **new_version**: Latest availiable firmware version. If router is up-to-date, this value defaults to `Latest`. + - **uptime**: Days since router has been turned on. + - **last_restart**: Date of last restart. Format is `YYYY-MM-DD HH:mm:SS`. + - **local_ip**: Local public IP address. + - **status**: Reports whether the router is or is not connected to the internet. + diff --git a/source/images/supported_brands/google_wifi.png b/source/images/supported_brands/google_wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6448516688a4edc81c2982d72f1123fd440ef2 GIT binary patch literal 19087 zcmc#*V{;~L)4pQcwvCN#+cr10oosA#V_b2vvCWNb+uq>G{o(x$?^I1q)l|*&iJtD` zXiTJ%f+PYgE-U~5K#-OaQvm=#=>I#RA;0f<`Ng??U%*{Nq}8Cm4_|1rUjP6xKw3;# z%`@jB*CRtsd}(;Q{r9|?bDYW2-?|!YVGuA0q254PYz@smbxjC(TZQv83lB{X%`xfT zn83i%Lh>Q{B%JUu{#=L3%Io+%VeIhC?p&Wz|G#WVMfxq%nO8pBH9T%-=)}m-;GjW5 z|4)|$HK|epWHTiE-h7LEALCF2f#78Sp%i!5vlB{NARfKQ25rSjMS>7#;27q`w zQ1Yq4BqT^`N9mVX@vnmrGtPw%MB>iW!nf-5Rtn+nvGN({!>tE7x{}OF>{r4Jo(*jHwz2 zM4tvE@S_$CKmtxo?!AxF@YTZ&LJz97Q^&O*DwK@f&q{@o+*_$G$3Q&qOqoa&#b7Q9 zBEE`QX79V(P)X$HI(^jCof#ZM0$!DRwS72AS^ViV(-4ht$H17~`Ubz&2@DSaSr{kmd^8TQiX)u; z5|(-x@^%Uq1CRz4e0oTOCXx#!oqweYq2nYK22;cS0t%_9OC_lVa0f|qowdTi8tj+O zArb&<7R5< zL?aR+sfyIQy=aBy=Wem^1)0 zb{T%*E~<=<9N8;NFI&2zTsGsk&Uf^$lA??I{q!`|1U;<_x^JAdblUl=f5>8MZzOXQ zznln!EPjyMR4S*?@-KP~xF)QOxgf=soZIc$_aU zFjOq126#t)n+-tJBentb8bKbrj+l z)VR4^g?(P6)X&bsu5P>W6mH$0Jk(OiBwE%7w>V5+j4`&;sRj8EmJaFG(!WkHgHfXD z`cPO3kx=?}%RCT@)#`p4B+&MOs_>25oIbvB%+6{Oro4le6C!1ZDNV)d^w&AL`CR52 z^0S`*<;X!N|JFG4`#Yc})$-m032`ozwTfm2rMOrbv^BbL>{pHo@(5L8brI0wd-1n% z(12jZ@c+PG8{pgOpk+QDl-;iMaKehTJx_xRZFDA_v{o_5K(3u-fFhFNk3{FcT_pZu4wM+Z zM1PQ>*~BJK@;X8qMpgOTCNO8m5&Iel78UI~!v8!*RwbUa7bw_YFjkUz3q{aWDPfdpgq~+QBMX@RA+wO8oX}to-;1 zr|)dxe*Q#|b`^1(LhEAC8f@<_O9YxJdrOg&ryjo}LBabmeMzEz^*w9K){Dc6(`A>2 zRUp$7ix;Lc_StM8K^5~ME$pF|LqI@F!y9BWyp{VMJgb&Y>Z5i1{u71_r1Ug?Iu}K7 zKL`=_pX4r8ySRa3cp*h^4-1(?QOTr4R{Z+j=gLU+x}Oi5O7zU`4O(@$kCHiv>5H9s;(jeOkQ(6t&cy&;MlRM}ef(r>$Yq_rt-yd;+pI~6v{3~}1 zQ|pxlzBckgr{`My4w#)xL8L~S0ZP2>VFJi?Svx#VX6cZOz_W9adXy@*2FW;oy=WYL_%LK71 zjYePMpz}uBe<{5myr$H2dbmI!(Td#Z!}Bq-CRtNbGh~#a=2S1{q^|w z-zncEh3o1t4k|6CN&l-jVmyIWSNM}tq^$Bg-5Cadr5M_E8->GSBL;5RtSqu%j7zRp zyX42CtG|cN1FQ9H3;m#KLSIgH!Y7IA`5A(L<5Km?rl6NxT)sHyt#Uu%Q{%Z=imS>I zGoa7kXWEY*i}jis$cISWg5B8Jn{DTEM_Y|bewveoha()?^LaVCU%;Qa{}x%&4A|!& zBzS(vNqxefkk{!l`tY(>-o|}li& zjDbtL{3Gpv&EP>MtrWH1H`~om${Km$p2-IJSe_XiNu)NkrF=zVz80i*H?qpKp)#~o z%b9XNydchZRzv%}nV5!imhiB!J^On@Z%>dV;9sV}Y&F4)goC zX}nT?-%IsOcc#>)am9co`iIrH#m0fSMulex99qBOPd(a>gEMNnWVUp*xVk`kY;$w( z>CF`ZQ(^_G9Q}4-8tPsS?uLU4tTO!#-25wzXDWU+%hLf8_k|D2Qw=q3%YLE?BIU&% zLd6ElKjdad<4uk|M%?WswOz?*<$?sWUsRCd}#uDlkzBhKy+pr@Q@%Az0WpTAhkJ-u?epIEVTKE8?{{($)_* zR8I|5@tCn(UE3-mS|H%mWj;S#Y;oeme?L zxN$wO?tXv*$>1wp?jI%+_ajUf``2Wn?@@pu+W}cz#a(7O%$%sHI*o$psB7nsyra`N zQv!AhxkND18$zG5f7?}WD`{)>Y&itH1vy%VF@nGC7qD77yB6ajGRZB6DHNymSSpq> z9+eY_oF=cn)lC?dCT(tzA>qeZ9{1y7BI$)(tnRMWDCX_^M<^f(ys;g1ce7(=sCR6> zheo^O;`7`=u{)%KgbMsTa+PQbNw%zekFDeQvStpMO&jZqNED;r#_{y%kqm%xI82+`m zQx=`D!SOZDO7RP%nIJvpC^M&VB-Jeoi;#m+JqVPt`$hI`C+2g68LW|-Z7owKmUPQL zjn{ttRE`2-8((Vu+CvD6&1Uz1nBiZ1s542mX&^-)k+p{x#tWBXwzVxtzY@pFh2M7E zUWs)|<(3A)!2;G=6qvRD*^K}woT}=WN;EEIds*2D{uKcjlk1tjyKw3^Kp=PT>ynWo%byay>Lcf9rM*xd2q<8Tmom4yuSX8iX)# z6UdqMBOJ~#A7JW=x;s67PW2FWJPpRQr_c;Abw0M-S52|dbxJrWTDu(-koqtrG86&z zbl%4)40S13dMdP^V&$QGgL-RnPn0a1cpIm0Pn$;UxhTlGNkoGmCu0N=p7F>8%Gugm zpBJ+Le_uw(tsZ~z(%a)E$vs~Q*E8wez}0r1#nKe9s-QDp20uRJa8f~)oF6SpthG(p z#D0M7(91NA^HuM}lZ6HXBHo*5SqVgC%Rb&hm`Hux$+q!E1=p`X9s35B<)!k$l;>!* z{!Zq-ItS|C%DJ@)RhF~O;nmuds1~MNeevEv0l1(n>EA?Yu$z17(I$Vsu=K{9D26(V zVT*>cSjC8%;`8h?b4LtuQy&|>aGQ|r0*qz*OWlQ|63DI0eSR-3aVu1)e${*4WkAhY z3)npmMZ0_nEKbx0RQ6ws>Cf<7q>DyHZLitm+s@0C?X6gQ|Eh(8Rvw7XadDIoW`N64 zcErS}I5{`#VIh=XiR{++@@YbdP;}otbPF+}CO8)__iq~FCjV^Y`u+L!yE|46+6$pNX#6so&>C4>2>Li;OnQ|P@|yv`uw z@fqrD^vB=ye{ef+1O`A{DP^y?-x8df>zhT8D&!ioTM@okQg0;4I4CA@D(cb3#DP#K&0@2L!IZ_-N{8zu z|8s5pX7s`BPM7Fk8>~9WW;k7{6mabh(AdLF+S6&Fb{{VEbO`2Q5;RaKkQ~$?P*8Ew z1f-MWnP+im4d7Wmi6K&>y&m?Pnsu#r@U$st8d1V}~ zdX`VB0VCS1j2GAv^^-;Q%us*`v7IyuYN*cNQ{BxXbr+lm_|u5F1#UJ(+J+{2z90K+ zf{~j>7sUrpe(p~%7QAq>)7}i%4mZp_KS^~l&o7;<;%Ix?G}S`S@|U`(swzoA!IX3xC7lKKO> z2rr5{#waLAcpAtjy=g*S@05BeP+BQqZ2T^4zbwhX>6QqQJ`7{N;R#*;WmLZ{PeUUm zACI34uxm&}1>(G`?W7^->&4Wo)xkJ*`)9*_Onig0L|q{ZjfHkWJK@LjuRv1N-KYSV z!=t%6%RVZ+($CZEm1?*eU&k95O^3)FDl})~?rElR&WsT54UxJm zW^m2)n(`|xEvLJZ#3E+1Jf!Rx2t_iQ zUPu?$YkUPoqBVsh=AZAsqFLbYIzHiGfNonmm5AQwZSqvg?eD))K4$|P?L?wg|D+p` z!u7*dX)4qlvKM((lH%*9?AqgW7FCU*ajm5=tLNMBJ=7y&hUVev1#Y}}JEjw;hhL{G zW$YE)e=@+82^^o!!tQ)ux68U7Ec$(r&@h49fBpU`_pn~vR{w*?wzwa9#+4ef%u%gC zcqF4`!-r&(W47qsQ_ps-Fj>o@V)7XZ*A|ZQvcB*_^LYVg^Wt)?T7wW~76`@FFgpuD zYfMOxaO;nrZzG-GJ!~7?UQBL}tof*tlYf(_ybrS#uhjv;)Ug>;bh?5|SWFV|g$5&W zcBO&9p-!Gu-|L@@+{Xsje&41chj^3E$3NdXKf8x%fd!a5rf)AT(v3fLZ&Lp>iwOY- z;0n2L4Z)wq!sCDQBg@ZyjL>3Wr?l^T``Fk~<2-AIfI7$UP9@-y32v=R#`@Mox&#kRItZ z)aQB+LrjKwn3{`ot>EW}UI96s>#gURb2bDVf)D^Zp*m;~>=2yD-Z{C9CLR&>?MZdT z9G_?cP6%!QlmU^`lkFwh!x|#x?Ey-#uXu1M23VJ5ImUZOy*?l!yi!Nl~oa1gv%|e=*u+Ke@%D@xs*Glpq`R>)P74opFNk z*fFG)UZ-le_BS9G19#2)KpdxyQ_^=QWw>iFMAxs61Ge)wzdG85bz9UiMMzm9@Q@0d zOMU4vDAh#4FUH@XWkkZ=j^hPe8FIhK|D1%a`c5`Cvi>m z%ZCLXNiCr!E7Mj@O)uh62t%t zZD#F5cQS{6DT_$)8Ohem;HQ>nJ(|^ky1i8=Fi9eHJHAa}%a2V=rNU9cGLa@Hu0X_Y zX1<%wPa(<0kn;akAMz4RTO6V4s;m{vqSP{mO_4fiyk1U_GYF zoqzvUzd4vH?B;O!zk4Y%ov`VZ|9$d^<|7lIi(+?^FHu=}1GU`NoqfU* z;xYUnk-ft+&pH{sys1-uQ*!03y3S)VAPtj1U3*g3)cZ-G%jQg+scarX*#36TP~Z)u zcc(``;E8|Jc4Z(S&UAUESp%Ez6X)o})SmY@_-;M@eqa2D%e;(*%0r?sxhPb=v- z`s0P*O^D%`k(!@#O&zRiZ5%tQEt{XWrXoP_TNd}LGR>b%i4L{5QtGtwif5u6CB!HI z9_aE=b@$q42CZSjFA>g7I9>;rO4`^`G{oLZ6~~`nq?d7M*U~l^;==3uORH#~Z8y_w zRhqe*FoSyudlSgx($Iljv~`P30?j_vc71Q_%E>L+yWPDgP`HLOub>}o-5BKb?=8)u-8_3)a$du7c?vAN$Ado3c|iX zg}8JtXlk;i9^>JNZ}SBJ8XySme>W-^=kGH$TW|Qz=2S-QN~0CPhLnc0z#Jf8o>8U< zRFQ5>H9_Wg^VCd*5S+&SJjj9QkxkYO#y>7KSCv$nCS2cV;*|mdg!Tfnoq$)T{R?!w zyXyw_t?ZCV3`pX^$N*fZCy>MjR8)^c<+ejg`THKEH2V(E!P!^0psQoYRWOmgB>{jn zauqo)F?d0YC>usAK^LR}$JxSl+TVPtGaVSjiPm^R?%V<24tl*^Xgu8FfnwHjd}to% zEnZfnCZS;%UiQ(QS=#2^u6l3#PQM`rEx^qx6cIh1=c(5R zSR&(>q#6b}!7KTr*;^4QI5PucGViWCdR(W!*_6*U<4Yy|fIUn@0u-j8A+mG0V8xux z`s+il@lYiQXzy4M6EAOlR~ek7S~fMJ3Uf!;aRUIf7gR}_{DM*0;A1gn5s7Nf&}4uV zQ2XhA5bO1F%EpHN^_ttp-p+$80x%pEF)yZCogmVBNMGe*{gDRVCg+wHpd1L3xB&ik#z)|do0vk)zWsb)ksm_3*H2R-2lo( z8L?Kk9}LT*m$!#L^k=ar21_JTI(R`E>V=z>VZ4{+Wr5jaCbJo|qulW-C&tY+sJE0T zumrzB9=In?DrD^jE^OP26aRPP-M;h##SCgcUH(-z^t8xhF-=5)c$m(mU}ewq5lh_j zumKUem4ccbFF!P&1aOAk$A~n}`RKBl0{m?(!U6=-zMT%&7p>*HUl%IB(V;yQRYB~L zXQ_5@%ZhPA40R)}Ef`2lkL7CHyn}ENl#4eP=3uoSJIJP=v3!E0Gh(6J{e%WULHW~a z-1<3S#Z@pX;ny{=)`$Z_x$9&}d>yFV4i*Ax^pb(y$&^}vx~BmTe|*nZYm$KSb)~{q zp##w#b=28-HCsi}2nBW^ez+@)*DJqb&rdbw(+01J9;wQZ;GCT!_4piOr|vp-ts0xs z4`ykXa{O}V2`z!%5VT5o*9sQl)C&{_&|ZKNVlaXJg6{RV5q=%J5UdD>0N@Gey!XJ> za+wS1*Ud*Joe7)_$aH9xcrD058>t{pIrr^y+20%%#c6f?{OsVJKMx~L-gvrA{@`BJ zyogpye`!{VrVG9$b_pB@zb4F#M?_^dYC&X7jKNBv0#FC?6R#{vzYf$|0R0(PIg(HZ zY$ms_x^BY}<6;lL4F0bcz(MebD2Sucm!gjJZut4poFO^r%K&BNfOsB&fY0NxXLdI4 zJ6JPpwhLjvHZz3xbd5#Fn~G{;N5|4T!2RiOgHnoQ1I3I;GhobsSP(3`qDkEoFfqCK zT+%Ng0}coHv;X53jk1J#Mb|M99YKmxu;x&>bh2sO=5qPPdKpj5A7jX2ZjfR9 zrHN9mFg9Arf*P-YQbu4H7yxgLq$+~@OhWjk=FKgfne6K_AFLQrGHx^e{c4MRw<~2t zKc8OcbCz0s4oU*mJ~bES>TX8+R#%ZhQytBUn>jSg_3`mviW z6fe)cafNTq8;#XKw!0*Y0fPyQN4Zc|;y&8^K~=n_F-|NRSk%tYId6Q$JoPIv4Zm8= z)C1`>ZyZ|WW$3UcyZ$qt#ziJUd6+5tPB%Fl$*y)Swcdwgd+((t1P#e>5ob|+oTM<7 zmK@*@d7&)5(?P~BEo;byFOAgBY4O-m)x#680znTvH0(X(L#E+KcIw&GW^K0#bRss9 zxoN#u=()%;w3)z~lwU)wCBBa_Kf;toK&o>9^Tg+>Y~VU-`I%V@CzCoKkE+gPpP5O^87z zE>=x>g+)%8_PJ_?;9{B=fJuTPJLp-=Y9TI&K*g*wOJQ+mj`Q<^Ej8GJ(e2>bWmdUY zVh2JmA>*iv-;uRU8RVvgXwAL3G4Hm$%F;eGM)1JGWy4!jJS>&|)-ob3$>WBSxg$6+ zP%_xu@>^Yf*6;F)mcI|CH|=kz*w(;l9?^ib$wp`xp%we1fu?I^gCbe*ri)%B_uDa0x_2I{X+-m5Lps(P1)xs6qDmd$ zb>I0AiIHH@N7@2Lt5ID70&T z)~+H%&tlRs7n52qY;}zaOS5meZc`b+zw-d5yfU0*;66|RBnox%5<7o(bK@(!{fxa` zxDvwE`%AUjtsI6hmR%7SAm0ooe?cXomf>krYcQZN)We6mMe!+aqcOD~^=Dz+Z|kM= z!3C?a_@5roVHbUE9d1))F2vO9$sHvk6KsCfrsH*yqIc0EtY??P1VTf(qun?_w%YqX z&msvZMm91ep!9(Te)-j%-3MXi&ocpAz65Jpg)bO;O6y@o8%V(Gs0(yq`4FFHCM0uT zFB@L(yA``Bgd1AjR>{g(`YqI~euR;b<*=D70)!vB|23uKNiJueXqXPu>mX3XJ~>BKq}ASU#!0J;-}w^{QhY`RG7Wr(R|Gq<>?ca zN5uhkgg;{^L1aPmaOOZdcz6-B?}PxJIDON6*4J(hc3t#c1|0Ik-}JPdAndF=cdKpC z`r@E;Y49ohfswRy6A`SgOhr_T=PrrLk|8&dJ|8^td&3tZs4ZJAAJT$v-%bjF+XRPKDd`XbX-7@uZ@G19iDFgV+_{ULxvLq7C z!L~!42+4~4u%elviB4%SgE<;nFCM!x&S|2dv78R4DWrECCB(z zJshH{eWeM|O1q0nMMUeTymuv19#Uxg=?a->#=~tT-G1Ep-9~tz2d_8+3~A}xO^%Pf zavd&Q4Nt1v^_-m}uK8~9*>;iSDkj{Ra|CAbFrXLrxX?4EivF%grC%0nxl7Xw6GZ;~ zf!sC@1$^^0UDeuH13U@p*T8iSXV+Pz?op>A_$z^nyaCsE z;9dhx1i^4%0%8if2mk3D3f2AL{V}j%JGy{km?4udN%ozo7hTJ*8)5!~Oq|M;!cCoXmyI11H~gJyz3g+Lea3B7ac zisw2uT0};~q(v`7PnDRR&c_U%#O|V4w~=`vs@RzKCLf%(%qsNihUb63v?kZFfU3>( z%?O6(+VXSxf8L<FrweaYa-8ujTMI}{4OOe4JN~7{H!^_R=r1ySKe`O~UNNoFHEa#j&#t}k`dmJ| zo&_+J8}Nt=YsQ{bW>k<)5;TKqQRUGbW;QU!CKc z6J_+!&VDb94%R-i6dS<(z&*|4Gd zw2OkRGHNgg15y?xb`Hx3Z%=@WCPl6}-+<&00?hTr{(38Bsaa-mp?=jLrk4z#-sm&I z)&%09z)0T*<>}$P)hr5_nw4fTm{*hvHs7mtc~QZET&K`|P_J#9CtD#}od7dI*uA;8 z)YaiF7c6H%GFR-7<80N(c%A=^Drsv-AFITu2vmib~hPe!;y!kHP3s zRuy5m|LHvT{@={mVm?kjyIED!Qf+^P`7>mwp2E2!EZ%wa;W#?q0 z5{{m$hHq=qf85k#z?18f&(Ubyu8@L5hccu<@fIa1yiCY8O61^6a@qyoznVsoa$CGw z6(lR(ufzHM37^FP9JTbyKh?@V(|_ug`bmf8VA2CJ-0yc#DCSy9beJ1@@DYyNSP){C zH3qgNpp{PNcU!!l%Xj~N(8blPflK2T?(u)U2Ury30Q8hmUc%y=k&>dVZb- zu-6#YSJluTM&w!O_wsuu5L@+b)LHNGVp*=`nkC$SbD1KE-<<)=URbn=DmK=)4k-#J z?y~bIXO15!8aOwJssXQqz!n2Vl@{*53=^dr5-=TJwYB&;RQ_j9l)rpRg#a}!83K)^ zfyPoQx#Ps#c&-kUXCBMfc+QLU64gEDM&*Q34PAl^n&alKbh_Lmv+d#rq5 z<;?l_w|cI%7{{(P&KAY}8CIVDY&r%m;o`?^H=gEsG*%8e6*jdi-hD&vo_euYi{Ch~ z!^QAz%nhI>*|<{RH(?BFp;78RUei8bnej!c*V<1c+&R(ba)uFWb%JF>v^A&1P#N*T zDtCLO(hgrgP8G~EHa^(1cc&tl@bdopzx6|hW!t60)XSKuGh>p2E`ZCaopurEHcvU! zekZxP0>$IXVHXKe%@h}1XAmn8C-0HLqGwuqa+*&1QgFwSt5xa%J4`(S z&vU-r6y*_Fi2ar({8YId&t7gXuaRJB;T%1Q5{)?K?{hQ(tQh{<6--^~qK(FG322C7 zT)=|Y$5J0m!%XV{74a$zphB*azg}63#F4HpJX_&)yd{OR)R2F}Pg+lNr6X zaou~jIOi@Ljocc;4Eb-x5Z=#EXPfffc?d;SDZ+pnCoKV&4jEX+sV3fvVs(g3yvDn( z=Jn}rPbqEci}s`n2x1k~2X5K2;8+p>c6^$adt0)DKQ*_VB#eX9$!Zu|} z3!}r>55(xx8(wn9A2(ji0EtY<=8(&I7C-C!PH6wuDO#chkGLE zp{n?iLA6pu%Me=$Hm3p*z@vYKp3w?xBYjgMG z%LKX3!ZhlY-`<|D8C@&F4AnBX{MGwJLoN_jFr(;4d!kP7j{%Q5MwC7_^Mm5?gBxCm z^EUrs-ea(3!xe*1f3#*FF59?h3}k(7AVOC8EDy#a4qBRM6)&EC)*DCze!lUY1-@f(;0sq_S8z0kwoz2qlx(WBoFC+(t&H1ZWH(S zgv+k{&kQg1*7K+mWtgKs-$hDkQ%YCz`Y>`-UtlC$yAg6adNV*?Jbp*m2y`Fp_i>gk zjFCIqBYOwz1sOBHOyJcZ@6uc@B1iv znWI~(+xK?Ki-TUJrT`&dQ_!dr_0Ky#NDhFA5eRRiR+yo|tLTm!&|86ox%y1}Q7-mb zw*24`qk$lQH%hzS91Gx+>Z8f~c1pK`te4+@>C?(Q3g`La{qK0wy@ChE(a@%3`w*>0 zHfFjqaAD{5Q?sbig@BsLY6Eooy}MkbELZ=p_9~}<;@m*>1kq>V(p|pVQ8fQ(9zu!P z#UH_qk6ti%jnVh>Qt9aH2J_C;Sqn)mgm<62QMNVdZM97Id4jVsje3(u@kGKCH>P%W z8Vx{!5Ym+d)#|q8MCEQj3Foj32}Jx4WeiW^?Z2t)2$ zF$|A|qQ17qs*X6%M96*|7UT@` zecE9Z(S1jK>pDx*d0sFK72XSIE2a;rtNodbfk3~2MUV9OD}>sfFJj8JEQb1=O_Rex z3W^Cw+xXoAKBRhi7noiIWL)8q_dSy1IKrFN80+++b3vs^2SM!*@ss>5 zwF>ybMOa(ZX{ef7wbaTN(nTOk`#Wnf)|0 zI22E@T(uzyt${Y#{qKDu`e17NJP2AyYAG5c1U%E~MYPAss`e+yVc0Dmxq?+t{)~PN zo>IHF>Y65^gFc5_36|0S^_F~ z{N;OXHtb7_G1*Ut!#b70xZa7l;kj&6ss zhAOop__VFTya8;fW-Sn*gf>UJvah{P_rFaU-N+q3KpoN20`T5it6AtY4PHER2u3Db zU zI=aUW9x%%HLO=1Rvk>c}n4!Ya147q*44}sEe?qS67WyB~Ko=ENoow_iBT)O@PZ7}2 z^zhmbr9?xM&C7&fMA@HK7^2ASo{Vz{mN8i=jVTa~1|1THs zAQ8)@7_X(RC*dK9L;2W_aQ2BXMbjXKuI0^rXQlp$^Lpgtgv&z@dC=l#QCGyd_jg>x zmj*)=bCYb8`?Kjc2BCKr?02dAXh11Ek(N}zhD8{ee7;LYsSOf5D)y|CVXgGZ)%!cM z4|wu-WX?=$SO28qg~z|g#%L}Ho9a6p7DS0Nq7Gj5tO%wm&^}(M21#g9Cvr3%i-x5j zlPFt__+6Wg&HJzcr?<4^CvjsmE0eC}gbZF0JmRw*Uv!5#AQ%1Z>_{#?2qoJ^%IyA` z?R0V>TwC@x(A4S-;&wNdJ^<>+8C5viNda(9NAk!Uf)0c0e3j_MhZllzF9pkLpMK?8El}X70UJl;V_bzSw zN01abGQ8HW+8c&7E?!fji>ls46)Uzk#>`kr+z6W$25EoGFZsXRYGN6<>$r_xa7>a; zU3340;r*+a(Z*c-LKbuF)D_Dg9H~>?v)4N*VIfq=1A8a?9rjsBTtAjy|4hy89`<+K z=1wTKKKxB9&Gxu(totJYfi7e=O0d8ngiWF5)nu=*d5m+e9VHk8>O8%>V>jowC2~OP zypXihnt<}!RZ#&8l)v^3&egdK3^{cLLIY=a;Vp8K)DAoR5bMmQs_SYX%7>tj^zCcNoQtO_H8(Wa;>sfBh?&MR2pC=~fx!2ZV)$ogCsT zxW?~|KM4CgrGm6BCBv`Q!>?p^UYIoV0#;b5(b5#X^r@B#y1Ju88&-5bPND#Olg1E} zv3OSod>eV3!NcDpMh4xf6t>LYpYb?dGDftFm1GT;8_M1MjA@klgv}l5kYpAx$=^c- z;I})_DLhzV`L;RFkkCc6Fy?y;CbRgrw7|ndU89e-ajB7+pjJUcRkKZSY&E`Mo!(Zu zeV0kW#1Mp5`|&b-?|I`xiY=mmGAo!VG zZaHYczq<|4eW&QUwoD!>Hn$qyP)8!=AsX#m7wHl3vivLv)X|k`DW#k0jYMqPK3+2e z80M$jlRJ0=rBw8g0*CRrmhOM#;W@(g>RTJ2#9Z?Pf^7uvox%64O}ueY>+=n_`#yVW zZdzh^%kw&{Kt)Q$*8Gx`Q`N27%u{4&Ito-b4+QhD@3fuWzVsopf=ygX5aVFfz4<&9 zh4g^4AyA}1Ty&31>{EYm`3fERX9!t#043Q8A-GRKL#`wlEhbCvgRXtH>ulJjdB(9( z^{;(7yz3OJimQ&O!{$@`%F>9^&uV`&+E99wrBC=5iUut9{ek4UZS~i`up;886|_Ut zJ9DDED^9|$&1*~R1b$2(cm+i!V6*pb-&!0oal|0OT#`#_pAqk~YKAb6?YC{HX*>=q zpb&$ngV^x8o!OYaP6uTURDxsBw1hCKtyv4cf$D~DBFg6Mc5WU`e?Cp+3Gxw!= zdE1{o9qv~#`-g_DT;C6ZBV*U)NM@~0AMp8HLgZ+EP@z7Wal)Ub`gO@Z1x>-1obuia zb);IhFJ{Ax+5yWQymJ>C*}~8ou-f1Bm_f8gfU$>T=KLoquW)h5_7$|t&PH%^YxA+& zBP+(=D5G~IH{T*U-eqK|9WH&EkunV=&)=m_;j;DJKWGZTcQjn%iOZb_-h42t<*Kpl z@JO_1EC!OE(-HCA-*7;xCs4%PuHvmT^@Ke}2>Ir|@LLa%x%iwO^6cxQ1`x?TrLd`J z1n4<^gd*@&@kt3vOp{oH_W}1hfnjBw8~17DxLGEHw8mN3_bUx02Ka(n4AkJ}sC>=@ z1_I8^Jlx%pjW$-4gS4M0nNiRjv!5?+2kDN5uRGQpHLx6B2q0PnVHhli+w8ZOx<5Ur z>tdnX%OdHf@q9%Ew(mkP7kIlR>6wyo$NY)}n!YC!1Npy>eU|4>-4?s(D5YC_~G>SULhj zqZpO&9b@}0SMW771yf=GJK`DJ)6a~ilfnZpN-G!^3OP2Su8`klkO$BAaC{Aifd~vz z7sAs`T0fBa2W1CT6G>ir&tiNn@=(Dx^Zf+J4)OO%SYn)?NLE`_~@w*4-`%Q#I<@uA-tbOR) zoc0<)p3KQ7V8!aOjU!ee-aK*vkauJ-kqxFSQGz-t0AZR|`HPHVW2=|%-w zzY%w;fNV$YgwM`t+pI4hxergqy2&5`Xe#M?}UtT%yA&dxJJcQ6D7&80FI5 zip&M#{kh@eV(pA@?CD+n=BzfcIi zbMj@{|E#k&WQ7V8sy9N?>el5w^$A?rco(_yNNR!yju|gyEu<9Rb13@$TYup}B}ZeS zm_)51YIGZBoVZ0rsvwSt?jwSn_6jyhJyO<2>t>ZwD%eq8_I@BW&WJ72wnnY`SXS!2 z%ZgFuc&+Ndv~T!cgKu1AjxwUx^86`tmUA9O&B7Ex&ZuThnEGR%DJ)o^7(Y4JFoeK) zSmBJ@k#_VQeSPULo31=)(1yDJKVczp)aMb6p^}$H$;}(WNeCF)E3cHq1yK zj{XGiu{ck5jp%ViTrge|)inB@D}TE}KiM?JOp_E!QDoQZ9=nvvNsp zMRSW>H;IzV5{WJ@A>@7ur^zjs6phr}CXRcG(D417zv27-`E_}}Uq8GakJsz{d_Mca z*!~ezNpz$fLeN<2l!(m}l6Jc?%j^(-(Jcu}FbJNltSSkOR0W}oOGPw@{;ozoL+e{D zhoAEU&I9f8H}Q4v0|$b=uaf_nLjn6({N&r+HhUCG9f6;56O^8(0N_W3dXEisY;IeF z&-7c_AbrefN#uN<%F^SZAJqf?yTSctehYRhHvBo&b4Y!T4zXQjCunW*gS-y*A0!;# zZXEaPjfkYQo9BeHNt3ur8NA@nMy6MWCElnB`5>hto17z{xTl|D5R^3Ii=XE~v{UN% zI?zr+L8Jq|wb0V9Ko=h{t|b25@&d=*ED66hH_%}heolJn%ZUbl=VJMw(kA&Bf~c1o z{DUs0?MM2{;u$}ha<`1fnTJ%&*{$wFL#u__PRVG133g!UpXYk zsxN~QbGFxV*X9$y%Y8!PjQn;hq@#V<<_}eDL=9^usZS@By?wbm}f~%`EGGmgcJw!DC}hX^cap&6LuUkOeCE8MC5!;ov?>g-AvsY8}p z`w=|jctO=^$XTs{;_+bd#xIqE-3U>=*$qdt9{$DE@Wpi96yeuG2vT``xD`L*{H?Y- z(tcKJkk4rTQ~xkb!+w18m19y&%4hMdI;jKI}wr zh-E4c@3i}qbF$;*lw7@qCOUMfP~M-n;}DcwkL}2)tTkb1+b-xn$Cf!69D+cGpC>)A z_Am$0u?6ZR(kYug&jx7eXFBlYZWcSLdQO0yHYafFW!l-KS-2$H{D_c1ZfAdL>s%)J z-bIM6a`(A-_u6xYa*dmG+v`8Lj0wn5#i3r!st1RRh4p_VIN)Y?H7`Xzxy>JovACP< zs&~nDb@Pk;z#15B7XXV7NF+<3LGeK-igcaa3j1Dj!Fm=L4!x`ghX1kZ{Xlpk8w;uL=yqgyyv%m4GGXB&Q zZ*Yf03Mp)O>}mv*R9$)ATHvC+;!Spmi=5@fXktS1y<2Zm{cb#gw zFmkD25*IyMqEs`dA^q-7ASyB5c=Sbp`ZkloYk3KN4CM*|X`xI`<*j}@lw9c_$79*u zwpDz}+2E!Llj!LL9k+1SiZ(&%3VGKoMRzUJ zf%i3=`n%8e1H>d1p}yyr5l}?C6#o3Z5vl%S`HAX~na32tsA1tOg=n+w`>MLgZcQK_ zWwUR-p(zI)NmTvLx}b$}nhdmrWh8v_4NomUbp(v#i1XxduvUn9fp#nfU*Ol&s@VSwh+deF<8nSxulZGU z=)-DG0^|N9^!wArO5;)cf(6@a8HSi1akL{7Dx`NzYK_QL|6Gu-jkF-es&BhnwB7Q85X*cnIZ; z1(Sg_{aBuw>HIHgyx@)b+4=>k(_j;U3y3qvvmPNHE>|}X8V&@X?RCH5Otb#d`edeE zi>D+LHHc?vsO+&vr_Vdm3d4wZ?!LU>k){b<+qQfd|-H;)+ys{nHT0^w&5yHUSxy#Et z^zl+2YmBsI9pUqBFS50lHcQptEUu!}Wg?PB)~p$P7@x0Wv}-s?rR2ip*$C11FsH23 zC!Sr#$t(GmtxPJKzzFUIm1b-yY=o;zA+MXvQORO^n3Ec1T|IfDU-Rp0%~Lrfly!Nr zH(2V<^-|y9ovPuQqVsO^u#hG*MfBU=o-fmX{B<$4%j{;0qW3PCV^T2*Pan_ADn-4z z`X?@fN{-g6xdXvcqn4^AtUEURAgzs_goPc0h)()`;8?LTM$Wx|Lx!PR3nqoLq*zQQ(=vzSIMtDYIAGv#+hw|+xOsF*bAou&-}wwqu?&jH;F- z`gPI>1W%h2@cNfVwI`L@kbEz`NN_+KC^b0XoDseA1I E0CvVB+yDRo literal 0 HcmV?d00001 From 17834a76966332e5d61c316aee06f0f7e54f38e4 Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Wed, 19 Jul 2017 19:33:43 +0200 Subject: [PATCH 12/50] add new script syntax for turn_on/off_action in media player Kodi (#2951) * add new options to turn_on/off Kodi: script and wake_on_lan * f**k copy/paste * leave only turn_on_action and turn_off_action and append WOL example and migration docs * add more examples of turn_on/off actions and service calls --- source/_components/media_player.kodi.markdown | 167 +++++++++++++++++- 1 file changed, 158 insertions(+), 9 deletions(-) diff --git a/source/_components/media_player.kodi.markdown b/source/_components/media_player.kodi.markdown index 9087ca2a758..463d6a88433 100644 --- a/source/_components/media_player.kodi.markdown +++ b/source/_components/media_player.kodi.markdown @@ -35,7 +35,8 @@ Configuration variables: - **proxy_ssl** (*Optional*): Connect to kodi with HTTPS and WSS. Defaults to `false`. Useful if Kodi is behind an SSL proxy. - **username** (*Optional*): The XBMC/Kodi HTTP username. - **password** (*Optional*): The XBMC/Kodi HTTP password. -- **turn_off_action** (*Optional*): The desired turn off action. Options are `none`, `quit`, `hibernate`, `suspend`, `reboot`, or `shutdown`. Default `none`. +- **turn_on_action** (*Optional*): Home Assistant script sequence to call when turning on. +- **turn_off_action** (*Optional*): Home Assistant script sequence to call when turning off. - **enable_websocket** (*Optional*): Enable websocket connections to Kodi via the TCP port. Defaults to `true`. The websocket connection allows Kodi to push updates to Home Assistant and removes the need for Home Assistant to poll. If websockets don't work on your installation this can be set to `false`. - **timeout** (*Optional*): Set timeout for connections to Kodi. Defaults to 5 seconds. @@ -75,23 +76,171 @@ input: result: ``` +### {% linkable_title Kodi turn on/off samples %} + +With the `turn_on_action` and `turn_off_action` parameters you can run any combination of Home Assistant actions to turn on/off your Kodi instance. Here are a few examples of this usage, including the **migration instructions for the old `turn_off_action` list of options**. + +#### Turn on Kodi with Wake on LAN + +With this configuration, when calling `media_player/turn_on` on the Kodi device, a _magic packet_ will be sent to the specified MAC address. To use this service, first you need to config the [`wake_on_lan`](/components/wake_on_lan) component in Home Assistant, which is achieved simply by adding `wake_on_lan:` to your `configuration.yaml`. + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_on_action: + - service: wake_on_lan.send_magic_packet + data: + mac: aa:bb:cc:dd:ee:ff + broadcast_address: 192.168.255.255 +``` + +#### Turn off Kodi with API calls + +Here are the equivalent ways to configure each of the old options to turn off Kodi (`quit`, `hibernate`, `suspend`, `reboot`, or `shutdown`): + +- **Quit** method (before was `turn_off_action: quit`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Application.Quit +``` + +- **Hibernate** method (before was `turn_off_action: hibernate`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Hibernate +``` + +- **Suspend** method (before was `turn_off_action: suspend`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Suspend +``` + +- **Reboot** method (before was `turn_off_action: reboot`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Reboot +``` + +- **Shutdown** method (before was `turn_off_action: shutdown`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Shutdown +``` + +#### Turn on and off the TV with the Kodi JSON-CEC Addon + +For Kodi devices running 24/7 attached to a CEC capable TV (OSMC / OpenElec and systems alike running in Rasperry Pi's, for example), this configuration enables the optimal way to turn on/off the attached TV from Home Assistant while Kodi is always active and ready: + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_on_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Addons.ExecuteAddon + addonid: script.json-cec + params: + command: activate + turn_off_action: + - service: media_player.media_stop + data: + entity_id: media_player.kodi + - service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Addons.ExecuteAddon + addonid: script.json-cec + params: + command: standby +``` + + ### {% linkable_title Kodi services samples %} -#### Simple script to turn on the TV with the Kodi JSON-CEC Addon +#### Simple script to turn on the PVR in some channel as a time function ```yaml script: - activate_tv: - alias: Turn on TV + play_kodi_pvr: + alias: Turn on the silly box sequence: - alias: TV on + service: media_player.turn_on + data: + entity_id: media_player.kodi + + - alias: Play TV channel + service: media_player.play_media + data_template: + entity_id: media_player.kodi + media_content_type: "CHANNEL" + media_content_id: > + {% if (now().hour < 14) or ((now().hour == 14) and (now().minute < 50)) %} + 10 + {% elif (now().hour < 16) %} + 15 + {% elif (now().hour < 20) %} + 2 + {% elif (now().hour == 20) and (now().minute < 50) %} + 10 + {% elif (now().hour == 20) or ((now().hour == 21) and (now().minute < 15)) %} + 15 + {% else %} + 10 + {% endif %} +``` + +#### Trigger a Kodi video library update + +```yaml +script: + update_library: + alias: Update Kodi Library + sequence: + - alias: Call Kodi update service: media_player.kodi_call_method data: - entity_id: media_player.kodi - method: Addons.ExecuteAddon - addonid: script.json-cec - params: - command: activate + entity_id: media_player.kodi + method: VideoLibrary.Scan ``` For a more complex usage of the `kodi_call_method` service, with event triggering of Kodi API results, you can have a look at this [example](/cookbook/kodi_dynamic_input_select/) From be100c5b9adbfba85e3fb01a724a90db88e94deb Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Wed, 19 Jul 2017 13:47:10 -0400 Subject: [PATCH 13/50] Extends Pi-hole sensor to support the new monitored conditions (#3011) * Extends Pi-hole sensor to support the new sensors: - domains_being_blocked - queries_cached - queries_forwarded - unique_clients - unique_domains * Add periods --- source/_components/sensor.pi_hole.markdown | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/source/_components/sensor.pi_hole.markdown b/source/_components/sensor.pi_hole.markdown index 870403c3b98..809cee76ca1 100644 --- a/source/_components/sensor.pi_hole.markdown +++ b/source/_components/sensor.pi_hole.markdown @@ -31,7 +31,11 @@ Configuration variables: - **ssl** (*Optional*): If `true`, use SSL/TLS to connect to the Pi-Hole system. Defaults to `False`. - **verify_ssl** (*Optional*): Verify the certification of the system. Default to `True`. - **monitored_conditions** (*Optional*): Defines the stats to monitor as sensors. - - **dns_queries_today**: Total number of DNS queries handled by Pi-Hole today - - **ads_blocked_today**: Total number of blocked ads today - - **ads_percentage_today**: Percentage of blocked ads - + - **ads_blocked_today**: Total number of blocked ads today. + - **ads_percentage_today**: Percentage of blocked ads. + - **dns_queries_today**: Total number of DNS queries handled by Pi-Hole today. + - **domains_being_blocked**: Total number of domains blocked by Pi-Hole. + - **queries_cached**: Total number of cache queries on the last 24 hours. + - **queries_forwarded**: Total number of forwarded queries on the last 24 hours. + - **unique_clients**: Total number of unique clients on the last 24 hours. + - **unique_domains**: Total number of unique domains on the last 24 hours. From b171efee8b34b4f8c139eb1146e650d63c7db6ca Mon Sep 17 00:00:00 2001 From: Aliaksandr Date: Wed, 19 Jul 2017 20:51:28 +0300 Subject: [PATCH 14/50] Update media_extractor documentation to match latest PR #8538 (#3012) --- source/_components/media_extractor.markdown | 33 +++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/source/_components/media_extractor.markdown b/source/_components/media_extractor.markdown index 812a00f2e17..82e4b9c1206 100644 --- a/source/_components/media_extractor.markdown +++ b/source/_components/media_extractor.markdown @@ -13,7 +13,10 @@ ha_release: 0.49 --- -The `media_extractor` component gets an stream URL and send it to a media player entity. +The `media_extractor` component gets an stream URL and send it to a media player entity. This component can extract entity specific streams if configured accordingly. +

+Media extractor doesn't transcode streams, it just tries to find stream that match requested query. +

To use the media extrator service in your installation, add the following to your `configuration.yaml` file: @@ -22,9 +25,35 @@ To use the media extrator service in your installation, add the following to you media_extractor: ``` +Configuration variables: + +- **default_query** (*Optional*): Set default stream query for all devices ('best' by default). +- **customize** (*Optional*): Set entity specific values. For example: + +```yaml +# Example configuration.yaml entry +media_extractor: + default_query: worst + customize: + media_player.my_sonos: + video: bestvideo + music: bestaudio[ext=mp3] +``` + +This configuration sets query for all service calls like: ```{"entity_id": "media_player.my_sonos", "media_content_id": "https://soundcloud.com/bruttoband/brutto-11", "media_content_type": "music"}``` to 'bestaudio' with mp3 extention. + +Query examples with explanations: + * **bestvideo** - best video only stream + * **best** - best video + audio stream + * **bestaudio[ext=m4a]** - best audio stream with m4a extension + * **worst** - worst video + audio stream + * **bestaudio[ext=m4a]/bestaudio[ext=ogg]/bestaudio** - best m4a audio, otherwise best ogg audio and only then any best audio + +More info about queries [here](https://github.com/rg3/youtube-dl#format-selection) + ### {% linkable_title Use the service %} -Go the the "Developer Tools", then to "Call Service", and choose `media_extractor/play_media` from the list of available services. Fill the "Service Data" field as shown in the example below and hit "CALL SERVICE". +Go to the "Developer Tools", then to "Call Service", and choose `media_extractor/play_media` from the list of available services. Fill the "Service Data" field as shown in the example below and hit "CALL SERVICE". This will download the file from the given URL. From aaafc0009a17823ddab6fe25dc54e86e07692ef9 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Wed, 19 Jul 2017 13:51:49 -0400 Subject: [PATCH 15/50] Revert #2951 kodi turn on (#3016) Revert "add new script syntax for turn_on/off_action in media player Kodi" --- source/_components/media_player.kodi.markdown | 167 +----------------- 1 file changed, 9 insertions(+), 158 deletions(-) diff --git a/source/_components/media_player.kodi.markdown b/source/_components/media_player.kodi.markdown index 463d6a88433..9087ca2a758 100644 --- a/source/_components/media_player.kodi.markdown +++ b/source/_components/media_player.kodi.markdown @@ -35,8 +35,7 @@ Configuration variables: - **proxy_ssl** (*Optional*): Connect to kodi with HTTPS and WSS. Defaults to `false`. Useful if Kodi is behind an SSL proxy. - **username** (*Optional*): The XBMC/Kodi HTTP username. - **password** (*Optional*): The XBMC/Kodi HTTP password. -- **turn_on_action** (*Optional*): Home Assistant script sequence to call when turning on. -- **turn_off_action** (*Optional*): Home Assistant script sequence to call when turning off. +- **turn_off_action** (*Optional*): The desired turn off action. Options are `none`, `quit`, `hibernate`, `suspend`, `reboot`, or `shutdown`. Default `none`. - **enable_websocket** (*Optional*): Enable websocket connections to Kodi via the TCP port. Defaults to `true`. The websocket connection allows Kodi to push updates to Home Assistant and removes the need for Home Assistant to poll. If websockets don't work on your installation this can be set to `false`. - **timeout** (*Optional*): Set timeout for connections to Kodi. Defaults to 5 seconds. @@ -76,171 +75,23 @@ input: result: ``` -### {% linkable_title Kodi turn on/off samples %} - -With the `turn_on_action` and `turn_off_action` parameters you can run any combination of Home Assistant actions to turn on/off your Kodi instance. Here are a few examples of this usage, including the **migration instructions for the old `turn_off_action` list of options**. - -#### Turn on Kodi with Wake on LAN - -With this configuration, when calling `media_player/turn_on` on the Kodi device, a _magic packet_ will be sent to the specified MAC address. To use this service, first you need to config the [`wake_on_lan`](/components/wake_on_lan) component in Home Assistant, which is achieved simply by adding `wake_on_lan:` to your `configuration.yaml`. - -```yaml -media_player: - - platform: kodi - host: 192.168.0.123 - turn_on_action: - - service: wake_on_lan.send_magic_packet - data: - mac: aa:bb:cc:dd:ee:ff - broadcast_address: 192.168.255.255 -``` - -#### Turn off Kodi with API calls - -Here are the equivalent ways to configure each of the old options to turn off Kodi (`quit`, `hibernate`, `suspend`, `reboot`, or `shutdown`): - -- **Quit** method (before was `turn_off_action: quit`) - -```yaml -media_player: - - platform: kodi - host: 192.168.0.123 - turn_off_action: - service: media_player.kodi_call_method - data: - entity_id: media_player.kodi - method: Application.Quit -``` - -- **Hibernate** method (before was `turn_off_action: hibernate`) - -```yaml -media_player: - - platform: kodi - host: 192.168.0.123 - turn_off_action: - service: media_player.kodi_call_method - data: - entity_id: media_player.kodi - method: System.Hibernate -``` - -- **Suspend** method (before was `turn_off_action: suspend`) - -```yaml -media_player: - - platform: kodi - host: 192.168.0.123 - turn_off_action: - service: media_player.kodi_call_method - data: - entity_id: media_player.kodi - method: System.Suspend -``` - -- **Reboot** method (before was `turn_off_action: reboot`) - -```yaml -media_player: - - platform: kodi - host: 192.168.0.123 - turn_off_action: - service: media_player.kodi_call_method - data: - entity_id: media_player.kodi - method: System.Reboot -``` - -- **Shutdown** method (before was `turn_off_action: shutdown`) - -```yaml -media_player: - - platform: kodi - host: 192.168.0.123 - turn_off_action: - service: media_player.kodi_call_method - data: - entity_id: media_player.kodi - method: System.Shutdown -``` - -#### Turn on and off the TV with the Kodi JSON-CEC Addon - -For Kodi devices running 24/7 attached to a CEC capable TV (OSMC / OpenElec and systems alike running in Rasperry Pi's, for example), this configuration enables the optimal way to turn on/off the attached TV from Home Assistant while Kodi is always active and ready: - -```yaml -media_player: - - platform: kodi - host: 192.168.0.123 - turn_on_action: - service: media_player.kodi_call_method - data: - entity_id: media_player.kodi - method: Addons.ExecuteAddon - addonid: script.json-cec - params: - command: activate - turn_off_action: - - service: media_player.media_stop - data: - entity_id: media_player.kodi - - service: media_player.kodi_call_method - data: - entity_id: media_player.kodi - method: Addons.ExecuteAddon - addonid: script.json-cec - params: - command: standby -``` - - ### {% linkable_title Kodi services samples %} -#### Simple script to turn on the PVR in some channel as a time function +#### Simple script to turn on the TV with the Kodi JSON-CEC Addon ```yaml script: - play_kodi_pvr: - alias: Turn on the silly box + activate_tv: + alias: Turn on TV sequence: - alias: TV on - service: media_player.turn_on - data: - entity_id: media_player.kodi - - - alias: Play TV channel - service: media_player.play_media - data_template: - entity_id: media_player.kodi - media_content_type: "CHANNEL" - media_content_id: > - {% if (now().hour < 14) or ((now().hour == 14) and (now().minute < 50)) %} - 10 - {% elif (now().hour < 16) %} - 15 - {% elif (now().hour < 20) %} - 2 - {% elif (now().hour == 20) and (now().minute < 50) %} - 10 - {% elif (now().hour == 20) or ((now().hour == 21) and (now().minute < 15)) %} - 15 - {% else %} - 10 - {% endif %} -``` - -#### Trigger a Kodi video library update - -```yaml -script: - update_library: - alias: Update Kodi Library - sequence: - - alias: Call Kodi update service: media_player.kodi_call_method data: - entity_id: media_player.kodi - method: VideoLibrary.Scan + entity_id: media_player.kodi + method: Addons.ExecuteAddon + addonid: script.json-cec + params: + command: activate ``` For a more complex usage of the `kodi_call_method` service, with event triggering of Kodi API results, you can have a look at this [example](/cookbook/kodi_dynamic_input_select/) From 79935072e967251c6c109e934f44ec32780dea70 Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Wed, 19 Jul 2017 20:47:14 +0200 Subject: [PATCH 16/50] Doc update for Kodi turn_on_action and turn_off_action as scripts (#3018) --- source/_components/media_player.kodi.markdown | 167 +++++++++++++++++- 1 file changed, 158 insertions(+), 9 deletions(-) diff --git a/source/_components/media_player.kodi.markdown b/source/_components/media_player.kodi.markdown index 9087ca2a758..f5a5c25c9f1 100644 --- a/source/_components/media_player.kodi.markdown +++ b/source/_components/media_player.kodi.markdown @@ -35,7 +35,8 @@ Configuration variables: - **proxy_ssl** (*Optional*): Connect to kodi with HTTPS and WSS. Defaults to `false`. Useful if Kodi is behind an SSL proxy. - **username** (*Optional*): The XBMC/Kodi HTTP username. - **password** (*Optional*): The XBMC/Kodi HTTP password. -- **turn_off_action** (*Optional*): The desired turn off action. Options are `none`, `quit`, `hibernate`, `suspend`, `reboot`, or `shutdown`. Default `none`. +- **turn_on_action** (*Optional*): Home Assistant script sequence to call when turning on. +- **turn_off_action** (*Optional*): Home Assistant script sequence to call when turning off. - **enable_websocket** (*Optional*): Enable websocket connections to Kodi via the TCP port. Defaults to `true`. The websocket connection allows Kodi to push updates to Home Assistant and removes the need for Home Assistant to poll. If websockets don't work on your installation this can be set to `false`. - **timeout** (*Optional*): Set timeout for connections to Kodi. Defaults to 5 seconds. @@ -75,23 +76,171 @@ input: result: ``` +### {% linkable_title Kodi turn on/off samples %} + +With the `turn_on_action` and `turn_off_action` parameters you can run any combination of Home Assistant actions to turn on/off your Kodi instance. Here are a few examples of this usage, including the **migration instructions for the old `turn_off_action` list of options**. + +#### Turn on Kodi with Wake on LAN + +With this configuration, when calling `media_player/turn_on` on the Kodi device, a _magic packet_ will be sent to the specified MAC address. To use this service, first you need to config the [`wake_on_lan`](/components/wake_on_lan) component in Home Assistant, which is achieved simply by adding `wake_on_lan:` to your `configuration.yaml`. + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_on_action: + - service: wake_on_lan.send_magic_packet + data: + mac: aa:bb:cc:dd:ee:ff + broadcast_address: 192.168.255.255 +``` + +#### Turn off Kodi with API calls + +Here are the equivalent ways to configure each of the old options to turn off Kodi (`quit`, `hibernate`, `suspend`, `reboot`, or `shutdown`): + +- **Quit** method (before was `turn_off_action: quit`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Application.Quit +``` + +- **Hibernate** method (before was `turn_off_action: hibernate`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Hibernate +``` + +- **Suspend** method (before was `turn_off_action: suspend`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Suspend +``` + +- **Reboot** method (before was `turn_off_action: reboot`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Reboot +``` + +- **Shutdown** method (before was `turn_off_action: shutdown`) + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_off_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: System.Shutdown +``` + +#### Turn on and off the TV with the Kodi JSON-CEC Addon + +For Kodi devices running 24/7 attached to a CEC capable TV (OSMC / OpenElec and systems alike running in Rasperry Pi's, for example), this configuration enables the optimal way to turn on/off the attached TV from Home Assistant while Kodi is always active and ready: + +```yaml +media_player: + - platform: kodi + host: 192.168.0.123 + turn_on_action: + service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Addons.ExecuteAddon + addonid: script.json-cec + params: + command: activate + turn_off_action: + - service: media_player.media_stop + data: + entity_id: media_player.kodi + - service: media_player.kodi_call_method + data: + entity_id: media_player.kodi + method: Addons.ExecuteAddon + addonid: script.json-cec + params: + command: standby +``` + + ### {% linkable_title Kodi services samples %} -#### Simple script to turn on the TV with the Kodi JSON-CEC Addon +#### Simple script to turn on the PVR in some channel as a time function ```yaml script: - activate_tv: - alias: Turn on TV + play_kodi_pvr: + alias: Turn on the silly box sequence: - alias: TV on + service: media_player.turn_on + data: + entity_id: media_player.kodi + + - alias: Play TV channel + service: media_player.play_media + data_template: + entity_id: media_player.kodi + media_content_type: "CHANNEL" + media_content_id: > + {% raw %}{% if (now().hour < 14) or ((now().hour == 14) and (now().minute < 50)) %} + 10 + {% elif (now().hour < 16) %} + 15 + {% elif (now().hour < 20) %} + 2 + {% elif (now().hour == 20) and (now().minute < 50) %} + 10 + {% elif (now().hour == 20) or ((now().hour == 21) and (now().minute < 15)) %} + 15 + {% else %} + 10 + {% endif %}{% endraw %} +``` + +#### Trigger a Kodi video library update + +```yaml +script: + update_library: + alias: Update Kodi Library + sequence: + - alias: Call Kodi update service: media_player.kodi_call_method data: - entity_id: media_player.kodi - method: Addons.ExecuteAddon - addonid: script.json-cec - params: - command: activate + entity_id: media_player.kodi + method: VideoLibrary.Scan ``` For a more complex usage of the `kodi_call_method` service, with event triggering of Kodi API results, you can have a look at this [example](/cookbook/kodi_dynamic_input_select/) From 33937b07ce8081a5c43c1a20253ae3069084278f Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 20 Jul 2017 09:34:36 -0400 Subject: [PATCH 17/50] Fix typo s/dialy/daily/ --- source/_components/sensor.wunderground.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.wunderground.markdown b/source/_components/sensor.wunderground.markdown index 154bbf5b26f..935badd31e5 100644 --- a/source/_components/sensor.wunderground.markdown +++ b/source/_components/sensor.wunderground.markdown @@ -137,7 +137,7 @@ sensor: - weather_4n_metric group: - dialy_forecast: + daily_forecast: name: Daily Forecast entities: - sensor.pws_weather_1d_metric From 2590083e8fc7e0a7ab097d4a4c455d0af0fa304f Mon Sep 17 00:00:00 2001 From: jwillaz Date: Thu, 20 Jul 2017 11:59:00 -0700 Subject: [PATCH 18/50] Replace brand with updated Yeelight logo (#3023) --- source/images/supported_brands/yeelight.png | Bin 80267 -> 21696 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source/images/supported_brands/yeelight.png b/source/images/supported_brands/yeelight.png index 27c7c9a86a5673ddc3e1ac864d5dcaa62641b22d..9469552c65d0023a5d5458339204d8967ac9d1d3 100644 GIT binary patch literal 21696 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

uug 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 Date: Thu, 20 Jul 2017 20:59:37 +0200 Subject: [PATCH 19/50] Update configuration_yaml_by_ciquattrofpv.markdown (#3024) --- source/_cookbook/configuration_yaml_by_ciquattrofpv.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_cookbook/configuration_yaml_by_ciquattrofpv.markdown b/source/_cookbook/configuration_yaml_by_ciquattrofpv.markdown index 49a8018f6c8..247ddab1336 100644 --- a/source/_cookbook/configuration_yaml_by_ciquattrofpv.markdown +++ b/source/_cookbook/configuration_yaml_by_ciquattrofpv.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Configuration.yaml by Nicolo Steffe" +title: "Configuration.yaml by Ciquattro" description: "" date: 2017-06-13 12:00 sidebar: true From 5eb87cd0e97d0465d6d918c1d9eab1872f29d2ee Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Sat, 22 Jul 2017 01:46:25 -0400 Subject: [PATCH 20/50] Extends Fitbit sensors to track the device battery level (#3031) --- source/_components/sensor.fitbit.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.fitbit.markdown b/source/_components/sensor.fitbit.markdown index 1739c4fe3de..fc3e1a85758 100644 --- a/source/_components/sensor.fitbit.markdown +++ b/source/_components/sensor.fitbit.markdown @@ -63,6 +63,7 @@ activities/tracker/steps body/bmi body/fat body/weight +devices/battery sleep/awakeningsCount sleep/efficiency sleep/minutesAfterWakeup From e1037b7df8184dc26c0c7fb6a24bd504b74a2966 Mon Sep 17 00:00:00 2001 From: Charles Blonde Date: Sun, 23 Jul 2017 16:40:06 +0200 Subject: [PATCH 21/50] Fix wrong language code for GB (#3041) I made a mistake in the initial documentation: for UK users, the language code has to be `GB` and not `UK` https://community.home-assistant.io/t/dyson-component-not-working/21807 --- source/_components/dyson.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/dyson.markdown b/source/_components/dyson.markdown index ef77841c847..32562a5b7d8 100644 --- a/source/_components/dyson.markdown +++ b/source/_components/dyson.markdown @@ -36,7 +36,7 @@ Configuration variables: - **username** (*Required*): Dyson account username (email address) - **password** (*Required*): Dyson account password -- **language** (*Required*): Dyson account language country code. Known working codes: `FR`, `NL`, `UK`, `AU`. But others codes should work. +- **language** (*Required*): Dyson account language country code. Known working codes: `FR`, `NL`, `GB`, `AU`. But others codes should work. - **devices** (*Optional*): List of devices - **device_id** (*Required*): Device ID. Available in the mobiles applications (*Settings* page) - **device_ip** (*Required*): Device IP address From 0ed71cabab20162a51c46c65f347533e71de2573 Mon Sep 17 00:00:00 2001 From: Jonatan Castro Date: Sun, 23 Jul 2017 18:46:11 +0200 Subject: [PATCH 22/50] Create xiaomi_gw.markdown (#3028) * Create xiaomi_gw.markdown Initial commit for the new Xiaomi Gateway component * Update xiaomi_gw.markdown Updated sid to mac terminology Modified release version * Update xiaomi_gw.markdown * Update xiaomi_gw.markdown Tweaked configuration variables --- source/_components/xiaomi_gw.markdown | 77 +++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 source/_components/xiaomi_gw.markdown diff --git a/source/_components/xiaomi_gw.markdown b/source/_components/xiaomi_gw.markdown new file mode 100644 index 00000000000..9a20ca830d8 --- /dev/null +++ b/source/_components/xiaomi_gw.markdown @@ -0,0 +1,77 @@ +--- +layout: page +title: "Xiaomi Gateway” +description: "Instructions how to integrate your Xiaomi Gateway within Home Assistant." +date: 2017-07-21 16:34 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Hub +ha_release: 0.50 +--- + +The `xiaomi_gw` platform allows you to integrate the following devices into HA + +- Temperature and Humidity Sensor (old and new version) +- Motion Sensor (old and new version) +- Door and Window Sensor (old and new version) +- Button (old and new version) +- Plug aka Socket (ZigBee version, reports power consumed, power load, state and if device in use) +- Wall Plug (reports power consumed, power load and state) +- Aqara Wall Switch (Single) +- Aqara Wall Switch (Double) +- Aqara Wall Switch LN (Single) +- Aqara Wall Switch LN (Double) +- Aqara Wireless Switch (Single) +- Aqara Wireless Switch (Double) +- Cube +- Gas Leak Detector (reports alarm and density) +- Smoke Detector (reports alarm and density) +- Gateway (Light, Illumination Sensor, Ringtone play) +- Intelligent Curtain +- Battery + + +What's not available? + +- Gateway Radio +- Gateway Button +- Water Sensor +- Aqara Air Conditioning Companion +- Aqara Intelligent Air Conditioner Controller Hub +- Decoupled mode of the Aqara Wall Switches (Single & Double) +- Additional alarm events of the Gas and Smoke Detector: Analog alarm, battery fault alarm (smoke detector only), sensitivity fault alarm, I2C communication failure + +{% linkable_title Getting started %} + +Follow the setup process using your phone and Mi Home app. From here you will be able to retrieve the key from within the app following [this tutorial](https://community.home-assistant.io/t/beta-xiaomi-gateway-integration/8213/1832) + +{% linkable_title Configuration %} + +One Gateway + ```yaml + # You can leave mac empty if you only have one gateway + xiaomi: + gateways: + - mac: + key: xxxxxxxxxxxxxxxx + ``` + + Multiple Gateway + ```yaml + # 12 characters mac can be obtained from the gateway. + xiaomi: + gateways: + - mac: xxxxxxxxxxxx + key: xxxxxxxxxxxxxxxx + - mac: xxxxxxxxxxxx + key: xxxxxxxxxxxxxxxx + ``` + +Configuration variables: +- **mac** (*Optional*): The MAC of your gateway. Required if you have more than one. +- **key** (*Optional*): The key of your gateway. Required if you also want to control lights and switches; sensors and binary sensors will still work. +- **discovery_retry** (*Optional*): Amount of times Home Assitant should try to reconnect to the Xiaomi Gateway. Default is 3. +- **interface** (*Optional*): Which network interface to use. Default to any. From c753de1f4e8ee8cbd61502cde7f5e8103f4b1dd0 Mon Sep 17 00:00:00 2001 From: Jonatan Castro Date: Sun, 23 Jul 2017 19:28:14 +0200 Subject: [PATCH 23/50] Create binary_sensor.xiaomi_gw.markdown (#3029) * Create binary_sensor.xiaomi_gw.markdown Initial commit for binary_sensors sub-component of xiaomi_gw * Update binary_sensor.xiaomi_gw.markdown * Update binary_sensor.xiaomi_gw.markdown * Update binary_sensor.xiaomi_gw.markdown * Update binary_sensor.xiaomi_gw.markdown * Update binary_sensor.xiaomi_gw.markdown * Update binary_sensor.xiaomi_gw.markdown Updated automation examples Some other fixes * Update binary_sensor.xiaomi_gw.markdown * Update binary_sensor.xiaomi_gw.markdown * Update binary_sensor.xiaomi_gw.markdown * Minor changes --- .../_components/binary_sensor.xiaomi.markdown | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 source/_components/binary_sensor.xiaomi.markdown diff --git a/source/_components/binary_sensor.xiaomi.markdown b/source/_components/binary_sensor.xiaomi.markdown new file mode 100644 index 00000000000..04ea9895bdb --- /dev/null +++ b/source/_components/binary_sensor.xiaomi.markdown @@ -0,0 +1,235 @@ +--- +layout: page +title: "Xiaomi Binary sensors” +description: "Instructions how to integrate your Xiaomi Binary sensors within Home Assistant." +date: 2017-07-21 16:34 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Binary sensor +ha_release: "0.50" +--- + +To get your Xiaomi binary sensors working with Home Assistant, follow the instructions for the general [Xiaomi Gateway component](/components/xiaomi/) + +### Type of sensors supported: +- Motion +- Door / Window +- Smoke +- Gas +- Xiaomi Wireless Button +- Xiaomi Cube + +### Some automation examples to get you started: +- Motion +```yaml + # Trigger for motion sensor + + - alias: If there is motion and its dark turn on the gateway light + trigger: + platform: state + entity_id: binary_sensor.motion_sensor_158d000xxxxxc2 + from: 'off' + to: 'on' + condition: + condition: numeric_state + entity_id: sensor.illumination_34ce00xxxx11 + below: 300 + action: + service: light.turn_on + entity_id: light.gateway_light_34ce00xxxx11 + data: + brightness: 5 + + - alias: If there no motion for 5 minutes turn off the gateway light + trigger: + platform: state + entity_id: binary_sensor.motion_sensor_158d000xxxxxc2 + from: 'on' + to: 'off' + for: + minutes: 5 + action: + service: light.turn_off + entity_id: light.gateway_light_34ce00xxxx11 +``` + +- Door / Window + ```yaml + # Trigger for door window sensor + + - alias: If the window is open turn off the radiator + trigger: + platform: state + entity_id: binary_sensor.door_window_sensor_158d000xxxxxc2 + from: 'off' + to: 'on' + action: + service: climate.set_operation_mode + entity_id: climate.livingroom + data: + operation_mode: 'Off' + + - alias: If the window is closed for 5 minutes turn on the radiator again + trigger: + platform: state + entity_id: binary_sensor.door_window_sensor_158d000xxxxxc2 + from: 'on' + to: 'off' + for: + minutes: 5 + action: + service: climate.set_operation_mode + entity_id: climate.livingroom + data: + operation_mode: 'Smart schedule' + ``` +- Smoke + ```yaml + # Trigger for smoke sensor + + - alias: Send notification on fire alarm + trigger: + platform: state + entity_id: binary_sensor.smoke_sensor_158d0001574899 + from: 'off' + to: 'on' + action: + - service: notify.html5 + data: + title: Fire alarm! + message: Fire/Smoke detected! + - service: xiaomi.play_ringtone + data: + gw_mac: xxxxxxxxxxxx + ringtone_id: 2 + ringtone_vol: 100 + ``` +- Gas +```yaml + # Trigger for natgas detected + + - alias: Send notification on gas alarm + trigger: + platform: state + entity_id: binary_sensor.natgas_sensor_158dxxxxxxxxxx + from: 'off' + to: 'on' + action: + - service: notify.html5 + data_template: + title: Gas alarm! + message: 'Gas with a density of {{ states.binary_sensor.natgas_sensor_158dxxxxxxxxxx.attributes.density }} detected.' +``` +- Xiaomi Wireless Button (available events are `single`, `double`, `hold`, `long_click_press` and `long_click_release`). For Square version (Aqara brand) only `single` and `double` events are supported. Furthermore the space between two clicks to generate a double click must be quite large now +```yaml + # Trigger for the wireless button with different click types + + - alias: Toggle dining light on single press + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: single + action: + service: switch.toggle + entity_id: switch.wall_switch_left_158d000xxxxx01 + + - alias: Toggle couch light on double click + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: double + action: + service: switch.toggle + entity_id: switch.wall_switch_right_158d000xxxxx01 + + - alias: Let a dog bark on long press + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: long_click_press + action: + service: xiaomi.play_ringtone + data: + gw_mac: xxxxxxxxxxxx + ringtone_id: 8 + ringtone_vol: 8 + ``` + +- Xiaomi Cube (available events are `flip90`, `flip180`, `move`, `tap_twice`, `shake_air`, `swing`, `alert`, `free_fall` and `rotate`). +```yaml + # Trigger for a few cube events + + - alias: Cube event flip90 + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: flip90 + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "springgreen" + + - alias: Cube event flip180 + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: flip180 + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "darkviolet" + + - alias: Cube event move + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: move + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "gold" + + - alias: Cube event tap_twice + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: tap_twice + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "deepskyblue" + + - alias: Cube event shake_air + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: shake_air + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "blue" + ``` From ebd6648b0bcd73b160f52b18c68c8de22a03a31a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 23 Jul 2017 20:21:10 +0200 Subject: [PATCH 24/50] Add Xiaomi docs for platforms (#3045) * Add Xiaomi docs for platforms * Add service details * Add Aqara Wireless Switch * Escape templates * Update 'ha_iot_class' --- .../_components/binary_sensor.xiaomi.markdown | 469 ++++++++++-------- source/_components/cover.xiaomi.markdown | 20 + source/_components/light.xiaomi.markdown | 20 + source/_components/sensor.xiaomi.markdown | 20 + source/_components/switch.xiaomi.markdown | 20 + .../{xiaomi_gw.markdown => xiaomi.markdown} | 85 +++- 6 files changed, 408 insertions(+), 226 deletions(-) create mode 100644 source/_components/cover.xiaomi.markdown create mode 100644 source/_components/light.xiaomi.markdown create mode 100644 source/_components/sensor.xiaomi.markdown create mode 100644 source/_components/switch.xiaomi.markdown rename source/_components/{xiaomi_gw.markdown => xiaomi.markdown} (54%) diff --git a/source/_components/binary_sensor.xiaomi.markdown b/source/_components/binary_sensor.xiaomi.markdown index 04ea9895bdb..ff3c9dc62ec 100644 --- a/source/_components/binary_sensor.xiaomi.markdown +++ b/source/_components/binary_sensor.xiaomi.markdown @@ -1,20 +1,25 @@ --- layout: page -title: "Xiaomi Binary sensors” -description: "Instructions how to integrate your Xiaomi Binary sensors within Home Assistant." +title: "Xiaomi Binary Sensor" +description: "Instructions how to setup the Xiaomi binary sensors within Home Assistant." date: 2017-07-21 16:34 sidebar: true comments: false sharing: true footer: true logo: xiaomi.png -ha_category: Binary sensor +ha_category: Binary Sensor ha_release: "0.50" +ha_iot_class: "Local Polling" --- -To get your Xiaomi binary sensors working with Home Assistant, follow the instructions for the general [Xiaomi Gateway component](/components/xiaomi/) -### Type of sensors supported: +The `xiaomi` binary sensor platform allows you to get data from your [Xiaomi](http://www.mi.com/en/) binary sensors. + +The requirement is that you have setup the [`xiaomi` component](/components/xiaomi/). + + +### {% linkable_title Type of sensors supported %} - Motion - Door / Window - Smoke @@ -22,214 +27,268 @@ To get your Xiaomi binary sensors working with Home Assistant, follow the instru - Xiaomi Wireless Button - Xiaomi Cube -### Some automation examples to get you started: -- Motion +### {% linkable_title Automation examples %} + +#### {% linkable_title Motion %} + ```yaml - # Trigger for motion sensor - - - alias: If there is motion and its dark turn on the gateway light - trigger: - platform: state - entity_id: binary_sensor.motion_sensor_158d000xxxxxc2 - from: 'off' - to: 'on' - condition: - condition: numeric_state - entity_id: sensor.illumination_34ce00xxxx11 - below: 300 - action: - service: light.turn_on - entity_id: light.gateway_light_34ce00xxxx11 - data: - brightness: 5 - - - alias: If there no motion for 5 minutes turn off the gateway light - trigger: - platform: state - entity_id: binary_sensor.motion_sensor_158d000xxxxxc2 - from: 'on' - to: 'off' - for: - minutes: 5 - action: - service: light.turn_off - entity_id: light.gateway_light_34ce00xxxx11 +- alias: If there is motion and its dark turn on the gateway light + trigger: + platform: state + entity_id: binary_sensor.motion_sensor_158d000xxxxxc2 + from: 'off' + to: 'on' + condition: + condition: numeric_state + entity_id: sensor.illumination_34ce00xxxx11 + below: 300 + action: + service: light.turn_on + entity_id: light.gateway_light_34ce00xxxx11 + data: + brightness: 5 +- alias: If there no motion for 5 minutes turn off the gateway light + trigger: + platform: state + entity_id: binary_sensor.motion_sensor_158d000xxxxxc2 + from: 'on' + to: 'off' + for: + minutes: 5 + action: + service: light.turn_off + entity_id: light.gateway_light_34ce00xxxx11 ``` -- Door / Window - ```yaml - # Trigger for door window sensor +#### {% linkable_title Door and/or Window %} - - alias: If the window is open turn off the radiator - trigger: - platform: state - entity_id: binary_sensor.door_window_sensor_158d000xxxxxc2 - from: 'off' - to: 'on' - action: - service: climate.set_operation_mode - entity_id: climate.livingroom - data: - operation_mode: 'Off' - - - alias: If the window is closed for 5 minutes turn on the radiator again - trigger: - platform: state - entity_id: binary_sensor.door_window_sensor_158d000xxxxxc2 - from: 'on' - to: 'off' - for: - minutes: 5 - action: - service: climate.set_operation_mode - entity_id: climate.livingroom - data: - operation_mode: 'Smart schedule' - ``` -- Smoke - ```yaml - # Trigger for smoke sensor - - - alias: Send notification on fire alarm - trigger: - platform: state - entity_id: binary_sensor.smoke_sensor_158d0001574899 - from: 'off' - to: 'on' - action: - - service: notify.html5 - data: - title: Fire alarm! - message: Fire/Smoke detected! - - service: xiaomi.play_ringtone - data: - gw_mac: xxxxxxxxxxxx - ringtone_id: 2 - ringtone_vol: 100 - ``` -- Gas ```yaml - # Trigger for natgas detected - - - alias: Send notification on gas alarm - trigger: - platform: state - entity_id: binary_sensor.natgas_sensor_158dxxxxxxxxxx - from: 'off' - to: 'on' - action: - - service: notify.html5 - data_template: - title: Gas alarm! - message: 'Gas with a density of {{ states.binary_sensor.natgas_sensor_158dxxxxxxxxxx.attributes.density }} detected.' +- alias: If the window is open turn off the radiator + trigger: + platform: state + entity_id: binary_sensor.door_window_sensor_158d000xxxxxc2 + from: 'off' + to: 'on' + action: + service: climate.set_operation_mode + entity_id: climate.livingroom + data: + operation_mode: 'Off' +- alias: If the window is closed for 5 minutes turn on the radiator again + trigger: + platform: state + entity_id: binary_sensor.door_window_sensor_158d000xxxxxc2 + from: 'on' + to: 'off' + for: + minutes: 5 + action: + service: climate.set_operation_mode + entity_id: climate.livingroom + data: + operation_mode: 'Smart schedule' ``` -- Xiaomi Wireless Button (available events are `single`, `double`, `hold`, `long_click_press` and `long_click_release`). For Square version (Aqara brand) only `single` and `double` events are supported. Furthermore the space between two clicks to generate a double click must be quite large now + +#### {% linkable_title Smoke %} + ```yaml - # Trigger for the wireless button with different click types +- alias: Send notification on fire alarm + trigger: + platform: state + entity_id: binary_sensor.smoke_sensor_158d0001574899 + from: 'off' + to: 'on' + action: + - service: notify.html5 + data: + title: Fire alarm! + message: Fire/Smoke detected! + - service: xiaomi.play_ringtone + data: + gw_mac: xxxxxxxxxxxx + ringtone_id: 2 + ringtone_vol: 100 +``` - - alias: Toggle dining light on single press - trigger: - platform: event - event_type: click - event_data: - entity_id: binary_sensor.switch_158d000xxxxxc2 - click_type: single - action: - service: switch.toggle - entity_id: switch.wall_switch_left_158d000xxxxx01 +#### {% linkable_title Gas %} - - alias: Toggle couch light on double click - trigger: - platform: event - event_type: click - event_data: - entity_id: binary_sensor.switch_158d000xxxxxc2 - click_type: double - action: - service: switch.toggle - entity_id: switch.wall_switch_right_158d000xxxxx01 - - - alias: Let a dog bark on long press - trigger: - platform: event - event_type: click - event_data: - entity_id: binary_sensor.switch_158d000xxxxxc2 - click_type: long_click_press - action: - service: xiaomi.play_ringtone - data: - gw_mac: xxxxxxxxxxxx - ringtone_id: 8 - ringtone_vol: 8 - ``` - -- Xiaomi Cube (available events are `flip90`, `flip180`, `move`, `tap_twice`, `shake_air`, `swing`, `alert`, `free_fall` and `rotate`). ```yaml - # Trigger for a few cube events +- alias: Send notification on gas alarm + trigger: + platform: state + entity_id: binary_sensor.natgas_sensor_158dxxxxxxxxxx + from: 'off' + to: 'on' + action: + - service: notify.html5 + data_template: + title: Gas alarm! + message: 'Gas with a density of {% raw %}{{ states.binary_sensor.natgas_sensor_158dxxxxxxxxxx.attributes.density }}{% endraw %} detected.' +``` - - alias: Cube event flip90 - trigger: - platform: event - event_type: cube_action - event_data: - entity_id: binary_sensor.cube_15xxxxxxxxxxxx - action_type: flip90 - action: - - service: light.turn_on - entity_id: light.gateway_light_28xxxxxxxxxx - data: - color_name: "springgreen" - - - alias: Cube event flip180 - trigger: - platform: event - event_type: cube_action - event_data: - entity_id: binary_sensor.cube_15xxxxxxxxxxxx - action_type: flip180 - action: - - service: light.turn_on - entity_id: light.gateway_light_28xxxxxxxxxx - data: - color_name: "darkviolet" - - - alias: Cube event move - trigger: - platform: event - event_type: cube_action - event_data: - entity_id: binary_sensor.cube_15xxxxxxxxxxxx - action_type: move - action: - - service: light.turn_on - entity_id: light.gateway_light_28xxxxxxxxxx - data: - color_name: "gold" - - - alias: Cube event tap_twice - trigger: - platform: event - event_type: cube_action - event_data: - entity_id: binary_sensor.cube_15xxxxxxxxxxxx - action_type: tap_twice - action: - - service: light.turn_on - entity_id: light.gateway_light_28xxxxxxxxxx - data: - color_name: "deepskyblue" - - - alias: Cube event shake_air - trigger: - platform: event - event_type: cube_action - event_data: - entity_id: binary_sensor.cube_15xxxxxxxxxxxx - action_type: shake_air - action: - - service: light.turn_on - entity_id: light.gateway_light_28xxxxxxxxxx - data: - color_name: "blue" - ``` +#### {% linkable_title Xiaomi Wireless Button %} + +Available events are `single`, `double`, `hold`, `long_click_press` and `long_click_release`. For Square version (Aqara brand) only `single` and `double` events are supported. Furthermore the space between two clicks to generate a double click must be quite large now. + +```yaml +- alias: Toggle dining light on single press + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: single + action: + service: switch.toggle + entity_id: switch.wall_switch_left_158d000xxxxx01 +- alias: Toggle couch light on double click + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: double + action: + service: switch.toggle + entity_id: switch.wall_switch_right_158d000xxxxx01 +- alias: Let a dog bark on long press + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: long_click_press + action: + service: xiaomi.play_ringtone + data: + gw_mac: xxxxxxxxxxxx + ringtone_id: 8 + ringtone_vol: 8 +``` + +#### {% linkable_title Xiaomi Cube %} + +Available events are `flip90`, `flip180`, `move`, `tap_twice`, `shake_air`, `swing`, `alert`, `free_fall` and `rotate`. + +```yaml +- alias: Cube event flip90 + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: flip90 + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "springgreen" +- alias: Cube event flip180 + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: flip180 + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "darkviolet" +- alias: Cube event move + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: move + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "gold" +- alias: Cube event tap_twice + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: tap_twice + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "deepskyblue" +- alias: Cube event shake_air + trigger: + platform: event + event_type: cube_action + event_data: + entity_id: binary_sensor.cube_15xxxxxxxxxxxx + action_type: shake_air + action: + - service: light.turn_on + entity_id: light.gateway_light_28xxxxxxxxxx + data: + color_name: "blue" +``` +#### #### {% linkable_title Aqara Wireless Switch %} + +The Aqara Wireless Switch is available as single-key and double-key version. Each key behaves like the Wireless Button limited to the click event `single`. The double key version adds a third device called `binary_sensor.wall_switch_both_158xxxxxxxxx12` which reports a click event called `both` if both keys are pressed. + +```yaml +- alias: Decrease brightness of the gateway light + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.wall_switch_left_158xxxxxxxxx12 + click_type: single + action: + service: light.turn_on + entity_id: light.gateway_light_34xxxxxxxx13 + data_template: + brightness: {% raw %}>- + {% if states.light.gateway_light_34xxxxxxxx13.attributes.brightness %} + {% if states.light.gateway_light_34xxxxxxxx13.attributes.brightness - 60 >= 10 %} + {{states.light.gateway_light_34xxxxxxxx13.attributes.brightness - 60}} + {% else %} + {{states.light.gateway_light_34xxxxxxxx13.attributes.brightness}} + {% endif %} + {% else %} + 10 + {% endif %}{% endraw %} + +- alias: Increase brightness of the gateway light + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.wall_switch_right_158xxxxxxxxx12 + click_type: single + action: + service: light.turn_on + entity_id: light.gateway_light_34xxxxxxxx13 + data_template: + brightness: {% raw %}>- + {% if states.light.gateway_light_34xxxxxxxx13.attributes.brightness %} + {% if states.light.gateway_light_34xxxxxxxx13.attributes.brightness + 60 <= 255 %} + {{states.light.gateway_light_34xxxxxxxx13.attributes.brightness + 60}} + {% else %} + {{states.light.gateway_light_34xxxxxxxx13.attributes.brightness}} + {% endif %} + {% else %} + 10 + {% endif %}{% endraw %} + +- alias: Turn off the gateway light + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.wall_switch_both_158xxxxxxxxx12 + click_type: both + action: + service: light.turn_off + entity_id: light.gateway_light_34xxxxxxxx13 +``` diff --git a/source/_components/cover.xiaomi.markdown b/source/_components/cover.xiaomi.markdown new file mode 100644 index 00000000000..ff2fa683b0e --- /dev/null +++ b/source/_components/cover.xiaomi.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "Xiaomi Cover" +description: "Instructions how to setup the Xiaomi cover within Home Assistant." +date: 2017-07-21 16:34 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Cover +ha_release: "0.50" +ha_iot_class: "Local Polling" +--- + + +The `xiaomi` cover platform allows you to get data from your [Xiaomi](http://www.mi.com/en/) covers. + +The requirement is that you have setup [Xiaomi](/components/xiaomi/). + diff --git a/source/_components/light.xiaomi.markdown b/source/_components/light.xiaomi.markdown new file mode 100644 index 00000000000..24f84bc6b52 --- /dev/null +++ b/source/_components/light.xiaomi.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "Xiaomi Light" +description: "Instructions how to setup the Xiaomi light within Home Assistant." +date: 2017-07-21 16:34 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Light +ha_release: "0.50" +ha_iot_class: "Local Polling" +--- + + +The `xiaomi` light platform allows you to get data from your [Xiaomi](http://www.mi.com/en/) lights. + +The requirement is that you have setup [Xiaomi](/components/xiaomi/). + diff --git a/source/_components/sensor.xiaomi.markdown b/source/_components/sensor.xiaomi.markdown new file mode 100644 index 00000000000..61336ac1df6 --- /dev/null +++ b/source/_components/sensor.xiaomi.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "Xiaomi Sensor" +description: "Instructions how to setup the Xiaomi sensor within Home Assistant." +date: 2017-07-21 16:34 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Sensor +ha_release: "0.50" +ha_iot_class: "Local Polling" +--- + + +The `xiaomi` sensor platform allows you to get data from your [Xiaomi](http://www.mi.com/en/) sensors. + +The requirement is that you have setup [Xiaomi](/components/xiaomi/). + diff --git a/source/_components/switch.xiaomi.markdown b/source/_components/switch.xiaomi.markdown new file mode 100644 index 00000000000..1e4f1a5767e --- /dev/null +++ b/source/_components/switch.xiaomi.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "Xiaomi Switch" +description: "Instructions how to setup the Xiaomi switch within Home Assistant." +date: 2017-07-21 16:34 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Switch +ha_release: "0.50" +ha_iot_class: "Local Polling" +--- + + +The `xiaomi` switch platform allows you to get data from your [Xiaomi](http://www.mi.com/en/) switches. + +The requirement is that you have setup [Xiaomi](/components/xiaomi/). + diff --git a/source/_components/xiaomi_gw.markdown b/source/_components/xiaomi.markdown similarity index 54% rename from source/_components/xiaomi_gw.markdown rename to source/_components/xiaomi.markdown index 9a20ca830d8..891567b7509 100644 --- a/source/_components/xiaomi_gw.markdown +++ b/source/_components/xiaomi.markdown @@ -9,10 +9,11 @@ sharing: true footer: true logo: xiaomi.png ha_category: Hub -ha_release: 0.50 +ha_release: "0.50" +ha_iot_class: "Local Polling" --- -The `xiaomi_gw` platform allows you to integrate the following devices into HA +The `xiaomi_gw` platform allows you to integrate the following [Xiaomi](http://www.mi.com/en/) devices into Home Assistant. - Temperature and Humidity Sensor (old and new version) - Motion Sensor (old and new version) @@ -44,34 +45,76 @@ What's not available? - Decoupled mode of the Aqara Wall Switches (Single & Double) - Additional alarm events of the Gas and Smoke Detector: Analog alarm, battery fault alarm (smoke detector only), sensitivity fault alarm, I2C communication failure -{% linkable_title Getting started %} Follow the setup process using your phone and Mi Home app. From here you will be able to retrieve the key from within the app following [this tutorial](https://community.home-assistant.io/t/beta-xiaomi-gateway-integration/8213/1832) -{% linkable_title Configuration %} +To enable Xioami gateway in your installation, add the following to your `configuration.yaml` file: One Gateway - ```yaml - # You can leave mac empty if you only have one gateway - xiaomi: - gateways: - - mac: - key: xxxxxxxxxxxxxxxx - ``` - Multiple Gateway - ```yaml - # 12 characters mac can be obtained from the gateway. - xiaomi: - gateways: - - mac: xxxxxxxxxxxx - key: xxxxxxxxxxxxxxxx - - mac: xxxxxxxxxxxx - key: xxxxxxxxxxxxxxxx - ``` +```yaml +# You can leave mac empty if you only have one gateway. +xiaomi: + gateways: + - mac: + key: xxxxxxxxxxxxxxxx +``` + + +Multiple Gateway + +```yaml +# 12 characters mac can be obtained from the gateway. +xiaomi: + gateways: + - mac: xxxxxxxxxxxx + key: xxxxxxxxxxxxxxxx + - mac: xxxxxxxxxxxx + key: xxxxxxxxxxxxxxxx +``` Configuration variables: + - **mac** (*Optional*): The MAC of your gateway. Required if you have more than one. - **key** (*Optional*): The key of your gateway. Required if you also want to control lights and switches; sensors and binary sensors will still work. - **discovery_retry** (*Optional*): Amount of times Home Assitant should try to reconnect to the Xiaomi Gateway. Default is 3. - **interface** (*Optional*): Which network interface to use. Default to any. + +## {% linkable_title Services %} + +The gateway provides two services: `xiaomi.play_ringtone` and `xiaomi.stop_ringtone`. To play ringtones by Home Assistant the version of the gateway firmware must be `1.4.1_145` at least. A `ringtone_id` and `gw_mac` must be supplied. The parameter `ringtone_vol` (percent) is optional. Allowed values of the `ringtone_id` are: + +- alarm ringtones [0-8] +- doorbell ring [10-13] +- alarm clock [20-29] +- custom ringtones (uploaded by mi home app) starting from 10001 + +Automation example + +```yaml +- alias: Let a dog bark on long press + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: long_click_press + action: + service: xiaomi.play_ringtone + data: + gw_mac: xxxxxxxxxxxx + ringtone_id: 8 + ringtone_vol: 8 + +- alias: Stop barking immediately on single click + trigger: + platform: event + event_type: click + event_data: + entity_id: binary_sensor.switch_158d000xxxxxc2 + click_type: single + action: + service: xiaomi.stop_ringtone + data: + gw_mac: xxxxxxxxxxxx +``` From 17eab6474405172685d53d99450fb0d7a70243d2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 23 Jul 2017 21:39:04 -0700 Subject: [PATCH 25/50] Fix syntax --- source/_components/feedreader.markdown | 9 +++++---- source/_components/xiaomi.markdown | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/source/_components/feedreader.markdown b/source/_components/feedreader.markdown index 6fd6bfedd45..15b72129655 100644 --- a/source/_components/feedreader.markdown +++ b/source/_components/feedreader.markdown @@ -52,14 +52,13 @@ automation: service: persistent_notification.create data_template: title: "New HA Podcast available" - message: {% raw %}"New Podcast available - {{ as_timestamp(now()) | timestamp_custom('%I:%M:%S %p %d%b%Y', true) }}" - notification_id: "{{ trigger.event.data.title }}"{% endraw %} + message: {% raw %}"New Podcast available - {{ as_timestamp(now()) | timestamp_custom('%I:%M:%S %p %d%b%Y', true) }}"{% endraw %} + notification_id: {% raw %}"{{ trigger.event.data.title }}"{% endraw %} ``` -*Any field under the `` tag in the feed can be used for example `trigger.event.data.content` will get the body of the feed entry. +Any field under the `` tag in the feed can be used for example `trigger.event.data.content` will get the body of the feed entry. For more advanced use cases, a custom component registering to the `feedreader` event type could be used instead: -For a drop in packaged complete example of Feedreader, you can use the [PodCast notifier](https://github.com/CCOSTAN/Home-AssistantConfig/blob/master/packages/hasspodcast.yaml). ```python EVENT_FEEDREADER = "feedreader" @@ -67,3 +66,5 @@ hass.bus.listen(EVENT_FEEDREADER, event_listener) ``` To get started developing custom components, please refer to the [developers](/developers) documentation + +For a drop in packaged complete example of Feedreader, you can use the [PodCast notifier](https://github.com/CCOSTAN/Home-AssistantConfig/blob/master/packages/hasspodcast.yaml). diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index 891567b7509..09e41b74706 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Xiaomi Gateway” +title: "Xiaomi Gateway" description: "Instructions how to integrate your Xiaomi Gateway within Home Assistant." date: 2017-07-21 16:34 sidebar: true From 80814f25ca68fdbdf154002038bd96826d2e2859 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 23 Jul 2017 23:17:13 -0700 Subject: [PATCH 26/50] update docs for intents (#3046) * update docs for intents * Fix alexa docs * Fix api.ai reference --- source/_components/alexa.markdown | 147 +++--------------- source/_components/apiai.markdown | 103 +++++------- source/_components/intent_script.markdown | 35 +++++ source/_components/snips.markdown | 2 +- .../asides/developers_navigation.html | 8 + .../developers/intent/conversation.markdown | 27 ++++ source/developers/intent/firing.markdown | 59 +++++++ source/developers/intent/handling.markdown | 49 ++++++ source/developers/intent/index.markdown | 37 +++++ source/images/architecture/intents.png | Bin 0 -> 62878 bytes 10 files changed, 277 insertions(+), 190 deletions(-) create mode 100644 source/_components/intent_script.markdown create mode 100644 source/developers/intent/conversation.markdown create mode 100644 source/developers/intent/firing.markdown create mode 100644 source/developers/intent/handling.markdown create mode 100644 source/developers/intent/index.markdown create mode 100644 source/images/architecture/intents.png diff --git a/source/_components/alexa.markdown b/source/_components/alexa.markdown index fd96399a702..501915ee70a 100644 --- a/source/_components/alexa.markdown +++ b/source/_components/alexa.markdown @@ -15,42 +15,14 @@ ha_release: 0.10 There are a few ways that you can use Amazon Echo and Home Assistant together. -- [Turning devices on and off](#i-just-want-to-turn-devices-on-and-off-using-echo) - [Build custom commands to use](#i-want-to-build-custom-commands-to-use-with-echo) - [Create a new Flash Briefing source](#flash-briefing-skills) - -No matter which method(s) you decide to use, please remember that Amazon Echo requires an active Internet connection to function. If your Internet is down or experiencing issues (or Amazon's infrastructure is having issues), none of these methods will work. +- Alternative: use the [Emulated Hue component][emulated-hue-component] to trick Alexa to thinking Home Assistant is a Philips Hue hub. Amazon has released [Echosim], a website that simulates the Alexa service in your browser. That way it is easy to test your skills without having access to a physical Amazon Echo. [Echosim]: https://echosim.io/ -## {% linkable_title I just want to turn devices on and off using Echo %} - -If you just want to be able to turn anything with a switch (like lights, switches, media players, etc) on and off, you should enable the [Emulated Hue][emulated-hue-component] component. It makes your Home Assistant appear as if it were a Phillips Hue bridge, which Echo works with natively. - -[emulated-hue-component]: https://home-assistant.io/components/emulated_hue/ - -Enabling the Emulated Hue component means you can turn things on and off by simply saying - -> Alexa, turn the living room lights on. - -or - -> Alexa, set the living room lights to twenty percent. - -instead of - -> Alexa, tell Home Assistant to turn the living room lights on. - -or - -> Alexa, tell Home Assistant to set the living room lights to twenty percent. - -In addition, you would need to build custom intents for each device and on/off combination using the below method, whereas everything just works without any extra work by using Emulated Hue. - -Please note that you can use Emulated Hue and the built-in Alexa component side-by-side without issue if you wish. - ## {% linkable_title I want to build custom commands to use with Echo %} The built-in Alexa component allows you to integrate Home Assistant into Alexa/Amazon Echo. This component will allow you to query information and call services within Home Assistant by using your voice. Home Assistant offers no built-in sentences but offers a framework for you to define your own. @@ -121,54 +93,7 @@ This means that we can now ask Alexa things like: ## {% linkable_title Configuring Home Assistant %} -Out of the box, the component will do nothing. You have to teach it about all intents you want it to answer to. The way it works is that the answer for each intent is based on [templates] that you define. Each template will have access to the existing states via the `states` variable but will also have access to all variables defined in the intent. - -You can use [templates] for the values of `speech/text`, `card/title` and `card/content`. - -Actions are using the [Home Assistant Script Syntax] and also have access to the variables from the intent. - -[Home Assistant Script Syntax]: /getting-started/scripts/ - -Configuring the Alexa component for the above intents would look like this: - -```yaml -{% raw %}# Example configuration.yaml entry -alexa: - intents: - WhereAreWeIntent: - speech: - type: plaintext - text: > - {%- if is_state('device_tracker.paulus', 'home') and - is_state('device_tracker.anne_therese', 'home') -%} - You are both home, you silly - {%- else -%} - Anne Therese is at {{ states("device_tracker.anne_therese") }} - and Paulus is at {{ states("device_tracker.paulus") }} - {% endif %} - - LocateIntent: - action: - service: notify.notify - data_template: - message: The location of {{ User }} has been queried via Alexa. - speech: - type: plaintext - text: > - {%- for state in states.device_tracker -%} - {%- if state.name.lower() == User.lower() -%} - {{ state.name }} is at {{ state.state }} - {%- elif loop.last -%} - I am sorry, I do not know where {{ User }} is. - {%- endif -%} - {%- else -%} - Sorry, I don't have any trackers registered. - {%- endfor -%} - card: - type: simple - title: Sample title - content: Some more content{% endraw %} -``` +When activated, the Alexa component will have Home Assistant's native intent support handle the incoming intents. If you want to run actions based on intents, use the [`intent_script`](/components/intent_script) component. ### {% linkable_title Working With Scenes %} @@ -203,17 +128,18 @@ Add a sample utterance: ActivateSceneIntent activate {Scene} ``` -Then add the intent to your Alexa Section in your HA config file: +Then add the intent to your intent_script section in your HA config file: ```yaml - ActivateSceneIntent: - action: - service: scene.turn_on - data_template: - entity_id: scene.{% raw %}{{ Scene | replace(" ", "_") }}{% endraw %} - speech: - type: plaintext - text: OK +intent_script: + ActivateSceneIntent: + action: + service: scene.turn_on + data_template: + entity_id: scene.{% raw %}{{ Scene | replace(" ", "_") }}{% endraw %} + speech: + type: plain + text: OK ``` Here we are using [templates] to take the name we gave to Alexa e.g. `downstairs on` and replace the space with an underscore so it becomes `downstairs_on` as Home Assistant expects. @@ -250,17 +176,18 @@ Add a sample utterance: RunScriptIntent run {Script} ``` -Then add the intent to your Alexa Section in your HA config file: +Then add the intent to your intent_script section in your HA config file: ```yaml - RunScriptIntent: - action: - service: script.turn_on - data_template: - entity_id: script.{% raw %}{{ Script | replace(" ", "_") }}{% endraw %} - speech: - type: plaintext - text: OK +intent_script: + RunScriptIntent: + action: + service: script.turn_on + data_template: + entity_id: script.{% raw %}{{ Script | replace(" ", "_") }}{% endraw %} + speech: + type: plain + text: OK ``` Now say `Alexa ask homeassistant to run ` and Alexa will run that script for you. @@ -306,35 +233,6 @@ text: !include alexa_confirm.yaml Alexa will now respond with a random phrase each time. You can use the include for as many different intents as you like so you only need to create the list once. -

-As of April 2017, the random filter has been somewhat broken. You'll get a random response the first time this runs, but subsequent commands will reply with the same randomly-chosen phrase. On reboot, Home Assistant will pick a new random choice, but you're stuck with that choice till you reboot. To get around that, use the following code in alexa_confirm.yaml: -

- -```text -{% raw %} > - {% set responses = [ - "OK", - "Sure", - "If you insist", - "Done", - "No worries", - "I can do that", - "Leave it to me", - "Consider it done", - "As you wish", - "By your command", - "Affirmative", - "Yes oh revered one", - "I will", - "As you decree, so shall it be", - "No Problem" - ] %} - {% set rindex = (range(0, (responses | length - 1) )|random) -%} - {{responses[rindex]}} - {% endraw %} -``` - - ## {% linkable_title Flash Briefing Skills %} As of version [0.31][zero-three-one] Home Assistant supports the new [Alexa Flash Briefing Skills API][flash-briefing-api]. A Flash Briefing Skill adds a new Flash Briefing source that is generated by Home Assistant. @@ -395,3 +293,4 @@ Please refer to the [Amazon documentation][flash-briefing-api-docs] for more inf [templates]: /topics/templating/ [zero-three-one]: /blog/2016/10/22/flash-briefing-updater-hacktoberfest/ [alexa-settings-site]: http://alexa.amazon.com/ +[emulated-hue-component]: /components/emulated_hue/ diff --git a/source/_components/apiai.markdown b/source/_components/apiai.markdown index 7ab70633035..08c2857653d 100644 --- a/source/_components/apiai.markdown +++ b/source/_components/apiai.markdown @@ -58,35 +58,7 @@ Take a look to "Integrations", in the left menu, to configure third parties. ### {% linkable_title Configuring Home Assistant %} -Out of the box, the component will do nothing. You have to teach it about all intents you want it to answer to. The way it works is that the answer for each intent is based on [templates] that you define. Each template will have access to the existing states via the `states` variable but will also have access to all variables defined in the intent. - -You can use [templates] for setting `speech`. - -Actions are using the [Home Assistant Script Syntax] and also have access to the variables from the intent. - -[Home Assistant Script Syntax]: /getting-started/scripts/ - -Example of an Api.ai for the above configuration: - -```yaml -{% raw %}# Example configuration.yaml entry -apiai: - intents: - GetTemperature: - speech: We have {{ states.sensor.temperature }} degrees - async_action: False - action: - service: notify.notify - data_template: - message: Api.ai has send a request -{% endraw %} -``` - -Inside an intent we can define this variables: -- **speech** (*Optional*): Text or template to return to Api.ai -- **action** (*Optional*): Script definition -- **async_action** (*Optional*): If Home Assistant should execute the action asynchronously (returning response to Api.ai without waiting the action to finish). Should be set to `True` if Api.ai is returning the "Cannot connect to Home Assistant or it is taking to long" message, but then you will not be able to use values based on the result of the action. Defaults to `False`. - +When activated, the Alexa component will have Home Assistant's native intent support handle the incoming intents. If you want to run actions based on intents, use the [`intent_script`](/components/intent_script) component. ## {% linkable_title Examples %} @@ -95,43 +67,44 @@ Download [this zip](https://github.com/home-assistant/home-assistant.github.io/b ```yaml {% raw %}# Example configuration.yaml entry apiai: - intents: - Temperature: - speech: The temperature at home is {{ states('sensor.home_temp') }} degrees - LocateIntent: - speech: > - {%- for state in states.device_tracker -%} - {%- if state.name.lower() == User.lower() -%} - {{ state.name }} is at {{ state.state }} - {%- elif loop.last -%} - I am sorry, I do not know where {{ User }} is. + +intent_script: + Temperature: + speech: The temperature at home is {{ states('sensor.home_temp') }} degrees + LocateIntent: + speech: > + {%- for state in states.device_tracker -%} + {%- if state.name.lower() == User.lower() -%} + {{ state.name }} is at {{ state.state }} + {%- elif loop.last -%} + I am sorry, I do not know where {{ User }} is. + {%- endif -%} + {%- else -%} + Sorry, I don't have any trackers registered. + {%- endfor -%} + WhereAreWeIntent: + speech: > + {%- if is_state('device_tracker.adri', 'home') and + is_state('device_tracker.bea', 'home') -%} + You are both home, you silly + {%- else -%} + Bea is at {{ states("device_tracker.bea") }} + and Adri is at {{ states("device_tracker.adri") }} + {% endif %} + TurnLights: + speech: Turning {{ Room }} lights {{ OnOff }} + action: + - service: notify.pushbullet + data_template: + message: Someone asked via apiai to turn {{ Room }} lights {{ OnOff }} + - service_template: > + {%- if OnOff == "on" -%} + switch.turn_on + {%- else -%} + switch.turn_off {%- endif -%} - {%- else -%} - Sorry, I don't have any trackers registered. - {%- endfor -%} - WhereAreWeIntent: - speech: > - {%- if is_state('device_tracker.adri', 'home') and - is_state('device_tracker.bea', 'home') -%} - You are both home, you silly - {%- else -%} - Bea is at {{ states("device_tracker.bea") }} - and Adri is at {{ states("device_tracker.adri") }} - {% endif %} - TurnLights: - speech: Turning {{ Room }} lights {{ OnOff }} - action: - - service: notify.pushbullet - data_template: - message: Someone asked via apiai to turn {{ Room }} lights {{ OnOff }} - - service_template: > - {%- if OnOff == "on" -%} - switch.turn_on - {%- else -%} - switch.turn_off - {%- endif -%} - data_template: - entity_id: "switch.light_{{ Room | replace(' ', '_') }}" + data_template: + entity_id: "switch.light_{{ Room | replace(' ', '_') }}" {% endraw %} ``` diff --git a/source/_components/intent_script.markdown b/source/_components/intent_script.markdown new file mode 100644 index 00000000000..e6c72b0275c --- /dev/null +++ b/source/_components/intent_script.markdown @@ -0,0 +1,35 @@ +--- +layout: page +title: "Intent Script" +description: "Instructions on how to setup scripts to run on intents." +date: 2016-02-10 17:11 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_category: Intent +ha_release: 0.50 +--- + +The intent_script component allows users to configure actions and responses to intents. Intents can be fired by any component that supports it. Examples are Alexa (Amazon Echo), API.ai (Google Assistant) and Snips. + +```yaml +{% raw %}# Example configuration.yaml entry +intent_script: + GetTemperature: # Intent type + speech: + text: We have {{ states.sensor.temperature }} degrees + action: + service: notify.notify + data_template: + message: Hello from an intent! +{% endraw %} +``` + +Inside an intent we can define these variables: +- **speech** (*Optional*): Text or template to return +- **action** (*Optional*): [Script syntax] +- **async_action** (*Optional*): Set to True to have Home Assistant not wait for the script to finish before returning the intent response. + +[Script syntax]: /docs/scripts/ diff --git a/source/_components/snips.markdown b/source/_components/snips.markdown index 181431a886c..41fa358689b 100644 --- a/source/_components/snips.markdown +++ b/source/_components/snips.markdown @@ -100,7 +100,7 @@ mqtt: ``` ### Triggering actions -In Home Assistant, we trigger actions based on intents produced by Snips. This is done in `configuration.yaml`. For instance, the following block handles `ActivateLightColors` intents (included in the Snips IoT intent bundle) to change light colors: +In Home Assistant, we trigger actions based on intents produced by Snips using the [`intent_script`](/components/intent_script) component. For instance, the following block handles `ActivateLightColors` intents (included in the Snips IoT intent bundle) to change light colors: ```yaml snips: diff --git a/source/_includes/asides/developers_navigation.html b/source/_includes/asides/developers_navigation.html index d60e6ce1674..cfcdc3f9c99 100644 --- a/source/_includes/asides/developers_navigation.html +++ b/source/_includes/asides/developers_navigation.html @@ -54,6 +54,14 @@
  • {% active_link /developers/component_discovery/ Component Discovery %}
  • +
  • + {% active_link /developers/intent/ Intents (handling voice responses) %} +
      +
    • {% active_link /developers/intent/firing/ Firing intents %}
    • +
    • {% active_link /developers/intent/handling/ Handling intents %}
    • +
    • {% active_link /developers/intent/conversation/ Registering sentences %}
    • +
    +
  • {% active_link /developers/asyncio/ Asynchronous Programming %}