From 200f9cbd9bf5a60e9662c732c0f56191429b28d0 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Fri, 16 Jun 2017 13:07:58 -0400 Subject: [PATCH 01/49] Add docs for new entity_id generation (#2815) --- source/_docs/z-wave.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/z-wave.markdown b/source/_docs/z-wave.markdown index cd2e9fdd74b..1cabf9a302d 100644 --- a/source/_docs/z-wave.markdown +++ b/source/_docs/z-wave.markdown @@ -45,6 +45,7 @@ Configuration variables: - **delay** (*Optional*): Specify the delay for refreshing of node value. Only the light component uses this. Defaults to 2 seconds. - **invert_openclose_buttons** (*Optional*): Inverts function of the open and close buttons for the cover domain. Defaults to `False`. - **debug** (*Optional*): Print verbose z-wave info to log. Defaults to `False`. +- **new_entity_ids** (*Optional*): Switch to new entity_id generation. Defaults to `False`. To find the path of your Z-Wave USB stick or module, run: From 5a666aeceae8dc03b33404deff8158be29c7b2b9 Mon Sep 17 00:00:00 2001 From: jshore1296 Date: Sat, 17 Jun 2017 04:42:11 -0400 Subject: [PATCH 02/49] Add latitude and longitude as config options (#2829) This allows for weather to be given for a dynamic location, such as a phone or other device. --- source/_components/sensor.wunderground.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/sensor.wunderground.markdown b/source/_components/sensor.wunderground.markdown index 82a5b352782..669e0cc9f0c 100644 --- a/source/_components/sensor.wunderground.markdown +++ b/source/_components/sensor.wunderground.markdown @@ -74,6 +74,8 @@ Configuration variables: - **api_key** (Required): See above. - **pws_id** (Optional): You can enter a Personal Weather Station ID. The current list of Wunderground PWS stations is available [here](https://www.wunderground.com/weatherstation/ListStations.asp). If you do not enter a PWS ID, the current location information (latitude and longitude) from your `configuration.yaml` will be used to display weather conditions. - **lang** (Optional): Specify the language that the API returns. The current list of all Wunderground language codes is available [here](https://www.wunderground.com/weather/api/d/docs?d=language-support). If not specified, it defaults to English (EN). +- **latitude** (*Optional*): Latitude coordinate to monitor weather of (required if **longitude** is specificed), defaults to coordinates defined in your `configuration.yaml` +- **longitude** (*Optional*): Longitude coordinate to monitor weather of (required if **latitude** is specified), defaults to coordinates defined in your `configuration.yaml` - **monitored_conditions** array (*Required*): Conditions to display in the frontend. The following conditions can be monitored. - **alerts**: Current severe weather advisories - **dewpoint_c**: Temperature in Celsius below which water droplets begin to condense and dew can form From a89804ff8e17b542919ba31c7c851de8d23df2ac Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 17 Jun 2017 10:47:12 +0200 Subject: [PATCH 03/49] Minimize configuration sample --- .../_components/sensor.wunderground.markdown | 126 ++++++------------ 1 file changed, 40 insertions(+), 86 deletions(-) diff --git a/source/_components/sensor.wunderground.markdown b/source/_components/sensor.wunderground.markdown index 669e0cc9f0c..195a43b3cb0 100644 --- a/source/_components/sensor.wunderground.markdown +++ b/source/_components/sensor.wunderground.markdown @@ -30,52 +30,15 @@ sensor: monitored_conditions: - alerts - dewpoint_c - - dewpoint_f - - dewpoint_string - - feelslike_c - - feelslike_f - - feelslike_string - - heat_index_c - - heat_index_f - - heat_index_string - - elevation - - location - - observation_time - - precip_1hr_in - - precip_1hr_metric - - precip_1hr_string - - precip_today_in - - precip_today_metric - - precip_today_string - - pressure_in - - pressure_mb - - pressure_trend - - relative_humidity - - station_id - - solarradiation - - temperature_string - - temp_c - - temp_f - - UV - - visibility_km - - visibility_mi - - weather - - wind_degrees - - wind_dir - - wind_gust_kph - - wind_gust_mph - - wind_kph - - wind_mph - - wind_string - ``` Configuration variables: -- **api_key** (Required): See above. + +- **api_key** (Required): The API key for Weather Underground. See above for details. - **pws_id** (Optional): You can enter a Personal Weather Station ID. The current list of Wunderground PWS stations is available [here](https://www.wunderground.com/weatherstation/ListStations.asp). If you do not enter a PWS ID, the current location information (latitude and longitude) from your `configuration.yaml` will be used to display weather conditions. - **lang** (Optional): Specify the language that the API returns. The current list of all Wunderground language codes is available [here](https://www.wunderground.com/weather/api/d/docs?d=language-support). If not specified, it defaults to English (EN). -- **latitude** (*Optional*): Latitude coordinate to monitor weather of (required if **longitude** is specificed), defaults to coordinates defined in your `configuration.yaml` -- **longitude** (*Optional*): Longitude coordinate to monitor weather of (required if **latitude** is specified), defaults to coordinates defined in your `configuration.yaml` +- **latitude** (*Optional*): Latitude coordinate to monitor weather of (required if **longitude** is specificed). Defaults to coordinates defined in your `configuration.yaml`. +- **longitude** (*Optional*): Longitude coordinate to monitor weather of (required if **latitude** is specified). Defaults to coordinates defined in your `configuration.yaml`. - **monitored_conditions** array (*Required*): Conditions to display in the frontend. The following conditions can be monitored. - **alerts**: Current severe weather advisories - **dewpoint_c**: Temperature in Celsius below which water droplets begin to condense and dew can form @@ -138,35 +101,26 @@ Configuration variables: All the conditions listed above will be updated every 5 minutes. -### Forecasts +### {% linkable_title Forecasts %} _12 hour forecasts_ -Monitored conditions marked above with [12h] are 12 hour -forecasts. To get a forecast for different period/daytime replace the -`_1d_` part of the sensor name. e.g. `weather_2n` will give you forecast for -tomorrow night. Valid values for day are `1` to `4` and -valid values for daytime are `d` or `n`. +Monitored conditions marked above with [12h] are 12 hour forecasts. To get a forecast for different period/daytime replace the `_1d_` part of the sensor name. e.g. `weather_2n` will give you forecast for tomorrow night. Valid values for day are `1` to `4` and valid values for daytime are `d` or `n`. _Daily forecasts_ -Conditions above marked with [1d] are daily forecasts. -To get forecast for different day, replace the number -in `_1d_` part of the sensor name. Valid values are from -`1` to `4`. +Conditions above marked with [1d] are daily forecasts. To get forecast for different day, replace the number +in `_1d_` part of the sensor name. Valid values are from `1` to `4`. _Hourly forecasts_ -Conditions marked with [1h] are hourly forecasts. -To get forecast for different hour, replace the number -in the `_1h_` part of the sensor name with `1` to `36`. -E.g. `weather_24h` will give you weather in 24 hours. +Conditions marked with [1h] are hourly forecasts. To get forecast for different hour, replace the number +in the `_1h_` part of the sensor name with `1` to `36`. E.g. `weather_24h` will give you weather in 24 hours. -Additional examples: -==================== +### {% linkable_title Additional examples %} + +#### Daily forecast -Daily forecast --------------- ```yaml sensor: @@ -183,23 +137,23 @@ sensor: - weather_4n_metric group: - dialy_forecast: - name: Daily Forecast - entities: - - sensor.pws_weather_1d_metric - - sensor.pws_weather_1n_metric - - sensor.pws_weather_2d_metric - - sensor.pws_weather_2n_metric - - sensor.pws_weather_3d_metric - - sensor.pws_weather_3n_metric - - sensor.pws_weather_4d_metric - - sensor.pws_weather_4n_metric + dialy_forecast: + name: Daily Forecast + entities: + - sensor.pws_weather_1d_metric + - sensor.pws_weather_1n_metric + - sensor.pws_weather_2d_metric + - sensor.pws_weather_2n_metric + - sensor.pws_weather_3d_metric + - sensor.pws_weather_3n_metric + - sensor.pws_weather_4d_metric + - sensor.pws_weather_4n_metric ``` ![Daily Forecast](/images/screenshots/wunderground_daily_forecast.png) -Weather overview ----------------- +#### Weather overview + ```yaml sensor: @@ -218,20 +172,20 @@ sensor: - alerts group: - weather_overview: - name: Weather overview - entities: - - sensor.pws_weather_1d_metric - - sensor.pws_temp_high_record_c - - sensor.pws_temp_high_1d_c - - sensor.pws_temp_c - - sensor.pws_temp_low_1d_c - - sensor.pws_temp_low_record_c - - sensor.pws_precip_1d - - sensor.pws_precip_1d_mm - - sensor.pws_wind_kph - - sensor.pws_wind_1d_kph - - sensor.pws_alerts + weather_overview: + name: Weather overview + entities: + - sensor.pws_weather_1d_metric + - sensor.pws_temp_high_record_c + - sensor.pws_temp_high_1d_c + - sensor.pws_temp_c + - sensor.pws_temp_low_1d_c + - sensor.pws_temp_low_record_c + - sensor.pws_precip_1d + - sensor.pws_precip_1d_mm + - sensor.pws_wind_kph + - sensor.pws_wind_1d_kph + - sensor.pws_alerts ``` ![Weather overview](/images/screenshots/wunderground_weather_overview.png) From 2153c8021067a8573b717d6beb3804e00738bb08 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 17 Jun 2017 12:34:32 +0200 Subject: [PATCH 04/49] Add Shiftr.io docs (#2827) --- source/_components/shiftr.markdown | 33 ++++++++++++++++++++++ source/images/supported_brands/shiftr.png | Bin 0 -> 25988 bytes 2 files changed, 33 insertions(+) create mode 100644 source/_components/shiftr.markdown create mode 100644 source/images/supported_brands/shiftr.png diff --git a/source/_components/shiftr.markdown b/source/_components/shiftr.markdown new file mode 100644 index 00000000000..e022cd1a7b9 --- /dev/null +++ b/source/_components/shiftr.markdown @@ -0,0 +1,33 @@ +--- +layout: page +title: "Shiftr.io" +description: "Transfer events to Shiftr.io." +date: 2017-07-16 07:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: shiftr.png +ha_category: "History" +featured: false +ha_release: 0.48 +--- + +The `shiftr` component makes it possible to transfer details collected with Home Assistant to [Shiftr.io](https://shiftr.io) and visualize the flow of the information. Keep in mind that your details will be public! + +Create a new [namespace](https://shiftr.io/new) and generate a new token. You will need to use `Key (Username)` and `Secret (Password)` to setup the component. + +To use the `shiftr` component in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +shiftr: + username: 63d8187f + password: 32fd92de6a59c3e2 +``` + +Configuration variables: + +- **username** (*Required*): Username for the namespace. +- **password** (*Required*): Password for the namespace. + diff --git a/source/images/supported_brands/shiftr.png b/source/images/supported_brands/shiftr.png new file mode 100644 index 0000000000000000000000000000000000000000..795a144372e4ce43f7e08146c4249a8fa85df258 GIT binary patch literal 25988 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 Date: Sat, 17 Jun 2017 12:39:25 +0200 Subject: [PATCH 05/49] Add language option to openweathermap sensor config (#2819) * Add language option to openweathermap sensor config * Minor changes --- source/_components/sensor.openweathermap.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.openweathermap.markdown b/source/_components/sensor.openweathermap.markdown index 70566d65714..116d4cd9e3d 100644 --- a/source/_components/sensor.openweathermap.markdown +++ b/source/_components/sensor.openweathermap.markdown @@ -34,6 +34,7 @@ Configuration variables: - **api_key** (*Required*): Your API key for http://openweathermap.org/. - **name** (*Optional*): Additional name for the sensors. Default to platform name. - **forecast** (*Optional*): Enables the forecast. The default is to display the current conditions. +- **language** (*Optional*): The language in which you want text results to be returned. It's a two-characters string, eg. `en`, `es`, `ru`, `it`, etc. Defaults to English. - **monitored_conditions** array (*Required*): Conditions to display in the frontend. - **weather**: A human-readable text summary. - **temperature**: The current temperature. From 078c37b77cd3dd2aa587dff247332eedc179c6de Mon Sep 17 00:00:00 2001 From: mjj4791 Date: Mon, 19 Jun 2017 13:59:00 +0200 Subject: [PATCH 06/49] Update sensor.buienradar.markdown (#2837) * Update sensor.buienradar.markdown updated homeassistant version to actual version the sensor was added * Update weather.buienradar.markdown updated homeassistant version number the weather component was added --- source/_components/sensor.buienradar.markdown | 2 +- source/_components/weather.buienradar.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.buienradar.markdown b/source/_components/sensor.buienradar.markdown index f1d6ffaf531..794ddade9f1 100644 --- a/source/_components/sensor.buienradar.markdown +++ b/source/_components/sensor.buienradar.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: ha_category: Weather -ha_release: 0.44 +ha_release: 0.47 --- diff --git a/source/_components/weather.buienradar.markdown b/source/_components/weather.buienradar.markdown index 8ba147619da..3ca6c0a637b 100644 --- a/source/_components/weather.buienradar.markdown +++ b/source/_components/weather.buienradar.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: ha_category: Weather -ha_release: 0.44 +ha_release: 0.47 --- The `buienradar` platform uses [buienradar.nl](http://buienradar.nl/) as an source for current meteorological data for your location. The From a94e0015a126649550bb017cf58c3cac6fd09d6c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 19 Jun 2017 14:19:42 +0200 Subject: [PATCH 07/49] Add new conf options (#2843) --- source/_components/notify.smtp.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/notify.smtp.markdown b/source/_components/notify.smtp.markdown index f03d7edf2e2..e8ffafd4f1e 100644 --- a/source/_components/notify.smtp.markdown +++ b/source/_components/notify.smtp.markdown @@ -32,11 +32,11 @@ Configuration variables: - **sender** (*Required*): E-mail address of the sender. - **recipient** (*Required*): E-mail address of the recipient of the notification. This can be a recipient address or a list of addresses for multiple recipients. - **server** (*Optional*): SMTP server which is used to end the notifications. Defaults to `localhost`. -- **port** (*Optional*): The port that the SMTP server is using. Defaults to 25. +- **port** (*Optional*): The port that the SMTP server is using. Defaults to 465. - **timeout** (*Optional*): The timeout in seconds that the SMTP server is using. Defaults to 5. - **username** (*Optional*): Username for the SMTP account. - **password** (*Optional*): Password for the SMTP server that belongs to the given username. If the password contains a colon it need to be wrapped in apostrophes. -- **starttls** (*Optional*): Enables STARTTLS, eg. True or False. Defaults to False. +- **encryption** (*Optional*): Set mode for encryption, `tls`, `starttls` or `none`. Defaults to `tls`. - **sender_name** (*Optional*): Sets a custom 'sender name' in the emails headers (*From*: Custom name ). - **debug** (*Optional*): Enables Debug, eg. True or False. Defaults to False. @@ -51,7 +51,7 @@ notify: port: 587 timeout: 15 sender: john@gmail.com - starttls: true + encryption: starttls username: john@gmail.com password: thePassword recipient: From 069c17c182b448c9b14d66271a6dce62a7970f90 Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Mon, 19 Jun 2017 14:01:40 +0100 Subject: [PATCH 08/49] Update to UPnP documentation (#2832) In accordance to pull request https://github.com/home-assistant/home-assistant/pull/8067 --- source/_components/upnp.markdown | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/source/_components/upnp.markdown b/source/_components/upnp.markdown index facf006f9c6..68cd9354ebc 100644 --- a/source/_components/upnp.markdown +++ b/source/_components/upnp.markdown @@ -1,7 +1,7 @@ --- layout: page title: "UPnP" -description: "Automatically creates port mappings on your router for Home Assistant." +description: "Internet Gateway Device (IGD) Protocol for Home Assistant." date: 2016-04-10 19:16 sidebar: true comments: false @@ -12,17 +12,11 @@ ha_category: "Other" ha_release: 0.18 --- -The `upnp` component automatically creates port forwarding mappings on your router for Home Assistant. UPnP or NAT-PMP needs to be enabled on your router for this component to work. +The `upnp` component enables you to collect network statistics from your router such as bytes in/out and packets in/out. This information is provided by the Internet Gateway Device (IGD) Protocol if enabled on your router. -You need to install [miniupnpc](https://github.com/miniupnp/miniupnp/tree/master/miniupnpc) before using the UPnP component: +The IGD can also automatically create port forwarding mappings on your router for Home Assistant. -```bash -$ git clone https://github.com/miniupnp/miniupnp.git -$ cd miniupnp/miniupnpc -$ make -$ make pythonmodule3 -$ sudo make installpythonmodule3 -``` +Please note that UPnP or NAT-PMP needs to be enabled on your router for this component to work. To integrate this into Home Assistant, add the following section to your `configuration.yaml` file: @@ -32,3 +26,10 @@ upnp: ``` A port mapping will be created using the IP address and port that Home Assistant is running on. The mapping will never automatically expire. Upon stopping Home Assistant, the mapping will be removed from your router. + +If you which to have the statistics without having port mapping done through IGD, add the option: +```yaml +# Example configuration.yaml entry with port mapping disabled +upnp: + port_mapping: false +``` From 9d41c1fdf520223005329545edc481027fe7b263 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 19 Jun 2017 15:10:47 +0200 Subject: [PATCH 09/49] Add UPNP sensor docs (#2846) --- source/_components/sensor.upnp.markdown | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 source/_components/sensor.upnp.markdown diff --git a/source/_components/sensor.upnp.markdown b/source/_components/sensor.upnp.markdown new file mode 100644 index 00000000000..c9d31bcca21 --- /dev/null +++ b/source/_components/sensor.upnp.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "UPNP Sensor" +description: "Instructions on how to integrate UPNP sensors with Home Assistant." +date: 2017-06-18 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: upnp.png +ha_category: "Other" +ha_release: 0.48 +ha_iot_class: "Local Polling" +--- + + +The `upnp` sensor platform allows one to get the network statistics from your router such as bytes in/out and packets in/out. + +To use your UPNP sensor in your installation, you need to set up the [`upnp`](/components/upnp/) component. + From a439facc0647b0e5132f695e16e0f8dd22912e3a Mon Sep 17 00:00:00 2001 From: mjj4791 Date: Tue, 20 Jun 2017 08:28:15 +0200 Subject: [PATCH 10/49] Add buienradar logo (#2851) * Add files via upload add logo for buienradar * Update sensor.buienradar.markdown add buienradar logo * Update weather.buienradar.markdown add buienradar logo --- source/_components/sensor.buienradar.markdown | 2 +- source/_components/weather.buienradar.markdown | 2 +- source/images/supported_brands/buienradar.png | Bin 0 -> 3876 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 source/images/supported_brands/buienradar.png diff --git a/source/_components/sensor.buienradar.markdown b/source/_components/sensor.buienradar.markdown index 794ddade9f1..25b5bd45799 100644 --- a/source/_components/sensor.buienradar.markdown +++ b/source/_components/sensor.buienradar.markdown @@ -7,7 +7,7 @@ sidebar: true comments: false sharing: true footer: true -logo: +logo: buienradar.png ha_category: Weather ha_release: 0.47 --- diff --git a/source/_components/weather.buienradar.markdown b/source/_components/weather.buienradar.markdown index 3ca6c0a637b..b154475b766 100644 --- a/source/_components/weather.buienradar.markdown +++ b/source/_components/weather.buienradar.markdown @@ -7,7 +7,7 @@ sidebar: true comments: false sharing: true footer: true -logo: +logo: buienradar.png ha_category: Weather ha_release: 0.47 --- diff --git a/source/images/supported_brands/buienradar.png b/source/images/supported_brands/buienradar.png new file mode 100644 index 0000000000000000000000000000000000000000..f3697fdd77cc914764b24f8df75d142e23d9715b GIT binary patch literal 3876 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 m3Btq*BP0kDD~u3ebo9SG(Xuy0V$lHr0000 Date: Tue, 20 Jun 2017 10:36:34 +0200 Subject: [PATCH 11/49] Add initial docs for KNX cover (#2845) --- source/_components/cover.knx.markdown | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 source/_components/cover.knx.markdown diff --git a/source/_components/cover.knx.markdown b/source/_components/cover.knx.markdown new file mode 100644 index 00000000000..7fac76a499c --- /dev/null +++ b/source/_components/cover.knx.markdown @@ -0,0 +1,34 @@ +--- +layout: page +title: "KNX Cover" +description: "Instructions on how to integrate KXN covers with Home Assistant." +date: 2017-06-18 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: knx.png +ha_category: DIY +ha_release: 0.48 +ha_iot_class: "Local Polling" +--- + + +The `knx` cover platform is used as in interface with KNX covers. + +To use your KNX covers in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +cover: + - platform: knx + updown_address: 9/0/0 + stop_address: 9/0/1 +``` + +- **updown_address** (*Required*): The KNX group address that is used to move the cover up and down. +- **stop_address** (*Required*): The group address that is used to stop the cover. +- **setposition_address** (*Optional*): The group address that is used to set the position. +- **getposition_address** (*Optional*): The group address that is used to read the position. +- **name** (*Optional*): A name for this devices used within Home Assistant. + From 97d4c326246ffc6d73b0330dde3fac60b4c03943 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 20 Jun 2017 16:46:15 +0200 Subject: [PATCH 12/49] Add new configuration variable (#2856) --- source/_components/sensor.pi_hole.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.pi_hole.markdown b/source/_components/sensor.pi_hole.markdown index 9c6b7bb8a2c..870403c3b98 100644 --- a/source/_components/sensor.pi_hole.markdown +++ b/source/_components/sensor.pi_hole.markdown @@ -27,6 +27,7 @@ sensor: Configuration variables: - **host** (*Optional*): The IP address of the Pi-Hole system. Defaults to `localhost`. +- **location** (*Optional*): The installation location of the Pi-Hole API. Defaults to `admin`. - **ssl** (*Optional*): If `true`, use SSL/TLS to connect to the Pi-Hole system. Defaults to `False`. - **verify_ssl** (*Optional*): Verify the certification of the system. Default to `True`. - **monitored_conditions** (*Optional*): Defines the stats to monitor as sensors. From dee06025a5afc788f06ec9af0907f8e1cee815e8 Mon Sep 17 00:00:00 2001 From: Thibault Cohen Date: Wed, 21 Jun 2017 14:59:43 -0400 Subject: [PATCH 13/49] Add current balance to hydroquebec sensor (#2861) --- source/_components/sensor.hydroquebec.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.hydroquebec.markdown b/source/_components/sensor.hydroquebec.markdown index 398b442d613..18de06c9c7c 100644 --- a/source/_components/sensor.hydroquebec.markdown +++ b/source/_components/sensor.hydroquebec.markdown @@ -40,6 +40,7 @@ Configuration variables: - **password** (*Required*): Password used to log into the Hydro-Québec site. - **contract** (required since HA 4.0) Your contract number with Hydro-Québec - **monitored_variables** array (*Required*): Variables to monitor. + - **balance** : Current balance - **period_total_bill** : Current period bill - **period_length**: Current period length - **period_total_days**: Total number of days in this period From d24d1befba6cb16dcc8a8ff2f94c18917d2885ef Mon Sep 17 00:00:00 2001 From: Jose Juan Montes Date: Wed, 21 Jun 2017 22:35:04 +0200 Subject: [PATCH 14/49] Added glances CPU temperature doc. (#2838) * Added glances CPU temperature doc. * Remove line breaks --- source/_components/sensor.glances.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.glances.markdown b/source/_components/sensor.glances.markdown index f730b892e54..03b25369a74 100644 --- a/source/_components/sensor.glances.markdown +++ b/source/_components/sensor.glances.markdown @@ -16,7 +16,7 @@ ha_release: 0.7.3 The `glances` sensor platform is consuming the system information provided by the [Glances](https://github.com/nicolargo/glances) API. This enables one to track remote host and display their stats in Home Assistant. -This sensors needs a running instance of `glances` on the host. The minimal supported version of `glances` is 2.3. +This sensors needs a running instance of `glances` on the host. The minimal supported version of `glances` is 2.3. To start a Glances RESTful API server on its default port 61208, the a test the following command can be used: ```bash @@ -57,6 +57,7 @@ sensor: - 'process_total' - 'process_thread' - 'process_sleeping' + - 'cpu_temp' ``` Configuration variables: @@ -79,4 +80,6 @@ Configuration variables: - **process_total**: Total number of processes - **process_thread**: Number of threads - **process_sleeping**: Number of sleeping processes + - **cpu_temp**: CPU Temperature (may not available on all platforms) +Not all platforms are able to provide all metrics. For instance `cpu_temp` is requires installing and configuring `lmsensors` in Ubuntu, and may not be available at all in other platforms. From 504b48d420859db637dd46bb0c8b07a32e35caeb Mon Sep 17 00:00:00 2001 From: Miha Lunar Date: Thu, 22 Jun 2017 07:27:21 +0200 Subject: [PATCH 15/49] Limitless led fade documentation for PR #7369 (#2865) Added an example group using the property and a short description of what the property does. --- source/_components/light.limitlessled.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/light.limitlessled.markdown b/source/_components/light.limitlessled.markdown index 4dd76e750f5..a0d0933b253 100644 --- a/source/_components/light.limitlessled.markdown +++ b/source/_components/light.limitlessled.markdown @@ -34,6 +34,10 @@ light: - number: 2 type: rgbw name: Bathroom + - number: 3 + type: rgbw + name: Kitchen + fade: on - host: 192.168.1.11 groups: - number: 1 @@ -53,6 +57,7 @@ Configuration variables: - **number** (*Required*): Group number (`1`-`4`). Corresponds to the group number on the remote. These numbers may overlap only if the type is different. - **name** (*Required*): Any name you'd like. Must be unique among all configured groups. - **type** (*Optional*): Type of group. Choose either `rgbww`, `rgbw`, `white`, or `bridge-led`. `rgbw` is the default if you don't specify this entry. Use `bridge-led` to control the built-in LED of newer WiFi bridges. + - **fade** (*Optional*): Fade behavior. Defaults to `off`. If turned on, the group is faded out before being turned off. This makes for a more pleasing transition at the expense of wall switch usability, since the light will turn back on at the lowest brightness if it is power cycled. ### {% linkable_title Properties %} From 937a282e08418aafafd926426512fd9c9ffb4a4d Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Thu, 22 Jun 2017 09:02:53 +0200 Subject: [PATCH 16/49] add BME280 sensor platform doc (#2797) * add BME280 sensor platform doc * little fix * yaml identifier * review changes * review fixes --- source/_components/sensor.bme280.markdown | 143 ++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 source/_components/sensor.bme280.markdown diff --git a/source/_components/sensor.bme280.markdown b/source/_components/sensor.bme280.markdown new file mode 100644 index 00000000000..91f7f78f8c7 --- /dev/null +++ b/source/_components/sensor.bme280.markdown @@ -0,0 +1,143 @@ +--- +layout: page +title: "BME280 Sensor" +description: "Instructions how to integrate a BME280 sensor in a Raspberry PI into Home Assistant." +date: 2017-06-10 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: raspberry-pi.png +ha_category: Sensor +ha_release: 0.47 +ha_iot_class: "Local Push" +--- + + +The `bme280` sensor platform allows you to read temperature, humidity and pressure values of a [Bosch BME280 Environmental sensor](https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins) to your [Raspberry Pi](https://www.raspberrypi.org/). It allows you to use all the operation modes of the sensor described in its datasheet. + +To use your BME280 sensor in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: bme280 +``` + +Or, if you want to specify the working mode of the digital sensor or need to change the default I2c address (which is 0x76), add more details to the yaml config: + +```yaml +# Example of customized configuration.yaml entry +sensor: + - platform: bme280 + name: Ambient + i2c_address: 0x77 + operation_mode: 2 # forced mode + time_standby: 5 + oversampling_temperature: 4 + oversampling_pressure: 4 + oversampling_humidity: 4 + delta_temperature: -0.5 + monitored_conditions: + - temperature + - humidity + - pressure + scan_interval: 40 +``` + +This sensor is somehow famous for generating relatively high temperature measurements compared to other sensors (it looks like self-heating does not feel good for some encapsulations). If you experience this problem, you can define an absolute delta of temperature correction using a negative number. + +Configuration variables: + +- **name** (*Optional*): The name of the sensor +- **i2c_address** (*Optional*): I2c address of the sensor. It is 0x76 or 0x77. +- **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. +- **operation_mode** (*Optional*): Power mode for the sensor. Use 2 for forced mode or 3 for normal mode. Defaults to normal mode. +- **time_standby** (*Optional*): Standby time in ms for normal mode of operation as described in the sensor datasheet. Defaults to 5 ms. +- **oversampling_temperature** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. +- **oversampling_pressure** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. +- **oversampling_humidity** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. +- **filter_mode** (*Optional*): IIR filter coeficient as described in the sensor datasheet. Default is 0, for filter off. +- **delta_temperature** (*Optional*): Absolute delta for temperature correction. +- **monitored_conditions** array (*Optional*): Conditions to monitor. Available conditions are *temperature*, *humidity* and *pressure*. By default all three are displayed. + +#### Customizing the sensor data + +**Give the values friendly names & icons** + +Add the following to your `customize` + +```yaml +# Example configuration.yaml entry +customize: + sensor.ambient_temperature: + icon: mdi:thermometer + friendly_name: "Temperature" + sensor.ambient_humidity: + icon: mdi:weather-rainy + friendly_name: "Humidity" + sensor.ambient_pressure: + icon: mdi:gauge + friendly_name: "Pressure" +``` + +**Create a group** + +Add the following to your `groups` + +```yaml +# Example configuration.yaml entry +group: + ambient_sensor: + name: BME280 Environment sensor + entities: + - sensor.ambient_temperature + - sensor.ambient_humidity + - sensor.ambient_pressure +``` + + +### Directions for installing smbus support on Raspberry Pi: + +Enable I2c interface with the Raspberry Pi config utility: +```bash +# pi user environment: Enable i2c interface +sudo raspi-config +``` +Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish` and you'll be prompted to reboot. + +Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: +```bash +# pi user environment: Install i2c dependencies and utilities +sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev + +# pi user environment: Add homeassistant user to the i2c group +sudo addgroup homeassistant i2c + +# pi user environment: Reboot Raspberry Pi to apply changes +sudo reboot +``` + +###### Check the i2c address of the sensor + +After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors: + +```bash +/usr/sbin/i2cdetect -y 1 +``` + +It will output a table like this: + +```text + 0 1 2 3 4 5 6 7 8 9 a b c d e f +00: -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: 40 -- -- -- -- -- UU -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- 77 +``` + +So you can see the sensor address what you are looking for is **0x77** (there are more i2c sensors in that Raspberry Pi). From 3881bff74cccbbbddc1656386f871cecd28a5510 Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Thu, 22 Jun 2017 09:03:48 +0200 Subject: [PATCH 17/49] add HTU21D sensor platform doc (#2820) * add HTU21D sensor platform doc * don't repeat errors! * review fixes --- source/_components/sensor.htu21d.markdown | 106 ++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 source/_components/sensor.htu21d.markdown diff --git a/source/_components/sensor.htu21d.markdown b/source/_components/sensor.htu21d.markdown new file mode 100644 index 00000000000..5ce41d8eb60 --- /dev/null +++ b/source/_components/sensor.htu21d.markdown @@ -0,0 +1,106 @@ +--- +layout: page +title: "HTU21D Temperature and humidity sensor" +description: "Instructions how to integrate a HTU21D Temperature and humidity sensor in a Raspberry PI into Home Assistant." +date: 2017-06-10 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: raspberry-pi.png +ha_category: Sensor +ha_release: 0.47 +ha_iot_class: "Local Push" +--- + + +The `htu21d` sensor platform allows you to read the temperature and humidity from a [HTU21D sensor](http://www.datasheetspdf.com/PDF/HTU21D/779951/1) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins) to your [Raspberry Pi](https://www.raspberrypi.org/). + +To use your HTU21D sensor in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: htu21d +``` + +Configuration variables: + +- **name** (*Optional*): The name of the sensor +- **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. + +#### Customizing the sensor data + +**Give the values friendly names & icons** + +Add the following to your `customize` + +```yaml +# Example configuration.yaml entry +customize: + sensor.htu21d_sensor_temperature: + icon: mdi:thermometer + friendly_name: "Temperature" + sensor.htu21d_sensor_humidity: + icon: mdi:weather-rainy + friendly_name: "Humidity" +``` + +**Create a group** + +Add the following to your `groups` + +```yaml +# Example configuration.yaml entry +group: + ambient_sensor: + name: HTU21D Environment sensor + entities: + - sensor.htu21d_sensor_temperature + - sensor.htu21d_sensor_humidity +``` + +### Directions for installing smbus support on Raspberry Pi: + +Enable I2c interface with the Raspberry Pi config utility: +```bash +# pi user environment: Enable i2c interface +sudo raspi-config +``` +Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish` and you'll be prompted to reboot. + +Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: +```bash +# pi user environment: Install i2c dependencies and utilities +sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev + +# pi user environment: Add homeassistant user to the i2c group +sudo addgroup homeassistant i2c + +# pi user environment: Reboot Raspberry Pi to apply changes +sudo reboot +``` + +###### Check the i2c address of the sensor + +After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors: + +```bash +/usr/sbin/i2cdetect -y 1 +``` + +It will output a table like this: + +```text + 0 1 2 3 4 5 6 7 8 9 a b c d e f +00: -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: 40 -- -- -- -- -- UU -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- 77 +``` + +So you can see the sensor is present at the **0x40** address (there are more i2c sensors in that Raspberry Pi). From 2094220a4268af5ee9a4b393f8bba434d81d7ffe Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Thu, 22 Jun 2017 09:05:58 +0200 Subject: [PATCH 18/49] add BH1750 light sensor platform doc (#2821) * add BH1750 light sensor platform doc * don't repeat errors! * review fixes * add `multiplier` parameter --- source/_components/sensor.bh1750.markdown | 95 +++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 source/_components/sensor.bh1750.markdown diff --git a/source/_components/sensor.bh1750.markdown b/source/_components/sensor.bh1750.markdown new file mode 100644 index 00000000000..a7609501172 --- /dev/null +++ b/source/_components/sensor.bh1750.markdown @@ -0,0 +1,95 @@ +--- +layout: page +title: "BH1750 Light sensor" +description: "Instructions how to integrate a BH1750 light sensor in a Raspberry PI into Home Assistant." +date: 2017-06-10 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: raspberry-pi.png +ha_category: Sensor +ha_release: 0.47 +ha_iot_class: "Local Push" +--- + + +The `bh1750` sensor platform allows you to read the ambient light level in lux from a [BH1750FVI sensor](http://cpre.kmutnb.ac.th/esl/learning/bh1750-light-sensor/bh1750fvi-e_datasheet.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins) to your [Raspberry Pi](https://www.raspberrypi.org/). It allows you to use all the resolution modes of the sensor described in its datasheet. + +To use your BH1750 sensor in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: BH1750 +``` + +Or, if you want to specify the resolution mode of the digital sensor or need to change the default I2c address (which is 0x23), add more details to the yaml config. + +The sensor can work with resolutions of 0.5 lx (high res mode 1), 1 lx (high res mode 2) or 4 lx (low res mode), and make measurements continuously or one time each call. To set any of these operation modes, select one of these combinations: `continuous_low_res_mode`, `continuous_high_res_mode_2`, `continuous_high_res_mode_1`, `one_time_high_res_mode_1`, `one_time_high_res_mode_2`, `one_time_low_res_mode`. + +```yaml +# Example of customized configuration.yaml entry +sensor: + - platform: bh1750 + name: Ambient light + i2c_address: 0x5C + operation_mode: one_time_high_res_mode_1 + measurement_delay_ms: 200 + scan_interval: 25 +``` + +Configuration variables: + +- **name** (*Optional*): The name of the sensor +- **i2c_address** (*Optional*): I2c address of the sensor. It is 0x23 or 0x5C. +- **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. +- **operation_mode** (*Optional*): Working mode for the sensor. Defaults to `continuous_high_res_mode_1` for continuous measurement and 1 lx resolution. +- **measurement_delay_ms** (*Optional*): Delay time in ms for waiting the sensor to get the measure. Defaults to 120 ms. +- **multiplier** (*Optional*): Correction coefficient to multiply the measured light level. Value between 0.1 and 10. Default is 1. + + +### Directions for installing smbus support on Raspberry Pi: + +Enable I2c interface with the Raspberry Pi config utility: +```bash +# pi user environment: Enable i2c interface +sudo raspi-config +``` +Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish` and you'll be prompted to reboot. + +Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: +```bash +# pi user environment: Install i2c dependencies and utilities +sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev + +# pi user environment: Add homeassistant user to the i2c group +sudo addgroup homeassistant i2c + +# pi user environment: Reboot Raspberry Pi to apply changes +sudo reboot +``` + +###### Check the i2c address of the sensor + +After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors: + +```bash +/usr/sbin/i2cdetect -y 1 +``` + +It will output a table like this: + +```text + 0 1 2 3 4 5 6 7 8 9 a b c d e f +00: -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: 40 -- -- -- -- -- UU -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- 77 +``` + +So you can see the sensor address what you are looking for is **0x23** (there are more i2c sensors in that Raspberry Pi). From ad242d6b3c84b2563b644782c9db66301151dd70 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 22 Jun 2017 09:20:04 +0200 Subject: [PATCH 19/49] Update 'ha_release' and formatting updates --- source/_components/sensor.bh1750.markdown | 52 ++++++++++------- source/_components/sensor.bme280.markdown | 71 ++++++++++++----------- source/_components/sensor.htu21d.markdown | 39 +++++++------ 3 files changed, 89 insertions(+), 73 deletions(-) diff --git a/source/_components/sensor.bh1750.markdown b/source/_components/sensor.bh1750.markdown index a7609501172..c2bd03c4cfa 100644 --- a/source/_components/sensor.bh1750.markdown +++ b/source/_components/sensor.bh1750.markdown @@ -1,7 +1,7 @@ --- layout: page title: "BH1750 Light sensor" -description: "Instructions how to integrate a BH1750 light sensor in a Raspberry PI into Home Assistant." +description: "Instructions how to integrate a BH1750 light sensor into Home Assistant." date: 2017-06-10 00:00 sidebar: true comments: false @@ -9,12 +9,17 @@ sharing: true footer: true logo: raspberry-pi.png ha_category: Sensor -ha_release: 0.47 +ha_release: 0.48 ha_iot_class: "Local Push" --- -The `bh1750` sensor platform allows you to read the ambient light level in lux from a [BH1750FVI sensor](http://cpre.kmutnb.ac.th/esl/learning/bh1750-light-sensor/bh1750fvi-e_datasheet.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins) to your [Raspberry Pi](https://www.raspberrypi.org/). It allows you to use all the resolution modes of the sensor described in its datasheet. +The `bh1750` sensor platform allows you to read the ambient light level in lux from a [BH1750FVI sensor](http://cpre.kmutnb.ac.th/esl/learning/bh1750-light-sensor/bh1750fvi-e_datasheet.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins). It allows you to use all the resolution modes of the sensor described in its datasheet. + +Tested devices: + +- [Raspberry Pi](https://www.raspberrypi.org/) + To use your BH1750 sensor in your installation, add the following to your `configuration.yaml` file: @@ -24,7 +29,19 @@ sensor: - platform: BH1750 ``` -Or, if you want to specify the resolution mode of the digital sensor or need to change the default I2c address (which is 0x23), add more details to the yaml config. +Configuration variables: + +- **name** (*Optional*): The name of the sensor +- **i2c_address** (*Optional*): I2c address of the sensor. It is 0x23 or 0x5C. +- **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. +- **operation_mode** (*Optional*): Working mode for the sensor. Defaults to `continuous_high_res_mode_1` for continuous measurement and 1 lx resolution. +- **measurement_delay_ms** (*Optional*): Delay time in ms for waiting the sensor to get the measure. Defaults to 120 ms. +- **multiplier** (*Optional*): Correction coefficient to multiply the measured light level. Value between 0.1 and 10. Default is 1. + + +## {% linkable_title Full Examples %} + +If you want to specify the resolution mode of the digital sensor or need to change the default I2c address (which is 0x23), add more details to the `configuration.yaml` file. The sensor can work with resolutions of 0.5 lx (high res mode 1), 1 lx (high res mode 2) or 4 lx (low res mode), and make measurements continuously or one time each call. To set any of these operation modes, select one of these combinations: `continuous_low_res_mode`, `continuous_high_res_mode_2`, `continuous_high_res_mode_1`, `one_time_high_res_mode_1`, `one_time_high_res_mode_2`, `one_time_low_res_mode`. @@ -39,43 +56,36 @@ sensor: scan_interval: 25 ``` -Configuration variables: +## {% linkable_title Directions for installing smbus support on Raspberry Pi %} -- **name** (*Optional*): The name of the sensor -- **i2c_address** (*Optional*): I2c address of the sensor. It is 0x23 or 0x5C. -- **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. -- **operation_mode** (*Optional*): Working mode for the sensor. Defaults to `continuous_high_res_mode_1` for continuous measurement and 1 lx resolution. -- **measurement_delay_ms** (*Optional*): Delay time in ms for waiting the sensor to get the measure. Defaults to 120 ms. -- **multiplier** (*Optional*): Correction coefficient to multiply the measured light level. Value between 0.1 and 10. Default is 1. +Enable I2c interface with the Raspberry Pi configuration utility: - -### Directions for installing smbus support on Raspberry Pi: - -Enable I2c interface with the Raspberry Pi config utility: ```bash # pi user environment: Enable i2c interface -sudo raspi-config +$ sudo raspi-config ``` + Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish` and you'll be prompted to reboot. Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: + ```bash # pi user environment: Install i2c dependencies and utilities -sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev +$ sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev # pi user environment: Add homeassistant user to the i2c group -sudo addgroup homeassistant i2c +$ sudo addgroup homeassistant i2c # pi user environment: Reboot Raspberry Pi to apply changes -sudo reboot +$ sudo reboot ``` -###### Check the i2c address of the sensor +### {% linkable_title Check the i2c address of the sensor %} After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors: ```bash -/usr/sbin/i2cdetect -y 1 +$ /usr/sbin/i2cdetect -y 1 ``` It will output a table like this: diff --git a/source/_components/sensor.bme280.markdown b/source/_components/sensor.bme280.markdown index 91f7f78f8c7..8da831b0678 100644 --- a/source/_components/sensor.bme280.markdown +++ b/source/_components/sensor.bme280.markdown @@ -1,7 +1,7 @@ --- layout: page title: "BME280 Sensor" -description: "Instructions how to integrate a BME280 sensor in a Raspberry PI into Home Assistant." +description: "Instructions how to integrate a BME280 sensor into Home Assistant." date: 2017-06-10 00:00 sidebar: true comments: false @@ -9,12 +9,16 @@ sharing: true footer: true logo: raspberry-pi.png ha_category: Sensor -ha_release: 0.47 +ha_release: 0.48 ha_iot_class: "Local Push" --- -The `bme280` sensor platform allows you to read temperature, humidity and pressure values of a [Bosch BME280 Environmental sensor](https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins) to your [Raspberry Pi](https://www.raspberrypi.org/). It allows you to use all the operation modes of the sensor described in its datasheet. +The `bme280` sensor platform allows you to read temperature, humidity and pressure values of a [Bosch BME280 Environmental sensor](https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins). It allows you to use all the operation modes of the sensor described in its datasheet. + +Tested devices: + +- [Raspberry Pi](https://www.raspberrypi.org/) To use your BME280 sensor in your installation, add the following to your `configuration.yaml` file: @@ -24,7 +28,23 @@ sensor: - platform: bme280 ``` -Or, if you want to specify the working mode of the digital sensor or need to change the default I2c address (which is 0x76), add more details to the yaml config: +Configuration variables: + +- **name** (*Optional*): The name of the sensor +- **i2c_address** (*Optional*): I2c address of the sensor. It is 0x76 or 0x77. +- **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. +- **operation_mode** (*Optional*): Power mode for the sensor. Use 2 for forced mode or 3 for normal mode. Defaults to normal mode. +- **time_standby** (*Optional*): Standby time in ms for normal mode of operation as described in the sensor datasheet. Defaults to 5 ms. +- **oversampling_temperature** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. +- **oversampling_pressure** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. +- **oversampling_humidity** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. +- **filter_mode** (*Optional*): IIR filter coeficient as described in the sensor datasheet. Default is 0, for filter off. +- **delta_temperature** (*Optional*): Absolute delta for temperature correction. +- **monitored_conditions** array (*Optional*): Conditions to monitor. Available conditions are *temperature*, *humidity* and *pressure*. By default all three are displayed. + +## {% linkable_title Full Examples %} + +If you want to specify the working mode of the digital sensor or need to change the default I2c address (which is 0x76), add more details to the `configuration.yaml` file: ```yaml # Example of customized configuration.yaml entry @@ -47,25 +67,9 @@ sensor: This sensor is somehow famous for generating relatively high temperature measurements compared to other sensors (it looks like self-heating does not feel good for some encapsulations). If you experience this problem, you can define an absolute delta of temperature correction using a negative number. -Configuration variables: +## {% linkable_title Customizing the sensor data %} -- **name** (*Optional*): The name of the sensor -- **i2c_address** (*Optional*): I2c address of the sensor. It is 0x76 or 0x77. -- **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. -- **operation_mode** (*Optional*): Power mode for the sensor. Use 2 for forced mode or 3 for normal mode. Defaults to normal mode. -- **time_standby** (*Optional*): Standby time in ms for normal mode of operation as described in the sensor datasheet. Defaults to 5 ms. -- **oversampling_temperature** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. -- **oversampling_pressure** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. -- **oversampling_humidity** (*Optional*): Oversampling multiplier as described in the sensor datasheet. Can be 0 (no sampling), 1, 2, 4, 8, or 16. Default is 1. -- **filter_mode** (*Optional*): IIR filter coeficient as described in the sensor datasheet. Default is 0, for filter off. -- **delta_temperature** (*Optional*): Absolute delta for temperature correction. -- **monitored_conditions** array (*Optional*): Conditions to monitor. Available conditions are *temperature*, *humidity* and *pressure*. By default all three are displayed. - -#### Customizing the sensor data - -**Give the values friendly names & icons** - -Add the following to your `customize` +Give the values friendly names and icons, add the following to your `customize:` section. ```yaml # Example configuration.yaml entry @@ -81,9 +85,7 @@ customize: friendly_name: "Pressure" ``` -**Create a group** - -Add the following to your `groups` +To create a group, add the following to your `groups` section. ```yaml # Example configuration.yaml entry @@ -96,38 +98,39 @@ group: - sensor.ambient_pressure ``` +## {% linkable_title Directions for installing smbus support on Raspberry Pi %} -### Directions for installing smbus support on Raspberry Pi: +Enable I2c interface with the Raspberry Pi configuration utility: -Enable I2c interface with the Raspberry Pi config utility: ```bash # pi user environment: Enable i2c interface -sudo raspi-config +$ sudo raspi-config ``` + Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish` and you'll be prompted to reboot. Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: + ```bash # pi user environment: Install i2c dependencies and utilities -sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev +$ sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev # pi user environment: Add homeassistant user to the i2c group -sudo addgroup homeassistant i2c +$ sudo addgroup homeassistant i2c # pi user environment: Reboot Raspberry Pi to apply changes -sudo reboot +$ sudo reboot ``` -###### Check the i2c address of the sensor +### {% linkable_title Check the i2c address of the sensor %} After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors: ```bash -/usr/sbin/i2cdetect -y 1 +$ /usr/sbin/i2cdetect -y 1 ``` It will output a table like this: - ```text 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- diff --git a/source/_components/sensor.htu21d.markdown b/source/_components/sensor.htu21d.markdown index 5ce41d8eb60..c4ed5aa9766 100644 --- a/source/_components/sensor.htu21d.markdown +++ b/source/_components/sensor.htu21d.markdown @@ -1,7 +1,7 @@ --- layout: page title: "HTU21D Temperature and humidity sensor" -description: "Instructions how to integrate a HTU21D Temperature and humidity sensor in a Raspberry PI into Home Assistant." +description: "Instructions how to integrate a HTU21D Temperature and humidity sensor into Home Assistant." date: 2017-06-10 00:00 sidebar: true comments: false @@ -9,12 +9,16 @@ sharing: true footer: true logo: raspberry-pi.png ha_category: Sensor -ha_release: 0.47 +ha_release: 0.48 ha_iot_class: "Local Push" --- -The `htu21d` sensor platform allows you to read the temperature and humidity from a [HTU21D sensor](http://www.datasheetspdf.com/PDF/HTU21D/779951/1) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins) to your [Raspberry Pi](https://www.raspberrypi.org/). +The `htu21d` sensor platform allows you to read the temperature and humidity from a [HTU21D sensor](http://www.datasheetspdf.com/PDF/HTU21D/779951/1) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins). + +Tested devices: + +- [Raspberry Pi](https://www.raspberrypi.org/) To use your HTU21D sensor in your installation, add the following to your `configuration.yaml` file: @@ -29,11 +33,10 @@ Configuration variables: - **name** (*Optional*): The name of the sensor - **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. -#### Customizing the sensor data -**Give the values friendly names & icons** +## {% Customizing the sensor data %} -Add the following to your `customize` +Give the values friendly names and icons, add the following to your `customize:` section. ```yaml # Example configuration.yaml entry @@ -46,9 +49,7 @@ customize: friendly_name: "Humidity" ``` -**Create a group** - -Add the following to your `groups` +To create a group, add the following to your `groups` section. ```yaml # Example configuration.yaml entry @@ -60,37 +61,39 @@ group: - sensor.htu21d_sensor_humidity ``` -### Directions for installing smbus support on Raspberry Pi: +## {% linkable_title Directions for installing smbus support on Raspberry Pi %} + +Enable I2c interface with the Raspberry Pi configuration utility: -Enable I2c interface with the Raspberry Pi config utility: ```bash # pi user environment: Enable i2c interface -sudo raspi-config +$ sudo raspi-config ``` + Select `Interfacing options->I2C` choose `` and hit `Enter`, then go to `Finish` and you'll be prompted to reboot. Install dependencies for use the `smbus-cffi` module and enable your _homeassistant_ user to join the _i2c_ group: + ```bash # pi user environment: Install i2c dependencies and utilities -sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev +$ sudo apt-get install build-essential libi2c-dev i2c-tools python-dev libffi-dev # pi user environment: Add homeassistant user to the i2c group -sudo addgroup homeassistant i2c +$ sudo addgroup homeassistant i2c # pi user environment: Reboot Raspberry Pi to apply changes -sudo reboot +$ sudo reboot ``` -###### Check the i2c address of the sensor +### {% linkable_title Check the i2c address of the sensor %} After installing `i2c-tools`, a new utility is available to scan the addresses of the connected sensors: ```bash -/usr/sbin/i2cdetect -y 1 +$ /usr/sbin/i2cdetect -y 1 ``` It will output a table like this: - ```text 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- From ed28d46d5dd71a4915cadd8d00542aa5ec5697d4 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 22 Jun 2017 09:28:50 +0200 Subject: [PATCH 20/49] Fix tag --- source/_components/sensor.htu21d.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.htu21d.markdown b/source/_components/sensor.htu21d.markdown index c4ed5aa9766..f81b0f6c71e 100644 --- a/source/_components/sensor.htu21d.markdown +++ b/source/_components/sensor.htu21d.markdown @@ -34,7 +34,7 @@ Configuration variables: - **i2c_bus** (*Optional*): I2c bus where the sensor is. Defaults to 1, for Raspberry Pi 2 and 3. -## {% Customizing the sensor data %} +## {% linkable_title Customizing the sensor data %} Give the values friendly names and icons, add the following to your `customize:` section. From ce30b5b0258d768619724d4767c33ca48a7b547e Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Fri, 23 Jun 2017 15:58:09 -0400 Subject: [PATCH 21/49] Fix binary_sensor.template example (#2877) The binary_sensor.template was return states of "On" and "Off", however that doesn't seem to work in 0.47. You need True / False, which makes sense, given that's what the single line evals are going to return. Update the existing example, and add another one about computing composite occupancy from device tracker and motion sensors. --- .../binary_sensor.template.markdown | 60 +++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/source/_components/binary_sensor.template.markdown b/source/_components/binary_sensor.template.markdown index ba69ae5c77f..7ec02e5db1c 100644 --- a/source/_components/binary_sensor.template.markdown +++ b/source/_components/binary_sensor.template.markdown @@ -56,36 +56,40 @@ sensor: Some movement sensors and door/window sensors will appear as a switch. By using a template binary sensor, the switch can be displayed as a binary sensors. The original switch can then be hidden by [customizing.](/getting-started/customizing-devices/) ```yaml -binary_sensor: - - platform: template +binary_sensor: + - platform: template sensors: movement: value_template: {% raw %}"{{ states.switch.movement.state == 'on' }}"{% endraw %} device_class: motion door: - value_template: {% raw %}"{{ states.switch.door.state == 'on' }}"{% endraw %} + value_template: {% raw %}"{{ states.switch.door.state == 'on' }}"{% endraw %} device_class: opening ``` ### {% linkable_title Combining multiple sensors, and using entity_id: %} -This example combines multiple CO sensors into a single overall status. It also shows how to use `entity_id` +This example combines multiple CO sensors into a single overall +status. When using templates with binary sensors, you need to return +`True` or `False` explicitly. `entity_id` is used to limit which +sensors are being monitored to update the state, making computing this +sensor far more efficient. ```yaml -binary_sensor: - - platform: template +binary_sensor: + - platform: template sensors: co: friendly_name: 'CO' device_class: 'gas' value_template: {% raw %}>- - {%- if is_state("sensor.bedroom_co_status", "Ok") + {%- if is_state("sensor.bedroom_co_status", "Ok") and is_state("sensor.kitchen_co_status", "Ok") and is_state("sensor.wardrobe_co_status", "Ok") -%} - Off + False {%- else -%} - On + True {%- endif %}{% endraw %} entity_id: - sensor.bedroom_co_status @@ -104,5 +108,41 @@ sensor: friendly_name: 'Day/Night' value_template: {% raw %}'{% if is_state("sun.sun", "above_horizon") %}Day{% else %}Night{% endif %}'{% endraw %} icon_template: {% raw %}'{% if is_state("sun.sun", "above_horizon") %}mdi:weather-sunny{% else %}mdi:weather-night{% endif %}'{% endraw %} - +``` + +### {% linkable_title Is anyone home? %} + +This example is determining if anyone is home based on the combination +of device tracking and motion sensors. It's extremely useful if you +have kids / baby sitter / grand parrents who might still be in your +house that aren't represented by a trackable device in home +assistant. This is providing a composite of wifi based device tracking +and z-wave multisensor presence sensors. + +```yaml +binary_sensor: + - platform: template + sensors: + people_home: + value_template: >- + {%- if is_state("device_tracker.sean", "home") + or is_state("device_tracker.susan", "home") + or is_state("binary_sensor.office_124", "on") + or is_state("binary_sensor.hallway_134", "on") + or is_state("binary_sensor.living_room_139", "on") + or is_state("binary_sensor.porch_ms6_1_129", "on") + or is_state("binary_sensor.family_room_144", "on") + -%} + True + {%- else -%} + False + {%- endif %} + entity_id: + - device_tracker.sean + - device_tracker.susan + - binary_sensor.office_124 + - binary_sensor.hallway_134 + - binary_sensor.living_room_139 + - binary_sensor.porch_ms6_1_129 + - binary_sensor.family_room_144 ``` From 00a24f107c8fdc7d954207b5928b39fb756cada4 Mon Sep 17 00:00:00 2001 From: Omar Usman Date: Sat, 24 Jun 2017 04:03:45 +0800 Subject: [PATCH 22/49] Add ClickSend notify service page. (#2868) --- source/_components/notify.clicksend.markdown | 41 +++++++++++++++++++ source/images/supported_brands/clicksend.png | Bin 0 -> 19784 bytes 2 files changed, 41 insertions(+) create mode 100644 source/_components/notify.clicksend.markdown create mode 100644 source/images/supported_brands/clicksend.png diff --git a/source/_components/notify.clicksend.markdown b/source/_components/notify.clicksend.markdown new file mode 100644 index 00000000000..fd4380b746c --- /dev/null +++ b/source/_components/notify.clicksend.markdown @@ -0,0 +1,41 @@ +--- +layout: page +title: "ClickSend" +description: "Instructions on how to add ClickSend notifications to Home Assistant." +date: 2017-06-22 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: clicksend.png +ha_category: Notifications +ha_release: 0.48 +--- + + +The `clicksend` platform uses [ClickSend](https://clicksend.com) to deliver notifications from Home Assistant. + +### Get your ClickSend API Credentials +Go to your [ClickSend Dashboard](https://dashboard.clicksend.com) section and create your new project. After creating your project, you should now be able to obtain your `username` and `api_key`. + +### Configuration +To add ClickSend to your installation, add the following to your Home Assistant `configuration.yaml` file: + +```yaml +notify: + - platform: clicksend + name: ClickSend + username: CLICKSEND_USERNAME + api_key: CLICKSEND_API_KEY + recipient: PHONE_NO +``` + +Configuration variables: + +* **name** (Optional): Setting the optional parameter name allows multiple notifiers to be created. The default value is `ClickSend`. The notifier will bind to the service notify.NOTIFIER_NAME. +* **username** (Required): Your `Username`. +* **api_key** (Required): Your `API Key`. +* **recipient** (Required): Your phone no. This is where you want to send your notification SMS messages. eg: `09171234567` + + +To use notifications, please see the [getting started with automation page](https://home-assistant.io/getting-started/automation/). diff --git a/source/images/supported_brands/clicksend.png b/source/images/supported_brands/clicksend.png new file mode 100644 index 0000000000000000000000000000000000000000..ba157f039802127a43fdce6a8e9e0b7e61f011f3 GIT binary patch literal 19784 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 Date: Fri, 23 Jun 2017 22:06:49 +0200 Subject: [PATCH 23/49] add telegram_bot/delete_message doc for #8153 (#2869) --- source/_components/telegram_bot.markdown | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/source/_components/telegram_bot.markdown b/source/_components/telegram_bot.markdown index 1558621f39b..058d6e5f296 100644 --- a/source/_components/telegram_bot.markdown +++ b/source/_components/telegram_bot.markdown @@ -84,7 +84,7 @@ Edit a previusly sent message in a conversation. | Service data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| -| `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: `{{ trigger.event.data.message.message_id }}`. | +| `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: `{{ trigger.event.data.message.message_id }}`. You can use `"last"` to refer to the last message sent to `chat_id`. | | `chat_id` | no | The chat_id where to edit the message. | | `message` | no | Message body of the notification. | | `title` | yes | Optional title for your notification. Will be composed as '%title\n%message'. | @@ -97,7 +97,7 @@ Edit the caption of a previusly sent message. | Service data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| -| `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: `{{ trigger.event.data.message.message_id }}`. | +| `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: `{{ trigger.event.data.message.message_id }}`. You can use `"last"` to refer to the last message sent to `chat_id`. | | `chat_id` | no | The chat_id where to edit the caption. | | `caption` | no | Message body of the notification. | | `disable_web_page_preview`| yes | True/false for disable link previews for links in the message. | @@ -108,7 +108,7 @@ Edit the inline keyboard of a previusly sent message. | Service data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| -| `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: `{{ trigger.event.data.message.message_id }}`. | +| `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: `{{ trigger.event.data.message.message_id }}`. You can use `"last"` to refer to the last message sent to `chat_id`. | | `chat_id` | no | The chat_id where to edit the reply_markup. | | `disable_web_page_preview`| yes | True/false for disable link previews for links in the message. | | `inline_keyboard` | yes | List of rows of commands, comma-separated, to make a custom inline keyboard with buttons with associated callback data. Example: `["/button1, /button2", "/button3"]` or `[[["Text btn1", "/button1"], ["Text btn2", "/button2"]], [["Text btn3", "/button3"]]]` | @@ -122,6 +122,14 @@ Respond to a callback query originated by clicking on an online keyboard button. | `callback_query_id` | no | Unique id of the callback response. In the `telegram_callback` event data: `{{ trigger.event.data.id }}` | | `show_alert` | yes | True/false for show a permanent notification. Defaults to False. | +#### {% linkable_title Service `telegram_bot/delete_message` %} +Delete a previusly sent message in a conversation. + +| Service data attribute | Optional | Description | +|---------------------------|----------|--------------------------------------------------| +| `message_id` | no | Id of the message to delete. When answering a callback from a pressed button, the id of the origin message is in: `{{ trigger.event.data.message.message_id }}`. You can use `"last"` to refer to the last message sent to `chat_id`. | +| `chat_id` | no | The chat_id where to delete the message. | + ### {% linkable_title `Telegram` notification platform %} From 6e346cd5789fda1a41eb665d15e98485473e9347 Mon Sep 17 00:00:00 2001 From: Thibault Cohen Date: Fri, 23 Jun 2017 16:09:43 -0400 Subject: [PATCH 24/49] Add note in decora light (#2862) * Add note in decora light * Remove some line line from the traceback --- source/_components/light.decora.markdown | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/_components/light.decora.markdown b/source/_components/light.decora.markdown index d40acae2bac..349172fd0f8 100644 --- a/source/_components/light.decora.markdown +++ b/source/_components/light.decora.markdown @@ -34,3 +34,23 @@ Configuration variables: - **[mac address]** (*Required*): The bluetooth address of the switch. - **name** (*Optional*): The custom name to use in the frontend. - **api_key** (*Required*): The API key to acces the device. + +

+If you get an error looking like this: + +```bash +Jun 20 19:41:18 androlapin hass[29588]: ERROR:homeassistant.components.light:Error while setting up platform decora +[...] +Jun 20 19:41:18 androlapin hass[29588]: File "/usr/lib/python3.6/concurrent/futures/thread.py", line 55, in run +Jun 20 19:41:18 androlapin hass[29588]: result = self.fn(*self.args, **self.kwargs) +Jun 20 19:41:18 androlapin hass[29588]: File "/opt/homeassistant/custom_components/light/decora.py", line 68, in setup_platform +Jun 20 19:41:18 androlapin hass[29588]: light = DecoraLight(device) +[...] +Jun 20 19:41:18 androlapin hass[29588]: OSError: [Errno 8] Exec format error +``` + +1. Go to your `.homeassistant` folder +2. Then go to `deps/bluepy` subfolder. +3. Then run `make all` +4. Restart home assistant +

From d05883210d73091dc5db53eb0d9eb0be50367b6c Mon Sep 17 00:00:00 2001 From: Bas Schipper Date: Sat, 24 Jun 2017 07:56:02 +0200 Subject: [PATCH 25/49] Added documentation for the buienradar precipitation forecast average & total sensors (#2878) * Added precipitation forecast average & total sensors * Added documentation for the buienradar precipitation forecast average & total sensors --- source/_components/sensor.buienradar.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/sensor.buienradar.markdown b/source/_components/sensor.buienradar.markdown index 94d354fbd56..351e7ce3e13 100644 --- a/source/_components/sensor.buienradar.markdown +++ b/source/_components/sensor.buienradar.markdown @@ -35,6 +35,7 @@ Configuration variables: - **latitude** (*Optional*): Latitude to use for selection of data source location. Longitude and latitude will be taken from Home Assistant configuration, but can be overridden/changed in this component to select a different location for buienradar. - **longitude** (*Optional*): Longitude to use for selection of data source location. Longitude & latitude will be taken from Home Assistant configuration, but can be overridden/changed in this component to select a different location for buienradar. +- **timeframe** (*Optional*): Minutes to look ahead for precipitation (5..120) [default: 60]. - **monitored_conditions** array (*Required*): One or more conditions to display in the frontend. - **stationname**: The name of the selected meteo-station. - **symbol**: A symbol for the current weather. @@ -50,6 +51,8 @@ Configuration variables: - **windgust**: The windspeed of wind gusts (m/s). - **precipitation**: The amount of precipitation/rain in mm/h. - **irradiance**: Sun intensity in Watt per square meter (W/m2). + - **precipitation_forecast_average**: The average expected precipitation/rain in mm/h within the given timeframe. + - **precipitation_forecast_total**: The total expected precipitation/rain in mm/h within the given timeframe. Full configuration example where location is manually specified: @@ -73,5 +76,7 @@ Full configuration example where location is manually specified: - windgust - precipitation - irradiance + - precipitation_forecast_average + - precipitation_forecast_total ``` From 2189bbda0301d73227f14053744aba7206386d1b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 23 Jun 2017 23:24:14 -0700 Subject: [PATCH 26/49] Update binary_sensor.template.markdown --- source/_components/binary_sensor.template.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/binary_sensor.template.markdown b/source/_components/binary_sensor.template.markdown index 7ec02e5db1c..b09f67aab64 100644 --- a/source/_components/binary_sensor.template.markdown +++ b/source/_components/binary_sensor.template.markdown @@ -124,7 +124,7 @@ binary_sensor: - platform: template sensors: people_home: - value_template: >- + value_template: {% raw %}>- {%- if is_state("device_tracker.sean", "home") or is_state("device_tracker.susan", "home") or is_state("binary_sensor.office_124", "on") @@ -136,7 +136,7 @@ binary_sensor: True {%- else -%} False - {%- endif %} + {%- endif %}{% endraw %} entity_id: - device_tracker.sean - device_tracker.susan From 55bec87b3865b9472c2f0e0e00339dd2876c2ba4 Mon Sep 17 00:00:00 2001 From: Alex Mekkering Date: Sat, 24 Jun 2017 09:47:13 +0200 Subject: [PATCH 27/49] Mqtt discovery optional nodeid (#2840) * Add support for remote (TCP/IP) DSMR sensors (i.e. via ser2net) * Processed review comment and added ser2net config * added optional node_id to MQTT discovery --- source/_docs/mqtt/discovery.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index b32043a6229..38be23ffab0 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -37,15 +37,18 @@ Configuration variables: The discovery topic need to follow a specific format: ```text -///<> +//[/]/<> ``` - ``: One of the supported components, eg. `binary_sensor`. +- ``: (*Optional*) id of the node providing the topic. - ``: The ID of the device. This will become the `entity_id` in Home Assistant. - `<>`: The topic `config` or `state` which defines the current action. The payload will be checked like an entry in your `configuration.yaml` file if a new device is added. This means that missing variables will be filled with the platform's default values. All configuration variables which are *required* must be present in the initial payload send to `/config`. +The `` level can be used by clients to only subscribe to their own (command) topics by using one wildcard topic like `/+//+/set`. + ### {% linkable_title Examples %} A motion detection device which can be represented by a [binary sensor](/components/binary_sensor.mqtt/) for your garden would sent its configuration as JSON payload to the Configuration topic. After the first message to `config`, then the MQTT messages sent to the state topic will update the state in Home Assistant. From d91d3c4f1b02de61b6b399a1b7d1ab5b37f18d06 Mon Sep 17 00:00:00 2001 From: Marc Plano-Lesay Date: Sat, 24 Jun 2017 17:46:33 +0200 Subject: [PATCH 28/49] Add documentation for sensor.gtfs offset option (#2883) * Add documentation for sensor.gtfs offset option Added in PR home-assistant/home-assistant#7980 * Add default --- source/_components/sensor.gtfs.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.gtfs.markdown b/source/_components/sensor.gtfs.markdown index 094a26ce1af..00243470ada 100644 --- a/source/_components/sensor.gtfs.markdown +++ b/source/_components/sensor.gtfs.markdown @@ -54,4 +54,5 @@ Configuration variables: - **destination** (*Required*): The stop ID of your destination station. - **data** (*Required*): The name of the ZIP file or folder containing the GTFS data. It must be located inside the `gtfs` folder of your configuration directory. - **name** (*Optional*): Name to use in the frontend. +- **offset** (*Optional*): A minimum delay to look for. If a departure is in less time than `offset`, it will be ignored. Defaults to `0`. From 65d3633dc1cc5b2820490d53cce406d46175d807 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sat, 24 Jun 2017 15:02:14 -0400 Subject: [PATCH 29/49] Switch to new zwave entity ids by default (#2885) --- source/_docs/z-wave.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/z-wave.markdown b/source/_docs/z-wave.markdown index 615cbb9b5db..e6f83b23482 100644 --- a/source/_docs/z-wave.markdown +++ b/source/_docs/z-wave.markdown @@ -46,7 +46,7 @@ Configuration variables: - **delay** (*Optional*): Specify the delay for refreshing of node value. Only the light component uses this. Defaults to 2 seconds. - **invert_openclose_buttons** (*Optional*): Inverts function of the open and close buttons for the cover domain. Defaults to `False`. - **debug** (*Optional*): Print verbose z-wave info to log. Defaults to `False`. -- **new_entity_ids** (*Optional*): Switch to new entity_id generation. Defaults to `False`. +- **new_entity_ids** (*Optional*): Switch to new entity_id generation. Defaults to `True`. To find the path of your Z-Wave USB stick or module, run: From a293361085615863af9aa5ab0b9264122fe1337a Mon Sep 17 00:00:00 2001 From: Morten Lied Johansen Date: Sat, 24 Jun 2017 22:23:04 +0200 Subject: [PATCH 30/49] Documentation for the linksys_smart device tracker (#2872) --- .../device_tracker.linksys_smart.markdown | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 source/_components/device_tracker.linksys_smart.markdown diff --git a/source/_components/device_tracker.linksys_smart.markdown b/source/_components/device_tracker.linksys_smart.markdown new file mode 100644 index 00000000000..883c60cc3e1 --- /dev/null +++ b/source/_components/device_tracker.linksys_smart.markdown @@ -0,0 +1,31 @@ +--- +layout: page +title: "Linksys Smart Wifi Router" +description: "Instructions how to integrate Linksys Smart Wifi Router into Home Assistant." +date: 2017-06-22 01:40 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Presence Detection +logo: linksys.png +ha_release: 0.48 +--- + +The `linksys_smart` platform offers presence detection by looking at connected devices to a Linksys Smart Wifi based +router. It was tested with a LINKSYS WRT3200ACM MU-MIMO Gigabit Wi-Fi Wireless Router. + +To use a Linksys Smart Wifi Router in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +device_tracker: + - platform: linksys_smart + host: 192.168.1.1 +``` + +Configuration variables: + +- **host** (*Required*): The hostname or IP address of your router, eg. `192.168.1.1`. + +See the [device tracker component page](/components/device_tracker/) for instructions how to configure the people to be tracked. From ddfe8de46a782a0a1587cffb2da63840b3bceee0 Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Sun, 25 Jun 2017 21:25:22 +0200 Subject: [PATCH 31/49] add content_type option to generic camera (#2887) --- source/_components/camera.generic.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/camera.generic.markdown b/source/_components/camera.generic.markdown index a090c45235b..5d2855728ea 100644 --- a/source/_components/camera.generic.markdown +++ b/source/_components/camera.generic.markdown @@ -35,6 +35,7 @@ Configuration variables: - **password** (*Optional*): The password for accessing your camera. - **authentication** (*Optional*): Type for authenticating the requests `basic` (default) or `digest`. - **limit_refetch_to_url_change** (*Optional*): True/false value (default: false). Limits refetching of the remote image to when the url changes. Only relevant if using a template to fetch the remote image. +- **content_type** (*Optional*): Set the content type for the IP camera if it is not a jpg file (default: `image/jpeg`). Use `image/svg+xml` to add a dynamic svg file.

From f8cdc5d9714d950d93f86eb71b9752b3fa1ed2c1 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 25 Jun 2017 22:27:30 +0200 Subject: [PATCH 32/49] Add sample for 'content_type:' --- source/_components/camera.generic.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/_components/camera.generic.markdown b/source/_components/camera.generic.markdown index 5d2855728ea..c5bb0aab2f9 100644 --- a/source/_components/camera.generic.markdown +++ b/source/_components/camera.generic.markdown @@ -44,3 +44,16 @@ Configuration variables:

+## {% linkable_title Examples %} + +In this section you find some real life examples of how to use this sensor. + +### {% linkable_title Weather graph from yr.no %} + +```yaml +camera: + - platform: generic + name: Weather + still_image_url: https://www.yr.no/place/Norway/Oslo/Oslo/Oslo/meteogram.svg + content_type: 'image/svg+xml' +``` From da593dc98cebe8bd9ae35c3446fec60670100d6c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 25 Jun 2017 22:28:41 +0200 Subject: [PATCH 33/49] Replace sensor with camera --- source/_components/camera.generic.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/camera.generic.markdown b/source/_components/camera.generic.markdown index c5bb0aab2f9..6f384859570 100644 --- a/source/_components/camera.generic.markdown +++ b/source/_components/camera.generic.markdown @@ -46,7 +46,7 @@ Configuration variables: ## {% linkable_title Examples %} -In this section you find some real life examples of how to use this sensor. +In this section you find some real life examples of how to use this camera platform. ### {% linkable_title Weather graph from yr.no %} From 2260938b0356f7107af39f0a9b751d8293ea644b Mon Sep 17 00:00:00 2001 From: PhracturedBlue Date: Mon, 26 Jun 2017 00:32:44 -0700 Subject: [PATCH 34/49] Fix bad link to react.html example (#2889) --- source/_cookbook/custom_panel_using_react.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_cookbook/custom_panel_using_react.markdown b/source/_cookbook/custom_panel_using_react.markdown index 3ecc604d325..b8f5f8d59b8 100644 --- a/source/_cookbook/custom_panel_using_react.markdown +++ b/source/_cookbook/custom_panel_using_react.markdown @@ -18,7 +18,7 @@ This is a [React](https://facebook.github.io/react/) implementation of [TodoMVC] - It uses the user configuration for the component in the `configuration.yaml` file for rendering. - It allows toggling the sidebar. -All you need is available as a [custom panel](https://github.com/home-assistant/home-assistant/tree/master/config/panels/react.html). Download the file and save it in `/panels/` (you might have to create the directory if it doesn't exist). +All you need is available as a [custom panel](https://github.com/home-assistant/example-custom-config/blob/master/panels/react.html). Download the file and save it in `/panels/` (you might have to create the directory if it doesn't exist). Create a entry for the panel in your `configuration.yaml` file to enable it. From 857e8be7abae4250a5bf1396bf9fbaa80fe04f35 Mon Sep 17 00:00:00 2001 From: Wim Haanstra Date: Mon, 26 Jun 2017 14:54:48 +0200 Subject: [PATCH 35/49] Open Hardware Monitor component page and logo added. (#2824) * Open Hardware Monitor component page and logo added. * Fixed typos * Added host config variable Added the host configuration variable to documentation and changed example to be inline with most of the other documentation. * Update sensor.openhardwaremonitor.markdown * Update 'ha_release' --- .../sensor.openhardwaremonitor.markdown | 32 ++++++++++++++++++ .../supported_brands/openhardwaremonitor.png | Bin 0 -> 16135 bytes 2 files changed, 32 insertions(+) create mode 100644 source/_components/sensor.openhardwaremonitor.markdown create mode 100644 source/images/supported_brands/openhardwaremonitor.png diff --git a/source/_components/sensor.openhardwaremonitor.markdown b/source/_components/sensor.openhardwaremonitor.markdown new file mode 100644 index 00000000000..2c511e888f0 --- /dev/null +++ b/source/_components/sensor.openhardwaremonitor.markdown @@ -0,0 +1,32 @@ +--- +layout: page +title: "Open Hardware Monitor Sensor" +description: "Instructions how to integrate Open Hardware Monitor within Home Assistant." +date: 2017-06-16 00:00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: openhardwaremonitor.png +ha_category: Sensor +ha_release: 0.48 +ha_iot_class: "Local Polling" +--- + + +The `openhardwaremonitor` platform uses your [Open Hardware Monitor](http://openhardwaremonitor.org/) installation as a source for sensors that will display system information. + +To add Open Hardware Monitor to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: openhardwaremonitor + host: IP_ADDRESS +``` + +Configuration variables: + +- **host** (*Required*): The IP address or hostname of your Open Hardware Monitor. +- **port** (*Optional*): The port of your Open Hardware Monitor API. Default to 8085. + diff --git a/source/images/supported_brands/openhardwaremonitor.png b/source/images/supported_brands/openhardwaremonitor.png new file mode 100644 index 0000000000000000000000000000000000000000..1d34eda76f81a870f15a7468f190a05ca91e0508 GIT binary patch literal 16135 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 G!~YL}YE~8i literal 0 HcmV?d00001 From 7d90ea212f5fb0ad54eb491f84e10ae3df795e36 Mon Sep 17 00:00:00 2001 From: Will W Date: Tue, 27 Jun 2017 14:26:08 +0900 Subject: [PATCH 36/49] doc change: percentage (DPT_Scaling) KNX sensors #8168 (#2876) --- source/_components/sensor.knx.markdown | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/source/_components/sensor.knx.markdown b/source/_components/sensor.knx.markdown index c08562b2570..6fee026f346 100644 --- a/source/_components/sensor.knx.markdown +++ b/source/_components/sensor.knx.markdown @@ -19,11 +19,12 @@ The `knx` component must be configured correctly, see [KNX Component](/component There is currently support for the following KNX data point types: -| Condition | KNX Datapoint Type | Unit of measurement | Data type | -| :-------------------|:--------------------|:--------------------|:-------------| -| Temperature | 9.001 | °C | 2 Byte Float | -| Speed (Wind speed) | 9.005 | m/s | 2 Byte Float | -| Illuminance (Lux) | 9.004 | Lux | 2 Byte Float | +| Condition | KNX Datapoint Type | Unit of measurement | Data type | +| :-------------------|:--------------------|:--------------------|:-------------------------------| +| Temperature | 9.001 | °C | 2 Byte Float | +| Speed (Wind speed) | 9.005 | m/s | 2 Byte Float | +| Illuminance (Lux) | 9.004 | Lux | 2 Byte Float | +| Percentage | 5.001 | % | 1 Byte Scaled Unsigned Integer | To use your KNX sensor in your installation, add the following to your `configuration.yaml` file: @@ -43,6 +44,11 @@ sensor: name: Lux type: illuminance address: 1/0/1 + + - platform: knx + name: percent + type: percentage + address: 1/0/4 ``` Configuration variables: @@ -50,6 +56,6 @@ Configuration variables: - **type** (*Required*): The type of the sensor. See table above for available options. - **address** (*Required*): The address of the sensor on the bus. - **name** (*Optional*): The name to use in the frontend. -- **minimum** (*Optional*): Minimum sensor value who gets processed. Defaults to a hardcoded default values. -- **maximum** (*Optional*): Maximum sensor value who gets processed. Defaults to a hardcoded default. +- **minimum** (*Optional*): Minimum sensor value - defaults to a hardcoded default value. +- **maximum** (*Optional*): Maximum sensor value - defaults to a hardcoded default value. From faa3fc6128031e1b2b9f1237c1ddb34830c7f7ac Mon Sep 17 00:00:00 2001 From: Teagan Glenn Date: Mon, 26 Jun 2017 23:28:34 -0600 Subject: [PATCH 37/49] Optional OpenCV Camera example custom component (#2894) * Optional OpenCV Camera example custom component * Update image_processing.opencv.markdown --- source/_components/image_processing.opencv.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/image_processing.opencv.markdown b/source/_components/image_processing.opencv.markdown index de29cbee745..286f5c87c9d 100644 --- a/source/_components/image_processing.opencv.markdown +++ b/source/_components/image_processing.opencv.markdown @@ -51,3 +51,5 @@ image_processing: - **file** (*Required*): The path to the classifier xml file. - **scale** (*Optional*): The scale to perform when processing, this is a `float` value that must be greater than or equal to `1.0`, default is `1.1`. - **neighbors** (*Optional*): The minimum number of neighbors required for a match, default is `4`. The higher this number, the more picky the matching will be; lower the number, the more false positives you may experience. + +If you would like to see the regions that OpenCV has detected, add this opencv camera to your config's custom_components/camera directory: [https://gist.github.com/Teagan42/bf4b941b34a79a3e184e149ff1efd82f](https://gist.github.com/Teagan42/bf4b941b34a79a3e184e149ff1efd82f) From 284e4d73ba2f5c4bb61b6413720344548149ab43 Mon Sep 17 00:00:00 2001 From: Audun Ytterdal Date: Tue, 27 Jun 2017 07:28:44 +0200 Subject: [PATCH 38/49] Updated pygments.rb to latest to make it build under ruby 2.4 (#2644) --- Gemfile | 2 +- Gemfile.lock | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index a1d627a356a..58b50178659 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source "https://rubygems.org" group :development do gem 'rake', '~> 10.0' gem 'jekyll', '~> 3.0' - gem 'pygments.rb', '~> 0.6.3' + gem 'pygments.rb', '~> 1.1.2' gem 'rdiscount', '~> 2.0' gem 'RedCloth', '~> 4.2' gem 'haml', '~> 4.0' diff --git a/Gemfile.lock b/Gemfile.lock index a64797568a6..11bd6af12e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -45,6 +45,7 @@ GEM 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) @@ -71,14 +72,12 @@ GEM jekyll (>= 2.0) pathutil (0.14.0) forwardable-extended (~> 2.6) - posix-spawn (0.3.11) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) - pygments.rb (0.6.3) - posix-spawn (~> 0.3.6) - yajl-ruby (~> 1.2.0) + pygments.rb (1.1.2) + multi_json (>= 1.0.0) rack (1.6.4) rack-protection (1.5.3) rack @@ -107,7 +106,6 @@ GEM ref tilt (2.0.5) titlecase (0.1.1) - yajl-ruby (1.2.1) PLATFORMS ruby @@ -127,7 +125,7 @@ DEPENDENCIES octopress-filters octopress-include-tag pry - pygments.rb (~> 0.6.3) + pygments.rb (~> 1.1.2) rake (~> 10.0) rb-fsevent (~> 0.9) rdiscount (~> 2.0) @@ -138,4 +136,4 @@ DEPENDENCIES therubyracer BUNDLED WITH - 1.10.6 + 1.14.6 From cfbea697ceed1282af3c9d092c1714701840a246 Mon Sep 17 00:00:00 2001 From: Eugenio Panadero Date: Tue, 27 Jun 2017 07:28:57 +0200 Subject: [PATCH 39/49] telegram_bot platform to only send messages (#8186) (#2882) * add telegram_bot/onlysend doc for #8186 * change of platform name and small rewrite * fix new platform name --- .../telegram_bot.broadcast.markdown | 37 +++++++++++++++++++ source/_components/telegram_bot.markdown | 1 + 2 files changed, 38 insertions(+) create mode 100644 source/_components/telegram_bot.broadcast.markdown diff --git a/source/_components/telegram_bot.broadcast.markdown b/source/_components/telegram_bot.broadcast.markdown new file mode 100644 index 00000000000..5bfa018b732 --- /dev/null +++ b/source/_components/telegram_bot.broadcast.markdown @@ -0,0 +1,37 @@ +--- +layout: page +title: "Telegram broadcast" +description: "Telegram support to send messages only" +date: 2017-06-24 11:20 +sidebar: true +comments: false +sharing: true +footer: true +logo: telegram.png +ha_category: Telegram chatbot +ha_release: 0.48 +--- + +Telegram implementation to support **sending messages only**. Your Home Assistant instance does not have to be exposed to the Internet and there is no polling to receive messages sent to the bot. + +To integrate this into Home Assistant, add the following section to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry + +telegram_bot: + - platform: broadcast + api_key: + allowed_chat_ids: + - 12345 + - 67890 +``` + +Configuration variables: + +- **allowed_chat_ids** (*Required*): A list of user in the `user_id` Telegram format enabled to interact to webhook +- **api_key** (*Required*): The API token of your bot. +- **parse_mode** (*Optional*): Default parser for messages if not explicit in message data: 'html' or 'markdown'. Default is 'markdown'. + +To get your `chat_id` and `api_key` follow the instructions [here](/components/notify.telegram/). + diff --git a/source/_components/telegram_bot.markdown b/source/_components/telegram_bot.markdown index 058d6e5f296..56c699c8c8e 100644 --- a/source/_components/telegram_bot.markdown +++ b/source/_components/telegram_bot.markdown @@ -17,6 +17,7 @@ Use Telegram on your mobile or desktop device to send and receive messages or co This component creates notification services to send, or edit previously sent, messages from a [Telegram Bot account](https://core.telegram.org/bots) configured either with the [polling](/components/telegram_bot.polling/) method or with the [webhooks](/components/telegram_bot.webhooks/) one, and trigger events when receiving messages. +If you don't need to receive messages, you can use the [broadcast](/components/telegram_bot.broadcast/) platform instead. ### {% linkable_title Notification services %} Available services: `send_message`, `send_photo`, `send_document`, `send_location`, `edit_message`, `edit_replymarkup`, `edit_caption`, `answer_callback_query`. From 39d3e6c384b30051443668a19edd1e28abeb2772 Mon Sep 17 00:00:00 2001 From: Matthew Schick Date: Wed, 28 Jun 2017 01:48:11 -0400 Subject: [PATCH 40/49] Update for new nest.set_mode service (#2645) * Update for new nest.set_mode service * Update nest.markdown --- source/_components/nest.markdown | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/source/_components/nest.markdown b/source/_components/nest.markdown index 389bc14d1e8..5483a42eeba 100644 --- a/source/_components/nest.markdown +++ b/source/_components/nest.markdown @@ -58,3 +58,29 @@ Configuration variables: - **client_id** (*Required*): Your Nest developer client ID. - **client_secret** (*Required*): Your Nest developer client secret. - **structure** (*Optional*): The structure or structures you would like to include devices from. If not specified, this will include all structures in your Nest account. + +### {% linkable_title Services %} + +Currently there is a single `nest.set_mode` service available to switch between +"away" and "home" modes. This service requires a `home_mode` param and has an +optional `structure` param. + +```yaml +# Example script to set away, no structure specified so will execute for all +set_nest_away: + sequence: + - service: nest.set_mode + data: + home_mode: away +``` + +```yaml +# Example script to set home, structure specified +set_nest_home: + sequence: + - service: nest.set_mode + data: + home_mode: home + structure: + - Building +``` From 10daaa76928100f759e2571038fae6003232f893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Arnauts?= Date: Thu, 29 Jun 2017 10:21:24 +0200 Subject: [PATCH 41/49] ComfoConnect climate platform documentation. (#2483) * ComfoConnect climate platform documentation. * Update documentation for rewrite. * Update version * Minor style fixes:wq --- source/_components/fan.comfoconnect.markdown | 56 +++++++++++++++++++ source/images/supported_brands/zehnder.png | Bin 0 -> 9683 bytes 2 files changed, 56 insertions(+) create mode 100644 source/_components/fan.comfoconnect.markdown create mode 100644 source/images/supported_brands/zehnder.png diff --git a/source/_components/fan.comfoconnect.markdown b/source/_components/fan.comfoconnect.markdown new file mode 100644 index 00000000000..3e1d338e6fa --- /dev/null +++ b/source/_components/fan.comfoconnect.markdown @@ -0,0 +1,56 @@ +--- +layout: page +title: "Zehnder ComfoAir Q Ventilation" +description: "Instructions how to integrate Zehnder ComfoAir Q350/450/600 ventilation systems into Home Assistant." +date: 2017-06-28 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: zehnder.png +ha_category: Fan +ha_release: "0.48" +--- + +The `comfoconnect` component lets you control Zehnder ComfoAir [Q350](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q350-st)/[450](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q450-st)/[600](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q600-st) +ventilation units from Home Assistant. You need a [ComfoConnect LAN C](http://www.zehnder.co.uk/products-and-systems/comfortable-indoor-ventilation/ms-comfoair-q/ideal-control#node-21233) +bridge to connect the unit to your local network. + +There is an official iPhone and Android app to configure and control your unit. This platform connects with the help of +the unofficial [pycomfoconnect](https://github.com/michaelarnauts/comfoconnect) library. + +The component has a fan platform to view and control the ventilation speed, and a sensors platform to read out the outdoor temperature and humidity, the indoor temperature and humidity, and the extract and supply air flow (in m³ per hour). + +To set it up, add the following information to your `configuration.yaml` file: + +```yaml +climate: + - platform: comfoconnect + host: 192.168.1.213 +``` + +Configuration variables: + +- **host** (*Required*): The ip or hostname of the ComfoConnect LAN C bridge. +- **name** (*Optional*): The name of this device as you want to see it in Home Assistant. +- **token** (*Optional*): The token you want to use when registering with the device. This is a random 32 char hexadecimal string. The default value is `00000000000000000000000000000001`. +- **user_agent** (*Optional*): The name you want to supply when registering with the device. The default value is `Home Assistant`. +- **pin** (*Optional*): The pin code to use when registering. This is `0000` by default. You only need to change this if you have changed the factory default pin. + +To register the sensors, add the following to your `configuration.yaml` file: + +```yaml +sensor: + - platform: comfoconnect + resources: + - current_temperature + - current_humidity + - outside_temperature + - outside_humidity + - air_flow_supply + - air_flow_exhaust +``` + +

+Note that it's not possible to have multiple connection to the bridge at the same time. This component will keep the connection open, and if you open the app, it will ask you to disconnect Home Assistant. If you close the app again, Home Assistant will reconnect automatically. +

diff --git a/source/images/supported_brands/zehnder.png b/source/images/supported_brands/zehnder.png new file mode 100644 index 0000000000000000000000000000000000000000..fd910207c1903fb89d56251f8083c0f877a0fbe2 GIT binary patch literal 9683 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 Date: Fri, 30 Jun 2017 18:04:26 +1200 Subject: [PATCH 42/49] Grammar fix ups in image processing dlib (#2904) * Grammar fix ups in image processing dlib * "a event" -> events. Grammar fixup * Fixed up english grammar in link to component. --- source/_components/image_processing.dlib_face_detect.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/image_processing.dlib_face_detect.markdown b/source/_components/image_processing.dlib_face_detect.markdown index e6a9fc48981..6673146847d 100644 --- a/source/_components/image_processing.dlib_face_detect.markdown +++ b/source/_components/image_processing.dlib_face_detect.markdown @@ -13,9 +13,9 @@ featured: false ha_release: 0.44 --- -The `dlib_face_detect` image processing platform allows you to use the [Dlib](http://www.dlib.net/) through Home Assistant. This platform enables you do detect face on camera and fire a event with attributes. +The `dlib_face_detect` image processing platform allows you to use the [Dlib](http://www.dlib.net/) through Home Assistant. This platform enables face detection from cameras, and can fire events with attributes. -For using the result inside an automation rule, take a look at the [component](/components/image_processing/) page. +This can be used to trigger an automation rule. Further info is on the [component](/components/image_processing/) page. ### {% linkable_title Configuration Home Assistant %} From 53021cf61fc4559777dc050711fcd5d62d6b9fd5 Mon Sep 17 00:00:00 2001 From: PhracturedBlue Date: Fri, 30 Jun 2017 09:47:52 -0700 Subject: [PATCH 43/49] Initial documentation for cover templates (#2842) * Initial documentation for cover templates * Fix many typos found during review. * Fix typos and formatting --- source/_components/cover.template.markdown | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 source/_components/cover.template.markdown diff --git a/source/_components/cover.template.markdown b/source/_components/cover.template.markdown new file mode 100644 index 00000000000..49191221dd3 --- /dev/null +++ b/source/_components/cover.template.markdown @@ -0,0 +1,77 @@ +--- +layout: page +title: "Template Cover" +description: "Instructions how to integrate Template covers into Home Assistant." +date: 2017-06-19 20:32 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Cover +ha_release: 0.48 +ha_iot_class: "Local Push" +logo: home-assistant.png +--- + +The `template` platform can create covers that combine components and provides the ability to run scripts or invoke services for each of the open, close, stop, position, and tilt commands of a cover. + +To enable Template covers in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +cover: + - platform: template + covers: + garage_door: + friendly_name: "Garage Door" + value_template: "{% raw %}{{is_state('sensor.garage_door > 0'}}{% endraw %}" + open_cover: + service: script.open_garage_door + close_cover: + service: script.close_garage_door + stop_cover: + service: script.stop_garage_door +``` + +Configuration variables: + +- **covers** array (*Required*): List of your coverss. + - **open_cover** (*Required*): Defines an [action](/getting-started/automation/) to run when the cover is opened. + - **close_cover** (*Required*): Defines an [action](/getting-started/automation/) to run when the cover is closed. + - **stop_cover** (*Required*): Defines an [action](/getting-started/automation/) to run when the cover is stopped. + - **set_cover_position** (*Optional*): Defines an [action](/getting-started/automation/) to run when the cover is set to a specific value (between 0 and 100). + - **set_cover_tilt_position** (*Optional*): Defines an [action](/getting-started/automation/) to run when the cover tilt is set to a specific value (between 0 and 100). + - **friendly_name** (*Optional*): Name to use in the frontend. + - **value_template** (*Optional*): Defines a [template](/topics/templating/) to get the state of the cover. Valid values are open/true or closed/false. Either `value_template` or `position_template` must be specified. + - **position_template** (*Optional*): Defines a [template](/topics/templating/) to get the state of the cover. Legal values are numbers between 0 (closed) and 100 (open). Either `value_template` or `position_template` must be specified. + - **icon_template** (*Optional*): Defines a [template](/topics/templating/) to specify which icon to use. Either `value_template` or `position_template` must be specified. + - **entity_id** (*Optional*): Add a list of entity IDs so the switch only reacts to state changes of these entities. This will reduce the number of times the cover will try to update it's state. + + +## {% linkable_title Examples %} + +In this section you will find some real life examples of how to use this cover. + +### {% linkable_title Garage Door %} + +This example converts a garage door with a controllable switch and position sensor into a cover. + +```yaml +cover: + - platform: template + covers: + garage_door: + friendly_name: 'Garage Door' + value_template: "{% raw %}{{ sensor.garage_door }}{% endraw %}" + open_cover: + service: switch.turn_on + entity_is: switch.garage_door + close_cover: + service: switch.turn_off + entity_is: switch.garage_door + stop_cover: + service: switch.turn_on + entity_is: switch.garage_door + icon_template: "{% raw %}{% if not is_state('sensor.garage_door', 'on') %}mdi:garage-open{% else %}mdi:garage{% endif %}{% endraw %}" + +``` From a7ef65a9e4a115459904fbe117018d1d44c1c7ed Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 30 Jun 2017 19:15:08 +0200 Subject: [PATCH 44/49] Update for 0.48 --- source/_components/ha.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/ha.markdown b/source/_components/ha.markdown index a3ae92104a6..ba629a567f3 100644 --- a/source/_components/ha.markdown +++ b/source/_components/ha.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Home Assistant 0.47" +title: "Home Assistant 0.48" description: "" date: 2016-12-16 17:00 sidebar: true @@ -9,7 +9,7 @@ sharing: true footer: true logo: home-assistant.png ha_category: Other -ha_release: 0.47 +ha_release: 0.48 --- Details about the latest release can always be found at: From f439ef6a784e205213319e2e82a8a77600a65387 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 30 Jun 2017 21:14:14 -0700 Subject: [PATCH 45/49] Version bump to 0.48 --- _config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index f75ef6d8ad2..bd0bda31b29 100644 --- a/_config.yml +++ b/_config.yml @@ -142,13 +142,13 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 47 -current_patch_version: 1 -date_released: 2017-06-21 +current_minor_version: 48 +current_patch_version: 0 +date_released: 2017-07-01 # 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-0471---june-21" +patch_version_notes: "#" # Minor release (Example #release-0431---april-25): From 46e4f5a33e44c08a1a500329098f174cb53613ec Mon Sep 17 00:00:00 2001 From: Michael Fester Date: Sat, 1 Jul 2017 23:27:06 +0200 Subject: [PATCH 46/49] Documentation for Snips components (#2892) * Documentation for Snips components * Fix version * Fix typos * Update video link --- source/_components/snips.markdown | 93 ++++++++++++++++++++ source/images/screenshots/snips_modules.png | Bin 0 -> 40124 bytes source/images/screenshots/snips_nlu.png | Bin 0 -> 49459 bytes source/images/supported_brands/snips.png | Bin 0 -> 5583 bytes 4 files changed, 93 insertions(+) create mode 100644 source/_components/snips.markdown create mode 100644 source/images/screenshots/snips_modules.png create mode 100644 source/images/screenshots/snips_nlu.png create mode 100644 source/images/supported_brands/snips.png diff --git a/source/_components/snips.markdown b/source/_components/snips.markdown new file mode 100644 index 00000000000..63e8009af48 --- /dev/null +++ b/source/_components/snips.markdown @@ -0,0 +1,93 @@ +--- +layout: page +title: "Snips" +description: "Instructions how to integrate Snips within Home Assistant." +date: 2017-06-22 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: snips.png +ha_category: Voice +ha_release: 0.48 +--- + +The [Snips Voice Platform](https://www.snips.ai) allows users to add powerful voice assistants to their Raspberry Pi devices without compromising on Privacy. It runs 100% on-device, and does not require an Internet connection. It features Hotword Detection, Automatic Speech Recognition (ASR), Natural Language Understanding (NLU) and Dialog Management. + +![Snips Modules](/images/screenshots/snips_modules.png) + +Snips takes voice or text as input, and produces *intents* as output, which are explicit representations of an intention behind an utterance, and which can subsequently be used by Home Assistant to perform appropriate actions. + +![Snips Modules](/images/screenshots/snips_nlu.png) + + +## {% linkable_title The Snips Voice Platform %} + +### Installation + +The Snips Voice Platform is installed on Raspberry Pi with the following command: + +```sh +(pi) $ curl https://install.snips.ai -sSf | sh +``` + +### Creating an assistant + +
+ +
+ +Snips assistants are created via the [Snips Console](https://console.snips.ai). Once trained, the assistant should be downloaded and copied to the Raspberry Pi: + +```sh +$ scp assistantproj_XXX.zip pi@pi_hostname:/home/pi/assistant.zip +``` + +and installed locally via the `snips-install-assistant` helper script: + +```sh +(pi) $ sudo snips-install-assistant assistant.zip +``` + +### Running Snips + +Make sure that a microphone is plugged to the Raspberry Pi. If you are having trouble setting up audio, we have written a guide on [Raspberry Pi Audio Configuration](https://github.com/snipsco/snips-platform-documentation/wiki/1.-Setup-the-Snips-Voice-Platform-on-your-Raspberry-Pi#configuring-the-audio). + +Start the Snips Voice Platform using the `snips` command: + +```sh +(pi) $ snips +``` + +Snips is now ready to take voice commands from the microphone. To trigger the listening, simply say + +> Hey Snips + +followed by a command, e.g. + +> Set the lights to green in the living room + +We should see the transcribed phrase in the logs, as well as a properly parsed intent. The intent is published on MQTT, on the `hermes/nlu/intentParsed` topic. The Snips Home Assistant component subscribes to this topic, and handles the intent according to the rules defined in `configuration.yaml`, as explained below. + +## Home Assistant configuration + +By default, the Snips MQTT broker runs on port 9898. We should tell Home Assistant to use this as a broker, rather than its own, by adding the following section to `configuration.yaml`: + +```yaml +mqtt: + broker: 127.0.0.1 + port: 9898 +``` + +In Home Assistant, we trigger actions based on intents produced by Snips. This is done in `configuration.yaml`. For instance, the following block handles `ActivateLightColors` intents (included in the Snips IoT intent bundle) to change light colors: + +```yaml +snips: + intents: + ActivateLightColor: + action: + - service: light.turn_on + data_template: + entity_id: light.{% raw %}{{ objectLocation | replace(" ","_") }}{% endraw %} + color_name: {% raw %}{{ objectColor }}{% endraw %} +``` diff --git a/source/images/screenshots/snips_modules.png b/source/images/screenshots/snips_modules.png new file mode 100644 index 0000000000000000000000000000000000000000..60235f65681e1a0e445bcc8b46b7de578a47669c GIT binary patch literal 40124 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%0DtkaA9u+=3^{HFAJCn<*qLLJe(0~ zdLcEd82@?J>z7I>o_MK_6QN60LLVd77k>UY9bcV%A`h{ zL!=G423h>Sj4M8D*YqNG-=5REw0Qk44PE@`YKf!h88^v?pz^z*k zj7<5@>&zC-3hf+3fih3%iYcpVvp1OqlIA!##M`Xnil*!@-p~z1B*oWRJz@fMo$b=v z>pDUxaK5csNR72LH@x2}ztP$?Smi?}-fPr!S!EWA1Fx$a)m{>Ur; zBD!9>}SXs zzOpL(7<{5SLG}jz@{G^4oAkQt>|VMY6|_S84^HnB>|d)3O}WHi8^4!t1YBbi3Ej2k z!9d$$QopthGQ)ITpjfH-R`B5ujpm~!VY<|UKa<`LQLX`|&a=^oe7#Lb-L~lK)Gu7U zept5KeuV+Kb+llURnVSC#?E?n)qsbC(J=cor2^109pWCv~7mhM{~S zFUm^oL?yrU=Knf>5_)o+t=f6MN3ZqO55Q)H2Ypc_|3-){-B1YoZcBh?GtLE#>*XTVk!U8z%46~aDuo_erH;Bj!aYWefx|VMg zxe_KXn%9IahJ4v(g6A#n!a)KskI+U0WQoCvXF*Ah4K8RLCH)52N7rnc6sdPuT!0Ig z7luevGAUn89~UNHDp0S@V*vpb^>T`AGNv;*F0ouyf$%-)iUreI?#2`kttb!B@(N0! zJ_k%Jo91Prh|%E!M{nU;+ndR$>Ja`fmMjB;=CnE7u$SO2!{WTko^HannqdXBwHR zpV&q;V7u4OIPWsXni{=jSQ9C$UJ2z!yV6g8c}prt(05SdjsB_Iil+=8s^$v4HC9cC z$WT(@{}l&){cmG0?AqDxcmXmKV;c2S=6~Q;8uX7u{*Ces)wQAg7jcdU&SV?Bg0S-2 zuj|{_UTw3VeKgKae17nwxsf_~x(b$rB?Loo?@AXNIt1-~x7#l7HD2M=vmRtl9`|_! zUm`)_pV5kCZ$OvR#w12{!+jIC~`RzS?1Qjjl3U0OjqI z{@W|{XE*1cC3kNwoExg1l$pPp|H6kcqhv5!K&ccCNv!z`idV}Ea;<8E%EcPrLpw?R z%mS4XGH;=e`E6VZPAL?F1W2oh8(RNv3?L+&q<`-xQA?HR_L)!R8WoNH@S)x12%7^w za7ZQp1$V#DHkj)lEou~Ix8h@>5f6*9?IPumH1v=mZ1fsN`M`(Nm5~jGp~H!+uPf+- zA$BNKRTyFYpe@d#;SK5VcEgPi>Fx5ppK;`!DTLT_b!7#K8et!gdxCbiv$6=SFWXMy zm|ba=e#lis%mOcu-M6g9>dt9XK1$_?NoFsNP~v_b%ygv0Whr+12ZL1+yulWxm-t-c zkx379jE;V(pvaz)%F&eJx%CcoPdQWHJ zPA=`E20_R{Ky0SFFXqCs1MWY#j?UL#FahH-t6?=Ll z<$|=C{?&0;&_LzSR~VC<>*s*n0n?9!RpxF-s_MFkPxg(BXID<&Xb2N+#WnK!MW|Bb zDCJ`7{z~Zis#SPa_?P(5a-~Q*bHe~?Pd$gesqbT71`1W+B{_<$28bTn@;(Kr-C?`W zOhmow7Sj&8<5C-a)%B*54e@ed_$YZA2hndhFKeH5@8nZ4!~Ruw;RipEJdD@5pUly@ zg6x(oNTEpNS3>`5hu(Jk*x>8?9KI0md}n-Yi%rJ9a--sJ?=P){oGz!kPd95HHS3ky zB!CRBPQS7XUbpvMbu#|M40J*~FiK1=Eqd>6BKIE4>N(=|s}Ew2v~YZGp49~EiMAMx z@(4BatlMGnaFW_M8zaw4nWG*jhoZ%#KQ`uWthdZm^Ac(rEvyu|dHaR|u7D&YMUAD>GS-l+)}-0fQ>w_k8qZ}59N zUq`1;XF<~t(Z<){Z5M}n9VN31eJ9dVl1*?9oTz)@(q&U)|JTsacd9Vo)qF#fHVGXzi!e<%a! zGWE}9E(MW>Dtr}s0esMnxcAuH*?7}%xJS@-s8I6yd^BMs8>*A<8t5sym?8G$oYaV^ zO3MTPXL=|!P354UaVW!fywaV!;_!#z`3+ULDl_2pg#Ma7+SDL)HoE4iLEVj?Bx#qw zv*5E}UEmCRZ$aeR^^1GD$9+O=U9*z6lN8sZsPeS**X6U}M9x%dRtc-TCX&w#EfMN5 z-UGt+_0m;ak5~Dbc&Z?gUFo5ax2JLDUuzUq|MhSR|2<;*hw})P`hEZ3=mU1RZh3fo6 zEe>0|ocR~Pk)%LP@}QxzvXGON@~vs5KeL=hTBf!rlgg+lcdS9skZlA>L~x14Px#tT zgk018SIFq;fi>!}tcNdeZc2GAU7&ky;kz$5GQ1tGdfD5m%r`#g6!vYXUrLQ`1K;17 z^y@-~?4dN-?&j{`u<|fbxD)sdZYI;3zjENIAfZZ^C^ow?aJy!?vq~m})Nz1mGbAfO zF>5PHazS63RVMjn|84n!Z+$R-oDj~aa%}_ecJd6XGt4{!6Ax{83P?hHv|0jf74E z1TK|HxMYSEz5y3ftq0)4L~{-TkQdE-?p|B9sk_|Ap@TQ$b`lEJ1+-dk1!!zRisoTp z*C~%!~O{souuYF!53L$M6?^f2>-!bR}V~Rd_H&g7xR})pC-!#*1%iv3ilFh72q3 zu-J6^4vP#$Yvsx7O+Gkd@UQE;>UsH+b>HtVWj&@@aHF9;FNA0rm@tq+L>9)4Ykq;x z@yj!V=XEaQodgZ}yoD89`o7lCj7CbXh$&fW{)=CJ4PM$I;E(08&&8mM?QJXZ5tD~{ z(5>@dwylo#HBq-Z?fjq4P5BM4mVP*C);jv;Q5gasXT8g0>?I{%GpdbAR%I_ji3?WG z4US2LrgOXpwuhq}U{y?Cym$nj!; zor-}1B+TMoJe+z zx&mbwbO$s3aQ)hkfcGf@K3snn{;4*=tFwQ(b@c`w64+9h+oo>1Usu>LHm4p}(bll= zqzQM_XpXUUA+pe^Y(y;n9+<=en=g+y(RznvM;)WHF&F7>laXDc35|+Y7EOH+dn>mt zpi{vMyQnQUYtHRVXRX+(`BiE-*~_|(d^$vYVAkN=-#_z3+awB43DSB4)9?+gd1)Yl zHO?3Hr(jQXeFZU3_C7MnO9GT6&ZQr9<0I@tBz@kUttjg}w zVtSEfn8Unqd2_A9AlIG|{>ctaB0_9cdUi?9OB14q?F7ASci?7RTsLr_=8F6{wTJ3nVax2_m$5klY}209z{g&S)k4~h zYG1hmpAQ}z%8wFn>BkDezw1)3n#<)n##xVcr=v<3xp(CZMmdjslivW>ybTQb`2O=| zl6j3;8Kp;&stNMBhu=`YR0o|xBpZIc+qA+dj~SB(V%)Xh8XjYtSldM~bDqqxfRJQjfD7d)MgE zAW>;j_I&SyPbtblCG>=eEwlr}o}uM>V(O7T0-qC)N{Gdj5n6Aa!0D+l8pH2rCw^17 z^}@wf){%i=WcrzO_ZR-vYY4{LD=IMTOkVB3G;JN4&NI>veSKvf>DZ;0<|Sd4KZ;Do z?j|M5?M=Ei)d$XI=kto8?I+3t>-8b5VuinTA|Ey_awrWc3Paxbj)u30wH7s7Sk6=y z>XDC1K8+ELUhW^Xg81ab8wTksg9%w8{5XMc0(PzDZ92_VytP%_IoC-z_D%NGHYK=j zJQ@v-@@;RF5HaL_fUzr71l5yDh+Cm-mdX^0JyB{k&y|4D3-yj@S zYF-;{IQ{O0t+q?q`DB2Qb_+Qo&Q5VSzUU%#^6}CBvvzIu^7uLlr&<$a5lpH1zLNMv z)QBe^u3hQ8=2qm<@Q9}Lo3prv0_U*-%%X$uX`Xv;@Cz?QS@X|HM7V^e(Gm`!3JC^aQcsnSs;a@4vP&!k;sG9R}xv~#;-;ftAeVRW>{V#*B53SeyxZ` z$*4#8fr*^kK!BQh4n`8-bt1u;5V)pSJHZqa4d)ce9v}(l1&c58V_UQ={aJacQ7NBV zUTM2Y1nNNanRxW2z}y4M{8aL3{7RuJ7ablNLpZnGh9MicJSePZ%6aPak{}vx$pI>mL*m%U zH+#VSkxEi#6j+mfJz zhX-P5B2l=p^z9N%LCPyO7|&mtHNBy|-Fo+bukG>9_c2a~ZVOqzzZ=N`EE&*;Z)J z!B^>SQvryz)pS9tUwoldm9#t@J1|gJURWJFM>ndIm%un)Y2eS;I3WJ8z!oMvHz=@b z$~LQiqt^S@oGjMWHL)E6_?2 zZh-zAvq%}#Pm3*l`Ga6e`1+yd^6A9A(L(9oQ8<%S8n#zQ$;DW^gH@FVejOnS>6Mk< zPYS=idiNYyUEHI+cKj#~x1`TftB^Uh^XZ8dIZWnD@6GecsZ=S-?P#BzdU^vId~Aw% za)zw9zCEAn;vb);|Md*`*Yb70`ieLF_VvYVbk};Td!cN|KO!9Kys2yb#i$+9!PDgs zR+H1xu|{FL!Svv>>5I}sfi}(1(NnLJhSI~p3(mQAh+%?hJsLbpLKRS=(n`-sImK-s zqy!T+ukR0o1Ny}lTlCq`d4yk<4(FE!znq$p3zet|fG^qB&*sOJXuC;gw^O!;cIRRY z2-Wd64*i8ePY+@m32-eO293CzCh?yR_Na%cxX7Y96KusPvAtw;SogF-sg{zd5Q94v z%U(y7(Oj8rIa5hQLsMU^TPqeA{b!`!G2&_X{4Ng7(XnppT$p9=H!yhQa`pR=I`<-T zbl`a45eZwhd~={rgXdtozv<>h+!KD@m_WB^=h*U=dsqLu8Maui`X@A-kA~ii>m~pC ze8Fvh=IxZdg>%{9H21~V<@ZSl(R1?hF3fDw#Z4DunocL9)T+7J_{~&QN zZuH6Nm19_V3CE0PjWUa+euc}yeql8XCL*-*)cPLmUw7Ka-hFm}B*eX_6B_<`e(i1t z>ag4PO`P1P1kIY}FykP|-VfqvL+&3AmvK|g4AYKJ8e1zGE3=?=upi&PQOkW%QNa4b zNzwJ>!v}Jaz87~?GuNJH8EzTcim#Pvd#$P5lw>|w6Dj@(&Q<0G_YnW zfD3kS-F~p(DMPwir}Q*-zr>%JR!YpEoNTjyoQ92&#dt7+6+Y0{i!2JVWO>SQQ(`x= z+if>=%~-VhU2U1?dMEF53-$S~EwGb-YFYUpGlV_l=4GDF;fud**G#}VoD#dqY?gM{ z21AxhTv2kN$@x93btPZxc!qj?YyF&9a_aF3{MV-w5AkKws?c{>l&(?J$o0 z8}3HZ60LItMVJ``)fMq&%_Q&oj?tR2&qcA%{dHuY%k6F?bOFVOh)pdScg`8=frLKF zmGHqDt`VkV6LHH!W8FTxD2Im}Giil^`{zLt9_x$mkxsaK4G*2$9v72N{c}#W>6+vo zHgnUl;+;WvWehnj1%G|=(LOV@3<^lGv8{-I!l4|JyC1}zv8WU)rSdGeuMtYVH_1eL zCDXp*+K0OusqC}88p26~!#;$`S+0r0X|(ff^0BTvcZqHHl2!%@ZD>r0Ohw|1Zln@* zC0E=WEk)@iH|by#;MP7B(d<#SoLexOp}Ay8RoczrKF*xr2UUr5w|@==e6-(`D+p&tx`fmhcj1#<}nM-#6sT<*;DQ z5?Y|BIq_~Mr8)Oz)+@c+%T_PE+Sys9>{fP=r{GOZR?A}3eY(a}v(4uw&51tev)}&e&Kar2rw7OR%PD`N6U7sF^muRXuYOrNHzL zfw@y<>T*Le@5TD+Sk4ZQYH&ae>}V6f;)q5Qko#Ob%1WmidFHfgEhd*6J62>!*nZ0M z*lw63X?Jq5Eah;Ls7`*n4h=Gv6xJz;B~_ojdP-i3>#oxqHJTpZ*##E?=lo`fUf{;! ze9-sw#lEd}_*3b;a5u&6yS@Oe-MDYyH$dfN@p`0kD|nv)J2Zp$D=KIl^$&su=4h9h z)Q^BEK{tu`N`v3(4)2j*3+g+Mk@-rtpU*1Gpozr@8)|yVv+RV!IEd#(?QeS<+%;iy zv%#ah2Hl0KBY-4-+2Olb>g_3Kw2qr=`+*BMfg(#OQ`@E$7zXxn4&+o@;V(U_E`+aV zUU)UFFfJL^Fx@%s@7q_2-%7@p8MlMoDxPQ0 z)7_p0EtPain_0AgbQ&)=w}6AA=^DtlHPBRv%|m}rg^T0KMQV;=`$La3e^>1mn^^95 zULS2T$FE2Kqe0NA5$ap>0oS-!22Hp1Ro`x)a3tDXd#P5zqS+NXPb$?+>VKHuYBYFf zS*b$%D<*KoQEO^)`PUKH?p-Xp(9BJ^b{6HHVs+xH!cVMn~}%- z+Yc_Yik=s$Aln)i_}9$^V1<2uc{d91Jl~zGC2%}`l|U=DFJ{u;QM<#vu}aYY{YFnQ z3(POzla?i%t?&i^-dQ)QeYBAvgmWFuHA!hY4q-`I^RSgyo*1|_waE&j+ zHN2tAJeoMQ4>CR3AXv@ZB46e6NwyKPfZvHO>W^ru$--)r!p84=yvg~S=_PGie}|0BY>G7Gpn7qu3R>JC6Jrjej#hsco;cR&3d!d_#NkH(=kYFL4dqNCG(D z1216qa1jI0bY7DzbhyJReLIwdIp^v1x!-WHnh7egKTR%1m2ipLnA)rBXHYFo=T>-& z4DQE*6G>trQ)RPhgn&>@8ahlDipJ|>=%A69md#rs?!Id{qZTZuldZD{aRg{LLM1@n zgOVJ*;XB_!4iqSm*o!Mjx0<~tVL>rGb(#^G(c^MWlkX;4m~m@S=Tgd34H-M zy}D2m1&}G%u}v+LAS*5w%tud~R`gpn_g(GlSq4NjN)JvNmZ=-p9j_^TsKQ|6pPBLF zo&o<^uMQCn(!pYa%c{C(>O4VkzsX}vvu|+(*_Lka?yYU2fg3#>&h``YPt$^Lc^BHN zG_ohl23xD1Mq{S3@9#1hO3=$ z><>n)ltH72D7K%tl>if_7hZ~bD8N0Ok(PQFC&;*X%` zRMX1kUiKS7^26s}<3}WeZ#`p?XmN@{2YcuWFlf!SL^CO6AnKBur$0-CVc*~V;o{HB zduzCZ2CmWCCgkykOae=AQCM&_BBO4eL1!+uV&+?|uJJnrNjRoI=~=`SrZv)XzVpBICG!r-{iRK-> zg$8@mt$Yl@!}&nWU5%z3kFGLx?~GFyp;mI*T$>SZ^x6Ng>XnhNDp`{0 zUkz!r7$&5s>W4rTl36}x_`#tw|BtYyGokjkz018oSHF(s{bA4Z1&6frIBI1su_T^| zg>*jVcaJE2gLm_6(#}`zq|XK#jo|NQ!c(FXY8(mTiU?h2;*bzO*hhIWx5Lafnth4D zvj*aEa_;F>DW#`TI~5fiv{@2V`(D<;2#Au+Nl|2>T5Cp6t@Uggl=Yoifuge=&bdOtqt@3wDhTBK3( zw2`oq=3D~!&-Kvn%~}K0`Eu#)M%BayytU_Iu4QMo{DLd6Z^xo7U)hHPbXuO@y#MX#_2QJQM$zhMye^xJ!dX7bCy`-V_+#M z!ICP7@qLblef7;sLR6xgz@?7_S2YZ1vCCMIa|FXx1o|QK7|9ax{wO%8<6`nGz|?Kx z=1qq=>8T6-7qiiMZ0_YQIQ0+!6bvw}sA;uyHk!GIl)I@BN9?f~>J^Psi?*wUYFDW7 zyflp8PMpZ~8clu`(-jDd9T2ZMEL|vjtY)XysdoKmN^GH+3@J8jOt7QY8`wHv0%>v2 z*a{TzOl-hp6^3Y*nIa2~)W5PcFE2}h{HKF{H%ZmXpw1ft!L1zBv$g*I(!pj$1~_-J zF$;QM$Uff1`ZB@g6_hkd7TV104%HbNEi%l}?62?TK2_7!)drMZenPk$@fa3dkeC&imEh$RMvA|nDA7-N@F>+H z;ht-E3mYCpA#`WUt(14zao{SQdk$%yD^h7^$!o-p0zyEwW6T$fEq;+pQBUafSodme zJP}RAC3`4RDM!m_H`UBoXmMGz+`9Q`=^^BL_p8}`be(7Ku^Jo7IC=WL!iCTvI?cfu zp7;S9>{bBrBH?dyy|2@$3{4UP-xSN*yXV9#9nFk*he_QO$7JEoOSYgU4ukyI;fp7- z861_0b7}Fte$rPP9p_jp}lM1iWUzh$*~8__viI8H!;Y+cgL_=f^Rut+*O$UOrGPqa1CoI0QA}Sy@l*HlFOvrp zMS47FQhGlWanl(#u1^S_*=PoEJUz=a!GF%+NlLH z>!oyL#y{bZCBJVso*c&`hb2Rq+B}JW47UChAX$~qy30?Z-N#rPhbPu4r*MycE~jx+ z@CocO6-|fzs_S{@(535W0v?_5^TXh7F4TfEBs*c43<17>JIXV!@M#3 zES?gT+$jwya7mhG^B-AHOc2t|oM2^!puZe%qVdVl(BdD>>~{`66c^QmF$=C9xt2K^Pd zu~w@?%6zhf8;^riapEyH7;o{;|6|1qwRz6b#8*{aTY;PI52wFBXY~{_=9COpY6`7X zM!s8aFOyxwQTF$WIZXFmX)m(y7J{pG#xpd#*%U<`>T`Ox9@2VlZYs7f3CwA^(2Ak~ zjc-iLRU4D^pC%8K(!iP3q-)3?_|yf8zOm{Q>}N?5{YK~7Y9mPMV1xA~S`SMPzqbmI zaM!SbZt0PLRjI(==Asvdp(Y zjr75V{gp4?|MXVsTcAR^+>eBGOgX$yPJEAzKo||>7#ZPs^S3^nqm)tx4VJM6UJY%Z zOD)jCB;O8uapWFFET`PWv;2~tMB8)uHrOzh&+U23w5-RP6-LUn85U5Tl8u>sxxX;i8phqU@16Wx)o?sdZ6UBGt_c|gFfTGInB3OYydQQ3)t;R7>sw{ zf|XTSYY+E<9XCxYb;#@;g4uDQt$?O=z{!I%X7y$1oUoQ`GwNvyI-EY^bly9NZk`&( zvyW>~e=YLC8hydWC$Hv-br~$cTw<|U&WA+zdZ!9GBWAr!#b8YZtQ=EdI>WpLS$|ch zUlY}xYy#4C>lrr<3Y|IZ982$=Jmlk2>6uMG1Gh92@mUXl)W%ymoGW}glny(VBqOniMXlnh^~x6eAz6okb%g{ z-SQ!^^DFJfJyIEw2#M0mDeuIJ4yK!x)sx_p`^A~JHlY~3<87Cr+$;ZRvEdk@$D47e z(RlUFGb#$vXQ^4_dilijHAbk0o1k#Bd+m^0-mP6)o}?Q|zgc&Mh4#F_s?4B=ykHBu zuYDKdf5_uk7~Ws7mZ-AsS@yo1Sv&(y@70XCRiYr4=9~`7Y*AgooD{4c+Vd>yI5f{H zv4j_I;@n91TdNewT$~f5aZJ6=>J2a6PdUZL=oRDc4-7Go!|L$3C(#f{MsAf9u*U3i zYELgMZxF@kH)5Yo?usZIhW~MM$Sarcha!?=ZmRI2%O|3y8cr^>97Ud7q!!Wc=lza0z%k9nojxz6+;Xj;!xy$&xY38snGPy9x# z)0g)2=YD@asig{M>v1&m z$gJP3A2(C0flldvviY}GWmnxk&LA~UY!YF1xxCmTvQ}5`REN~=p)c)ByA^4F4Ky>VJTJbUOqFbiP+O*duAgON#^O;_)1}2D8O^MHU3#av?V0g=Qu0TgTOk#rfP0 zc1DRGp9NfAtJW4e$VjjgubZa+PYcTj?pk*z&-0xEb>p`6zYKwAa~rkeiasj=<9138 zin4UOSd*3jX7i|5eHjL1-3SsNN%x!TV=J)wUwQO-d~MU ztrV%z09(<Cy+`45!fMlqWH|5T5JkF7|-mo)DYl0#ELa zGfpau^FVf(da_+4kE*E5c2yVSNK=EiJ)0jYmXsHX2pp_g60h(^T3bzm9$=V~N%?{S46g!(-)NFXaxZ=J?guIjcN3@q8Y3@jj&~X!}CZcGEG^#D4kt$d^~akB|lD zBArpelHFB#veP}`_&mSUJlvgeblna}f8r#Ja z`fTwP7XteV`?#s|oin<`CMz~Jmvg63vx?Nx8?Bc7|ES%wu43A`W z)i_#I!~c5+W%h1pRdAV@{S+zLOx%NkIsBc|f-*-^ix3OAydft66E2HY2j3uoY$%jtbR3-A*=;Ef4T)j5H>&d6W=Sn6a#_5UwyOkN8_|DAMs zV(^v^In}?YrUxvgS!>h9{V}h^JnD2 zUq?oCt@?q|DuD+_!1{*K#eu#4$sU8(jx{8oVNJIh0KN4igbhL%#8^SAOr-ler`rg- z;{?sXkrEPIC6{HrIi*1fKsV_~cKH^({%~2&rlvSX;{OQQeV!ay6~`Lv?r^Zbh{Q9^ z=m7tJNy2ZF{TVe!g(I9q0Qb2OLJjbh#p^oGd9UrPMG4Ww-9YZ+=-fJ?@%N z(Yaj7mvL}Q)(GQHwhZQDR?ktnr&LYl19d8L_Z&8_dk-6r1KBX2!hyqRdKQ>zV@Yhl zVcFp6!Hq0mneNf-GXWR#?+XHBq}O2?3Q8<@9%)>Z3PFB#1Npwq{c2_wY3d_e9$Azr z-ukgi*eYNT5B0N()9VnQ--Ib%7EZpAW>>)$iIGy5UkZmZh-Y&!>Y(oi>GII_t)r^` zSIP>Djngm=q?QM(gCciJo+9@>II<61D-{cNc^fbNAk!##V;$ZHhD(y6wnND45bnl* z;2LDIw^wQVn|^_bNjrN&xa`qf%>;$`0y`w~hGBDXF8|VslRfa*#4M`_`!Kzxb#j+Nu~AS~0iSwsns2!Chmn zIsCzotoRU!V(pcW{^n0uC&0Use0~y}wPWjFl0(JG>WCG#f|>ziP5DAZe62ejHq8$i zYzsBQNE-FNzrUgY#2>g^`Uxsi#wCDIyg6U!{C;=J$^aB;eqGaYZBCHlaBa5TQnYOeQURm)JqEYQ zRvM(usFy7R&7f_X%C3$Ubs7=+ClrS7A>46fN7*c~dv775l!nxX-g_YK;HKIqA4D9G z8-FN)b_jo*--i$KuSVVt`!bH9pLu)^UxgyG`97gc}LwoOSJTthlDMBfvJqN-OTq- zteD!ZdfaFW_t(h(yV8pCIg1K5`}(epjY2t=AB`VAczyf1R4p=_Bz1AH-ItL_39dKw^`67%{^eL zxn|YN)AoBNIE|8wROfNk!|%OkVK(MG0jEG=Oju#ckQ2&;%|5W88BkPHrD5Usp|Q~5u^z-bn>p{ zY-0cSL+a(?UG(A2+UsR2>zJ6ej@^K`i0@A?_X#8J&T-@Vy}n%}h5Yh|h?u91d%1{& zZ7Spb3p2~GJ~8hN2>Kn^JiiCF&|73Db^s@_Z9`Mo>O=;gbADmf$@^3B~rF}HY=mYZ_AB{#U)^7DO z08YR)oWaE=2u{wa)EDr3)pw?teLB26X@?t-rHgr8t$5~(gFK;`Qtq*dPX*1JRZGZu zR`_+cT+7v1Yk6EL=`>?FpUq~hreH+7KUH(r1+1?d(R=eY?cD;p8-Jx3{HN{(FfAj8p{<2l$gdqV8#N$as8g(k7{-Ck0fi^!4+wvU3_NiUL1Y!-xvzC!rD0|h z37htA7{8zPQBV0}ey52?X{E7~kN1i!og&Y;ro&>67L7T)qM7wd3aT%>g7w3}7!v0W zju

Yl;yxNmCOCt6`x|nOYCH0xsczIR30bDO1#7Lw_pn%^My)NxedC%eWz_oA(dS z=I%N^KgCQ^uKi>>5n!T)CM{Z!qA+w^f`S^LxU!f58f13(+dMYfkln^jgLMNSe)0(0 zkI^c82a~0un6}-QdR#GA2P^rzO91pO`mF)=J07fdjHz*UP8~QMyV8-o&8YM2k-EZM z<%k5HThLheClppdz^*^`L=g5%nSUPr?}P3)=E4aVB~u>z57slfPyhS4;>H}*{@7== zXnXtifJfTOxj3JzZP^djFDE2|4svB)^O5w5QXNpF&qT}2^O0Pfv^r5pyBmB;b+5OT z2a|?FzBh5xv~(hom}?yS8dv@Q>ev!$Jb6s^9rIticgkzLRJ;f*>wbgz{#YUIBz(nB zsdyo?yIK7ypv#SZ&{S+%NcE_IB*IBkCHt_a7;@NRNAX zX6k7p$^#-A4ykg_?r<4;txc&_Cr|uev!M69RPW$ex)>#7`#Tpe3BDrTK`P$uRbK9g z2^0L6`ZY({CPpzm!pY08R@F3fXjWTv>+JBpQR`dNN~i73h|zw2Yr`Jlv0>W&Ap=^&-$gVrJ9Hn&KEzNfj@*>&1x2cYmr?6oz;`|_YhfFo zvhfs1)OEA^r(Mp<7j*md61Pvwi6y~cgPPZ~z7hv=sB{fZ-?`1tf~h^iFO@n8Y+Qwj zS#M??Oexzw_39V|H+^4NyB+UmR3fk2QeV1xWB;>JbO>K-$o1K043{|lC z(ejT)BO{j6XxDF^9|-oNKlT3T)q5S18ZEbg_D~?ND^^`F!H(|bIFbEG z3vAaIUlokrLv@+@A2u*JW)jW+e)q!>i&UIcUYFEHSPgPHX81i-NbwJ%-6Wz`G34Ks z8lv$=nT31@T)sv_h{BbN}qpXUTe4vOP zsDI6C`$#;ZMogjP!Adh8QQZ;S4U*v%F!)vqm2CMjZ$MLIGw=<;TH2@HktbxYizj<9 z{?!RV2)Vw>1)@gP*xX+;oj=^vM@Wmu|0@Mg9hL?wed=RkyD)G zSc8oh5bj&ae$rlu`}_^vX}@&*5({)SzY>Q2KfAa|Vq-+7vtrug3)~;qIp0aTwx#2C z#c>~*Eb;9?w>%aQ1&f;9i@LH-9XK*FujNN&7?ZGC$C=s3w>(+1!KQkWul}YR8zee| zfo5Eh{c6vriJA7BHR25`y($a=5b3a7ur1!RA=q`9XruoK6U=>WTwhbzPH=YB^^jQn51+LXj1Wem+N7t+r*naV-+nn=L zmVjI%<9YF_uBV~&T&{F3FNJ5*=Qx^9e(a)~;Qd!WLgCZu_)ecW5?^mx#xG=9vwrRQ zweNM=CWUm|RQVcKQ0iNBW)@SSbc~M5OApUJU@G&RC>9etS!VM=&4MKxSi5d*X{iJOiW(@n+nDr3hr;YQVs*P^nWZyoui{U-~;tHe1XEAsbmd%NRW>86P$tGs~; zUoZ2{U&sH9Gq=6H@h(p~QxaZJHpDZ@Uf(8reOKMqdDkZ0sFGk-c2AYso4UEZclk+# zrG8u`F}KTNUR&Mtkh;1Q7#Pz{-u+9sVIa7B<-W4*C;rvG+ctTcBBJV5Ot`+KEI0f5 zjgN=IY3+H(x zFJ3NSf{0dyjZ9^{+1EFPy}5O5U7=~Xw| z2tOg!gzM|T+RA*huWu8n2WHv7Z>u%0-LwBK18n;!-7bAS|M|S6C)XYqEO-eEC5I%I zoF&)R#lDrg26dw5KQ582nIE_R+;WHI+dIL^e~}ZL*zKr+?u)a(F;SR%l<+yuiI}6 zU6us1oqvEhDPFoW z=cnUU1;N`-s#d&X4+~s5zw0IMPt{$IWPr^xSi7om154DGs4oln_FRz{xw-Ii@AjN? zZ-TR*Z@$`}yHI2I@@X%RCw_JK)aRWvdygIW-eYD}zkdZye?$eo6M3o{BJnJb12cOc|!;5qD}5!-po|lHm}s;tSdq_kQF2Rz?lDf z)s%0Dh9HPF4>vIKqoSR)H@tX>OHUYKsU(AgduASPEb>Sz%-8TK7zTc;*2W z5)Wnq(_p%+Uoj&2fWq)Pa9ktyb>OXLl!Bx}4e0mC_RBHwa0WT&fGML;^r({|VG;wJ z=Nt`XNd6g37)beKG+`jhxzU6%nlJ`;Rq{_f^P0d8{Rk-;1|aZs^>bP0l+XkKog>Ma literal 0 HcmV?d00001 diff --git a/source/images/screenshots/snips_nlu.png b/source/images/screenshots/snips_nlu.png new file mode 100644 index 0000000000000000000000000000000000000000..b589f3f1cfcd1b8259ad4770b6189685aaad302b GIT binary patch literal 49459 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 JqLbDk{|~k_$NvBT literal 0 HcmV?d00001 diff --git a/source/images/supported_brands/snips.png b/source/images/supported_brands/snips.png new file mode 100644 index 0000000000000000000000000000000000000000..ec98a5f2a6fdddc2a9f132c10013d5ee75d918bc GIT binary patch literal 5583 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 P(Bi2oYABRGvv~VIt^cu( literal 0 HcmV?d00001 From cef16817cd766244ddda8575240402cb5d9c5fd1 Mon Sep 17 00:00:00 2001 From: Jeff Wilson Date: Sat, 1 Jul 2017 20:22:57 -0400 Subject: [PATCH 47/49] Insteon local fan (#2390) * Add fan to insteon_local full config * Add insteon_local fan page * Update 'ha_release' --- source/_components/fan.insteon_local.markdown | 34 +++++++++++++++++++ source/_components/insteon_local.markdown | 3 ++ 2 files changed, 37 insertions(+) create mode 100644 source/_components/fan.insteon_local.markdown diff --git a/source/_components/fan.insteon_local.markdown b/source/_components/fan.insteon_local.markdown new file mode 100644 index 00000000000..a1afd9d1a0d --- /dev/null +++ b/source/_components/fan.insteon_local.markdown @@ -0,0 +1,34 @@ +--- +layout: page +title: "Insteon (Local) Fan" +description: "Instructions how to setup the Insteon Hub Fans locally within Home Assistant." +date: 2017-04-06 11:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: fan +ha_version: 0.48 +--- + +The `insteon_local` fan component lets you control your fan connected to an [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. + +To integrate add a fan, configure your hub Insteon(local) with Home Assistant, add the following section to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml platform entry +insteon_local: + host: YOUR HUB IP + username: YOUR HUB USERNAME + password: YOUR HUB PASSWORD + timeout: 10 + port: 25105 +``` + +To add fans to your set-up, add the platform to your light configuration: +```yaml +fan: + - platform: insteon_local +``` + diff --git a/source/_components/insteon_local.markdown b/source/_components/insteon_local.markdown index 1b1343083a3..96a339f0f03 100644 --- a/source/_components/insteon_local.markdown +++ b/source/_components/insteon_local.markdown @@ -50,5 +50,8 @@ light: switch: - platform: insteon_local + +fan: + - platform: insteon_local ``` From be9debf763e9d3eb536f7134b692e055c2adf879 Mon Sep 17 00:00:00 2001 From: Yannick POLLART Date: Sun, 2 Jul 2017 02:23:45 +0200 Subject: [PATCH 48/49] rfxtrx binary sensor component documentation (#2336) * First draft of RFXtrx binary sensor doc page. * Updated rfxtrx binary sensor doc. * binary_sensors.rfxtrx: updated doc according to latest PR changes. * Updated rfxtrx binary sensor documentation * Update binary_sensor.rfxtrx.markdown Tried to clarify the data_bits description. * Updated device_class property. --- .../_components/binary_sensor.rfxtrx.markdown | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 source/_components/binary_sensor.rfxtrx.markdown diff --git a/source/_components/binary_sensor.rfxtrx.markdown b/source/_components/binary_sensor.rfxtrx.markdown new file mode 100644 index 00000000000..d2c2df56c8d --- /dev/null +++ b/source/_components/binary_sensor.rfxtrx.markdown @@ -0,0 +1,136 @@ +--- +layout: page +title: "RFXtrx Binary Sensor" +description: "Instructions how to integrate RFXtrx binary sensors into Home Assistant." +date: 2017-03-26 12:45 +sidebar: true +comments: false +sharing: true +footer: true +logo: rfxtrx.png +ha_category: Binary Sensor +--- + +The `rfxtrx` platform support binary sensors that communicate in the frequency range of 433.92 MHz. The rfxtrx binary sensor component provides support for them. + +Many cheap sensors available on the web today are based on a particular RF chip called *PT-2262*. Depending on the running firmware on the RFXcom box, some of them may be recognized under the X10 protocol but most of them are recognized under the *Lighting4* protocol. The rfxtrx binary sensor component provides some special options for them, while other rfxtrx protocols should work too. + +# Setting up your devices +Once you have set up your [rfxtrx hub](/components/rfxtrx/), the easiest way to find your binary sensors is to add this to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +binary_sensor: + platform: rfxtrx + automatic_add: True +``` + +Open your local home-assistant web UI and go to the "states" page. Then make sure to trigger your sensor. You should see a new entity appear in the *Current entites* list, starting with "binary_sensor." and some hexadecimal digits. Those hexadecimal digits are your device id. + +For example: "binary_sensor.0913000022670e013b70". Here your device id is `0913000022670e013b70`. Then you should update your configuration to: + +```yaml +# Example configuration.yaml entry +binary_sensor: + platform: rfxtrx + devices: + 0913000022670e013b70: + name: device_name +``` + +Do not forget to tweak the configuration variables: + +- **automatic_add** (*Optional*): To enable the automatic addition of new binary sensors. +- **device_class** (*Optional*): The [type or class of the sensor](/components/binary_sensor/) to set the icon in the frontend. +- **off_delay** (*Optional*): For sensors that only sends 'On' state updates, this variable sets a delay after which the sensor state will be updated back to 'Off'. + + +Binary sensors have only two states - "on" and "off". Many door or window opening sensors will send a signal each time the door/window is open or closed. However, depending on their hardware or on their purpose, some sensors are only able to signal their "on" state: + +- Most motion sensors send a signal each time they detect motion. They stay "on" for a few seconds and go back to sleep, ready to signal other motion events. Usually, they do not send a signal when they go back to sleep. +- Some doorbells may also only send "on" signals when their toggle switch is pressed, but no "off" signal when the switch is released. + +For those devices, use the *off_delay* parameter. It defines a delay after which a device will go back to an "Off" state. That "Off" state will be fired internally by Home Assistant, just as if the device fired it by itself. If a motion sensor can only send signals once every 5 seconds, sets the *off_delay* parameter to *seconds: 5*. + + +Example configuration: + +```yaml +# Example configuration.yaml entry +binary_sensor: + platform: rfxtrx + automatic_add: True + devices: + 091300006ca2c6001080: + name: motion_hall + device_class: motion + off_delay: + seconds: 5 +``` + +## Options for PT-2262 devices under the Lighting4 protocol + +When a data packet is transmitted by a PT-2262 device using the Lighting4 protocol, there is no way to automatically extract the device identifier and the command from the packet. Each device has its own id/command length combination and the fields lengths are not included in the data. One device that sends 2 different commands will be seen as 2 devices on Home Assistant. For sur cases, the following options are available in order to circumvent the problem: + +- **data_bits** (*Optional*): Defines how many bits are used for commands inside the data packets sent by the device. +- **command_on** (*Optional*): Defines the data bits value that is sent by the device upon an 'On' command. +- **command_off** (*Optional*): Defines the data bits value that is sent by the device upon an 'Off' command. + +Let's try to add a new PT-2262 sensor using the "automatic_add" option and have a look at Home Assistant system log. + +Have your sensor trigger the "On" state for the first time. Some messages will appear: + +``` +INFO (Thread-6) [homeassistant.components.binary_sensor.rfxtrx] Added binary sensor 0913000022670e013970 (Device_id: 22670e Class: LightingDevice Sub: 0) +``` + +Here the sensor has the id *22670e*. + +Now have your sensor trigger the "Off" state and look for the following message in the Home Assistant log. You should see that your device has been detected as a *new* device when triggering its "Off" state: + +``` +INFO (Thread-6) [homeassistant.components.binary_sensor.rfxtrx] Added binary sensor 09130000226707013d70 (Device_id: 226707 Class: LightingDevice Sub: 0) +``` + +Here the device id is *226707*, which is almost similar to the *22670e* we had on the "On" event a few seconds ago. + +From those two values, you can guess that the actual id of your device is *22670*, and that *e* and *7* are commands for "On" and "Off" states respectively. As one hexadecimal digit uses 4 bits, we can conclude that the device is using 4 data bits. + +So here is the actual configuration section for the binary sensor: + +```yaml +platform: rfxtrx +automatic_add: True +devices: + 0913000022670e013b70: + name: window_room2 + device_class: opening + data_bits: 4 + command_on: 0xe + command_off: 0x7 +``` + +The *automatic_add* option makes the rfxtrx binary sensor component calculate and display the configuration options for you in the Home Assistant logs: + +``` +INFO (Thread-6) [homeassistant.components.rfxtrx] rfxtrx: found possible device 226707 for 22670e with the following configuration: +data_bits=4 +command_on=0xe +command_off=0x7 +INFO (Thread-6) [homeassistant.components.binary_sensor.rfxtrx] Found possible matching deviceid 22670e. +``` + +This automatic guess should work most of the time but there is no guarantee on that. You should activate it only when you want +to configure your new devices and leave it off otherwise. + +## Known working devices + +The following devices are known to work with the rfxtrx binary sensor component. There are too many other to list. + +- Motion detectors: + - Kerui P817 and P829. + - Chuango PIR-700. + +- Door / window sensors: + - Kerui D026 door / window sensor: can trigger on "open" and "close". Has a temper switch. + - Nexa LMST-606 Magnetic contact switch. From 940e2b1b1ee4fbcfae3d14f5017ad636637ba392 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 1 Jul 2017 17:36:52 -0700 Subject: [PATCH 49/49] Release 0.48 blog post --- _config.yml | 2 +- .../binary_sensor.verisure.markdown | 15 + source/_components/comfoconnect.markdown | 55 ++ source/_components/fan.comfoconnect.markdown | 47 +- .../_components/media_player.denon.markdown | 48 +- .../media_player.denonavr.markdown | 67 +++ .../_components/sensor.comfoconnect.markdown | 17 + source/_components/shiftr.markdown | 2 +- source/_posts/2017-07-02-release-48.markdown | 513 ++++++++++++++++++ source/components/index.html | 2 +- .../images/blog/2017-07-0.48/components.png | Bin 0 -> 77663 bytes 11 files changed, 677 insertions(+), 91 deletions(-) create mode 100644 source/_components/binary_sensor.verisure.markdown create mode 100644 source/_components/comfoconnect.markdown create mode 100644 source/_components/media_player.denonavr.markdown create mode 100644 source/_components/sensor.comfoconnect.markdown create mode 100644 source/_posts/2017-07-02-release-48.markdown create mode 100644 source/images/blog/2017-07-0.48/components.png diff --git a/_config.yml b/_config.yml index bd0bda31b29..661d64ea5bd 100644 --- a/_config.yml +++ b/_config.yml @@ -144,7 +144,7 @@ social: current_major_version: 0 current_minor_version: 48 current_patch_version: 0 -date_released: 2017-07-01 +date_released: 2017-07-02 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_components/binary_sensor.verisure.markdown b/source/_components/binary_sensor.verisure.markdown new file mode 100644 index 00000000000..f6ecb7b3c9c --- /dev/null +++ b/source/_components/binary_sensor.verisure.markdown @@ -0,0 +1,15 @@ +--- +layout: page +title: "Verisure Binary Sensor" +description: "Instructions how to integrate Verisure binary sensors into Home Assistant." +date: 2016-02-23 21:31 +0100 +sidebar: true +comments: false +sharing: true +footer: true +logo: verisure.png +ha_category: Binary Sensor +ha_iot_class: "Cloud Polling" +--- + +Integrates Verisure binary sensors into Home Assistant. See the [main component](/components/verisure/) for configuration instructions. diff --git a/source/_components/comfoconnect.markdown b/source/_components/comfoconnect.markdown new file mode 100644 index 00000000000..fcce2b619f0 --- /dev/null +++ b/source/_components/comfoconnect.markdown @@ -0,0 +1,55 @@ +--- +layout: page +title: "Zehnder ComfoAir Q Ventilation" +description: "Instructions how to integrate Zehnder ComfoAir Q350/450/600 ventilation systems into Home Assistant." +date: 2017-06-28 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: zehnder.png +ha_category: Hub +ha_release: "0.48" +--- + +The `comfoconnect` component lets you control Zehnder ComfoAir [Q350](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q350-st)/[450](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q450-st)/[600](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q600-st) +ventilation units from Home Assistant. You need a [ComfoConnect LAN C](http://www.zehnder.co.uk/products-and-systems/comfortable-indoor-ventilation/ms-comfoair-q/ideal-control#node-21233) +bridge to connect the unit to your local network. + +There is an official iPhone and Android app to configure and control your unit. This platform connects with the help of +the unofficial [pycomfoconnect](https://github.com/michaelarnauts/comfoconnect) library. + +The component has a fan platform to view and control the ventilation speed, and a sensors platform to read out the outdoor temperature and humidity, the indoor temperature and humidity, and the extract and supply air flow (in m³ per hour). + +To set it up, add the following information to your `configuration.yaml` file: + +```yaml +comfoconnect: + host: 192.168.1.213 +``` + +Configuration variables: + +- **host** (*Required*): The ip or hostname of the ComfoConnect LAN C bridge. +- **name** (*Optional*): The name of this device as you want to see it in Home Assistant. +- **token** (*Optional*): The token you want to use when registering with the device. This is a random 32 char hexadecimal string. The default value is `00000000000000000000000000000001`. +- **user_agent** (*Optional*): The name you want to supply when registering with the device. The default value is `Home Assistant`. +- **pin** (*Optional*): The pin code to use when registering. This is `0000` by default. You only need to change this if you have changed the factory default pin. + +To register the sensors, add the following to your `configuration.yaml` file: + +```yaml +sensor: + - platform: comfoconnect + resources: + - current_temperature + - current_humidity + - outside_temperature + - outside_humidity + - air_flow_supply + - air_flow_exhaust +``` + +

+Note that it's not possible to have multiple connection to the bridge at the same time. This component will keep the connection open, and if you open the app, it will ask you to disconnect Home Assistant. If you close the app again, Home Assistant will reconnect automatically. +

diff --git a/source/_components/fan.comfoconnect.markdown b/source/_components/fan.comfoconnect.markdown index 3e1d338e6fa..d24d4eb1845 100644 --- a/source/_components/fan.comfoconnect.markdown +++ b/source/_components/fan.comfoconnect.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "Zehnder ComfoAir Q Ventilation" -description: "Instructions how to integrate Zehnder ComfoAir Q350/450/600 ventilation systems into Home Assistant." +title: "Zehnder ComfoAir Q Ventilation fans" +description: "Instructions how to integrate Zehnder ComfoAir Q350/450/600 fans into Home Assistant." date: 2017-06-28 18:00 sidebar: true comments: false @@ -12,45 +12,6 @@ ha_category: Fan ha_release: "0.48" --- -The `comfoconnect` component lets you control Zehnder ComfoAir [Q350](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q350-st)/[450](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q450-st)/[600](http://www.international.zehnder-systems.com/products-and-systems/comfosystems/zehnder-comfoair-q600-st) -ventilation units from Home Assistant. You need a [ComfoConnect LAN C](http://www.zehnder.co.uk/products-and-systems/comfortable-indoor-ventilation/ms-comfoair-q/ideal-control#node-21233) -bridge to connect the unit to your local network. +Please see the [main component] for information how to set it up. -There is an official iPhone and Android app to configure and control your unit. This platform connects with the help of -the unofficial [pycomfoconnect](https://github.com/michaelarnauts/comfoconnect) library. - -The component has a fan platform to view and control the ventilation speed, and a sensors platform to read out the outdoor temperature and humidity, the indoor temperature and humidity, and the extract and supply air flow (in m³ per hour). - -To set it up, add the following information to your `configuration.yaml` file: - -```yaml -climate: - - platform: comfoconnect - host: 192.168.1.213 -``` - -Configuration variables: - -- **host** (*Required*): The ip or hostname of the ComfoConnect LAN C bridge. -- **name** (*Optional*): The name of this device as you want to see it in Home Assistant. -- **token** (*Optional*): The token you want to use when registering with the device. This is a random 32 char hexadecimal string. The default value is `00000000000000000000000000000001`. -- **user_agent** (*Optional*): The name you want to supply when registering with the device. The default value is `Home Assistant`. -- **pin** (*Optional*): The pin code to use when registering. This is `0000` by default. You only need to change this if you have changed the factory default pin. - -To register the sensors, add the following to your `configuration.yaml` file: - -```yaml -sensor: - - platform: comfoconnect - resources: - - current_temperature - - current_humidity - - outside_temperature - - outside_humidity - - air_flow_supply - - air_flow_exhaust -``` - -

-Note that it's not possible to have multiple connection to the bridge at the same time. This component will keep the connection open, and if you open the app, it will ask you to disconnect Home Assistant. If you close the app again, Home Assistant will reconnect automatically. -

+[main component]: /components/comfoconnect/ diff --git a/source/_components/media_player.denon.markdown b/source/_components/media_player.denon.markdown index f6c4ec6ac4c..b8c0e380133 100644 --- a/source/_components/media_player.denon.markdown +++ b/source/_components/media_player.denon.markdown @@ -13,8 +13,7 @@ ha_iot_class: "Local Polling" ha_release: 0.7.2 --- - -The `denon` platform allows you to control a [Denon Network Receivers](http://www.denon.co.uk/chg/product/compactsystems/networkmusicsystems/ceolpiccolo) from Home Assistant. +The `denon` platform allows you to control a [Denon Network Receivers](http://www.denon.co.uk/chg/product/compactsystems/networkmusicsystems/ceolpiccolo) from Home Assistant. It might be that your device is supported by the [Denon AVR] platform. Supported devices: @@ -22,22 +21,6 @@ Supported devices: - Denon RCD-N8 (untested) - Denon RCD-N9 (partial support) - Denon AVR receivers with integrated Network support (partial support) -- Denon AVR-X2000 (via denonavr platform) -- Denon AVR-X2100W (via denonavr platform) -- Denon AVR-X4100W (via denonavr platform) -- Denon AVR-1912 (via denonavr platform) -- Denon AVR-2312CI (via denonavr platform) -- Denon AVR-3311CI (via denonavr platform) -- Marantz M-CR603 (via denonavr platform) -- Marantz M-RC610 (via denonavr platform) -- Marantz SR5008 (via denonavr platform) -- Marantz NR1604 (via denonavr platform) -- Other Denon AVR receivers (via denonavr platform (untested)) -- Marantz receivers (experimental via denonavr platform) - -
-If you have something else using the IP controller for your Denon AVR 3808CI, such as your URC controller, it will not work! There is either a bug or security issue with some models where only one device could be controlling the IP functionality.
-
To add a Denon Network Receiver to your installation, add the following to your `configuration.yaml` file: @@ -55,36 +38,11 @@ Configuration variables: - **name** (*Optional*): Name of the device. A few notes for platform: denon + - The receiver handles only one telnet connection and refuses others. - Be careful with the volume. 100% or even 50% is very loud. - To be able to wake up the receiver, activate the "remote" setting in the receiver's settings. - Play and pause are supported, toggling is not possible. - Seeking cannot be implemented as the UI sends absolute positions. Only seeking via simulated button presses is possible. - -**denonavr platform** -```yaml -# Example configuration.yaml entry -media_player: - - platform: denonavr - host: IP_ADDRESS - name: NAME - show_all_sources: True / False - zones: - - zone: Zone2 / Zone3 - name: NAME -``` - -Configuration variables: - -- **host** (*Optional*): IP address of the device. Example: 192.168.1.32. If not set, auto discovery is used. -- **name** (*Optional*): Name of the device. If not set, friendlyName of receiver is used. -- **show_all_sources** (*Optional*): If True all sources are displayed in sources list even if they are marked as deleted in the receiver. If False deleted sources are not displayed (default). Some receivers have a bug that marks all sources as deleted in the interface. In this case this option could help. -- **zones** (*Optional*): List of additional zones to be activated. They are displayed as additional media players with the same functionality Main Zone of the device supports - - **zone**: Zone which should be activated. Valid options are Zone2 and Zone3 - - **name** (*Optional*): Name of the zone. If not set the name of the main device + zone as suffix is taken. - -A few notes for platform: denonavr -- Additional option the control Denon AVR receivers with a builtin web server is using the HTTP interface with denonavr platform. -- denonavr platform supports some additional functionalities like album covers, custom input source names and auto discovery. -- Marantz receivers seem to a have quite simliar interface. Thus if you own one, give it a try. +[Denon AVR]: /components/media_player.denonavr/ diff --git a/source/_components/media_player.denonavr.markdown b/source/_components/media_player.denonavr.markdown new file mode 100644 index 00000000000..e88156d613f --- /dev/null +++ b/source/_components/media_player.denonavr.markdown @@ -0,0 +1,67 @@ +--- +layout: page +title: "Denon AVR Network Receivers" +description: "Instructions how to integrate Denon AVR Network Receivers into Home Assistant." +date: 2015-09-08 09:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: denon.png +ha_category: Media Player +ha_iot_class: "Local Polling" +ha_release: 0.7.2 +--- + + +The `denonavr` platform allows you to control a [Denon Network Receivers](http://www.denon.co.uk/chg/product/compactsystems/networkmusicsystems/ceolpiccolo) from Home Assistant. It might be that your device is supported by the [Denon] platform. + +Supported devices: + +- Denon AVR-X2000 +- Denon AVR-X2100W +- Denon AVR-X4100W +- Denon AVR-1912 +- Denon AVR-2312CI +- Denon AVR-3311CI +- Marantz M-CR603 +- Marantz M-RC610 +- Marantz SR5008 +- Marantz NR1604 +- Other Denon AVR receivers (untested) +- Marantz receivers (experimental) + +
+If you have something else using the IP controller for your Denon AVR 3808CI, such as your URC controller, it will not work! There is either a bug or security issue with some models where only one device could be controlling the IP functionality.
+
+ +To add a Denon Network Receiver to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +media_player: + - platform: denonavr + host: IP_ADDRESS + name: NAME + show_all_sources: True / False + zones: + - zone: Zone2 / Zone3 + name: NAME +``` + +Configuration variables: + +- **host** (*Optional*): IP address of the device. Example: 192.168.1.32. If not set, auto discovery is used. +- **name** (*Optional*): Name of the device. If not set, friendlyName of receiver is used. +- **show_all_sources** (*Optional*): If True all sources are displayed in sources list even if they are marked as deleted in the receiver. If False deleted sources are not displayed (default). Some receivers have a bug that marks all sources as deleted in the interface. In this case this option could help. +- **zones** (*Optional*): List of additional zones to be activated. They are displayed as additional media players with the same functionality Main Zone of the device supports + - **zone**: Zone which should be activated. Valid options are Zone2 and Zone3 + - **name** (*Optional*): Name of the zone. If not set the name of the main device + zone as suffix is taken. + +A few notes: + +- Additional option the control Denon AVR receivers with a builtin web server is using the HTTP interface with denonavr platform. +- denonavr platform supports some additional functionalities like album covers, custom input source names and auto discovery. +- Marantz receivers seem to a have quite simliar interface. Thus if you own one, give it a try. + +[Denon]: /components/media_player.denon/ diff --git a/source/_components/sensor.comfoconnect.markdown b/source/_components/sensor.comfoconnect.markdown new file mode 100644 index 00000000000..78d22454b9b --- /dev/null +++ b/source/_components/sensor.comfoconnect.markdown @@ -0,0 +1,17 @@ +--- +layout: page +title: "Zehnder ComfoAir Q Ventilation sensors" +description: "Instructions how to integrate Zehnder ComfoAir Q350/450/600 sensors into Home Assistant." +date: 2017-06-28 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: zehnder.png +ha_category: Sensor +ha_release: "0.48" +--- + +Please see the [main component] for information how to set it up. + +[main component]: /components/comfoconnect/ diff --git a/source/_components/shiftr.markdown b/source/_components/shiftr.markdown index e022cd1a7b9..16ae6a53f05 100644 --- a/source/_components/shiftr.markdown +++ b/source/_components/shiftr.markdown @@ -2,7 +2,7 @@ layout: page title: "Shiftr.io" description: "Transfer events to Shiftr.io." -date: 2017-07-16 07:00 +date: 2017-06-16 07:00 sidebar: true comments: false sharing: true diff --git a/source/_posts/2017-07-02-release-48.markdown b/source/_posts/2017-07-02-release-48.markdown new file mode 100644 index 00000000000..bed118848cd --- /dev/null +++ b/source/_posts/2017-07-02-release-48.markdown @@ -0,0 +1,513 @@ +--- +layout: post +title: "0.48: Snips.ai, Shiftr.io and a massive History query speed up" +description: "Build your own local voice assistant with the new Snips.ai component, visualize your data with Shiftr.io and enjoy faster history browsing." +date: 2017-07-02 00:02:05 +0000 +date_formatted: "July 2, 2017" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2017-07-0.48/components.png +--- + + + +It's time for a great new release! + +We've started the process of upgrading our frontend technology. If you notice something not working that did work before, please open [an issue][issue-polymer]. + +[Pascal][@pvizeli] has added a new option to Home Assistant core to set a list of whitelisted folders that Home Assistant can read from. When a component allows to send files (like Telegram), it will only be allowed to send files from those directories. The only default whitelisted folder is the public `/www` directory. + +Z-Wave will, as announced in the [last release](/blog/2017/06/17/release-47/), be defaulting to generate the new entity ids. More info in the [blog post](/blog/2017/06/15/zwave-entity-ids/). You can still opt-in for the old style. + +```yaml +zwave: + new_entity_ids: false +``` + +## Big speed up in querying the history + +Thanks to the work by [@cmsimike] in [#8255] you'll see a significant speed up when using the history view. In his local tests queries went from 1 minute to 90ms! ⚡️ + +## Snips.ai component + +Snips has contributed a component to integrate with their Snips.ai local voice assistant. This will allow you to hook a speaker and a microphone into your Raspberry Pi and make your own local Amazon Echo quickly. See [the docs][snips docs] for further instructions. + +Also a shoutout to [@michaelarnauts] for keeping an eye on our Docker build and once again reducing the file size 👍 + +[issue-polymer]: https://github.com/home-assistant/home-assistant-polymer/issues + +## New Platforms + +- Add initial support for Shiftr.io ([@fabaff] - [#7974]) ([shiftr docs]) (new-platform) +- Upnp properties ([@dgomes] - [#8067]) ([upnp docs]) ([sensor.upnp docs]) (new-platform) +- Add support for Insteon FanLinc fan ([@jawilson] - [#6959]) ([insteon_local docs]) ([fan.insteon_local docs]) (new-platform) +- add knx cover support ([@tiktok7] - [#7997]) ([knx docs]) ([cover.knx docs]) (new-platform) +- Add I2c BME280 temperature, humidity and pressure sensor for Raspberry Pi ([@azogue] - [#7989]) ([sensor.bme280 docs]) (new-platform) +- Add I2c HTU21D temperature and humidity sensor for Raspberry Pi ([@azogue] - [#8049]) ([sensor.htu21d docs]) (new-platform) +- Add new BH1750 light level sensor ([@azogue] - [#8050]) ([sensor.bh1750 docs]) (new-platform) +- Rfxtrx binary sensor ([@ypollart] - [#6794]) ([rfxtrx docs]) ([binary_sensor.rfxtrx docs]) (new-platform) +- Add ClickSend notify service. ([@omarusman] - [#8135]) ([notify.clicksend docs]) (new-platform) +- Add device tracker for Linksys Smart Wifi devices ([@mortenlj] - [#8144]) ([device_tracker.linksys_smart docs]) (new-platform) +- Openhardwaremonitor ([@depl0y] - [#8056]) ([sensor.openhardwaremonitor docs]) (new-platform) +- WIP: Verisure app api ([@persandstrom] - [#7394]) ([verisure docs]) ([alarm_control_panel.verisure docs]) ([binary_sensor.verisure docs]) ([sensor.verisure docs]) ([switch.verisure docs]) (new-platform) +- telegram_bot platform to only send messages ([@azogue] - [#8186]) (new-platform) +- Comfoconnect fan component ([@michaelarnauts] - [#8073]) ([comfoconnect docs]) ([fan.comfoconnect docs]) ([sensor.comfoconnect docs]) (new-platform) +- Implement templates for covers ([@PhracturedBlue] - [#8100]) ([cover.template docs]) (new-platform) +- Snips ASR and NLU component ([@michaelfester] - [#8156]) ([snips 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][gitter]. 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 + +- We have added a new option to whitelist folders that can be used as sources for sending files. You will need to use this option if you are using files with the telegram component. ([@pvizeli] - [#8189]) (breaking change) + +```yaml +homeassistant: + whitelist_external_dirs: + - /tmp + - /home/kenji/data +``` + +- Vera battery levels will no longer have the percent sign appended ([@philhawthorne] - [#8069]) ([vera docs]) (breaking change) +- Notify - SMTP: Added SMTP SSL/TLS support so now you should specify which encryption to use. ([@sn0oz] - [#7960]) ([notify.smtp docs]) (breaking change) + +``` +notify: + - name: mail + platform: smtp + server: !secret smtp_server + sender: !secret mail_alert + username: !secret mail_username + password: !secret mail_password + recipient: !secret mail_admin + encryption: tls # Or starttls, none +``` + +- Light - LIFX: The `lifx_effect_breathe` call was deprecated in version 0.47 and has now been removed. You can use `lifx_effect_pulse` with `mode: breathe` for the same effect. ([@amelchio] - [#8222]) ([light.lifx docs]) (breaking change) +- LimitlessLED: No longer automatically fades the lights when turning the light off. Can be restored with a new config option. ([@SmilyOrg] - [#7369]) ([light.limitlessled docs]) (breaking change) + +```yaml +light: + platform: limitlessled + bridges: + + - host: !secret limitless_v6_ip + port: 5987 + version: 6 + groups: + + - number: 1 + type: rgbww + name: Safari Glow + fade: none +``` + +## All changes + +- Update numpy 1.13.0 ([@pvizeli] - [#8059]) ([image_processing.opencv docs]) +- No update in MQTT Binary Sensor #7478 ([@pezinek] - [#8057]) +- Use standard entity_ids for zwave entities ([@armills] - [#7786]) ([zwave docs]) ([light.zwave docs]) (breaking change) +- Fix some warnings found by quantifiedcode ([@andrey-git] - [#8027]) ([insteon_hub docs]) ([tellduslive docs]) ([calendar.google docs]) +- Always enable monkey patch ([@balloob] - [#8054]) +- Remove % sign from Vera Battery Levels ([@philhawthorne] - [#8069]) ([vera docs]) (breaking change) +- Allow config of latitude and longitude ([@jshore1296] - [#8068]) ([sensor.wunderground docs]) +- Failed to parse response from WU API: 'record' (and 'recordyear') #7747 ([@pezinek] - [#8058]) ([sensor.wunderground docs]) +- Add initial support for Shiftr.io ([@fabaff] - [#7974]) ([shiftr docs]) (new-platform) +- Add option to set language of openweathermap sensor, and handle updating errors ([@azogue] - [#8046]) ([sensor.openweathermap docs]) +- Bump pyEmby version to account for API changes ([@mezz64] - [#8070]) ([media_player.emby docs]) +- bump ups ([@happyleavesaoc] - [#8075]) ([sensor.ups docs]) +- bump usps version ([@happyleavesaoc] - [#8074]) ([sensor.usps docs]) +- Add to zwave services descriptions ([@andrey-git] - [#8072]) +- Fix attribute entity ([@pvizeli] - [#8066]) (breaking change) +- Added 'all_plants' group and support for plant groups state. ([@aronsky] - [#8063]) ([group docs]) ([plant docs]) +- Fix EntityComponent handle entities without a name ([@balloob] - [#8065]) +- Update pyunifi component to use APIError passed from pyunifi 2.13. Better accommodate login failures with wrapper in pyunifi 2.13. ([@finish06] - [#7899]) ([device_tracker.unifi docs]) +- Stopping the logfile spam by piping STDERR to /dev/null ([@madpilot] - [#8081]) ([switch.wake_on_lan docs]) +- mpd: implement support for seek, shuffle, and clear playlist ([@auchter] - [#8090]) ([media_player.mpd docs]) +- Cleanup .coveragerc ([@michaelarnauts] - [#8088]) +- update pywebpush to 1.0.5 ([@perosb] - [#8084]) ([notify.html5 docs]) +- media player Kodi: handle TransportError exceptions when calling JSONRPC API methods ([@azogue] - [#8047]) ([media_player.kodi docs]) +- Upnp properties ([@dgomes] - [#8067]) ([upnp docs]) ([sensor.upnp docs]) (new-platform) +- Add support for Insteon FanLinc fan ([@jawilson] - [#6959]) ([insteon_local docs]) ([fan.insteon_local docs]) (new-platform) +- add knx cover support ([@tiktok7] - [#7997]) ([knx docs]) ([cover.knx docs]) (new-platform) +- More updates to zwave services.yaml file ([@andrey-git] - [#8083]) +- Fix lights issue #8098 ([@tsvi] - [#8101]) ([light.vera docs]) +- increase timeout for setWebhook to 10s ([@azogue] - [#8102]) ([telegram_bot.webhooks docs]) +- Added SMTP SSL/TLS support ([@sn0oz] - [#7960]) ([notify.smtp docs]) (breaking change) +- Fix Dyson async_add_job ([@CharlesBlonde] - [#8113]) ([fan.dyson docs]) ([sensor.dyson docs]) +- Update InfluxDB to handle datetime objects and multiple decimal points ([@philhawthorne] - [#8080]) ([influxdb docs]) +- Remove config details (see docs) ([@fabaff] - [#8119]) ([cover.knx docs]) +- Only mark active DHCP clients as present ([@cyberplant] - [#8110]) ([device_tracker.mikrotik docs]) +- Add option to specify the location of the API (fixes #8115) ([@fabaff] - [#8118]) ([sensor.pi_hole docs]) +- Fixed iTach command parsing with empty data ([@alanfischer] - [#8104]) ([remote.itach docs]) +- Upgrade mutagen to 1.38 ([@fabaff] - [#8126]) ([tts docs]) +- Upgrade paho-mqtt to 1.3.0 ([@fabaff] - [#8125]) ([mqtt docs]) ([shiftr docs]) +- Upgrade sqlalchemy to 1.1.11 ([@fabaff] - [#8124]) ([recorder docs]) +- Upgrade aiohttp to 2.2.0 ([@fabaff] - [#8121]) +- Upgrade RestrictedPython dependency ([@balloob] - [#8132]) ([python_script docs]) +- Added RFXTRX UV badge ([@lunar-consultancy] - [#8129]) ([rfxtrx docs]) +- Do not call update() in constructor ([@fabaff] - [#8120]) ([sensor.netdata docs]) +- Change Error Message when Turning off ISY994 Light ([@SConaway] - [#8131]) ([light.isy994 docs]) +- Allow iteration in python_script ([@balloob] - [#8134]) ([python_script docs]) +- Add current balance to hydroquebec sensor ([@titilambert] - [#8138]) ([sensor.hydroquebec docs]) +- Decora light: Fix brightness level in UI ([@titilambert] - [#8139]) ([light.decora docs]) +- Add I2c BME280 temperature, humidity and pressure sensor for Raspberry Pi ([@azogue] - [#7989]) ([sensor.bme280 docs]) (new-platform) +- Upgrade libsoundtouch to prevent Python3.6 errors with enum. #7733 #8103 ([@CharlesBlonde] - [#8143]) ([media_player.soundtouch docs]) +- Adds CPU temp monitoring, and allow startup when endpoint is not yet available. ([@jjmontestl] - [#8093]) ([sensor.glances docs]) +- Add I2c HTU21D temperature and humidity sensor for Raspberry Pi ([@azogue] - [#8049]) ([sensor.htu21d docs]) (new-platform) +- Add new BH1750 light level sensor ([@azogue] - [#8050]) ([sensor.bh1750 docs]) (new-platform) +- LimitlessLED: Configurable fade-out behavior ([@SmilyOrg] - [#7369]) ([light.limitlessled docs]) (breaking change) +- Harmony auto discovery via netdisco ([@tony2nite] - [#7741]) ([remote.harmony docs]) +- Rfxtrx binary sensor ([@ypollart] - [#6794]) ([rfxtrx docs]) ([binary_sensor.rfxtrx docs]) (new-platform) +- Add support of Zone2 and Zone3 ([@scarface-4711] - [#8025]) ([media_player.denonavr docs]) +- Upgrade python-telegram-bot to 6.1.0 ([@fabaff] - [#8151]) ([telegram_bot docs]) +- Upgrade libsoundtouch to 0.6.2 ([@fabaff] - [#8149]) ([media_player.soundtouch docs]) +- Switch rachiopy to pypi ([@andrey-git] - [#8040]) ([switch.rachio docs]) +- ubus: Refresh session on Access denied ([@glance-] - [#8111]) +- Added invert flag for position for actuators that uses 100% for fully closed position ([@open-homeautomation] - [#8147]) +- add telegram_bot service: delete_message ([@azogue] - [#8153]) ([telegram_bot docs]) +- Fixed rfxtrx binary_sensor off command ([@basschipper] - [#8160]) ([rfxtrx docs]) ([binary_sensor.rfxtrx docs]) +- Use version 1.3 of radiotherm ([@twilde] - [#8164]) ([climate.radiotherm docs]) +- Tado climate device ([@wmalgadey] - [#8041]) ([tado docs]) ([climate.tado docs]) +- Add ClickSend notify service. ([@omarusman] - [#8135]) ([notify.clicksend docs]) (new-platform) +- Add libboost-python1.62-dev (fixes #7851) ([@fabaff] - [#7868]) +- Uninstall enum34 in python3.6 docker image ([@jeanregisser] - [#8103]) +- Revert "Add libboost-python1.62-dev (fixes #7851)" ([@balloob] - [#8182]) +- Add device tracker for Linksys Smart Wifi devices ([@mortenlj] - [#8144]) ([device_tracker.linksys_smart docs]) (new-platform) +- Update buienradar.py ([@lrmate] - [#8173]) ([sensor.buienradar docs]) +- Fix radiotherm model CT50 ([@tubaman] - [#8181]) ([climate.radiotherm docs]) +- Throw exception if _convert_for_display called on non Number ([@sdague] - [#8178]) ([climate docs]) ([climate.mysensors docs]) +- Added buienradar precipitation forecast average & total sensors ([@basschipper] - [#8171]) ([sensor.buienradar docs]) ([weather.buienradar docs]) +- Axis service vapix call ([@Kane610] - [#7794]) ([axis docs]) ([camera.axis docs]) +- added optional node_id to MQTT discovery ([@AlexMekkering] - [#8096]) +- Add offset option to sensor.gtfs ([@Kernald] - [#7980]) +- Switch to new zwave entity ids by default ([@armills] - [#8192]) ([zwave docs]) +- Pushed to version 0.5.1 of the library ([@scarface-4711] - [#8190]) ([media_player.denonavr docs]) +- Fix MySensors climate ([@balloob] - [#8193]) ([climate.mysensors docs]) +- Fix plants calling async methods from sync context ([@balloob] - [#8200]) +- Split mock_service ([@balloob] - [#8198]) +- add option to set content_type in camera.generic to support 'svg cameras' ([@azogue] - [#8188]) +- Remove unnecessary thread_ident assignment ([@armills] - [#8194]) +- Openhardwaremonitor ([@depl0y] - [#8056]) ([sensor.openhardwaremonitor docs]) (new-platform) +- Add security layer to send file output things ([@pvizeli] - [#8189]) (breaking change) +- Fix Plex component to use port number in discovery. ([@voltagex] - [#8197]) ([media_player.plex docs]) +- EntityComponent to retry platforms that are not ready yet ([@balloob] - [#8209]) +- WIP: Verisure app api ([@persandstrom] - [#7394]) ([verisure docs]) ([alarm_control_panel.verisure docs]) ([binary_sensor.verisure docs]) ([sensor.verisure docs]) ([switch.verisure docs]) (new-platform) +- guess the content_type in local_file cameras ([@azogue] - [#8217]) ([camera.local_file docs]) +- Improve executor pool size / speedup python 3.5 ([@pvizeli] - [#8215]) +- LIFX: Move light effects to external library ([@amelchio] - [#8222]) ([light.lifx docs]) (breaking change) +- Fixed mqtt subscription filter on sys $ topics ([@natemason] - [#8166]) ([mqtt docs]) +- telegram_bot platform to only send messages ([@azogue] - [#8186]) (new-platform) +- add percentage (DPT_Scaling) KNX sensors ([@tiktok7] - [#8168]) ([sensor.knx docs]) +- Fix homeassistant.start trigger ([@azogue] - [#8220]) +- Cleanup automations yaml ([@balloob] - [#8223]) +- Do not call update() in constructor ([@fabaff] - [#8148]) ([sensor.glances docs]) +- KNX Cover tilt control ([@open-homeautomation] - [#8159]) ([cover.knx docs]) +- Comfoconnect fan component ([@michaelarnauts] - [#8073]) ([comfoconnect docs]) ([fan.comfoconnect docs]) ([sensor.comfoconnect docs]) (new-platform) +- Upgrade python-digitalocean to 1.12 ([@fabaff] - [#8241]) ([digital_ocean docs]) +- update i2csense requirement ([@azogue] - [#8242]) ([sensor.bh1750 docs]) ([sensor.bme280 docs]) ([sensor.htu21d docs]) +- Update docstrings ([@fabaff] - [#8244]) ([comfoconnect docs]) ([fan.comfoconnect docs]) +- Do not call update() in constructor ([@fabaff] - [#8247]) ([binary_sensor.arest docs]) ([sensor.arest docs]) +- better logging to debug when a message is not sent ([@azogue] - [#8248]) ([telegram_bot docs]) +- LIFX: Small code cleanups ([@amelchio] - [#8228]) ([light.lifx docs]) +- Use 'hass.data' instead of global ([@fabaff] - [#8245]) ([digital_ocean docs]) ([binary_sensor.digital_ocean docs]) ([switch.digital_ocean docs]) +- Use constant and update ordering ([@fabaff] - [#8246]) ([arlo docs]) ([camera.arlo docs]) +- Add PlatformNotReady support for Sensibo ([@andrey-git] - [#8252]) ([climate.sensibo docs]) +- verisure component names ([@persandstrom] - [#8251]) ([binary_sensor.verisure docs]) ([camera.verisure docs]) ([lock.verisure docs]) ([switch.verisure docs]) +- further document add_node_secure ([@kentcalero] - [#8229]) +- Upgrade libnacl to 1.5.1 ([@fabaff] - [#8259]) ([device_tracker.owntracks docs]) +- Docker cleanup. ([@michaelarnauts] - [#8226]) +- Implement templates for covers ([@PhracturedBlue] - [#8100]) ([cover.template docs]) (new-platform) +- Adding done_message to alert ([@karlw00t] - [#8116]) ([alert docs]) +- Camera services arm disarm including Netgear Arlo ([@viswa-swami] - [#7961]) ([camera.arlo docs]) +- Update modbus.py ([@lrmate] - [#8256]) ([binary_sensor.modbus docs]) +- components.knx - KNXMultiAddressDevice corrections ([@tiktok7] - [#8275]) ([knx docs]) +- Snips ASR and NLU component ([@michaelfester] - [#8156]) ([snips docs]) (new-platform) +- Create an index on the states table to help hass startup time ([@cmsimike] - [#8255]) + +[#6794]: https://github.com/home-assistant/home-assistant/pull/6794 +[#6959]: https://github.com/home-assistant/home-assistant/pull/6959 +[#7369]: https://github.com/home-assistant/home-assistant/pull/7369 +[#7394]: https://github.com/home-assistant/home-assistant/pull/7394 +[#7741]: https://github.com/home-assistant/home-assistant/pull/7741 +[#7786]: https://github.com/home-assistant/home-assistant/pull/7786 +[#7794]: https://github.com/home-assistant/home-assistant/pull/7794 +[#7868]: https://github.com/home-assistant/home-assistant/pull/7868 +[#7899]: https://github.com/home-assistant/home-assistant/pull/7899 +[#7960]: https://github.com/home-assistant/home-assistant/pull/7960 +[#7961]: https://github.com/home-assistant/home-assistant/pull/7961 +[#7974]: https://github.com/home-assistant/home-assistant/pull/7974 +[#7980]: https://github.com/home-assistant/home-assistant/pull/7980 +[#7989]: https://github.com/home-assistant/home-assistant/pull/7989 +[#7997]: https://github.com/home-assistant/home-assistant/pull/7997 +[#8025]: https://github.com/home-assistant/home-assistant/pull/8025 +[#8027]: https://github.com/home-assistant/home-assistant/pull/8027 +[#8040]: https://github.com/home-assistant/home-assistant/pull/8040 +[#8041]: https://github.com/home-assistant/home-assistant/pull/8041 +[#8046]: https://github.com/home-assistant/home-assistant/pull/8046 +[#8047]: https://github.com/home-assistant/home-assistant/pull/8047 +[#8049]: https://github.com/home-assistant/home-assistant/pull/8049 +[#8050]: https://github.com/home-assistant/home-assistant/pull/8050 +[#8054]: https://github.com/home-assistant/home-assistant/pull/8054 +[#8056]: https://github.com/home-assistant/home-assistant/pull/8056 +[#8057]: https://github.com/home-assistant/home-assistant/pull/8057 +[#8058]: https://github.com/home-assistant/home-assistant/pull/8058 +[#8059]: https://github.com/home-assistant/home-assistant/pull/8059 +[#8063]: https://github.com/home-assistant/home-assistant/pull/8063 +[#8065]: https://github.com/home-assistant/home-assistant/pull/8065 +[#8066]: https://github.com/home-assistant/home-assistant/pull/8066 +[#8067]: https://github.com/home-assistant/home-assistant/pull/8067 +[#8068]: https://github.com/home-assistant/home-assistant/pull/8068 +[#8069]: https://github.com/home-assistant/home-assistant/pull/8069 +[#8070]: https://github.com/home-assistant/home-assistant/pull/8070 +[#8072]: https://github.com/home-assistant/home-assistant/pull/8072 +[#8073]: https://github.com/home-assistant/home-assistant/pull/8073 +[#8074]: https://github.com/home-assistant/home-assistant/pull/8074 +[#8075]: https://github.com/home-assistant/home-assistant/pull/8075 +[#8080]: https://github.com/home-assistant/home-assistant/pull/8080 +[#8081]: https://github.com/home-assistant/home-assistant/pull/8081 +[#8083]: https://github.com/home-assistant/home-assistant/pull/8083 +[#8084]: https://github.com/home-assistant/home-assistant/pull/8084 +[#8088]: https://github.com/home-assistant/home-assistant/pull/8088 +[#8090]: https://github.com/home-assistant/home-assistant/pull/8090 +[#8093]: https://github.com/home-assistant/home-assistant/pull/8093 +[#8096]: https://github.com/home-assistant/home-assistant/pull/8096 +[#8100]: https://github.com/home-assistant/home-assistant/pull/8100 +[#8101]: https://github.com/home-assistant/home-assistant/pull/8101 +[#8102]: https://github.com/home-assistant/home-assistant/pull/8102 +[#8103]: https://github.com/home-assistant/home-assistant/pull/8103 +[#8104]: https://github.com/home-assistant/home-assistant/pull/8104 +[#8110]: https://github.com/home-assistant/home-assistant/pull/8110 +[#8111]: https://github.com/home-assistant/home-assistant/pull/8111 +[#8113]: https://github.com/home-assistant/home-assistant/pull/8113 +[#8116]: https://github.com/home-assistant/home-assistant/pull/8116 +[#8118]: https://github.com/home-assistant/home-assistant/pull/8118 +[#8119]: https://github.com/home-assistant/home-assistant/pull/8119 +[#8120]: https://github.com/home-assistant/home-assistant/pull/8120 +[#8121]: https://github.com/home-assistant/home-assistant/pull/8121 +[#8124]: https://github.com/home-assistant/home-assistant/pull/8124 +[#8125]: https://github.com/home-assistant/home-assistant/pull/8125 +[#8126]: https://github.com/home-assistant/home-assistant/pull/8126 +[#8129]: https://github.com/home-assistant/home-assistant/pull/8129 +[#8131]: https://github.com/home-assistant/home-assistant/pull/8131 +[#8132]: https://github.com/home-assistant/home-assistant/pull/8132 +[#8134]: https://github.com/home-assistant/home-assistant/pull/8134 +[#8135]: https://github.com/home-assistant/home-assistant/pull/8135 +[#8138]: https://github.com/home-assistant/home-assistant/pull/8138 +[#8139]: https://github.com/home-assistant/home-assistant/pull/8139 +[#8143]: https://github.com/home-assistant/home-assistant/pull/8143 +[#8144]: https://github.com/home-assistant/home-assistant/pull/8144 +[#8147]: https://github.com/home-assistant/home-assistant/pull/8147 +[#8148]: https://github.com/home-assistant/home-assistant/pull/8148 +[#8149]: https://github.com/home-assistant/home-assistant/pull/8149 +[#8151]: https://github.com/home-assistant/home-assistant/pull/8151 +[#8153]: https://github.com/home-assistant/home-assistant/pull/8153 +[#8156]: https://github.com/home-assistant/home-assistant/pull/8156 +[#8159]: https://github.com/home-assistant/home-assistant/pull/8159 +[#8160]: https://github.com/home-assistant/home-assistant/pull/8160 +[#8164]: https://github.com/home-assistant/home-assistant/pull/8164 +[#8166]: https://github.com/home-assistant/home-assistant/pull/8166 +[#8168]: https://github.com/home-assistant/home-assistant/pull/8168 +[#8171]: https://github.com/home-assistant/home-assistant/pull/8171 +[#8173]: https://github.com/home-assistant/home-assistant/pull/8173 +[#8178]: https://github.com/home-assistant/home-assistant/pull/8178 +[#8181]: https://github.com/home-assistant/home-assistant/pull/8181 +[#8182]: https://github.com/home-assistant/home-assistant/pull/8182 +[#8186]: https://github.com/home-assistant/home-assistant/pull/8186 +[#8188]: https://github.com/home-assistant/home-assistant/pull/8188 +[#8189]: https://github.com/home-assistant/home-assistant/pull/8189 +[#8190]: https://github.com/home-assistant/home-assistant/pull/8190 +[#8192]: https://github.com/home-assistant/home-assistant/pull/8192 +[#8193]: https://github.com/home-assistant/home-assistant/pull/8193 +[#8194]: https://github.com/home-assistant/home-assistant/pull/8194 +[#8197]: https://github.com/home-assistant/home-assistant/pull/8197 +[#8198]: https://github.com/home-assistant/home-assistant/pull/8198 +[#8200]: https://github.com/home-assistant/home-assistant/pull/8200 +[#8209]: https://github.com/home-assistant/home-assistant/pull/8209 +[#8215]: https://github.com/home-assistant/home-assistant/pull/8215 +[#8217]: https://github.com/home-assistant/home-assistant/pull/8217 +[#8220]: https://github.com/home-assistant/home-assistant/pull/8220 +[#8222]: https://github.com/home-assistant/home-assistant/pull/8222 +[#8223]: https://github.com/home-assistant/home-assistant/pull/8223 +[#8226]: https://github.com/home-assistant/home-assistant/pull/8226 +[#8228]: https://github.com/home-assistant/home-assistant/pull/8228 +[#8229]: https://github.com/home-assistant/home-assistant/pull/8229 +[#8241]: https://github.com/home-assistant/home-assistant/pull/8241 +[#8242]: https://github.com/home-assistant/home-assistant/pull/8242 +[#8244]: https://github.com/home-assistant/home-assistant/pull/8244 +[#8245]: https://github.com/home-assistant/home-assistant/pull/8245 +[#8246]: https://github.com/home-assistant/home-assistant/pull/8246 +[#8247]: https://github.com/home-assistant/home-assistant/pull/8247 +[#8248]: https://github.com/home-assistant/home-assistant/pull/8248 +[#8251]: https://github.com/home-assistant/home-assistant/pull/8251 +[#8252]: https://github.com/home-assistant/home-assistant/pull/8252 +[#8255]: https://github.com/home-assistant/home-assistant/pull/8255 +[#8256]: https://github.com/home-assistant/home-assistant/pull/8256 +[#8259]: https://github.com/home-assistant/home-assistant/pull/8259 +[#8275]: https://github.com/home-assistant/home-assistant/pull/8275 +[@AlexMekkering]: https://github.com/AlexMekkering +[@CharlesBlonde]: https://github.com/CharlesBlonde +[@Kane610]: https://github.com/Kane610 +[@Kernald]: https://github.com/Kernald +[@PhracturedBlue]: https://github.com/PhracturedBlue +[@SConaway]: https://github.com/SConaway +[@SmilyOrg]: https://github.com/SmilyOrg +[@alanfischer]: https://github.com/alanfischer +[@amelchio]: https://github.com/amelchio +[@andrey-git]: https://github.com/andrey-git +[@armills]: https://github.com/armills +[@aronsky]: https://github.com/aronsky +[@auchter]: https://github.com/auchter +[@azogue]: https://github.com/azogue +[@balloob]: https://github.com/balloob +[@basschipper]: https://github.com/basschipper +[@cmsimike]: https://github.com/cmsimike +[@cyberplant]: https://github.com/cyberplant +[@depl0y]: https://github.com/depl0y +[@dgomes]: https://github.com/dgomes +[@fabaff]: https://github.com/fabaff +[@finish06]: https://github.com/finish06 +[@glance-]: https://github.com/glance- +[@happyleavesaoc]: https://github.com/happyleavesaoc +[@jawilson]: https://github.com/jawilson +[@jeanregisser]: https://github.com/jeanregisser +[@jjmontestl]: https://github.com/jjmontestl +[@jshore1296]: https://github.com/jshore1296 +[@karlw00t]: https://github.com/karlw00t +[@kentcalero]: https://github.com/kentcalero +[@lrmate]: https://github.com/lrmate +[@lunar-consultancy]: https://github.com/lunar-consultancy +[@madpilot]: https://github.com/madpilot +[@mezz64]: https://github.com/mezz64 +[@michaelarnauts]: https://github.com/michaelarnauts +[@michaelfester]: https://github.com/michaelfester +[@mortenlj]: https://github.com/mortenlj +[@natemason]: https://github.com/natemason +[@omarusman]: https://github.com/omarusman +[@open-homeautomation]: https://github.com/open-homeautomation +[@perosb]: https://github.com/perosb +[@persandstrom]: https://github.com/persandstrom +[@pezinek]: https://github.com/pezinek +[@philhawthorne]: https://github.com/philhawthorne +[@pvizeli]: https://github.com/pvizeli +[@scarface-4711]: https://github.com/scarface-4711 +[@sdague]: https://github.com/sdague +[@sn0oz]: https://github.com/sn0oz +[@tiktok7]: https://github.com/tiktok7 +[@titilambert]: https://github.com/titilambert +[@tony2nite]: https://github.com/tony2nite +[@tsvi]: https://github.com/tsvi +[@tubaman]: https://github.com/tubaman +[@twilde]: https://github.com/twilde +[@viswa-swami]: https://github.com/viswa-swami +[@voltagex]: https://github.com/voltagex +[@wmalgadey]: https://github.com/wmalgadey +[@ypollart]: https://github.com/ypollart +[alarm_control_panel.verisure docs]: /components/alarm_control_panel.verisure/ +[alert docs]: /components/alert/ +[arlo docs]: /components/arlo/ +[axis docs]: /components/axis/ +[binary_sensor.arest docs]: /components/binary_sensor.arest/ +[binary_sensor.digital_ocean docs]: /components/binary_sensor.digital_ocean/ +[binary_sensor.modbus docs]: /components/binary_sensor.modbus/ +[binary_sensor.rfxtrx docs]: /components/binary_sensor.rfxtrx/ +[binary_sensor.verisure docs]: /components/binary_sensor.verisure/ +[calendar.google docs]: /components/calendar.google/ +[camera.arlo docs]: /components/camera.arlo/ +[camera.axis docs]: /components/camera.axis/ +[camera.local_file docs]: /components/camera.local_file/ +[camera.verisure docs]: /components/camera.verisure/ +[climate docs]: /components/climate/ +[climate.mysensors docs]: /components/climate.mysensors/ +[climate.radiotherm docs]: /components/climate.radiotherm/ +[climate.sensibo docs]: /components/climate.sensibo/ +[climate.tado docs]: /components/climate.tado/ +[comfoconnect docs]: /components/comfoconnect/ +[cover.knx docs]: /components/cover.knx/ +[cover.template docs]: /components/cover.template/ +[device_tracker.linksys_smart docs]: /components/device_tracker.linksys_smart/ +[device_tracker.mikrotik docs]: /components/device_tracker.mikrotik/ +[device_tracker.owntracks docs]: /components/device_tracker.owntracks/ +[device_tracker.unifi docs]: /components/device_tracker.unifi/ +[digital_ocean docs]: /components/digital_ocean/ +[fan.comfoconnect docs]: /components/fan.comfoconnect/ +[fan.dyson docs]: /components/fan.dyson/ +[fan.insteon_local docs]: /components/fan.insteon_local/ +[group docs]: /components/group/ +[image_processing.opencv docs]: /components/image_processing.opencv/ +[influxdb docs]: /components/influxdb/ +[insteon_hub docs]: /components/insteon_hub/ +[insteon_local docs]: /components/insteon_local/ +[knx docs]: /components/knx/ +[light.decora docs]: /components/light.decora/ +[light.isy994 docs]: /components/light.isy994/ +[light.lifx docs]: /components/light.lifx/ +[light.limitlessled docs]: /components/light.limitlessled/ +[light.vera docs]: /components/light.vera/ +[light.zwave docs]: /components/light.zwave/ +[lock.verisure docs]: /components/lock.verisure/ +[media_player.denonavr docs]: /components/media_player.denonavr/ +[media_player.emby docs]: /components/media_player.emby/ +[media_player.kodi docs]: /components/media_player.kodi/ +[media_player.mpd docs]: /components/media_player.mpd/ +[media_player.plex docs]: /components/media_player.plex/ +[media_player.soundtouch docs]: /components/media_player.soundtouch/ +[mqtt docs]: /components/mqtt/ +[mqtt.discovery docs]: /components/mqtt.discovery/ +[notify.clicksend docs]: /components/notify.clicksend/ +[notify.html5 docs]: /components/notify.html5/ +[notify.smtp docs]: /components/notify.smtp/ +[plant docs]: /components/plant/ +[python_script docs]: /components/python_script/ +[recorder docs]: /components/recorder/ +[recorder.migration docs]: /components/recorder.migration/ +[recorder.models docs]: /components/recorder.models/ +[remote.harmony docs]: /components/remote.harmony/ +[remote.itach docs]: /components/remote.itach/ +[rfxtrx docs]: /components/rfxtrx/ +[sensor.arest docs]: /components/sensor.arest/ +[sensor.bh1750 docs]: /components/sensor.bh1750/ +[sensor.bme280 docs]: /components/sensor.bme280/ +[sensor.buienradar docs]: /components/sensor.buienradar/ +[sensor.comfoconnect docs]: /components/sensor.comfoconnect/ +[sensor.dyson docs]: /components/sensor.dyson/ +[sensor.glances docs]: /components/sensor.glances/ +[sensor.htu21d docs]: /components/sensor.htu21d/ +[sensor.hydroquebec docs]: /components/sensor.hydroquebec/ +[sensor.knx docs]: /components/sensor.knx/ +[sensor.netdata docs]: /components/sensor.netdata/ +[sensor.openhardwaremonitor docs]: /components/sensor.openhardwaremonitor/ +[sensor.openweathermap docs]: /components/sensor.openweathermap/ +[sensor.pi_hole docs]: /components/sensor.pi_hole/ +[sensor.upnp docs]: /components/sensor.upnp/ +[sensor.ups docs]: /components/sensor.ups/ +[sensor.usps docs]: /components/sensor.usps/ +[sensor.verisure docs]: /components/sensor.verisure/ +[sensor.wunderground docs]: /components/sensor.wunderground/ +[shiftr docs]: /components/shiftr/ +[snips docs]: /components/snips/ +[switch.digital_ocean docs]: /components/switch.digital_ocean/ +[switch.rachio docs]: /components/switch.rachio/ +[switch.verisure docs]: /components/switch.verisure/ +[switch.wake_on_lan docs]: /components/switch.wake_on_lan/ +[tado docs]: /components/tado/ +[telegram_bot docs]: /components/telegram_bot/ +[telegram_bot.webhooks docs]: /components/telegram_bot.webhooks/ +[tellduslive docs]: /components/tellduslive/ +[tts docs]: /components/tts/ +[upnp docs]: /components/upnp/ +[vera docs]: /components/vera/ +[verisure docs]: /components/verisure/ +[weather.buienradar docs]: /components/weather.buienradar/ +[zwave docs]: /components/zwave/ +[forum]: https://community.home-assistant.io/ +[gitter]: https://gitter.im/home-assistant/home-assistant +[issue]: https://github.com/home-assistant/home-assistant/issues diff --git a/source/components/index.html b/source/components/index.html index 410f4cda0a7..836e3152dcb 100644 --- a/source/components/index.html +++ b/source/components/index.html @@ -10,7 +10,7 @@ footer: true is_homepage: true hide_github_edit: true body_id: components-page -regenerate: true +regenerate: false --- {% assign count = site.components | size %} diff --git a/source/images/blog/2017-07-0.48/components.png b/source/images/blog/2017-07-0.48/components.png new file mode 100644 index 0000000000000000000000000000000000000000..d29afcfe63ddf5aedf981142ec9d4c41161663b4 GIT binary patch literal 77663 zcmb@tRajeVyDp5hXs}|zp|n8J;O3-5rXxMT@%ycXtS`#oagan``}h zuj7B^U>qbP_w(HHO0MxH?2Do_1{yIM92^{m%x4J|I5=bo930{v3gYWKZ^MmK;NTE0 zzsRdeK0iNSU0uP$!=Im@!y&$$o}L~Z9qsMy!9fNW7Z-p3{=KoWQC(diFp3p(We z`0=B^zu(l@*LHHTGJE1Kx*i;Rqn1QE^o7ceC`WoT$f*{_5V5vu`J zc=zgYY-x|HVuz>ca%TPS$jHdx_N8pgso-1utEVdkB;wwszg2yUY1JdOXhOn`C-aBb zPQ`=+0|Q>|oBGIb#7hB|ynt>IK!>dhb!e`VU-?O3O zlfQT&(-Zo1o}a&TPOKA9BEjy~m?hBJ3+BXs&4179vdtzaZl4K8VR||}`>gt6HFR_M zaQL*fo!dB3ipp1oCXkQHea^}ejRK0V7<}j-xRj9AHhD=xVT&s1kLX%A>^#17FdA_Koq`%lrB?|D+Xb0hmfw6eh zFfYGq!PP5iR;?I>Rz z0}AcCD=7Z4(bPZiV(0u4x>)Q{xm5j4+gt6t)FUokzob2yF>3V2ZY@=-pj=MbrU6j*w-1Y{2)X6&jscL z`6#pD@OrsVYp8h^C>Bm~joURcxctNNz_FoflBHi}t5;BJZ9xA}MRs4uZeto-SmgR^ zw&}X3ie>4Kz0aV}Rpzsa)ghbGY%R;xe2VY2?-EhA-rG0>;nJZ**Vb0GYg7K~s1*vG zw8lg>J85&(p%J!PSDEytReijND$dut%d?8jQPy}(Ef3$>zJ5Xe+SL1m#6HV_Ds)bJ zu}NNQZb{D6pziO|=;>smJXPc`#=^28wZlci!8V&(`|zh69n;GU%ld zA=2X2%OQ?WH}S4vRps?5uhnBU<#*Ue%nZ29 z8*oQKX=5B2z6+V_iabygp(&edQ)dYO`v0GspT_jbN0D3^GKY<*L7PWd`E2ZPUhoFep+_b|;9~AF-OZ))CeU&L6Y%e09@&=E0xJ1Uq*_A|go#-#i(e z0Q56Zet^h}r=?21#xbJQW_%u`mO@th%pz!!q<;40OHEA(WG0Yyth_69b%!I8%|ECZ zzID`gv>K6ox80Fe$9Qtqql#zKFLu(+fcfsW^23eIdxbQgEMHwsuKY&G3+$@xT#b;9=oBZl1n`1Dy9jw7u`#@OEB_{WcdVR7HNj`N1SXfwZ zQK_}BO@UpO)nVu8qT;x5;5y@yyv0I;5c>;S8*p6~I_fK&6w$aU>yrCCy5;^XeoeD7YfS$?!~?i|H{~u&T&|4QmL|dX{LV}Qz-WTD zI=Z{BV!WaS@5K1E#*H{A4Vn$sy{%kF`k3m~Qc{A|Obb=JqV}$WZ&w2=_oH|qDQ?&x zSxc(WShle$0iA)toFHt|0<+XSm+D=)6qX|dP_81ejFU?8eUre2UKWbnCnmWuh#vuE z9kBcfqg|ohYhHlL7sZE{w5YxMwzWAbS0aX=D(Ic(uW&iBAm!-f+l?bM*pP1w3-@4X z=3|!z9aRwdLp_dMWeSk%y1H zaF0kWXF>QH>z+`2m|CwxV)-oVqdk4v5@L6xyT|s=D&5a{@QY*dv-@O#c~qJ6O|)tO zTH^ebr8pp&!fSXTu%dPjCHV>xQ3iQ`bGoz>%5I5)lRvlbK9O}SZWp*Z;v%wtZ0mE* z#_btjT=a*KsNYf@azCR+IJkdmoJJadFWi>%&?x65vM;q}?(rjHeGzuLblJQU zw(r_X{9K%vX&{Z_lKli3d=+U zt;@P+pg-RoD(e&p6;n${{{hIYo=4I7)8lYte{0(mz25Mu#+DZe*i3pp`2%@KMZq{s zbI+(-(r?*MqsL{GsKacJLb{Z-#mAol%=DXx9#@eep3F_f;#*df9-Q-*wqhjL)|$IA z9Dslr%uw}eZd9(q94l%4tE(%ElEblxex~aJgQ|m}7q@lr({XZ*MD6oE!qO)U6ig<~&I-8730AOgVO^GG#=!ZK5MzH&GFtmiRR}!- zL^=LGLtElkfR1FZkTufJCG>|6w*Qrle}U<={Nmr|vX!J>9_rX-4Hus>VfUhtrlEoN z8Qo2MR2M)Zhhxwp?hT-wo+8d>y8QBmdnSRD{IRWt2nv`T>_-z-xE$-4GAbd;x+p|3 zfVeTy{r`x}D|NCSZ;%qzXYoT8lr>Cq>Pl`r@Lk^fURx5KT0i=C_OpaQ*&&=CA-Ry*`KK*Qx8qhJsa^ zMs;p%VmZv9_kqlo*2%qF_JF>a%?<_(q-mB%hGtu-W*NwlT?%PMb2%meqMK%usKG+z!dAZ5#ZWf+?GV`OTyA zLlse6vx3AiQNR3t2}lu|@halg?=}qgspdemoj;colBX!aVDNczsh2?DxD&*?8U(z@ zinw?6<(#8Be|LB9d)H*S|2Y>>D@2}E{*CJ{dh)gXvNnN{Z#~(w71M`~CVw*ASk*c% z*~Q7NR#K;(Q+@ot-{ZjjH+VBfPNTF5!g~cjEXguYYuT?!%SI$}EQ$RE{sV_YDLq+= z9YjOSL_2Fe2wEkwdjE*S7SB~Cyz)Hiae|9DwiN%%7$iaLc_BNq|9>tp!Xv-j7XeAIiyt z=wK#UtK4n*vm=?m6H+QBxODAXvehiHTL1X-kuxA~wJBB~N&_6v5T6zUa`7C#CUS4#aHt^QiX819`hyOUO8%$l?y4KOvDv`no95_F^k*j+W*DWa*-?F z&Sq1GL2DT^g@v8^cOR#rj}i-Kk7y`cB9(%IopK*sfT80T7P5~EhGu+3$Q?L2J#x50 z`Vs0gVk9n@R%i>-{dU6OVaQrr_ORAm@wvoJm(ey{e<}1J>gliR&a8oAD4u~D7OlZFx z$%QldbF#I>2MRhYL#1A=1Jr_tSoT4-w(~ZAA^BRK7ic(=e|hg*s%Z@3auRmrzVmqA zQ9Vs14KywhL_C#n+Ex7tl zP=)VMy9A@78O&wZ06WIy$PGm-ZtuYADu>g})DbcjqaX4iQS@Ne(3eMG>-5|*TL65* z7D4`DMY^i2%(tTp`nG?@O0AN-^N;RMsdZd7T~S>XL^xO6q!Sbu5C zgFF~~OpPDR16IbYQHZdyXV|WMpL?{}71z`3Ug3WKH{8g1cbNt#*Fd4IQHVUvXCbNt zpZ!24-{@7qD>o93Qd^3@CoLNDFVD`#1mPVIN<&39$&q!hHq88ML(Fej3OfJ~``O6! zaLt<@mh}|a>Z;H--{#v1yowIO;O=8#SL-hKUtL{UTG0-CBd5b(Qer@EuBo@OpsHl9 zG0V+0JEv~;AU~!|A^wojdZCd-9NN_oog4Z>)tuy@p^Vg6nYG9h?7tJBiJ~Ea*UL|t zCJR)Nr&2{y*@B<^NTrbe7jaAZ+HqLM%z3Wah;hWR&5nD?_aO_GmbSIk-cfnuUT(T* z46JYWFCMy4uY6;+SoHO4p>N-?jkVjELZVd_He1=lt?Xj)&E6I&Ic9#}=?`zg$8;5< zub#@OijBeXdidcH9Wpjami!N{dM;M!Y_q2Zn(izo9V*2WM)ME+Ft#Js$R$|&#QE|5 z1*a)kmrJrDTogBpq>XHIC@;#ayAI=LS*b~7$kXZ3WAXSi3sApJOL@>`wqZxsluB)X zVtZnLmW_z8MKwNEV5)VBmYbOhM;+kpzpGOu2yuLP;BNBvlK&-O@VJwXO~j4LF_B-l zY{P-hJy6NV%%v{oWzfOc4II6Yt5b=`HcT;2$^=gZL2{m}W=@vFO(#vs0}DyE`v zN0ogT9&{B(lwuhJUVc`zcHEv}{Ro~-HL=Jb8A6G0`pDcnS5Wn!-*8Ewg|hGKkB%A= zXYAp)N%e8qtuDNC>B58X_ z)tRr?_3d+{hEx29yzYO<^Ou$6%#yigbZ^&wn@#QKLB;G=koX2Q`fRVFR!J_@97feT z&)U+^_T$6y&m)$v>6P2lY1I0)4N6qG?j${|{VEiX3^QxPY6GSLU?( z$?`x`PU?oaM;5S)b2@hGg%LN=0Q&os<(hU4>^(Y3JQmLXQ0l#Er}LC?OM?x2H1b)o zP5u$qq;$A+p~T_@V96oFQRy0>3ei6dpfi>q{31Jx8aWq-S$Nps^z&%B!*OG`7$sSb zj`bDO{a?(jiBoD>mr<%P*Zyaq0bh5@)xPVVIssSp>acKY18a+>pEjJz++k{9^ zbH^Zi}O(F>YlnW!oaV;w&SXq`xwU=sPV1#m2 zLAHc?0k)NJQC785yBQPuKfI^y>&(G=Fj9v%8 zOF)S?f3BkALwyGH3X?N6VL@!Zk)7J0AN`C>${18jS=@DG{JeF{n&(SL!n z@8&Y^%vIHXyLrFMJu#eu-BY=t;g+G!8kqs>X{d4^qU5weSt7cPi?z4PR;^&Kk%`LU zhm~7YA=(2B79JLVTJCt?@6L0)&EPmEnX~#cOijwwo_xIzxs=b3cx~9^(76u7TJr=b@?RRlS{xba*Rv%Pi#tFYYNjMlcDSJt6xhN2|Ce zF_XlvP?;KD21ObMRo&*mIak5$$SuX!3v}Z{!wmrca=*wEZUAF5C}veMhF(9`<(+>U zs<#kg)7o&FU@s08X^mkSD%CG#Ev>NsE+@Wklj@j$7yEml`lC$~Dpw{pSwSRWzc?9I zw5c2^Yw4{dc#0n4c+qSqbN@%wA`@cs_d>5wbe;g(_|d2V9#`KvWL=_F1}+4%JxQxo z)41V={nC8kn+{i%;oWi&^XM@aL7aP+hlYEg`GV7*JNpw)HzH`~@qO;ZY3%wgj{-4cV zRJJKuP+n#r#n$wg;re|vVByHXdO-SvEOymWvl&Li`la`DMkmNCx^h31eWA;lj_;+u znI{l6UJnGGYJo^60RM;Xv#+uT`Qc){Nw1Imk+0pRtlAc=5Q-mh;yf@D!2y}Gm$&5u zpjfU5n21NHRU(-g)AzgxNF^!gd=8bu`MKGpkhbrdW8d@$dQX_$#Ns5o>SU`!q6| zV%LzUmU|sLBBZd+l>g3`vC%88_jGZ0eB1!9J79&2M4%F@JV00a)IaKO-=i4LR*qVMb&#Od5rKUZ)Q+51FvMn;sgB z!TG7Nfgo4F+R}vlaARaSNm(%Q2)jh)dh7MeR4dUb2UF_mBgLj#1Bc_#iAqerZ|+-- ze=ErB{&3(613zVOzmi1AHQ=uB7DxPP|CAl=wS!-;kxyP&*J-N54qEJl?88j;J?ip=F62N6=q ze`_i4{y5!1F}mf)hsu3V!oqOubr3lJoCIyO562#TpOJh{w&jVJcz(6P=-OM9U=}CW z!>^1YoYR=A|0_c_KXUyz32|@FJ~;yg0qN?807+C8m~?(R*9}CcLJ?c!3D=^!bSUjO zee=x?-tO8jr^_?>>;D(xHs9GsO41W6?VF$ZMjoHWAJ*Y8xl^}4$|6i3V?pvwI7lz` z&};bO><4Fb0J3*YqQcQbY6Pc-ct@vQ(Sl*#YgDg`z!55-o^)cly*FqHwR_EKjX!d3 zH;o4UsYQ1;7cNj9tQ1OqQSvKCFy)?^N&eqJ+^<{iik%YE*IXLoLx7f9xC_K@@8p<_K|9 zZA+~9Qas9k?s^MqLOm$lOiab_{$vFFQ7hwONHReFlF-Lr25n1pE0v-Yc_ww zgijugrmO&(gWA_6YSvVpWfnMFBgdVij+^g+EuGEDjuY-PYm>brJ$p%epGFZq66UUo zFu%~YJj3~KB?}vEVXw2(n(va%OE=KN%@jR_oUJD<>7LVb!>c7kF#yW+vqZbEw;NN5 z#b8S3M)kM#?O-UER_em`ZXd;^i8{+F@VM;R3R@)cHaaI7iQLz{s(ZLdA%r>xWj^q| ziSg|yOZ!rL`+M%O`F~c3o}#PcQ_oo6eH_CG4)IwucS1p3`@E^>sa0 z);+-|50V67lmtw0+FOUyBbJu!jE|r+1F4IsD7mKTb4e1Ym;0vmaepwPPp}_b7CMo` zhz+iB@uFo-h#y_AAy@)V_=)o72XfOtdyy*3CxNDrEH?px)uV%xw-}F&4^Hu2ucI7g zWi|iMM?d3Sz;)7V2!&&WE5oo&r_f;o#9B4l_~Yd9W4+f|Z)Fi|vn2T`p0$^>y?n6R zsFiQmmKVI`wz2)qAOn3$NMAhm!5NXtT9FY*9xdj&ud5$R(~TK z0phg3kOny56u1rf;F(k#e&$ps#@#F$W=*Dkj4Kf9l$%S@o(h3wo5^w&>leFZ<+>+Atxa0iH4wEA|_@Y;keFqg`3 z<47fjxNKBfaxAro$T?jZMXy`?3s47bi8xDM_UqY9@e0(Rr?IuZ32nR3b;~|`-ANKw zDAf0!?k|8-`VNL}IwsajHo4I=f?CEuz_IzkGc3)a{*fwGH`h$$m45(x1NssTcHu5| z(J<-m*UVp+6<&yUyYSnLY$r1|T4%zg8Vp}qFw9}L$i1%cI1$4Bnr08%CMJl|i_nJM z!}$^Hd^Lk@{P6FcmgKQXv8XO`$R_iC-BORk*wO`clp|HbBEpU6z=Sgk)| z$ZEdgf(Bi^%JG4zXaBQ1#n-Hm_I;8URSEHCwQK($S(C_-FekX^^^T3`0GFmaA{g`j z%=t9CT$VcK69a2m_?L6`i!2XpR>sG-8AW}pKI)`=LHlHDC6fuTFgSFCoeFA8!6>|; zIsCHZlF?t6iBpVax|E+ObR?{q$Ugl_?KpiY9k+Uixey={m&LW*GrHonQ}SLKG=rhuYv>-y5YlqaeN)MJWeg8w;Z)DFn0FLbXS}@{A&*p zHRd4@6bY^2@Lw$yqGl618TbCyWOV&xxyU8_oc5$B5c}$)n8Fkfdy}zXVsG09bR#C= zxcxY2%x@RBw6y&-C@4b_GC`%;EMG=woOqT=O2~NK(>{CKjOb0oofC^#0y!WnjfLu? zux?e+@`<+2LaSzxhZs_vzeU?J7a@v#MVhOr3a z!L69oy*Q-(3I`L4tZl!x$>J&$=ACEDBLkJA!0JT|A4a`m9Q(5m0Ud(X@1} zVnS|BO`_uR;5Ro%i#lg0_pRtfmcs!`kGm<{5L4*Cbi@HU1odZ;dEF{TbSEd$>?OTD zL0d0nAKn6GVXu+}8%L0!5ViTq&P=zSGF=@UBiF8$G^|^v9o+KP#%misRZ+PBkWag+ zj;i&4$6Rlzp*l%Miq%e8aPW;FxO%cFl#mTw-ytrsOd#~Wjxeiqa>HB3gofqEJ*}^s zfF*Loi@5~6N3oc~3{wh-Ii!LDs@Hv=&8|>3jkM^k2|UAfh&q@5Vfo0~0emWw$9U61M6X zmxQJy*%OV)&UjV+>?lz4)PF|4{1hexmTf<#+}1NWVX0x5iX)SEND&{pw_vr@ylkJB zMqKA?S&OD8UMyVkO;aMU&jD_TA%}ZUY>-|pJxjgT1ba(n0)yeOpUq`Uc1+#7DA`&K zecH@)7blVtgW#2atYx~?b3}@g~lPL#r6{RDWWB!#2g8UTElpxav??9O2#vJZUq~Rx`9rVVzqYF zB~?1puK57}%@4M3$Fj^I`6x{Pr4^0wpP%a%_qXM%OZn(C8r|}>9J16=s4nNuY73Lz z(s2d;GY6ZbkLHXFDO4yQO1ugM=DnxKcNcfAgp}71yYl>}5g)S>Q@y0q}?2_coK68afx+ z{Z`FB{b?G)WzP)BohHjQ*1SarDQx;b?uI=&{>M@$IxlV^fx+Jjs0K4OdwXKYFlx#o zx6|NtxH?={my0foe9P-v9b6S;J+Hyl)>u-+>aPefuQTCa4#AkyiI{o>s7*hn0q^6f z2+^f@Ny2)`uMu=W-$})rby5?@Ah1r|Ly1R zJoQQB339>U`(fcCm2gGRr)zj1dFI?_SZ#-@kzcttp;eWu5pV*G*T8q?nNv&#$(x|A7us z*ZM2~?Dw?&USX`7ng9OkRSzPWc+yCpW!1ggXsXbWWOfpkv?c-skJuh+NS1u-xu1dK zE@Lfmt#lO=P8Ekz$d zKCI6Uo=p3rO4T+*d{i~A<`={bNCM=n!-egS1^b@FwQnFq@p$M41`5;?kLwSQL+`tP zfa-xoVSF{u+iONuc>zB+er?l@BVvt$UcW1HLXvIDoNm}Z`%Wz z+wFN6_~5cDD#_e_wW3I+B!i`mMe4iT+F2O*`Ei?G!9e@AGe%(P*m;K~`mN>d@#1>M zqR-it76*Xe$Fm3Izkv>I39IH9$qH(({0JHjdjp}8E3lk@_uQ4-0it~ee1__ijlZ6> zrbIb}Et21AI3%!fub9EOh=i!1rglvuZMJMaujliYT{3)^Om2e!DUJJF4|M~ls6@=p zQ?}Q(3G29Qx;sTnf0t;Wv?dM13iS*13J|4!hqMg4YWoa8PVD;sG9b{~Rpj+-_&3T@ ze{1hGgHDD2^{Tzujh8fNlJK`4kw9`41?n(VR58QvX1emK8jREN@nI1(oMpcvxExo6 z$Nhz`zCl|FQ(2>BzMtFLoaA>2#$ZiKL0yY1r>=^^>{~549u+J&bj{Pb^z74bXEUUr zuplWYk<@usk>ywuYEm(ut@gRNLd5EWgACw`db)<85reak@67gA1>;bT+tgZ^UN9le z$xYl46>*LTPR{>G@JVYbPJ&P5G|)^tBqD6rGu&PbQ+W*u2PIN>t`>vN496iuG1bUzx~Unc}P;ik}%VPbAxOcUHL6Xn#g~C*pof-oVS~UDFfy zO_X$UDt?poX0<7639atp@p{?4`V051qOLrYEnL%mI1##iQ|uF)~e%C{{F&1s52#kBy&>0O#gNVao1TG{zz&Re_95pQ`9 z)HF2}M)`S?ND~8Aa5f3EWd!3zcsq`UI26aJ6p)8!IvAiEZmxi(walD};mpf9dCH^e zh-lS+83(l;CGew5HyVx<>;K`*Z;F>%LRr{`w*8x5-Q9J&61RF4e?=^A0w7hfWz z%6W1Mpd0Cf%xH2-*U9S5A`k|2LrEz_hT~9T=ZR@88+@}N+f^o?8##4jQ47|G8(Cs! zKu0?shw$IG^Ks65NHI=mRg8Up8^>aN3xj~9KOegE zAB+p{Rtj2dkt(cJqFO0Qn*L>g2`+L~imrSXO$K^bmU{uFo)kF?-e5{Zl?@)Wyyf=Z zy~z0euIJ1V1t?Kg)EN}?#`13fvEF=Q{eIW)U#!gO)6+YR4GN34FW;YUPMidIoJn_* zz3lbl4&9yYzY_&H@A&L+pR*h<8}m!VfH_8u5OCBUI&iQ&<~vOeB< zHomesa|~I;>bT_*!(kq-+OSB-?zHrTWA?Tk3k*mG4kR?n%(xAJN;cEhc^%^pM_yWy9maXO_#gN)cQ z12P0jbLMXS7>AJnHYOtz4Ijw4`ne_LhIgDQ{xH|ypEhUKs{%;WhwHt{&@5y9CxcfeO~psm#1F%nHA(7T&d=(sGej*9vAg@y4&3R5KVi2p7`)rs-@bGSV!I z)av%Nn|zFX`po)KxI_H_=CD1UoCROSl07jPxc))^Ws~*CTW!d2qL5PH&Y_*6l6a3p zZ3OggUB7lIs!;P7Fv<8{dC%Akwz*z7_GLqJ@0J#D2#R#(D6+C}`Z5rN6k}xA@O^6U5;!`ATN7KRzBKw_&!eq8tNXoU#WH$wDL%|{GT54G>G_9} zMr+XG-KDv%%3rh6agU|e!huGfrU}~O61&?pkGH)p54h29p?j#elLn>8Dr!q%Pdhn= z^Lv}X$^bAc(nR;FU1{Z%?6<{FPk-5eBM_Hy0FNL0z1&K)%bFI@lm7}4F1lQU{&pz_q3m&08T@Y!p7HXIIc2yEU$5()AS9zS%M!*@GS|dRSljTRF_S)u!J^jkK zp7;qj4aSdSL@t+Yh9BbEE@JCof^n=us!^9yDk9%mey5GEDZc@T-<-y8_kfO2f3Vij z*G77)^Ly^CuMHF4ppwSrj@=0-v4H1e=>(P)DAAIh#QV$N#~k=56<(GZ4J| zGXCL^aI`H595TH6dT{7{@&U-^zJ0xq+bvn+K?~e>;8tCKlMsTk^?i8&`Z?x=#Ia z7O74QfcAe&BZP(yb`;ql@x~yNqTP42+ zTB;3iGK45&WJ)fk4hp+LJjGw0z5vXlZ(&69lC2)3xGueO+Cruu9*s+GO&(GV7?8tLdMD!snlkI}lA(DnZt}@OWuCw7 z1meAlpFU_UFPJ%g=lOg*y&V``xrov2V@cp%Z6F4~+LV@&^W%Zcl;`um$N{;Wz#cS7 z`C5bb#Ds3z4g-=%cu;4Ean!A*w!!D=YIiNhB<*mRf({-rAVGe5O*wRg(e~+ACJ-}^ zHplG=X-HYHmn2uqzz-S9s$M4&7YUw-x^4@sC>xMt^v_w-bOmV0-d(riDNhE$2vrk& zAl^zcWt1QkoVh)(FP$wu!+hQcC1@BgG#aLjv7V?QOh}f4ZbaDFhoi|U2@%-PwuV3uwjCqnn>cli6!1)YXFrp}_2`-r& z%pVear_swaB<8g46a^2PIT_Ov2f+s1r5*@>qU%lVf8Yps=>sAL_&L{c;}@GZK&q_r zUo9&d3KW9>Y!Dr>^qlg4x_N%fgOU9N2LZBSNMY%!j4iZ2gbvSo1@Ox(dq~GDj2C(N zbUD1PLO1hznYhrOAY=$^z{SeGmMMv|CP8J+O`;w*?Zp){<6+NN)W&eFw`6IT!3M8klg+A*j7{AeTs2{R3`PTkg$Jl?@`(jPRgom2Cb6$P*7TAgOJ>T0BLI?o73^X7wf^lMJa6F4CGi!j49e(?f;Cx z4GnGM4bZDmQ;ID`OaW|p{e5l%8zg7Cr<5+1cNr)peK_PQe>Wb9VQu0o5Bhe)(8I3% z3zX?^bBp>YY0&EZCzYQ1_sXUxNqr=$yVsf_k*2v_d{uPWkyWGngq7>o`Si0dK!-|+ z1J3?sQ?-UhCJc8Q8`;PDOPetC6vLMM?bkAv4w?51zYVT=#-hN(5)^0cS5ufqUps>< zG6&o3Zt(0qvI zlxJN^@=Gqp(&>_clh-cxuetPP{f05m5^j)ddEL{uXEGoQEhL{=spfBNfE+xLW({@V zU-zG15u5lJg4wk#LCf8C{_k0SWpi=@+a`=P4Ssd*|AEp}bLMG;74At!KjIJLLXsR6 zCS%5%cEhrnu1x`(4ejL6)QBIZ%z!Bcs}+jau2JQW(63z~hCsFniAMxOp#I^#13-HI zsX&?Y8(w89&wJ^UN0vGW?G~$(aq6J8d^YdzXyeQ?5tY|}orIQucyWau?978Avnhk$ zpht#8KrX;Q=_qdnq{#{*Kj857QR{tKINnZ1GA-#%ys8HJTQ8nN)UpmjhXKQENb_TT_Q|g zGDkBoHy+a2hJtw0$Jw@sG%CSE$WRj+vqq5CChg z_;-Dt{3Il(O~=f^86f5paJ6HD{oWMNeTwqZ)A`$+l_bVRB0$tT@-wcSqkk_hWPpT{ z?DJ*3do+VOW@qKE(&8C~iE!WyJn*<<-htfUoB6>)BO&7m8wk*u?_i+GhYfWhS-jU5 zyivZR#~k;Pk;kuI2CBO~$6$3iNDot=(}MI-3GMc5lx!t55*QNf#$+Mut}5|@sgsFV zP;@#v8eEm$N}op&DE}S2akNc=x7H}T(bx4zb#j0bFJqZHnn!8ICoPe_eJ&&ft^P)ig4ZNmD_QDCTM%EVP z*UwLbxkkIDjpr$S=Q;7ATAleQKys+Wt~hHcCM~CXw#c>Mok(=}55ck5)6AHTztv{X zje-7Mp|__a&k`+skL9JI*=f330r!YDJ_SH2C2T5q*dFKb{#Y=$I$~(ck|ep|Gdllh zsR;8y%mH^jc`$99h}x_0$WVO^BBS*6Xa;)7At*0mx?FpMahOhooylSLJ0ILTqn-DZ zeS83=YlI<#81OY3OR66bl`g2fjcox8)OQ$`j#w{sK?FIG1E#pXVgNFrgnRhWd|ZGr zrYbiIHGnx%%t>FRKm5s-A;9=4LO%eDrs-#F<{UsG-1J$mrn`^Q$PWeL7@9CT?Ar}w z{7Yae<)Uzo6M`47(CGUQk6fztuQmhO$k1I)y|3I;=z7G$XQm+mBLOK+gws-^bZ^WV zGGBj-fIX0XO#k}AKX+-cGS*4uJ%CZ!Bmd|SqrYVJ1!Y%Ww~0iAOKIx7?n{Fzhnp>Y z@u3*Yyjj{6S=k3Ve?fq`0UzW*##b3bQ-t^CLhI<&GlqQ{9e^CXf# zX|R@}lEWS>k-7BqwlRAgNOV{^)G_CbZ~$$K@W;a8((A3C^tmU%z@ZvsWR^Qopj$(Y zy(%s@&`wPKR;oPLTn%@kI)3xIJ8s&+!z~6GO8k#a`Z1tc^Bgx&_iUVO;K92i!G)vp zuY`^>?R{x!2W|{`pc4qRLGd+j?_c*EqH+1q)LqZ7ldjPCBbE9~tyId&{R% zj>~d2(Q7ct$RJvDzKK;tnV`tG1sWf{cP=rM*M~#E#Aq%1OiFmwO02^N@sj_Cxwj08 ztLwT&lRyH2ZXjsm5+r!z4nc#H;0}$uThJsxH$eh{AOQji?lkVY(O|({8WP+IZnvN3 zd*8bE{JOVp)u}rFdROf==a_TNCA;@nV=p{p{22qg3wy z@?O0DH`4bo$(gNBYZP%9JkiMo)obone#3G_x&lW{lyCzei!&#!Q!vQ|n{#EQaI}8= zn116vI1+_AzPeHa?}RE0K)(sPoP=I3adDK7ZPJrfGBk2sMzGBBw(M-gGb&GR)deiaEUZIAqsRpf=qkvE{sThqIoM-QtqeP7AuU|qSoxS+e zi&}L(bmd|LgHQdkuHOut6h#Hxcz6oJjUEOU_jq!R21JnGBof1j!lQ~%Ux(P;YTIWg zKYTEp1Y%9PRS_^RgtV0(({1ON9yGe-k+ajtNr?g3T|rb(z|ORcz^hPnqB?P}z~&Ng z`CR8;&>+u=a3(tu9*}=MkA&k=Z=O4inH{i~3fC)jrL8?k*&4^2o8}YR)1bX3S%_8a zMpB659NA;Nz(-ijwCJ%&o4RMQB%Rj$0&DS<*nJf0dO|eH&9ksz{SpwJq@3!p3NPcz zD(*k3h)~!~ftL6`0zb7IB-83f7UlXASJ``H{V3%^$+l~Lb7#Bo2}JKdnL)C8B$MB> zJD^7FW+AyY5y)xcwgkDF;j6!%%fBpBIE8P2Uzo+Bq92hprFKf(VglObTm$c61=UJL z6@d`-lIcG(5>lDm!n2OSEnJsvze+!#23Ou-gQU`SzmMGQNJR*&#@j?&yZMdxhoV$2 z;lYDirRgMh$PFh@6?Ev`ro{6LUa2oFkoefih%yy*N9qnrF$;9-Z5cE6IMISRe-Q9h z4-Ef0o*1R)8RGlq2Jcyo+FwZ-Wob~#zeA_s86uXVzLXF^H98qbH zh2;BR&QS{=EmCv`m_rsn0sj_v|pR=IFCW!qg5g?s*n|Yu6>$1{UR8)DLg+)A+~KbqW%HeoJmX z8ko4qtV~(mQex-ZO`^65-h)&IrFaJ}$g@Aa;l>0MLH9Qd??44?3Ga&AoPshN%@|u% zRceE9Qri?wP4ci<@)UWiqhes+Sj^4Fzp;3uP+bX2 zsZiF=9CS>s>9fr&q9`31P7S7+n29>O+zl+78T6D)-)fqAS}+;x|JfNSvmLN&WTMJt z#cl2%1n)CG~;@`DDB^|ywY5(BRah~T-cZx#kE2bIx32THV3xa!o;Bw+OmMM_nE zY-If}Uv}i#rlT9Ms@^Y(&Yp*%Jc|2aY7Ud0LvJ!^i>Wmrcg5Z~? zfO6sgVrjQ%yqo9G#8bd}id8k)h~;`+^EwRmJZZMIT|Q3*k*JMsXOIsyak=eXqRyrR z$-xLrbt5o&%!w3ppE{zboyNMv{O&{bu`Q4lud`0p#iUm{q;&KTu9N(?^R=#IZ7#}; zTvJbD@A&QDe^e3c|CQAEYIE{mNewhN{y&l$o_Vv)|B=)X8FyOxkEBMrz2L!rBsGTl z)BdZ}ftKg^uTlqEp5yqN;v9$agJEt|@$LDv_LUi>TZVHB8m z8tuC*x)G@A88m#oJ+E=*i%3WKoIQ5d(Lwee{;Lk+bo8~g!c(&JBgUHtA(A}t%t!bZ zbkI1%ReJF0O69&aK81De-`53Rxu#+JHD=~*x2anyHmj*l_(?tq=S>r;%U0`0bZx_4 z4B1*OSHaBSk!ME_*&aLAGb7=}g9xcS@^9Od=eGh2+~d%G-;$wRO(fj$kz@VOzzfUN z(L&RpWiwz{2kEBF?}XW*lPNHGGyVT;*dm}x?2uv(=DQatL9v~nV(k_3{ZFmIv;c*T zJ}{W?ugWKy+1OfoS?cWj?bCx!A{r_r-jJ3jw&>m;`U&D(3Ky#Vx;yI!^kEOeg?8S$gyxUeUImFu{iV4)cDZl`&=Sq23#onltyX_}%XOROvb&uP;^LBbd;)kU=bGt=LMF^sp_U+$=$ zox?Tn;9LUf9E+t-$$jLAKDIa=eiYcfelaWjXE9_+D|?yDVe=IPFJ3TIU=Ru4!FH^l zOD}EpEqE584IDk-^C_HENO^Xu;V9e~1MNO25U6a;rK%@x(ylP;dcxPaMwUeLW>m@_ zrj#}z+#pu=KCbw8_=9ge4l@&WfzyOL)}g)vK)G^b)H5~)_G?ee-KFP_DKPLf>6BZI zh+Ysk^pz^ba8+0s3V%YR5G9U#9tKy+dY*3n4EOW2TeQeA1s-%wTHy&70e*zvLs3D( z#)BA@iHKBwKfE@RnZ>4&SE=?Hp;%U6z7o_`Cqov|ML&`^suA!t>v?b7dK zHu527!;2;53JI0`642qgkTpey@p+ioy?O@Ql-q}pdEy@78h`vSa=KYP^qU{%E(tyT zkq}3}hSXsKcYc#n8Dw9|tbQ;)|L^#KHmA2>M-C#&NA0g2_-ir$2vGd&V2RN1vwiz3 zsWdceADZydm@*56IkpC-F!FdyB%}|39P2-!i*M-bwj+x=(ROo%>n{Y$ZfH(gEk!V) zin0NTqu&XeCeGRI(g?@V6#`;TQ=T%IJhN{!c;<_zbYVa4T`} z#VJ1BH)3S=UfRl11c+1;%#F)XEkAZ6%wBxB+bZFA%989q41-Uy=#RM)+4#3{Kp{n4 z%+3!g;+9xwavNFO1O#dsy4ocszbX89ZnquDAGmgmtAdWM_J5)aIQko8`QS))9O=51 zmyu9v;T%x+65ykYjyUs;5}+zpAgL6cI>gJx)UsisV7~q8r5q_ZOX4Y)?xpoZBfnU% zU8S)powFxo5U6K&r)#*|0W$^5adAC@W61M@Uoz}R`%%lhrAuMHfgZ`}$7jX@b26u^&Pa4BXRhPMa-D=ZUV3vSU0WkK+s^IE57q#`rgg@1d90vrd1r z+kL>E+vDn+QIzHI>i6Z_G1?+a(*Oo^(t) zVF;uT40ab=yfp?E7E>hCx4$DeEpHWK9QC(?zntinO9M%V`rtlpU^3|_`yKotKj=HG zcgw{!CAh`^V_PGWJZhGox*q@msclYTdH&L z%}iAManVQN_T+8$u)FrOgNT?kF70z$)9oPI`yEz6#~DJdiQ-wyIKQ3z<1nWG0RQH) zE@bfQRgUX8awg73l`+jOCCxkCsT@|pJQS@+p{}p#$K$+9#K5`1$_rM$sq}BOY24&Fx``X#fNDUX9-`CLbay`v( z9@$_^x<>kSlo4BsSN%$l2_3QgCCU(p>Z0MQOs5RFZJ01)rIkh(kUqyZVWK4x$)iR$q+4 z9v98L8GaY=(!&X-e)il@e@nwdl$?ui+<8A>uOf4)w^opx22JD|^h&!nZ92$5s1^Rd zuf^Kv-Uii9_8$`P8r$T}FPz72xEtMgCxJ8=0Bf7ZAvE>N5BqBn~7A&M7v-${$c}ml-7=i2d-pTWQ>uq$@qXgka32J-8nWLr)LWDMdLS0eD z3}g;=q4pc;b7YC{vr~+$dl4fCLkXfaW=-^Y)TXrd>opZ6B%N z&Pk5rJ_DDIbyV!zOD9H&A%~my}ErgA>Yt&_5XpJAs95v(jrflj5&_;z>f;+5Eo=Ahwbyf-oiPZ z5hVQLdT-3bX2h^M{7$q59}bAy&s$v;?3)pgQOU`K5yUvptAk4#ITENMS0%qkJ@~`T z5bCdVMXs8t1NkKCm5<_IFZA+^c6-ga`h<*r`7_q?6V-vouVXGa=qcx0AMjZ#rnP+kD5U53p*`c9Db z|b^Xa@zS0 z=tBp76h@`kRNH4jlWK~__}MR9v>W%o=yHdV)p+`A`EN+lv=wYP3C z-w>Yzg_v=eg#`SFtzmpiLBRNv%VATkiaG2@+@)4czGST0J}{Q1&Y{*KLo) zGO9MTuo4S+B}SC~pwQiDZMHj<%dov=nJ>tqmkNIG`uSN7Hb1*x@lOH`!eX)ydpSpY zKlCwts+Vm8+Joc$T4R5qQ}JxW_<$E!p8h#4HS=auDGQ5Om9=mhF3E>LdG;rq3j2AB z6IzF-pZ3(W#f^$wk?DBYSMi$E#Z1e`XW|RmdHLEhPv&4l1Ap)fxpOMZj?hSpvE&CA`H7sdCYzON zJ$A=1@n2RuDgJJz?_!^kw7)RHcf_}S4O`rONC{69px&;}zM3Xv?2RqB@#;Q)Y7KAW zPUP;b$6hJy3sbjRGTVhoGsKz?g$GGsQSuF8qS#;*t@m%%uhXkyid^4o^V!w#2x_mUi zt6%aFLx<?FTWhN z*GLky@G}ge?(Ii}7kxQ%W@fSw=9#rggErTi74GnJ+KuWoBw8fzJzzSVO?VfkCG+|Z zr8-P@j$Z?LN6a9=?lV`!GWrbQ{Sf!jT5No%*6oJir3SAzP3pjGc{z(>uYT<2#tHv7 zkB$L!v9X#-?!i~JIF&LUL$^0(8<)Ojo>_HLTGnqf@s~daAJuW4=M;Hor9aowDa@{D ziD>u<57R=nr$?x|jtjzsffI}veB_AvD#dN0uCE>2>6q~+op+JTcjpqALK>=VJ>AiQ zYJ7T=Fah@9F1Nslg3e!91v?b4V7(a@7h0VBmedIU57^?YR61^kUr`6_e~fG^tVdp+vOk$DG&~e>p@vlkQScC+F|B+mBIyTcCq1$90Z5 zEEr8%M#@?klh&C}hEph3Nh3Gz0_O4xd@^b?+Y+wJQ^&zKp zbA|^?tZ=%f&Be9y<<+ifcoL)kyHvuDL#t1tlVTw7FU}N>V4(05tj|zES*H5d9|5D> zS9ipRzu$05SRs%wuUF90NuGSf+oON`4mM6EHfT3~9H36iB6{iyjn2L@5Dff?dK^$) zbWZ#i^N2-Zd*mw?+Lz2_7Wu1i!}tZP71un7;$PzWM(fnd$yO9j6y)`SJGvbZOK8haYvUsdW=ev>syFLzs_V_r2S9 zdE*}!(+Rr>JH~QqmxhZ8exYe9Aw8@oWJ6CQ3ZifU_Pg;cFU4mDsixmMm^iN9xsv7D zOY>dvN`I)fX5sYWy9q*{oX^@$Ryu~fj2deSdFl(1%uX$fns9j_t^1?7j3^h5s!wwb zlvw(CK3r6BqGa;{jiaku9Dy`5BQ;4WTC3iv?ByzcjG02hCQE@pwS8XtpSn@3>&y zca&R@snVC{AIf=*&#wDX7W1wmg{yepAgpZ**|ubj8qC70px{LGlAbd?K<06p80$fp z1H0fcx9N@9FL8%R<}!R#|8!#E^|3C^mE6>;05&s!F!XG-oE=1v{$daZfzo2N)y~(C zd)z2KLjNg1{#ZSgt?Ssbflhn6v!!wG2DW&$Z z@hSTR4=7t4`sZyYp3u;??R#3fcG!hB&gd}LfqzNo-oEbu2d!w!!1hC;D^5{nZ+FNY zJ30v^?OR+s1}7x&Vj5>tqzzft!He|_E|K2^*^5CH^8SutDVup+{vQ?&`_g0cZ+AG+ z#in^F)0+2kX;oi^P~zoxlS_xUn0Ua3_Kh36ui`=PPl3kA8k3bKmjHNUgOk<)YItT2 zaZxS&E&^gL?4OWLp2YYm7bEKi2{tIV^lOhCD}4aL4}lfVIBLvN{0(^7TQmRYufT_! z{VRBu)Ov3f=GNw+y=#&!ysbQuJ9AQa0=)#hyO|lGhL04Pvlp{6LpAvEwiq?bn1>&7 zx_*y;__|wh4I3L6SK{6ckp;=t)-25eJZAn>XL@)$v1}o2?*fBKAJirNIQ9oZN6jKw zo&Bwx*rAviE|1>{mDL5FO*lc8x13pG*d6Abt6DQ7gZ?tiZKN|D6LD>?k9iMk2aBu4 z<>mSYW>gJ=kIrk3b6qog{L$U=MkWLC5<+TTUD5@8Nv$ADtk*k`45x1jMC|V_KhTKT zxmbQcTk=^A^5k&Uu1^N9Dbfzoxr~X)D?L2xxm>DtzZ7{myvIiKq~z2*g3Iic+~dIK zQevJhlzRsu#Xa;~_l^%{NhpIYWv_X5t%Ts;N?gX(hnMT(fy1;u7UA zg~MiaiH-QxpcGG^egyv-D5KM4|H1X$>D}!C?05~T6kVT^Hbr~jnRNJ*N>*u9!OXb? z#nM5c+cQutc;#RTmU=pcGEeU%D5LYT<>&wnYP5 zlX7Oxy;zPjworyFwJ|cUG2K+{ z@1)O8lPO?*sAhyKL3=xar?V(1`Ndk=MB;wi!=GeSZ@#g-Vn8EzXW)8g{~EvYtR*0* zZDK8-W$M;{d+r zg}S;DZ)0%W7%89hj%pMo_1ub8NSo}~Vt=#CPBSrCQJ`Wb z@^?~jC#?*1;bvcBuOYze>ma0aBN-@XLVbePyhr=CH?vI64L#Qh-PKt_wDNhAETT~} zjp`YVO_wMqb798rhOhiAw8cwyl4qjE=&#U;n{_L)kHb!EhBA!?yCL-15J_^a4u$ zEJ7bVXbZ1Uk(cT-ZT5PjH>RK5TC`crx#hS^l^Fh4ps?5h9g4x<$=Y4VeQU0-ySA!o zCPU;qV|w13#S-|m`fNBfD&sskTm{AUB?DVJ@@CEzu9fh7Ti}}~jN&(Q(oS??VKHOj zz*eG+nX}Te7r1vA(enP?EsR6WL|)58y`1@9xW&V-FrM}P;P)1Y@fK-8BXHhEr>@cq z3xgbMIytW_4~;7ejq8m1>!tU=W62YOO4{J@_{P*8bRp>cog}?xcC6&hnl9(~s8ilVTFd0hA*;N0M(C{&6?W+#?f{>X_}7pg*bPWV zk&e?)Hu=}sF0~i8Onvp!2EqC!T+aC9mEXU9|7Iw_RFF+bGs<6Mv3C(v9J#)6L5;kn zy%@fnl|KsT_x>ojb9JiOz&*d;I=htS#e{xG<9FWI!1da2x}5B1(Ck<%E6`Lhi$ zEKK$r#Fyoqk2J=9ULKtX1fLtLo%ovYMN6-ghTgC}a5|jsL%w~mMs24x-)_-^{02a3 zeT#1I?#B8w$8R*tLD_h3N&L9mTHFdA7)tn(}DK&t+Q33`}Sv; zxF@pl0g?W@!)u!q%oiCeRNCu7ywP&^@f2*)efFjo>kUeQ``3Pv4ig2ExY=dEB7xk&ttVd#Nxs zJ?(oWT*`?45KCrUAg*sb7Cue&*e>*+$R7f)u|hjW*m)p5b>@_%0068GaTF)`1qXhJ z=Zhogj&6P)ltU%)w0esPMZpf<}Yw`y~p_$xHy!=ANann#;HA&Y1ZkVELK@~ z>=&E;gKS?}R7~vp`uZT|3{)*tT{phveo$PV^f zz$Mj)R!a;$`n!MUSDwpc12W>W;9`jQT+P^%MK8(A&I>1j(;7GZfYql#K|I zC0o+?gyG(x&`wt~uSdW%+{lniAZX?nY-{Zck5lwt~B&PYQp}-2!}Y24FqV(h3#;6Qy^sD-+s&kSI5(@ky;EYIX6pTWNr1^>hfj z`u0b9y7hot*ri7&3_*DR1_Y5*&abQ@tgA-Zf*c`F!qp&mPxj#+`Y;F;&4fU%S#un< zX=pd9qnHeVpuwv){$4>#<$k$KO1BWL<@*-o z`{psfb)@+%V5^@`tasyUb!K2Zie)b~utGW&=q0xBTP&$9V#Vxf@@Ff>Rgp`cxn*g- z{HiqZC)}Bjj1^WNN`IbdqvuOkDh=&4PUk5xqGS&JC8UjrqSqxBQ!Bk)ptVSSdIM?%c88g+( zPiMK$lbf3T#vX<}s+x6TmffE%F)pIW(4mVDZx86-NsmAh44}yY5xenj3txtr-?|Gj zg(oo$vhWdF*0)37TwtPHs5^U}*(buV4JhGcY61&NMW_H1{HxURdttYaJ!M`Jyf?q` zf5!nWZxVkfU`%HiXD6RQ~gdYuaq;$JPuvtN-S)a2(}W z>j$EF%?mz3@j8KA+6kRQ|N^`I}U=4i$Z3KKu7Eb|k4|Lca?LcZj*@ zoa~f~`3x!G^j6LgNbCIgoUiAmXAhM6@-oI>+^y|)PSM$^2dey=OqC4=y;$KG*Vj>d zqrvf^%Z5NhzkE+80DjvlC{QM1E}T;_8pP-c`Ic$Xy5Ps3X@~7fz1z8&ce)XvXZ+Q`9%fiMw7XkFb3wc zgv@}cNh~;TDpImkPb5`4A%8-va}$;9%`cj!qK2YjhR3@sh}6sseoZv}GMX^JZSM(D zXfb)8Xj4~9!n(lGe)Aujnvx;pH1)I5S;)HV8{3M`s)x~37MQA4yx)a{`KCh`D0&K)=S^`^J>I5*JOf%|J87(Xe%>Du#WXGp$ z^qI9pae?$NXCkMM3&(|6j(+nsJCiUmWSxn`t|z4LJT%Qdj2|fs`ogsIK4JeS4Nx;i zCuQ%>lm_m#=vTB+{|!OU8?w9rV|X`A2ll)}*`*lUaXsffO6nKQYzBOZgTjPt8&*QZ!~5|*B?$7#a;^J zP5n`1SeP8sTSqWw$v#>~5O^P58-33B7|UTq=K`{y?swCiJZ7NiqSU^Nqv8)&!kI*N zn9B+ows|5R9Z|dhc^ZC;hW$KF;c+U&AZNm>#aAKiybP7wn>PQv)jYL-lM-%|S32xw zl*ZDZy$w+av|EH?kvuieH7KR8p z=6RPH4tRHIwUME;Z~C>?Q2YD%8lF2T5#M^kGfby$@K4>{?fcG(FUxXQ+QNO?p7zH?IWXLM$l-RV+4~jYA^Kr zWEn@qMd6T!ij`-iuRa4YbYb1(+%u6knsRkuILjKQ7Z$Be4)L*J9H(y=N&Ws?mYaA(q@(b%5t{uvHmuY1Am|ko;q!UfyI=9SvT8PL+k77+;n8zrcTb(JUU3i|JHw9f{-}GP?Al>!v)~PrWlF7h@bUWAcz)Y>Ga`u^l0lC#_9V;}(~(9& zacL|&448TmQD_c18^%5)fkyjDZT)q?0NXdXNU#G0!K_8!KAv^^Np6j1n5Vy25U_-J z3{Sf0nT;co4WCH11zsW$zWX4PhDXE$q@i6wqLI=T;j3l)^AvD1FJ5@zV7A#-D-z=t zgr(v{cdJY@Sh+797It*GsQG-HG-aZa7l5|>*0GO@fFuqaMk0y5$r3xuK<}G1;g=+_ zMrztH2#RD;lA7|ppLQD=sR9X4y1Q6nJp@<>nXwkZ4}ygjWQgJ7UsNnQp)ZWPkhM~a zOv%7)5#V?m4NLOqgiJkVIjc2GoPnw!O~nk&o@wl5x4#m^1V4lB_P^Dxx4*aT?ykip7$YOd-!C)cuz&|Q_wW)=Y(<@P^3 zyQdI}vC$N4jeH!qd(#W$pK8C+hZi@K5Z@ZZQRxxvmMKKJ34I#lkEHTAA?Ec3tU-H3 zUs3NZ;N{6S7Xh5WKY=Nu{RriNa}Q5$K-38Q)EObs<|ci4%SKZO9851uV+*^{m$QaC zMNfY_J?V4D0bUVGO5hQ$^(6KP$C|_HdEqgIm$6&-Gfi#3YKw&NR$lEAZ)CErQI!(k zgh~pJ&4APhf6NLX1h}z40U1s;uV0Wxg*%AO-?mq~oBwc-g3c>%;1cJa{Fbc`IFytf zf_`SfHM`##;o;{P9bR&?OL<~UTonRQ4`0vH{Tz_EngKCY>3q8gF;!A%WX_pQ9{c`F zVmIYTTxJ*)J61-&&J=in-V0C9u#t@2xOZ!^cb9lEG_~J8>1Na`b4`r=M5q@v6zf7$ z`382r5(NJW^B9+uxr$Y(3ue08Cs_}*x0B|IxYx~SsE&m&Uv(Fp@@fPW!)*l?Vo-9z z6bBhc>`E2q4|d2bpCVM`%eRL?i0rk+gs=TOd-pBxrSgIx8R$F>AD*kh@%IJ~9hV;f zLsOgYU?UhGxRM((?OL>vt$Lg~4)9cS``k~T$;S%Z3`qxiwqmAcXJvBtI0IYKWpzF9 zl^=B-OZ-yv37aN2g~KdS1JirCNLt-k-KSI3IIEPlteQV1Eg&z_VwnfImU7=%!wp2z z^XqW|537DYPm4NE^-?%m9iyEW7#=WCPL3F1G^!K1=&i;de~+^LLVl-Q0B-|B&N#N_ zmOLFT91WF z*T*0KvLHcaN>mnlN?t=9Gpjt&hZSp2`$X#cEV-rQvC(vhoPKG-~ay2#)@1}cyFTY`b)UHhS*BJeeT`I?FAxQs zrY-E}V@L!LL~hiQn5hHZ7^_u+^8J$q@xaH6csLzKi0UmO^N20 zar3);a8ye(s||xVxktB~MIcksirKor{Ngqr57Tp$OIKVDvI!NrP^E&RC2%Mm>tHkd zMt(O~0=I_4mXL%1om)FHxp3-@SoOjS%W=)(H-@TZqkZ&TU#Mrl!cc34GZn_refnNn zt5&;-4+{2rpylfBgDAayh`-NhQf4fD-K;OjGN^NvL$WXdePXtZS?f_%Ma>t#S1EGL zy_QcO!xP5p&x_p)E%mXT>gs8{k48JD@Yq0YHabAjfbRoL@kg~X}_4NeZgBb=rHvSvQ#p$vgVj5S}7A_vqj<3R?)HlLx8lz6c=vS z5b4uHN_()j!mBODtbj|AE5;igA!t7dtPzRMzDLOgGUvv~@Aq7s=fDi*M$8(T#snPK zU}!BWjQTf*eCkrtCAnN><<^Zh;uKET%SHl$tKcaCCti+yBqok841#SFg+4Z9*p9^N zpCahei~z>bq|3IMx$p@hPAsrm8{?U+!l{+{a?ZVTx!Iz z2?;%|qo|$_?b`GRcvxnUtBIX-;MU~P``AddbWVEM82Kt$YQLYQqHPoU5aG}Lh0dW&a{sjR%| zYepZVbje(vnflm5C^Ad68)6r%FgmtvhQvFUL(j>T;r*qKwF`{YwbISrd))NXE+%oY zqL=Bi>NIqHBC$(ieSbtQyj{QeS{=EH;EJif6s?9h@ADH4{AP;k7QMiS}jI>?yz}5PSf=F1Lw3NVkn|q$d<3> z&a#b5%;|&TlK&{{IgRwN$YI*;ujLEbEdvDSZHR#|Jkf?@QJC^C*w-48^QWjsHIENK zJ#|vU%Xmg*szgXMbF=9Eyln*G6AmjGQLEwOQ+oubO+x9lTHzRh?tke*B4K&Zx?U6v z3K=VA{9jHt(F;$tm%=3?(vRzOHr7BF)B&#Iybw@j4gy#%JUam<@cud#6f)4^_ z=iBDQNq+tm32jXAN?iT1=YUm5KWdm#@Inz~ zVks=j*WkIHSNI4}G%~D$OEy_T5^_m0b~l^V=Rls6)cX{`R5-W8Lm;u98dNstYKgGH5fOw){4HWPPz%qIR67PUflTbXcmX%WLQC#x~xcPXDa6w8uFYv~9 za?F*s#^)f7nlz* z)S%1^nAMR7Pxc(Dpy$n8!&iZJE`WuWdHobS@OUe=Cf(qc*S%QesNB`134)%|UcseN zDuUtMiywkvkKy#M?f?m%=z@kAWb==!(|-zJf(T zL(S)Qx6fiq;jry?q<6o=4%p$Ia-rby3H-VnI^{a&fRf@0?Q{Uis!L8$0*angTtU~( z?BP!}2kxvPR-u2YCm`^H(w?v=g@Qh4_4i&;ru0pG;G>N}_Tno8-I<;qR zM0E_Rqs*a~N&EZe6YQO^`OG-+Hl*hH*iT250PA`VAs#ZyK3z7lfic>WAsJ+fwHc(R zEfPmIrSm6`zCRD8PP*zr>Vw;k7eC9Yh2u-VM6FFF;c4;= z+JLJZQY?k-zMP5A&MABn73Q!j?m}7!4DSEPcwQTDIERwxKO|Q|?R-b_0vuTQiX1e; zzu_=B*8_g%r`H;&JKpr4yMh2gs$mQ(Z}e$HJ#q_G4Oe0;+k_Gn>VwCXYWCnTDqrL> z5*MyP4r)7nnpW6F>{7Z2BLQeBaN34>0{PATkRYLF3tSseiwb@nYyB2ih^IonMsftIRp(>$0W)9`wz+s*DkvGiOUciccAx6?&cTX<};cXn0g@E+DKT$52)i8 z^l0S(9=O+3_OnOK=3V~;6~}&AkLT3h?#$@IZ{|dt(*d?Frt#O|JllyV;2?I6GIx7dS0StOUMS2t!6ZnVX-)QmZer+ z-#ROIqa0Smr}|uP;U2&wZ3aCHyZQHtY>j2f9u1=Vu(ZNWuJYiUEdkRG=c(y{x~A9GHL2QrBa3CzA6#w$^WL& z-_>B1$1|p>byQH?#iu7bQ^;i&o7S+|9C*QK%&@*sFrqL;D;Oi0&Nh<4kKJmoAOAFk;-OUhN_xdDaL$HIHp_ zyw;C_iC|^YN$^I?;Esr?8Htj5yq+No*|{EoVp?VqtY?!r1uTYN58HZ=MMrdSD!dXf z;me|Ii}{qwjdDDbKX_?z9I?-q>b@N8hkpKuhUwyZf-Yg9DcG%;+4ClCT>M<)hL5_0q?Ujl`i)`nfJENsjpsoYf~Zh-?Xvka%=wTt?Vx;R_I( zqBQ<6j|Rh3)b}je>hXSJ>BH6JYm=Uldq@@q36u?hi%%~3k?A5)6#Mfhc3QvCdVd$^| zEb-1w7H0E-G(aWQ+ArVyLW*Z_*Gc;;_sADzzDXRwu?Yfi{+hws@h5+o&pBnGBqM2S zXSQe*aU2+a494>QHOWE2!g=1vCmMjWCwv65sjxS7Ys#0hoI86aSO|G^r-snTAHZc=mhG5#w%^d7;0U)o_ z%RGe@PR|Tf(=5@WH`Z(36O7NlJ5rM8x$l41F8a<~7-6gI$)h@jD@MF-UEiB4xt|rl z$?2L1^Yi=rAA|8IWWU>il6eZ9Q(~taOcXlErWyr{f?YfV1*D53#>V zN$`#3;9FM!gk->QqVjjB5P)^=D?%;VjB~;p&DG{4DK?;ogA2#_*3Ls!JLbsKjL_|@ zoi)InX4_+`fwr(ZvwFA#%^!mIcWdl_xqrRP0ps2Gb z&Uk^`5s1if;`eKO@-nF7$HjYYI=v2iS0Vy9t)y3VbNv|^$hW+Ht`||BT|omQN|uX27Yc%BlOmXnU)GxPq;169Ng=5S+#>xHV4D5Fof~ z@P^>-5ZoF0k|*(-FoRdTWgY1wHbEGbKl{^&E=l;dT%AJy7b z$P(>@wu#V*^(2yb>ao#8^K`;zAF!871Jn5 z9hy$j)eP|}2M?7|6hkvv-gVZ3e_qz;W!;&nhxzx_B+R)Qe3!4M7Azgik&+i7yK-J`eXIsM>w z))NwWo2PWRe0skfRt-OGtUg4B1R4jVfB@fYkB%3o7=vPJkb1F;-tgglv&Agl%yP{q zAq1e%1i^~V)4+#kQs1({!*+kqR=LDNCxWi2^u=a-8lMu;+5{kp+Nsm6k<1Mup3iHQUe@AN)-xucSmuBvaa->^+i& zNJ@KpxRul|Rw*{VLPze5U&T|^|EcA`m*%EeeAykI#Zj#ejWyI93~J@hkQDdgdp`b0 zf;mSO8lXLO7U=QpJb(8QkblyGGy#LnQDZ@@*p3e!@$VSyECd9bMJxLU@>rqw;|k_^ zKc?`!q#}M_!Y_BJx$f@hq?rm3kX8p47 zZt2%Kwwld+M!EX?2#7(0ygcJRl4k3XP7C5^+4 z1rTrm{80-4^)T=ft{BvFm%K?+-X7q>0%*CPmxe;&6-zf1^Wsk(ap%;}abW7Qkb#WZw_9CEx!J_l*IQ+Xn_g9@~QI8;gFMhHGN0{kA2* z8HPU1QzWOTwRCaXEXutG_0_vF`;0-GAifpiF6S{e5bdA~yRrj>7$xSTN1+peqB`a6L0r zcc4uCiAQFKz5q;-Y)ewjh5lt?I~Dy<*etxz$>d22Q4+-~i&IjgzTTY}El34tLAxCVh|G@UiDU|{o0Q=6~a@$tjbys20%uh7ahLOE) z_@hbowEDsBMYIv}!ttK#vF^?S_`K7Unn*PO3UzjfI;i+?=v|BcOEzd$ub&w z(yq^p#y~|4wP0pNS-%mGs@~+AiVL@i`T4QH<}v;T8DCP)&NmFnosBpaH90$y6&2U; z1JsYre9yf%4NfnX5>OqewcTFOpw`y`dSdH1>+0X#py3f3*BeN&&RB&KpOypHJVCi# z6)2T{;J(IM&T-JuxwiJ5_ftcyOPffWa$nbc-r?VC0jQ*N>K93;B*7*-?|!;9OD%F9 zKmI}PbY%G8IO%xA@kM&`C>ro0=KSTB5*;KgOm(!@WJsFU==ywWo|40NTM)Pc-OKvx z4II!uWf8ux(0%R);MIb%%es@_4~m)TR0ylr%B6d%-7z$x$Mz1X@z55|snM5?=zF)2 zGmT?ZYHJceI}>&o3dH0s<}X=(nd4d+pe%h{PAH5$y{pT^`)a2&mbPv&0EA7WiO`AD z5NYaI#&a76?25mBP%PCA3hr4>ll)OtR?8q(xqK%Be1;+YN&V}rNn%i5bM0Ch5h{#B zL~Nudf&pDk`77&FRY3!@zYua=yt_g1LdJ!^qn#EZwG;I#PT_kya*%>+$!!!2Of$>xNT(%^K6|u#N zjerCIzbVX9VBk<#=UMe$6v`(qy8{mMlsDf>L+>^03E+V}qSQi=xne42b8hA03UKp9 zM;fhYyx%-mg%%Z8PvB|)E1;;V^Io2kDrs%(HyV``eboX&p)i&LBF=%whW(QfJ)=k+{5nJ#} zszre0zJrT>kuyU36zJBA(P3(bt|_p9R;7Dof|$)Sd?q9IHgzD>>}$vY@cF`J?~EO~ z36eQx6s>RW;&^0!Y*xN>BY*5RDTc=~y!gOff}7a<)~xtXFr_co<|T{r6BvRc`X^Fs zqDK98^Ycth*V9CJG22r=pzh-lFHy@m%RL^1Ge)G^G(|d#y<0PJ+YT3qbScz zz_Am|aLiROMS_KD?lS3Gf@8K5VLaw*^?u!AQ3z++7ou)s9Vp8;&ghtp5fW4>hKFE0 zf^EZVA9T0OpEdogz!{>BnX|1=LT8=N9U&!%DFpepoCZW!W7&+KG>}bU$kI%J%yYJ% zKmIW0%`BsanB{@+5$6b7WM84P#LdORHu@Zo&ak20*ieTJM!&y>*}pY!^*z4azWktt zzNnDF-x`LGn{CyYtK5E}kD`#%jU@^r_mgb+o)IP;HmK+?5N##z&j}UglQ#i>IXt2R53QF zM<-8;c6IaK(3!uOG~^`}0V;u>z0qhSdb?AT`?%E>|8JsObzP@4zdhVT!5_F0;TF*U ziVv-S)`irbi5NMlTHP^0#WtA!2!e@(&lHFCAfJDq=}q)f0+ky0Eij?a2vF8U^WUA~ zrvX?Va_VxjP|)w#qyctxsdL@za8GHIm98hMYR<4<|hN+t(f8k z{ty=ho)RBDXr+ron2s67%_$xM(9tYdq5d&H9L)ruxk(_^D3BX6xYMxpO5A)iA|E4w zH{&gQx}HP^QZ#c!3aMv*H5-D#fjUq?zKh{)J^;F30o8tQEJ<+(4*{6JG;J1nT;Nh* z***}6(Vjty_45lS#N|BGv?Q-d0`n^l_m~wwN<$dB9qnwd+kl3n?%{-JbqZ*MHR*Wu zXN5c~5hoy42=PG3Md`Keh^Lip+P(WY2xl6XYQFZ6xN*j)pPiex8)Ob%%TRvjmkK)@ zIy<#!_5cDQlYW!+53BBu-#z`YW(iJihR$AS;B^lKaJN6;hVh3%0#f|duU*=R$Qu|!b`?Y^z*#*E&-8|$C*`655iR7BEU%}J} ze4{%l|A+5mNZ5h!x$CgwU=4?MF7`*Jo;ScxDG|n*!E?lSyYpvSer2c$9LOT>axXN{ z#0#$Iedz zSK&h?=dzecAS=1E2JwG?fN>jdAPn+W1P8!%ZyywU%8hAvITk5S4Bt{s^j3*lW}_sN zlMs)&8Mi@4@Jg}cg^UCNNO_EYL0+juCBp=(cd*?oC4_CAbu4HY0SdULl9ZfbVJeE; z$~N;fOQII9c;wNJR12B{vd_{g44(04-(dNB41sn6z`&@#OY%^!zXITcuI#}q-_vdS z(~g%#rkB)5F(7?gg&z-(-9aM55TzL~(`WY70!YdHc+1^xgu#MB=67r4aa(N$1gtX4 zp)N8LS!aX!X6cE@p^|oE#WPj@#sUpWIvFIN8v$YR2RyIAVwzV0;CDGbHA#9LV9yxv z;`H0qvc6d`6cojy6D4b}02C<5&H5H83I0?6-tXmOacStG5Zm5B6+`%(?mfLn1L*yr z!0N}$p|`Y!>3I0HcN&-={kxyWs228;K#a10XEJD>yPdQ4gjy+;$`}0P1DqnW+k5z8 z=;tv1h7TqHo}()zzrsD-L6c$X6y6sH^vcg+_|KGFkrX~2p3At;`G9S8j+YLA>Gjl) zUf;7#2@z2rGL2ckHu6Np~Mu}{tCm3`fsaQ zGx6YJS15#gBrK4_ruJ*RfY0`8%7z)IR%5LxRt)s#xO z%!bZ8jAs`>U1_?@n8ZefXYCR`UdX3^^N23wwDY-+Z^IV_{l+P{@U0%y;QQ@dCJ!E5 ztH3dRJEYLmPY?d46NK)UzJ(OA`8qzsEgL&)|B?xq4Z||06Pdi>^E9_yp5cD=6d0KR z9^1=ewY))Pj*okm3VSZjre9vnh^GX8iWP-b;vWF9nz%k|+nh035}OBB^BP zAfMCr=UQFgroDRrv~i9IMmyU)COn_vv(=@T$IiXCNOkMC-=U{sML{g)t~8zh0}z%^ zmu}#28wb7OP|lF~sAFhtU_l&UfZg7h74>}>zg}^+@EVD)yC%Fas_aTVUPFT}i^DG( zT*kNj=_t_xgTxBY>A$Uqe^Z6r^`0Hnt+0uJygdDNw6eVeHrR>Ch(&+%!`C+s#wo&o zdqyQ@lb-+W14btv3;+^(w<^kS}XbmMLD%xQ`j* zxZ!ERS&1{?5D6Mk8)Byr$7#HnL{{7D(YC}Z-JB$d46#tN@ZFQJTC?^?mnunghh}`u z<^Q=w;A|>%N z9mJsp*|6x>@2|;*JLC}W0FN`fe)2I*X-Lf7UozrnOaSdg-oJuOq{%B-{l*$vLD=jZzp!9vyD73OMND57;sTte; zS_Y(M9>teR34@=PQ3prmB4g?GCVwz!ojZI-mGIh8XSEt^tvl$IyXmM=NGvlL%ot;l znltpYMl>p^JLtv?JbY!7Zk<3~T=h=yrrmk#*-`Je*(M>krlgcqZcZx85INl#mpFFm zOeA=04b5Z`eT4m2$fj(oOzT&5f!Cq1Uo7*Qq%CZho`y~lZA5G_oACAQrn*BX;X2D| zhnDBwc&`D3^Mt9>f^mw@chap%{}3qpFm%Q#mQ4#qJty*y0=qs>)fX;gd0+OxSGIzC z6&n*E@2e=J&^sjpf2ZcF)9gkbEeK9-WZa4JHT29_Aq9i3`GKgyvdOIA^M|!p3Z6HI zMheRW;jMJzhJT8h@2qF5KmEwe9a^iEYC?z0L06qUnSdqOJ&nw}8uc)52ePVUY#t^I z@vzL@LuV+n@Ppc{U5$Xs#((?R2CN%)QD-uHPap;5_Ikz-lvc>e2b_?Mua~?QtDdKY zP3vxd8nhc*_D8KH1&ur$87*+8!{{*m=>W%-;qBU zkMdsXAjZ5(2N$Yb9v{KwSqY0IBab*X6tM}ytptBq@+6JnyZx!XpQf-iwi^J1 zPO@W`hWoXw>OzP=ZG$2GT!4G|;LE!+iKzQAkma{H705T$U5&-RM8%oQMELF9fXROL z71Idv0F%Rjnf&Z*VOtxlJ|1#~5Nnp3gUW{@aVnxD zbk@fy;A3qaDSWM2EI{!mTeP!xKF@Ua;|(JIWDkOx5WBxD$L;b%YtjgY&MZTTwZQyW zi3>0xJYje}U$bRplBXhnDbj(IHsX#ZzrA_8#qCz3KJ-o<$Dp%z05B@I2AEw&vZ!<2 z4!s|*p;%(P_i=>E-fOhHtcg}nya$NXgh}bV6i)< z>z`il6C6dHl-NoPS)0d$=aVnQ3H92X#f|5()u0s71cr~QQUI{S;HR`>pj_PqkuV?g zB-~U5QDXUFI85s1R?ZcG%xfT*0+t6sjT=0>*q?soJ+EUTMXkn6f-Fv17tmLXU93*LfuYRV*)(byXfHkhkSKm%A<+{$XT?KKVgO%Ui`~$g zY|1IG3Yqa3hcEeck_<4j=6Jg7x+3L)pp5mzZ>T~hu)S!Hsys8!`>{|q*oIQUARD$e z5=5fDvW5(6!7&QXa$07oT7oE-BCc*NVSaHkc`)J z%e>(rC^HmLjyb4pCq4!`gaT+Yig2PGP>mrHued9?GK%IP+vR*?jxxp&O~`EhvZK!& zgcu8LtY*Y9O>4#I`Y_-PoPH>-^D=+k-4&F+`2RD!@PCtrXnQ=@gZ4@sA9?zm5o`T* zFph9)z+Ko+TSED#8#T*)=l>EJ|A}q=m&5o^i|fBQ$A3~?|AjdIQ}X&h(T)F$KUS{n zHQhXmt+UvwL5yxr-|t_x22&iTD?8+U!0*nUL>2F!2P()YUE%`zU_)~YtffNtBdG|2pvAvZ8>Q`F7wmGM79n zNzq*F=lk+AcD+`5!YgC(Kgfg{F8Us`ai8|sL$)s#-3*`1r4c7=LnGgmuq>1^7#3md zGCdbQd15g15fV2fW(VQq1Vp4SC%AckMUj5IPXBB9G{H+IBCcrIz&*KZ(;Q{VgzXqi z;f7$kU5@w4b5`WTYvLqyM4K zC$!h;Gz<%847dq-L&Lm2e$lgcXd-3p8StG+5dRvb^*Fsw7eAM~ry@-S$(MMR>6&F} z;yo6T$B6K{A57h((<6~wD zRl%l^$9XdZFb_ZVX;G)2yZ`owY6^O+0t^yc7R>AhstRwY3evAiYm|#v8+F6pmzpsTH{0gk0 z>%eT8+friC#aRC#g*yw1ZHL^^hp#1ggbQ)n=tzKtBSORN`l=T5chAo}=&0g;odJl2 z2*QJcBi}eWW7=dnhDlTMiGLDue(Q|+!Yy8%rD4?^5t+*_n0#Uo!)v>^x>!$VfU1bu zBAL|AZ8t=toeMJ&DsitzJm%Y;1%)n%Vy`&{gva!1Lz75EANzP$GidTOW6h6Who0<^ ze40Q&Zft?f#^qSiDUzJr5uQZ+wOy>;cbA(7F+K(REL;t-PJhkyp&j{I!?HfPa^2+m z8VTrXIdc>=F_AHyI<<3}x@J8YB2OiY$$uw24JfrG+50Cqy3yyv7@bb_fqFN&OfmwW zN%1wx2UvH>aVXMj9#p3f)|yk!`!avrp5Y9{6=9)`#oF|rLgh^Lmx=BcX;x%|lc&C0 z7D84Dkz^Nlr^YYW&C^;K(|T>!AJeg(_{(OKP`JV$Ma9-WTbP$M7;;#!5S6~uwB$__ zU}RSHB4!N^_209<+g4dpCDvST z>yzmFjN<~as+#^|mAP`Hc$1pJYBTjMQ`U(;f{}ll2p5ppXI|{lqJH<*xH2TlzMAb~ zwJaLuNs(Wxf5HHlni;`GCs+r!)HuOLORoN}pEQlw4x zyIkhd;p+zf?=X@IyME35QRGaOUtc~{`9qJy!fxbRo&ByTnn3NzB z-cbE}XWVR0olnob&?aSz2njVgyy+phm@hj~c>hzbQtQ$y=Z6RW=@ZZ7ntIZ2vY9UN zxBH?Z4mQ39fQ@kfwI0lk7#&@B-<7OH+51lZ(&bX|xEXMv&oAce2iK)0>ayDPt zwr-++mlxU3RANbqfP1IDahIdSCR*)-T)btXH%CQ^OOStE&YIkkqjc2g1pfpNufD$| z>=IjP63u`U)mrB0j86dH6&z)<4l;2g9~9!-`p0VM7l~RGS=*HYqvziEM(*b*=^l*= z9leEU+BpN)scQJyq{zY9@>UJZJv5CukA|ej>gmh$92`@?h9n+kWj(PA3M#j7DSLM$ z5nHK-dZ%);bGQCqB0MZk7uBIEYiVmWV z(9YOE#Fdx3DUO5PXR#Sb3_I)0_kS&P{`2W#9;T}%&X2+RJRkHUi@O1ZESL2rBM(<) zQu#Z~AC`kb0R262uu<-NsgF0i7X(9zvNS$<1EnX!)uk#(!_Ydf2-C7@Wkg9l2Q@f; z7A+)?P`!=zyDTEp&<02NAnY?|B`-4V2ZMafqADJwLhmX;QH5?xN z+&<`y%SE#7@`Q~`G)n~M`z>)y(#(3ATf`QTukd@`CGtAG>f*3j&P{gu*l8hh2@J2oteAVSN{e4%&Wj?^^<#^4#q>? z%~t=OlI%jPv}6aha8>QCLEW;cc+xh?f$Na@iz?n`|?JY>zWc#KtnW z9}@cs9R6PZ`fPkFeSjF#BnWx(7AS}WHv@uN%IN8n70TkJXQ7EQA$*d3%QE6-N}R7* z!G$)?rhN$~-*~pdzyjh%$7a=&EwP~EI5$2-D=PneQC@o|c>tJI427cXwD9hKx8)3)2|vs zMU@9+$9abh8+O-Kq2ar+^EFZ0T#Pq}-<3|@*`4*x_FduL7`hTRkA2r5XjJ7I!Hb-l zC3Le=Ok}iXZSmuP>NUHJ!)KKm|IiAe%!~ZE*Mxe0mpX4JZwIaeXmj@P69T^a{Z5?e z$GZ1O%d(8M;{_aLa!;s{^dvp|WeH*c^f-TN3qnHW{kXx+K4xjnaT0dZ#sbcniHoh)mDS4#$UrSF9A?7e?(-hJwGo2}0uIqG>sBB;3__w^Jo`yVm_GB`u|R0CN~9 zRn4&GZe7#pY92`)p1|i9*QQipe7hpFqLfiDtmkN)`uI&VMD5${inOr+-(KipZ>?>l zcz2x4s{Ue9d<2mzUi(AvH<$R0vR4p~W`}yK2{W3dr8UN=R;)*dXlkyF@(z!?>@!Kd zo-+~N<|S=6Kpp0>0=ro3t5IZM>F429ie~=D${OUdy}k9CtLR{*0yHQk0Vee8UZkf& zU?JAAup2y<@AH)YU=6SU!ixl1lYZwLJpgiM$S3jh!67=c$I&V`$>b@VydRm`67Ngs zQaTVaq=dj~+qpX8olCaNe+UbM~{RmeFlVtAgU1$v)~9r;vM9Kq+o)ndJ=X!tUc6yP*9FQ*mK}77X6J~;fN$xc!JPWFDQ}R$AwUBB#I`{M_ ziihq6fVa;6Mn1OYf`Lb;!sJk*-kCwu#f+}Ys#5*h7v!F!psLDu9W0U-6zYe^AyA0>( zeFaDt+QZ8>cc|lDfRAuZgX~EnOcpPI>6U*XxH)P0>!9m+MCbNd-)JzF2I@}})S|~> z{>U7*Lh$~T3gfZLXw zLcL3sp_{&J7jb$32guG2ev|?|LV`~)I4eAqbVX%a(<;c^2L$l|r$`ZYGe16=*(*5V zh3(9p2Q)FWdTVJ`&RLtZS;yLZJs$#0RX!u#25dRDUc!(fDayzX?_RoK! z8?Uv^{zVc4t!2GC|XyM%XIs+4fsUBIa^DqLZV0&)CO4#1=id!d8~AZC2H9BM6P0xe?vS079DIM-xbq$9Y&3>V zrWX`vcs&g?=PcwtJK;l4a;q|LynS6S%?ZJf%lYcZ39!M^4F`9)%wVj)Ys$>f7<#e= zVzKCysowq`NpdcspVt~p`qrcqRa$rVyK)-TuRTV9Dew4)F$w=~JKm%I-%{{xXMK$` z{srk}2c2u6I!*FO>`$tRh)wv$HJDI11=>Yi#$Gkt7qpxzT`7rkp6MbpeZmDuZ*o}E5FI2^s*PUAr9Q* zjFf(oPzW=Yr65R7QP#_i;lo4Nst==kBSIDhTyaZf(r_!=guXHQg8h@HSWVY z>JAi1-)wt2CP@CcpqDI^ks-ztLQbI2?fHg;j9ez5K=P{I@JFjnC&Gr`n1KJW@w{!l zrr~23n_S1{-mb;q#5PmgTerGqg6)%*fm!Hw@@4bG`wP}cyL5CY8YuESHcVHlH&1M9 zKB{wfa6t2m12d$CRbv@G32Ohruj}D zg6AFjrNze}l(^%o5X9TgGj!~;;cb8M^@;1-0YuZ}>GQw9v!fw z=T~0vJ84={@-YkDa?xNf45=Q+ID|w~ox_ZQfF=tg@Ga82w|fL8NVz?B!}r7n%cxSQ z4<>X9wL4d2`KE$%SZ72Z|9%Ga+xoa-eadEO@pS#6!U{N*fB6os#L3JxzJ!!a=gmCE z0xZo!wsD#AYUimm5D&60VHhkacl40bo?<#%QZTUyC!{H%cNP6QZi+`#fdHZ`G1r4k zu|ca}$VK)gT%cTybLpynd3P#fB8vd_c_TuAYr<2e(<#3oDCF;)^y5$ZRLqeB0b~IlC+&* zg_j>>H%+r4En4hwg9g8PxWs&@(X~8<*(S@F9=h(gWhuSdX}AB|(Ww@R!nA-A3fWGH z?+%s1tHg|VvK07jD_+tF!H3$PY1Hnv{Wu?Zt^AW;JrsQ3xmP09p*l03%K=~<4YBUB z6&T1JG^f0!D^EMoVN3b_y8(Pt1p}^!tJqydPoXMN3$AlR(d2LYUPC!tx*tZO^A=|0 z8whiki3PK+bSvP(0^diX?Y(o8`IAhA^EK>W0iZ5l*zn){w;x(uID9o@_B%Mf9eAV2}G*JTn%9A zqao$_QRk=8PrleJ>I2ef!EZJjQ*p+Nskr-x-@1L5yr5?ywW}0DQEUdlPj~Tk*L?oJ zG8SDt6GuneoQiq2f0Rg6;Dq@r>1z2gHm^dC{t^Jab16M%SZbLEL5XjX&|8Y?urvGS zw05}yz$6sQSAfyXI;fN##KY1I8>*W`Z~?oZ8b6=!TQzTLYmUEE(T_086%G$l61l-)+0 z6?2~a&G9BcxEI+Amlm1w!_QbQy6Wc&{ym zgY`X>T%zQc42UOQK^7vtR8|-Sd|0pV`XN*D_z7(fqnfp;^;sl4-)DCREvwowIFb^i z^K7E>y8UeHJ}9gd?@)%ocyXknG%X-j99#XY$@nVmQV-MNrTERNMgF^g{tQ;=8&C;N z@}!z$un%;g-URC?TJd~4luGh{&YxJ|hGaK4jwf^eKFs_024%n70Nc;?hUdh1r`m@Q zLhZeqCE`ajfsAyuK8a2w_DQ2`$W9RGcKrG{a>t3K+G-80+4D0Z)MV(_=i3%>ivfp1 zK#NrcLy}|a+r=v{^_i?d@G3RD{f+XJI9&)*gIeu#B4XAiUe!;9V%Vq|dop?fdiV(c zT(G=m4JoslHFzjfy`pT-qDfsX1{Sm6>(yx``eKRc#>Q^?bIpEK3729C#hb9`w&1O? zK>s{1!^&{uYIv~=>vL{3)LN&ZI$bJzj6YHC5+_NXu~@jC*2R0CuYbOsO>tx8QW3j8 zX`d2oUqzYOx!jDPp>x^j{;(D_L9vW7Y5Z2KV)&^CgCV!@>3fBB%Lv6fv$x@1u*qC0 zd86K>&kZ4ZAgll}?brLLiyk3Qtunb=766MG0hDW;t9|Pd>%Nc2VB$irBZI{Ps5Mav z(pNCUhhE9U6tcnYily?i?t|TC*@%vh^n+jrBgH2)3bCc zMtX>$DQM)!YTnPW*q)7Qy1H-~CkM zpQEex@aF2V8s^Ef#*L=K>{gno)RUxhQ!gXQ6>W2!ISWtXmrAh_)Vd<8Xbh!Yi`J#S zPQ9-1&+yx=7^$%E^4PAo{!9XH*$46Iw?{Kr@z;sOgmh4%a)&2DcM9oth(V`QndofY z9*}jtO_saE@4K;5f`?Hm7|gYrXcVsqIEfwuZ7MWzE>4Ul*GU1azdi@A-o$rY-pP`o zZ{31I_zE8*nPlVX-vTIVdXPw$Fi`GrqF~0aaDI}xS_->mCo+eH; z*?p(pWRBKveA0*-1Fm@;t%U?JQhV!`j+MQZv20l>?5aYsLg%lOGuuS&zD0a;dUy`w z^XNFpsHP$zRG2@bm8_ruedI+7*P(@k7Qpg)J3keng{%yQ+rJGrZh0zSC#GS>s2AVk z>X$-hFb4rqMwC6OTKsiyyf5Cf)RsGj#uve}#0!x0=)h#V`;k}VK4=bSE_wVKzd0zlNgtQH@Hp_62-;UM2j(~Jw#gMGT zA`!1ETV}tnWam^I+;&J+*D%2h7QoLT;EUn{fR!KpFh)l>-zE1=k;`raX92g^`@p@ z%}FmqQ1}yc9f{`p+B}fLL+ZKMU614l{?&Dyu4oZoR5l#RKU&bpAu8O4GQ9W6xaJ~n zGz?oJEL{gmFonMMA0x$*R6z+D^2gtMU87{U^Yp2h3|5_OLG$92?=>H<+TkBFM}R` z>MR*r$svU#SRI*heWGFYNl?)lv2M=&Vfpq{Kfs{dRdl;d5=uISA@Ofi-3=gM8ePVU zeONvCDa);mhV@ri+Vb|zMh>f>OU0VS41J=NN1z_Ns9ed)h&7NbF{8euACZCK)nRUyu zeOW6U>adGKAI7uWSMVv|M> zx|b)%UuF2M6-^Bwi$fg{x^^7-ekfzTTw%0B^8d5v|ri2Jg zQoXN@u2z8mEm;cM`;CTV0ePmx7ho&qeMs^%)vO& zb|pbC(M|GWMlpF&arUGor}xI0L)s5QOpM|%O96(IB52%myY|T9_Gg2 zZg$&#k>xF^=cfzPpoQEo(K6wetf2?o9Qpl-4(#JXZtwHJFk~FeJ>*#){YYN@e33#n z-K*b^AKJMt{uCB+Qq0tJDg0^wCDF&C&GU$$W2`CSa9|Mp15 zNMn~b!lcTl`p(xx-}>F4H(Kmmpp+&hl!9(Zkk>t0A&|vm+Xw(nUu{77dPLs* zvklHa+o(ZRCwJ^XU@Hkpt5hx*f9=+#38Hh>x7^l4nDQG^b|K!bav#X#N<3Ad#%!^< zbX&N1zl^XkF&MtV``5Ax_MBcBa{^*2?(owuJ;e>Z$B5L?nS!M*Z6518H6b^EePG?& z!_}QAt+~FbS?e^j2Z&Ar)TexHsk`LZ9;?_lDN>{n*K_l09d>?{=$8$&#Ej&1`N{RS?YpAYTAEK; z^I+Z1AWI#PKJ>lxNd1ybr#UU$jql#J?}_-xT8Ac_N_R&`GIX;E;1 z`){8J#1Ubm?l&2jcm=mR&@SqXqJ@2#f2oyxmohHVZMzLgm9W(jC~+ie5G# z4vU^$SgNUmoi5h2kv2w(E!D&<-`ONQj0B(1xsM+MX0MHlJ0~DfL|@~Z!?%;0vs-$X zYIgh=YZiPrAfL&)21q6*Kz47F4vz+FQTU8IFjs==;3_e44`*~gwU@p(iYVv>&o0dd4{DuA5*FUHcE^iS@PjCit z=wgLu-!xyl&%@-LY32K)0)OWuozU{($bH35pgnny>=(ph01&K@8qSwsy+YRsin}`e z`2K`Jcop@AzfjD{VWp*Ep&9gqLb$q_=03_7F3KnJsE(+JWw+SD^y$F+$NQCyQJKls zQu5IniQzt_o*rb@Iv8^Drap_9a+#|;)w!6PGP)~ zP?jU?_j{DvFxJqMURnyKEA*6B9bc#1Yn@+%Q6EI!WjPi@Tx>X;!1rmoM+!+~okvh+ z@K;2GXy3(-^D#czjVL{aBEeX-$2m83KC)*vf%ZO@xCuy?gaV5>WzgdigxhUajVkY3 z*W;e8=XseYHcDYc4(;i1358)I-O;a+ercWi(knJL0}|4=IY6nPtAQd8YB|ZE$a(di zk8;gMwm}8_OSr5`1dqXB)h1h+OQuY(NO;I!y+zS7^jSU@B<@vNurv& zQgJGg9k|uNAsbKaa9!ogES56Choxzh4E8=;&6J;I+Vy;-MS#?0 zOgq@GWgGnzElXWC>pvR3&wY%B!S)4w`ABMV9F9q}UmyO+2VboXH_C3!23Dp2gz2W* ziAxW**bLE1mfJQTU;CCmT0+kP!?PmO$P{+MYz1BiRcaCE-u{pic2`x?B}PebAsKwm zIB^@95Fqzu{?5<@SS+d642w``kW4Ex>=DKN(1lH47=WrB9Ft|6!gbbxe6L*T#`ow; zN>S?J00rIWA+@QAs97`fR(wgB$Iu@Vhn_ST+BIo!3)s?Yo_NdJ`_m7oAH=@l6_ z;C|ldXC{5_UvJrMMMDBFGQRo_yZ=}qV~ao`?koKY%?xSjgHc;x-2+8T4`0^RRh%5+ zwo%!#i7nZ4q!^MZO|g;MYIn^94r8Wo`d~W9hnsuDQNGS_@tqshyN~7ZM5Q-6CrYE! z#o~%Nf?A3LLnKaqiHP5LnE^+wpWXWBIX;=o$YSMiDv;cRn8PwqkfF`N=c#u^O%zan z2C|?B&eALLic<6tdopGF$YMQkibjt6Q1x2u?vF0Wz;4wQKt=dc@!tEW7N{vLygYCc zczH4r0S4O_6q}GhfyY*%mw#GJ*bmu&11=FGyPnO4OMn_xZ_KYB8l?0^ScpWWNNlgn z9Z>ZWThS)ax2>F*&<_xQ@dxs}W3j=3f4T^toCY0N4xZVh`X126maLV;G8mXHR(<%R z)9EgqB>!yf^i+~82Co6>a(oFQ;Ez38*Wg()*M^A922Y3vH@!r@7QV#>t4o%#@F=0iN$}( z!X!|{87W*1>!f3M?pN`UcaMV%d#2Tpk@1D?9_rMnQzV2L?Y5?JETw-^M&Tp#h3g-e zOmY!B|7kpq2ObUh?v(M(XQmIT@l2s(m5@FWq_KE64{Qq2&nHb5UCP`(1;mPJgb_=| zI^M$AxV?!hh8bya;cjUm{)Fc?671jgo_m)bY0pM&1g5OvzS4X>uwI=kF7~_I0bDgh zB^SKZGPI4?W@2?`qu?1fds*Z0;=YspGTtIAmnj=s1$=Cs_a$WHaPQ>sL=U}u5#I@( zLQXDW6U>37W=;P0P-+wpP$@bXs?b`3D6?3tx)$cIh>7Q_vkYd z-Mcy?E1Sjs*G+aU^Tc%T!;x+@Ptlxlq-Kmw@?>FtW=|65idb6T|3+N(mAZet3q)s0 z=Bo#P0txP7j+&g5j~Cy~qeb(`_ls9foC7E6rN{@+dz)tox#@BP)WPh*na^ zG>+HTwqL0768^TNp-cZ^!uaOZCV!mMJ9^GuQH^S>26lNSJOM$ddpT-uR_bVRTV6YH zXonhdzQ*YB5T<3nf%77)#CkP_f@2WGA#I#emvq=-VR61XDB)b~KM7Q0_CqA%)pqY* zZ0khcYi_=?d9gTJf%Q%DLl3K@HFVl;vQmgqryH~zAb#0FY+I5JiMaI0yA4oaz&74@ zj;S;T#36{@m1x+WkYg;lanbdeKEH&kzp@JJJF%k$mD#Zqtc)7)vF}TWOdG{{5H!cK zfP{#krt_N@J1DQA?2DZ}6dGO>P?aU#i1sbnxUl&Mfqq!mp(zm7hyeSe@(nPj^hm-2W6>qE7jLt0N7YkI$>&$`VpUoqB~` znBIsH&2WIiB_Y(yaVQe7U$|xtNaoDl3duYBcHlL}mRf}cTF7rLJcC~x8@(G3%uBeu zaDK=cUfn?fehr*|OYu}FsCa8#COh>m;s$zSYoacKThcd0E*N{buf_hrD2#m@s=^hP z!+DGgU;Ajs(f!~FOF9KP1Sj1VbADu`ud!N8Q@_xn{!>$2mN-(gpg~3nux0N1c>hI^ zd@bSe&jaW&G~XvYF@SN&3BPWH>7WOvx24^md5;9}_g|zQ5jj@Qd-%x4MK%8c;*v~1 z5yZl9P8E$;5K{~Vp$7%Fl}|_ z%sJ+yZQ&yi%B?_b1FNE8&suQiU{4?U;5LsxP}dw_wrn{^)cvbxqJ|})pYc)*mj{v) z9i~_!AX^i;}Y9Us=fGOjs8(}&w3Sx z>(s?QN2?c7t*xl~S0!B?n|=Ajk#$Uo@1bJ3&Thu&q}oLFz{Or(b;FOgqJ5hMEF|lr zPJB|a?|jE8s)--{e^m6$?$SkfR(;eLtHR#ryEQIH4mK}SBSrMs|1S}}iJ95yceNr#^jwi1%OE}8wU#X0pX~hT zl{c*Gj?~Mm`s9n$)?4^l{UNogFkC+YoK?zPS}A9MR1y5|xf#{rZ`&n?wD+vMCjTp< zM{>=@`HK&KJGQB;Z(QSURO24|0~SgL?!8;Q(MRl;B47&kPcQpr@tz(>_77zym!75Y3=OEDHyo% ztUO_tW0zT#$sLYP5oNR;9JTH8Y>jz7zN~K=#MJXGEnxGmYJ2=Z{=gbDAu3cdz~Zu` zZ*^CLg}g538M>W0z<1S||;>aDUnP<4Jd;^4eIZ4xle`g4lbZLg_y@WS-^ zLIHQ%o2oCj&45{K+xCUl5-EsW4VSBiQ zh5Gq7riAgr0-3VyyVuybnsT zDt4P%NBw5Yjj54jWN4se>vNao8WTytGxG_}?C-;)`;imR*L*ziX~5mIYpcqYtpG=h zD0HCZe*iL)L2~{-u$USNi~k2*$052b8@1bRO25!88T;1LH2-0I6(iPAumC#|RvZeK6Sk z+F)&v$c5)7h{X?+t%Vbv@QXA&EsvuWu*zo0f=9#rLJ@;EMUle!9}$n4?MN`9l@ zp(;p%E9k$^gj`u-#+LB-x_JXdB1=DvDgRq#itn;7FLiXd^MEK(ifYR z?TohM+29V}i}2Hb{n9HYkVcz%EH7(h!M7EZza{V97$MsZtd1bZ%*cZn61BWNIx3o@ zib}ab($AAEflyqDa#Y&n-QR{^JFT!PI1H?)js9KZt={cMZCn?)-R4h$0*LGqVbu?C z>$hQ5M^hgPp+EM$=sR4wgz1z_n_dJ-?*^?9I=-_weOv4kH+fP>cnZvg1k`r25I|jT z?r{ASdY>G)VPoOMG0;F5h*tVFr&z>B=KEUAscv~LV`OG*o*&6*o zCw!+yEm%$7)A^o-H`iG9pPHC1ovqSRx6cad;)<})k^_LJ(W`DA(+C-tdGW}1x+5OR ziL&s=!!If1(=M73^6=G5#lg6S*vb<5cJv@CpirtUNT4j|@LkjtV`W3JoqpT#izB92 ziO|m!?wK-Jas0(=+0asQFk;6b?d5ly;`0tGo}x`Tpd>!{ zw}Zb#CA~U#M6%x6WwU5ma~NRi1U4f;51D43dJ}F zlfgKM5U_x7ZV#khRv@Y-KlnA`pndMFZ2@lK$tTEGFwR>$m+ih60ow6V(y-X!D29Yo zy2HDlPJ+PEZ^j)+P`JI+X%D0ccy_9){@G~%@#iJ0f4cfY0B+e{TO%u~#o~z$BRyL4 z^$Q0tI{ge8pnB60gu7RHe*0Tu!Cs4l7HOXj;N5;_aQoFU$$7%{m4N+n(?)Un^0!Di zxc7BeS69ozck+}(%RQ(odIcp@st++M2_lY4E3#nx@X3PY`*GjcM}WVu;q!t2W(ods zqh_AY#OcwtW&MLd?OWiov*YO-EG*n&E$(-jIjTGr>>c?vK*`|CJeZFnu=myC%5+|z zyAS$RnvQ0!Teo6;LtXd3(%s6DiMxU2+lxBK5JwNam*Jyn;#1Le|75#M335>}iZMrn zZb)cFeoDTqe@po)f>f8M9+z*Hsixwln>{E>!snL>4i^uN&q=5511eszth)E=Wc8T) z)skME`@zfiJXuQzwO8}a6+B_Iem6rcoEhJJ)1J+95m9)*S+Gabb|Gv40phc#k@gtM zMKja3d-y(y8Z>pv`=bPOR%l}a| zoD-ZKu_?jrf-L@YMX(nlx&D~H`CYQ0$+JK7x+Okxp^M-isCT~ThLKhUb?XMLGo5IIKj%fG8%hQu(9(}J#cD-F)r&pFr zzk1CrT75nr@2VCPYSp9k8aUGvs;w1j^-FfUYu;e^mvnh2E7RcPRWLl9mr}V!^E~dB z0kt%FHX`tyhXJ+@$L&FV22 z?Y?Vb_3m&1wf$ISwXN)LK*fy4m)F{}R0ecYaN~ZGqNO6l#nm8~15Qn-xDe_yCQTZ8 z>_NXqjvPrgZIQc?YA}u|CGbreuytV4CW1`vNhZ_sm1JAdLRKRwd%~{h(uoWF@e|F-;a@k1hZkbj@iG6NKtgcJfcB5>RX*7=_ad5H> zLD~}8&F5b)idU&B1WRn2p%YxkdkmeNy!6l{a(oei*78pXfHrPTEZ*YPtV3-(4H|!L z9FY=*@6}&c-kQ%ywOxV_7^IKz#7=e*c}MH2tloqAxP?{YPN`7p!d*$TS=HRj4eg?k zf*yGmRj}EQh9A7zQ4GUyJs_bdZg6NAWAIP(V=Zj6cV)rk-MocGZa zBD8g-X0CZN0Ck@ED#S_R{1H5P-rWvn?#o%M(KpyN93%Rh^Ug`FHSQ*J1ILAoND$!9 zWMn=u5fv29PGkVH0Y>ZamDA=m&?l5eQ>6qs>P0gS!?S>~=f@X&6%et;`}k0To_Q6< zVSVa%V|}>C^l<6uIJiDgGBX##yAVfaI|IUhgH!sAR(yh?MRq)iasM(IC%R35o-aQc z_u>U>WlMpERr2Od@E+&r$;n$b2s?fh6(MnqdIP8Bx=s^sq$Y=C{trlxW1}+M@hJuZ zk^9}`YmA7vc-y_^VU2O!$0870vrO{2B( zez4Gpp3w4-IGkazmpFR=Wi5!^HbW-BCyoJ+F)&_^VDju_p$W?Tehcz=o()x?nK+p| zudH044lH%#jW;$t0Ji>wiW%#i>+Dl^a_NY)%@zO4H<+ugcG)=dl5$AKYgO&#)r1-{Z0k_RJQwXUVMP-=lQ&xKi-xbX2I(- z&9s(LDNlF*&`XcffWjmDue4X!TV@y@88O8&>QE)urn9>9!;dpqv0gew}JrXam&WkHU0V4 zdcw8&*lmH&K9zr^xO~*OV!sgu`A}tNsL|dJrywgSD(c|xP!dTY^{aTyTT;K(WD8$y zDtiS?|IzL)mef^5s}XB54i7$GWJ43tTEn?j;Zi;VAm7n|VbPd0&CtOmyRv{=`?nc4 zX1pF^g~3H?>Nv}btnsLxT=L<^cT5LcMo!jfBs}JgxzP9gBpYWA7NzhBm@%bx-al(% zxw?xNl|Hcy@z7ROxtxTJBdQ=e!n+6^Y+65tscn?wCYRp!&uX2q~H~UufU@b!>Q2 zeCCslo9_PQ$kmN^^S8xoQ2_PEZ?54J9leA{;9oCa+5n5qiHRCX769j2m>02dKfckV zqW6Tm50!=07&^blFViKk?2Rp5%9a@HkE~rVRA;biv*m-J?oWtgAmQ#sNH3@ExR4+( zZ<--Llp=C;V>$afv~ttDzs;ZQiEGIWkeK(UiDf3m$3|o3AYQau(r{ts+`^CLgqPTd z)Wh!)!4;DbXF;4ttxHP2n{qHCGQH1?`qQDQAXUiMZ|C zxAH9E#2^~o(w>C3!=1Y`GUvX?*)PaGl9j#=W%;897x@AM#fQAJ`5JAh00H)b4=iWD zm;spg*6$D*N@>vgdqdrg(l~rqi>IDFGYb)Vm+NUSgJOm5eCT&!MR=!vzaPM)we49T zVmmwxZp!}6FbQfMm#rbL6;ii%SK}f|7Ed2Pom>LqhIb*M1%nFd&PqdyB z^eHA*Cxz;OS!fV3$=!yGrI_86xclALsst3%uv94D&uNg}Hp?CD1dQK4+mLd$)Kw32 zxktey*Wap5gLdNu@Mv#)zS(;-4gU3R|GqsqQRBt!IZNlR0IwV6yLF|w%_sjuDu9$5 zQG3{CKGm|RvuP+FRboGny*`^xhSWnAg~P8B-YUrfE+D%4-pGyQ3s#ndid}NWq=d{+ z2|#ezX(qN3JaQ69r<36t$#WrjEAJ=5i0St zPTI*$3iAp;MMXA0-0+Ari2DgSIwZFL!W!lfQa<3qcBiwr?#RkZ|R`It|@p2ugf5udpCDq_FI(t>|7Qj?&OPJ!lhm&gQk@10e0#x-X zEyS^kCHA%8ILn*oOqQK%3DM#bAdYVYuhqSaQoWhfIK+yiitxDEwt#odH<4 zbzE2f%wX4NFrf|dg?ZXrA)7Rhx)NUOYfIvden}?L3R|31s7{BVZUkLGOh_?A962eg zMEv!tsGo{}I58Mfy}fp}XWqeC6ceD<5jBfY!WON%%oozBxa}C5EMsN#x;m~;%4cUR z$k>j(vn6yL36~cdhLS@`X31mFl6l7$aLodWn4sG~)~~JEx$BzU?7pg zF3C)?p@R;CTem#_R*R+x~eT@DufA#WNRd-7UP{2J5?QG)a1TWJ;q%#V4u z=izzT$rJ`bG4%cB^785*JC%K}e>2&ZL3r8o_UiMhN4wCCm&sB{UzTQrJ#GZ0Uem0d zo%Z+lJMwL#U^dIbCoBxSX{Liuj=3?`(Ip|xq2D*E95jrwOOToPiKxCbUn5%T+N#N% zk0VKRWieje1ly2*jijG_`=idP7cv0Ph5}3`PS)u^3;Eo@jx!e6?9RFXF(R^r;Fc>} z46d%)X&zxiOOL_gw<>TALh?4R#*>}CUyO^E4%aFe$p_6k$ZCn!y@hyijKvq3c)j`> zt62sfHAIR{2>nx&PyyDac~NT?K`6#iS1YA+u<1 zr74jTHz<}{B_{zCe5fymh;Re!tJ+>pA9XnjIvd=D=ORYWKdG_r;y6&p^M6x;qggvU zY)zf|xuNTy`0e^({-<8T+_~E=Ng<^Ak>Sa8jwEWe__gDu6uqogyOu8sn9Y(`JVOnx7Z2kk z4m~7<)|^Di^;epbPyymT$iqjcXGXi|BFMC*EzR417yRJa&P7yQO_ndWU8Tiv;3(Oy zI_)BPX);qV7cj)!i`d9fV;1({M2uqf2-D{Y8 zR4qVwFuaS@R3Kd${3SC>V2L+OssXMo*o%YVqt9t05NGB2 zhMMRpsJY(1?~QijRRr3rVZj4NfYcW^0wRc!#~Au2WWB_dA;zw-Jo>t(oi z{Y8j-3IKrKptatxs)^rO5WqI*!qoUFhEIyffr zH;D~AEO2Gcv0rB9`^&3*tls-sH-|v>K*uGpsO+cKY!xEsLA1-tV+(-v&13z~N;2br zvTyg#mGg-^!W9uVTAzUN(bM=PgalFUR??V_^j^vHpERhPG?$Q&%jTOL4mU6MAZ!O^n7 zdz%u%kT^v$HfY(WiwYl0_-Jc!4P(CZHG@l^mL_n`OK1;(Xut~hmju6O^IwtJt zcGtUpJgjsR6lu+RF#klx_R~gF<1-IXP}dN=xUn^GfOJucg^)Yp)DV|F&Eq(^;xZx9qgbG}xo zVpSV7(SQZD0iQ_^E*{5K;GZcx(>6_%$Kp*TYhr;a8=M-8^1bhz`@>sT+xMq zqc!$|=MYfhByu!QJT^HKLnAk|#GbCS;2|i>rI9*|rDoD21zHIt8a@fvMw&4={SlzTJN$UD<<^88~ z;@wQ~e14%#wUr{&=d#Wp$Y&g&W1x)4Umsk~@75~J$0YPRE_$g(*zB}u1;cwv5YgQq zmd8Pvb%EsE;DeDPY)@VivT=tlBSbU>SH%bx386j#kepS?kG=4>1H4+=&5oU35k2Uv z^L1kOaUl9B`G!yEFw;6|j-^^Fk4T3%@E1LNl;@bzZ0hkeq!4 zBL%P`Wc-`_l(P`4`0>qK;8vM`A1bQJ7Z$P6N{&|XN%Wy!WxK`+w_B7j4X&110N+~( z6+0)>WAyMFokSS+Ae>b-8a0+m^1VH)Y$oCZK(!=nMkLcvO$_d5@adHr_Iasb?^>44 zR52Z@5_ZN7}v&#dFyFcyxpq@cE?w3*6`OxIbt!2}s7UV_kw&S|u2| z3AWH2mdvEJc?bhY6&f5JwdqRWl1N{mQ&1<~4r!8xqjJABrWdzhr8Kn_(4X)vC zY>&b{Cmq^~%@GHyTxP&&)@UmtXLv#H2up~5S~d*Rb?u{S1_dEM7T|oUy zigCjmxy@r<~IOmq~#z6rf6{L!eN6fj<;I9KJh$Zg~&s_s`VQ{T-=8G4k-E`t`3_D-2bqv z<065bULH9PV(=np?`}^-h9^~lGeUc;q3*(j6i;@_`cvn`9{69cO7_;wDTetrB ziBB0ayBdzzT-cUr>5Zu`Um4@1xNHbbo&bD~18o3kzutOXQJHv3ta-u}7mrbqVabbG-#jIUwwTc$x?-9p3L zoiAeFrT?h?(zQ+YBuTtVg38$KTVTO$&uOPXmnTPVrH#qs1u&BU<~lrX{0yq)LC2Yq z>o7BkAH!$i~hlgsv{;mk~a``Kk6K*B@)fSCTjoBgn76; zW-uH_>N!*X#7Fm!zY!%*bi0C(Cc^zlOGrq?RvE^NQ9Oo~;u*s#16;4%zu9^mgtfHBl1ZNm)rn>z2|)s2?I zNu$(X-nP%WV4Q?~{+`9@#)Juo!@X@5p!`Rz+2}3Ifb68%_JUb*`AKwVUa+#AM)_2O z>}!R8fZpa%#R5!qvo%m#`@H?s{-t{RznNcT%agE7HfXHqbq^NlcW$K_rcEN+#APSa zOHy|#^?zr-MfSl~#Al%FPlrT6a{7OL*KjEneT8p4Aap|;rhU-#Is5aWqiVJ3VVkf?(dzw(!R@li+?STwHZo|XT!`c0w z!Y5BFkP(Nuh&D!-Cnz_xGO3Z7>wp$u;4}$aDP;$`+2tZeLZM0ltM2Y9ez76;iqAXr z;`qR=dVj4XtARi|b{1^8YyqxFLbvzpUiF6A{bSYaNJ8*t9dkR8t6RmpQ+1lPP;CM*Xb`?PuSHFSQLH^Alt<{iB zGCx%ZXk%km-a@ih&+D#|GyvS^s;QWZWgNEPUxZxlIMUaJrSXzxd-3`rtU8XgMq!=i zQdY#mgnSexZ;Hg zs09VjCI^<>>Lzbm0uoDpY2M*(9XXr;=8<%?#C~I9Gx5Qy4E<%@joJyJO2~KU(i10Z zJ5J`K-)8NPuo)MCqJm!YXYcjSxZ?@q`hzgP3f(8sZSUtiU`n+bsk1A2V8u zC-u+dx|yqHm4*BF*Tg`&pOGI@3WH7w&An|6Q85~_A+N6A2mipx-*PN~^>ML$55C5E zcJv@E!tJpmVm&Z1l4b0%%<p)F1458HGDsi9(TczX~r;B=D1< z6R#<_K|>dwu5=5>2mR`%;f&7($XtP7w8%{ol7y-3 zh6et)eHixAfy=de>{N!2x=}K$t&zK5J}Cu5v-k?Ec~_&0AS&|+aZ3MZxlp-|p3dAj zd~7C;0Q?3q;#mFk@)o~J--nMmYYyKFhFI;6SJo{&R>x&q$3S7l%xVg7)~o1$Ud0_y zJ(kCScL$D*s>vRG&cGDu8WR4r&#@|R#y*)i>v}~E49R|h4+|26;yfE4Km6yjA{69j zMJ*TnYLWbu_22m^?_OyV^IxOo*5#i~N;5=ub%z`NGGR*@95u7vz$X8<)W)a-rzMFh;Fc<~v_5PL1~W=w=`7 zUSXmxb#8(&c-(e)oZEJVQ9U@&(^~4DUp>*eROy9+%WEsmV{8gzgP%=yUgZ%Pa5=rn zH~}rd%CXJLcO}{5wSD_SL@KH}#0RLlCrR3qQj#OfbgBopnYmO2-41k9r^EjM+6gJ4n`LASW#M`iOHT;D%XPoinfU| zY1cOOxlubtcwRI!%sE~O3I%HNoFZWf8b(Xo`uBK{0>JvNPiqTNoD@+`*k*}U+bK#1 zXkX_S^8QTfM=Tt9eLRAX#SF+Hopi8u6b`f+8j!6{vk_@>>4ix5d{43N#Oso{`-y{?v;31q!Pe4f3W{Ra0MYuc) zQ>C49puOj6{dyE75Gr%|Jw*f#%rqzW%a3vNOV`mHrAz7l&pK54#u1M!ytq#mOzMP- zCMepqvkKA`PnZk|jW{0GB`)|@0T9rCPXuN#X)i&T`i=Sr0L`ir^-hzZ5_ubl=HeY< z)`|##8o(LXIo1vIpA2FdvS?#QnNZ!%s@jZomWG)A3keNBzS8yB;}D5tF0@TSVL`hP zhwmTEgp6Z$;{p}smz1K05(DNl!4LpFxvSjs!;aC9*)B0SfX@?4Z;i*>cKiV^`G;w7Wid9aRZ>E1U zLUUkHu1YsPYeBJ3g3a$5Z86vZ?Y_=m+w`J7>^}Raap%J>E#9I9Kxp6iHLCQAYsTMD z87k`A29XJRe9D+{^PS0w9v}&Q^b@wMq#p@3dd7MAB1c|_M?6ib0a6MvwVe8B;q%tJ7|J!_ zJe?6yyzZxuWmW>A_hw(6XFWC?C#P)w9Mb?5t$qXw+s=%`Gzk9ur{$R{;a0wnIpRws zpO6x1?22;Rbg`_=j;Fm+DUQ!hsK%_k&dAma=V(~We4Yy-x<>W=;88BcJpVAAy_GTd zlp;y8d7$E*oV(f3I?pFAbFvo%<1S$A`g;PeoAcJ(ei$CSPUQmBg!IRcAjE=@YFA0k8zC2Hx1^~0w=Pf+fcMlJ{bv~i7&sZ}6h{hKD zWA)gVh#%kni2;iuYvH{M`IF1a^h=3w2vA6u4tx9jmMVCGNBlX3Oup3qGhHK5o^ zFLq$2FLCgf)^ltdXRkI0OP2>`s~XucF#{55oe+}lc2~o67jWfhfB6kOc%Ap?@SR#Wt!6uB$zqy|JIXLZ|wu8=_1Kto6K_{$GP5WFE=e0HQ( z&UpPUo?x5D-ZS9~&J~w;jdJ!~h+cradJ8AamTH@j31I)~VxQcsJB(xRs!B$!;IBm* zTD_Ohqw4x3-wn0?Cawp-pi9c9FLvQXWoIv#0S+c^yz*rGs2;;Arr`-QJe@)j3FGjv zd_*@(=k5a!bS5+2CVzvI&VE{JKIB3iP1Q?c$pY113&Pd|NaSvN zQ;6^lSU!4aV$ASp4z~Amo&U)JDTM5WgXP6)D0rFJ`rafKYDaZ<1P7XySi%0DsxbhL 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 literal 0 HcmV?d00001