From 0ead042087ebacdd3ec1e61c918a9c17e9afa21d Mon Sep 17 00:00:00 2001 From: Thomas Svedberg <36861881+ThomasSvedberg@users.noreply.github.com> Date: Fri, 23 Mar 2018 22:54:17 +0100 Subject: [PATCH 01/35] Update sensor.vasttrafik.markdown (#4986) * Update sensor.vasttrafik.markdown Add new config option "lines" and extend full example. * :pencil2: Tweaks --- source/_components/sensor.vasttrafik.markdown | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.vasttrafik.markdown b/source/_components/sensor.vasttrafik.markdown index 0217a91c6a..8f3862fdd8 100644 --- a/source/_components/sensor.vasttrafik.markdown +++ b/source/_components/sensor.vasttrafik.markdown @@ -13,7 +13,6 @@ ha_iot_class: "Cloud Polling" ha_release: "0.30" --- - The `vasttrafik` sensor will provide you traveling details for the larger Göteborg area in Sweden from the [Västtrafik](https://vasttrafik.se/) public transportation service. You must create an application [here](https://developer.vasttrafik.se/portal/#/applications) to obtain a `key` and a `secret`. @@ -34,10 +33,11 @@ Configuration variables: - **key** (*Required*): The API key to access your Västtrafik account. - **secret** (*Required*): The API secret to access your Västtrafik account. -- **departures** array (*Required*): List of traveling routes. +- **departures** array (*Required*): List of travel routes. - **name** (*Optional*): Name of the route. - **from** (*Required*): The start station. - **heading** (*Optional*): Direction of the traveling. + - **lines** (*Optional*): Only consider these lines. - **delay** (*Optional*): Delay in minutes. Defaults to 0. The data are coming from [Västtrafik](https://vasttrafik.se/). @@ -54,5 +54,8 @@ sensor: - name: Mot järntorget from: Musikvägen heading: Järntorget + lines: + - 7 + - GRÖN delay: 10 ``` From 63746ddee5cf5c7c4befe8df1c8113259916399c Mon Sep 17 00:00:00 2001 From: Ettienne Gous Date: Sat, 24 Mar 2018 19:39:13 +1100 Subject: [PATCH 02/35] Update default Pilight port number (#4976) * Update default Pilight port number Based on the Pilight docs targeted the default port is 5001, As started here https://manual.pilight.org/development/api.html and in the original Home Assistant doc I think they did a big refactor late last year to the code base and docs. * :ambulance: Host and port variables are optional * :rocket: Trigger rebuild * Remove optional configuration variables * :rocket: Trigger rebuild --- source/_components/pilight.markdown | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source/_components/pilight.markdown b/source/_components/pilight.markdown index ab841bbe83..2e7e1b0150 100644 --- a/source/_components/pilight.markdown +++ b/source/_components/pilight.markdown @@ -24,14 +24,12 @@ To integrate pilight into Home Assistant, add the following section to your `con ```yaml # Example configuration.yaml entry pilight: - host: 127.0.0.1 - port: 5000 ``` Configuration variables: -- **host** (*Required*): The IP address of the computer running the pilight-daemon, e.g., 192.168.1.32. -- **port** (*Required*): The network port to connect to. The usual port is [5000](https://manual.pilight.org/development/api.html). +- **host** (*Optional*): The IP address of the computer running the pilight-daemon, e.g., 192.168.1.32. +- **port** (*Optional*): The network port to connect to. The usual port is [5001](https://manual.pilight.org/development/api.html). - **send_delay** (*Optional*): You can define a send delay as a fraction of seconds if you experience transmission problems when you try to switch multiple switches at once. This can happen when you use a [pilight USB Nano](https://github.com/pilight/pilight-usb-nano) as hardware and switches a whole group of multiple switches on or off. Tested values are between 0.3 and 0.8 seconds depending on the hardware. - **whitelist** (*Optional*): You can define a whitelist to prevent that too many unwanted RF codes (e.g., the neighbors weather station) are put on your HA event bus. All defined subsections have to be matched. A subsection is matched if one of the items are true. From 491c79598dc40e2bee6bfd1993ddeb4979cc24be Mon Sep 17 00:00:00 2001 From: ChristianKuehnel Date: Sat, 24 Mar 2018 13:50:17 +0100 Subject: [PATCH 03/35] bmw connected drive (#4947) * bmw connected drive * breaking change * replaced country with region after API change * fixed brackets --- source/_components/bmw_connected_drive.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/bmw_connected_drive.markdown b/source/_components/bmw_connected_drive.markdown index 21e7e04ecf..398a922db6 100644 --- a/source/_components/bmw_connected_drive.markdown +++ b/source/_components/bmw_connected_drive.markdown @@ -25,7 +25,7 @@ bmw_connected_drive: name: username: USERNAME_BMW_CONNECTED_DRIVE password: PASSWORD_BMW_CONNECTED_DRIVE - country: COUNTRY_BMW_CONNECTED_DRIVE + region: one of "north_america", "china" , "rest_of_world" ``` {% configuration %} @@ -46,8 +46,8 @@ bmw_connected_drive: description: Your BMW Connected Drive password. required: true type: string - country: - description: "The country of your Connected Drive account. Please use the exact names for the country as listed on the [Connected Drive website](https://www.bmw-connecteddrive.com/)." + region: + description: "The region of your Connected Drive account. Please use of these values: `north_america`, `china`, `rest_of_world`" required: true type: string {% endconfiguration %} From 786949d0a27fc145135c78fcb1afc54b222ed533 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sat, 24 Mar 2018 23:05:31 +0100 Subject: [PATCH 04/35] Xiaomi MiIO Fan: Xiaomi Air Humidifier integration (#4829) * Xiaomi Air Humidifier integration. * List of supported features improved * Device independent service descriptions, missing model added to config schema, structure * :pencil2: Corrected brand namings --- source/_components/fan.xiaomi_miio.markdown | 266 ++++++++++++++++++-- 1 file changed, 239 insertions(+), 27 deletions(-) diff --git a/source/_components/fan.xiaomi_miio.markdown b/source/_components/fan.xiaomi_miio.markdown index 82e95feddf..8fc9da3211 100644 --- a/source/_components/fan.xiaomi_miio.markdown +++ b/source/_components/fan.xiaomi_miio.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Xiaomi Air Purifier" -description: "Instructions on how to integrate your Xiaomi Air Purifier within Home Assistant." +description: "Instructions on how to integrate your Xiaomi Air Purifier and Xiaomi Air Humidifier within Home Assistant." date: 2017-10-13 12:35 sidebar: true comments: false @@ -13,35 +13,161 @@ ha_version: 0.57 ha_iot_class: "Local Polling" --- -The `xiaomi_miio` fan platform allows you to control the Xiaomi Air Purifier 2, Air Purifier 2S and Air Purifier Pro. +The `xiaomi_miio` fan platform allows you to control the Xiaomi Air Purifier and Xiaomi Air Humidifier. -Currently, the supported features are: +## Features -* On, Off +### Air Purifier 2 et al. + +* Power (on, off) * Operation modes (auto, silent, favorite, idle) * Buzzer (on, off) * Child lock (on, off) * LED (on, off), LED brightness (bright, dim, off) * Favorite Level (0...16) * Attributes - - power - - aqi - - average_aqi - - humidity + - model - temperature + - humidity + - aqi - mode + - filter_hours_used + - filter_life_remaining - favorite_level + - child_lock - led + - motor_speed + - average_aqi + - purify_volume + - learn_mode + - sleep_time + - sleep_mode_learn_count + - extra_features + - turbo_mode_supported + - auto_detect + - use_time + - button_pressed + - buzzer - led_brightness + - sleep_mode + +### Air Purifier Pro (zhimi.airpurifier.v6) + +* Power (on, off) +* Operation modes (auto, silent, favorite) +* Child lock (on, off) +* LED (on, off) +* Favorite Level (0...16) +* Attributes + - model + - temperature + - humidity + - aqi + - mode + - filter_hours_used + - filter_life_remaining + - favorite_level + - child_lock + - led + - motor_speed + - average_aqi + - purify_volume + - learn_mode + - sleep_time + - sleep_mode_learn_count + - extra_features + - turbo_mode_supported + - auto_detect + - use_time + - button_pressed + - filter_rfid_product_id + - filter_rfid_tag + - filter_type + - illuminance + - motor2_speed + - volume + +### Air Purifier V3 (zhimi.airpurifier.v3) + +* Power (on, off) +* Operation modes (auto, silent, favorite, idle, medium, high, strong) +* Child lock (on, off) +* LED (on, off) +* Attributes + - model + - aqi + - mode + - led - buzzer - child_lock - - purify_volume - - filter_life_remaining + - illuminance - filter_hours_used + - filter_life_remaining - motor_speed + - average_aqi + - volume + - motor2_speed + - filter_rfid_product_id + - filter_rfid_tag + - filter_type + - purify_volume + - learn_mode + - sleep_time + - sleep_mode_learn_count + - extra_features + - auto_detect + - use_time + - button_pressed +### Air Humidifier (zhimi.humidifier.v1) -Please follow the instructions on [Retrieving the Access Token](/components/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token. +* On, Off +* Operation modes (silent, medium, high) +* Buzzer (on, off) +* Child lock (on, off) +* LED brightness (bright, dim, off) +* Target humidity (30, 40, 50, 60, 70, 80) +* Attributes + - model + - temperature + - humidity + - mode + - buzzer + - child_lock + - trans_level + - target_humidity + - led_brightness + - button_pressed + - use_time + - hardware_version + +### Air Humidifier CA (zhimi.humidifier.ca1) + +* On, Off +* Operation modes (silent, medium, high, auto) +* Buzzer (on, off) +* Child lock (on, off) +* LED brightness (bright, dim, off) +* Target humidity (30, 40, 50, 60, 70, 80) +* Dry mode (on, off) +* Attributes + - model + - temperature + - humidity + - mode + - buzzer + - child_lock + - trans_level + - target_humidity + - led_brightness + - button_pressed + - use_time + - hardware_version + - speed + - depth + - dry + +Please follow the instructions on [Retrieving the Access Token](/components/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. To add a Xiaomi Air Purifier to your installation, add the following to your `configuration.yaml` file: @@ -67,6 +193,10 @@ name: required: false type: string default: Xiaomi Air Purifier +model: + description: The model of your device. + required: false + type: string {% endconfiguration %} ## {% linkable_title Platform Services %} @@ -80,37 +210,37 @@ Set the fan speed/operation mode. | `entity_id` | yes | Only act on a specific air purifier. Else targets all. | | `speed` | no | Fan speed. Valid values are 'Auto', 'Silent', 'Favorite' and 'Idle' | -### {% linkable_title Service `fan.xiaomi_miio_set_buzzer_on` %} +### {% linkable_title Service `fan.xiaomi_miio_set_buzzer_on` %} (Air Purifier Pro excluded) Turn the buzzer on. -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | -### {% linkable_title Service `fan.xiaomi_miio_set_buzzer_off` %} +### {% linkable_title Service `fan.xiaomi_miio_set_buzzer_off` %} (Air Purifier Pro excluded) Turn the buzzer off. | Service data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | -### {% linkable_title Service `fan.xiaomi_miio_set_led_on` %} +### {% linkable_title Service `fan.xiaomi_miio_set_led_on` %} (Air Purifier only) Turn the led on. | Service data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | -### {% linkable_title Service `fan.xiaomi_miio_set_led_off` %} +### {% linkable_title Service `fan.xiaomi_miio_set_led_off` %} (Air Purifier only) Turn the led off. | Service data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | ### {% linkable_title Service `fan.xiaomi_miio_set_child_lock_on` %} @@ -118,7 +248,7 @@ Turn the child lock on. | Service data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | ### {% linkable_title Service `fan.xiaomi_miio_set_child_lock_off` %} @@ -126,23 +256,105 @@ Turn the child lock off. | Service data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | -### {% linkable_title Service `fan.xiaomi_miio_set_led_brightness` %} +### {% linkable_title Service `fan.xiaomi_miio_set_led_brightness` %} (Air Purifier Pro excluded) Set the led brightness. Supported values are 0 (Bright), 1 (Dim), 2 (Off). | Service data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | | `brightness` | no | Brightness, between 0 and 2. | -### {% linkable_title Service `fan.xiaomi_miio_set_favorite_level` %} +### {% linkable_title Service `fan.xiaomi_miio_set_favorite_level` %} (Air Purifier only) Set the favorite level of the operation mode "favorite". | Service data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| -| `entity_id` | yes | Only act on a specific air purifier. Else targets all. | +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | | `level` | no | Level, between 0 and 16. | +### {% linkable_title Service `fan.xiaomi_miio_set_auto_detect_on` %} (Air Purifier Pro only) + +Turn the auto detect on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | + +### {% linkable_title Service `fan.xiaomi_miio_set_auto_detect_off` %} (Air Purifier Pro only) + +Turn the auto detect off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | + +### {% linkable_title Service `fan.xiaomi_miio_set_learn_mode_on` %} (Air Purifier 2 only) + +Turn the learn mode on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | + +### {% linkable_title Service `fan.xiaomi_miio_set_learn_mode_off` %} (Air Purifier 2 only) + +Turn the learn mode off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | + +### {% linkable_title Service `fan.xiaomi_miio_set_volume` %} (Air Purifier Pro only) + +Set the sound volume. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | +| `volume` | no | Volume, between 0 and 100. | + +### {% linkable_title Service `fan.xiaomi_miio_reset_filter` %} (Air Purifier 2 only) + +Reset the filter lifetime and usage. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | + +### {% linkable_title Service `fan.xiaomi_miio_set_extra_features` %} (Air Purifier only) + +Set the extra features. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | +| `features` | no | Integer, known values are 0 and 1. | + +### {% linkable_title Service `fan.xiaomi_miio_set_target_humidity` %} (Air Humidifier only) + +Set the target humidity. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-----------------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | +| `humidity` | no | Target humidity. Allowed values are 30, 40, 50, 60, 70 and 80 | + +### {% linkable_title Service `fan.xiaomi_miio_set_dry_on` %} (Air Humidifier CA only) + +Turn the dry mode on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | + +### {% linkable_title Service `fan.xiaomi_miio_set_dry_off` %} (Air Humidifier CA only) + +Turn the dry mode off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | yes | Only act on a specific Xiaomi miIO fan entity. Else targets all. | From 4bb87848f9befa992ff4b171a9c47e64897a3858 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 24 Mar 2018 22:25:22 -0700 Subject: [PATCH 05/35] clarify MQTT dev tool text --- source/_docs/tools/dev-tools.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_docs/tools/dev-tools.markdown b/source/_docs/tools/dev-tools.markdown index c9cc6a4c28..99ce3e7cf7 100644 --- a/source/_docs/tools/dev-tools.markdown +++ b/source/_docs/tools/dev-tools.markdown @@ -94,7 +94,8 @@ For more information about jinja2, visit [jinja2 documentation](http://jinja.poc {% linkable_title mqtt %} -This section is only visible if the MQTT is configured. To configure MQTT, add `mqtt:` to the `configuration.yaml` file. For more information, refer to [mqtt](/components/mqtt/) +This section is only visible if the MQTT component is configured. To configure MQTT, add `mqtt:` to the `configuration.yaml` file. For more information, refer to the [mqtt](/components/mqtt/) component. + Even though MQTT in general provides deeper functionality, the developer tools section of MQTT is limited to publishing messages to a given topic. It supports templates for the payload. To publish a message, simply specify the topic name and the payload and click “PUBLISH” button. {% linkable_title Info %} From 330808127df8a577e1886d4105ab29df5e5c6f18 Mon Sep 17 00:00:00 2001 From: Patrick Hofmann Date: Sun, 25 Mar 2018 22:22:17 +0200 Subject: [PATCH 06/35] Documentation of new HomeMatic lock section. (#4537) * Documentation of new HomeMatic lock section. * :pencil2: Minor updates --- source/_components/lock.homematic.markdown | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 source/_components/lock.homematic.markdown diff --git a/source/_components/lock.homematic.markdown b/source/_components/lock.homematic.markdown new file mode 100644 index 0000000000..d536312e2e --- /dev/null +++ b/source/_components/lock.homematic.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "Homematic Lock (KeyMatic)" +description: "Instructions how to integrate Homematic locks (KeyMatic) within Home Assistant." +date: 2018-01-28 03:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: homematic.png +ha_category: Lock +ha_release: 0.66 +ha_iot_class: "Local Push" +--- + +The `homematic` lock platform lets you observe and control the state of the HomeMatic [Homematic](http://www.homematic.com/) KeyMatic lock through Home Assistant. + +Devices will be configured automatically. Please refer to the [component](/components/homematic/) configuration on how to setup Homematic. From 45617ed8680f0acb1f4203d9f0952c4c001d5683 Mon Sep 17 00:00:00 2001 From: Sacha Telgenhof Date: Tue, 27 Mar 2018 00:53:00 +0900 Subject: [PATCH 07/35] Added another implementation of MQTT JSON Lights: AiLight (#5024) * Added AiLight implementation of a MQTT JSON Light * Removed empty lines. --- source/_components/light.mqtt_json.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/light.mqtt_json.markdown b/source/_components/light.mqtt_json.markdown index 6313b71e3d..9455777285 100644 --- a/source/_components/light.mqtt_json.markdown +++ b/source/_components/light.mqtt_json.markdown @@ -228,3 +228,5 @@ Home Assistant will then convert its 8bit value in the message to and from the d - [MQTT JSON Light](https://github.com/mertenats/Open-Home-Automation/tree/master/ha_mqtt_rgbw_light_with_discovery) is another implementation for ESP8266 including [MQTT discovery](/docs/mqtt/discovery/). - [esphomelib](https://github.com/OttoWinter/esphomelib) is a library for ESP8266 and ESP32 boards that has many of Home Assistant's MQTT features (like [discovery](/docs/mqtt/discovery/)) pre-implemented and provides high-level abstractions for components such as lights or sensors. + +- [AiLight](https://github.com/stelgenhof/AiLight) is a custom firmware for the Ai-Thinker (and equivalent) RGBW WiFi light bulbs that has an ESP8266 onboard and controlled by the MY9291 LED driver. It implements the [MQTT JSON light](/components/light.mqtt_json/) platform and supports ON/OFF, RGBW colours, brightness, colour temperature, flashing and transitions. Also it includes [MQTT Auto Discovery](/docs/mqtt/discovery/)) and the MQTT Last Will and Testament is enabled as well. \ No newline at end of file From e54751230761acc544b1cdce2e8251a62fa1fe2d Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 26 Mar 2018 17:24:00 +0100 Subject: [PATCH 08/35] Update optionality of Telnet Switch config (#5007) State command and value template are optional parameters. --- source/_components/switch.telnet.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/switch.telnet.markdown b/source/_components/switch.telnet.markdown index 858a0b21b6..ef1345cd5b 100644 --- a/source/_components/switch.telnet.markdown +++ b/source/_components/switch.telnet.markdown @@ -39,6 +39,6 @@ Configuration variables: - **port** (*Optional*): Port to connect to. Default is 23 if not defined. - **command_on** (*Required*): Command to turn device on. - **command_off** (*Required*): Command to turn device off. - - **command_state** (*Required*): Command to determine the state of the switch. If not defined the switch will assume successful state changes. - - **value_template** (*Required*): The template evaluating to `true` will indicate that the switch is on. + - **command_state** (*Optional*): Command to determine the state of the switch. If not defined the switch will assume successful state changes. + - **value_template** (*Optional*): The template evaluating to `true` will indicate that the switch is on. - **name** (*Optional*): The name used to display the switch in the frontend. From 50b20f06da39c44ef71fad232633b20efa9197d7 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Tue, 27 Mar 2018 20:30:16 +0200 Subject: [PATCH 09/35] yeelight: Operation mode service added (#4964) --- source/_components/light.yeelight.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/_components/light.yeelight.markdown b/source/_components/light.yeelight.markdown index e3fc28821f..b9808e7760 100644 --- a/source/_components/light.yeelight.markdown +++ b/source/_components/light.yeelight.markdown @@ -63,3 +63,14 @@ This component is tested to work with the following models. If you have a differ - **YLDD02YL**: Lightstrip (Color) - **MJCTD01YL**: Xiaomi Mijia Bedside Lamp - WIFI Version! - **MJTD01YL**: Xiaomi Mijia Smart LED Desk Lamp (autodiscovery isn't possible because the device doesn't support mDNS due to the small amount of RAM) + +## {% linkable_title Platform Services %} + +### {% linkable_title Service `light.yeelight_set_mode` %} + +Set a operation mode. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------------------------------------------| +| `entity_id` | yes | Only act on a specific yeelight. Else targets all. | +| `mode` | no | Operation mode. Valid values are 'last', 'normal', 'rgb', 'hsv', 'color_flow', 'moonlight'. | From 88c8cc2ff102f0ddc7823bde8a34016fd633786d Mon Sep 17 00:00:00 2001 From: Mikael Svensson Date: Wed, 28 Mar 2018 09:04:48 +0200 Subject: [PATCH 10/35] Template function state_attr to get attribute from a state (#4981) * Adds docs for https://github.com/home-assistant/home-assistant/pull/13378 * :ambulance: Fixes build error --- source/_docs/configuration/templating.markdown | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index d00a879b7b..5bd5d45789 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -68,6 +68,7 @@ Home Assistant adds extensions to allow templates to access all of the current s - `states.sensor.temperature` returns the state object for `sensor.temperature`. - `states('device_tracker.paulus')` will return the state string (not the object) of the given entity or `unknown` if it doesn't exist. - `is_state('device_tracker.paulus', 'home')` will test if the given entity is specified state. +- `state_attr('device_tracker.paulus', 'battery')` will return the value of the attribute or None if it doesn't exist. - `is_state_attr('device_tracker.paulus', 'battery', 40)` will test if the given entity is specified state. - `now()` will be rendered as current time in your time zone. - For specific values: `now().second`, `now().minute`, `now().hour`, `now().day`, `now().month`, `now().year`, `now().weekday()` and `now().isoweekday()` @@ -114,7 +115,7 @@ The next two statements result in same value if state exists. The second one wil ### {% linkable_title Attributes %} -Print an attribute if state is defined +Print an attribute if state is defined. Both will return the same thing but the last one you can specify entity_id from a variable. ```text {% raw %}{% if states.device_tracker.paulus %} @@ -124,6 +125,18 @@ Print an attribute if state is defined {% endif %}{% endraw %} ``` +With strings + +```text +{% raw %}{% set tracker_name = "paulus"%} + +{% if states("device_tracker." + tracker_name) != "unknown" %} + {{ state_attr("device_tracker." + tracker_name, "battery")}} +{% else %} + ?? +{% endif %}{% endraw %} +``` + ### {% linkable_title Sensor states %} Print out a list of all the sensor states. From 9cc2bce7614cb67c999f5372f1172b7d67d9ab21 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 28 Mar 2018 00:18:38 -0700 Subject: [PATCH 11/35] Make edit links GitHub aware (#5038) * Make edit links GitHub aware * Fix repo url * don't mutate existing string * Move comment * Fix url --- plugins/environment_variables.rb | 17 +++++++++++++++++ source/_includes/edit_github.html | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 plugins/environment_variables.rb diff --git a/plugins/environment_variables.rb b/plugins/environment_variables.rb new file mode 100644 index 0000000000..7d9203f164 --- /dev/null +++ b/plugins/environment_variables.rb @@ -0,0 +1,17 @@ +module Jekyll + class EnvironmentVariablesGenerator < Generator + def generate(site) + # https://www.netlify.com/docs/continuous-deployment/#build-environment-variables + repo_url = ENV['REPOSITORY_URL'] || 'https://github.com/home-assistant/home-assistant.github.io' + + # Rewrite urls if repo url is the ssh format. + if repo_url.start_with? 'git@github.com:' + repo_url = repo_url.sub 'git@github.com:', 'https://github.com/' + end + + # These values will be available as {{ site.NLY_REPOSITORY_URL }} + site.config['NLY_REPOSITORY_URL'] = repo_url + site.config['NLY_HEAD'] = ENV['HEAD'] || 'current' + end + end +end diff --git a/source/_includes/edit_github.html b/source/_includes/edit_github.html index f599869c81..b5fa2329b8 100644 --- a/source/_includes/edit_github.html +++ b/source/_includes/edit_github.html @@ -1,4 +1,4 @@ {% assign url_parts = page.url | split: '/' %} {% if page.hide_github_edit != true %} - + {% endif %} From f0bff4278eb37274e654fa150278412c98fc304b Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Thu, 29 Mar 2018 09:05:42 +0200 Subject: [PATCH 12/35] Yeelight Smart LED Ceiling Light added to the list of supported devices (#5029) --- source/_components/light.yeelight.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_components/light.yeelight.markdown b/source/_components/light.yeelight.markdown index b9808e7760..002e20ff1f 100644 --- a/source/_components/light.yeelight.markdown +++ b/source/_components/light.yeelight.markdown @@ -35,7 +35,7 @@ light: Configuration variables: -- **ip** (*Required*): IP(s) of your wifi bulbs +- **ip** (*Required*): IP(s) of your Wifi bulbs - **name** (*Optional*): A friendly name for the device. - **transition** (*Optional*, default 350): Smooth transitions over time (in ms). - **use_music_mode** (*Optional*, default False): Enable music mode. @@ -63,6 +63,8 @@ This component is tested to work with the following models. If you have a differ - **YLDD02YL**: Lightstrip (Color) - **MJCTD01YL**: Xiaomi Mijia Bedside Lamp - WIFI Version! - **MJTD01YL**: Xiaomi Mijia Smart LED Desk Lamp (autodiscovery isn't possible because the device doesn't support mDNS due to the small amount of RAM) +- **YLXD01YL**: Yeelight Smart LED Ceiling Light - Youth Version + ## {% linkable_title Platform Services %} From cb0398bee5f34b13a3e376c661e292b891dab745 Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Thu, 29 Mar 2018 08:06:18 +0100 Subject: [PATCH 13/35] clarify default db_url (#5021) * clarify default db_url * Update format --- source/_components/sensor.sql.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.sql.md b/source/_components/sensor.sql.md index 28ec379788..e676ca9d43 100644 --- a/source/_components/sensor.sql.md +++ b/source/_components/sensor.sql.md @@ -37,7 +37,7 @@ sensor: db_url: description: The URL which points to your database. See [supported engines](/components/recorder/#custom-database-engines). required: false - default: Defaults to the recorder db_url. + default: "Defaults to the default recorder `db_url` (not the current `db_url` of recorder)." type: string queries: description: List of your queries. From 0724d9f456b90313e5ddcf07404ce98c57c21cb3 Mon Sep 17 00:00:00 2001 From: Andy Castille Date: Thu, 29 Mar 2018 22:00:54 -0500 Subject: [PATCH 14/35] Add new Doorbird config option (#5047) --- source/_components/doorbird.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/doorbird.markdown b/source/_components/doorbird.markdown index 4ce686ec64..31b42ef729 100644 --- a/source/_components/doorbird.markdown +++ b/source/_components/doorbird.markdown @@ -31,6 +31,7 @@ Configuration variables: - **username** (*Required*): The username of a non-administrator user account on the device. - **password** (*Required*): The password for the user specified. - **doorbell_events** (*Optional*): Setting this to `true` this will register a callback URL with the device so that events can be published to the event bus when the doorbell rings. +- **hass_url_override** (*Optional*): If your DoorBird cannot connect to the machine running Home Assistant because you are using dynamic DNS or some other HTTP configuration, specify the LAN IP of the machine here to force a LAN connection.

Enabling `doorbell_events` will delete all other registered push notification services with the device every time Home Assistant starts. This will not affect notifications delivered by the DoorBird mobile app. From 1987571074bf544ca0ee47388fdbc23068aad6fb Mon Sep 17 00:00:00 2001 From: Beat <508289+bdurrer@users.noreply.github.com> Date: Sat, 31 Mar 2018 13:07:31 +0200 Subject: [PATCH 15/35] Add FreeDNS component (#5046) * Add FreeDNS component * Move the instructions up --- source/_components/freedns.markdown | 49 +++++++++++++++++++ .../development_guidelines.markdown | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 source/_components/freedns.markdown diff --git a/source/_components/freedns.markdown b/source/_components/freedns.markdown new file mode 100644 index 0000000000..960d1411d9 --- /dev/null +++ b/source/_components/freedns.markdown @@ -0,0 +1,49 @@ +--- +layout: page +title: "freedns.afraid.org" +description: "Keep your DNS record up to date with FreeDNS." +date: 2018-03-27 21:30 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Utility +ha_release: 0.67 +--- + +With the `freedns` component you can keep your [FreeDNS](https://freedns.afraid.org) record up to date. + +## {% linkable_title Configuration %} + +You need to determine your update URL or your access token. + +1. Head over to the [FreeDNS](https://freedns.afraid.org) website and login to your account. +2. Select the menu "Dynamic DNS" +3. You should now see your update candiates in a table at the bottom of the page. +4. Copy the link target of the "Direct URL". +5. The access token is the part at the end of the link: `https://freedns.afraid.org/dynamic/update.php?YOUR_UPDATE_TOKEN` +6. Either put the token as `access_token` _or_ the whole URL into the `url` attribute. + +To use the component in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +freedns: + access_token: YOUR_TOKEN +``` + +{% configuration %} + access_token: + description: Your access token. This is exclusive to `url`. + required: false + type: string + url: + description: The full update URL. This is exclusive to `access_token`. + required: false + type: string + update_interval: + description: How often to call the update service. + required: false + type: time period + default: 10 minutes +{% endconfiguration %} diff --git a/source/developers/development_guidelines.markdown b/source/developers/development_guidelines.markdown index edfabb9b26..7e4088249c 100644 --- a/source/developers/development_guidelines.markdown +++ b/source/developers/development_guidelines.markdown @@ -78,4 +78,4 @@ _LOGGER.error("No route to device: %s", self._resource) ``` Don't print out wrong API keys, tokens, usernames, or passwords. - +Also note that `_LOGGER.info` is reserved for the core, use `_LOGGER.debug` in anything else. From 308fe9eea19bea8a2e49eca9963c94ea88ed1f1c Mon Sep 17 00:00:00 2001 From: Jonas Pedersen Date: Sat, 31 Mar 2018 13:10:00 +0200 Subject: [PATCH 16/35] Minor syntax correction. (#5066) --- source/_docs/ecosystem/appdaemon/api.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/ecosystem/appdaemon/api.markdown b/source/_docs/ecosystem/appdaemon/api.markdown index 2f8e38c162..923505b262 100755 --- a/source/_docs/ecosystem/appdaemon/api.markdown +++ b/source/_docs/ecosystem/appdaemon/api.markdown @@ -1422,7 +1422,7 @@ Name of the event to subscribe to. Can be a standard Home Assistant event such a One or more keyword value pairs representing App specific parameters to supply to the callback. If the keywords match values within the event data, they will act as filters, meaning that if they don't match the values, the callback will not fire. -As an example of this, a Minimote controller when activated will generate an event called `zwave.scene_activated`, along with 2 pieces of data that are specific to the event - `entity_id` and `scene`. If you include keyword values for either of those, the values supplied to the `listen_event()1 call must match the values in the event or it will not fire. If the keywords do not match any of the data in the event they are simply ignored. +As an example of this, a Minimote controller when activated will generate an event called `zwave.scene_activated`, along with 2 pieces of data that are specific to the event - `entity_id` and `scene`. If you include keyword values for either of those, the values supplied to the `listen_event()` call must match the values in the event or it will not fire. If the keywords do not match any of the data in the event they are simply ignored. Filtering will work with any event type, but it will be necessary to figure out the data associated with the event to understand what values can be filtered on. This can be achieved by examining Home Assistant's logfiles when the event fires. From 69f0361c999591f21f84fa4af189d64d75cebae4 Mon Sep 17 00:00:00 2001 From: Rene Nulsch <33263735+ReneNulschDE@users.noreply.github.com> Date: Sat, 31 Mar 2018 15:23:13 +0200 Subject: [PATCH 17/35] Add removal note (#5053) --- source/_components/mercedesme.markdown | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/source/_components/mercedesme.markdown b/source/_components/mercedesme.markdown index 82f8679f45..db5774c518 100644 --- a/source/_components/mercedesme.markdown +++ b/source/_components/mercedesme.markdown @@ -23,29 +23,5 @@ This component provides the following platforms: - Device tracker: To track location of your car.

- The component can integrate cars from European and African markets only. -

- -To use Mercedes me in your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -mercedesme: - username: YOUR_E_MAIL_ADDRESS - password: YOUR_PASSWORD -``` - -{% configuration %} -username: - description: The email address associated with your Mercedes me account. - required: true - type: string -password: - description: The password for your given Mercedes me account. - required: true - type: string -{% endconfiguration %} - -

-The requirement `lxml` has to be [installed](http://lxml.de/installation.html) manually `pip install lxml` on some devices. + The component was removed. The vendor disabled the API endpoint and a new API is not available currently.

From e0540d27dc45a2bff7b64238d32353a0d51c42cc Mon Sep 17 00:00:00 2001 From: Myrddyn Date: Sat, 31 Mar 2018 17:01:15 -0400 Subject: [PATCH 18/35] Added "Waze travel time" sensor documentation (#4498) * Added Waze Travel Time documentation * Added Waze Travel Time documentation * Added Waze Travel Time documentation Fixed commit remarks from frenck * * Added Waze Travel Time documentation Fixed commit remarks from frenck * :pencil2: Tweaks * Multiple fixes * Update --- .../sensor.waze_travel_time.markdown | 51 ++++++++++++++++++ source/images/supported_brands/waze.png | Bin 0 -> 21843 bytes 2 files changed, 51 insertions(+) create mode 100644 source/_components/sensor.waze_travel_time.markdown create mode 100755 source/images/supported_brands/waze.png diff --git a/source/_components/sensor.waze_travel_time.markdown b/source/_components/sensor.waze_travel_time.markdown new file mode 100644 index 0000000000..2440930b9f --- /dev/null +++ b/source/_components/sensor.waze_travel_time.markdown @@ -0,0 +1,51 @@ +--- +layout: page +title: "Waze Travel Time" +description: "Instructions on how to add Waze travel time to Home Assistant." +date: 2018-01-23 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: waze.png +ha_category: Transport +ha_iot_class: "Cloud Polling" +ha_release: 0.67 +--- + +The `waze_travel_time` sensor provides travel time from the [Waze](https://www.waze.com/). + +Unit system is set to metric system. + +## {% linkable_title Configuration %} + +To use this sensor in your installation, add the following `abode` section to your `configuration.yaml` file: + +```yaml +# Example entry for configuration.yaml +sensor: + - platform: waze_travel_time + origin: Montréal, QC + destination: Québec, QC + region: 'US' +``` + +{% configuration %} +origin: + description: Enter the starting address or the GPS coordinates of the location (GPS coordinates has to be separated by a comma). + required: true + type: string +destination: + description: Enter the destination address or the GPS coordinates of the location (GPS coordinates has to be separated by a comma). + required: true + type: string +region: + description: Choose one of the available regions from 'EU', 'US', 'NA' (equivalent to 'US') or 'IL'. + required: true + type: string +name: + description: A name to display on the sensor. + required: false + default: "Waze Travel Time" + type: string +{% endconfiguration %} diff --git a/source/images/supported_brands/waze.png b/source/images/supported_brands/waze.png new file mode 100755 index 0000000000000000000000000000000000000000..927614e0c880fb95f819095acb379d531e1e7879 GIT binary patch literal 21843 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 Geg8jp{X)?I literal 0 HcmV?d00001 From ce94c3bc6d8f4b554c004c5fb57e3f90f299d687 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 31 Mar 2018 23:15:32 +0200 Subject: [PATCH 19/35] Updated Amcrest component documentation to include support for switches (#4862) * Updated Amcrest component documentation to include support for switches * :pencil2: Tweaks * Update release --- source/_components/amcrest.markdown | 6 ++++++ source/_components/switch.amcrest.markdown | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 source/_components/switch.amcrest.markdown diff --git a/source/_components/amcrest.markdown b/source/_components/amcrest.markdown index fc62783afa..74c76e70dd 100644 --- a/source/_components/amcrest.markdown +++ b/source/_components/amcrest.markdown @@ -28,6 +28,9 @@ amcrest: sensors: - motion_detector - sdcard + switches: + - motion_detection + - motion_recording - host: IP_ADDRESS_CAMERA_2 username: YOUR_USERNAME @@ -54,6 +57,9 @@ Configuration variables: - **motion_detector**: Return True/False when a motion is detected - **sdcard**: Return the SD card usage by reporting the total and used space - **ptz_preset**: Return the number of PTZ preset positions configured for the given camera +- **switches** array (*Optional*): Switches to display in the frontend. By default, *none* of the switches are shown. The following switches can be monitored. + - **motion_detection**: Enable/disable motion detection setting + - **motion_recording**: Enable/disable recording on motion detection setting **Note:** Amcrest cameras with newer firmware no longer have the ability to stream `high` definition video with MJPEG encoding. You may need to use `low` resolution stream or the `snapshot` stream source instead. If the quality seems too poor, lower the `Frame Rate (FPS)` and max out the `Bit Rate` settings in your camera's configuration manager. If you defined the *stream_source* to **mjpeg**, make sure your camera supports *Basic* HTTP authentication. Newer Amcrest firmware may not work, then **rtsp** is recommended instead. diff --git a/source/_components/switch.amcrest.markdown b/source/_components/switch.amcrest.markdown new file mode 100644 index 0000000000..d9ed4564b2 --- /dev/null +++ b/source/_components/switch.amcrest.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "Amcrest IP Camera Settings" +description: "Instructions on how to integrate settings for Amcrest IP Camera as switches within Home Assistant." +date: 2018-03-08 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: amcrest.png +ha_category: Switch +ha_release: 0.67 +ha_iot_class: "Local Polling" +--- + +The `amcrest` switch platform lets you control settings of [Amcrest IP Camera](https://home-assistant.io/components/camera.amcrest/) through Home Assistant. + +Switches will be configured automatically. Please refer to the [component](/components/amcrest/) configuration on how to setup. From 9caa6eb53f9ca646e0545bfe9d575b5e2de50535 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 31 Mar 2018 23:21:15 +0200 Subject: [PATCH 20/35] Add mastodon docs (#5010) --- source/_components/notify.mastodon.markdown | 52 ++++++++++++++++++++ source/images/supported_brands/mastodon.png | Bin 0 -> 7492 bytes 2 files changed, 52 insertions(+) create mode 100644 source/_components/notify.mastodon.markdown create mode 100644 source/images/supported_brands/mastodon.png diff --git a/source/_components/notify.mastodon.markdown b/source/_components/notify.mastodon.markdown new file mode 100644 index 0000000000..2e8327f4c2 --- /dev/null +++ b/source/_components/notify.mastodon.markdown @@ -0,0 +1,52 @@ +--- +layout: page +title: "Mastodon" +description: "Instructions on how to add Instapush notifications to Home Assistant." +date: 2018-03-25 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: mastodon.png +ha_category: Notifications +ha_release: 0.67 +--- + + +The `mastodon` platform uses [MAstodon](https://joinmastodon.org/) to delivery notifications from Home Assistant. + +Go to **Preferences** in the Mastodon web interface, then to **Development** and create a new application. + +To add Mastodon to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +notify: + - name: NOTIFIER_NAME + platform: mastodon + access_token: !secret mastodon_access_token + client_id: !secret mastodon_client_id + client_secret: !secret mastodon_client_secret +``` + +{% configuration %} +access_token: + description: Your Mastodon access token. + required: true + type: string +client_id: + description: Your Mastodon client ID + required: true + type: string +client_secret: + description: Your Mastodon client secret. + required: true + type: string +base_url: + description: URL of the Mastodon instance to use. + required: false + type: string + default: https://mastodon.social +{% endconfiguration %} + +To use notifications, please see the [getting started with automation page](/getting-started/automation/). diff --git a/source/images/supported_brands/mastodon.png b/source/images/supported_brands/mastodon.png new file mode 100644 index 0000000000000000000000000000000000000000..7a156e5b817ac0cf4008accf5d232a73405bbc47 GIT binary patch literal 7492 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 Date: Sat, 31 Mar 2018 23:23:26 +0200 Subject: [PATCH 21/35] Added request_rssi configuration variable to docs (#4684) * Added request_rssi configuration variable to docs * Used configuration tags * Removed extra configuration variable header --- .../_components/device_tracker.bluetooth_tracker.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_components/device_tracker.bluetooth_tracker.markdown b/source/_components/device_tracker.bluetooth_tracker.markdown index 0a2a2d0632..45bd09eae3 100644 --- a/source/_components/device_tracker.bluetooth_tracker.markdown +++ b/source/_components/device_tracker.bluetooth_tracker.markdown @@ -27,6 +27,14 @@ device_tracker: - platform: bluetooth_tracker ``` +{% configuration %} +request_rssi: + description: Performs a request for the "Received signal strength indication" (RSSI) of each tracked device + required: false + type: boolean + default: False +{% endconfiguration %} + In some cases it can be that your device is not discovered. In that case let your phone scan for Bluetooth devices while you restart Home Assistant. Just hit `Scan` on your phone all the time until Home Assistant is fully restarted and the device should appear in `known_devices.yaml`. For additional configuration variables check the [Device tracker page](/components/device_tracker/). From bc9e59bb967f4d9ec3365451df5b15ce330b3b18 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sun, 1 Apr 2018 21:19:45 +0200 Subject: [PATCH 22/35] Duplicate configuration line removed --- source/_components/sensor.xiaomi_miio.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/sensor.xiaomi_miio.markdown b/source/_components/sensor.xiaomi_miio.markdown index 3e30131fff..65d1f3780f 100644 --- a/source/_components/sensor.xiaomi_miio.markdown +++ b/source/_components/sensor.xiaomi_miio.markdown @@ -29,7 +29,6 @@ Please follow the instructions on [Retrieving the Access Token](/components/vacu To add a Xiaomi Mi Air Quality Monitor to your installation, add the following to your `configuration.yaml` file: ```yaml -sensor: # Example configuration.yaml entry sensor: - platform: xiaomi_miio From 481fb147c7ae8f83a76646cd7cfc7fc3b622870d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Arnauts?= Date: Mon, 2 Apr 2018 16:36:28 +0200 Subject: [PATCH 23/35] New Component: Add docs for Google Maps Location Sharing (#4646) * Add docs for Google Maps Location Sharing * Typo * :pencil2: Small updates * :pencil2: Migrated to configuration tags and ups HA version --- .../device_tracker.google_maps.markdown | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 source/_components/device_tracker.google_maps.markdown diff --git a/source/_components/device_tracker.google_maps.markdown b/source/_components/device_tracker.google_maps.markdown new file mode 100644 index 0000000000..6f2175a604 --- /dev/null +++ b/source/_components/device_tracker.google_maps.markdown @@ -0,0 +1,46 @@ +--- +layout: page +title: "Google Maps Location Sharing" +description: "Instructions how to use Google Maps Location Sharing to track devices in Home Assistant." +date: 2017-02-12 10:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: google_maps.png +ha_release: 0.67 +ha_category: Presence Detection +ha_iot_class: "Cloud Polling" +--- + +The `google_maps` platform allows you to detect presence using the unofficial API of [Google Maps Location Sharing](https://myaccount.google.com/locationsharing). + +You first need to create an additional Google account and share your location with that account. This platform will use that account to fetch the location of your device(s). You have to setup sharing through the Google Maps app on your mobile phone. You can find more information [here](https://support.google.com/accounts?p=location_sharing). + +This platform will create a file named `google_maps_location_sharing.conf` where it caches your login session. + +

+Since this platform is using an official API with the help of [locationsharinglib](https://github.com/costastf/locationsharinglib), Google seems to block access to your data the first time you've logged in with this component. +This issue can be fixed by logging in with your new account and approving your login on the [Device Activity](https://myaccount.google.com/device-activity) page. +

+ +To integrate Google Maps Location Sharing in Home Assistant, add the following section to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +device_tracker: + platform: google_maps + username: example@gmail.com + password: password +``` + +{% configuration %} +username: + description: The email address for the Google account that has access to your shared location. + required: true + type: string +password: + description: The password for your given username. + required: true + type: string +{% endconfiguration %} From 7dbed031cba045313aff5756bce6db0b0fa3dc97 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 2 Apr 2018 15:37:58 +0100 Subject: [PATCH 24/35] Adds docs for folder_watcher component (#4885) * Create folder_watcher.markdown * Adds posting file * Update folder_watcher.markdown * :pencil2: Markdownlint fixes * :pencil2: Escapes jinja code in example * :pencil2: Build fix part 2 * :ambulance: Fixes build * :arrow_up: Ups ha_release to 0.67 --- source/_components/folder_watcher.markdown | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 source/_components/folder_watcher.markdown diff --git a/source/_components/folder_watcher.markdown b/source/_components/folder_watcher.markdown new file mode 100644 index 0000000000..2e842114f7 --- /dev/null +++ b/source/_components/folder_watcher.markdown @@ -0,0 +1,77 @@ +--- +layout: page +title: "folder watcher" +description: "Component for monitoring changes within the filesystem." +date: 2018-03-11 14:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_category: System Monitor +ha_iot_class: "Local Polling" +ha_release: 0.67 +--- + +This component adds [Watchdog](https://pythonhosted.org/watchdog/) file system monitoring, publishing events on the Home-Assistant bus on the creation/deletion/modification of files. + +To configure the `folder_watcher` component add to you `configuration.yaml` file: + +```yaml +{% raw %} +folder_watcher: + watchers: + - folder: /config +{% endraw %} +``` + +{% configuration %} +folder: + description: The folder path + required: true + type: string +patterns: + description: Pattern matching to apply + required: false + default: "*" + type: string +{% endconfiguration %} + +## Patterns + +Pattern matching using [fnmatch](https://docs.python.org/3.6/library/fnmatch.html) can be used to limit filesystem monitoring to only files which match the configured patterns. The following example shows the configuration required to only monitor filetypes `.yaml` and `.txt`. + +```yaml +{% raw %} +folder_watcher: + watchers: + - folder: /config + patterns: + - '*.yaml' + - '*.txt' +{% raw %} +``` + +## Automations + +Automations can be triggered on filesystem event data using a data_template. The following automation will send a notification with the name and folder of new files added to that folder: + +```yaml +{% raw %} +- action: + - data_template: + message: 'Created {{trigger.event.data.file}} in {{trigger.event.data.folder}}' + title: New image captured! + data: + file: "{{trigger.event.data.path}}" + service: notify.pushbullet + alias: New file alert + condition: [] + id: '1520092824697' + trigger: + - event_data: {"event_type":"created"} + event_type: folder_watcher + platform: event +{% endraw %} +``` + From 3aa3be14397a3b11de455db4c36151c711ca3b11 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 2 Apr 2018 17:22:12 +0200 Subject: [PATCH 25/35] Minor changes (#5084) --- source/_components/binary_sensor.workday.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/binary_sensor.workday.markdown b/source/_components/binary_sensor.workday.markdown index 0d4782bc12..edc34b5a37 100644 --- a/source/_components/binary_sensor.workday.markdown +++ b/source/_components/binary_sensor.workday.markdown @@ -15,6 +15,10 @@ ha_release: 0.41 The `workday` binary sensor indicates, whether the current day is a workday or not. It allows specifying, which days of the week counts as workdays and also uses the python module [holidays](https://pypi.python.org/pypi/holidays) to incorporate information about region-specific public holidays. +## {% linkable_title Configuration %} + +Check the [country list](https://github.com/dr-prodigy/python-holidays#available-countries) for available province. + To enable the `workday` sensor in your installation, add the following to your `configuration.yaml` file: ```yaml From e2e349c30d10e317d400e37fad4fc1de6a1847a6 Mon Sep 17 00:00:00 2001 From: Johann Kellerman Date: Mon, 2 Apr 2018 17:35:46 +0200 Subject: [PATCH 26/35] Qwikswitch refactor & sensors (#5045) * Qwikswitch refactor & sensors PR: https://github.com/home-assistant/home-assistant/pull/13509 * :pencil2: Some minor tweaks --- source/_components/qwikswitch.markdown | 38 ++++++++++++++++++-------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/source/_components/qwikswitch.markdown b/source/_components/qwikswitch.markdown index cb4d6f3695..516658404a 100644 --- a/source/_components/qwikswitch.markdown +++ b/source/_components/qwikswitch.markdown @@ -13,12 +13,9 @@ featured: false ha_release: "0.20" --- +The `qwikswitch` component is the main component to integrate various [QwikSwitch](http://www.qwikswitch.co.za/) devices with Home Assistant. The integration requires the QSUSB Modem device and connects to the QS Mobile application. -The `qwikswitch` component is the main component to integrate various [QwikSwitch](http://www.qwikswitch.co.za/) devices with Home Assistant. - -Loading the `qwikswitch` component automatically adds all devices from the QS Mobile application. QS Mobile controls the QSUSB Modem device. - -Currently QwikSwitch relays and LED dimmers are supported (tested). QwikSwitch relay devices can be [switches](/components/switch.qwikswitch/) or [lights](/components/light.qwikswitch/) in Home-Assistant. If the device name in the QSUSB app ends with ` Switch` it will be created as a switch, otherwise as a light. +The `qwikswitch` component discovers all devices from QS Mobile. Currently, Relays and LED dimmers are discovered in Home Assistant. Relay devices are [lights](/components/light.qwikswitch/) by default, and can be configured as [switches](/components/switch.qwikswitch/). Example configuration: @@ -31,28 +28,45 @@ qwikswitch: Configuration variables: - **url** (*Required*): The URL including the port of your QwikSwitch hub. -- **dimmer_adjust** (*Optional*): A decimal value to adjust the brightness of the dimmer exponentially. Increasing this value allows dimmers that reaches full brightness with low values in QS Mobile to appear more linear in Home Assistant. Recommended values between 1 and 2 and the default is 1. -- **button_events** (*Optional*): A comma separated list of button types that will generate events. Details below. +- **dimmer_adjust** (*Optional*): A decimal value to adjust the brightness of the dimmer exponentially. Increasing this value allows dimmers that reach full brightness with low values in QS Mobile to appear more linear in Home Assistant. Recommended values between 1 and 2 and the default is 1. +- **button_events** (*Optional*): A comma-separated list of button types that will generate events. See [QwikSwitch Events] for detail. +- **switches** (*Optional*): A list of device QS_id's that should be switches, and not lights (i.e. `['@0dev01', '@0dev02']`) +- **sensors** (*Optional*): A dictionary of sensors. In the format of {entity_id: QS_id}. (i.e. `{door_sensor: '@0dev03'}`) -### {% linkable_title QwikSwitch Buttons %} +### {% linkable_title QwikSwitch Events %} -QwikSwitch devices (i.e. transmitter buttons) will fire events on the Home Assistant bus. These events can then be used as triggers for any `automation` action, as follows: +QwikSwitch devices (i.e., transmitter buttons) will fire events on the Home Assistant bus. These events can then be used as triggers for any `automation` action, as follows: ```yaml automation: - - alias: Action - Respond to button press + - alias: Action - Respond to A button press trigger: platform: event event_type: qwikswitch.button.@12df34 ``` -`event_type` names should be in the format **qwikswitch.button.@__ID__**. where **@__ID__** will be captured in the Home Assistant log when pressing the button. Alternatively, you can also get the device ID from the QS Mobile application or using the listen API call by browsing to `http://127.0.0.1:2020/&listen` and then pressing the button. +`event_type` names should be in the format **qwikswitch.button.@_QS_id_**. where **@_QS_id_** will be captured in the Home Assistant log when pressing the button. Alternatively, you can also get the device ID from the QS Mobile application or by using the listen API call by browsing to `http://127.0.0.1:2020/&listen` and then pressing the button. + +The full packet from the QSUSB API will be passed as `data` By default events will be fired if the value in the command (cmd) field of the listen packet equals: - `TOGGLE` - Normal QwikSwitch Transmitter button - `SCENE EXE` - QwikSwitch Scene Transmitter buttons - `LEVEL` - QwikSwitch OFF Transmitter buttons -The list of recognized commands can be extended for Keyfobs, door sensors, and PIR transmitters with the **button_events** configuration option. **button_events** contain a comma separated list of commands that will fire Home Assistant events. By default it is: TOGGLE,SCENE EXE,LEVEL. +The list of recognized commands can be extended for Keyfobs, door sensors, and PIR transmitters with the **button_events** configuration option. **button_events** can be a list or comma separated list of additional commands that will fire Home Assistant events. By default, it is: TOGGLE,SCENE EXE,LEVEL. On some QS Mobile servers button events are only generated for switches added to the QS Mobile application, so it might be best to test button presses through the `/&listen` API + +### {% linkable_title Qwikswitch Sensors %} + +Some Qwikswith devices might support more than one channel per device (i.e. ipmod). The channel can be specified by appending a number to the QS_id. Example sensors configuration: + +```yaml +qwikswitch: + ... + sensors: + door_sensor: '@0dev01' + door2_sensor: '@0dev02.1' + door3_sensor: '@0dev02.2' +``` From 5869b00342653c30fb29b3a870c275f0608161bd Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Mon, 2 Apr 2018 19:45:36 +0200 Subject: [PATCH 27/35] Xiaomi Mi WiFi Repeater 2 integration as device tracker (#5077) --- .../device_tracker.xiaomi_miio.markdown | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 source/_components/device_tracker.xiaomi_miio.markdown diff --git a/source/_components/device_tracker.xiaomi_miio.markdown b/source/_components/device_tracker.xiaomi_miio.markdown new file mode 100644 index 0000000000..dad5feef5d --- /dev/null +++ b/source/_components/device_tracker.xiaomi_miio.markdown @@ -0,0 +1,38 @@ +--- +layout: page +title: "Xiaomi Mi WiFi Repeater 2" +description: "Instructions how to integrate your Xiaomi Mi WiFi Repeater 2 within Home Assistant." +date: 2018-04-01 21:06 +sidebar: true +comments: false +sharing: true +footer: true +logo: xiaomi.png +ha_category: Sensor +ha_version: 0.67 +ha_iot_class: "Local Polling" +--- + +The `xiaomi_miio` device tracker platform is observing your Xiaomi Mi WiFi Repeater 2 and reporting all associated WiFi clients. + +Please follow the instructions on [Retrieving the Access Token](/components/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token. + +To add a Xiaomi Mi Air Quality Monitor to your installation, add the following to your `configuration.yaml` file: + +```yaml +device_tracker: + - platform: xiaomi_miio + host: 192.168.130.73 + token: YOUR_TOKEN +``` + +{% configuration %} +host: + description: The IP address of your miio device. + required: true + type: string +token: + description: The API token of your miio device. + required: true + type: string +{% endconfiguration %} From 66714881d7efdea6edb6279a56196f1890cb280e Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 4 Apr 2018 18:49:40 +0100 Subject: [PATCH 28/35] Remove ref to watchers (#5108) `watchers` is not required, was in an earlier version --- source/_components/folder_watcher.markdown | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source/_components/folder_watcher.markdown b/source/_components/folder_watcher.markdown index 2e842114f7..ba97e44c63 100644 --- a/source/_components/folder_watcher.markdown +++ b/source/_components/folder_watcher.markdown @@ -20,8 +20,7 @@ To configure the `folder_watcher` component add to you `configuration.yaml` file ```yaml {% raw %} folder_watcher: - watchers: - - folder: /config + - folder: /config {% endraw %} ``` @@ -44,11 +43,10 @@ Pattern matching using [fnmatch](https://docs.python.org/3.6/library/fnmatch.htm ```yaml {% raw %} folder_watcher: - watchers: - - folder: /config - patterns: - - '*.yaml' - - '*.txt' + - folder: /config + patterns: + - '*.yaml' + - '*.txt' {% raw %} ``` From 4a1255889f73409e821ce886ebbaf3cc9f7e7036 Mon Sep 17 00:00:00 2001 From: mountainsandcode Date: Wed, 4 Apr 2018 20:53:54 +0200 Subject: [PATCH 29/35] Update templating.markdown (#5085) --- source/_docs/configuration/templating.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index 631804b6ae..6b3c34b0a0 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -86,6 +86,10 @@ Home Assistant adds extensions to allow templates to access all of the current s - Filter `timestamp_custom(format_string, local_boolean)` will convert an UNIX timestamp to a custom format, the use of a local timestamp is default, supporting [Python format options](https://docs.python.org/3/library/time.html#time.strftime). - Filter `max` will obtain the largest item in a sequence. - Filter `min` will obtain the smallest item in a sequence. +- Filter `regex_match(string, find, ignorecase=FALSE)` will match the find expression at the beginning of the string using regex. +- Filter `regex_search(string, find, ignorecase=FALSE)` will match the find expression anywhere in the string using regex. +- Filter `regex_replace(string, find='', replace='', ignorecase=False)` will replace the find expression with the replace string using regex. +- Filter `regex_findall_index(string, find='', index=0, ignorecase=False)` will find all regex matches of find in string and return the match at index (findall returns an array of matches). [strp-format]: https://docs.python.org/3.6/library/datetime.html#strftime-and-strptime-behavior From 1c1025546efc991fa2553a9004b2db215516149f Mon Sep 17 00:00:00 2001 From: Oleg Date: Wed, 4 Apr 2018 21:54:33 +0300 Subject: [PATCH 30/35] Added headers configuration variable to notify.rest component (#5103) --- source/_components/notify.rest.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/notify.rest.markdown b/source/_components/notify.rest.markdown index c20e4bc2f5..4d1d83c581 100644 --- a/source/_components/notify.rest.markdown +++ b/source/_components/notify.rest.markdown @@ -30,6 +30,7 @@ Configuration variables: - **name** (*Optional*): Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. - **resource** (*Required*): The resource or endpoint that will receive the value. - **method** (*Optional*): The method of the request. Default is GET. +- **headers** (*Optional*): The headers for the request. - **message_param_name** (*Optional*): Parameter name for the message. Defaults to `message`. - **title_param_name** (*Optional*): Parameter name for the title. Defaults to none. - **target_param_name** (*Optional*): Parameter name for the target. Defaults to none. From a6ade458c70b8c05aa65e3c5dbf8fe14258735cb Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 5 Apr 2018 18:45:20 +0200 Subject: [PATCH 31/35] Add new configuration variable (#5117) --- .../device_tracker.asuswrt.markdown | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/source/_components/device_tracker.asuswrt.markdown b/source/_components/device_tracker.asuswrt.markdown index 4d809108e9..7889253ce9 100644 --- a/source/_components/device_tracker.asuswrt.markdown +++ b/source/_components/device_tracker.asuswrt.markdown @@ -19,6 +19,8 @@ The `asuswrt` platform offers presence detection by looking at connected devices This platform is **NOT** available for [Microsoft Windows installations](http://pexpect.readthedocs.io/en/stable/overview.html#pexpect-on-windows).

+### {% linkable_title Configuration %} + To use an ASUSWRT router in your installation, add the following to your `configuration.yaml` file: ```yaml @@ -29,15 +31,44 @@ device_tracker: username: YOUR_ADMIN_USERNAME ``` -Configuration variables: - -- **host** (*Required*): The IP address of your router, eg. `192.168.1.1`. -- **username** (*Required*: The username of an user with administrative privileges, usually `admin`. -- **password** (*Optional*): The password for your given admin account (use this if no SSH key is given). -- **protocol** (*Optional*): The protocol (`ssh` or `telnet`) to use. Defaults to `ssh`. -- **port** (*Optional*): SSH port to use. Defaults to `22`. -- **mode** (*Optional*): The operating mode of the router (`router` or `ap`). Defaults to `router`. -- **ssh_key** (*Optional*): The path to your SSH private key file associated with your given admin account (instead of password). +{% configuration %} +host: + description: "The IP address of your router, eg. `192.168.1.1`." + required: true + type: string +username: + description: "The username of an user with administrative privileges, usually `admin`." + required: true + type: string +password: + description: "The password for your given admin account (use this if no SSH key is given)." + required: false + type: string +protocol: + description: "The protocol (`ssh` or `telnet`) to use." + required: false + type: string + default: ssh +port: + description: SSH port to use. + required: false + type: int + default: 22 +mode: + description: "The operating mode of the router (`router` or `ap`)." + required: false + type: string + default: router +ssh_key: + description: The path to your SSH private key file associated with your given admin account (instead of password). + required: false + type: string +require_ip: + description: If the router is in access point mode. + required: false + type: boolean + default: true +{% endconfiguration %}

You need to [enable telnet](https://www.asus.com/support/faq/1005449/) on your router if you choose to use `protocol: telnet`. From b0e5093b02d45859e1b4f895e5811465774c4736 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 5 Apr 2018 20:39:21 +0200 Subject: [PATCH 32/35] Add Tahoma switches docs (#5118) --- source/_components/switch.tahoma.markdown | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 source/_components/switch.tahoma.markdown diff --git a/source/_components/switch.tahoma.markdown b/source/_components/switch.tahoma.markdown new file mode 100644 index 0000000000..a7c3338fee --- /dev/null +++ b/source/_components/switch.tahoma.markdown @@ -0,0 +1,17 @@ +--- +layout: page +title: "Tahoma Switch" +description: "Instructions on how to integrate Tahoma switches into Home Assistant." +date: 2017-07-18 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: tahoma.png +ha_category: Sensor +ha_release: 0.59 +--- + +The `tahoma` switch platform lets you see switches added to your Tahoma Box in Home Assistant. + +Switches will be added automatically. Please refer to the [component](/components/tahoma/) configuration on how to setup Tahoma. From 0814d5c531daf1316dc7848c0b70dc567dcedee9 Mon Sep 17 00:00:00 2001 From: jmtatsch Date: Fri, 6 Apr 2018 06:11:42 +0200 Subject: [PATCH 33/35] Harmonised topic name and mention enabled autodiscovery (#5120) * Harmonised topic name and mention enabled autodiscovery * image shall not be the state of entity --- source/_docs/mqtt/discovery.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index 60974c428b..aaa295dc4b 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -15,6 +15,7 @@ The discovery of MQTT devices will enable one to use MQTT devices with only mini Supported by MQTT discovery: - [Binary sensors](/components/binary_sensor.mqtt/) +- [Cameras](/components/camera.mqtt/) - [Covers](/components/cover.mqtt/) - [Fans](/components/fan.mqtt/) - [Lights](/components/light.mqtt/) From ccba1ffd3367159a17e92fecc92526c04e468ba5 Mon Sep 17 00:00:00 2001 From: Marco Orovecchia Date: Fri, 6 Apr 2018 15:35:27 +0200 Subject: [PATCH 34/35] Added Nanoleaf Aurora Light documentation (#5018) * Added Nanoleaf Aurora Light documentation * :pencil2: Tweaks --- .../light.nanoleaf_aurora.markdown | 52 ++++++++++++++++++ .../nanoleaf_aurora_light.png | Bin 0 -> 70366 bytes 2 files changed, 52 insertions(+) create mode 100644 source/_components/light.nanoleaf_aurora.markdown create mode 100644 source/images/supported_brands/nanoleaf_aurora_light.png diff --git a/source/_components/light.nanoleaf_aurora.markdown b/source/_components/light.nanoleaf_aurora.markdown new file mode 100644 index 0000000000..074bd1c77f --- /dev/null +++ b/source/_components/light.nanoleaf_aurora.markdown @@ -0,0 +1,52 @@ +--- +layout: page +title: "Nanoleaf Aurora Light Panel" +description: "Instructions how to integrate Nanoleaf Aurora Light Panels into Home Assistant." +date: 2018-01-04 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: nanoleaf_aurora_light.png +ha_category: Light +ha_iot_class: "Local Polling" +featured: false +ha_release: 0.67 +--- + +### {% linkable_title Configuration Sample %} + +To enable the Aurora lights, add the following lines to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +light: + - platform: aurora + host: 192.168.1.10 + token: xxxxxxxxxxxxxxxxxxxxx +``` + +{% configuration %} +host: + description: IP address or host-name of the device, e.g., 192.168.1.10. + required: true + type: string +token: + description: The *auth* token that you get via *POST* to */api/v1/new* + required: true + type: string +name: + description: Name of the component, make this unique if you have multiple Light Panels + required: false + type: string + default: Aurora +{% endconfiguration %} + +### {% linkable_title Getting The Auth Token %} + +1. Make sure that your Nanoleaf Aurora Panel is fully patched (as of the time of writing the latest version was 2.2.0) +2. Hold down the *ON* button on the Panel for 5 seconds; the LED will start flashing +3. Issue a *POST* request to the API endpoint, e.g., via `$ curl -i -X POST http://192.168.1.155:16021/api/v1/new` +4. The output should include the auth token like *{"auth_token":"xxxxxxxxxxxxxxxxxxxxx"}*, copy the resulting token into your configuration + +If you get a 403 Forbidden message, you probably did not press the *ON* button long enough. The time-frame to get a valid token is only 30 seconds, so you have to be quick to issue the curl request. diff --git a/source/images/supported_brands/nanoleaf_aurora_light.png b/source/images/supported_brands/nanoleaf_aurora_light.png new file mode 100644 index 0000000000000000000000000000000000000000..fb14d4752f1fe396210b8289f0d113d2f9b28584 GIT binary patch literal 70366 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 literal 0 HcmV?d00001 From 8aaf1547d265cf566d4088ae8c518795c47181b1 Mon Sep 17 00:00:00 2001 From: David Broadfoot Date: Fri, 6 Apr 2018 23:53:31 +1000 Subject: [PATCH 35/35] Added documentation for gogogate2 (#5023) * Add gogogate2 image * Added gogogate2 documentation * PR Feedback * Remove blank line * Add period --- source/_components/cover.gogogate2.markdown | 49 +++++++++++++++++++ source/images/supported_brands/gogogate2.png | Bin 0 -> 11962 bytes 2 files changed, 49 insertions(+) create mode 100644 source/_components/cover.gogogate2.markdown create mode 100644 source/images/supported_brands/gogogate2.png diff --git a/source/_components/cover.gogogate2.markdown b/source/_components/cover.gogogate2.markdown new file mode 100644 index 0000000000..bf6d62d37b --- /dev/null +++ b/source/_components/cover.gogogate2.markdown @@ -0,0 +1,49 @@ +--- +layout: page +title: "Gogogate2 Cover" +description: "Instructions on how to integrate Gogogate2-Enabled garage door covers into Home Assistant." +date: 2018-03-26 20:02 +sidebar: true +comments: false +sharing: true +footer: true +logo: gogogate2.png +ha_category: Cover +ha_release: 0.67 +ha_iot_class: Local Polling +--- + +The `gogogate2` cover platform lets you control Gogogate2-Enabled garage doors through Home Assistant. Device names in Home Assistant are generated based on the names defined in your Gogogate2 mobile app. + +## {% linkable_title Configuration %} + +To use your Gogogate2 cover in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yml entry +cover: + - platform: gogogate2 + username: email@email.com + password: password + ip_address: 192.168.1.200 +``` + +{% configuration %} +username: + description: Your Gogogate2 account username. + required: true + type: string +password: + description: Your Gogogate2 account password. + required: true + type: string +ip_address: + description: The IP Address of your Gogogate2 device. + required: true + type: string +name: + description: Allows you to override the default name. + default: gogogate2 + required: false + type: string +{% endconfiguration %} diff --git a/source/images/supported_brands/gogogate2.png b/source/images/supported_brands/gogogate2.png new file mode 100644 index 0000000000000000000000000000000000000000..551043f64a53cec259a53fb71382fff754c4f348 GIT binary patch literal 11962 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 M07*qoM6N<$f^0pk4FCWD literal 0 HcmV?d00001