From 6ba093149734af86bfdaf6c8fdc6be98a9248242 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 25 Aug 2017 22:50:17 +0200 Subject: [PATCH 01/21] Update mariadb.markdown --- source/_addons/mariadb.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_addons/mariadb.markdown b/source/_addons/mariadb.markdown index 548d4d0c1451..6101d25df6a5 100644 --- a/source/_addons/mariadb.markdown +++ b/source/_addons/mariadb.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -Set up a [mariadb](https://mariadb.org/) SQL server. It support multible database, users and permission. If you want only connect from inside use `172.17.0.1` as host address. +Set up a [mariadb](https://mariadb.org/) SQL server. It support multible database, users and permission. If you want only connect from inside use `core-mariadb` as host address. ```json { @@ -17,14 +17,14 @@ Set up a [mariadb](https://mariadb.org/) SQL server. It support multible databas "logins": [ { "username": "hass", - "host": "172.17.0.1", + "host": "homeassistant", "password": "securePassword" } ], "rights": [ { "username": "hass", - "host": "172.17.0.1", + "host": "homeassistant", "database": "homeassistant", "grant": "ALL PRIVILEGES ON" } @@ -51,5 +51,5 @@ Use the following configuration in Home Assistant to use the database above: ```yaml recorder: - db_url: mysql://hass:securePassword@127.0.0.1/homeassistant + db_url: mysql://hass:securePassword@core-mariadb/homeassistant ``` From 1d6a92f72606f5eeced077792178b378a059bf07 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 25 Aug 2017 22:51:39 +0200 Subject: [PATCH 02/21] Update nginx_proxy.markdown --- source/_addons/nginx_proxy.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/_addons/nginx_proxy.markdown b/source/_addons/nginx_proxy.markdown index fab4ac9842d9..7f14e50bee6c 100644 --- a/source/_addons/nginx_proxy.markdown +++ b/source/_addons/nginx_proxy.markdown @@ -23,6 +23,5 @@ Configuration variables: - **domain** (*Required*): Domain they will proxy run with it.

-It is possible to deactive port 80 if you need this for things like `emulate_hue`. It exists a the moment no UI function for that, so you need call Hass.io API with SSH addon: -`curl -d '{"network": {"443/tcp": 443}}' http://172.17.0.2/addons/core_nginx_proxy/options` +It is possible to deactive port 80 if you need this for things like `emulate_hue`. Remove the host port from Network option of this add-on.

From 2b8e24606f1da0f0f9377f99c31f2be4bbb8d11f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 25 Aug 2017 23:02:12 -0700 Subject: [PATCH 03/21] Add release blog post --- _config.yml | 8 +- source/_components/abode.markdown | 2 +- .../alarm_control_panel.abode.markdown | 2 +- .../_components/binary_sensor.abode.markdown | 2 +- ...ir.markdown => sensor.london_air.markdown} | 0 source/_docs/automation/editor.markdown | 8 +- source/_docs/scripts/editor.markdown | 28 ++ source/_includes/asides/docs_navigation.html | 1 + .../_posts/2017-08-26-release-0-52.markdown | 376 ++++++++++++++++++ .../images/blog/2017-08-0.52/components.png | Bin 0 -> 26431 bytes 10 files changed, 415 insertions(+), 12 deletions(-) rename source/_components/{sensor.londond_air.markdown => sensor.london_air.markdown} (100%) create mode 100644 source/_docs/scripts/editor.markdown create mode 100644 source/_posts/2017-08-26-release-0-52.markdown create mode 100644 source/images/blog/2017-08-0.52/components.png diff --git a/_config.yml b/_config.yml index 77f78049d6b5..f62bb6607861 100644 --- a/_config.yml +++ b/_config.yml @@ -142,12 +142,12 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 51 -current_patch_version: 2 -date_released: 2017-08-14 +current_minor_version: 52 +current_patch_version: 0 +date_released: 2017-08-26 # 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-0512--august-14" +patch_version_notes: "#" # Minor release (Example #release-0431---april-25): diff --git a/source/_components/abode.markdown b/source/_components/abode.markdown index 5b1368d4c6d5..59b247f7bf79 100644 --- a/source/_components/abode.markdown +++ b/source/_components/abode.markdown @@ -2,7 +2,7 @@ layout: page title: "Abode Home Security" description: "Instructions on integrating Abode home security with Home Assistant." -date: 2017-08-26 13:28 +date: 2017-08-26 0:28 sidebar: true comments: false sharing: true diff --git a/source/_components/alarm_control_panel.abode.markdown b/source/_components/alarm_control_panel.abode.markdown index 4b140acdb064..593735b7d20a 100644 --- a/source/_components/alarm_control_panel.abode.markdown +++ b/source/_components/alarm_control_panel.abode.markdown @@ -2,7 +2,7 @@ layout: page title: "Abode Alarm Control Panel" description: "Instructions how to setup the Abode Alarm control panel within Home Assistant." -date: 2017-08-26 13:28 +date: 2017-08-26 0:28 sidebar: true comments: false sharing: true diff --git a/source/_components/binary_sensor.abode.markdown b/source/_components/binary_sensor.abode.markdown index d0ee36ad3922..35dfeda17139 100644 --- a/source/_components/binary_sensor.abode.markdown +++ b/source/_components/binary_sensor.abode.markdown @@ -2,7 +2,7 @@ layout: page title: "Abode Binary Sensor" description: "Instructions how to integrate Abode binary sensors into Home Assistant." -date: 2017-08-26 13:28 +date: 2017-08-26 0:28 sidebar: true comments: false sharing: true diff --git a/source/_components/sensor.londond_air.markdown b/source/_components/sensor.london_air.markdown similarity index 100% rename from source/_components/sensor.londond_air.markdown rename to source/_components/sensor.london_air.markdown diff --git a/source/_docs/automation/editor.markdown b/source/_docs/automation/editor.markdown index 83b1de0f29e2..e8a600396688 100644 --- a/source/_docs/automation/editor.markdown +++ b/source/_docs/automation/editor.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Automation Editor" -description: "Instructions on how to use the new automation editor." +description: "Instructions on how to use the automation editor." date: 2016-04-24 08:30 +0100 sidebar: true comments: false @@ -9,11 +9,9 @@ sharing: true footer: true --- -In Home Assistant 0.45 we have introduced the first version of our automation editor. The editor is still in a very early stage and rough around the edges. For now we are only supporting Chrome but better browser support is planned for the future. +In Home Assistant 0.45 we introduced the first version of our automation editor. If you just created a new configuration with Home Assistant then you're all set! Go to the UI and enjoy. -If you just created a new configuration with Home Assistant then you're all set! Go to the UI and enjoy. - -From the UI choose **Automation** which is located in the sidebar. Press the **+** sign in the lower right corner to get started. This example is based on the manual steps described in the [Getting started section](/getting-started/automation/) for a [`random` sensor](/components/sensor.random/). +From the UI choose **Configuration** which is located in the sidebar, then click on **Automation** to go to the automation editor. Press the **+** sign in the lower right corner to get started. This example is based on the manual steps described in the [Getting started section](/getting-started/automation/) for a [`random` sensor](/components/sensor.random/). Choose a meaningful name for your automation rules. diff --git a/source/_docs/scripts/editor.markdown b/source/_docs/scripts/editor.markdown new file mode 100644 index 000000000000..e5cc30c2272a --- /dev/null +++ b/source/_docs/scripts/editor.markdown @@ -0,0 +1,28 @@ +--- +layout: page +title: "Script Editor" +description: "Instructions on how to use the new script editor." +date: 2016-08-26 03:30 +0000 +sidebar: true +comments: false +sharing: true +footer: true +redirect_from: /docs/script/editor/ +--- + +In Home Assistant 0.52 we introduced the first version of our automation editor. If you just created a new configuration with Home Assistant then you're all set! Go to the UI and enjoy. + +
+ +
+ +## {% linkable_title Updating your configuration to use the editor %} + +The script editor reads and writes to the file `scripts.yaml` in your [configuration](/docs/configuration/) folder. Make sure that you have set up the script component to read from it: + +```yaml +# Configuration.yaml example +script: !include scripts.yaml +``` + +The conten that was under `script:` should now be moved to `scripts.yaml` to be editable. diff --git a/source/_includes/asides/docs_navigation.html b/source/_includes/asides/docs_navigation.html index 83fa9419bb09..c113f371a5ab 100644 --- a/source/_includes/asides/docs_navigation.html +++ b/source/_includes/asides/docs_navigation.html @@ -78,6 +78,7 @@

Topics

  • {% active_link /docs/scripts/service-calls/ Service Calls %}
  • {% active_link /docs/scripts/conditions/ Conditions %}
  • +
  • {% active_link /docs/scripts/editor/ Editor %}
  • diff --git a/source/_posts/2017-08-26-release-0-52.markdown b/source/_posts/2017-08-26-release-0-52.markdown new file mode 100644 index 000000000000..152d0621d7ca --- /dev/null +++ b/source/_posts/2017-08-26-release-0-52.markdown @@ -0,0 +1,376 @@ +--- +layout: post +title: "0.51: Massive history speed up, finished automation editor and official vacuum cleaner support" +description: "Lots of frontend bugs have been squashed, the automation editor now supports all triggers and actions and vacuum cleaners are now an official component." +date: 2017-08-26 00:11:05 +date_formatted: "August 26, 2017" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2017-08-0.52/components.png +--- + + + +Although the summer is in full progress, the development hasn't stalled. This release brings bug fixes, clean ups and another 8 new integrations. On top of that we are also introducing a new [script editor](/docs/scripts/editor/)! + +To use the scripts editor, create a new file in your config directory named `scripts.yaml` and copy your existing scripts over: + +```yaml +# scripts.yaml +turn_on_some_lights: + alias: Turn on the lights + sequence: + - data: {} + service: light.turn_on +``` + + Than update your `configuration.yaml` to look like this: + +```yaml +# Configuration.yaml example +script: !include scripts.yaml +``` + +
    + +
    + +## New Platforms + +- Add version sensor ([@fabaff] - [#8912]) ([sensor.version docs]) (new-platform) +- Nello.io lock support ([@pschmitt] - [#8957]) ([lock.nello docs]) (new-platform) +- Add HipChat notify service. ([@BioSehnsucht] - [#8918]) ([notify.hipchat docs]) (new-platform) +- Refactor USPS into component with Sensors+Camera ([@mezz64] - [#8679]) ([usps docs]) ([camera.usps docs]) ([sensor.usps docs]) (breaking change) (new-platform) +- Adds London_air component ([@robmarkcole] - [#9020]) ([sensor.london_air docs]) (new-platform) +- Add Abode home security component ([@arsaboo] - [#9030]) ([abode docs]) ([alarm_control_panel.abode docs]) ([binary_sensor.abode docs]) (new-platform) +- Add support for Prowl notifications. ([@mbrrg] - [#9028]) ([notify.prowl docs]) (new-platform) +- Add worldtidesinfo sensor component ([@aetolus] - [#8860]) ([sensor.worldtidesinfo 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 + +- Remove spaces from Xiami switch attributes ([@syssi] - [#8952]) ([switch.xiaomi docs]) (breaking change) +- MQTT Switch: command and availability payload are now no longer linked. Command and availability payload default to ON/OFF and must be configured individually if custom values are required. ([@timstanley1985] - [#8934]) ([switch.mqtt docs]) (breaking change) + +```yaml + - platform: mqtt + name: "Kitchen" + state_topic: "stat/sonoff_1/POWER" + command_topic: "cmnd/sonoff_1/POWER" + availability_topic: "tele/sonoff_1/LWT" + payload_available: "Online" + payload_not_available: "Offline" + retain: true +``` + +- Refactor USPS into component with Sensors+Camera ([@mezz64] - [#8679]) ([usps docs]) ([camera.usps docs]) ([sensor.usps docs]) (breaking change) (new-platform) + +```yaml +usps: + username: user + password: pass + name: optional +``` + +- eliqonline: The optional channel_id configuration variable of the Eliqonline sensor needs to be a positive integer. ([@molobrakos] - [#9072]) ([sensor.eliqonline docs]) (breaking change) +- MySensors: Not a breaking change per se but users that have not been following the mysensors [serial API](https://www.mysensors.org/download/serial_api_20) could face dropped messages after this change. Messages are now validated according to the API before being passed along from/to devices. See [0.11 release notes](https://github.com/theolind/pymysensors/releases/tag/0.11) for more info. ([@MartinHjelmare] - [#9069]) ([mysensors docs]) ([binary_sensor.mysensors docs]) ([climate.mysensors docs]) ([cover.mysensors docs]) ([device_tracker.mysensors docs]) ([light.mysensors docs]) ([notify.mysensors docs]) ([sensor.mysensors docs]) ([switch.mysensors docs]) (breaking change) +- Automatic has disabled password authentication on their API. Home Assistant will now use OAuth2 to authenticate accounts. The following steps must be taken to transition your setup: + 1) Log in to your Automatic developer account. In the Automatic Developer Apps Manager, specify the OAuth Redirect URL in the developer page. This should be configured to `/api/automatic/callback`. (Example: `http://hassio.local:8123/api/automatic/callback`) Note that this URL only needs to be accessible from the browser you use to perform the authentication. + 2) Remove username/password from your automatic device tracker configuration in configuration.yaml. + 3) If you have authorized your account for `scope:current_location`, add `current_location: true` to your automatic device tracker configuration in configuration.yaml. + 4) When you restart home assistant, click on the Automatic Configure link in the Configurator card, and follow the instructions to authorize Home Assistant.

    NOTE: Automatic's API is currently not correctly authorizing with refresh tokens, so Step 4 currently needs to be performed after every restart. ([@armills] - [#8962] [#9002]) ([configurator docs]) ([device_tracker.automatic docs]) (breaking change) + +## All changes + +- Add version sensor ([@fabaff] - [#8912]) ([sensor.version docs]) (new-platform) +- Fix hue lights for Philips and non-philips lights ([@groth-its] - [#8905]) ([light.hue docs]) +- Fixed cert_expiry sensor to delay firing on HA startup ([@arsaboo] - [#8920]) ([sensor.cert_expiry docs]) +- Remove spaces from Xiami switch attributes ([@syssi] - [#8952]) ([switch.xiaomi docs]) (breaking change) +- Add service to alarm control panel for night mode arming ([@schmittx] - [#8614]) ([alarm_control_panel docs]) ([alarm_control_panel.totalconnect docs]) +- Add support for Automatic OAuth2 authentication ([@armills] - [#8962]) ([configurator docs]) ([device_tracker.automatic docs]) (breaking change) +- Nello.io lock support ([@pschmitt] - [#8957]) ([lock.nello docs]) (new-platform) +- Added continue-on-errors, added value template ([@iamjackg] - [#8971]) ([sensor.snmp docs]) +- Is_allowed_path raise for None path ([@danielhiversen] - [#8953]) +- Fix #8960 - Decora Wi-Fi Switch unable to set brightness ([@tlyakhov] - [#8989]) ([light.decora_wifi docs]) +- Adds port/SSL config options for RainMachine ([@bachya] - [#8986]) ([switch.rainmachine docs]) +- Automatic device tracker remove password ([@armills] - [#9002]) ([device_tracker.automatic docs]) (breaking change) +- Add scripts editor backend ([@balloob] - [#8993]) ([config docs]) ([script docs]) (new-platform) +- MQTT Switch - Add configurable availability payload ([@timstanley1985] - [#8934]) ([switch.mqtt docs]) (breaking change) +- Buienradar newconditions ([@mjj4791] - [#8897]) ([sensor.buienradar docs]) ([weather.buienradar docs]) +- Pushbullet, fix multiple messages sent when url param is set ([@karlkar] - [#9006]) ([notify.pushbullet docs]) +- Update to pyenvisalink 2.2, and remove range validation on zonedump i… ([@Cinntax] - [#8981]) ([envisalink docs]) +- Fix #9010 - Swiss Public Transportation shows departure time in the past ([@michaelhertig] - [#9011]) ([sensor.swiss_public_transport docs]) +- Add HipChat notify service. ([@BioSehnsucht] - [#8918]) ([notify.hipchat docs]) (new-platform) +- Update onkyo-eiscp to 1.2.3 ([@danieljkemp] - [#9019]) ([media_player.onkyo docs]) +- Check if album image(s) exist in spotify ([@Tommatheussen] - [#9024]) ([media_player.spotify docs]) +- Update ffmpeg to 1.7 to fix severals problems ([@pvizeli] - [#9029]) +- Add state_with_unit property to state objects in templates ([@balloob] - [#9014]) +- Fix Geizhals index issue when not 4 prices available ([@celeroll] - [#9035]) ([sensor.geizhals docs]) +- Refactor USPS into component with Sensors+Camera ([@mezz64] - [#8679]) ([usps docs]) ([camera.usps docs]) ([sensor.usps docs]) (breaking change) (new-platform) +- Set password after connecting. Fixes #8983 ([@StevenLooman] - [#9039]) ([media_player.mpd docs]) +- Update iOS sensor (battery icon fix and format updates) ([@schmittx] - [#9032]) +- Adds London_air component ([@robmarkcole] - [#9020]) ([sensor.london_air docs]) (new-platform) +- Update pwmled to 1.2.1. ([@soldag] - [#9040]) ([light.rpi_gpio_pwm docs]) +- Configurable timeout for webostv. ([@soldag] - [#9042]) ([media_player.webostv docs]) +- Update ios.py ([@schmittx] - [#9041]) ([sensor.ios docs]) +- Support Windows in UPNP discovery ([@kabongsteve] - [#8936]) +- Upgrade python-pushover to 0.3 ([@fanaticDavid] - [#9045]) ([notify.pushover docs]) +- Add speeds to fan dropdown in ISY fan component ([@boojew] - [#9004]) ([fan.isy994 docs]) +- Update Fitbit sensor (icons, formatting, client update) ([@schmittx] - [#9031]) ([sensor.fitbit docs]) +- Add Abode home security component ([@arsaboo] - [#9030]) ([abode docs]) ([alarm_control_panel.abode docs]) ([binary_sensor.abode docs]) (new-platform) +- LIFX: avoid rare NoneType errors ([@amelchio] - [#9054]) ([light.lifx docs]) +- Bump dlib face_recognition to 0.2.2 ([@arsaboo] - [#9060]) ([image_processing.dlib_face_detect docs]) ([image_processing.dlib_face_identify docs]) +- Update fitbit.py ([@schmittx] - [#9064]) ([sensor.fitbit docs]) +- Upgrade sendgrid to 5.0.0 ([@fabaff] - [#9062]) ([notify.sendgrid docs]) +- Upgrade slacker to 0.9.60 ([@fabaff] - [#9065]) ([notify.slack docs]) +- Add support for Prowl notifications. ([@mbrrg] - [#9028]) ([notify.prowl docs]) (new-platform) +- Upgrade onkyo-eiscp to 1.2.4 (fixes #8995) ([@fabaff] - [#9068]) ([media_player.onkyo docs]) +- Workday sensor offset ([@LaStrada] - [#8824]) ([binary_sensor.workday docs]) +- eliqonline: channel id is an integer ([@molobrakos] - [#9072]) ([sensor.eliqonline docs]) (breaking change) +- Use builtin constants for Abode alarm_control_panel ([@arsaboo] - [#9059]) ([alarm_control_panel.abode docs]) +- bump python-ecobee-api version to 0.0.8 ([@nkgilley] - [#9074]) ([ecobee docs]) +- Bump abodepy to 0.7.1 ([@arsaboo] - [#9077]) ([abode docs]) +- async_query returns False if connection to server failed, handle this properly ([@molobrakos] - [#9070]) ([media_player.squeezebox docs]) +- Added insteonplm device_override multiple capabilities ([@teharris1] - [#9078]) ([insteon_plm docs]) +- Upgrade uber_rides to 0.5.1 ([@fabaff] - [#9080]) ([sensor.uber docs]) +- Upgrade discord.py to 0.16.10 ([@fabaff] - [#9082]) ([notify.discord docs]) +- Fix `device` attribute in fritz_callmonitor.py (fixes #9055) ([@870074+max-te] - [#9081]) ([sensor.fritzbox_callmonitor docs]) +- Upgrade youtube_dl to 2017.8.18 ([@fabaff] - [#9079]) ([media_extractor docs]) +- Remove dash ([@fabaff] - [#9089]) +- Upgrade credstash to 1.13.3 ([@fabaff] - [#9088]) +- 9043 Fixed error while running dev docker ([@MungoRae] - [#9044]) +- Don't redefine consts ([@fabaff] - [#9086]) ([notify.hipchat docs]) +- Fix octoprint errors when printer is off/disconnected ([@w1ll1am23] - [#8988]) ([octoprint docs]) ([sensor.octoprint docs]) +- Pilight switch: restore last state after restart ([@janLo] - [#8580]) ([switch.pilight docs]) +- Fix netdata system_load and add disk_free. ([@michaelarnauts] - [#9091]) ([sensor.netdata docs]) +- Add worldtidesinfo sensor component ([@aetolus] - [#8860]) ([sensor.worldtidesinfo docs]) (new-platform) +- Support changing the bulb color for tplink smartbulbs, fixes #8766 ([@rytilahti] - [#8780]) ([light.tplink docs]) +- bump snapcast version ([@happyleavesaoc] - [#9100]) ([media_player.snapcast docs]) +- bump fedex version ([@happyleavesaoc] - [#9099]) ([sensor.fedex docs]) +- Yeelight fix updates on hsv mode ([@rytilahti] - [#9093]) ([light.yeelight docs]) +- Catch exceptions ([@fabaff] - [#9085]) ([notify.discord docs]) +- Fix issue 8894 with uk_transport component if no next_buses or next_trains ([@robmarkcole] - [#9046]) ([sensor.uk_transport docs]) +- upgrade Xiaomi Gateway lib to 0.3 ([@danielhiversen] - [#9101]) ([xiaomi docs]) +- pythonegardia package requirement to .18 ([@jeroenterheerdt] - [#9104]) ([alarm_control_panel.egardia docs]) +- Simplisafe unknown status fix ([@lekobob] - [#9111]) ([alarm_control_panel.simplisafe docs]) +- Update flux_led.py ([@danielhiversen] - [#9122]) ([light.flux_led docs]) +- Xiaomi ([@danielhiversen] - [#9126]) ([xiaomi docs]) +- refactor pushbullet ([@danielhiversen] - [#9125]) ([notify.pushbullet docs]) +- optimistic mode for template covers (w/o timed movement) ([@PhracturedBlue] - [#8402]) ([cover.template docs]) +- Use const ([@fabaff] - [#9127]) ([prometheus docs]) +- Refactor mysensors callback and add validation ([@MartinHjelmare] - [#9069]) ([mysensors docs]) ([binary_sensor.mysensors docs]) ([climate.mysensors docs]) ([cover.mysensors docs]) ([device_tracker.mysensors docs]) ([light.mysensors docs]) ([notify.mysensors docs]) ([sensor.mysensors docs]) ([switch.mysensors docs]) (breaking change) + +[#8402]: https://github.com/home-assistant/home-assistant/pull/8402 +[#8580]: https://github.com/home-assistant/home-assistant/pull/8580 +[#8614]: https://github.com/home-assistant/home-assistant/pull/8614 +[#8679]: https://github.com/home-assistant/home-assistant/pull/8679 +[#8780]: https://github.com/home-assistant/home-assistant/pull/8780 +[#8824]: https://github.com/home-assistant/home-assistant/pull/8824 +[#8860]: https://github.com/home-assistant/home-assistant/pull/8860 +[#8897]: https://github.com/home-assistant/home-assistant/pull/8897 +[#8905]: https://github.com/home-assistant/home-assistant/pull/8905 +[#8912]: https://github.com/home-assistant/home-assistant/pull/8912 +[#8918]: https://github.com/home-assistant/home-assistant/pull/8918 +[#8920]: https://github.com/home-assistant/home-assistant/pull/8920 +[#8934]: https://github.com/home-assistant/home-assistant/pull/8934 +[#8936]: https://github.com/home-assistant/home-assistant/pull/8936 +[#8952]: https://github.com/home-assistant/home-assistant/pull/8952 +[#8953]: https://github.com/home-assistant/home-assistant/pull/8953 +[#8957]: https://github.com/home-assistant/home-assistant/pull/8957 +[#8962]: https://github.com/home-assistant/home-assistant/pull/8962 +[#8971]: https://github.com/home-assistant/home-assistant/pull/8971 +[#8981]: https://github.com/home-assistant/home-assistant/pull/8981 +[#8986]: https://github.com/home-assistant/home-assistant/pull/8986 +[#8988]: https://github.com/home-assistant/home-assistant/pull/8988 +[#8989]: https://github.com/home-assistant/home-assistant/pull/8989 +[#8993]: https://github.com/home-assistant/home-assistant/pull/8993 +[#9002]: https://github.com/home-assistant/home-assistant/pull/9002 +[#9004]: https://github.com/home-assistant/home-assistant/pull/9004 +[#9006]: https://github.com/home-assistant/home-assistant/pull/9006 +[#9011]: https://github.com/home-assistant/home-assistant/pull/9011 +[#9014]: https://github.com/home-assistant/home-assistant/pull/9014 +[#9019]: https://github.com/home-assistant/home-assistant/pull/9019 +[#9020]: https://github.com/home-assistant/home-assistant/pull/9020 +[#9024]: https://github.com/home-assistant/home-assistant/pull/9024 +[#9028]: https://github.com/home-assistant/home-assistant/pull/9028 +[#9029]: https://github.com/home-assistant/home-assistant/pull/9029 +[#9030]: https://github.com/home-assistant/home-assistant/pull/9030 +[#9031]: https://github.com/home-assistant/home-assistant/pull/9031 +[#9032]: https://github.com/home-assistant/home-assistant/pull/9032 +[#9035]: https://github.com/home-assistant/home-assistant/pull/9035 +[#9039]: https://github.com/home-assistant/home-assistant/pull/9039 +[#9040]: https://github.com/home-assistant/home-assistant/pull/9040 +[#9041]: https://github.com/home-assistant/home-assistant/pull/9041 +[#9042]: https://github.com/home-assistant/home-assistant/pull/9042 +[#9044]: https://github.com/home-assistant/home-assistant/pull/9044 +[#9045]: https://github.com/home-assistant/home-assistant/pull/9045 +[#9046]: https://github.com/home-assistant/home-assistant/pull/9046 +[#9054]: https://github.com/home-assistant/home-assistant/pull/9054 +[#9059]: https://github.com/home-assistant/home-assistant/pull/9059 +[#9060]: https://github.com/home-assistant/home-assistant/pull/9060 +[#9062]: https://github.com/home-assistant/home-assistant/pull/9062 +[#9064]: https://github.com/home-assistant/home-assistant/pull/9064 +[#9065]: https://github.com/home-assistant/home-assistant/pull/9065 +[#9068]: https://github.com/home-assistant/home-assistant/pull/9068 +[#9069]: https://github.com/home-assistant/home-assistant/pull/9069 +[#9070]: https://github.com/home-assistant/home-assistant/pull/9070 +[#9072]: https://github.com/home-assistant/home-assistant/pull/9072 +[#9074]: https://github.com/home-assistant/home-assistant/pull/9074 +[#9077]: https://github.com/home-assistant/home-assistant/pull/9077 +[#9078]: https://github.com/home-assistant/home-assistant/pull/9078 +[#9079]: https://github.com/home-assistant/home-assistant/pull/9079 +[#9080]: https://github.com/home-assistant/home-assistant/pull/9080 +[#9081]: https://github.com/home-assistant/home-assistant/pull/9081 +[#9082]: https://github.com/home-assistant/home-assistant/pull/9082 +[#9085]: https://github.com/home-assistant/home-assistant/pull/9085 +[#9086]: https://github.com/home-assistant/home-assistant/pull/9086 +[#9088]: https://github.com/home-assistant/home-assistant/pull/9088 +[#9089]: https://github.com/home-assistant/home-assistant/pull/9089 +[#9091]: https://github.com/home-assistant/home-assistant/pull/9091 +[#9093]: https://github.com/home-assistant/home-assistant/pull/9093 +[#9099]: https://github.com/home-assistant/home-assistant/pull/9099 +[#9100]: https://github.com/home-assistant/home-assistant/pull/9100 +[#9101]: https://github.com/home-assistant/home-assistant/pull/9101 +[#9104]: https://github.com/home-assistant/home-assistant/pull/9104 +[#9111]: https://github.com/home-assistant/home-assistant/pull/9111 +[#9122]: https://github.com/home-assistant/home-assistant/pull/9122 +[#9125]: https://github.com/home-assistant/home-assistant/pull/9125 +[#9126]: https://github.com/home-assistant/home-assistant/pull/9126 +[#9127]: https://github.com/home-assistant/home-assistant/pull/9127 +[@870074+max-te]: https://github.com/870074+max-te +[@BioSehnsucht]: https://github.com/BioSehnsucht +[@Cinntax]: https://github.com/Cinntax +[@LaStrada]: https://github.com/LaStrada +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@MungoRae]: https://github.com/MungoRae +[@PhracturedBlue]: https://github.com/PhracturedBlue +[@StevenLooman]: https://github.com/StevenLooman +[@Tommatheussen]: https://github.com/Tommatheussen +[@aetolus]: https://github.com/aetolus +[@amelchio]: https://github.com/amelchio +[@armills]: https://github.com/armills +[@arsaboo]: https://github.com/arsaboo +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@boojew]: https://github.com/boojew +[@celeroll]: https://github.com/celeroll +[@danielhiversen]: https://github.com/danielhiversen +[@danieljkemp]: https://github.com/danieljkemp +[@fabaff]: https://github.com/fabaff +[@fanaticDavid]: https://github.com/fanaticDavid +[@groth-its]: https://github.com/groth-its +[@happyleavesaoc]: https://github.com/happyleavesaoc +[@iamjackg]: https://github.com/iamjackg +[@janLo]: https://github.com/janLo +[@jeroenterheerdt]: https://github.com/jeroenterheerdt +[@kabongsteve]: https://github.com/kabongsteve +[@karlkar]: https://github.com/karlkar +[@lekobob]: https://github.com/lekobob +[@mbrrg]: https://github.com/mbrrg +[@mezz64]: https://github.com/mezz64 +[@michaelarnauts]: https://github.com/michaelarnauts +[@michaelhertig]: https://github.com/michaelhertig +[@mjj4791]: https://github.com/mjj4791 +[@molobrakos]: https://github.com/molobrakos +[@nkgilley]: https://github.com/nkgilley +[@pschmitt]: https://github.com/pschmitt +[@pvizeli]: https://github.com/pvizeli +[@robmarkcole]: https://github.com/robmarkcole +[@rytilahti]: https://github.com/rytilahti +[@schmittx]: https://github.com/schmittx +[@soldag]: https://github.com/soldag +[@syssi]: https://github.com/syssi +[@teharris1]: https://github.com/teharris1 +[@timstanley1985]: https://github.com/timstanley1985 +[@tlyakhov]: https://github.com/tlyakhov +[@w1ll1am23]: https://github.com/w1ll1am23 +[abode docs]: https://home-assistant.io/components/abode/ +[alarm_control_panel docs]: https://home-assistant.io/components/alarm_control_panel/ +[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.simplisafe docs]: https://home-assistant.io/components/alarm_control_panel.simplisafe/ +[alarm_control_panel.totalconnect docs]: https://home-assistant.io/components/alarm_control_panel.totalconnect/ +[binary_sensor.abode docs]: https://home-assistant.io/components/binary_sensor.abode/ +[binary_sensor.mysensors docs]: https://home-assistant.io/components/binary_sensor.mysensors/ +[binary_sensor.workday docs]: https://home-assistant.io/components/binary_sensor.workday/ +[camera.usps docs]: https://home-assistant.io/components/camera.usps/ +[climate.mysensors docs]: https://home-assistant.io/components/climate.mysensors/ +[config docs]: https://home-assistant.io/components/config/ +[configurator docs]: https://home-assistant.io/components/configurator/ +[cover.mysensors docs]: https://home-assistant.io/components/cover.mysensors/ +[cover.template docs]: https://home-assistant.io/components/cover.template/ +[device_tracker.automatic docs]: https://home-assistant.io/components/device_tracker.automatic/ +[device_tracker.mysensors docs]: https://home-assistant.io/components/device_tracker.mysensors/ +[ecobee docs]: https://home-assistant.io/components/ecobee/ +[emulated_hue.upnp docs]: https://home-assistant.io/components/emulated_hue.upnp/ +[envisalink docs]: https://home-assistant.io/components/envisalink/ +[fan.isy994 docs]: https://home-assistant.io/components/fan.isy994/ +[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/ +[insteon_plm docs]: https://home-assistant.io/components/insteon_plm/ +[light.decora_wifi docs]: https://home-assistant.io/components/light.decora_wifi/ +[light.flux_led docs]: https://home-assistant.io/components/light.flux_led/ +[light.hue docs]: https://home-assistant.io/components/light.hue/ +[light.lifx docs]: https://home-assistant.io/components/light.lifx/ +[light.mysensors docs]: https://home-assistant.io/components/light.mysensors/ +[light.rpi_gpio_pwm docs]: https://home-assistant.io/components/light.rpi_gpio_pwm/ +[light.tplink docs]: https://home-assistant.io/components/light.tplink/ +[light.yeelight docs]: https://home-assistant.io/components/light.yeelight/ +[lock.nello docs]: https://home-assistant.io/components/lock.nello/ +[media_extractor docs]: https://home-assistant.io/components/media_extractor/ +[media_player.mpd docs]: https://home-assistant.io/components/media_player.mpd/ +[media_player.onkyo docs]: https://home-assistant.io/components/media_player.onkyo/ +[media_player.snapcast docs]: https://home-assistant.io/components/media_player.snapcast/ +[media_player.spotify docs]: https://home-assistant.io/components/media_player.spotify/ +[media_player.squeezebox docs]: https://home-assistant.io/components/media_player.squeezebox/ +[media_player.webostv docs]: https://home-assistant.io/components/media_player.webostv/ +[mysensors docs]: https://home-assistant.io/components/mysensors/ +[notify.discord docs]: https://home-assistant.io/components/notify.discord/ +[notify.hipchat docs]: https://home-assistant.io/components/notify.hipchat/ +[notify.mysensors docs]: https://home-assistant.io/components/notify.mysensors/ +[notify.prowl docs]: https://home-assistant.io/components/notify.prowl/ +[notify.pushbullet docs]: https://home-assistant.io/components/notify.pushbullet/ +[notify.pushover docs]: https://home-assistant.io/components/notify.pushover/ +[notify.sendgrid docs]: https://home-assistant.io/components/notify.sendgrid/ +[notify.slack docs]: https://home-assistant.io/components/notify.slack/ +[octoprint docs]: https://home-assistant.io/components/octoprint/ +[prometheus docs]: https://home-assistant.io/components/prometheus/ +[script docs]: https://home-assistant.io/components/script/ +[sensor.buienradar docs]: https://home-assistant.io/components/sensor.buienradar/ +[sensor.cert_expiry docs]: https://home-assistant.io/components/sensor.cert_expiry/ +[sensor.eliqonline docs]: https://home-assistant.io/components/sensor.eliqonline/ +[sensor.fedex docs]: https://home-assistant.io/components/sensor.fedex/ +[sensor.fitbit docs]: https://home-assistant.io/components/sensor.fitbit/ +[sensor.fritzbox_callmonitor docs]: https://home-assistant.io/components/sensor.fritzbox_callmonitor/ +[sensor.geizhals docs]: https://home-assistant.io/components/sensor.geizhals/ +[sensor.ios docs]: https://home-assistant.io/components/sensor.ios/ +[sensor.london_air docs]: https://home-assistant.io/components/sensor.london_air/ +[sensor.mysensors docs]: https://home-assistant.io/components/sensor.mysensors/ +[sensor.netdata docs]: https://home-assistant.io/components/sensor.netdata/ +[sensor.octoprint docs]: https://home-assistant.io/components/sensor.octoprint/ +[sensor.snmp docs]: https://home-assistant.io/components/sensor.snmp/ +[sensor.swiss_public_transport docs]: https://home-assistant.io/components/sensor.swiss_public_transport/ +[sensor.uber docs]: https://home-assistant.io/components/sensor.uber/ +[sensor.uk_transport docs]: https://home-assistant.io/components/sensor.uk_transport/ +[sensor.usps docs]: https://home-assistant.io/components/sensor.usps/ +[sensor.version docs]: https://home-assistant.io/components/sensor.version/ +[sensor.worldtidesinfo docs]: https://home-assistant.io/components/sensor.worldtidesinfo/ +[switch.mqtt docs]: https://home-assistant.io/components/switch.mqtt/ +[switch.mysensors docs]: https://home-assistant.io/components/switch.mysensors/ +[switch.pilight docs]: https://home-assistant.io/components/switch.pilight/ +[switch.rainmachine docs]: https://home-assistant.io/components/switch.rainmachine/ +[switch.xiaomi docs]: https://home-assistant.io/components/switch.xiaomi/ +[usps docs]: https://home-assistant.io/components/usps/ +[weather.buienradar docs]: https://home-assistant.io/components/weather.buienradar/ +[xiaomi docs]: https://home-assistant.io/components/xiaomi/ +[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-08-0.52/components.png b/source/images/blog/2017-08-0.52/components.png new file mode 100644 index 0000000000000000000000000000000000000000..14225ee5feee2200a59f96723613aea5cd308497 GIT binary patch literal 26431 zcmcF~WmH^2vn}oe!Ga7HG-%Mlo#2B9hu}Ixa0^aw4Gx1_aCavVd~g{cxCKan;Lgi; z?|Xmm`*r`EbGmkSb+7K~v(~P)D@sF60f0k^gM@?xP*RlBLPA0XAt9lNV4?oAd}rkB z`q#MEP}O<={QP`%b#-xZiHwYVetuqAS^4MB$^QQS>gp;vhuZ1s+2P?K0)aR_J{}kt z*xA{6dU{4SExy0Me|&trxw%zLwmy^+cwA93j-(+YBa`mF)b0O^gNtGCE?ri~bZl&_ zqod>Q@tKZKhmMX8z3Iit$%%jvmz(?DdA8EW*f-YJ*0r^@4Gj%&IDB?~K|#;FtE)@1 z?;56ax4k3pE%9N4&h zZtWiI+r4gBz4++lp|7v6V+k#)Y%D1$Vf-@ctzQ-S;}4}%bw)-8hlGj6=xzPvj&Id; z60GXv&nBKtnON;k$^7}3W+fSI6J}mK=aIjfnwqPBAA1Ie1ER76dXCczN)xm4`4kBC zZ3CXJ&#hb{a&mHvvn;-~=^-SfM}8jPFClLBe{~PQe}5l#$`snJtml?7TZ~97C@9Dj zgnaz?@nmv#zqRYOwDNpq?X5?Hv>CZe>tU`-`47LZQWeYkTxqri@L%vk_z`*8=yx;SFtl9rxEbPF6?p=+PR)(!`4lnj6?8kIq`AeJj)Y`| zq$DS;v7^26O8n@Lo{^Ue&s4lIY%IF3{{^Rf<03BJ-(Uk;g(j1 z<4BTuZYK}+5#vT}wncQpO*&Q|0S_=}8HvUQ^-(;^;crh&&#Nyq)zV)W$J+>ftBB-Y zgYja^JO0aNMe~D^+Hvm52Fk+P`OgBEK3dLT97XrhvU!6gZWuZu7A;N`Nwv(2EB$MR z+=>S_=!u?M1GWg6F5*!Xhh1uD2&*P%&|TVLYr&a8IhXPp?MkA|%vj=-q4SLt*la}= zIR6Hc6z76lS;{UutVu(rcOK{_!ubj?8@E({ZJC2`CI_Vn2pTn=nelzSGvY${T&4#G zASBsQp)@o$MVqQrmuK8SbldIxh=}F4Ld2NjViWTHnL_`=(BQmLXOR9JB z8BzbR31*Gn&&;85k^lWY5x&d~3k+cX_x_D$GXQB3hE?S$>=b(Yar_nr_YLjnfccJ&^e|6-J)mX+4cv+#>3X;Uwcd8lilga($?h7AiNhIp66}0tF zseMEyGPax{2%+o`(4s9#X)4%SBf>Iih+sNMlto#VRYZh#Wf;4@WtDM@9G2m-*O`vg ztnk*5o0lviB@q+L_15UmT!VVGuB9`B=Zo*Ro)8e57L~hz`<&AWcT^<_ z?;rj;Hw7ymw&>VzFxrJ}PT$3-laK$f5Y8Bdr<6p=R82`N)zXn)6#gGiK0g1~)7zDNcNGCl zTMnyLYGotN5;?vd_d+pOPdnz=MKFw{&471hSQyJ&8#c7IBBfph?@6QPS%}|!a75*y z&z3o}`ZD^mBBls!vtu!5eBGSI>NRi(0m1N@ir~?@%7>n1aQ*}Gcxyc9;KZ*Lsei2r`3S!*^WIMvGqM>2G!@KePoBw)P^+Pu?%lcb~>Z(fe2jc4^yb+-ipD22_R(? zQj?)@>bv#OCJke4VgT#HIaog9u@*ishv8~14zb5hWPmT65k`xKMPO(755$Y1HR zT5T?N*gLHR#M%!rvE7YgCBKA#UJ+jR=XG)KNRzLxA!LD#i&WCyKUbu_{Muv9#(Z;o zV^=hf6tzuUS2xZDFkcewG`#;-9Zq z=k0gu=@Ne&PMq%_{T*FgU;NytQXt$PYDQ~)JF-8weA9BRf4l(qImMH9HeQjE`?4pP zZu;`u>Ug(NL8ZVtm%;mSB{4(3ny^{_%fP#A>q>4V%D-5Y#=w+`LDtL;g5ZEY4cmUk zl9tK^hi_|(%H2AwY+{d)i{ERFjeq|9X>9b$1E+&3Uq4_;HMDyKyt=GKM+p{qF+W*Y z_9yTy5ExJJO2EfAuv`@Jb~g0$55(x_u@CK5znOHqJa-Hh@O%d}Qs2j-X$94-ezgl~ zc3jlSJeC8FD|XA!5L5x^x)P*oSIP7jRUPMT1aso#8V;Qsbe$F%b_;A_8|&hz%&WGi z&miy$m1*O1r0jTSd%ol=?@`7&Pw$?N3G=0^_Pgpik4hd#>N8pz>Igq8ycH>4FUYOq zn#x&zTgMcGkS_FAS-n*r`Kj;jHM{eCF>e_t9xkxYvpD5T0xI3Z>NzUTdaofK@*C9} zk9tK)^)h#{igz$Fm&iN3IWRu={T@5iYA`6d9L{G#sgiB0T?|)QLR0HfIp}Xr&qiBR z-xo%63h8S6COuA$D|s~$DnE~55#X_txE7t+53p<}ThGbWQ>HOo;)}hsfHpeMSel1Mmm4K}y-?eDgjXQcr?)1mSSOQH zLBLJ;c0nqZlXpw25URo)2K zJGP=^rl6G7-*u^Q1$GB@i_0dPG(WSIPXr3dpUvnLP zV!xLC{&q#G$z4r5PBeJ45+=dV1=RqP+V|l%K=DWs31{BEXC6RD=D6|8%K`7<7R@G2 z0J|sD5XJi|C`zq!K3T5OvT&4x%n5=)#3VpWk3>RL=P_vUAYrYKL57XpHeQ-3K| zgrC&^9Q~m^#Pc*IQ}rdWByP7RE|_syG)+J1hX*CD8bXH_Im~Eoxm;;}pQx?QUpQ=~ zE2D^%py|g|vNq-7)7dAu&q;Nht-#XDxub%5*Uk(^sX!Dn>{06Vwn(ZB+grir{xh6; zbs(9R$41bK5Fv~ZNipooZ8qkvR1TO0`FVSG$Fy_zBXoM`B{yAvtFcR3!S2Z*aQDZ} zJcgvT)-{uJ6MepmU8sXNs9J2Z`4T-%cd;BS_Re^~mMGM5pe#IMDSXEKiMM3+Q`20V zvnVz=A2h||Z23^s2<`H}-m0B?M-v2k_XklydcI!3P<5CEVA>S(B02x54*Vr zVSL%gV>dvGXse9rm%26Nut-h=;WcYFYm^{2ebr(e71JrYnJb+SLmJdEoGPY_(qeTn z;l4`BbyaF`po!8{E>xP`4{^c1znIzkacS>XIc6YgilGPDe~c%3YHDk3*6ZTQ+x$j- zQUX_BlIx=#OeMw+imrSYCVUMW)ynVAcJ17xBg}hEC0_Al3x z%@qSowkG~$@8gHy~Limphf+-~QPoc%4*KVBB+FRut%{VZDPZoM&3F;>KzK0N1fPSKf#9Fk;kGLamJ-AwNz zav>;~o$PL62j;Ci{)S?82L%JekH1!|%0U+Ud2`H!=psT@Su0qm_S#33lG$I{O5&2s zd_*%Z(Hv!~`!kp+?+(0B9x|pMj~(l6hnF36Ga2>a za!s2C6=*jqA@S3PzXR0s8qnfkB?Z+G-^(E4PJ~1T!a#jsU?hn!Y|$RXEWFxPaxphd z3m9gRm)smevrjf6;;sui<$15_NfxJhXB(m0kZCg1hwN(w4!!eAk66SYC4lbDGrS9) zWckqLRcE8(QRG;}Z%^KmOs=6J=Sf>_&IM!fJ&qkQ6m6a{{QElWS$0P2r5I$~@zbI= zdqAUPbZLKXs+TJMT|gEF6y@{9WZUx3`cyV~o4<&2B`535&i-glGU#uDYPd0%osq@b z@GGIeuR~jo6KVia0(M&(^1lNbQoVT-oT5;pjDN}99n;kmf8y{O3(3cd{{DQPIVf2M zAUkG+bj~t=gsDr=CaIUoz&7FH?BBm$4LmIfMxFGP3pk7B_*))gG`6_cHAY4(>_=6D zL=3Z$1%p4WjKO~XTIs7}oAv%sXIi3SXt1BXEj1X%E?&;sxKlQC-F(LITM76LBvi^{ zTdDxdleqI%ER}`L!Gfa&7a_;ogCm$NzAWC}G0j0xwIIAo_|9A?yDJ2L`*m@f+nR-~ zJ5;J?V2t#s^{HK12GUeSID8_S6z@12vdB~=9n-@3e#XiUbY(BYG`sylD9 zyXmH#qqN#0yP*uxf*lQP)TV$aJh=c6o%XsE3{wx^ohzTVIbCFqH3{4d2USKmhB`F% z@bguHkd}k`&?7m9@&S`AOxG~fE}HR$q><~oCiYC5f<$`{{_8STrIWHbJQdi7UcE{-w709G4d;V8;D3;_T4ixG zcu!z`y{WdSEN?jz&R<(-j9gcfmDJ+cfQcH57;Y~~Rzkj-lLs}IU(S_^yjgjKoINZJ zoIR-92yTw)*k5=@uGmmw*dt;2R^6~Ep*N1O_<<fTF|lWa&(CrQ*Kl%+k%=AyS<5ZBBba&dIC|ohZCn4@4O)hcrx~K zpX?aG?|o2d?tP#@{Ga(6t&9w?Zy%CYseG9ML?@I47+iElF@OJskgkjueb!zq@rd_r z#-FEuW^`9%<7LGr_xR+m=xhWDrNaLwVBNjrr{Cc7}o9^FQ&BQ~T(V$KV?o>FZQbm;djTt( zb!qRmWCL9wbM!vS-d~GmI|5lf! zUdhFn4R=+FQnT%Q5aXftPugUWHTZ?)r$xwieKf6kAle|cf0A`zJfG+V4W1pjobv(G zcN#a3y8V2q^lGpmOG0NStU%Kdr?&t=WHg}H{3g*#!SbmcjUP21_l_@5Jt5(@k3 z|m&*5cnT!$L(Qjs5Y8i3yCe6uTG zk$Pb=M@!WCHk11i46X%8Y!a7{RvM@Q2jw2Sq%$2Q{)$baX8YK71L9mhFFoqfgv9nC zvO&Afc~iWpMD@?ZI!P*1E-N2%L3OuPKjBu*Rg{0WocVdDuCthev*(uuYNmcFWyRs; zzw=rB9Z!%uPEI;@g@=?{C;*L?eN7s){3lqh`2^o}0Y4^>#cDOvp;f#8F4-ma@Ryue zZM>z-i!?^Hg9}lm*K;NEyK2D;EIM13Iu0xuQoinA^7a?BU82xL@qV}ziv>MT2L?9J zH$ck;aOT>;mvVyaB=Xd)TGDcyvyMw)IThnZ?sY;cjB;Ung| z_{GcJh&oNpgeEpid7CjegZ+kbTHlFAsICN_)l7&QaKgFN`EH4o`18*L{%-(!f!gm2 zWQy`l9aQ@9Xl7;uP(hPYP>|o^7q$aKoV_W$Hkd145L(6ueX9ZKVYAB>Y1Lu6!L<{{ zhPNNsNL!@|ZB=(eI=?5j*<*9&Zhg}-pzO|epp9sEF8utn?RhmP4fIRaaH~7Y=T=5T zzs0A9=(%mY7-XjoIGSAyHxYG;fbTnZ+*e4XPI|32H23Rp?PBKWwi-@xBj~>A!9yhe zfFkFgbfro+o2AKthZuHX63f_U0@NSeLu&1{!ov>xCx(9dPr8B#~##N0`zx-Fbm4S3-Mlb?aXY}~qe@!q_{g(Yzm0q@Xwt;UL-qfYz~Z=8=gX z68&Op+Hx3=PE^gbPywm{-ByAG?d`l#nXFito2B_Z{^;%NTk`d~^l@Ya|07lGvtUkWiz?9l0n$;MX$kL`jQG8t zxtVW=(cjMZp0~r)`rBzmS`bdKS?r4rfI6H(l&^M>mn=*JjvL`Q&l;43G2^u(dGo{p zN}-#YPS zC`}i&!OfVZ6ShI2nP}qCt9bttAap%uCisC4XFwqknIS*C!+Z}Mxh_|biG*u`!fx7k zMXvkQ)e=jW%XhH%)vVSo_z~M}Yi(b1D{Lj~K(7|`(2D&T9c{R5GRzea3Y(KM%b~%E8R8&V3*h;O3q;+J;e_Bw;n4VKtIe%zI9&3YM zBUQGLFfFjh?0D|z`u{R-G|+W%ezR_veuItJ)Ad6#PW}YGU2C+;^n%-j?S_dId1Qlp zUL(7#K+uuapY`V$g60xhclI|D$+qv)z}tSD?{oS;>X8lq8LGaYcC(Tlf~bLc`L|>?!6>BITI(X)P#NQmhW^g6eX`|WAi_-MxU^X7!DZxH z#thocIJ+=DcqxaoBKP<*Kjq)BsQQ5BgZX^*3) z>wjuouC;B3w9$jo8VuxO--jL#p;K74YmN``Ku&(MHr$zQ;CT{<6>|Iit)0c<++75) zt755blUP>a%E+)V`y+1*2(0!5DG5qQ-}FfB3;+&(j+0`rOj^DE5&sg>6ghGyywQDN zTu+t?Bp8uWrmj)4&<+~pG3Sdz7DorPn8k%*>b|8s!Ut)Ek!bi_1ur}!{9~m>%8IB- zr_*>p#}t;)3;3cK8#VSjwId{ID_?8Y)PYid=*$QFQVxjuX^iIjqF?-B2zt2?-uJt) zKJzyNWRDQ0kf`fP3_CURe?c7%OAq1y^8qn}nrOle@=HK`8GDsp6o*Q;9cT(09ohQS z_AU)5;*5@l+PaFk#q2mr?f5Q{T#wG&Qn>Gr6BJJ)*JP#mRTQom#|tSA)M)N?8Am%o zyM2{L&7_OHF+YzIqlcLza+blLP`M?xi-&E(*G1oQ@E`N87xR9xmcV zzfP9vutDTm>xj2q>#=!DZZJT!J!f80TtsNswTQvjMu#|hnW6_YKH+_7h2@iGd>Ey& zZ%i|TCF;)GqL0!E88WbW#JE8eb>5pJjq=6K>tSvBC{ENceu}ZNsp54~=6PNUNR>de zX1nC~lgKzw4Sh|k{L95>*qM1~-y#CRui`xI0{{|4=8l^!et8fc##JMc#FQB-ZPmbfi#QM;cx?^>AC++uER=(c&z&7wfl+4}ez`?p%Y(=N| zJ%ta$tg^~vsq~ksa4_5I`**#uCaA!78P2`lec#R8_-i&@PkJ7|p&}xU%#PS0uOo|( zR_Tu;!SUFcikK&p!Y63EWGrJv&MMiuD_7$`N)fEoM~E*S<$!E!Ak6qcu1o|`+$+6Q z&syMJX%iz}(om(<{*lv?bF2sqzei(?Q*<2N6q*boQ^;~^wgnP++ndRDxTW)`StN5$ zphx3Z6^HF&rp3ld{&1I|NjTs^Sv8aW>~9harJWRVf>5}8k`=)!QTf4ae*>ByJ38U- zs)c4>2n+(bpcP)yTB;Q0j#t%+G(` zR`pZfrgeu^fT7dB@Mu7OagaMSgq=u&@Yp(@oQ@^*kopbOd^f9AZkvpd-0}91msB~m_w^i< z2`sp8u3J`~Teu1?pC>7J6=xN_0A6eaNH5IVS`08qj^`bnvt$0m0P&TP{|!>601b4#|Sjl&CIB?E@hWLrlgG9vDDEHb^*Op%vptJK+g4*~Sqoh=HZZZq*J& z;zr~FNpN-Vi64sAopqf7JETb~COq;}8NXh8Da)3|?}FwbQ*V=p4mX@4vbj{WT)UP- zQ?tTUnI2d#>}x}pVO}fd{;qB%2yT{wPa#qrrWo(p{eS_qq^ghfVaZj(1#^)6Bv($R z&8Bl;*k@*+6qPWRJ%o!HC%a{OW+H?%0kFuSuaQgPG9WtO;f8(?>F2Sr92zItt#=v@ zS1B$M-PIjoa1?oUnOKGtwv)ES6$vWYdIBoPNslkP`YfV%D#cYLtQ;9Fs-4XZawhL^ zy4`WOdb$8PXD;e2K;pvwoh129l&Dutn6rt*#q}sr{yJLA{O8x4tb5aGJw*^~U6xFVrkm&RkR7Y>4+^5G9Tfkc^kM-70sXAiTHm7viaP)O#Mz^v4WfU zUVjgI-&0Y#_#wv-Rs*fcH=6v=Xg!Ky!z*T}w?Va{GvHda()yq;2`xxSFgn>=Hoc1A z{J9Sgp!f~KL6ve3;YBvLNE{IFS(R42Rpojl>+NYtmML75|7~6pc3#|34QxI-?rJH= z`>~^_xH>BNji&*37=Ww)qAFpdUH4wCD8LNVKi+z*Kl!>Lc!%)q=di5%JKH@k4A7RP z0*Cn(Upa^RZG0>z3EXeIW+*a(=02$J^83P|AjeFqQAOr^- zZz8k$SsWnIh)jFBT-I-3f^?x~0lMN|uZvB!PQH-F#EVTqM;+7B_suff92|MYk3Nx! z%yS+-#$!e*FCUv#OApLYvZk;P&i#r8U}#N*D<-Hh!}1Uz39XRxQFv1_ch*XxEr+?s zGGj5=Q7KN8mDt=qX|_%nllEIkjn2B%o}IP_(^DMl2l?oxJ-Q0B;g5nI((#GA&0M4W zET2ClGW}eq0twEETff19h6(eq%hc-4dEKuB_vps zOde~9`Zn^5W<9=ITWT0&MNHa*7{qMZ+!26flOSPq_^>2}7HI2FtTgZ(xrhwC;~si7 zs0R|UNt`k55%Z{KV*P%lr*$>=@h$7R35U|>wM94B+>)S@rK(OMe!Sn*P+49&SY8i# z#6H@dB`KFZtzjR6CN_}Qz*_cqQ*GAnAqfnwV1?oT#b1EWByaWK+Y)&Ux>*fs*d^(n zF8?gg)6Vju4}F8fVb#5Cw;qBqynh2x)_PACW@&_a&jhs2ka$^zHE8~zsAx?dyqdC_ zEH%ef*G;h^i2SFasgIBSw>iaMin`6-RKoY=_k$#pHySnZz&Rt0*2tH;ggbmdJCU%8 zlIl_jjv+cfY(oB@0xSs~8m27SI2z~#icXP&zWtVy%?La5?c-fc14}&RzYCv_rwU4Q zKN0{MD}8&yz1)#@SCY-Tynp^wi86l37fJ12J8m z1Af_lrE?|`b{_j{)${qldGcVYIVV#t<&}q@|9MYJ*`@Y_wsMP<$q7K>&&kDhuftt+c`^?X-xLc#I<3CH*O$o&mcy_<*?rp5;#%IR7u7^ z8>vKnJjr|-aPNMsQ}2SXP?1Rl7D=Ybm$Xt*t!Q1)8@8TpE55lPbj;JDc3;~2i5t1i zLL*RThnUqbe7pUx*8X%%YA<48(Hzi0Ay%r^1~*Tg2iN{4%9KnfA^+(o@5Z*;b-C7+ zn(~33&Rd8M1d3wT(c%p}T zk(|_-5W4VCIQ(-0NE;a~VTmrAsc+p!OeiFD6)ho<2lS8R^ZXD=@Hfd830t5D)oAhXRVrTAYjP*I|1VHyG~5P2kw$vYTBO7JEx(|iA9IBCt**st zNyaUP5p;@2tF34kg{qIN&Y13Ix=k@1*UCngk;B<4J>Q3vofB@?vl%{VDc@+2@8~Lf zz*Dr$F)h$uaFMYr1$si7Fl6B1=9eQ8kusAYBYE{j;0;kejOk%aaI+c{ar z1x3O>Zf6$6zYr)jzOB#N?0z}MAly_F{C|D;q`qjy-Cztu9!n}FA0e*8uDIWQ>64rp zfoLGc7ApuD!uM{#8ba*vp?GMSjf&#U(2X+>4Rx z)2S8PQAtn|`0-_%BZNvAxT<6CaWb7cv0P6ny$hhX10}5ViLFO#Kiy^D>vS>QREq;0 z3DLBc@dvI%nqG&n3&TuSjJeZm0p?wst1L&o!kMd^|gbrB0a{B5Ks%%%*g0qU%zw6tB|p|$TCbY z|4fGW+3t;CXG#9msWjVd*iuer&N9*L)Wg%hAfM!O`13<=!d6Z}OK)XCLAqCX$;O;d zU${`l?fJL&>EBHf0=n13GWwqPT|XaqEH!(1da8jrYipcN*6|>H;8S7`hkv5n`;zec zgh16So#51ez8=t>P1Rm{VApxW7@GApHCLxj8bW$hAA=~7>TwAGbsRgc)bs1> z!eQR-fv4CGL3rWM3GlpQ$(IK+f}oJV`~tM}0QDCS$RPc}eQS)WmRJq2H|8=V=4tKv zSR^6f_9)^sAq`zHB&U4gNreB2co8LjUjOB2_zRE0N!elBd|CDSTfQNOf%a_;D`sW< z6vq7^A%PJb9PbjFpKdEM3>}6{k2|~{%4(ePDx*fT+3mg+%o7rsWRO>K52f6r&cq1E zcWy-_+BJELI66R*MscIzgKo!?zHL<;Tpc~#L=^eulM32P&9wekhu=Ovoxx`s;sEWC zjAJaDTqz-d0}e!l2sdKM^zNafh1no!+@|h`3~`y!Pa@G{!)-UIDXYSqajrC}%1s{s zpw(}g=~H4{``)L?^BrkVE+246U%gL`I5%#1F~T>KFTrtW;Ow%aBD&GEe9$`KU2;Qi z4gWjP=S|P{ZA3uJ)Gfj}g!03EsY6|`I@p*qvJy7U=zw%UX^>~xx z(@8)Rfm6q|2|zFM>yJo*(?-0{|y=jr3AFicK?j^du^}=BT}lLwZ7U(!RqEZxF@cX9XZ` zv`9Dw&a*FIANiDBu{}5QaRkdbkj}9gDA8_TuhddKA$GQ}BAdsUOok7O>VMZuH;jhp zL&(vqUxmWf)XbgYM|S-h{X$@BIIpUlELJYQBJ3Ch7JH)rg9vAfKhDRW>Kip1K}(qP z-KyDjF1zj?YWqITIxFmQGem&H@(dDqxx5bkH!W7}cjeN?mCyRh3plI=W8~`g4*haG zwq?HN#%*5fKXXm-W}mu5Wn1|_2-?5Bv62F_9$2ok9sNiW;2%5C5r7fl?21!B)rtQE z>(5O>BeTrQci^oO$bw{eK-ZbqOi`U=WS<^=8BqZAZ6IV~K99?Rn~(lD)Zpc0*xueA zYmn@bagUF4oqb*X;C57)qh9L^y~t|wS(#v&gHPsALYR*Dn74=e!U6>Sb(_K*yBe#p zj$4sb@~DLDg1j|F$xH|(&iJbZ!;lJ*gA{8C(}j6R#=ep=c}Xm62gJzdGpW%St$H4I z38~lVGb&tzRyYjFs((c;WL>2cP^ma1elpNDbDR2vP5>ruRfZ+hqa`FU#7=ZdXyI0e_?4I9Qm%;#_;-5^c;(*7UYnM8DnTZ1K!M2za8=wZrY z73J+^)OuzT?g_3(uL%B7AXCJ}*XgoNvR<7@^=W`R`VCPXcoM&ZdFFu}_SVN=-+UO~ zjB4KRo_}izCsIO1gR=BO9Kx%YOW^QBt^?pdWkm1bguLtYyp8`htC?H-P5Xf_rbLzu zKa{l0&#ft%G@F%I>?8G))CIN1eEYJx%W+Mq@yVkK*XpAHv-BW}#B@=i4$pk{_ick_ zEF;acdj0$qc0MoV1wN;lH~CwQ>P)u!@6Z+Aqs6LlP-(?j>QW&wqe`Q1vlUlJ=Y`Nm zv7Wu~ehJo^bSQ1Da3JkB=*fTm4qIEWrd)nqT1%rmsoo(Kh6S4o(PJ(X{sBjC06iUV z2p3a=o`}DIi@oXuiI)G6#8ad>t!U~$Z)v}3yaO2IeaOgtve{sgvWYNm*|4+?2v(A* zQC6ys*N%ck0^T<0ErkU5WgQ4TPYJ%`5mGfwuzrP8VMsV&SecPC5mw-bo6K&oK%!2k zK8~d?j~7+ zEoA4pf1jyZPB8~8@%IL+)z5jx*SGsT8L1(#SgLz_Z+Q8qSAp$R%O$LFarkL2Uz+d2 zO-onOyHf54Z%4ZNsV9YI&Za^pp(+?32gqFPk!&vywWij*iIl*3D(t}EPqc+ zj8PCd)l-L5Z^oGz9@M~4Qu(3vDnNQ+WTfz|g?T#-8F90#i#qTdzIfJG*9)43^M@29 zMW{4c-M92AmhcgOx7~hli^vd+80cuqAbIw8YQlUjd7b9#f>Y-EJn}X% zURR&Z@{y5|KCZ_mPczxzpljB_!ruF5SZ$AR;h59hZ>3`m5jwREDr>)-ME#}TiZ|vh z7mltiq7Yg*8HaUsWDr>+ZtVn$Z;Jw}<;ga#qjSmbVId_IDfJjP-BQe~ou+^*GbgVI&NU+v~qt*4k?WmI79+(+d5^9G|sVqZ=4pc)tHpPdjBB46br`H-s{bt~r z##RhUKrlJGyEiHCO~Ml#V6(+T_e*t3?;h(H7Z-`5+*dM%+C&1`=<7bfJa%QVFvj1G zMrM$%@kRuK*pkzA%YXf-+Z8fhG^daSxKIw$F5S59rMbMFw8qhRXlq78L*4lbX||I2 z>@e-?iDQoL?qa3Gfd1X@jeuU7^ZVNZRoTqO$jCnLac`9vqpyl%Yo!I0Zn>qA#cLPS z;w(L!4!iNoRySkAqNBURWp6ia4#9R&RgD%(f_Fns#2I zL&Kaxcy>;m$Yq?XsHvWpOE_gE2wdkh@EWxLq6h>6S7}YxIy{lQYoMQ`Kw=jWNlX&Z z6jdHpFN|36Ii^kl@m&iiZ+l_lnDkliik7N@!^U^o*lxsY5Nk#yIW!zgUYzLKGMg=n z6Q%jxg`GjJL=6ACchj%5_eGKRJxZ0%H(Zs`v7eEC;2bG^H z!5R#bb#pntfdLndqf<0eV5Q#qVV4}HPk<*{kqyLU;Ge|bqjAUI-Vp-GU;RXau`@6n z({g&@7)#-oQ-f?jOd+w-M6cihPsv0P92=n@wBbC~$0!I|m^OU1EOpkm9j*ruAWd$cz4umIkRrZf z8pSEo;NuEGAwte`Cqan0Yt;$h zM9jVe<9CnJ>MPfDjVeX)N7zWdSn;yn=h#9zI^H62E{gt;K;C>sIJk+vp||LTjIXnb z)xDvjBKj4p&mILbYt#$)Y67j&!&ky|bX=vUPfX)rb(3c``g^Z%Aq^(Dw-zpPxD2Kl zPgQ0T-z>1s(a>pN;qOR@vRA?HNmC!G^?pUDn0gw&&y&s*V!D;w{-fJ<48cz1>Pj%7 z5yPPX=-!OmQlsI^tUx6%cW7>Yy~?%DDQ|KvH1vxyhrP^~ZV`fDWYM!}n?6&!*`0;? zvnPuZIIECh!VYrvUz9R{)|$>2B5+4EK|Rx6`lfgYRb^$Gm`xj87YV`Zj428aA&2q?6{!p{C~Q}QVTmz7U;ZM2|Zw1r}i1eB+) z7M**OZ3)4^Tu{Aw8Y*TvphAlV^UD&+E4RZ}H`%X>}j>E(3*P`(@BR#cUqs)SHY=TsV zSs{3lH-S{Qu=E4luGSonfta8KRA6snf}E@cjX+bs=@m}AkK6S~P@a!=K?td;bHReH z!()=YI5+v*&MbPQHRiW;HY5M^L@l$8vdL@7vMTlgTXlzjsBh14)tEBdTsmI|-v2$W z{rGa<`6&=ZN{*n;zywpNPAY`b-0q9-6eZB7pkHgBox0a$?`^KUG7Em|oE|nTRK#e^ zPQ6sCT2?8 zHJcnTR)m7}-=KR$8SKZHK3B8UK<6?WJEtzwDRd8BuaaLKT>S>Xkd~J1AM{ZUk{dnU zj~wZO^Ua4USHJ49z6-o*t;Ar^oBwuW?Ks=Vz>Y+U5@-25) zv$^LV!w|fAzm3t(2BHK}Axqu&X@7LXKN**swf?Kph^#53cySOsras~LcE= zqz2F+R87$!^m+ltI=fk+E(4!iH=chFsC%kGYhEybt1J8}xlL$=7J=I(QPuWFv`(Ka zpY~Hjn?ogdcD)}OA2$Qv+a|yn#hTjacHo&k?$kgQ(w(TDFAHhj&&d}Fa5`(5m{`A? z_i?Z^1*i6>_0<4l1;fcTb`OZ6t`yQQJoqNfe%suD`=@UOH;#I2^A647b6(|)IPT)&ZPEi#V~63r4@0(b@M`{A!Y_x8If)5s>@ND zomMq=!GUbcMK_BAequ?+wFxgFH1jF7jGizne)P#8Rv9XRPb* zfPaCj<^Z>9a{lr(^IMF@$tl>AziRLJdnCq_oQ7_NT})LsG3Qqp4j26-d2!A6%Cw4| z)Ip##nC&_h=j!%#cxxuw#>r>C)WeYcUO@<8T2|RGk#K|U;ODxzIqy&YIQdg>M zqno)Mw-1HO{T7SZ3v?Y@{N{`SCEK_5Z}z{4jsq`6inkUlOx}NoQ=Aeh8bf2@po6GT z&g}U0brE9~w^b9-!9w`qpDD)ck24fTFe4UQ;zMsLpK8w}S-wNGKMIxRJBnTWQ7!zY zJNUL@H0n40C=eQv8^kLiES7;^au|a47yDdQ<2DZ!XS1H7qLLNEd7~wvSg=OZ6FH9d zubZLNhT%4E3KSVl1^E*ru^uBlm>2gKM^keS@&W@mPkv@n9l4dJ2gMC6r#ICZyfGr# z$b`g*-seV`cDzOCPf~(hC9Ve9&X+tF>f0NZmwOzmJ&8am)PT?bQkUsSMxj@BWzdlQ z6~m65l!EeOjRr>1wG&;xc9Y>{xLEy+%Jbq*#lVge)Z=s8wu|iBqJ3S)QnQp8BURtB zy-ShA2oYbBA(LuG%A>CoxnUt!PTu*$G)!}-RxBOdj_#F#?(S7Tf@z0nREnmkV528X z61SUoO>UsfpGp%|?gYprW|l_4rmr{q?i_wd-HU7fJ@xfVTyOM&8mR9e`Hq3q8OAl{ zp~dzvp)dwK{4f+dq-W##Ov^c!vxiKS8k!n_$`u8?vNxVWUw`ldStZrg_|+zXp0>?2 z-j{#5>5ELZwOnArwxPC13ah5^HzTH5J7$e56_39zpLH;XJ@?}k%-uXnuAS~)kLF?P zbP+`r=*Nw2NzrkH7PNihGMk;+OdjUFn(4x>Ll*2~uAg0t<88ql-0^T^SXr^*gqVJ= ze#kb0_4k|pVzrY}HI{cEa)S|SgdTfTqB2}pk7yJ3g=@Lt=L&!jDa-mmJ%W2Qeu(}c zdI0JNLyPNv>jAB_Yt;sCb+(iRJg}e)axI5&VY$ovJs#96?*v5X`|WG6$R$O zzalF9Rk6DAI^AW8pE2>duD)bhMA3P5TEjR$m_T7#Ul?ft!u^Unrot3zUZW~K7n0hp z$`&IRxHB?jKfV4-3hD6qySG4dl5%tOFa>CyXwqx(d@X~eDh~4-Ivx+(&#{Asl2_5i zZ*Pt&!j&uXw^OeE>)r+J#jdTqgQ>wv#GYz`!bock!NZ(Cmllu=L#2EVs5kfmr z%l~SoNeA<7ZLwe!8p%HmRt&O~=xnd5ppH)BH;DQ2HwACi@ag!c-^VXYXt~g#h=&A8 z4IWM7I&nBp5&;*v>Fes76Mxy+*&VG^m=nX(T*d1VFnXcgB6wn~&D6wLPHyuA6alny{(xSV8) zTv0RzMxV-(lj$;F|Mw^ePP3<8Uedn8l3Sv)mNGMd3Gw5~W~*-D9Rrs|_+`U`b(mqb(B@Ed%$uqGLArwA4_U$R$?^pH zKAW5d+?G#TGQdl6syYxh-gVyHe%982e44!Z_i03?10{PuW5Hr{yt}pPIU0ZSiq>d! z3R1C=+>AaP55 zbM=AWVLrU~xfDC*MJeZe`xQ1<(GjDpCIamVyg-^zO86fN@5I;{cxc?}2jaHFmK47? z{y&cxAstiVpcG})HhtvgfWdre0Q|8tO;isvl9t4o&bK+8@-xdX345gYmH$)AcSbeU zeQyE^0urPs0uhvA=$(Why@T{BRTBcCCG;Y__udo8p{2Ld=@kA-v(qaq}L!}XK-$mXI z)xPg(y@e#HkT*R-<^SFkg*WhF-^?ecv=%l%+E2_k=&kG$a3?MTxO`^jsc5bG?<(0L zjv!c6BdT=mAgt=VMW*IXSN^xf7o-y1ZGCiy-3gX-zK#v%!u=z!!UuSij)rbrRg((l zn`9-evPuh;XmDlTldSs5gfJF+Hd7zUXvXvV?G5MNUu9NUeKX_a{@dHJDQ|Krlh<)E ziG12Y^PKt~D_Azmq{=#X`D9pJL-HGKA>RE-8uj8C`|$5&$7%YXw(S3mzs%!-#6Hut zU>>unD_t*>o8}wUAv%MC_?YNdmOoi0aKytzOcqFW@?U`5dUF-zpPN!kQr)3^n>5NY z6F;4Ep5nFd3~DNYfr8+B0nahyMbPC48n_c2k5k|zZ@+s2bEh+-62ECt&nL*rY|YlJ zm#z796TZqrdi+Nv0wxvrXT>Sk{npud-WZc|3ri52Nk`A?-)2vHo9)#U;F-73Q{WX* z)OS~scBwGTX=&Ntn!S#K+Xt@F2`uQBL*O?*s33`Wa@}CXUL~co4({&V*@Dl&4A%55 zE2Sx=$+WB=Vhw#!RB-3!S1*N=2lC}oTN=>%HwUntYN&&q^p6Ow82rG6p;w@7UlkWCbnw9rfbRK`+bAU#(kChy&V19;7 zT~eYx;E#eJQuuwi_*`WF#b_Nruv}uiqNqSk>Uh{cb*pb9PBbNk#VR~itMW1+6RH>nQg^(>I_B`FDn+SCS&B4;!02fdHEV{f zf%h_~S{8$q%}zcf#7Ri~iCyJo&%7ICkt#~{Tj%ST0OhBSkYQboo@ztv0b>7#K#U5l z^OV&(lxbx-Jq#xR6HA70E|7>Z?UfKoj$o%z0m?OrVnhxf%?_W^L|Hruqs{D%+!=iW z7aOx_{#d)HPCwsnU%({&w^~I@5@#LTMZK;Y+n16S`PfqW;E#z$s%jl`r;^J_lrO8* z=U(1d@<8InSol_5S=Ysrar9srhK_7k<()i-X^e@-v2kSzH{!U69LyjiF`~G>67hv5 z`aocDG?G>zf^Aibw(q{FrB%`5G^3fL0mvZ+^5{i^K#s6L zDY$4u&6VV21p+(0RfU+13e?4oSZ>m*lg1rNAVptGkM^DTw_*J}NB$G`^%^&bpDDkAl;-Gt!yiw{&yy+q|Y3Gf;@3^|^SMq`>08a<+L{*ZM z-ppcbQPf=ka&mK;Wu zY%(UJq6>#1N$rdpuQJlD1 zOZ`l$Vo&qpB&bNS?dF`N?@Ek?|JIdy_}rrAQDDy;fA=NZBzpK+d-wU%Ogc{tSR>l$ z9SKH`VrG;C^6CcMufKjpsWx8(g4UZ()^2Ii0YaFT*7|>oL8i~xzG}=t>xd;L4hvtD zycG)p1T_5R$1rrY33%$Rj;!RD& zE;t}Ry|~lsm_!%y5Qlc!SBH2%w?mf-UpE9i>n{h&lW&iC(wpyr^YbCtDVfeZ5hPdo zA@xM-zyr)}```Hkv&CEzYUS%g#cPr9-!9n6Smv>T6-xz&V{@tExu>O5l&#}3s0WSR z-ifk2nMHQ`R~No9YihcxrR%fdY9rS0iof(IPt2(dTh5ao;v$+2p399Cr-;>E_xVMq zBpm6{L+LwpUaMraIxnB5S)~^0BdT`sojXDWrPB6&novwQ{^O*{#VR5`%!sQo8J~Mg!~;YefHWw3*uf?7D>u(Ns=KK zP@X)M(k*4m>4{sANqNU6{yWDVQQ9O@NznG{bj1( z&#ECgmK8aZ_oLF8$;t6wTVI}xyr@FRDLHV0=U)x<@OeK!)?eCZwkw}%aR@b7u9jzc zgOk?RAu@0P?d+obD&pwaA8N`GokSbw6jqp$%juuUe!bIsNuqP$ceiRf9p5CFOwRZe z4rm)P))D?Fg8_%we|+*so;}eM0nt3KqclQ5F`W&BgvWw!*FatMS!sN6Id5{+eWvk(tGgQ?WlXtbI*m&LdcDfT@v}n+SpR=`9y}r+BCp;a84iIRt3UG8= zsE_=leZC6aD=>W@%L{j+)qVi6c+~!Ep%;Z2hkc{flpON*rEN}%*?Bu;(e;ai(0`-< zzOiBErB2-$zbTb6Fgi%(@CX~y@Et?%M=Y$t`Cet012(FJ&;-;m@1&pl3=Vj5Q{RGF z#?cXX*v&LQxh3nLr{Woonl_}ch__c{Tq;LL8O|ngZTp3LleEzugSz67?p{ygX&S?7 z134G)FA5oN)fzmuO-HhXaKwMo8Y|O&Z=c6{BITWQWKZiAq7mN^m-TBA7&|I*v+NC; zzv~MPy4mvJNs4JNxX>_ZMd?7&PpqC*Z!GT*Uh=_#b$ZW_R1*q|MDAv@alf%80$D5x zWp3%JzoJl4oVx$n%>1{k%<;(6;K}F@kL8r9R&3uqXoRBoSiesT@^<<0BP+l$uzwRlP=(j9Kcq|^prj6@OL+Yf zu-I`rFE8_3P;jc);pAre#9^DTUQ+5JAE*mT>FafGVPDd_BUdV5>X7-)*&`$Eo3+&8x9GGo*J#VjxD6PO?ip#&NN>sBukJb7 z95f?e+Fv>OG*Ka7)r1sD^#Yi=BD!j}srYe>Z_?w+@6RV+gu8iJpf~_gSiOhS#)bEr zD_65_#ne8vzUO9yFS|yWjQH|VbHRu%PuJ)j&nQs0Wdl*UYO@Dptqb1SfT(F$w2j$<49W{?&`QVt{friDJ|?$)9Z=ljh$o{jg+5Y~kj1Buy-ORt{fw z)!}p>1Cs0(VApxuTp3ZL_FZCc3R0Yp^58G4Px)+{tP;Z12fco?#y9&CyXQkG*d5Pp zeMduV14-*UUtRq;Z<)9TiC$5X(@@f9a4om`9%K(V`{H@4GgrdFiOWX?HitG8dgQP* zqFO3fP=)4&`!~hhvB5}U2S0w5pM9{e0?q6}ER%9o2=bBwgp>gx;gFNQy;$Z6) z&|t1qBkD5)ZJ85n0tLp~DYD+&vQ#p`6iXWo?a^PNfIWTY9Q}k!35izFHneuWjJcWN zAQV+xMH+wN+JRdZ57;#~dvx>8-w|-YfUAs8&N9Vf#*hc*83NkKeqgu+VF+nig+>W- zy(mrfYa?O|9x~AghIks>*H86F$177{%@9AZXy{Lb?zFUP;2fGmSzdH1N@;n4zr?f5 z{N$htT?Kzj`)~+i(>fSa`ikUh+M6MN*9E-+weF0&B9sBP2^tPSHf4>ca}Fh}HR!qu zKNw!wc2{VymHT$9s_iQ_s|K8FVpyypPwu^|tSLw)wkgKP5z`TjgV^j8s!P+gRjQle^Vp*gQFY18ov*_Cr{on0m!aYyQ!sN+HwC&=V<$eUF!y0 zKD}(P5UKA7X^d+TiN$GmOKr1JhJC$BU5=Lk!t3>FCS(Kr?OB z(prFIL7KOZvv-aKmy4Fi;oCNe=gE1tO+gQs8PQc!+nz7Kf^JOjQ1jYtlzK>2E4QtF z32}yw%aH_aA2i|`wDSC<(T8H=qLl|Tt6X`_t)CjS9Ho!XV$0DTb-DxM*8_^=Jr^I> zL5~VE<@^6nMic+{hZ+B83-bSr@P`PGb~-te(3w+Qe}O!3HrNrd@o3Sg8%V*efcjXK zAkmn+{#5@T1@Jj4@5P8hZohE%8*#A;QGxgcg;)F8&SyeF?agn}9C}9eDjjd&%-Wb_ ziq$*zShPXIx^2H+!h+`?2!ikC#m!}3ub!ggNJ2`9I2~$tupyg#1&HWc!gMz03}xq| zV4+B>wS$NY4)jxPk<1A3rCXZUbMk9Z_jc^HpU+FnTyMWaSwoASRS>j-O&A#QQ4Jg> z*kZ7+!{N~dDSEq3AjeHWy4_2MHTCHfwXtCO+tO4Ow%cEYp>`fbYc+1p(nTDXJ(XI- zo{4VnDeZ096M^&vJIr%bra_RWZ}egJ{0CQMzf5l?Nb}=l z^CT_Kl2E#{IR_NL>GjcAYDPvLce0E^;iJYh7M%ntZorM-pF$XYm9`j#DLFXImn>3$ z)(+*`Q1jc}=;f76Mci8$zxI}wYU6N1NG=(h;UtwsI?Z#IXgCd#eNlfyu9SN>`)8^6 z-SV7wdTCZ$_6A;$1J&;Ha;P{;#)xvSEueGLIXHc5Zi~vKxBsdkNyXI;S;LqFXx?%T zeE+T<2}a2!`*wgOSq*xS@Dng0C+U^+W6pt#Y1ig*9FI|r&0<*gj^?Vr0+6$ii=eIB zEqYaEQ80Bk1+{ACfG6G@GIv+r$sKA|1SMzTe`oWPojeCdXFZKKM#*0LWm?M6_yzrw zV@_PUnv%lO0dtzS2OAGi<%z^S3bLQ>TlJU#DB zG)bQKbeV($7RC{IwVX|}-=}tNQSUdRtdTFUR_N>5_cVy_8PmC{fy8<)1YC(kKj~#1 z#uRh)^v=$G*F>AY+zBqmNqmepxors5)G*gZW)*8fJ56kUIMp+nYBOu< z%ws8rVE?wj3#lbbLELhOfOe}K+A-U4o`f?gk1r%)#_=yF8U~Cjm;7q4{zNlw9}@$= zm!0>ZC5rCG1%pL>?=>AZlGsvJ}53}VicxbzW^KMr2kg0ATA5ek5rMFORh zA>-YA$*&=`VBfU^yQZxJ_K9et=b-_18`K8Cs8C_bksc$6m_F&_TZ6J^lqdbCa)xhv z8SBYct#0_`yX=3x6)rHjn!Dx&NlQtSuDZV6(ayT7-i+=r8t1)Ps77OxpLnl!#B*z*(MYK5U#)r6 z3BT-YN8;a@>!q^72_YtHZR#Tm#D1;L$O%Zi&~NIfd>Vf(j8K?zO+juRIgmX%5(N^E zbej!mW-Df{e7!&^&$#m}zc;Ao`PjWhs31gJU0w+Vjb;!Yc?RsZfl53DcF5{h^BW_O z{QW3bcgS=4?Cnvq!ppYAS_<6uoA=^5xq#@?JO*SqjSs~|y>7G#`AuS)J}9ZXMZpzF zKSm*Nr@bWl;-yTJ0ubFIh>n8Xou@)`H!{uZ*^4z6P9W`-3UL!rikLz`Bt!{F`M*+# z^KX{ixbzxZ6`J3Ne@QZ4j9P&vZP1b|%?}ma--JCmA{KWzrm4`>nAi;uyOkWuPkqr_ROFLyRrWKq0NK;IATX zciR2~IRYCbICGfyn>HH%X1S_^~+Hq!NQA+20 zn@zd2BxCZ&#^XVXzdF=)g>6f;7+db&@1(ME{V_!oi|b!i)#$43*v@SPlSbq9{_aNM zL>U4XSg5i>6NYNST8E5oYP_+Deuk!SW$1_jtnEF=-(1Hxmy%0hg=n7{zgtnc%gdbB zHn!Y^7HSJuLU9M5c9WHr*`PZqBtRB5CG}4aViwr7p?4J?d=J<*^`Vk+{>O_Tp1%hX z&#nkF)G*s9!;*tE_CI%5dKo+;@XfN0<}c9zhrh^RnLhWjflvaFe)3$ZOPHa9)xFPr z{eFi7x33eqSR%&QzJyiF^wVHPjA@+<7D0$Hz_Ye@RlGkK`L0?ddZT_x1Vh5JW&0KF z!c@SU6md zv{S;fb#8W6Yqt#j;MAwb*x01oc=fK?xq2iBeYh?}XKRC5c2eC5%}pI`>FUHmzIfEm z5KrQdVO0yBP&2-;zR2rbU3O7ndENMk?nVeuuNYlJ2R=GX0ij8qirI58zrKkiUbBuI zL-M#vC3W9{q;PwFVt4Za+oMi#E7FbflMMiClvrfN0mBXlkFvCl?g}y96b&JffpX4%G%$| z49-^$V*ON}8>x_OGj%xmObIh~u+^s2eS$L3tOy!>* z>{?$LS-6w@A|$a1u#5&lCk9nNq}`o?xx|NO?>^CmYn(dAH zQ1foM41?c!_?8RSuux;-WaGhW_mSCv2l-i(EHd8XABw99{3EG=50&{RU1a7;={a>P zOHa*>dfwM=wf-B9_ISZ1R3f>nEEEKNr;*54Kkv@8vht1tGK2FphDe5IyE*S~B{UC1 z2K$?`e;*)6($$A!6fPV3TL0;jT@`&k%#O~MR%gqC4kuH_wB1w% zW~&Mnw&gCilSsopepob^wv{FZu2O*HA0#jcjj3MKb%+$pnK~&)?RzA<*hLeM?H9O`lPN~%-m^Hb8^P#WcOhcoH1_oWwPGptiS|c z7Asr&990z3VQaTArMnod4l3^U+|r}^5c9g|ahc72T2ASnhS1e3ZnFfwpcm@S`zu3F z`4h|82!lY0r63`+FYHjoc8#x<7F>>6#1aF=^T?3&pS>52Mv)%xKzz2D$j-<_DhxW@ zV`?IXIV15w#;oxyZh%+TIDO0W70?jhiwnXZK{M$SD+>vuOQJRG62`6UkfJDa?i#O! zvh&nyW2@`EoXITaltlh%?-MTFA7x%Wsx$bEsY+T%320pEdC^Kgv3ONf=a;fd-$hdi z)!euG8MD*hy80_yJzbyR9|d3Ka`9A`l!rqUqR0c78hqHwgga z7O}Ko^BF9LQ&$-v$fnHUWD5CKMqpXu&tZo2H0|kVvpa5|)iYxi{)WMnoPWP?Gc5U| zUyQD#1rPC69(1tvG1`{hBMk@WWY~t0(1%IEs?rW$B+>#6+ z2mN~AIeXm=LCA2PawV-iUjlp7{^M8?-gBeeOm3>H@@Z*SqPwGdLX(pHH>ZgZz_0t% zz}w}uQihI8zkZ>RXZq1{kz09lxQnWGqJIpndo-IWwmM%7L%_dk?T6bst5-MYHEvvo zWQrmm>#<=4ztsxtUaRC-UOGx0d6!@2zZ8dUp>O;4_sl)Ca07wJ={Y@7U!>aRl@w+{g~8@m zSSmI(@7)!ypTIt+Sx$mATyM|YTKkD;y>N{={8O^-bTy2`S_<}KYEfie5n8+Z^;)k= zb%)TLzx8@6mw(hBMI_qnZ4va)jR6JOh;0W|Iaki?ZgDZr6AUG{5X$eKr`y4ONN(16 zvdPz9xlCqRsaVb;(VMTi;T#0NAc)hU-bt)YTi?923+|ZK^$GEr4P99*oSp~|V%tvv z6t5mihGY!XS*LX6-C_7nJa|I&6tCW#m#s@S z=j@V7H8&$1g`g@15J<7*H%6oQh}L^EA&}TS(N!)Pclov?Pdk`{v*ku4hXqMmI|DYB#)tB5@3^7Z9Y(#x z94$T@$B>p_gvV0OE`jjK|ob_v(Vy&({uld4wX z1_IBw3%2vnZx1QI@}oF41z<{&uIDZ#4{w;#vxKC1*2=%$C3x~ObU#9&sBx1*o2dXA zt4{S4c99&#yVv>7kU=_$axel!hpFX2Yi3EEoBeL%QAzSY`Q#!a0m;#|V-^vVd>x3D zC4CH4<~E7iGcW2cbG-Vi`L6yO!jE<*0=kj0Wsd`G51YfcYEith4+~?}!e|~CZar(c zJ3`iI^A>>WXX4%XeIgWNkyEg6XSB8Ee2q$N%9(Og=T@(fXQG3aKW?c%CJShl&+|d~ zJJ*D5`a*I=bbUIA;CKTQ?Ipbz$$Gp_8u%L`vHy9giRARj&yVlY#?hSqHMY}f5s93r z2;9Sytt@gPqNvc6;JNmsP8Fh;A?4ckJ&Kr#s7Od5;5J$j$S@xP;cuiso7&UQV<$k3 z@WTJ9g426v@4KX*xT%5-SGb99ers_#31LeGJGTfq2gc=TNPU*8L$2EYk&VqH89UKV zP=FBED^S%_qyVf_v_nud;V2TDa7G*YN5I}k7$U+WGQ!P4GLb=$JS67-p=$r>*t**G zr~!Z>5k<4&Z)aG+29yrDzLBXq6tz#}{08T%fupu~c;~l?@=HWU8kxydRRC*{4FaC^4?AC<`TndX}3nr5n7X^C>P zhxM+Grzev2-CoJL+V7mF+)O@irED252u7PsL4yX@>mLCZUt^GlK8_i>%rmA-ydn(` z2Y$wXNHn`*!;FNXTwge6C*pn)Lp9VIRKsgFMvA6JoBmoAuGgXjZ`XGRwxS^xm34j@ zi$B_}%!6e#5FA%VYiV)s|A*A8Je^S8-{!$rnOp7rJ=36bS;sE3v!Rtgr+>af9@4Vi z-QdeLBxZ3rDDfBmEV${6negb->G1mB6u@8<3d??7@vqIFP@o=1cHo5)WDK@`UHs82 z%UAi+qba2u(#6cm$cBZo!0GMQChdG@ADi$&RGRkldzaF$$5DBIiiXdVqc&0XR?oE^ z4i={>hkcj`k9aY1OWzl^ThSg>-JLe8maov>arf hXfFk@e|1Tsb>Kox_tMhh`sXH*hKi2zJ4IO7e*>5qIf?)P literal 0 HcmV?d00001 From e091b8e70e8bb88367b9ec2636c3c87f5a80358a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 25 Aug 2017 23:07:19 -0700 Subject: [PATCH 04/21] Update components pic --- .../images/blog/2017-08-0.52/components.png | Bin 26431 -> 33893 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source/images/blog/2017-08-0.52/components.png b/source/images/blog/2017-08-0.52/components.png index 14225ee5feee2200a59f96723613aea5cd308497..4143b7119c49e26b172dfa7747a15517df7f6beb 100644 GIT binary patch literal 33893 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 literal 26431 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 From c50e63fad92377f18d31e4ab3e1aaf1313a46f98 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 25 Aug 2017 23:31:37 -0700 Subject: [PATCH 05/21] Update 2017-08-26-release-0-52.markdown --- source/_posts/2017-08-26-release-0-52.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2017-08-26-release-0-52.markdown b/source/_posts/2017-08-26-release-0-52.markdown index 152d0621d7ca..b68304f1125c 100644 --- a/source/_posts/2017-08-26-release-0-52.markdown +++ b/source/_posts/2017-08-26-release-0-52.markdown @@ -1,7 +1,7 @@ --- layout: post -title: "0.51: Massive history speed up, finished automation editor and official vacuum cleaner support" -description: "Lots of frontend bugs have been squashed, the automation editor now supports all triggers and actions and vacuum cleaners are now an official component." +title: "0.52: Scripts editor, Nello.io locks, HipChat and Abode Home Security" +description: "The summer is not holding development back at all. A brand new release including bug fixes and goodies." date: 2017-08-26 00:11:05 date_formatted: "August 26, 2017" author: Paulus Schoutsen From e91ea480a9731e668ebd6f541985d149251ae22d Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Sat, 26 Aug 2017 09:27:44 +0200 Subject: [PATCH 06/21] Add section on message validation for mysensors (#3218) * Add section on message validation for mysensors * Fix spelling and grammar --- source/_components/mysensors.markdown | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/source/_components/mysensors.markdown b/source/_components/mysensors.markdown index e7e3ac4c8c45..8a7f70aab76e 100644 --- a/source/_components/mysensors.markdown +++ b/source/_components/mysensors.markdown @@ -39,7 +39,7 @@ mysensors: optimistic: false persistence: true retain: true - version: 2.0 + version: '2.0' ``` Configuration variables: @@ -172,7 +172,23 @@ void receive(const MyMessage &message) { ### {% linkable_title Heartbeats %} -Sending a heartbeat from the MySensors device to Home Assistant activates the SmartSleep functionality in Home Assistant. This means that messages are buffered and only sent to the device upon receiving a heartbeat from the device. State changes are stored so that only the last requested state change is sent to the device. Other types of messages are queued in a FIFO queue. SmartSleep is useful for battery powered actuators that are waiting for commands. See the MySensors library API for information on how to send heartbeats and sleep device. +Sending a heartbeat from the MySensors device to Home Assistant activates the SmartSleep functionality in Home Assistant. This means that messages are buffered and only sent to the device upon receiving a heartbeat from the device. State changes are stored so that only the last requested state change is sent to the device. Other types of messages are queued in a FIFO queue. SmartSleep is useful for battery powered actuators that are waiting for commands. See the MySensors library API for information on how to send heartbeats and sleep device. + +### {% linkable_title Message validation %} + +Messages sent to or from Home Assistant from or to a MySensors device will be validated according to the MySensors [serial API](https://www.mysensors.org/download/serial_api_20). If a message doesn't pass validation, it will be dropped and not be passed forward either to or from home assistant. Make sure you follow the serial API for your version of MySensors when writing your Arduino sketch. + +If you experience dropped messages or that a device is not added to Home Assistant, please turn on debug logging for the `mysensors` component and the `mysensors` package. +```yaml +logger: + default: info + logs: + homeassistant.components.mysensors: debug + mysensors: debug +``` +The log should inform you of messages that failed validation or if a child value is missing that is required for a certain child type. Note that the log will log all possible combinations of platforms for a child type that failed validation. It is normal to see some platforms fail validation if the child type supports multiple platforms and your sketch doesn't send all corresponding value types. Eg. the S_BARO child type supports both V_PRESSURE and V_FORECAST value types. If you only send a V_PRESSURE value, an S_BARO entity with V_PRESSURE value will be set up for the sensor platform. But the log will inform of a sensor platform that failed validation due to missing V_FORECAST value type for the S_BARO child. Home Assistant will log failed validations of child values at warning level if one required value type for a platform has been received, but other required value types are missing. Most failed validations are logged at debug level. + +Message validation was introduced in version 0.52 of Home Assistant. Visit the [library api][MySensors library api] of MySensors for more information. From 8e8fbfb9e33f20ac75c36d4144311dd9869be5ef Mon Sep 17 00:00:00 2001 From: JudgeDredd Date: Sat, 26 Aug 2017 06:00:03 -0400 Subject: [PATCH 07/21] fix template-trigger link (#3244) link does not go to template-trigger header. This is probably due to the getting-started redirect not respecting the tag --- source/_docs/scripts.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown index e8688e042865..2a6abdd8d5c5 100644 --- a/source/_docs/scripts.markdown +++ b/source/_docs/scripts.markdown @@ -77,7 +77,7 @@ delay: {% raw %}'00:{{ states.input_slider.minute_delay.state | int }}:00'{% end ``` ### {% linkable_title Wait %} -Wait until some things are complete. We support at the moment `wait_template` for waiting until a condition is `true`, see also on [Template-Trigger](/getting-started/automation-trigger/#template-trigger). The Timeout has same syntax as `delay`. If you set a Timeout for 1 minute and the condition is not satified within that minute, the script will continue. +Wait until some things are complete. We support at the moment `wait_template` for waiting until a condition is `true`, see also on [Template-Trigger](/docs/automation/trigger/#template-trigger). The Timeout has same syntax as `delay`. If you set a Timeout for 1 minute and the condition is not satified within that minute, the script will continue. ```yaml # wait until media player have stop the playing From bbcaf1c8f50674c75b222e85735fe6c53ab1f28b Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sat, 26 Aug 2017 12:02:59 +0200 Subject: [PATCH 08/21] Section added with a simplified way to extract the token from rooted android devices. (#3247) --- source/_components/vacuum.xiaomi.markdown | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/source/_components/vacuum.xiaomi.markdown b/source/_components/vacuum.xiaomi.markdown index bb3f17954d35..39b9b0457fc4 100644 --- a/source/_components/vacuum.xiaomi.markdown +++ b/source/_components/vacuum.xiaomi.markdown @@ -10,6 +10,7 @@ footer: true logo: xiaomi.png ha_category: Vacuum ha_release: 0.51 +ha_iot_class: "Local Polling" --- The `xiaomi` vacuum platform allows you to control the state of your [Xiaomi Mi Robot Vacuum](http://www.mi.com/roomrobot/). @@ -20,7 +21,7 @@ Current supported features are `turn_on`, `pause`, `stop`, `return_to_home`, `tu Follow the pairing process using your phone and Mi-Home app. From here you will be able to retrieve the token from a SQLite file inside your phone. -Before you begin you need to install `libffi-dev` by running the command below. This is needed for `python-mirobi` to be installed correctly. +Before you begin you need to install `libffi-dev` by running the command below. This is needed for `python-mirobi` to be installed correctly. ```bash apt-get install libffi-dev @@ -63,6 +64,17 @@ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar "" 11. Get the token from "devicerecord" table. +### Linux and Android (rooted!) + +1. Configure the light with the Mi-Home app. +2. Enable developer mode, USB debugging and root permission only for ADB on the Android phone and plug it into the computer. +3. Get ADB f.e. `apt-get install android-tools-adb` +4. `adb devices` should list your device +5. `adb root` (does work for development builds only: ones with ro.debuggable=1) +6. `adb shell` +7. `echo "select name,localIP,token from devicerecord;" | sqlite3 /data/data/com.xiaomi.smarthome/databases/miio2.db` returns a list of all registered devices including ip address and token. + + ### macOS and iOS 1. Setup iOS device with the Mi-Home app. 2. Create an unencrypted backup of the device using iTunes. From cc44067d07fadc8709b9b801325bb60e2274189b Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 25 Aug 2017 15:12:42 +0200 Subject: [PATCH 09/21] Fix Markdown --- source/developers/asyncio_working_with_async.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/asyncio_working_with_async.markdown b/source/developers/asyncio_working_with_async.markdown index 4936a0c06475..40fd82b24664 100644 --- a/source/developers/asyncio_working_with_async.markdown +++ b/source/developers/asyncio_working_with_async.markdown @@ -56,7 +56,7 @@ def async_setup_platform(hass, config, async_add_entities, # Setup your platform inside of the event loop ``` -The only difference with the original parameters is that the add_entities function has been replaced by the async friendly callback `async_add_entities`. +The only difference with the original parameters is that the `add_entities` function has been replaced by the async friendly callback `async_add_entities`. ## {% linkable_title Implementing an async entity %} From 2385b618a2b0dbf620bc28c1171638a72318a26a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 12:43:03 +0200 Subject: [PATCH 10/21] Minor changes to format --- source/_components/vacuum.xiaomi.markdown | 41 ++++++++++++----------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/source/_components/vacuum.xiaomi.markdown b/source/_components/vacuum.xiaomi.markdown index 39b9b0457fc4..239d81758025 100644 --- a/source/_components/vacuum.xiaomi.markdown +++ b/source/_components/vacuum.xiaomi.markdown @@ -24,11 +24,10 @@ Follow the pairing process using your phone and Mi-Home app. From here you will Before you begin you need to install `libffi-dev` by running the command below. This is needed for `python-mirobi` to be installed correctly. ```bash -apt-get install libffi-dev +$ sudo apt-get install libffi-dev ``` -

    -If your Home Assistant installation is running in a [Virtualenv](/docs/installation/virtualenv/#upgrading-home-assistant), make sure you activate it by running the commands below.

    +If your Home Assistant installation is running in a [Virtualenv](/docs/installation/virtualenv/#upgrading-home-assistant), make sure you activate it by running the commands below. ```bash $ sudo su -s /bin/bash homeassistant @@ -37,45 +36,47 @@ $ source /srv/homeassistant/bin/activate To fetch the token follow these instructions depending on your mobile phone platform. -### Windows and Android +### {% linkable_title Windows and Android %} + 1. Configure the robot with the Mi-Home app. 2. Enable developer mode and USB debugging on the Android phone and plug it into the computer. 3. Get ADB tool for Windows: https://developer.android.com/studio/releases/platform-tools.html 4. Create a backup of the application com.xiaomi.smarthome: ```bash -.\adb backup -noapk com.xiaomi.smarthome -f backup.ab +$ adb backup -noapk com.xiaomi.smarthome -f backup.ab ``` 5. If you have this message: "More than one device or emulator", use this command to list all devices: ```bash -.\adb devices +$ adb devices ``` and execute this command: ```bash -.\adb -s DEVICEID backup -noapk com.xiaomi.smarthome -f backup.ab # (with DEVICEID the device id from the previous command) +$ adb -s DEVICEID backup -noapk com.xiaomi.smarthome -f backup.ab # (with DEVICEID the device id from the previous command) ``` 6. On the phone, you must confirm the backup. DO NOT enter any password and press button to make the backup. 7. Get ADB Backup Extractor: https://sourceforge.net/projects/adbextractor/ 8. Extract All files from the backup: ```bash -java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar "" +$ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar "" ``` 9. Unzip the ".tar" file. -10. Open the SQLite DB miio2.db with a tool like SQLite Manager extension for FireFox. +10. Open the SQLite DB `miio2.db` with a tool like SQLite Manager extension for FireFox. 11. Get the token from "devicerecord" table. -### Linux and Android (rooted!) +### {% linkable_title Linux and Android (rooted!) %} 1. Configure the light with the Mi-Home app. 2. Enable developer mode, USB debugging and root permission only for ADB on the Android phone and plug it into the computer. 3. Get ADB f.e. `apt-get install android-tools-adb` 4. `adb devices` should list your device -5. `adb root` (does work for development builds only: ones with ro.debuggable=1) +5. `adb root` (does work for development builds only: ones with `ro.debuggable=1`) 6. `adb shell` 7. `echo "select name,localIP,token from devicerecord;" | sqlite3 /data/data/com.xiaomi.smarthome/databases/miio2.db` returns a list of all registered devices including ip address and token. -### macOS and iOS +### {% linkable_title macOS and iOS %} + 1. Setup iOS device with the Mi-Home app. 2. Create an unencrypted backup of the device using iTunes. 3. Install iBackup Viewer from here: http://www.imactools.com/iphonebackupviewer/ @@ -84,19 +85,21 @@ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar "" ## {% linkable_title Configuration %} +To add a vacuum to your installation, add the following to your `configuration.yaml` file: + ```yaml # Example configuration.yaml entry vacuum: -- platform: xiaomi - name: 'name of the robot' - host: 192.168.1.2 - token: your-token-here + - platform: xiaomi + host: 192.168.1.2 + token: your-token-here ``` Configuration variables: -- **name** (*Optional*): The name of your robot -- **host** (*Required*): The IP of your robot -- **token** (*Required*): The token of your robot. Go to Getting started section to read more about how to get it + +- **host** (*Required*): The IP of your robot. +- **token** (*Required*): The token of your robot. Go to Getting started section to read more about how to get it. +- **name** (*Optional*): The name of your robot. ### {% linkable_title Platform services %} From 3c8b317da2b2731fc3e5f2e8e8bc34833164531b Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 12:43:25 +0200 Subject: [PATCH 11/21] Remove blank lines --- source/_components/xiaomi.markdown | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index 10761039c6c5..274fcc012f14 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -34,7 +34,6 @@ The `xiaomi` platform allows you to integrate the following [Xiaomi](http://www. - Intelligent Curtain - Battery - What's not available? - Gateway Radio @@ -45,12 +44,11 @@ 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 - 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) To enable Xioami gateway in your installation, add the following to your `configuration.yaml` file: -One Gateway +### {% linkable_title One Gateway %} ```yaml # You can leave mac empty if you only have one gateway. @@ -60,8 +58,7 @@ xiaomi: key: xxxxxxxxxxxxxxxx ``` - -Multiple Gateways +### {% linkable_title Multiple Gateways %} ```yaml # 12 characters mac can be obtained from the gateway. @@ -73,12 +70,10 @@ xiaomi: key: xxxxxxxxxxxxxxxx ``` - - -Search for gateways on specific interface +### {% linkable_title Search for gateways on specific interface %} ```yaml -# 12 characters mac can be obtained from the gateway. +# 12 characters MAC can be obtained from the gateway. xiaomi: interface: '192.168.0.1' gateways: @@ -86,7 +81,6 @@ xiaomi: key: xxxxxxxxxxxxxxxx ``` - Configuration variables: - **mac** (*Optional*): The MAC of your gateway. Required if you have more than one. @@ -133,12 +127,11 @@ Automation example gw_mac: xxxxxxxxxxxx ``` - ### {% linkable_title Troubleshooting %} **Connection problem** -``` +```bash 2017-08-20 16:51:19 ERROR (SyncWorker_0) [homeassistant.components.xiaomi] No gateway discovered 2017-08-20 16:51:20 ERROR (MainThread) [homeassistant.setup] Setup failed for xiaomi: Component failed to initialize. ``` From b21fb7a5c9c1ceaa07b3f091c21f973a645ac019 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 12:44:07 +0200 Subject: [PATCH 12/21] Fix typo --- source/_components/xiaomi.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index 274fcc012f14..9e08efed00c1 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -46,7 +46,7 @@ What's not available? 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) -To enable Xioami gateway in your installation, add the following to your `configuration.yaml` file: +To enable Xiaomi gateway in your installation, add the following to your `configuration.yaml` file: ### {% linkable_title One Gateway %} From 290d3645fa60dde82a4302e69a65e86ea6ca77de Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 12:48:26 +0200 Subject: [PATCH 13/21] Some more improvements --- source/_components/xiaomi.markdown | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index 9e08efed00c1..6155692e1c7d 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -46,6 +46,9 @@ What's not available? 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) + + + To enable Xiaomi gateway in your installation, add the following to your `configuration.yaml` file: ### {% linkable_title One Gateway %} @@ -84,7 +87,7 @@ xiaomi: 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. +- **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. Defaults to any. @@ -95,7 +98,7 @@ The gateway provides two services: `xiaomi.play_ringtone` and `xiaomi.stop_ringt - alarm ringtones [0-8] - doorbell ring [10-13] - alarm clock [20-29] -- custom ringtones (uploaded by mi home app) starting from 10001 +- custom ringtones (uploaded by the Mi Home app) starting from 10001 Automation example @@ -127,7 +130,7 @@ Automation example gw_mac: xxxxxxxxxxxx ``` -### {% linkable_title Troubleshooting %} +### {% linkable_title Troubleshooting %} **Connection problem** @@ -138,7 +141,7 @@ Automation example That means that Home Assistant is not getting any response from your Xiaomi gateway. Might be a local network problem or your firewall. - Make sure you have enabled LAN access: https://community.home-assistant.io/t/beta-xiaomi-gateway-integration/8213/1832 -- Turn off the firewall on the HA computer -- Try to leave the mac address blank. +- Turn off the firewall on the system where Home Assistant is running +- Try to leave the MAC address `mac:` blank. - Try to set `discovery_retry: 10` - Try to disable and then enable LAN access From b1ec41b03b5470b5fcaf402ca0acb58475d7da9c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 12:52:22 +0200 Subject: [PATCH 14/21] Move instructions to component --- source/_components/xiaomi.markdown | 69 ++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index 6155692e1c7d..a6cdaaea7e02 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -44,10 +44,7 @@ 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 -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) - - - +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) To enable Xiaomi gateway in your installation, add the following to your `configuration.yaml` file: @@ -130,6 +127,70 @@ Automation example gw_mac: xxxxxxxxxxxx ``` +### {% linkable_title Retrieving Access Token %} + +Follow the pairing process using your phone and Mi-Home app. From here you will be able to retrieve the token from a SQLite file inside your phone. + +Before you begin you need to install `libffi-dev` by running the command below. This is needed for `python-mirobi` to be installed correctly. + +```bash +$ sudo apt-get install libffi-dev +``` + +If your Home Assistant installation is running in a [Virtualenv](/docs/installation/virtualenv/#upgrading-home-assistant), make sure you activate it by running the commands below. + +```bash +$ sudo su -s /bin/bash homeassistant +$ source /srv/homeassistant/bin/activate +``` + +To fetch the token follow these instructions depending on your mobile phone platform. + +#### {% linkable_title Windows and Android %} + +1. Configure the robot with the Mi-Home app. +2. Enable developer mode and USB debugging on the Android phone and plug it into the computer. +3. Get ADB tool for Windows: https://developer.android.com/studio/releases/platform-tools.html +4. Create a backup of the application com.xiaomi.smarthome: +```bash +$ adb backup -noapk com.xiaomi.smarthome -f backup.ab +``` +5. If you have this message: "More than one device or emulator", use this command to list all devices: +```bash +$ adb devices +``` +and execute this command: +```bash +$ adb -s DEVICEID backup -noapk com.xiaomi.smarthome -f backup.ab # (with DEVICEID the device id from the previous command) +``` +6. On the phone, you must confirm the backup. DO NOT enter any password and press button to make the backup. +7. Get ADB Backup Extractor: https://sourceforge.net/projects/adbextractor/ +8. Extract All files from the backup: +```bash +$ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar "" +``` +9. Unzip the ".tar" file. +10. Open the SQLite DB `miio2.db` with a tool like SQLite Manager extension for FireFox. +11. Get the token from "devicerecord" table. + +#### {% linkable_title Linux and Android (rooted!) %} + +1. Configure the light with the Mi-Home app. +2. Enable developer mode, USB debugging and root permission only for ADB on the Android phone and plug it into the computer. +3. Get ADB f.e. `apt-get install android-tools-adb` +4. `adb devices` should list your device +5. `adb root` (does work for development builds only: ones with `ro.debuggable=1`) +6. `adb shell` +7. `echo "select name,localIP,token from devicerecord;" | sqlite3 /data/data/com.xiaomi.smarthome/databases/miio2.db` returns a list of all registered devices including ip address and token. + +#### {% linkable_title macOS and iOS %} + +1. Setup iOS device with the Mi-Home app. +2. Create an unencrypted backup of the device using iTunes. +3. Install iBackup Viewer from here: http://www.imactools.com/iphonebackupviewer/ +4. Extract this file: **`/raw data/com.xiami.mihome/1234567_mihome.sqlite`** to your computer, where _1234567_ is any string of numbers. +5. Open the sqlite DB with a tool like SQLite Manager extension for FireFox, DB Browser, etc. You will then see the list of all the devices in your account with their token. The token you need is in the column **`ZToken`** and looks like **`123a1234567b12345c1d123456789e12`**. + ### {% linkable_title Troubleshooting %} **Connection problem** From 63cf989b522ed4a8a7ed16258b5be9212a971fae Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 12:59:06 +0200 Subject: [PATCH 15/21] Improve guides --- source/_components/xiaomi.markdown | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index a6cdaaea7e02..48437b21a959 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -150,8 +150,8 @@ To fetch the token follow these instructions depending on your mobile phone plat 1. Configure the robot with the Mi-Home app. 2. Enable developer mode and USB debugging on the Android phone and plug it into the computer. -3. Get ADB tool for Windows: https://developer.android.com/studio/releases/platform-tools.html -4. Create a backup of the application com.xiaomi.smarthome: +3. Get and install the [ADB tool for Windows](https://developer.android.com/studio/releases/platform-tools.html). +4. Create a backup of the application `com.xiaomi.smarthome`: ```bash $ adb backup -noapk com.xiaomi.smarthome -f backup.ab ``` @@ -164,13 +164,13 @@ and execute this command: $ adb -s DEVICEID backup -noapk com.xiaomi.smarthome -f backup.ab # (with DEVICEID the device id from the previous command) ``` 6. On the phone, you must confirm the backup. DO NOT enter any password and press button to make the backup. -7. Get ADB Backup Extractor: https://sourceforge.net/projects/adbextractor/ +7. Get and install [ADB Backup Extractor](https://sourceforge.net/projects/adbextractor/). 8. Extract All files from the backup: ```bash $ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar "" ``` 9. Unzip the ".tar" file. -10. Open the SQLite DB `miio2.db` with a tool like SQLite Manager extension for FireFox. +10. Open the SQLite database `miio2.db` with a tool like SQLite Manager extension for FireFox. 11. Get the token from "devicerecord" table. #### {% linkable_title Linux and Android (rooted!) %} @@ -181,15 +181,15 @@ $ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar 4. `adb devices` should list your device 5. `adb root` (does work for development builds only: ones with `ro.debuggable=1`) 6. `adb shell` -7. `echo "select name,localIP,token from devicerecord;" | sqlite3 /data/data/com.xiaomi.smarthome/databases/miio2.db` returns a list of all registered devices including ip address and token. +7. `echo "select name,localIP,token from devicerecord;" | sqlite3 /data/data/com.xiaomi.smarthome/databases/miio2.db` returns a list of all registered devices including IP address and token. #### {% linkable_title macOS and iOS %} 1. Setup iOS device with the Mi-Home app. 2. Create an unencrypted backup of the device using iTunes. -3. Install iBackup Viewer from here: http://www.imactools.com/iphonebackupviewer/ -4. Extract this file: **`/raw data/com.xiami.mihome/1234567_mihome.sqlite`** to your computer, where _1234567_ is any string of numbers. -5. Open the sqlite DB with a tool like SQLite Manager extension for FireFox, DB Browser, etc. You will then see the list of all the devices in your account with their token. The token you need is in the column **`ZToken`** and looks like **`123a1234567b12345c1d123456789e12`**. +3. Install [iBackup Viewer](http://www.imactools.com/iphonebackupviewer/). +4. Extract this file: **`/raw data/com.xiami.mihome/1234567_mihome.sqlite`** to your computer, where `_1234567_` is any string of numbers. +5. Open the SQLite database with a tool like SQLite Manager extension for FireFox or DB Browser. You will then see the list of all the devices in your account with their token. The token you need is in the column **`ZToken`** and looks like **`123a1234567b12345c1d123456789e12`**. ### {% linkable_title Troubleshooting %} From 00f9cf7cd64bb1bd499618519d15b40a9b561a65 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 13:00:41 +0200 Subject: [PATCH 16/21] Add more to intro --- source/_components/xiaomi.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index 48437b21a959..ad3d942d16ad 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -129,7 +129,7 @@ Automation example ### {% linkable_title Retrieving Access Token %} -Follow the pairing process using your phone and Mi-Home app. From here you will be able to retrieve the token from a SQLite file inside your phone. +Follow the pairing process using your phone and Mi-Home app. You will be able to retrieve the token from a SQLite file inside your phone. This token is needed for using various `xiaomi` platforms. Before you begin you need to install `libffi-dev` by running the command below. This is needed for `python-mirobi` to be installed correctly. From 92246006836db4db271349952e699a2554fe3bd8 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 13:08:53 +0200 Subject: [PATCH 17/21] Address comments from https://github.com/home-assistant/home-assistant/issues/9135 --- source/_components/discovery.markdown | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/_components/discovery.markdown b/source/_components/discovery.markdown index 43152eb5f98d..41c7e2392d13 100644 --- a/source/_components/discovery.markdown +++ b/source/_components/discovery.markdown @@ -12,7 +12,7 @@ ha_category: Other --- -Home Assistant can discover and automatically configure zeroconf/mDNS and uPnP devices on your network. Currently the `discovery` component can detect: +Home Assistant can discover and automatically configure [zeroconf](https://en.wikipedia.org/wiki/Zero-configuration_networking)/[mDNS](https://en.wikipedia.org/wiki/Multicast_DNS) and [uPnP](https://en.wikipedia.org/wiki/Universal_Plug_and_Play) devices on your network. Currently the `discovery` component can detect: * Google Chromecast * Belkin WeMo switches @@ -54,7 +54,7 @@ Configuration variables: Valid values for ignore are: * `apple_tv`: Apple TV - * `axis`: (Axis Communications security devices) + * `axis`: Axis Communications security devices * `bose_soundtouch`: Bose Soundtouch speakers * `denonavr`: Denon Network Receivers * `directv`: DirecTV @@ -62,31 +62,31 @@ Valid values for ignore are: * `google_cast`: Google Chromecast * `ikea_tradfri`: IKEA Trådfri * `logitech_mediaserver`: Logitech media server - Squeezebox player - * `openhome`: Linn / Openhome + * `openhome`: Linn/Openhome * `panasonic_viera`: Panasonic Viera * `philips_hue`: Philips Hue * `plex_mediaserver`: Plex media server * `roku`: Roku media player - * `samsung_tv`: (Samsung TV + * `samsung_tv`: Samsung TV * `sonos`: Sonos Speakers * `yamaha`: Yamaha media player * `yeelight`: Yeelight Sunflower Bulb

    Home Assistant must be on the same network as the devices for uPnP discovery to work. -If running Home Assistant in a Docker container use switch `--net=host` to put it on the host's network. +If running Home Assistant in a [Docker container](/docs/installation/docker/) use switch `--net=host` to put it on the host's network.

    -If you are developing a new platform, please read [how to make your platform discoverable]({{site_root}}/developers/add_new_platform/#discovery). -

    -There is currently a known issue with running this platform on a 64-bit version of Python and Windows. +There is currently a known issue with running this component on a 64-bit version of Python and Windows.

    -If you are on Windows and you're using Python 3.5, download the Netifaces dependency here. +If you are on Windows and you're using Python 3.5, download the [Netifaces](http://www.lfd.uci.edu/~gohlke/pythonlibs/#netifaces) dependency.

    If you see `Not initializing discovery because could not install dependency netdisco==0.6.1` in the logs, you will need to install the `python3-dev` or `python3-devel` package on your system manually (eg. `sudo apt-get install python3-dev` or `sudo dnf -y install python3-devel`). On the next restart of home-assistant, discovery should work. If you still get an error, check if you have a compiler (`gcc`) available on your system.

    + +If you are developing a new platform, please read [how to make your platform discoverable](/developers/component_discovery/) for further details. From db6aa5e0b084ebdd145810a2c761da7390515d05 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 13:42:19 +0200 Subject: [PATCH 18/21] Link to instructions --- source/_components/vacuum.xiaomi.markdown | 72 +---------------------- source/_components/xiaomi.markdown | 4 +- 2 files changed, 6 insertions(+), 70 deletions(-) diff --git a/source/_components/vacuum.xiaomi.markdown b/source/_components/vacuum.xiaomi.markdown index 239d81758025..fb9fede1cfab 100644 --- a/source/_components/vacuum.xiaomi.markdown +++ b/source/_components/vacuum.xiaomi.markdown @@ -17,73 +17,7 @@ The `xiaomi` vacuum platform allows you to control the state of your [Xiaomi Mi Current supported features are `turn_on`, `pause`, `stop`, `return_to_home`, `turn_off` (stops goes to dock), `locate`, `clean_spot`, `set_fanspeed` and even remote control your robot. -## {% linkable_title Getting started %} - -Follow the pairing process using your phone and Mi-Home app. From here you will be able to retrieve the token from a SQLite file inside your phone. - -Before you begin you need to install `libffi-dev` by running the command below. This is needed for `python-mirobi` to be installed correctly. - -```bash -$ sudo apt-get install libffi-dev -``` - -If your Home Assistant installation is running in a [Virtualenv](/docs/installation/virtualenv/#upgrading-home-assistant), make sure you activate it by running the commands below. - -```bash -$ sudo su -s /bin/bash homeassistant -$ source /srv/homeassistant/bin/activate -``` - -To fetch the token follow these instructions depending on your mobile phone platform. - -### {% linkable_title Windows and Android %} - -1. Configure the robot with the Mi-Home app. -2. Enable developer mode and USB debugging on the Android phone and plug it into the computer. -3. Get ADB tool for Windows: https://developer.android.com/studio/releases/platform-tools.html -4. Create a backup of the application com.xiaomi.smarthome: -```bash -$ adb backup -noapk com.xiaomi.smarthome -f backup.ab -``` -5. If you have this message: "More than one device or emulator", use this command to list all devices: -```bash -$ adb devices -``` -and execute this command: -```bash -$ adb -s DEVICEID backup -noapk com.xiaomi.smarthome -f backup.ab # (with DEVICEID the device id from the previous command) -``` -6. On the phone, you must confirm the backup. DO NOT enter any password and press button to make the backup. -7. Get ADB Backup Extractor: https://sourceforge.net/projects/adbextractor/ -8. Extract All files from the backup: -```bash -$ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar "" -``` -9. Unzip the ".tar" file. -10. Open the SQLite DB `miio2.db` with a tool like SQLite Manager extension for FireFox. -11. Get the token from "devicerecord" table. - - -### {% linkable_title Linux and Android (rooted!) %} - -1. Configure the light with the Mi-Home app. -2. Enable developer mode, USB debugging and root permission only for ADB on the Android phone and plug it into the computer. -3. Get ADB f.e. `apt-get install android-tools-adb` -4. `adb devices` should list your device -5. `adb root` (does work for development builds only: ones with `ro.debuggable=1`) -6. `adb shell` -7. `echo "select name,localIP,token from devicerecord;" | sqlite3 /data/data/com.xiaomi.smarthome/databases/miio2.db` returns a list of all registered devices including ip address and token. - - -### {% linkable_title macOS and iOS %} - -1. Setup iOS device with the Mi-Home app. -2. Create an unencrypted backup of the device using iTunes. -3. Install iBackup Viewer from here: http://www.imactools.com/iphonebackupviewer/ -4. Extract this file: **`/raw data/com.xiami.mihome/1234567_mihome.sqlite`** to your computer, where _1234567_ is any string of numbers. -5. Open the sqlite DB with a tool like SQLite Manager extension for FireFox, DB Browser, etc. You will then see the list of all the devices in your account with their token. The token you need is in the column **`ZToken`** and looks like **`123a1234567b12345c1d123456789e12`**. - -## {% linkable_title Configuration %} +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 vacuum to your installation, add the following to your `configuration.yaml` file: @@ -92,13 +26,13 @@ To add a vacuum to your installation, add the following to your `configuration.y vacuum: - platform: xiaomi host: 192.168.1.2 - token: your-token-here + token: YOUR_TOKEN ``` Configuration variables: - **host** (*Required*): The IP of your robot. -- **token** (*Required*): The token of your robot. Go to Getting started section to read more about how to get it. +- **token** (*Required*): The API token of your robot. - **name** (*Optional*): The name of your robot. ### {% linkable_title Platform services %} diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index ad3d942d16ad..f493c08882a3 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -46,6 +46,8 @@ What's not available? 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) +Please check the instructions in this [section](/xiaomi/#retrieving-the-access-token) to get the API token to use with your platforms. + To enable Xiaomi gateway in your installation, add the following to your `configuration.yaml` file: ### {% linkable_title One Gateway %} @@ -127,7 +129,7 @@ Automation example gw_mac: xxxxxxxxxxxx ``` -### {% linkable_title Retrieving Access Token %} +### {% linkable_title Retrieving the Access Token %} Follow the pairing process using your phone and Mi-Home app. You will be able to retrieve the token from a SQLite file inside your phone. This token is needed for using various `xiaomi` platforms. From 52a33ddde316197c6cb1749932fa74bbf964dfa5 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 26 Aug 2017 13:47:54 +0200 Subject: [PATCH 19/21] Move instructions down --- source/_components/xiaomi.markdown | 33 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/source/_components/xiaomi.markdown b/source/_components/xiaomi.markdown index f493c08882a3..c97003cd7bc6 100644 --- a/source/_components/xiaomi.markdown +++ b/source/_components/xiaomi.markdown @@ -129,9 +129,25 @@ Automation example gw_mac: xxxxxxxxxxxx ``` +### {% linkable_title Troubleshooting %} + +**Connection problem** + +```bash +2017-08-20 16:51:19 ERROR (SyncWorker_0) [homeassistant.components.xiaomi] No gateway discovered +2017-08-20 16:51:20 ERROR (MainThread) [homeassistant.setup] Setup failed for xiaomi: Component failed to initialize. +``` + +That means that Home Assistant is not getting any response from your Xiaomi gateway. Might be a local network problem or your firewall. +- Make sure you have enabled LAN access: https://community.home-assistant.io/t/beta-xiaomi-gateway-integration/8213/1832 +- Turn off the firewall on the system where Home Assistant is running +- Try to leave the MAC address `mac:` blank. +- Try to set `discovery_retry: 10` +- Try to disable and then enable LAN access + ### {% linkable_title Retrieving the Access Token %} -Follow the pairing process using your phone and Mi-Home app. You will be able to retrieve the token from a SQLite file inside your phone. This token is needed for using various `xiaomi` platforms. +Follow the pairing process using your phone and Mi-Home app. You will be able to retrieve the token from a SQLite file inside your phone. This token is needed for using various `xiaomi_*` platforms. Before you begin you need to install `libffi-dev` by running the command below. This is needed for `python-mirobi` to be installed correctly. @@ -193,18 +209,3 @@ $ java.exe -jar ../android-backup-extractor/abe.jar unpack backup.ab backup.tar 4. Extract this file: **`/raw data/com.xiami.mihome/1234567_mihome.sqlite`** to your computer, where `_1234567_` is any string of numbers. 5. Open the SQLite database with a tool like SQLite Manager extension for FireFox or DB Browser. You will then see the list of all the devices in your account with their token. The token you need is in the column **`ZToken`** and looks like **`123a1234567b12345c1d123456789e12`**. -### {% linkable_title Troubleshooting %} - -**Connection problem** - -```bash -2017-08-20 16:51:19 ERROR (SyncWorker_0) [homeassistant.components.xiaomi] No gateway discovered -2017-08-20 16:51:20 ERROR (MainThread) [homeassistant.setup] Setup failed for xiaomi: Component failed to initialize. -``` - -That means that Home Assistant is not getting any response from your Xiaomi gateway. Might be a local network problem or your firewall. -- Make sure you have enabled LAN access: https://community.home-assistant.io/t/beta-xiaomi-gateway-integration/8213/1832 -- Turn off the firewall on the system where Home Assistant is running -- Try to leave the MAC address `mac:` blank. -- Try to set `discovery_retry: 10` -- Try to disable and then enable LAN access From 8833982fe6d353d6bfec04a505f8592ed1d21a99 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 26 Aug 2017 09:49:44 -0700 Subject: [PATCH 20/21] Update dependencies (#3245) * Update dependencies * Remove more things we don't need --- .ruby-version | 2 +- Gemfile | 10 ------- Gemfile.lock | 73 ++++++++++++++++----------------------------------- _config.yml | 5 +--- 4 files changed, 25 insertions(+), 65 deletions(-) diff --git a/.ruby-version b/.ruby-version index 2bf1c1ccf363..005119baaa06 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.3.1 +2.4.1 diff --git a/Gemfile b/Gemfile index 58b50178659b..c30860255d89 100644 --- a/Gemfile +++ b/Gemfile @@ -3,18 +3,9 @@ source "https://rubygems.org" group :development do gem 'rake', '~> 10.0' gem 'jekyll', '~> 3.0' - gem 'pygments.rb', '~> 1.1.2' - gem 'rdiscount', '~> 2.0' - gem 'RedCloth', '~> 4.2' - gem 'haml', '~> 4.0' gem 'compass', '~> 0.12' gem 'sass-globbing', '~> 1.0' - gem 'rubypants', '~> 0.2' - gem 'rb-fsevent', '~> 0.9' gem 'stringex', '~> 1.4' - gem 'execjs' - gem 'therubyracer', :platforms => :ruby - gem 'coderay' gem 'pry' end @@ -24,7 +15,6 @@ group :jekyll_plugins do gem 'jekyll-sitemap' gem 'jekyll-time-to-read' gem 'octopress', '~> 3.0' - gem 'octopress-filters' gem 'octopress-include-tag' end diff --git a/Gemfile.lock b/Gemfile.lock index 11bd6af12e21..d706705eb308 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,51 +1,47 @@ GEM remote: https://rubygems.org/ specs: - RedCloth (4.3.2) - addressable (2.4.0) - chunky_png (1.3.6) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + chunky_png (1.3.8) coderay (1.1.1) colorator (1.1.0) compass (0.12.7) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.2.19) - execjs (2.7.0) - ffi (1.9.14) + ffi (1.9.18) forwardable-extended (2.6.0) fssm (0.2.10) - haml (4.0.7) - tilt - jekyll (3.2.1) + jekyll (3.5.2) + addressable (~> 2.4) colorator (~> 1.0) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 1.1) kramdown (~> 1.3) - liquid (~> 3.0) + liquid (~> 4.0) mercenary (~> 0.3.3) pathutil (~> 0.9) rouge (~> 1.7) safe_yaml (~> 1.0) jekyll-paginate (1.1.0) - jekyll-redirect-from (0.11.0) - jekyll (>= 2.0) + jekyll-redirect-from (0.12.1) + jekyll (~> 3.3) jekyll-sass-converter (1.3.0) sass (~> 3.2) - jekyll-sitemap (0.11.0) - addressable (~> 2.4.0) + jekyll-sitemap (1.1.1) + jekyll (~> 3.3) jekyll-time-to-read (0.1.2) jekyll jekyll-watch (1.5.0) listen (~> 3.0, < 3.1) - kramdown (1.12.0) - libv8 (3.16.14.15) - liquid (3.0.6) + kramdown (1.14.0) + liquid (4.0.0) listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) mercenary (0.3.6) method_source (0.8.2) - multi_json (1.12.1) octopress (3.0.11) jekyll (>= 2.0) mercenary (~> 0.3.2) @@ -58,12 +54,7 @@ GEM colorator octopress-escape-code (2.1.1) jekyll (~> 3.0) - octopress-filters (1.4.0) - jekyll - octopress-hooks (~> 2.0) - rubypants-unicode - titlecase - octopress-hooks (2.6.1) + octopress-hooks (2.6.2) jekyll (>= 2.0) octopress-include-tag (1.1.3) jekyll (>= 2.0) @@ -76,64 +67,46 @@ GEM coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) - pygments.rb (1.1.2) - multi_json (>= 1.0.0) - rack (1.6.4) + public_suffix (3.0.0) + rack (1.6.8) rack-protection (1.5.3) rack rake (10.5.0) - rb-fsevent (0.9.7) - rb-inotify (0.9.7) - ffi (>= 0.5.0) - rdiscount (2.2.0.1) - redcarpet (3.3.4) - ref (2.0.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + redcarpet (3.4.0) rouge (1.11.1) - rubypants (0.5.0) - rubypants-unicode (0.2.5) safe_yaml (1.0.4) sass (3.2.19) sass-globbing (1.1.5) sass (>= 3.1) - sinatra (1.4.7) + sinatra (1.4.8) rack (~> 1.5) rack-protection (~> 1.4) tilt (>= 1.3, < 3) slop (3.6.0) stringex (1.5.1) - therubyracer (0.12.2) - libv8 (~> 3.16.14.0) - ref - tilt (2.0.5) + tilt (2.0.8) titlecase (0.1.1) PLATFORMS ruby DEPENDENCIES - RedCloth (~> 4.2) - coderay compass (~> 0.12) - execjs - haml (~> 4.0) jekyll (~> 3.0) jekyll-paginate jekyll-redirect-from jekyll-sitemap jekyll-time-to-read octopress (~> 3.0) - octopress-filters octopress-include-tag pry - pygments.rb (~> 1.1.2) rake (~> 10.0) - rb-fsevent (~> 0.9) - rdiscount (~> 2.0) - rubypants (~> 0.2) sass-globbing (~> 1.0) sinatra (~> 1.4.2) stringex (~> 1.4) - therubyracer BUNDLED WITH - 1.14.6 + 1.15.4 diff --git a/_config.yml b/_config.yml index f62bb6607861..9f482b4a630e 100644 --- a/_config.yml +++ b/_config.yml @@ -35,8 +35,6 @@ category_dir: blog/categories markdown: kramdown timezone: UTC -# highlighter: coderay - kramdown: input: GFM auto_ids: false @@ -48,10 +46,9 @@ kramdown: highlighter: rouge -gems: +plugins: - jekyll-redirect-from - jekyll-time-to-read - - octopress-filters - octopress-include-tag paginate: 10 # Posts per page on the blog index From 7d3a472aca723b3c7a6f235cc499b3f9e99e8d75 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 26 Aug 2017 10:07:35 -0700 Subject: [PATCH 21/21] Add travis_wait --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7cc1f19579fe..fb4c4add6f80 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: ruby sudo: false cache: bundler -script: bundle exec rake generate +script: travis_wait bundle exec rake generate after_success: - '[ "${TRAVIS_BRANCH}" = "current" ] && [ "${TRAVIS_PULL_REQUEST}" = "false" ] && bundle exec rake deploy || false'