From 8cb29a31e79579b1be3970eb175094e35fc76644 Mon Sep 17 00:00:00 2001 From: "Jacob Mansfield [root@Helix]" Date: Thu, 7 Sep 2017 23:20:23 +0100 Subject: [PATCH 01/15] Add missing configuration for polly Add documentation for missing configuration options for Amazon Polly TTS. --- source/_components/tts.amazon_polly.markdown | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/_components/tts.amazon_polly.markdown b/source/_components/tts.amazon_polly.markdown index 7433a526a74..465a5abea16 100644 --- a/source/_components/tts.amazon_polly.markdown +++ b/source/_components/tts.amazon_polly.markdown @@ -25,6 +25,7 @@ tts: aws_secret_access_key: AWS_SECRET_ACCESS_KEY profile_name: AWS_PROFILE region_name: 'us-east-1' + voice: Joanna ``` Configuration variables: @@ -33,12 +34,14 @@ Configuration variables: |---------------------|----------|-------------| | `aws_access_key_id` | Required | Your AWS Access Key ID. For more information, please read the [AWS General Reference regarding Security Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html). If provided, you must also provide an `aws_secret_access_key` and must **not** provide a `profile_name` | | `aws_secret_access_key` | Required | Your AWS Secret Access Key. For more information, please read the [AWS General Reference regarding Security Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html). If provided, you must also provide an `aws_access_key_id` and must **not** provide a `profile_name`. | -| `profile_name` | Optional | A credentials profile name. For more information, please see the [boto3 | +| `profile_name` | Optional | A credentials profile name. For more information, please see the [boto3 Documentation](http://boto3.readthedocs.io/en/latest/guide/configuration.html#shared-credentials-file) for more information. | | `region_name` | Optional | The region identifier to connect to. The default is `us-east-1`. | -| `name` | Optional | Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. - | -| `text_type` | text/ssml | text or ssml: Specify wherever to use text (default) or ssml markup | - +| `name` | Optional | Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. | +| `text_type` | text/ssml | text or ssml: Specify wherever to use text (default) or ssml markup by default. | +| `voice` | Optional | Voice name to be used. See the [Amazon Documentation](http://docs.aws.amazon.com/polly/latest/dg/voicelist.html) for available voices. | +| `output_format` | mp3/ogg_vorbis/pcm | Override the default output format, defaults to MP3. | +| `sample_rate` | 8000/16000/22050 | Override the default sample rate, defaults to 22050 for MP3 and Ogg Vorbis, 16000 for pcm. | + ## Usage Say to all `media_player` device entities: ```yaml From de9d8000dd231f448c0fb53939a0dbdad2a76b0d Mon Sep 17 00:00:00 2001 From: Dale Higgs Date: Fri, 8 Sep 2017 02:02:32 -0500 Subject: [PATCH 02/15] Update example and minor text changes (#3325) --- source/_components/zone.markdown | 34 +++++++++++++++----------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/source/_components/zone.markdown b/source/_components/zone.markdown index 797b3659da9..00d4f7e664e 100644 --- a/source/_components/zone.markdown +++ b/source/_components/zone.markdown @@ -13,29 +13,27 @@ ha_category: Organization Zones allow you to specify certain regions on earth (for now). When a device tracker sees a device to be within a zone, the state will take the name from the zone. Zones can also be used as a [trigger](/getting-started/automation-trigger/#zone-trigger) or [condition](/getting-started/automation-condition/#zone-condition) inside automation setups. -Zones support the usual method to specify multiple zones, use keys `zone:`, `zone 2:` etc. +The Zone component uses YAML sequences to configure multiple zones: ```yaml # Example configuration.yaml entry zone: - name: School - latitude: 32.8773367 - longitude: -117.2494053 - radius: 250 - icon: mdi:school + - name: School + latitude: 32.8773367 + longitude: -117.2494053 + radius: 250 + icon: mdi:school -zone 2: - name: Work - latitude: 32.8753367 - longitude: -117.2474053 + - name: Work + latitude: 32.8753367 + longitude: -117.2474053 -# This will override the default home zone -zone 3: - name: Home - latitude: 32.8793367 - longitude: -117.2474053 - radius: 100 - icon: mdi:account-multiple + # This will override the default home zone + - name: Home + latitude: 32.8793367 + longitude: -117.2474053 + radius: 100 + icon: mdi:account-multiple ``` Configuration variables: @@ -47,7 +45,7 @@ Configuration variables: - **icon** (*Optional*): Optional icon to show instead of name. - **passive** (*Optional*): Optional boolean to only use the zone for automation and hide it from the UI and not use the zone for device tracker name. Defaults to false. -To find your latitude/longitude of a certain place you can use for example [Google Maps](https://www.google.nl/maps/) or [Bing Maps](https://www.bing.com/maps). Just right click and copy the coordinates from there (Bing) or click on the "What is here?" (Google) +To find the latitude/longitude of a certain place you can use [Google Maps](https://www.google.com/maps/) or [Bing Maps](https://www.bing.com/maps). Just right click and copy the coordinates from there (Bing) or click on the "What is here?" (Google) #### {% linkable_title Home zone %} From fe876341f82d8c8494576f61247ba2891ac492c3 Mon Sep 17 00:00:00 2001 From: Paul Kline Date: Fri, 8 Sep 2017 02:15:43 -0500 Subject: [PATCH 03/15] Includes 2 vital details to make Alexa work (#3331) * Includes 2 vital details to make Alexa work I spent several hours trying to figure out why this guide didn't work for me and it overlooked two very important things that must be done. 1. either forward 443 requests or change your serving port to 443 2. add "alexa:" to your configuration file. otherwise, the .../api/alexa?api_password=xxxxxxxxx will not exist. * Minor changes --- source/_components/alexa.markdown | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/source/_components/alexa.markdown b/source/_components/alexa.markdown index 72a3648e481..60f7e4c4677 100644 --- a/source/_components/alexa.markdown +++ b/source/_components/alexa.markdown @@ -33,7 +33,13 @@ The built-in Alexa component allows you to integrate Home Assistant into Alexa/A ### {% linkable_title Requirements %} -Amazon requires the endpoint of a skill to be hosted via SSL. Self-signed certificates are ok because our skills will only run in development mode. Read more on [our blog][blog-lets-encrypt] about how to set up encryption for Home Assistant. If you are unable to get HTTPS up and running, consider using [this AWS Lambda proxy for Alexa skills](https://community.home-assistant.io/t/aws-lambda-proxy-custom-alexa-skill-when-you-dont-have-https/5230). +Amazon requires the endpoint of a skill to be hosted via SSL. Self-signed certificates are ok because our skills will only run in development mode. Read more on [our blog][blog-lets-encrypt] about how to set up encryption for Home Assistant. When running Hass.io, using the [Let's Encrypt](/addons/lets_encrypt/) the and [Duck DNS](/addons/duckdns/) add-ons is the easiest method. If you are unable to get HTTPS up and running, consider using [this AWS Lambda proxy for Alexa skills](https://community.home-assistant.io/t/aws-lambda-proxy-custom-alexa-skill-when-you-dont-have-https/5230). + +Additionally, note that at the time of this writing, your Alexa skill endpoint *must* accept requests over port 443 (Home Assistant default to 8123). There are two ways you can handle this: + + 1. In your router, forward external 443 to your Home Assistant serving port (defaults to 8123) + OR + 2. Change your Home Assistant serving port to 443 this is done in the [`http`](/components/http/) section with the the `server_port` entry in your `configuration.yaml` file [blog-lets-encrypt]: https://home-assistant.io/blog/2015/12/13/setup-encryption-using-lets-encrypt/ @@ -48,7 +54,7 @@ To get started with Alexa skills: - Version: 1.0 - Endpoint: - https - - https://YOUR_HOST/api/alexa?api_password=YOUR_API_PASSWORD + - `https://YOUR_HOST/api/alexa?api_password=YOUR_API_PASSWORD` You can use this [specially sized Home Assistant logo][large-icon] as the large icon and [this one][small-icon] as the small one. @@ -95,6 +101,12 @@ This means that we can now ask Alexa things like: 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. +To enable Alex add the following entry to your `configuration.yaml` file: + +```yaml +alexa: +``` + ### {% linkable_title Working With Scenes %} One of the most useful applications of Alexa integrations is to call scenes directly. This is easily achieved with some simple setup on the Home Assistant side and by letting Alexa know which scenes you want to run. @@ -120,6 +132,7 @@ Then create a custom slot type called `Scenes` listing every scene you want to c Custom slot type for scene support.

+ The names must exactly match the scene names (minus underscores - amazon discards them anyway and we later map them back in with the template). Add a sample utterance: From 5eff55dcf0c72116f6cab9569459302156074397 Mon Sep 17 00:00:00 2001 From: Florian Harr Date: Fri, 8 Sep 2017 03:19:14 -0400 Subject: [PATCH 04/15] Added note regarding script.json-cec plugin on kodi page (#3330) * Added note regarding script.json-cec plugin on kodi page * Add HTML for note --- source/_components/media_player.kodi.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_components/media_player.kodi.markdown b/source/_components/media_player.kodi.markdown index f5a5c25c9f1..a5297acd749 100644 --- a/source/_components/media_player.kodi.markdown +++ b/source/_components/media_player.kodi.markdown @@ -193,6 +193,9 @@ media_player: command: standby ``` +

+This example and the following requires to have the [script.json-cec](https://github.com/joshjowen/script.json-cec) plugin installed on your kodi player. It'll also expose th endpoints standy, toggle and activate without authentication on your kodi player. Use this with caution. +

### {% linkable_title Kodi services samples %} From c08e19578adbbee7019dc9aab1865a997810d329 Mon Sep 17 00:00:00 2001 From: Eirik H Date: Fri, 8 Sep 2017 09:22:19 +0200 Subject: [PATCH 05/15] Describe the state_topic setting for battery tracking using Owntracks (#3322) I wasn't sure what the /tablet/tablet section of the state_topic part meant so had to google a bit to figure it out. With this change, users will immediately understand what they should set as the topic. --- source/_cookbook/track_battery_level.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_cookbook/track_battery_level.markdown b/source/_cookbook/track_battery_level.markdown index eee8f1a4930..0e76fd083e5 100644 --- a/source/_cookbook/track_battery_level.markdown +++ b/source/_cookbook/track_battery_level.markdown @@ -32,12 +32,12 @@ The `else` part is used to have the sensor keep it's last state if the newest [i ### {% linkable_title Android and iOS Devices %} -While running the [Owntracks](/components/device_tracker.owntracks/) device tracker you can retrieve the battery level with a MQTT sensor. +While running the [Owntracks](/components/device_tracker.owntracks/) device tracker you can retrieve the battery level with a MQTT sensor. Replace username with your MQTT username (for the embedded MQTT it's simply homeassistant), and deviceid with the set Device ID in Owntracks. ```yaml sensor: - platform: mqtt - state_topic: "owntracks/tablet/tablet" + state_topic: "owntracks/username/deviceid" name: "Battery Tablet" unit_of_measurement: "%" value_template: {% raw %}'{{ value_json.batt }}'{% endraw %} From c356206494d49d16eddd093dbb4a07617b0746e6 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 8 Sep 2017 10:06:23 +0200 Subject: [PATCH 06/15] Update description (fixes #3274) (#3332) --- source/_components/media_player.plex.markdown | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/_components/media_player.plex.markdown b/source/_components/media_player.plex.markdown index b0dace56a53..ddaf3a611bf 100644 --- a/source/_components/media_player.plex.markdown +++ b/source/_components/media_player.plex.markdown @@ -17,7 +17,7 @@ ha_iot_class: "Local Polling" The `plex` platform allows you to connect a [Plex Media Server](https://plex.tv) to Home Assistant. It will allow you to control media playback and see the current playing item. -## Setup +## {% linkable_title Setup %} The preferred way to setup the Plex platform is by enabling the [discovery component](/components/discovery/) which requires GDM enabled on your Plex server. @@ -52,11 +52,13 @@ In case [discovery](/components/discovery/) does not work (GDM disabled or non-l - **IP_ADDRESS** (*Required*): IP address of the Plex Media Server. - **PORT** (*Required*): Port where Plex is listening. Default is 32400. - **TOKEN** (*Optional*): Only if authentication is required. Set to `null` (without quotes) otherwise. -- **ssl** (*Optional*): Whether to use SSL or not. _(Boolean)_ -- **verify** (*Optional*): Whether to allow invalid or self-signed SSL certificates or not. _(Boolean)_ +- **ssl** (*Optional*): Whether to use SSL/TLS or not. Defaults to `False` if not present. +- **verify** (*Optional*): Perform a verification of the certificate. To allow invalid or self-signed SSL certificates set it to `False`. Defaults to `True` if not present. + +## {% linkable_title Customization %} -## Customization You can customize the Plex component by adding any of the variables below to your configuration: + ```yaml # Example configuration.yaml entry media_player: @@ -124,7 +126,8 @@ Plays a song, playlist, TV episode, or video on a connected client. | Plex Web | None | | Tivo Plex App | Only play, pause, stop/off controls enabled | -### Notes +### {% linkable_title Notes %} + * At this moment, the Plex platform only supports one Plex Media Server. * It is possible to get errors that look like the following. From 9db8df831d52b5216b3b7f08bad76bbc60ca6f0a Mon Sep 17 00:00:00 2001 From: Konstantin Belyalov Date: Sat, 9 Sep 2017 00:37:21 -0700 Subject: [PATCH 07/15] Add config variable rgb_command_template (#3312) * Add config variable rgb_command_template * Add available template variable * Minor change --- source/_components/light.mqtt.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/light.mqtt.markdown b/source/_components/light.mqtt.markdown index 308e9282a64..b90de5ae569 100644 --- a/source/_components/light.mqtt.markdown +++ b/source/_components/light.mqtt.markdown @@ -47,6 +47,7 @@ Configuration variables: - **payload_on** (*Optional*): The payload that represents enabled state. Default is "ON". - **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. - **retain** (*Optional*): If the published message should have the retain flag on or not. +- **rgb_command_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to compose message which will be sent to `rgb_command_topic`. Available variables: `red`, `green` and `blue`. - **rgb_command_topic** (*Optional*): The MQTT topic to publish commands to change the light's RGB state. - **rgb_state_topic** (*Optional*): The MQTT topic subscribed to receive RGB state updates. - **rgb_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the RGB value. From 9c7562a6cb2b982284fbc509e80037742f07f9d9 Mon Sep 17 00:00:00 2001 From: Jeroen ter Heerdt Date: Sat, 9 Sep 2017 09:42:21 +0200 Subject: [PATCH 08/15] Update alarm_control_panel.egardia.markdown (#3278) * Update alarm_control_panel.egardia.markdown * Update alarm_control_panel.egardia.markdown * Update alarm_control_panel.egardia.markdown --- .../alarm_control_panel.egardia.markdown | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/source/_components/alarm_control_panel.egardia.markdown b/source/_components/alarm_control_panel.egardia.markdown index c9a5e285652..e091c2d83b9 100644 --- a/source/_components/alarm_control_panel.egardia.markdown +++ b/source/_components/alarm_control_panel.egardia.markdown @@ -43,7 +43,7 @@ You can change this, however, using the following procedure. This is a more adva 1. Log in into your alarm system's control panel. You will need to access http://[ip of your control panel]. You know this already since you need it in the basic configuration from above. Log in to the control panel with your Egardia/Woonveilig username and password. 2. Once logged in, go to *System Settings*, *Report* and change the Server Address for your primary server to the IP or hostname of your Home Assistant machine. Also, update the port number 85 or to anything you like. The provided software that you will set up in the next steps runs on port 85 by default. **Make sure to change the settings of the primary server otherwise the messages will not come through. Note that this will limit (or fully stop) the number of alarm messages you will get through Egardia's / Woonveilig services.** Maybe, that is just what you want. Make sure to save your settings by selecting 'OK'. -3. On your Home Assistant machine run `$ sudo python3 egardiaserver.py`. This will receive status codes from your alarm control panel and display them. You will need the codes to include in your configuration.yaml. Make sure to change the status of your alarm to all states (disarm, arm, armhome) as well as trigger the alarm in all ways possible to get 100% coverage. **Before triggering the alarm it might be good to disable the siren temporarily (can be done in Panel Settings).** +3. On your Home Assistant machine run `$ sudo python3 egardiaserver.py`. Refer to the [python-egardia repository](https://github.com/jeroenterheerdt/python-egardia) for detailed documentation on parameters. This will receive status codes from your alarm control panel and display them. You will need the codes to include in your configuration.yaml. Make sure to change the status of your alarm to all states (disarm, arm, armhome) as well as trigger the alarm in all ways possible to get 100% coverage. **Before triggering the alarm it might be good to disable the siren temporarily (can be done in Panel Settings).** 4. Once you have the codes, update your `configuration.yaml`: ```yaml # Example configuration.yaml entry @@ -62,9 +62,24 @@ alarm_control_panel: standby: XXXXXXXXXXXXXXXX ``` Note that you can have more than one code for triggered since every sensor generates its own code. arm, disarm, armhome and standby will all be one code. -5. Start the `egardiaserver.py` script on boot of your Home Assistant machine, for example by adding the following to your `/etc/rc.local`: +5. Start the `egardiaserver.py` script on boot of your Home Assistant machine, for example by using systemd. To use this method, create a shell script named `egardiaserver.sh` that contains the following: ```bash - python3 [path/to/]egardiaserver.py & +source /srv/homeassistant/homeassistant_venv/bin/activate +python3 /srv/homeassistant/homeassistant_venv/lib/python3.4/site-packages/pythonegardia/egardiaserver.py -host [YOURHOST] -password '[YOURPASSWORD]' -ssl True > /tmp/egardiaserver.log 2>&1 ``` - **Do not forget the trailing & here; otherwise you will be having a hard time logging back into the machine.** + +Mark it as executable (`$ chmod +x`) and run `sudo nano /lib/systemd/system/egardiaserver.service`. Enter the following into the `egardiaserver.service` file: +```bash +[Unit] +Description=Egardia Server Service + +[Service] +ExecStart=/srv/homeassistant/homeassistant_venv/lib/python3.4/site-packages/pythonegardia/egardiaserver.sh +StandardOutput=journal+console + +[Install] +WantedBy=multi-user.target +Alias=egardiaserver.service +``` +Save and then run `sudo systemctl enable egardiaserver.service` and `sudo systemctl start egardiaserver.service`. 6. Test your setup and enjoy. The component will update if the alarm status changes, including triggers. You can use this to build your own automations and send notifications as you wish. From 90919e784b29fdd69a52a33fb0f4d27f8de9659b Mon Sep 17 00:00:00 2001 From: Lukas Barth Date: Sat, 9 Sep 2017 09:42:48 +0200 Subject: [PATCH 09/15] Add documentation for YR forecast data (#3059) * Add documentation for YR forecast data * Update sensor.yr.markdown --- source/_components/sensor.yr.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.yr.markdown b/source/_components/sensor.yr.markdown index f008082fcfd..362c3aaedbf 100644 --- a/source/_components/sensor.yr.markdown +++ b/source/_components/sensor.yr.markdown @@ -14,7 +14,7 @@ ha_iot_class: "Cloud Polling" --- -The `yr` platform uses [YR.no](http://www.yr.no/) as an source for current meteorological data for your location. The +The `yr` platform uses [YR.no](http://www.yr.no/) as an source for current meteorological data for your location. The weather forecast is delivered by the Norwegian Meteorological Institute and the NRK. To add YR to your installation, add the following to your `configuration.yaml` file: @@ -28,6 +28,7 @@ sensor: Configuration variables: - **name** (*Optional*): Additional name for the sensors. Default to platform name. +- **forecast** integer (*Optional*): If you want to get forecast data instead of the current weather data, set this to the number of hours that you want to look into the future. - **monitored_conditions** array (*Optional*): Conditions to display in the frontend. - **symbol**: A symbol for the current weather. - **temperature**: The current temperature. @@ -50,6 +51,7 @@ A full configuration example can be found below: sensor: - platform: yr name: Weather + forecast: 24 monitored_conditions: - temperature - symbol From 2474f6cb43d9993813ddc2cfe7776602f80f8280 Mon Sep 17 00:00:00 2001 From: BioSehnsucht Date: Fri, 8 Sep 2017 23:20:14 -0500 Subject: [PATCH 10/15] input_text : removing disabled option per home-assistant/home-assistant-polymer#408 (#3327) --- source/_components/input_text.markdown | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source/_components/input_text.markdown b/source/_components/input_text.markdown index 7e0c3694471..26ad4846a74 100644 --- a/source/_components/input_text.markdown +++ b/source/_components/input_text.markdown @@ -27,10 +27,6 @@ input_text: text3: name: Text 3 pattern: '[a-fA-F0-9]*' - test4: - name: Text 4 - initial: Can't Touch This - disabled: true ``` Configuration variables: @@ -41,4 +37,3 @@ Configuration variables: - **name** (*Optional*): Friendly name of the text input. - **initial** (*Optional*): Initial value when Home Assistant starts. Default is empty string. - **pattern** (*Optional*): Regex pattern for client side validation. Default is empty string, which is treated same as `.*`. -- **disabled** (*Optional*): If set to true, disables making changes from the UI (but not by automations / REST / etc), displaying the value grayed out to indicate it is read-only in the UI. Default is false. From d271d48a31a208facc6c63483d34baf28d07a9bc Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sat, 9 Sep 2017 09:35:19 +0200 Subject: [PATCH 11/15] Documentation of the Xiaomi Philips Light component (#3246) * Documentation for Xiaomi Philips Light component added. * HA version added. * Syntax error fixed. * Section "Retrieving the Access Token" has a central place now. * Spelling & grammar fixed. --- .../light.xiaomi_philipslight.markdown | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 source/_components/light.xiaomi_philipslight.markdown diff --git a/source/_components/light.xiaomi_philipslight.markdown b/source/_components/light.xiaomi_philipslight.markdown new file mode 100644 index 00000000000..ec4d351e25f --- /dev/null +++ b/source/_components/light.xiaomi_philipslight.markdown @@ -0,0 +1,36 @@ +--- +layout: page +title: "Xiaomi Philips Light" +description: "Instructions how to integrate your Xiaomi Philips Lights within Home Assistant." +date: 2017-08-26 08:45 +sidebar: true +comments: false +sharing: true +footer: true +logo: philips.png +ha_category: Light +ha_version: 0.53 +ha_iot_class: "Local Polling" +--- + +The `xiaomi_philipslight` platform allows you to control the state of your Xiaomi Philips LED Ball Lamp and Xiaomi Philips LED Ceiling Lamp. + +Currently, the supported features are `on`, `off`, `set_cct` (colortemp) , `set_bright` (brightness). + +Please follow the instructions on [Retrieving the Access Token](/xiaomi/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. + +To add a Xiaomi Philips Light to your installation, add the following to your configuration.yaml file: + +```yaml +# Example configuration.yaml entries +light: + - platform: xiaomi_philipslight + name: Xiaomi Philips Smart LED Ball + host: 192.168.130.67 + token: YOUR_TOKEN +``` + +Configuration variables: +- **host** (*Required*): The IP of your light. +- **token** (*Required*): The API token of your light. +- **name** (*Optional*): The name of your light. From fbfc38bd884a71fa4f85c047a0b2c8f0beebe995 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sat, 9 Sep 2017 01:36:58 -0600 Subject: [PATCH 12/15] Adds documentation for the proposed AirVisual sensor platform (#3321) * Adds documentation for the proposed AirVisual sensor platform * Fixed small typo --- source/_components/sensor.airvisual.markdown | 112 +++++++++++++++++++ source/images/supported_brands/airvisual.jpg | Bin 0 -> 17694 bytes 2 files changed, 112 insertions(+) create mode 100644 source/_components/sensor.airvisual.markdown create mode 100644 source/images/supported_brands/airvisual.jpg diff --git a/source/_components/sensor.airvisual.markdown b/source/_components/sensor.airvisual.markdown new file mode 100644 index 00000000000..98686274dcd --- /dev/null +++ b/source/_components/sensor.airvisual.markdown @@ -0,0 +1,112 @@ +--- +layout: page +title: "AirVisual" +description: "Instructions on how to use AirVisual data within Home Assistant" +date: 2017-09-06 12:15 +sidebar: true +comments: false +sharing: true +footer: true +logo: airvisual.jpg +ha_category: Health +ha_release: 0.53 +ha_iot_class: "Cloud Polling" +--- + +The `airvisual` sensor platform queries the [AirVisual](https://airvisual.com/) API for air quality +data on the nearest city to a latitude and longitude. The resulting information +creates sensors for the Air Quality Index (AQI), the human-friendly air quality +level, and the main pollutant of that area. Sensors that conform to either/both +the [U.S. and Chinese air quality standards](http://www.clm.com/publication.cfm?ID=366) can be created. + +This platform requires an AirVisual API key, which can be obtained [here](https://airvisual.com/api). Note +that the platform was designed using the "Community" package; the "Startup" +and "Enterprise" package keys should continue to function, but actual results +may vary (or not work at all). + +

+The "Community" API key is limited to 10,000 calls per month. In order to leave +a buffer, the `airvisual` platform queries the API every 10 minutes. +

+ +## {% linkable_title Configuring the Platform %} + +To enable this platform, add the following lines to your `configuration.yaml` +file: + +```yaml +sensor: + - platform: airvisual + api_key: abc123 + monitored_conditions: + - us + - cn + latitude: 42.81212 + longitude: 108.12422 + radius: 500 +``` + +Configuration variables: + +- **api_key** (*Required*): your AirVisual API key +- **monitored_conditions** (*Required*): the air quality standard(s) to use +(`us` for U.S., `cn` for Chinese) +- **latitude** (*Optional*): the latitude to monitor; if excluded, the latitude +defined in `configuration.yaml` will be used +- **longitude** (*Optional*): the longitude to monitor; if excluded, the longitude +defined in `configuration.yaml` will be used +- **radius** (*Optional*): the radius (in meters) around the latitude/longitude to +search for the nearest city; defaults to `1000` + +## {% linkable_title Sensor Types %} + +When configured, the platform will create three sensors for each configured +air quality standard: + +### Air Quality Index + +**Description:** This sensor displays a numeric air quality index (AQI), a metric +for the overall "health" of the air. + +**Example Sensor Name:** `sensor.chinese_air_quality_index` + +**Example Sensor Value:** `32` + +**Explanation:** + +AQI | Status | Description +------- | :----------------: | ---------- +0 - 50 | **Good** | Air quality is considered satisfactory, and air pollution poses little or no risk +51 - 100 | **Moderate** | Air quality is acceptable; however, for some pollutants there may be a moderate health concern for a very small number of people who are unusually sensitive to air pollution +101 - 150 | **Unhealthy for Sensitive Groups** | Members of sensitive groups may experience health effects. The general public is not likely to be affected +151 - 200 | **Unhealthy** | Everyone may begin to experience health effects; members of sensitive groups may experience more serious health effects +201 - 300 | **Very unhealthy** | Health warnings of emergency conditions. The entire population is more likely to be affected +301+ | **Hazardous** | Health alert: everyone may experience more serious health effects + +### Air Polution Level + +**Description:** This sensor displays the associated `Status` (from the above +table) for the current AQI. + +**Sample Sensor Name:** `sensor.us_air_pollution_level` + +**Example Sensor Value:** `Moderate` + +### Main Pollutant + +**Description:** This sensor displays the pollutant whose value is currently +highest. + +**Sample Sensor Name:** `sensor.us_main_pollutant` + +**Example Sensor Value:** `PM2.5` + +**Explanation:** + +Pollutant | Symbol | More Info +------- | :----------------: | ---------- +Particulate (<= 2.5 μm) | PM2.5 | [EPA: Particulate Matter (PM) Pollution ](https://www.epa.gov/pm-pollution) +Particulate (<= 10 μm) | PM10 | [EPA: Particulate Matter (PM) Pollution ](https://www.epa.gov/pm-pollution) +Ozone | O | [EPA: Ozone Pollution](https://www.epa.gov/ozone-pollution) +Sulpher Dioxide | SO2 | [EPA: Sulfur Dioxide (SO2) Pollution](https://www.epa.gov/so2-pollution) +Carbon Monoxide | CO | [EPA: Carbon Monoxide (CO) Pollution in Outdoor Air](https://www.epa.gov/co-pollution) diff --git a/source/images/supported_brands/airvisual.jpg b/source/images/supported_brands/airvisual.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ddce6892ae7b2fcaf936bdb680833892ffceab87 GIT binary patch literal 17694 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 literal 0 HcmV?d00001 From e2a6ff4c9314148db1602a51b6357815146a7fc9 Mon Sep 17 00:00:00 2001 From: runningman84 Date: Sat, 9 Sep 2017 09:39:40 +0200 Subject: [PATCH 13/15] Added docs for DWD WarnApp Sensor (#3062) * Added docs for dwdwarnapp * Updated documentation As suggested by Landrash --- source/_components/sensor.dwdwarnapp.markdown | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 source/_components/sensor.dwdwarnapp.markdown diff --git a/source/_components/sensor.dwdwarnapp.markdown b/source/_components/sensor.dwdwarnapp.markdown new file mode 100644 index 00000000000..618794ea4cb --- /dev/null +++ b/source/_components/sensor.dwdwarnapp.markdown @@ -0,0 +1,43 @@ +--- +layout: page +title: "DWD Warn Weather" +description: "Instructions on how to integrate Deutsche Wetter Dienst weather warnings into Home Assistant." +date: 2017-07-26 22:00 +sidebar: true +comments: false +sharing: true +footer: true +#logo: dwdwarnapp.png +ha_category: Weather +ha_release: 0.51 +ha_iot_class: "Cloud Polling" +--- + +The `dwdwarnapp` sensor platform uses the [Deutsche Wetter Dienst (DWD)](http://www.dwd.de) as a source for current and advance warnings. + +- A name is optional but if multiple regions are used a name will be required. +- The sensor checks for new data every 15 minutes. + +To add the DWD WarnApp sensor to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: dwdwarnapp + region_name: Hansestadt Hamburg +``` + +To get the region name: +- Find your region here: `https://www.dwd.de/DE/wetter/warnungen_landkreise/warnWetter_node.html?ort=Hamburg` +- Verify if you find any warning for your region here: `https://www.dwd.de/DWD/warnungen/warnapp_landkreise/json/warnings.json?jsonp=loadWarnings` + +The warning level is between 0 (no danger) and 4 (warnings of extreme weather): +- Warnungen vor extremem Unwetter (Stufe 4) +- Unwetterwarnungen (Stufe 3) +- Warnungen vor markantem Wetter (Stufe 2) +- Wetterwarnungen (Stufe 1) + +Configuration variables: + +- **region_name** (*Optional*): The region name string as identified from the DWD website. If not given, defaults to Hansestadt Hamburg. +- **name** (*Optional*): The name you would like to give to the warnapp sensor. From 3ea0f18dc2bc119c16a75eebb33c97a046434fa1 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Sat, 9 Sep 2017 09:48:33 +0200 Subject: [PATCH 14/15] Add missing text node (#3109) --- source/_components/apiai.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/apiai.markdown b/source/_components/apiai.markdown index 4e96645e498..664540b6a1c 100644 --- a/source/_components/apiai.markdown +++ b/source/_components/apiai.markdown @@ -70,7 +70,7 @@ apiai: intent_script: Temperature: - speech: + speech: text: The temperature at home is {{ states('sensor.home_temp') }} degrees LocateIntent: speech: From d55564cc6e430f23459d0e34135d817dec66fd3f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 9 Sep 2017 00:50:01 -0700 Subject: [PATCH 15/15] Add blog post --- _config.yml | 8 +- ...=> media_player.yamaha_musiccast.markdown} | 0 source/_components/sensor.season.markdown | 29 ++ source/_posts/2017-09-09-release-53.markdown | 451 ++++++++++++++++++ .../images/blog/2017-09-0.53/components.png | Bin 0 -> 34150 bytes .../blog/2017-09-0.53/customize-editor.png | Bin 0 -> 24615 bytes 6 files changed, 484 insertions(+), 4 deletions(-) rename source/_components/{media_player.yamaha_multicast.markdown => media_player.yamaha_musiccast.markdown} (100%) create mode 100644 source/_components/sensor.season.markdown create mode 100644 source/_posts/2017-09-09-release-53.markdown create mode 100644 source/images/blog/2017-09-0.53/components.png create mode 100644 source/images/blog/2017-09-0.53/customize-editor.png diff --git a/_config.yml b/_config.yml index ff5e1e7a0dc..df6d10b5780 100644 --- a/_config.yml +++ b/_config.yml @@ -139,12 +139,12 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 52 -current_patch_version: 1 -date_released: 2017-08-28 +current_minor_version: 53 +current_patch_version: 0 +date_released: 2017-09-9 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. # Major release: -patch_version_notes: "#release-0521---august-28" +patch_version_notes: "#" # Minor release (Example #release-0431---april-25): diff --git a/source/_components/media_player.yamaha_multicast.markdown b/source/_components/media_player.yamaha_musiccast.markdown similarity index 100% rename from source/_components/media_player.yamaha_multicast.markdown rename to source/_components/media_player.yamaha_musiccast.markdown diff --git a/source/_components/sensor.season.markdown b/source/_components/sensor.season.markdown new file mode 100644 index 00000000000..a2d21e35235 --- /dev/null +++ b/source/_components/sensor.season.markdown @@ -0,0 +1,29 @@ +--- +layout: page +title: "Season Sensor" +description: "Instructions how to add season sensors into Home Assistant." +date: 2017-07-04 07:00:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Sensor +ha_iot_class: "Local Polling" +ha_release: 0.53 +--- + +This sensor will display the current astronomical or meteorological season (Spring, Summer, Autumn, Winter) based on the users setting in the config file. + +All information about how the seasons work was taken from Wikipedia: + + - [https://en.wikipedia.org/wiki/Season#Astronomical](https://en.wikipedia.org/wiki/Season#Astronomical) + - [https://en.wikipedia.org/wiki/Equinox](https://en.wikipedia.org/wiki/Equinox) + - [https://en.wikipedia.org/wiki/Solstice](https://en.wikipedia.org/wiki/Solstice) + + +```yaml +# Example configuration.yaml entry +sensor: + - platform: season + type: astronomical (optional, will default to astronomical) +``` diff --git a/source/_posts/2017-09-09-release-53.markdown b/source/_posts/2017-09-09-release-53.markdown new file mode 100644 index 00000000000..f056fc6ead6 --- /dev/null +++ b/source/_posts/2017-09-09-release-53.markdown @@ -0,0 +1,451 @@ +--- +layout: post +title: "0.53: Tesla, Customize editor, and super fast KNX rewrite" +description: "Also now supports a text input UI component, Mopar and Geofency." +date: 2017-09-09 00:11:05 +date_formatted: "September 9, 2017" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2017-09-0.53/components.png +--- + + + +The Home Assistant community has been super busy in the last two weeks to bring you this amazing release. 60 different contributors have done over a 100 PRs filled with new features, bug fixes and performance improvements. + +9 days away from our 4th birthday, we've just accomplished a couple of great milestones that I would love to share with you. We've hit over 8000 stars 🌟 on GitHub and starting this release we now ship over 800 platforms and components! + +## Customize editor + +Another step in making Home Assistant configurable via the frontend has been contributed by @andrey-git: a customization editor! You are now able to inspect all (possible) customizations of an entity and update them with just a few taps. Want to change the name or icon of an entity? All possible in mere seconds. + +

+ +Screenshot of the new customize editor. +

+ +New Home Assistant configurations will be created correctly automatically. If you are an existing user, make sure you have the config screen enabled and that you include customizations from `customize.yaml`. + +```yaml +# Example configuration.yaml entry +homeassistant: + # Include the customizations. + customize: !include customize.yaml + +# Enable the config screen +config: +``` + +## Tesla + +Thanks to the contribution by @zabuldon, you will now be able to control your Tesla car from Home Assistant. You're able to check the temperature inside and outside your car, control your AC and unlock the car. + +## Input text + +This release introduces a new input component: `input_text` contributed by @BioSehnsucht. With this component you will be able to set free form from the UI and then let that be used by your automations or templates. + +## KNX + +This release ships a new KNX implementation thanks to @Julius2342. It will instantly show all changed states of KNX devices within Home Assistant. Additionally it brings support for HVAC devices and notification services. It also adds a service for direct communication with the KNX bus. You can connect to KNX/IP routing and tunnelling devices. In the background it uses asyncio communication. Check the climate integration in action [here](https://www.youtube.com/watch?v=JI0VJzlGpx4) and see the lights in action below: + +
+ +
+ +## New Platforms + +- Xiaomi Philips Lights integration ([@syssi] - [#9087]) ([light.xiaomi_philipslight docs]) (new-platform) +- Mycroft notify/component ([@btotharye] - [#9173]) ([mycroft docs]) ([notify.mycroft docs]) (new-platform) +- Add counter component ([@fabaff] - [#9146]) ([counter docs]) (new-platform) +- Support for season sensor ([@w1ll1am23] - [#8958]) ([sensor.season docs]) (new-platform) +- Abode push events and lock, cover, and switch components ([@1091741+MisterWil] - [#9095]) ([abode docs]) ([alarm_control_panel.abode docs]) ([binary_sensor.abode docs]) ([cover.abode docs]) ([lock.abode docs]) ([switch.abode docs]) (new-platform) +- Bayesian Binary Sensor ([@jlmcgehee21] - [#8810]) ([binary_sensor.bayesian docs]) (new-platform) +- Add Tank Utility sensor ([@krismolendyke] - [#9132]) ([sensor.tank_utility docs]) (new-platform) +- Tesla platform ([@zabuldon] - [#9211]) ([tesla docs]) ([binary_sensor.tesla docs]) ([climate.tesla docs]) ([device_tracker.tesla docs]) ([lock.tesla docs]) ([sensor.tesla docs]) (new-platform) +- mopar sensor ([@happyleavesaoc] - [#9136]) ([sensor.mopar docs]) (new-platform) +- Add Geofency device tracker ([@gunnarhelgason] - [#9106]) ([device_tracker.geofency docs]) (new-platform) +- Added DWD WarnApp Sensor ([@runningman84] - [#8657]) ([sensor.dwd_warnapp docs]) (new-platform) +- Add input_text component ([@BioSehnsucht] - [#9112]) ([input_text docs]) (new-platform) +- Introducing a media_player component for Yamaha Multicast devices ([@jalmeroth] - [#9258]) ([media_player.yamaha_musiccast docs]) (new-platform) +- Stable and asynchronous KNX library. ([@Julius2342] - [#8725]) ([knx docs]) ([binary_sensor.knx docs]) ([climate.knx docs]) ([cover.knx docs]) ([light.knx docs]) ([sensor.knx docs]) ([switch.knx docs]) (new-platform) +- Adds the AirVisual air quality sensor platform ([@bachya] - [#9320]) ([sensor.airvisual docs]) (new-platform) + +## {% linkable_title If you need help... %} +...don't hesitate to use our very active [forums][forum] or join us for a little [chat][discord]. The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. + +## {% linkable_title Reporting Issues %} +Experiencing issues introduced by this release? Please report them in our [issue tracker][issue]. Make sure to fill in all fields of the issue template. + + + +## Breaking Changes + +- The new customize editor is using the file `customize.yaml` in your config folder. If you are using this file today for other config, make sure to rename it before using the new customize UI editor. ([@andrey-git] - [#9134]) ([config docs]) (breaking change) (new-platform) +- The frontend component now supports loading custom html files when Home Assistant front end starts ([@andrey-git] - [#9150]) (breaking change). It could be Javascript, CSS or custom Web Components. Along there was a breaking change in the way Custom UI is used: + * `custom_ui_state_card` now specifies the exact element name and not a suffix after `state-card`. So if you had `state_card_custom_ui: custom-ui` in your config, you should change it to `state_card_custom_ui: state-card-custom-ui` + * `custom_ui_state_card` no longer makes the html fetch, you should make it separately: + +``` +frontend: + extra_html_url: + - /local/custom_ui/state-card-custom-ui.html +``` + +- The Egardia alarm control panel now defaults to port 52010 instead of 85. ([@jeroenterheerdt] - [#9225]) ([alarm_control_panel.egardia docs]) (breaking change) +- The Homematic `delay` option has been dropped because it is no longer necessary ([@pvizeli] - [#9058]) ([homematic docs]) ([binary_sensor.homematic docs]) ([climate.homematic docs]) ([cover.homematic docs]) ([light.homematic docs]) ([sensor.homematic docs]) ([switch.homematic docs]) (breaking change) +- Switch - Dlink: Remove spaces and capital letters from attribute names for consistency ([@emlt] - [#9277]) ([switch.dlink docs]) (breaking change) + +## All changes + +- Xiaomi Philips Lights integration ([@syssi] - [#9087]) ([light.xiaomi_philipslight docs]) (new-platform) +- Backend changes for customize config panel. ([@andrey-git] - [#9134]) ([config docs]) (breaking change) +- Upgrade async_timeout to 1.3.0 ([@fabaff] - [#9156]) +- Remove links to gitter ([@fabaff] - [#9155]) +- Upgrade sphinx-autodoc-typehints to 1.2.3 ([@fabaff] - [#9151]) +- Upgrade uber_rides to 0.5.2 ([@fabaff] - [#9149]) ([sensor.uber docs]) +- Allow specifying custom html urls to load. ([@andrey-git] - [#9150]) (breaking change) +- Allow getting number of available states in template ([@balloob] - [#9158]) +- upgrade xiaomi lib to 0.3.1 to supprt water sensor ([@danielhiversen] - [#9168]) ([xiaomi docs]) +- Use node_modules gulp in script/build_frontend ([@armills] - [#9170]) +- Mysensors nodes can be renamed in config file ([@EmitKiwi] - [#9123]) ([mysensors docs]) +- Xiaomi gateway: Device support for the Aqara Water Leak Sensor (sensor_wleak.aq1) ([@syssi] - [#9172]) ([xiaomi docs]) ([binary_sensor.xiaomi docs]) +- "TypeError: write_to_hub() takes 2 positional arguments but 4 were given" fixed. ([@syssi] - [#9174]) ([cover.xiaomi docs]) +- Mycroft notify/component ([@btotharye] - [#9173]) ([mycroft docs]) ([notify.mycroft docs]) (new-platform) +- Fix dht22 when no data was read initially #8976 ([@maweki] - [#9198]) ([sensor.dht docs]) +- Update pushbullet.py ([@bobnwk] - [#9200]) ([notify.pushbullet docs]) +- fix worldtidesinfo #9184 ([@aetolus] - [#9201]) ([sensor.worldtidesinfo docs]) +- Add "status" to Sonarr sensor ([@tboyce021] - [#9204]) ([sensor.radarr docs]) ([sensor.sonarr docs]) +- Prevent error when no forecast data was available ([@mjj4791] - [#9176]) ([sensor.buienradar docs]) +- Fix and optimize digitalloggers platform ([@dale3h] - [#9203]) ([switch.digitalloggers docs]) +- Add counter component ([@fabaff] - [#9146]) ([counter docs]) (new-platform) +- Support for season sensor ([@w1ll1am23] - [#8958]) ([sensor.season docs]) (new-platform) +- Issue #6893 in rfxtrx ([@danielhiversen] - [#9130]) ([rfxtrx docs]) +- Refactor rfxtrx ([@danielhiversen] - [#9117]) ([rfxtrx docs]) ([cover.rfxtrx docs]) ([light.rfxtrx docs]) ([switch.rfxtrx docs]) +- Upgrade pymysensors to 0.11.1 ([@MartinHjelmare] - [#9212]) ([mysensors docs]) +- Abode push events and lock, cover, and switch components ([@1091741+MisterWil] - [#9095]) ([abode docs]) ([alarm_control_panel.abode docs]) ([binary_sensor.abode docs]) ([cover.abode docs]) ([lock.abode docs]) ([switch.abode docs]) (new-platform) +- Add cloud auth support ([@balloob] - [#9208]) +- Bayesian Binary Sensor ([@jlmcgehee21] - [#8810]) ([binary_sensor.bayesian docs]) (new-platform) +- directv: extended discovery via REST api, bug fix ([@sielicki] - [#8800]) ([media_player.directv docs]) +- Upgrade pyasn1 to 0.3.3 and pyasn1-modules to 0.1.1 ([@fabaff] - [#9216]) ([notify.xmpp docs]) +- Upgrade sendgrid to 5.0.1 ([@fabaff] - [#9215]) ([notify.sendgrid docs]) +- Fix fitbit error when trying to access token after upgrade. ([@tchellomello] - [#9183]) ([sensor.fitbit docs]) +- Allow sonos to select album as a source ([@commento] - [#9221]) ([media_player.sonos docs]) +- Add max_age to statistics sensor ([@tinloaf] - [#8790]) ([sensor.statistics docs]) +- Egardia package to .19 and change in port number for egardiaserver ([@jeroenterheerdt] - [#9225]) ([alarm_control_panel.egardia docs]) (breaking change) +- pushbullet, send a file from url ([@danielhiversen] - [#9189]) ([notify.pushbullet docs]) +- Add Tank Utility sensor ([@krismolendyke] - [#9132]) ([sensor.tank_utility docs]) (new-platform) +- Upgrade shodan to 1.7.5 ([@fabaff] - [#9228]) ([sensor.shodan docs]) +- Tesla platform ([@zabuldon] - [#9211]) ([tesla docs]) ([binary_sensor.tesla docs]) ([climate.tesla docs]) ([device_tracker.tesla docs]) ([lock.tesla docs]) ([sensor.tesla docs]) (new-platform) +- [light.tradfri] Full range of white spectrum lightbulbs support ([@matemaciek] - [#9224]) ([tradfri docs]) ([light.tradfri docs]) +- Allow panels with external URL ([@andrey-git] - [#9214]) +- Use ZCL mandatory attribute to determine ZHA light capabilities ([@jkl1337] - [#9232]) ([light.zha docs]) +- A bugfix for pushbullet ([@danielhiversen] - [#9237]) ([notify.pushbullet docs]) +- mopar sensor ([@happyleavesaoc] - [#9136]) ([sensor.mopar docs]) (new-platform) +- Upgrade discord.py to 0.16.11 ([@fabaff] - [#9239]) ([notify.discord docs]) +- Skip automatic events older than latest data ([@armills] - [#9230]) ([device_tracker.automatic docs]) +- title and message was swapped in pushbullet ([@danielhiversen] - [#9241]) ([notify.pushbullet docs]) +- Fix possible KeyError ([@MartinHjelmare] - [#9242]) ([mysensors docs]) +- WIP: Homematic improvments with new hass interfaces ([@pvizeli] - [#9058]) ([homematic docs]) ([binary_sensor.homematic docs]) ([climate.homematic docs]) ([cover.homematic docs]) ([light.homematic docs]) ([sensor.homematic docs]) ([switch.homematic docs]) (breaking change) +- Add available to sonos ([@pvizeli] - [#9243]) ([media_player.sonos docs]) +- Make sure Ring binary_sensor state will update only if device_id matches ([@tchellomello] - [#9247]) ([binary_sensor.ring docs]) +- Added configurable timeout for receiver HTTP requests | Additional AV… ([@scarface-4711] - [#9244]) ([media_player.denonavr docs]) +- upgrade xiaomi lib ([@danielhiversen] - [#9250]) ([xiaomi docs]) +- Fix nello.io login ([@pschmitt] - [#9251]) ([lock.nello docs]) +- This is to fix #6386: Manual Alarm not re-arm after 2nd trigger ([@snjoetw] - [#9249]) ([alarm_control_panel.manual docs]) +- Version bump of DLink switch to v0.6.0 ([@LinuxChristian] - [#9252]) ([switch.dlink docs]) +- Upgrade sendgrid to 5.2.0 ([@fabaff] - [#9254]) ([notify.sendgrid docs]) +- Upgrade psutil to 5.3.0 ([@fabaff] - [#9253]) ([sensor.systemmonitor docs]) +- Adding ZWave CentralScene activation handler. ([@sirmalloc] - [#9178]) ([zwave docs]) +- Add Geofency device tracker ([@gunnarhelgason] - [#9106]) ([device_tracker.geofency docs]) (new-platform) +- flux: fix for when stop_time is after midnight ([@abmantis] - [#8932]) +- Change attribute names ([@emlt] - [#9277]) ([switch.dlink docs]) (breaking change) +- insteon_plm: fix typo in attributes ([@drkp] - [#9284]) ([insteon_plm docs]) +- discovery: If unknown NetDisco service discovered, log about it. ([@pfalcon] - [#9280]) +- Upgrade youtube_dl to 2017.9.2 ([@fabaff] - [#9279]) ([media_extractor docs]) +- Upgrade python-telegram-bot to 8.0.0 ([@fabaff] - [#9282]) ([telegram_bot docs]) ([switch.rest docs]) +- rfxtrx lib upgrade ([@danielhiversen] - [#9288]) ([rfxtrx docs]) +- Fixing bug when using egardiaserver - package requirement updated to 1.0.20. ([@jeroenterheerdt] - [#9294]) ([alarm_control_panel.egardia docs]) +- Added intent_type to exception log ([@andreasjacobsen93] - [#9289]) ([snips docs]) +- Handle spotify failing to refresh access_token ([@Tommatheussen] - [#9295]) ([media_player.spotify docs]) +- Core track same state for a period / Allow on platforms ([@pvizeli] - [#9273]) +- Improved Lutron Caseta shade support ([@30200174+upsert] - [#9302]) ([lutron_caseta docs]) ([cover.lutron_caseta docs]) ([light.lutron_caseta docs]) ([switch.lutron_caseta docs]) +- Upgrade mycroftapi to 2.0 ([@btotharye] - [#9309]) ([mycroft docs]) +- Fix for Honeywell Round thermostats ([@dansarginson] - [#9308]) ([climate.honeywell docs]) +- Update jinja to 2.9.6 ([@pvizeli] - [#9306]) +- Ensure display-name does not exceed 12 characters for CecAdapter. ([@gollo] - [#9268]) ([hdmi_cec docs]) +- Expose hue group 0 ([@filcole] - [#8663]) ([light.hue docs]) +- Added DWD WarnApp Sensor ([@runningman84] - [#8657]) ([sensor.dwd_warnapp docs]) (new-platform) +- Add input_text component ([@BioSehnsucht] - [#9112]) ([input_text docs]) (new-platform) +- Introducing a media_player component for Yamaha Multicast devices ([@jalmeroth] - [#9258]) ([media_player.yamaha_musiccast docs]) (new-platform) +- Handle the case where no registration number is available (instead display VIN (vehicle identification number)). ([@molobrakos] - [#9073]) ([volvooncall docs]) ([device_tracker.volvooncall docs]) +- Add post_pending_state attribute to manual alarm_control_panel ([@snjoetw] - [#9291]) ([alarm_control_panel.manual docs]) +- Add new config variable to MQTT light ([@belyalov] - [#9304]) ([light.mqtt docs]) +- Follow Twitter guidelines for media upload by conforming to the "STATUS" phase, when required, and by providing "media_category" information. These will, for example, allow users to upload videos that exceed the basic 30 second limit. ([@MikeChristianson] - [#9261]) ([notify.twitter docs]) +- Optionally disable ssl certificate validity check. ([@1868995+ohmer1] - [#9181]) ([notify.xmpp docs]) +- Version bump dlib to 1.0.0 ([@arsaboo] - [#9316]) ([image_processing.dlib_face_detect docs]) ([image_processing.dlib_face_identify docs]) +- Fixed bug with devices not being discovered correctly. ([@1091741+MisterWil] - [#9311]) ([abode docs]) +- Platform not ready behavior fixed. ([@syssi] - [#9325]) ([light.xiaomi_philipslight docs]) +- Stable and asynchronous KNX library. ([@Julius2342] - [#8725]) ([knx docs]) ([binary_sensor.knx docs]) ([climate.knx docs]) ([cover.knx docs]) ([light.knx docs]) ([sensor.knx docs]) ([switch.knx docs]) (new-platform) +- Fix for potential issue with tesla initialization ([@zabuldon] - [#9307]) ([tesla docs]) +- Adds the AirVisual air quality sensor platform ([@bachya] - [#9320]) ([sensor.airvisual docs]) (new-platform) +- Cleanup input_text ([@balloob] - [#9326]) ([input_text docs]) +- Bump pyHik version to add IO support ([@mezz64] - [#9341]) ([binary_sensor.hikvision docs]) + +[#8657]: https://github.com/home-assistant/home-assistant/pull/8657 +[#8663]: https://github.com/home-assistant/home-assistant/pull/8663 +[#8725]: https://github.com/home-assistant/home-assistant/pull/8725 +[#8790]: https://github.com/home-assistant/home-assistant/pull/8790 +[#8800]: https://github.com/home-assistant/home-assistant/pull/8800 +[#8810]: https://github.com/home-assistant/home-assistant/pull/8810 +[#8932]: https://github.com/home-assistant/home-assistant/pull/8932 +[#8958]: https://github.com/home-assistant/home-assistant/pull/8958 +[#9058]: https://github.com/home-assistant/home-assistant/pull/9058 +[#9073]: https://github.com/home-assistant/home-assistant/pull/9073 +[#9087]: https://github.com/home-assistant/home-assistant/pull/9087 +[#9095]: https://github.com/home-assistant/home-assistant/pull/9095 +[#9106]: https://github.com/home-assistant/home-assistant/pull/9106 +[#9112]: https://github.com/home-assistant/home-assistant/pull/9112 +[#9117]: https://github.com/home-assistant/home-assistant/pull/9117 +[#9123]: https://github.com/home-assistant/home-assistant/pull/9123 +[#9130]: https://github.com/home-assistant/home-assistant/pull/9130 +[#9132]: https://github.com/home-assistant/home-assistant/pull/9132 +[#9134]: https://github.com/home-assistant/home-assistant/pull/9134 +[#9136]: https://github.com/home-assistant/home-assistant/pull/9136 +[#9146]: https://github.com/home-assistant/home-assistant/pull/9146 +[#9149]: https://github.com/home-assistant/home-assistant/pull/9149 +[#9150]: https://github.com/home-assistant/home-assistant/pull/9150 +[#9151]: https://github.com/home-assistant/home-assistant/pull/9151 +[#9155]: https://github.com/home-assistant/home-assistant/pull/9155 +[#9156]: https://github.com/home-assistant/home-assistant/pull/9156 +[#9158]: https://github.com/home-assistant/home-assistant/pull/9158 +[#9168]: https://github.com/home-assistant/home-assistant/pull/9168 +[#9170]: https://github.com/home-assistant/home-assistant/pull/9170 +[#9172]: https://github.com/home-assistant/home-assistant/pull/9172 +[#9173]: https://github.com/home-assistant/home-assistant/pull/9173 +[#9174]: https://github.com/home-assistant/home-assistant/pull/9174 +[#9176]: https://github.com/home-assistant/home-assistant/pull/9176 +[#9178]: https://github.com/home-assistant/home-assistant/pull/9178 +[#9181]: https://github.com/home-assistant/home-assistant/pull/9181 +[#9183]: https://github.com/home-assistant/home-assistant/pull/9183 +[#9189]: https://github.com/home-assistant/home-assistant/pull/9189 +[#9198]: https://github.com/home-assistant/home-assistant/pull/9198 +[#9200]: https://github.com/home-assistant/home-assistant/pull/9200 +[#9201]: https://github.com/home-assistant/home-assistant/pull/9201 +[#9203]: https://github.com/home-assistant/home-assistant/pull/9203 +[#9204]: https://github.com/home-assistant/home-assistant/pull/9204 +[#9208]: https://github.com/home-assistant/home-assistant/pull/9208 +[#9211]: https://github.com/home-assistant/home-assistant/pull/9211 +[#9212]: https://github.com/home-assistant/home-assistant/pull/9212 +[#9214]: https://github.com/home-assistant/home-assistant/pull/9214 +[#9215]: https://github.com/home-assistant/home-assistant/pull/9215 +[#9216]: https://github.com/home-assistant/home-assistant/pull/9216 +[#9221]: https://github.com/home-assistant/home-assistant/pull/9221 +[#9224]: https://github.com/home-assistant/home-assistant/pull/9224 +[#9225]: https://github.com/home-assistant/home-assistant/pull/9225 +[#9228]: https://github.com/home-assistant/home-assistant/pull/9228 +[#9230]: https://github.com/home-assistant/home-assistant/pull/9230 +[#9232]: https://github.com/home-assistant/home-assistant/pull/9232 +[#9237]: https://github.com/home-assistant/home-assistant/pull/9237 +[#9239]: https://github.com/home-assistant/home-assistant/pull/9239 +[#9241]: https://github.com/home-assistant/home-assistant/pull/9241 +[#9242]: https://github.com/home-assistant/home-assistant/pull/9242 +[#9243]: https://github.com/home-assistant/home-assistant/pull/9243 +[#9244]: https://github.com/home-assistant/home-assistant/pull/9244 +[#9247]: https://github.com/home-assistant/home-assistant/pull/9247 +[#9249]: https://github.com/home-assistant/home-assistant/pull/9249 +[#9250]: https://github.com/home-assistant/home-assistant/pull/9250 +[#9251]: https://github.com/home-assistant/home-assistant/pull/9251 +[#9252]: https://github.com/home-assistant/home-assistant/pull/9252 +[#9253]: https://github.com/home-assistant/home-assistant/pull/9253 +[#9254]: https://github.com/home-assistant/home-assistant/pull/9254 +[#9258]: https://github.com/home-assistant/home-assistant/pull/9258 +[#9261]: https://github.com/home-assistant/home-assistant/pull/9261 +[#9268]: https://github.com/home-assistant/home-assistant/pull/9268 +[#9273]: https://github.com/home-assistant/home-assistant/pull/9273 +[#9277]: https://github.com/home-assistant/home-assistant/pull/9277 +[#9279]: https://github.com/home-assistant/home-assistant/pull/9279 +[#9280]: https://github.com/home-assistant/home-assistant/pull/9280 +[#9282]: https://github.com/home-assistant/home-assistant/pull/9282 +[#9284]: https://github.com/home-assistant/home-assistant/pull/9284 +[#9288]: https://github.com/home-assistant/home-assistant/pull/9288 +[#9289]: https://github.com/home-assistant/home-assistant/pull/9289 +[#9291]: https://github.com/home-assistant/home-assistant/pull/9291 +[#9294]: https://github.com/home-assistant/home-assistant/pull/9294 +[#9295]: https://github.com/home-assistant/home-assistant/pull/9295 +[#9302]: https://github.com/home-assistant/home-assistant/pull/9302 +[#9304]: https://github.com/home-assistant/home-assistant/pull/9304 +[#9306]: https://github.com/home-assistant/home-assistant/pull/9306 +[#9307]: https://github.com/home-assistant/home-assistant/pull/9307 +[#9308]: https://github.com/home-assistant/home-assistant/pull/9308 +[#9309]: https://github.com/home-assistant/home-assistant/pull/9309 +[#9311]: https://github.com/home-assistant/home-assistant/pull/9311 +[#9316]: https://github.com/home-assistant/home-assistant/pull/9316 +[#9320]: https://github.com/home-assistant/home-assistant/pull/9320 +[#9325]: https://github.com/home-assistant/home-assistant/pull/9325 +[#9326]: https://github.com/home-assistant/home-assistant/pull/9326 +[#9341]: https://github.com/home-assistant/home-assistant/pull/9341 +[@1091741+MisterWil]: https://github.com/1091741+MisterWil +[@1868995+ohmer1]: https://github.com/1868995+ohmer1 +[@30200174+upsert]: https://github.com/30200174+upsert +[@BioSehnsucht]: https://github.com/BioSehnsucht +[@EmitKiwi]: https://github.com/EmitKiwi +[@Julius2342]: https://github.com/Julius2342 +[@LinuxChristian]: https://github.com/LinuxChristian +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@MikeChristianson]: https://github.com/MikeChristianson +[@Tommatheussen]: https://github.com/Tommatheussen +[@abmantis]: https://github.com/abmantis +[@aetolus]: https://github.com/aetolus +[@andreasjacobsen93]: https://github.com/andreasjacobsen93 +[@andrey-git]: https://github.com/andrey-git +[@armills]: https://github.com/armills +[@arsaboo]: https://github.com/arsaboo +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@belyalov]: https://github.com/belyalov +[@bobnwk]: https://github.com/bobnwk +[@btotharye]: https://github.com/btotharye +[@commento]: https://github.com/commento +[@dale3h]: https://github.com/dale3h +[@danielhiversen]: https://github.com/danielhiversen +[@dansarginson]: https://github.com/dansarginson +[@drkp]: https://github.com/drkp +[@emlt]: https://github.com/emlt +[@fabaff]: https://github.com/fabaff +[@filcole]: https://github.com/filcole +[@gollo]: https://github.com/gollo +[@gunnarhelgason]: https://github.com/gunnarhelgason +[@happyleavesaoc]: https://github.com/happyleavesaoc +[@jalmeroth]: https://github.com/jalmeroth +[@jeroenterheerdt]: https://github.com/jeroenterheerdt +[@jkl1337]: https://github.com/jkl1337 +[@jlmcgehee21]: https://github.com/jlmcgehee21 +[@krismolendyke]: https://github.com/krismolendyke +[@matemaciek]: https://github.com/matemaciek +[@maweki]: https://github.com/maweki +[@mezz64]: https://github.com/mezz64 +[@mjj4791]: https://github.com/mjj4791 +[@molobrakos]: https://github.com/molobrakos +[@pfalcon]: https://github.com/pfalcon +[@pschmitt]: https://github.com/pschmitt +[@pvizeli]: https://github.com/pvizeli +[@runningman84]: https://github.com/runningman84 +[@scarface-4711]: https://github.com/scarface-4711 +[@sielicki]: https://github.com/sielicki +[@sirmalloc]: https://github.com/sirmalloc +[@snjoetw]: https://github.com/snjoetw +[@syssi]: https://github.com/syssi +[@tboyce021]: https://github.com/tboyce021 +[@tchellomello]: https://github.com/tchellomello +[@tinloaf]: https://github.com/tinloaf +[@w1ll1am23]: https://github.com/w1ll1am23 +[@zabuldon]: https://github.com/zabuldon +[abode docs]: https://home-assistant.io/components/abode/ +[alarm_control_panel.abode docs]: https://home-assistant.io/components/alarm_control_panel.abode/ +[alarm_control_panel.egardia docs]: https://home-assistant.io/components/alarm_control_panel.egardia/ +[alarm_control_panel.manual docs]: https://home-assistant.io/components/alarm_control_panel.manual/ +[binary_sensor.abode docs]: https://home-assistant.io/components/binary_sensor.abode/ +[binary_sensor.bayesian docs]: https://home-assistant.io/components/binary_sensor.bayesian/ +[binary_sensor.hikvision docs]: https://home-assistant.io/components/binary_sensor.hikvision/ +[binary_sensor.homematic docs]: https://home-assistant.io/components/binary_sensor.homematic/ +[binary_sensor.ring docs]: https://home-assistant.io/components/binary_sensor.ring/ +[binary_sensor.tesla docs]: https://home-assistant.io/components/binary_sensor.tesla/ +[binary_sensor.xiaomi docs]: https://home-assistant.io/components/binary_sensor.xiaomi/ +[binary_sensor.knx docs]: https://home-assistant.io/components/binary_sensor.knx/ +[climate.homematic docs]: https://home-assistant.io/components/climate.homematic/ +[climate.honeywell docs]: https://home-assistant.io/components/climate.honeywell/ +[climate.tesla docs]: https://home-assistant.io/components/climate.tesla/ +[climate.knx docs]: https://home-assistant.io/components/climate.knx/ +[cloud docs]: https://home-assistant.io/components/cloud/ +[cloud.cloud_api docs]: https://home-assistant.io/components/cloud.cloud_api/ +[cloud.const docs]: https://home-assistant.io/components/cloud.const/ +[cloud.http_api docs]: https://home-assistant.io/components/cloud.http_api/ +[cloud.util docs]: https://home-assistant.io/components/cloud.util/ +[config docs]: https://home-assistant.io/components/config/ +[config.customize docs]: https://home-assistant.io/components/config.customize/ +[counter docs]: https://home-assistant.io/components/counter/ +[cover.abode docs]: https://home-assistant.io/components/cover.abode/ +[cover.homematic docs]: https://home-assistant.io/components/cover.homematic/ +[cover.lutron_caseta docs]: https://home-assistant.io/components/cover.lutron_caseta/ +[cover.rfxtrx docs]: https://home-assistant.io/components/cover.rfxtrx/ +[cover.xiaomi docs]: https://home-assistant.io/components/cover.xiaomi/ +[cover.knx docs]: https://home-assistant.io/components/cover.knx/ +[device_tracker.automatic docs]: https://home-assistant.io/components/device_tracker.automatic/ +[device_tracker.geofency docs]: https://home-assistant.io/components/device_tracker.geofency/ +[device_tracker.tesla docs]: https://home-assistant.io/components/device_tracker.tesla/ +[device_tracker.volvooncall docs]: https://home-assistant.io/components/device_tracker.volvooncall/ +[hdmi_cec docs]: https://home-assistant.io/components/hdmi_cec/ +[homematic docs]: https://home-assistant.io/components/homematic/ +[image_processing.dlib_face_detect docs]: https://home-assistant.io/components/image_processing.dlib_face_detect/ +[image_processing.dlib_face_identify docs]: https://home-assistant.io/components/image_processing.dlib_face_identify/ +[input_text docs]: https://home-assistant.io/components/input_text/ +[input_text docs]: https://home-assistant.io/components/input_text/ +[insteon_plm docs]: https://home-assistant.io/components/insteon_plm/ +[light.homematic docs]: https://home-assistant.io/components/light.homematic/ +[light.hue docs]: https://home-assistant.io/components/light.hue/ +[light.lutron_caseta docs]: https://home-assistant.io/components/light.lutron_caseta/ +[light.mqtt docs]: https://home-assistant.io/components/light.mqtt/ +[light.xiaomi_philipslight docs]: https://home-assistant.io/components/light.xiaomi_philipslight/ +[light.rfxtrx docs]: https://home-assistant.io/components/light.rfxtrx/ +[light.tradfri docs]: https://home-assistant.io/components/light.tradfri/ +[light.xiaomi_philipslight docs]: https://home-assistant.io/components/light.xiaomi_philipslight/ +[light.knx docs]: https://home-assistant.io/components/light.knx/ +[light.zha docs]: https://home-assistant.io/components/light.zha/ +[lock.abode docs]: https://home-assistant.io/components/lock.abode/ +[lock.nello docs]: https://home-assistant.io/components/lock.nello/ +[lock.tesla docs]: https://home-assistant.io/components/lock.tesla/ +[lutron_caseta docs]: https://home-assistant.io/components/lutron_caseta/ +[media_extractor docs]: https://home-assistant.io/components/media_extractor/ +[media_player.denonavr docs]: https://home-assistant.io/components/media_player.denonavr/ +[media_player.directv docs]: https://home-assistant.io/components/media_player.directv/ +[media_player.sonos docs]: https://home-assistant.io/components/media_player.sonos/ +[media_player.spotify docs]: https://home-assistant.io/components/media_player.spotify/ +[media_player.yamaha_musiccast docs]: https://home-assistant.io/components/media_player.yamaha_musiccast/ +[mycroft docs]: https://home-assistant.io/components/mycroft/ +[mysensors docs]: https://home-assistant.io/components/mysensors/ +[notify.discord docs]: https://home-assistant.io/components/notify.discord/ +[notify.mycroft docs]: https://home-assistant.io/components/notify.mycroft/ +[notify.pushbullet docs]: https://home-assistant.io/components/notify.pushbullet/ +[notify.sendgrid docs]: https://home-assistant.io/components/notify.sendgrid/ +[notify.twitter docs]: https://home-assistant.io/components/notify.twitter/ +[notify.xmpp docs]: https://home-assistant.io/components/notify.xmpp/ +[rfxtrx docs]: https://home-assistant.io/components/rfxtrx/ +[sensor.airvisual docs]: https://home-assistant.io/components/sensor.airvisual/ +[sensor.buienradar docs]: https://home-assistant.io/components/sensor.buienradar/ +[sensor.dht docs]: https://home-assistant.io/components/sensor.dht/ +[sensor.dwd_warnapp docs]: https://home-assistant.io/components/sensor.dwd_warnapp/ +[sensor.fitbit docs]: https://home-assistant.io/components/sensor.fitbit/ +[sensor.homematic docs]: https://home-assistant.io/components/sensor.homematic/ +[sensor.mopar docs]: https://home-assistant.io/components/sensor.mopar/ +[sensor.radarr docs]: https://home-assistant.io/components/sensor.radarr/ +[sensor.season docs]: https://home-assistant.io/components/sensor.season/ +[sensor.shodan docs]: https://home-assistant.io/components/sensor.shodan/ +[sensor.sonarr docs]: https://home-assistant.io/components/sensor.sonarr/ +[sensor.statistics docs]: https://home-assistant.io/components/sensor.statistics/ +[sensor.systemmonitor docs]: https://home-assistant.io/components/sensor.systemmonitor/ +[sensor.tank_utility docs]: https://home-assistant.io/components/sensor.tank_utility/ +[sensor.tesla docs]: https://home-assistant.io/components/sensor.tesla/ +[sensor.uber docs]: https://home-assistant.io/components/sensor.uber/ +[sensor.worldtidesinfo docs]: https://home-assistant.io/components/sensor.worldtidesinfo/ +[sensor.knx docs]: https://home-assistant.io/components/sensor.knx/ +[snips docs]: https://home-assistant.io/components/snips/ +[switch.abode docs]: https://home-assistant.io/components/switch.abode/ +[switch.digitalloggers docs]: https://home-assistant.io/components/switch.digitalloggers/ +[switch.dlink docs]: https://home-assistant.io/components/switch.dlink/ +[switch.homematic docs]: https://home-assistant.io/components/switch.homematic/ +[switch.lutron_caseta docs]: https://home-assistant.io/components/switch.lutron_caseta/ +[switch.rest docs]: https://home-assistant.io/components/switch.rest/ +[switch.rfxtrx docs]: https://home-assistant.io/components/switch.rfxtrx/ +[switch.knx docs]: https://home-assistant.io/components/switch.knx/ +[telegram_bot docs]: https://home-assistant.io/components/telegram_bot/ +[tesla docs]: https://home-assistant.io/components/tesla/ +[tradfri docs]: https://home-assistant.io/components/tradfri/ +[volvooncall docs]: https://home-assistant.io/components/volvooncall/ +[xiaomi docs]: https://home-assistant.io/components/xiaomi/ +[knx docs]: https://home-assistant.io/components/knx/ +[zwave docs]: https://home-assistant.io/components/zwave/ +[forum]: https://community.home-assistant.io/ +[issue]: https://github.com/home-assistant/home-assistant/issues +[discord]: https://discord.gg/c5DvZ4e diff --git a/source/images/blog/2017-09-0.53/components.png b/source/images/blog/2017-09-0.53/components.png new file mode 100644 index 0000000000000000000000000000000000000000..6cbcb055f2e3442f2c27f4a94c95ddf4ce00beb6 GIT binary patch literal 34150 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 z%0D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 Ddy5;@ literal 0 HcmV?d00001 diff --git a/source/images/blog/2017-09-0.53/customize-editor.png b/source/images/blog/2017-09-0.53/customize-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..066ff547bdd91e89fe44b6cb99340df6618ac8c7 GIT binary patch literal 24615 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 I%R2Hu04ZuwUjP6A literal 0 HcmV?d00001