Merge branch 'master' into next
Conflicts: source/_cookbook/custom_panel_using_react.markdown
@ -213,6 +213,11 @@ article.post, article.page, article.listing {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
margin-bottom: 0;
|
||||
line-height: 1.2;
|
||||
}
|
||||
}
|
||||
|
||||
p.note {
|
||||
|
@ -18,12 +18,12 @@ Most binary sensors support the `SENSOR_CLASSES` which let you specify the type
|
||||
- **None**: Generic on/off
|
||||
- **opening**: Door, window, etc
|
||||
- **motion**: Motion sensor
|
||||
- **gas'**: CO, CO2, etc
|
||||
- **smoke'**: Smoke detector
|
||||
- **gas**: CO, CO2, etc
|
||||
- **smoke**: Smoke detector
|
||||
- **moisture**: Specifically a wetness sensor
|
||||
- **light**: Lightness threshold
|
||||
- **power**: Power, over-current, etc
|
||||
- **safety**: Generic on=unsafe, off=safe
|
||||
- **safety**: On means unsafe, Off means safe
|
||||
- **heat**: On means hot (or too hot)
|
||||
- **cold**: On means cold (or too cold)
|
||||
- **moving**: On means moving, Off means stopped
|
||||
|
@ -17,11 +17,11 @@ To enable Template binary sensors in your installation, add the following to you
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
binary_sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
sun_up:
|
||||
value_template: {% raw %}'{{ states.sun.sun.attributes.elevation > 0}}'{% endraw %}
|
||||
friendly_name: 'Sun is up'
|
||||
- platform: template
|
||||
sensors:
|
||||
sun_up:
|
||||
value_template: {% raw %}'{{ states.sun.sun.attributes.elevation > 0}}'{% endraw %}
|
||||
friendly_name: 'Sun is up'
|
||||
```
|
||||
|
||||
Configuration variables:
|
||||
@ -30,8 +30,7 @@ Configuration variables:
|
||||
- **friendly_name** (*Optional*): Name to use in the Frontend.
|
||||
- **sensor_class** (*Optional*): The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend.
|
||||
- **value_template** (*Optional*): Defines a [template](/topics/templating/) to extract a value from the payload.
|
||||
- **warnings** (*Optional*): Turn off warnings (useful if the sensor is loaded before devices it depends on).
|
||||
- **entity_id** (*Optional*): Add a list of entity_ids so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update it's state.
|
||||
- **entity_id** (*Optional*): Add a list of entity IDs so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update it's state.
|
||||
|
||||
## {% linkable_title Examples %}
|
||||
|
||||
@ -43,26 +42,26 @@ This example indicates true if a sensor is above a given threshold. Assuming a s
|
||||
|
||||
```yaml
|
||||
sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
furnace_on:
|
||||
value_template: {% raw %}{{ states.sensor.furnace.state > 2.5 }}{% endraw %}
|
||||
friendly_name: 'Furnace Running
|
||||
sensor_class: heat
|
||||
- platform: template
|
||||
sensors:
|
||||
furnace_on:
|
||||
value_template: {% raw %}{{ states.sensor.furnace.state > 2.5 }}{% endraw %}
|
||||
friendly_name: 'Furnace Running
|
||||
sensor_class: heat
|
||||
```
|
||||
|
||||
### {% linkable_title Switch as sensor %}
|
||||
|
||||
Some movement sensors and door/window sensors will apear 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/)
|
||||
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
|
||||
sensors:
|
||||
movement:
|
||||
value_template: {% raw %}"{{ states.switch.movement.state == 'on' }}"{% endraw %}
|
||||
sensor_class: motion
|
||||
door:
|
||||
value_template: {% raw %}"{{ states.switch.door.state == 'on' }}"{% endraw %}
|
||||
sensor_class: opening
|
||||
- platform: template
|
||||
sensors:
|
||||
movement:
|
||||
value_template: {% raw %}"{{ states.switch.movement.state == 'on' }}"{% endraw %}
|
||||
sensor_class: motion
|
||||
door:
|
||||
value_template: {% raw %}"{{ states.switch.door.state == 'on' }}"{% endraw %}
|
||||
sensor_class: opening
|
||||
```
|
||||
|
@ -1,7 +1,7 @@
|
||||
---
|
||||
layout: page
|
||||
title: "Bluetooth Tracker"
|
||||
description: "Instructions how to integrate bluetooth tracking within Home Assistant."
|
||||
description: "Instructions for integrating bluetooth tracking within Home Assistant."
|
||||
date: 2016-04-10 17:24
|
||||
sidebar: true
|
||||
comments: false
|
||||
@ -13,11 +13,11 @@ ha_iot_class: "Local Poll"
|
||||
ha_release: 0.18
|
||||
---
|
||||
|
||||
This tracker discovers new devices on boot and tracks bluetooth devices periodically based on interval_seconds value. It is not requiered to pair the devices with eachother!
|
||||
Devices discovered are stored with 'bt_' as the prefix for device mac address in `known_devices.yaml`.
|
||||
This tracker discovers new devices on boot and tracks bluetooth devices periodically based on interval_seconds value. It is not required to pair the devices with each other!
|
||||
Devices discovered are stored with 'bt_' as the prefix for device mac addresses in `known_devices.yaml`.
|
||||
|
||||
<p class='note'>
|
||||
Requires PyBluez. If you are on raspbian, make sure you first install `bluetooth` and `libbluetooth-dev` by running `sudo apt install bluetooth libbluetooth-dev`
|
||||
Requires PyBluez. If you are on Raspbian, make sure you first install `bluetooth` and `libbluetooth-dev` by running `sudo apt install bluetooth libbluetooth-dev`
|
||||
</p>
|
||||
|
||||
To use the Bluetooth tracker in your installation, add the following to your `configuration.yaml` file:
|
||||
|
@ -10,7 +10,7 @@ footer: true
|
||||
logo: homematic.png
|
||||
ha_category: Hub
|
||||
ha_iot_class: "Local Push"
|
||||
featured: true
|
||||
featured: false
|
||||
---
|
||||
|
||||
|
||||
|
@ -25,8 +25,8 @@ http:
|
||||
ssl_certificate: /etc/letsencrypt/live/hass.example.com/fullchain.pem
|
||||
ssl_key: /etc/letsencrypt/live/hass.example.com/privkey.pem
|
||||
cors_allowed_origins:
|
||||
- google.com
|
||||
- home-assistant.io
|
||||
- https://google.com
|
||||
- https://home-assistant.io
|
||||
```
|
||||
|
||||
Configuration variables:
|
||||
@ -37,7 +37,7 @@ Configuration variables:
|
||||
- **development** (*Optional*): Disable caching and load unvulcanized assets. Useful for Frontend development.
|
||||
- **ssl_certificate** (*Optional*): Path to your TLS/SSL certificate to serve Home Assistant over a secure connection.
|
||||
- **ssl_key** (*Optional*): Path to your TLS/SSL key to serve Home Assistant over a secure connection.
|
||||
- **cors_allowed_origins** (*Optional*): A list of origin domain names to allow [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) requests from. Enabling this will set the `Access-Control-Allow-Origin` header to the Origin header if it is found in the list, and the `Access-Control-Allow-Headers` to `Origin, Accept, X-Requested-With, Content-type, X-HA-access`.
|
||||
- **cors_allowed_origins** (*Optional*): A list of origin domain names to allow [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) requests from. Enabling this will set the `Access-Control-Allow-Origin` header to the Origin header if it is found in the list, and the `Access-Control-Allow-Headers` header to `Origin, Accept, X-Requested-With, Content-type, X-HA-access`. You must provide the exact Origin, i.e. `https://home-assistant.io` will allow requests from `https://home-assistant.io` but __not__ `http://home-assistant.io`.
|
||||
|
||||
|
||||
The [Set up encryption using Let's Encrypt](/blog/2015/12/13/setup-encryption-using-lets-encrypt/) blog post gives you details about the encryption of your traffic using free certificates from [Let's Encrypt](https://letsencrypt.org/).
|
||||
|
@ -9,7 +9,7 @@ sharing: true
|
||||
footer: true
|
||||
ha_category: Light
|
||||
ha_iot_class: "Local Polling"
|
||||
featured: true
|
||||
featured: false
|
||||
ha_release: 0.25
|
||||
---
|
||||
|
||||
|
@ -36,7 +36,7 @@ Turns one light on or multiple lights on using [groups]({{site_root}}/components
|
||||
| `transition` | yes | Integer that represents the time the light should take to transition to the new state in seconds. *not supported by Wink
|
||||
| `profile` | yes | String with the name of one of the built-in profiles (relax, energize, concentrate, reading) or one of the custom profiles defined in `light_profiles.csv` in the current working directory. Light profiles define a xy color and a brightness. If a profile is given and a brightness or xy color then the profile values will be overwritten.
|
||||
| `xy_color` | yes | A list containing two floats representing the xy color you want the light to be. Two comma seperated floats that represent the color in XY.
|
||||
| `rgb_color` | yes | A list containing three integers representing the xy color you want the light to be. Three comma seperated integers that represent the color in RGB
|
||||
| `rgb_color` | yes | A list containing three integers representing the rgb color you want the light to be. Three comma seperated integers that represent the color in RGB
|
||||
| `color_temp` | yes | An INT in mireds representing the color temperature you want the light to be.
|
||||
| `color_name` | yes | A human readable string of a color name, such as `blue` or `goldenrod` or [`chucknorris`](http://stackoverflow.com/questions/8318911/why-does-html-think-chucknorris-is-a-color). If your browser can display it, so can Home Assistant.
|
||||
| `brightness` | yes | Integer between 0 and 255 for how bright the color should be.
|
||||
|
@ -27,7 +27,7 @@ Steps to configure your Amazon Fire TV stick with Home Assistant:
|
||||
- From the main (Launcher) screen, select Settings.
|
||||
- Select System > About > Network.
|
||||
- `pip install firetv[firetv-server]` into a Python 2.x environment
|
||||
- If installed on Debian Jessie then the libssl-dev package is needed. Install it with `apt-get install libssl-dev`
|
||||
- If installed on Debian Jessie then the libssl-dev and python-dev packages are needed. Install them with `apt-get install libssl-dev python-dev`
|
||||
- `firetv-server -d <fire tv device IP>:5555`, background the process
|
||||
- Configure Home Assistant as follows:
|
||||
|
||||
|
@ -9,7 +9,7 @@ sharing: true
|
||||
footer: true
|
||||
logo: mpchc.png
|
||||
ha_category: Media Player
|
||||
featured: true
|
||||
featured: false
|
||||
ha_release: 0.25.0
|
||||
---
|
||||
|
||||
|
@ -47,3 +47,12 @@ In case [discovery](/components/discovery/) does not work (GDM disabled or non-l
|
||||
- **TOKEN** (*Optional*): Only if authentication is required. Set to `null` (without quotes) otherwise.
|
||||
|
||||
At this moment, the Plex platform only supports one Plex Media Server.
|
||||
|
||||
It is possible to get errors that look like the following.
|
||||
|
||||
```
|
||||
ERROR:plexapi:http://192.168.1.10:32400: ('Connection aborted.', BadStatusLine("''",))
|
||||
INFO:homeassistant.components.media_player.plex:No server found at: http://192.168.1.10:32400
|
||||
```
|
||||
|
||||
If this occurs, try changing the setting `Secure connections` in your Plex Media Server to `Preferred` (instead of `Required`). The Plex component does not currently support HTTPS.
|
||||
|
@ -20,16 +20,7 @@ The requirements are:
|
||||
- You need a [Telegram bot](https://core.telegram.org/bots). Please follow those [instructions](https://core.telegram.org/bots#botfather) to create one and get the token for your bot. Keep in mind that bots are not allowed to contact users. You need to make the first contact with your user. Meaning that you need to send a message to the bot from your user.
|
||||
- The `chat_id` of an user.
|
||||
|
||||
An easy way to get your chat ID is described below:
|
||||
|
||||
```python
|
||||
import telegram
|
||||
bot = telegram.Bot(token='YOUR_API_TOKEN')
|
||||
chat_id = bot.getUpdates()[-1].message.chat_id
|
||||
print(chat_id)
|
||||
```
|
||||
|
||||
Another way to retrieve your `chat_id` is visiting [https://api.telegram.org/botYOUR_API_TOKEN/getUpdates](https://api.telegram.org/botYOUR_API_TOKEN/getUpdates).
|
||||
The quickest way to retrieve your `chat_id` is visiting [https://api.telegram.org/botYOUR_API_TOKEN/getUpdates](https://api.telegram.org/botYOUR_API_TOKEN/getUpdates).
|
||||
|
||||
The result set will include your chat ID as `id` in the `from` section:
|
||||
|
||||
@ -47,6 +38,16 @@ The result set will include your chat ID as `id` in the `from` section:
|
||||
...
|
||||
```
|
||||
|
||||
Another way to get your chat ID directly is described below:
|
||||
|
||||
```python
|
||||
import telegram
|
||||
bot = telegram.Bot(token='YOUR_API_TOKEN')
|
||||
chat_id = bot.getUpdates()[-1].message.chat_id
|
||||
print(chat_id)
|
||||
123456789
|
||||
```
|
||||
|
||||
To enable Telegram notifications in your installation, add the following to your `configuration.yaml` file:
|
||||
|
||||
```yaml
|
||||
|
@ -28,3 +28,5 @@ Configuration variables:
|
||||
|
||||
- **api_key** (*Required*): The retrieved api key.
|
||||
- **host** (*Required*): The octoprint host.
|
||||
|
||||
**NOTE** If your 3D printer isn't connected to the OctoPrint server during the startup of Home Assistant this component will fail to load.
|
||||
|
@ -15,6 +15,8 @@ ha_release: 0.25
|
||||
|
||||
The `panel_iframe` support allows you to add additional panels to your Home Assistant frontend. The panels are listed in the sidebar and can contain external resources like the web frontend of your router, your monitoring system, or your media server.
|
||||
|
||||
<p class='note warning'>If you are accessing home Assistant over HTTPS using SSL, you cannot access HTTP sites through an iframe panel.</p>
|
||||
|
||||
To enable Panel iFrames in your installation, add the following to your `configuration.yaml` file:
|
||||
|
||||
```yaml
|
||||
|
@ -1,7 +1,7 @@
|
||||
---
|
||||
layout: page
|
||||
title: "Vera Sensor"
|
||||
description: "Instructions how to integrate Vera sensors into Home Assistant."
|
||||
title: "Envisalink Sensor"
|
||||
description: "Instructions how to integrate Envisalink sensors into Home Assistant."
|
||||
date: 2016-07-01 10:00
|
||||
sidebar: true
|
||||
comments: false
|
||||
|
@ -61,3 +61,33 @@ sensor:
|
||||
value_template: {% raw %}'{{ value_json.batt }}'{% endraw %}
|
||||
```
|
||||
|
||||
### {% linkable_title Get temperature and humidity %}
|
||||
|
||||
If you are using a DHT sensor and a NodeMCU board (esp8266), you can retrieve temperature and humidity with a MQTT sensor. A code example can be found [here](https://github.com/mertenats/open-home-automation/tree/master/ha_mqtt_sensor_dht22). A regular MQTT message from this example looks like this:
|
||||
|
||||
```
|
||||
office/sensor1
|
||||
{
|
||||
"temperature": 23.20,
|
||||
"humidity": 43.70
|
||||
}
|
||||
```
|
||||
|
||||
Then use this configuration example to extract the data from the payload:
|
||||
|
||||
```yaml
|
||||
# Example configuration.yml entry
|
||||
sensor 1:
|
||||
platform: mqtt
|
||||
state_topic: 'office/sensor1'
|
||||
name: 'Temperature'
|
||||
unit_of_measurement: '°C'
|
||||
value_template: '{{ value_json.temperature }}'
|
||||
|
||||
sensor 2:
|
||||
platform: mqtt
|
||||
state_topic: 'office/sensor1'
|
||||
name: 'Humidity'
|
||||
unit_of_measurement: '%'
|
||||
value_template: '{{ value_json.humidity }}'
|
||||
```
|
||||
|
@ -8,6 +8,7 @@ comments: false
|
||||
sharing: true
|
||||
footer: true
|
||||
ha_category: Sensor
|
||||
logo: nzbget.png
|
||||
ha_iot_class: "Local Polling"
|
||||
ha_release: 0.17
|
||||
---
|
||||
|
@ -23,15 +23,16 @@ To enable this sensor, add the following lines to your `configuration.yaml` file
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
sensor:
|
||||
platform: openexchangerates
|
||||
api_key: your_api_key
|
||||
base: USD #optional
|
||||
quote: EUR
|
||||
name: USDEUR #optional
|
||||
- platform: openexchangerates
|
||||
api_key: YOUR_API_KEY
|
||||
base: USD
|
||||
quote: EUR
|
||||
name: USDEUR
|
||||
```
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **api_key** (*Required*): API Key for [Open Exchange Rates](https://openexchangerates.org).
|
||||
- **name** (*Optional*): Name to use in the frontend.
|
||||
- **base** (*Optional*): The symbol of the base currency. Defaults to USD
|
||||
- **quote** (*Required*): The symbol of the quote or target currency.
|
||||
|
@ -50,7 +50,7 @@ Configuration variables:
|
||||
- **rain**: The rain volume.
|
||||
- **snow**: The snow volume
|
||||
|
||||
Details about the API are available in the [OpenWeatherMap documentation](http://bugs.openweathermap.org/projects/api/wiki).
|
||||
Details about the API are available in the [OpenWeatherMap documentation](http://openweathermap.org/api).
|
||||
|
||||
Only metric measurements are supported at the moment.
|
||||
|
||||
|
@ -9,6 +9,7 @@ sharing: true
|
||||
footer: true
|
||||
ha_category: Sensor
|
||||
ha_release: pre 0.7
|
||||
ha_iot_class: "Local Push"
|
||||
---
|
||||
|
||||
The `systemmonitor` sensor platform to allow you to monitor disk usage, memory usage, CPU usage, and running processes. This platform has superseded the process component which is now considered deprecated.
|
||||
@ -18,12 +19,12 @@ To add this platform to your installation, add the following to your `configurat
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
sensor:
|
||||
platform: systemmonitor
|
||||
resources:
|
||||
- type: disk_use_percent
|
||||
arg: /home
|
||||
- type: memory_free
|
||||
- type: processor_use
|
||||
- platform: systemmonitor
|
||||
resources:
|
||||
- type: disk_use_percent
|
||||
arg: /home
|
||||
- type: memory_free
|
||||
- type: processor_use
|
||||
```
|
||||
|
||||
Configuration variables:
|
||||
@ -34,7 +35,7 @@ Configuration variables:
|
||||
|
||||
The table contains types and their argument to use in your `configuration.yaml` file.
|
||||
|
||||
| Type (`- type:`) | Argument (`arg:`) |
|
||||
| Type (`type:`) | Argument (`arg:`) |
|
||||
| :------------------ |:-------------------------|
|
||||
| disk_use_percent | Path, eg. `/` |
|
||||
| disk_use | Path, eg. `/` |
|
||||
|
@ -18,14 +18,14 @@ To enable Template sensors in your installation, add the following to your `conf
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
solar_angle:
|
||||
value_template: {% raw %}'{{ states.sun.sun.attributes.elevation }}'{% endraw %}
|
||||
friendly_name: 'Sun angle'
|
||||
unit_of_measurement: 'degrees'
|
||||
sunrise:
|
||||
value_template: {% raw %}'{{ states.sun.sun.attributes.next_rising }}'{% endraw %}
|
||||
- platform: template
|
||||
sensors:
|
||||
solar_angle:
|
||||
value_template: {% raw %}'{{ states.sun.sun.attributes.elevation }}'{% endraw %}
|
||||
friendly_name: 'Sun angle'
|
||||
unit_of_measurement: 'degrees'
|
||||
sunrise:
|
||||
value_template: {% raw %}'{{ states.sun.sun.attributes.next_rising }}'{% endraw %}
|
||||
```
|
||||
|
||||
Configuration variables:
|
||||
@ -34,8 +34,7 @@ Configuration variables:
|
||||
- **friendly_name** (*Optional*): Name to use in the Frontend.
|
||||
- **unit_of_measurement** (*Optional*): Defines the units of measurement of the sensor, if any.
|
||||
- **value_template** (*Optional*): Defines a [template](/topics/templating/) to extract a value from the payload.
|
||||
- **warnings** (*Optional*): Turn off warnings (useful if the sensor is loaded before devices it depends on).
|
||||
- **entity_id** (*Optional*): Add a list of entity_ids so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update it's state.
|
||||
- **entity_id** (*Optional*): Add a list of entity IDs so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update it's state.
|
||||
|
||||
|
||||
## {% linkable_title Examples %}
|
||||
@ -48,12 +47,12 @@ This example shows the sun angle in the frontend.
|
||||
|
||||
```yaml
|
||||
sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
solar_angle:
|
||||
value_template: {% raw %}'{{ "%+.1f"|format(states.sun.sun.attributes.elevation) }}'{% endraw %}
|
||||
friendly_name: 'Sun Angle'
|
||||
unit_of_measurement: '°'
|
||||
- platform: template
|
||||
sensors:
|
||||
solar_angle:
|
||||
value_template: {% raw %}'{{ "%+.1f"|format(states.sun.sun.attributes.elevation) }}'{% endraw %}
|
||||
friendly_name: 'Sun Angle'
|
||||
unit_of_measurement: '°'
|
||||
```
|
||||
|
||||
### {% linkable_title Renaming sensor output %}
|
||||
@ -62,22 +61,22 @@ If you don't like the wording of a sensor output then the template sensor can he
|
||||
|
||||
```yaml
|
||||
sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
sun_state:
|
||||
value_template: {% raw %}'{% if is_state("sun.sun", "above_horizon") %}up{% else %}down{% endif %}'{% endraw %}
|
||||
friendly_name: 'Sun state'
|
||||
- platform: template
|
||||
sensors:
|
||||
sun_state:
|
||||
value_template: {% raw %}'{% if is_state("sun.sun", "above_horizon") %}up{% else %}down{% endif %}'{% endraw %}
|
||||
friendly_name: 'Sun state'
|
||||
```
|
||||
|
||||
Processes monitored by the [System Monitor sensor](/components/sensor.systemmonitor/) show `on` or `off` if they are running or not. This example shows how the output of a monitored `glances` process can be renamed.
|
||||
|
||||
```yaml
|
||||
sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
glances:
|
||||
value_template: {% raw %}'{% if is_state("sensor.process_glances", "off") %}not running{% else %}running{% endif %}'{% endraw %}
|
||||
friendly_name: 'Glances'
|
||||
- platform: template
|
||||
sensors:
|
||||
glances:
|
||||
value_template: {% raw %}'{% if is_state("sensor.process_glances", "off") %}not running{% else %}running{% endif %}'{% endraw %}
|
||||
friendly_name: 'Glances'
|
||||
```
|
||||
|
||||
By comparing the details published on the [template](/topics/templating/) page the same can be archived with a different approach:
|
||||
@ -88,31 +87,34 @@ value_template: {% raw %}"{%if states.sensor.ENTITY_ID.state == 'on' %}running{%
|
||||
|
||||
The [Binary template sensor](/components/binary_sensor.template/) is the one in similar cases if you prefer to see an icon instead of text.
|
||||
|
||||
### {% linkable_title Multiline example with an if test (and warnings disabled) %}
|
||||
### {% linkable_title Multiline example with an if test %}
|
||||
|
||||
This example shows a multiple line template with and if test. It looks at a sensing switch and shows on/off in the frontend. It disables warnings to avoid log messages where the switch it depends on isn't loaded yet.
|
||||
This example shows a multiple line template with and if test. It looks at a sensing switch and shows on/off in the frontend.
|
||||
|
||||
```yaml
|
||||
sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
kettle:
|
||||
friendly_name: 'Kettle'
|
||||
{% raw %}value_template: >-
|
||||
{%- if is_state("switch.kettle", "off") %}
|
||||
off
|
||||
{% elif states.switch.kettle.attributes.kwh < 1000 %}
|
||||
standby
|
||||
{% elif is_state("switch.kettle", "on") %}
|
||||
on
|
||||
{% else %}
|
||||
failed
|
||||
{%- endif %}{% endraw %}
|
||||
- platform: template
|
||||
sensors:
|
||||
kettle:
|
||||
friendly_name: 'Kettle'
|
||||
{% raw %}value_template: >-
|
||||
{%- if is_state("switch.kettle", "off") %}
|
||||
off
|
||||
{% elif states.switch.kettle.attributes.kwh < 1000 %}
|
||||
standby
|
||||
{% elif is_state("switch.kettle", "on") %}
|
||||
on
|
||||
{% else %}
|
||||
failed
|
||||
{%- endif %}{% endraw %}
|
||||
|
||||
warnings: Off
|
||||
next_sensor:
|
||||
[...]
|
||||
```
|
||||
|
||||
(please note the blank line to close the multi-line template)
|
||||
<p class='note'>
|
||||
Please note the blank line to close the multi-line template.
|
||||
</p>
|
||||
|
||||
### {% linkable_title Change the unit of measurment %}
|
||||
|
||||
@ -120,15 +122,15 @@ With a template sensor it's easy to convert given values into others if the unit
|
||||
|
||||
```yaml
|
||||
sensor:
|
||||
platform: template
|
||||
sensors:
|
||||
transmission_down_speed_kbps:
|
||||
value_template: {% raw %}'{{ states.sensor.transmission_down_speed.state | multiply(1024) }}'{% endraw %}
|
||||
friendly_name: 'Transmission Down Speed'
|
||||
unit_of_measurement: 'kB/s'
|
||||
transmission_up_speed_kbps:
|
||||
value_template: {% raw %}'{{ states.sensor.transmission_up_speed.state | multiply(1024) }}'{% endraw %}
|
||||
friendly_name: 'Transmission Up Speed'
|
||||
unit_of_measurement: 'kB/s'
|
||||
- platform: template
|
||||
sensors:
|
||||
transmission_down_speed_kbps:
|
||||
value_template: {% raw %}'{{ states.sensor.transmission_down_speed.state | multiply(1024) }}'{% endraw %}
|
||||
friendly_name: 'Transmission Down Speed'
|
||||
unit_of_measurement: 'kB/s'
|
||||
transmission_up_speed_kbps:
|
||||
value_template: {% raw %}'{{ states.sensor.transmission_up_speed.state | multiply(1024) }}'{% endraw %}
|
||||
friendly_name: 'Transmission Up Speed'
|
||||
unit_of_measurement: 'kB/s'
|
||||
```
|
||||
|
||||
|
@ -11,30 +11,45 @@ logo: zigbee.png
|
||||
ha_category: Sensor
|
||||
---
|
||||
|
||||
There are two types of ZigBee sensor available to Home Assistant:
|
||||
There are two types of [ZigBee](http://www.zigbee.org/) sensor available to Home Assistant:
|
||||
|
||||
- [Analog input pin](#analog-input-pin)
|
||||
- [Temperature sensor](#temperature-sensor) (XBee Pro)
|
||||
|
||||
## {% linkable_title Analog Input Pin %}
|
||||
|
||||
The analog input pins on an XBee (non-Pro) will read 0V to 1.2V. This is translated by the [xbee-helper](https://github.com/flyte/xbee-helper) library into a percentage. The maximum voltage your ZigBee device will read is configurable using the `max_volts` configuration variable.
|
||||
|
||||
To configure an analog input pin sensor, use the following variables:
|
||||
|
||||
- **name** (*Required*): The name you'd like to give the sensor in Home Assistant.
|
||||
- **platform** (*Required*): Set to `zigbee`.
|
||||
- **type** (*Required*): Set to `analog`.
|
||||
- **pin** (*Required*): The number identifying which pin to sample.
|
||||
- **address**: The long 64bit address of the remote ZigBee device whose analog input pin you'd like to sample. Do not include this variable if you want to sample the local ZigBee device's pins.
|
||||
- **max_volts**: The maximum voltage which the analog input pin is able to read. Default: `1.2`
|
||||
|
||||
#### Example
|
||||
To configure an analog input pin sensor, add the following to your `configuration.yaml` file:
|
||||
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
sensor:
|
||||
- name: My Analog Input
|
||||
platform: zigbee
|
||||
- platform: zigbee
|
||||
name: My Analog ZigBee Input
|
||||
type: analog
|
||||
pin: 0
|
||||
address: 0013A2004233D138
|
||||
```
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **name** (*Required*): The name you would like to give the sensor in Home Assistant.
|
||||
- **type** (*Required*): Set to `analog` or `temperature`.
|
||||
- **pin** (*Required*): The number identifying which pin to sample
|
||||
- **address** (*Optional*): The long 64 bit address of the remote ZigBee device whose pin you would like to sample. Do not include this variable if you want to sample the local ZigBee device's pins.
|
||||
- **max_volts** (*Optional*): The maximum voltage which the input pin is able to read. Defaults to `1.2`
|
||||
|
||||
|
||||
## {% linkable_title Examples %}
|
||||
|
||||
### {% linkable_title Analog Input Pin %}
|
||||
|
||||
The analog input pins on an XBee (non-Pro) will read 0V to 1.2 V. This is translated by the [xbee-helper](https://github.com/flyte/xbee-helper) library into a percentage. The maximum voltage your ZigBee device will read is configurable using the `max_volts` configuration variable.
|
||||
|
||||
To configure an analog input pin sensor, add the following to your `configuration.yaml` file:
|
||||
|
||||
```yaml
|
||||
## Example configuration.yaml entry
|
||||
sensor:
|
||||
- platform: zigbee
|
||||
name: My Analog ZigBee Input
|
||||
type: analog
|
||||
pin: 0
|
||||
address: 0013A2004233D138
|
||||
@ -44,19 +59,16 @@ See the [Digi knowledge base](http://knowledge.digi.com/articles/Knowledge_Base_
|
||||
|
||||
## {% linkable_title Temperature Sensor %}
|
||||
|
||||
The XBee Pro (and perhaps other third party modules) contains a thermometer device which can be read by using the `TP` AT command. To set this up as a temperature sensor device in Home Assistant use the following config variables:
|
||||
The XBee Pro (and perhaps other third party modules) contains a thermometer device which can be read by using the `TP` AT command.
|
||||
|
||||
- **name** (*Required*): The name you'd like to give the temperature sensor in Home Assistant
|
||||
- **platform** (*Required*): Set to `zigbee`
|
||||
- **type** (*Required*): Set to `temperature`
|
||||
- **address**: The long 64bit address of the remote ZigBee device whose temperature sensor you'd like to sample. Do not include this variable if you want to sample the local ZigBee device's temperature.
|
||||
|
||||
#### Example
|
||||
To configure a temperature sensor device, add the following to your `configuration.yaml` file:
|
||||
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
sensor:
|
||||
- name: Living Room Temperature
|
||||
platform: zigbee
|
||||
- platform: zigbee
|
||||
name: Living Room Temperature ZigBee
|
||||
type: temperature
|
||||
address: 0013A20050E752C5
|
||||
```
|
||||
```
|
||||
|
||||
|
@ -19,7 +19,7 @@ During the day (in between `start time` and `sunset time`), it will fade the lig
|
||||
|
||||
If you don't wish to have flux update on 30 second intervals, you can leave the switch turned off and use automation rules that call the service `switch.flux_update` whenever you want the lights updated.
|
||||
|
||||
To use your TPLink switch in your installation, add the following to your `configuration.yaml` file:
|
||||
To use the Flux switch in your installation, add the following to your `configuration.yaml` file:
|
||||
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
|
@ -22,17 +22,17 @@ To enable Template switches in your installation, add the following to your `con
|
||||
```yaml
|
||||
# Example configuration.yaml entry
|
||||
switch:
|
||||
platform: template
|
||||
- platform: template
|
||||
switches:
|
||||
skylight:
|
||||
friendly_name: 'Skylight'
|
||||
value_template: {% raw %}'{{ states.sensor.skylight.state }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_open
|
||||
turn_off:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_close
|
||||
skylight:
|
||||
friendly_name: 'Skylight'
|
||||
value_template: {% raw %}'{{ is_state('sensor.skylight', 'on') }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_open
|
||||
turn_off:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_close
|
||||
```
|
||||
|
||||
Configuration variables:
|
||||
@ -42,7 +42,13 @@ Configuration variables:
|
||||
- **value_template** (*Required*): Defines a [template](/topics/templating/) to set the state of the switch.
|
||||
- **turn_on** (*Required*): Defines an [action](/getting-started/automation/) to run when the switch is turned on.
|
||||
- **turn_off** (*Required*): Defines an [action](/getting-started/automation/) to run when the switch is turned off.
|
||||
- **entity_id** (*Optional*): Add a list of entity_ids so the sensor only reacts to state changes of these entities. This will reduce the number of times the sensor will try to update it's state.
|
||||
- **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 switch will try to update it's state.
|
||||
|
||||
|
||||
## {% linkable_title Considerations %}
|
||||
|
||||
If you are using the state of a platform that takes extra time to load, the template switch may get an 'unknown' state during startup. This results in error messages in your log file until that platform has completed loading. If you use is_state() function in your template, you can avoid this situation. For example, you would replace {% raw %}'{{ states.switch.source.state }}'{% endraw %} with this equivalent that returns true/false and never gives an unknown result:
|
||||
{% raw %}'{{ is_state('switch.source', 'on') }}'{% endraw %}
|
||||
|
||||
## {% linkable_title Examples %}
|
||||
|
||||
@ -54,16 +60,16 @@ This example shows a switch that copies another switch.
|
||||
|
||||
```yaml
|
||||
switch:
|
||||
platform: template
|
||||
- platform: template
|
||||
switches:
|
||||
copy:
|
||||
value_template: {% raw %}'{{ states.switch.source.state }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.source
|
||||
turn_off:
|
||||
service: switch.turn_off
|
||||
entity_id: switch.source
|
||||
copy:
|
||||
value_template: {% raw %}'{{ is_state('switch.source', 'on') }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.source
|
||||
turn_off:
|
||||
service: switch.turn_off
|
||||
entity_id: switch.source
|
||||
````
|
||||
|
||||
### {% linkable_title Toggle switch %}
|
||||
@ -72,17 +78,17 @@ This example shows a switch that takes its state from a sensor, and toggles a sw
|
||||
|
||||
```yaml
|
||||
switch:
|
||||
platform: template
|
||||
- platform: template
|
||||
switches:
|
||||
blind:
|
||||
friendly_name: 'Blind'
|
||||
value_template: {% raw %}'{{ state }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.toggle
|
||||
entity_id: switch.blind_toggle
|
||||
turn_off:
|
||||
service: switch.toggle
|
||||
entity_id: switch.blind_toggle
|
||||
blind:
|
||||
friendly_name: 'Blind'
|
||||
value_template: {% raw %}'{{ state }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.toggle
|
||||
entity_id: switch.blind_toggle
|
||||
turn_off:
|
||||
service: switch.toggle
|
||||
entity_id: switch.blind_toggle
|
||||
```
|
||||
|
||||
### {% linkable_title Sensor and two switches %}
|
||||
@ -91,15 +97,16 @@ This example shows a switch that takes its state from a sensor, and uses two mom
|
||||
|
||||
```yaml
|
||||
switch:
|
||||
platform: template
|
||||
- platform: template
|
||||
switches:
|
||||
skylight:
|
||||
friendly_name: 'Skylight'
|
||||
value_template: {% raw %}'{{ states.sensor.skylight.state }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_open
|
||||
turn_off:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_close
|
||||
skylight:
|
||||
friendly_name: 'Skylight'
|
||||
value_template: {% raw %}'{{ is_state('sensor.skylight.state', 'on') }}'{% endraw %}
|
||||
turn_on:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_open
|
||||
turn_off:
|
||||
service: switch.turn_on
|
||||
entity_id: switch.skylight_close
|
||||
```
|
||||
|
||||
|
@ -18,19 +18,18 @@ 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 component](https://github.com/home-assistant/home-assistant/tree/master/config/panels).
|
||||
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 `<config dir>/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.
|
||||
|
||||
```yaml
|
||||
panel_custom:
|
||||
- name: todomvc
|
||||
- name: react
|
||||
sidebar_title: TodoMVC
|
||||
sidebar_icon: mdi:work
|
||||
url_path: my-todomvc
|
||||
webcomponent_path: <config dir>/panels/<component name>.html
|
||||
url_path: todomvc
|
||||
config:
|
||||
hello: world
|
||||
title: hello
|
||||
```
|
||||
|
||||
This video shows the example in action.
|
||||
|
@ -7,6 +7,7 @@
|
||||
<li><a href='/getting-started/'>Get started with Home Assistant</a></li>
|
||||
<li><a href='/demo/'>Try the online demo</a></li>
|
||||
<li><a class="twitter-follow-button" href="https://twitter.com/Home_Assistant">Follow Home Assistant on Twitter</a></li>
|
||||
<li><div class="fb-like" data-href="https://www.facebook.com/homeassistantio/" data-layout="standard" data-action="like" data-size="small" data-show-faces="true" data-share="false"></div></li>
|
||||
</ul>
|
||||
</section>
|
||||
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.async=true;js.src='//platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
|
||||
|
@ -57,6 +57,17 @@ I would like to do a shoutout to [@fabianhjr]. He has started adding [typing] da
|
||||
- Qwikswitch: Stability fixes ([@kellerza])
|
||||
- Light: [Hyperion] keeps now track of active color ([@schneefux])
|
||||
|
||||
### {% linkable_title Hotfix 0.25.1 - August 1 %}
|
||||
|
||||
- Light - Z-Wave: Bring back delayed value update behavior ([@jnewland])
|
||||
- Recorder: Properly close session after execute ([@kellerza])
|
||||
- Media Player - Kodi: No longer block startup if connecting to wrong port ([@shoekstra])
|
||||
- Downgrade voluptuous to 0.8.9 as it blocked the upgrade for some ([@balloob])
|
||||
|
||||
### {% linkable_title Hotfix 0.25.2 - August 2 %}
|
||||
|
||||
- Hotfix to make sure Z-Wave locks work again. Thanks to @tobiebooth for the quick fix.
|
||||
|
||||
### {% linkable_title Breaking changes %}
|
||||
|
||||
- Google Voice SMS notification support was removed.
|
||||
@ -89,6 +100,8 @@ I would like to do a shoutout to [@fabianhjr]. He has started adding [typing] da
|
||||
[@vladonemo]: https://github.com/vladonemo
|
||||
[@w1ll1am23]: https://github.com/w1ll1am23
|
||||
[@zeroDenial]: https://github.com/zeroDenial
|
||||
[@jnewland]: https://github.com/jnewland
|
||||
[@shoekstra]: https://github.com/shoekstra
|
||||
|
||||
[custom-panels]: /developers/frontend_creating_custom_panels/
|
||||
[iframe_panel]: /components/panel_iframe/
|
||||
|
115
source/_posts/2016-08-03-laundry-automation-update.markdown
Normal file
@ -0,0 +1,115 @@
|
||||
---
|
||||
layout: post
|
||||
title: "Laundry Sensors with NodeMCU and Home Assistant"
|
||||
description: "Nolan describes how he gets notified when laundry is done."
|
||||
date: 2016-08-03 10:22 -0700
|
||||
date_formatted: "August 2, 2016"
|
||||
author: Nolan Gilley
|
||||
comments: true
|
||||
categories: User-Stories
|
||||
og_image: /images/blog/2016-07-laundry-automation/protoboard.jpg
|
||||
---
|
||||
|
||||
_This is a guest post by Home Assistant user and contributor [Nolan Gilley](https://github.com/nkgilley)._
|
||||
|
||||
Today I'll show you how I used Home Assistant, a NodeMCU (ESP8266), and a couple of accelerometers to automate our laundry room. This is a rewrite of an [old post](https://home-assistant.io/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/) where I did the same thing using a Moteino & Raspberry Pi. This version only requires a NodeMCU.
|
||||
|
||||
We have an older washer and dryer which doesn't have any form of notification when cycles complete. Home Assistant was the obvious solution, I just needed to create sensors for the washer and dryer. I tried using sound sensors but found them unreliable. I ended up using an accelerometer attached to the back of each appliance. I also added magnetic reed switches on the doors of the washer and dryer to detect whether they're open or closed. I connected the accelerometers and reed switches to an NodeMCU which will relay the data to my MQTT broker.
|
||||
|
||||
<p class='img'>
|
||||
<img src='/images/blog/2016-07-laundry-automation/block-diagram.png' />
|
||||
Block diagram of schematic
|
||||
</p>
|
||||
|
||||
<!--more-->
|
||||
|
||||
After taking some sample data from the accelerometers while each appliance was in operation, I decided to plot the data to help determine the proper thresholds of when the devices were running or off. I had to do this in order to get precise ranges so the dryer sensor wouldn't get tripped by the washer or vice versa. In the plot below you can see the acceleration in each direction for the accelerometer connected to the dryer. It's easy to see when the dryer is in operation here. I used the same technique for the washer's accelerometer.
|
||||
|
||||
<p class='img'>
|
||||
<img src='/images/blog/2016-07-laundry-automation/data-graph.png' />
|
||||
Graph showing the accelerometer data
|
||||
</p>
|
||||
|
||||
Next it was just a matter of integrating everything with Home Assistant. I was able to use the [MQTT component](/components/mqtt/) to read the washer and dryer states from the Moteino and display it in Home Assistant.
|
||||
|
||||
<p class='img'>
|
||||
<img src='/images/blog/2016-07-laundry-automation/screenshot-ha.png' />
|
||||
Status of the dryer and washer in Home Assistant
|
||||
</p>
|
||||
|
||||
Next I wrote [scripts](/components/script/) that are run whenever the washer or dryer completes a load. This is triggered by the [automation component](/getting-started/automation/). When the laundry is complete I have the lights in the house turn red and [notify me via Join](/components/notify.joaoapps_join/). Once the door is opened and laundry emptied another script runs that sets the lights back to normal. So far it has been very helpful and very reliable.
|
||||
|
||||
<p class='img'>
|
||||
<a href='/images/blog/2016-07-laundry-automation/protoboard.jpg'>
|
||||
<img src='/images/blog/2016-07-laundry-automation/protoboard.jpg' />
|
||||
</a>
|
||||
NodeMCU connected to MPU-6050 accelerometer.
|
||||
</p>
|
||||
|
||||
Materials used:
|
||||
|
||||
- [NodeMCU](https://www.amazon.com/gp/product/B010O1G1ES)
|
||||
- [2 x Accelerometers](http://www.amazon.com/gp/product/B008BOPN40)
|
||||
- [2 x Reed switch](http://www.amazon.com/gp/product/B004PARDRO)
|
||||
|
||||
[Sketch for the NodeMCU is available here.](https://github.com/nkgilley/nodemcu-laundry/blob/master/nodemcu-laundry.ino)
|
||||
|
||||
Home Assistant Configuration:
|
||||
|
||||
```yaml
|
||||
mqtt:
|
||||
broker: 192.168.1.100
|
||||
port: 1883
|
||||
keepalive: 60
|
||||
qos: 0
|
||||
|
||||
sensor:
|
||||
- platform: mqtt
|
||||
name: "Dryer Status"
|
||||
state_topic: "sensor/dryer"
|
||||
unit_of_measurement: ""
|
||||
|
||||
- platform: mqtt
|
||||
name: "Washer Status"
|
||||
state_topic: "sensor/washer"
|
||||
unit_of_measurement: ""
|
||||
|
||||
automation:
|
||||
- alias: Washer complete
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: sensor.washer_status
|
||||
from: 'Running'
|
||||
to: 'Complete'
|
||||
action:
|
||||
service: script.turn_on
|
||||
entity_id: script.washer_complete
|
||||
|
||||
- alias: Washer emptied
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: sensor.washer_status
|
||||
from: 'Complete'
|
||||
to: 'Empty'
|
||||
action:
|
||||
service: scene.turn_on
|
||||
entity_id: scene.normal
|
||||
|
||||
script:
|
||||
washer_complete:
|
||||
alias: Washer Complete
|
||||
sequence:
|
||||
- alias: Join Notification
|
||||
service: notify.join
|
||||
data:
|
||||
message: "The washing machine has finished its cycle, please empty it!"
|
||||
- alias: Living Room Lights Blue
|
||||
service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.blue
|
||||
```
|
||||
|
||||
Resources used:
|
||||
|
||||
- [Inspiration and Help with Arduino code](http://www.instructables.com/id/Uber-Home-Automation-w-Arduino-Pi/step13/Washer-Dryer-Smartifier-Water-Leak-Sensor/)
|
||||
|
@ -0,0 +1,180 @@
|
||||
---
|
||||
layout: post
|
||||
title: "Optimizing the Home Assistant mobile web app"
|
||||
description: "A comprehensive list of optimizations done to improve our mobile web application."
|
||||
date: 2016-08-07 12:36 -0700
|
||||
date_formatted: "August 7, 2016"
|
||||
author: Paulus Schoutsen
|
||||
comments: true
|
||||
categories: Technology
|
||||
og_image: /images/blog/2016-08-optimizing-web-app/performance-diagram.png
|
||||
---
|
||||
|
||||
_This blog post will go into detail about the recent performance optimizations that went into the Home Assistant front end. For people not familiar with the app, check out [the demo][demo] and [the source][hap]._
|
||||
|
||||
TL; DR: Don’t hack the framework, separate responsibilities, ship less, use service workers, use (future) web standards.
|
||||
|
||||
This year at Google I/O I saw Monica from the Polymer team talk about web components and performance. In her talk [she mentions a mantra][mantra] that they use in the Polymer team to make things fast: **Do less and be lazy**.
|
||||
|
||||
Do less and be lazy. It sounds so obvious and it took a while before it started to dawn on me. I think most of the code I write is pretty fast, but I don't often stop to take a harder look at how and when it runs in practice. When do we need the result, can it be postponed?
|
||||
|
||||
And thus started my journey to take a critical look at how the Home Assistant app was working and how to make things faster. Below is the list of the different things that I did to make it fast.
|
||||
|
||||
I hope this list can be useful to other people, as a guide for optimizing their own apps or for avoiding pitfalls when building a new one.
|
||||
|
||||
The first thing to do is to measure. The Home Assistant front end is a mobile web app, so we shouldn’t measure this on a machine with 8 cores and gigabytes of ram but instead measure on devices you expect a mobile web app to run: phones. Below are two timelines recorded with Home Assistant 0.18.2 (pre-optimizations) and Google Chrome 53. **On my Mac the app starts in 1400 miliseconds and on my Nexus 5x in ~6500 miliseconds (~4.5 times slower!).**
|
||||
|
||||
<p class='img'>
|
||||
<img
|
||||
src='/images/blog/2016-08-optimizing-web-app/performance-timeline-0.18.2.png'
|
||||
alt='Timeline of loading the front end in Home Assistant 0.18.2' />
|
||||
</p>
|
||||
|
||||
Although the app takes 6500 milliseconds to load on my phone, it would perform well afterwards. Still, that initial load is unacceptable. You expect to open an app on your phone and be able to use it, quickly. After I applied all the changes described below, I managed to reduce startup time to 900 miliseconds (-35%) on my Mac and 2400 miliseconds (-63%) on my Nexus 5x. [Check out the demo here.][demo]
|
||||
|
||||
<p class='img'>
|
||||
<img
|
||||
src='/images/blog/2016-08-optimizing-web-app/performance-diagram.png'
|
||||
alt='diagram showing old and new loading times next to one another' />
|
||||
<img
|
||||
src='/images/blog/2016-08-optimizing-web-app/performance-timeline-0.26.png'
|
||||
alt='Timeline of loading the front end in Home Assistant 0.26' />
|
||||
</p>
|
||||
|
||||
<!--more-->
|
||||
|
||||
## {% linkable_title Technology %}
|
||||
|
||||
The Home Assistant front end consists of two parts. There is [Home Assistant JS][hajs], which controls all data and interaction between JavaScript and the server. It is a Flux architecture using [NuclearJS] and [ImmutableJS]. The UI is implemented by [Home Assistant Polymer][hap] using [Polymer] and web components.
|
||||
|
||||
# {% linkable_title Don’t hack the framework %}
|
||||
|
||||
I thought to be smart. I split out the JavaScript part of all web components and bundled them separately using Webpack so that I could use ES2015 via BabelJS ([architecture][es2015-arch]). This is not how Polymer components are written and it meant that I was unable to use any of the tooling that is available in the community or easily split up the bundle (more on this later).
|
||||
|
||||
So I went ahead and backported all my web components back from shiny beautiful ES6 to ES5. And you know what? It’s not that bad. Yes, not being able to use the concise object notation and arrow functions make your code more verbose. But in the end it is the same code that is running in browsers.
|
||||
|
||||
Another benefit of having each web component contain their own script tag is that the browser will process them one by one, allowing the browser to render our loading spinner animation in between.
|
||||
|
||||
As you can see in the timelines, we were able to get rid of most of the blocking component loading.
|
||||
|
||||
<p class='img'>
|
||||
<img
|
||||
src='/images/blog/2016-08-optimizing-web-app/timeline-no-more-es2015.png'
|
||||
alt='Timeline of loading the front end before and after the optimization' />
|
||||
</p>
|
||||
|
||||
# {% linkable_title Separate responsibilities %}
|
||||
|
||||
Whenever you learn a new technology, you feel like you’ve learned a new superpower. Wow, I can do all this with only 2 lines?! I had the same with bundling.
|
||||
|
||||
I was initially very focused on shipping just a single file with everything that my app needed. The entry point would be my main component which would require all of its Flux and UI dependencies. Then, just before it all would be rendered, it would check if there is authentication and start the data fetching.
|
||||
|
||||
This is a very bad pattern. This means that you will not start any data fetching until your UI is ready to render. Instead, you want your data to be fetched as soon as possible, and while the request is out to the server you want the page to load all your UI components.
|
||||
|
||||
To accomplish this I extracted the application core out of the main bundle. In the current optimized version it’s 31.1kb gzip’d. It is loaded before any other scripts so that it can start fetching data as soon as possible.
|
||||
|
||||
<p class='img'>
|
||||
<img
|
||||
src='/images/blog/2016-08-optimizing-web-app/timeline-corejs.png'
|
||||
alt='Timeline of loading the front end before and after the optimization' />
|
||||
</p>
|
||||
|
||||
When the data does come back before the UI is done loading, we can process it before we start rendering the UI because of all the web components being processed individually. This means that we don't have to show a loading screen the first time our components render – we can just render the components with the data they require.
|
||||
|
||||
# {% linkable_title Ship less %}
|
||||
|
||||
The theory behind this one is simple: if we manage to ship less code, the browser has to process less code and it will start faster.
|
||||
|
||||
## {% linkable_title Only include the components for the page that you will show %}
|
||||
|
||||
The Home Assistant mobile web application has 10 different panels (pages). Besides that, it also has a dialog for each type of device to show more info. That’s a lot of components and screens of which only a very small set is needed at the start. That means that we are shipping a lot of unnecessary data that the browser has to process before our initial render!
|
||||
|
||||
I broke up each panel of the app into a separate bundle that will be loaded on demand. This saved 250 kilobytes (pre-gzip) on just the embedded map alone! This change, however, required some significant changes to our build process.
|
||||
|
||||
Breaking up an app in JavaScript is complex because each module explicitly imports their dependencies. This has to continue to work in your browser after breaking it up in multiple files. Web components do not have this problem as it’s part of the platform and thus your browser is the registry! An unregistered web component will be rendered as an empty span element until the element gets registered. Loading order is not important.
|
||||
|
||||
```javascript
|
||||
// Example of the flexibility of web components.
|
||||
var spinner = document.createElement('paper-spinner');
|
||||
spinner.active = true;
|
||||
document.body.appendChild(spinner);
|
||||
```
|
||||
|
||||
Because the browser tracks your web components, creating standalone bundles for parts of the app is easy:
|
||||
|
||||
- Find all dependencies included in the main bundle (using [hydrolysis])
|
||||
- Create individual bundles of each panel (page) but filter out the dependencies included in main bundle.
|
||||
|
||||
The [build script][build-html] that bundles and minifies the main bundle and panel bundles is <100 lines.
|
||||
|
||||
## {% linkable_title Change the JavaScript bundler to Rollup %}
|
||||
|
||||
Core.js is still pure JavaScript and requires bundling. In my journey to get a smaller bundle, I went from [Webpack] to Webpack 2 to [Rollup]. At each step the bundle got smaller. Rollup is the big winner here because it doesn’t wrap all your modules in function calls but instead concatenates all files with minimal changes to make it work. This not only reduces the file size but also the loading speed. This is because the JavaScript engine will no longer have to invoke a function to resolve each import, it’s doing less work. This might not mean much for a computer but on a phone, everything counts.
|
||||
|
||||
## {% linkable_title Scrutinize dependencies %}
|
||||
|
||||
If the goal is to ship less, it’s time to take a good look at dependencies. It’s so often that we decide to fall back to yet another NPM package that makes our life a little easier but comes at the cost of size – size usually taken up by functionality that you might never need.
|
||||
|
||||
### {% linkable_title Remove Lodash %}
|
||||
I realized that I only used a few methods of lodash. Lodash (and previously underscore) used to be one of the dependencies that would always be one of the first things that I would add to any project I start. But I could no longer justify it in the case of Home Assistant. Even with dead tree shaking it was not worth including it. Yes, they support a lot of edge cases but those were not relevant to my use case. And standalone lodash packages are [still huge][lodash.range]. The only thing that I couldn’t replace with a few lines of my own code was debounce. However I found [a 40 line replacement][debounce].
|
||||
|
||||
### {% linkable_title Replace moment.js with Fecha %}
|
||||
|
||||
Moment.js is one of those power libraries. It is able to handle any date problem that you can throw at it. But this obviously comes at the cost of size. [Fecha] is a date formatting library at ~8% the size of moment.js (only 4.7kb pre-gzip). The only thing that it does not contain is date manipulation, which was something that was not being used.
|
||||
|
||||
# {% linkable_title Use Service worker to instantly load the app %}
|
||||
|
||||
Using a service worker we’re able to store all app components and core javascript in the browser. This means that after their first visit, the browser will only have to go to the network to fetch the latest data from the server.
|
||||
|
||||
Creating a service worker is easy using [sw-precache], a service worker generation tool.
|
||||
|
||||
When a browser does not support service workers, Home Assistant will serve fingerprinted assets that are aggressively cached. Only when the content changes will the client redownload the asset.
|
||||
|
||||
Using fingerprinting with sw-precache required jumping through a few hoops. [The final build script can be found here.][build-sw]
|
||||
|
||||
# {% linkable_title Make it feel fast %}
|
||||
|
||||
This one is more psychological: no one likes staring at a white screen because white screens are ambiguous: are we loading something, is there a crappy connection or maybe even a script error? That’s why it is very important to render something on the screen to show that the rest is being loaded, and as quickly as possible.
|
||||
|
||||
The Home Assistant landing page contains just enough CSS and HTML to render the loading screen minus the animations.
|
||||
|
||||
Now that the app is fast enough, I might swap out moving from a lite loading screen to drawing an empty toolbar. This makes it look like the UI is almost there.
|
||||
|
||||
# {% linkable_title Using a framework build on web standards %}
|
||||
|
||||
_I left this to the end of the list, mainly because I had no influence on this. Polymer just happened to ship an update while I was optimizing the application which gave a big boost to the loading time._
|
||||
|
||||
By using Polymer we have the ability to use tomorrow’s web standards today. This is powered by polyfills. A polyfill will use JavaScript to simulate the behavior that the web standard would have taken care of. As browsers progress, more work can move from the polyfills back to the browsers. This is great because browsers will be able to optimize the work better and thus be faster.
|
||||
|
||||
Polymer 1.6 was introduced at the end of June and allowed the app to take advantage of native [CSS variables][css-vars] in Chrome and Firefox. It also introduced lazy registration. Both greatly sped up our loading times.
|
||||
|
||||
# {% linkable_title Future optimizations %}
|
||||
|
||||
A lot of optimizations have been applied but this journey will never be over. There are still a lot of opportunities to make things even faster. Some ideas that are on my list to explore:
|
||||
|
||||
- Use shadow DOM instead of shady DOM polyfill.
|
||||
- Use [closure compiler][closure] to optimize the JavaScript.
|
||||
- Reduce the number of icons that are loaded.
|
||||
- Embed initial API response in served page if not using a service worker.
|
||||
- Reduce size of initial bundle by moving out all things that are not visible for initial paint. For example the dialogs that show more info about entities.
|
||||
- Prefetch the other pages using `<link rel="preload" …>`
|
||||
|
||||
[demo]: https://home-assistant.io/demo
|
||||
[hap]: https://github.com/home-assistant/home-assistant-polymer
|
||||
[mantra]: https://www.youtube.com/watch?v=zfQoleQEa4w&feature=youtu.be&t=1380
|
||||
[sw-precache]: https://github.com/GoogleChrome/sw-precache
|
||||
[hydrolysis]: https://github.com/Polymer/hydrolysis
|
||||
[hajs]: https://github.com/home-assistant/home-assistant-js
|
||||
[es2015-arch]: https://github.com/home-assistant/home-assistant-polymer/wiki/Using-Polymer-with-ES2015,-Babel-and-NPM
|
||||
[NuclearJS]: https://optimizely.github.io/nuclear-js/
|
||||
[ImmutableJS]: https://facebook.github.io/immutable-js/
|
||||
[Polymer]: https://www.polymer-project.org/
|
||||
[build-html]: https://github.com/home-assistant/home-assistant-polymer/blob/master/script/vulcanize.js
|
||||
[Webpack]: https://webpack.github.io/
|
||||
[Rollup]: http://rollupjs.org/
|
||||
[lodash.range]: https://github.com/lodash/lodash/blob/3.1.7-npm-packages/lodash.range/index.js
|
||||
[debounce]: https://github.com/component/debounce
|
||||
[Fecha]: https://github.com/taylorhakes/fecha
|
||||
[build-sw]: https://github.com/home-assistant/home-assistant-polymer/blob/master/script/sw-precache.js
|
||||
[css-vars]: https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_variables
|
||||
[closure]: https://developers.google.com/closure/compiler/
|
@ -13,9 +13,9 @@ The `configuration.yaml` file a plain-text file thus it is readable for everyone
|
||||
|
||||
### {% linkable_title Using secrets.yaml %}
|
||||
|
||||
The workflow for the outsourcing in the `secrets.yaml` are very similar to the [splitting of the configuration](/topics/splitting_configuration/). Create a `secrets.yaml` file in your Home assistant configuration directory (The location of the folder differs between operating systems: on OS X and Linux it's `~/.homeassistant` and on Windows it's `%APPDATA%/.homeassistant`).
|
||||
The workflow for the outsourcing in the `secrets.yaml` is very similar to the [splitting of the configuration](/topics/splitting_configuration/). Create a `secrets.yaml` file in your Home assistant configuration directory (The location of the folder differs between operating systems: on OS X and Linux it's `~/.homeassistant` and on Windows it's `%APPDATA%/.homeassistant`).
|
||||
|
||||
The entries for password and API keys in the `configuration.yaml` file usally looks like the example below.
|
||||
The entries for password and API keys in the `configuration.yaml` file usually looks like the example below.
|
||||
|
||||
```yaml
|
||||
http:
|
||||
@ -29,7 +29,7 @@ http:
|
||||
api_password: !secret http_password
|
||||
```
|
||||
|
||||
The `secrets.yaml` files stored the corresponding password assigned to the identifier.
|
||||
The `secrets.yaml` file contains the corresponding password assigned to the identifier.
|
||||
|
||||
```yaml
|
||||
logger: debug
|
||||
@ -44,7 +44,7 @@ Using [Keyring](http://pythonhosted.org/keyring/) is an alternative way to `secr
|
||||
$ pip3 install keyring
|
||||
```
|
||||
|
||||
Replaced your password or API key with `!secret` and an identifier in `configuration.yaml` file.
|
||||
Replace your password or API key with `!secret` and an identifier in `configuration.yaml` file.
|
||||
|
||||
```yaml
|
||||
http:
|
||||
|
@ -37,3 +37,5 @@ Attribute | Description
|
||||
`entity_picture` | Url to a picture that should be used instead of showing the domain icon. Example: `http://example.com/picture.jpg`.
|
||||
`assumed_state` | Boolean if the current state is an assumption. [More info](https://home-assistant.io/blog/2016/02/12/classifying-the-internet-of-things/#classifiers) Example: `True`.
|
||||
`unit_of_measurement` | The unit of measurement the state is expressed in. Used for grouping graphs or understanding the entity. Example: `°C`.
|
||||
|
||||
When an attribute contains spaces, you can retrieve it like this: `states.sensor.livingroom.attributes["Battery numeric"]`.
|
||||
|
@ -16,6 +16,13 @@
|
||||
user-scalable=no' />
|
||||
<meta name='theme-color' content='#03a9f4'>
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Roboto', 'Noto', sans-serif;
|
||||
font-weight: 300;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
#ha-init-skeleton {
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
@ -64,10 +71,7 @@
|
||||
.classList.add('error');
|
||||
};
|
||||
window.noAuth = true;
|
||||
window.deferredLoading = {
|
||||
map: '/demo/partial-map.html',
|
||||
dev: '/demo/dev-tools.html',
|
||||
};
|
||||
window.Polymer = {lazyRegister: true, useNativeCSSProperties: true, dom: 'shady'}
|
||||
</script>
|
||||
</head>
|
||||
<body fullbleed>
|
||||
|
1
source/demo/panels/ha-panel-dev-event.html
Normal file
2
source/demo/panels/ha-panel-dev-info.html
Normal file
@ -0,0 +1,2 @@
|
||||
<html><head><meta charset="UTF-8"></head><body><dom-module id="ha-panel-dev-info"><template><style include="iron-positioning ha-style">:host{background-color:#fff;-ms-user-select:initial;-webkit-user-select:initial;-moz-user-select:initial}.content{padding:24px}.about{text-align:center;line-height:2em}.version{@apply(--paper-font-headline)}.develop{@apply(--paper-font-subhead)}.about a{color:var(--dark-primary-color)}.error-log-intro{margin-top:16px;border-top:1px solid var(--light-primary-color);padding-top:16px}paper-icon-button{float:right}.error-log{@apply(--paper-font-code1)
|
||||
clear: both;white-space:pre-wrap}</style><app-header-layout has-scrolling-region=""><app-header fixed=""><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">About</div></app-toolbar></app-header><div class="content fit"><div class="about"><p class="version"><a href="https://home-assistant.io"><img src="/static/icons/favicon-192x192.png" height="192"></a><br>Home Assistant<br>[[hassVersion]]</p><p class="develop"><a href="https://home-assistant.io/developers/credits/" target="_blank">Developed by a bunch of awesome people.</a></p><p>Published under the MIT license<br>Source: <a href="https://github.com/balloob/home-assistant" target="_blank">server</a> — <a href="https://github.com/balloob/home-assistant-polymer" target="_blank">frontend-ui</a> — <a href="https://github.com/balloob/home-assistant-js" target="_blank">frontend-core</a></p><p>Built using <a href="https://www.python.org">Python 3</a>, <a href="https://www.polymer-project.org" target="_blank">Polymer [[polymerVersion]]</a>, <a href="https://optimizely.github.io/nuclear-js/" target="_blank">NuclearJS [[nuclearVersion]]</a><br>Icons by <a href="https://www.google.com/design/icons/" target="_blank">Google</a> and <a href="https://MaterialDesignIcons.com" target="_blank">MaterialDesignIcons.com</a>.</p></div><p class="error-log-intro">The following errors have been logged this session:<paper-icon-button icon="mdi:refresh" on-tap="refreshErrorLog"></paper-icon-button></p><div class="error-log">[[errorLog]]</div></div></app-header-layout></template></dom-module><script>Polymer({is:"ha-panel-dev-info",behaviors:[window.hassBehavior],properties:{hass:{type:Object},narrow:{type:Boolean,value:!1},showMenu:{type:Boolean,value:!1},hassVersion:{type:String,bindNuclear:function(r){return r.configGetters.serverVersion}},polymerVersion:{type:String,value:Polymer.version},nuclearVersion:{type:String,value:"1.3.0"},errorLog:{type:String,value:""}},attached:function(){this.refreshErrorLog()},refreshErrorLog:function(r){r&&r.preventDefault(),this.errorLog="Loading error log…",this.hass.errorLogActions.fetchErrorLog().then(function(r){this.errorLog=r||"No errors have been reported."}.bind(this))}})</script></body></html>
|
1
source/demo/panels/ha-panel-dev-service.html
Normal file
1
source/demo/panels/ha-panel-dev-state.html
Normal file
2
source/demo/panels/ha-panel-dev-template.html
Normal file
4
source/demo/panels/ha-panel-history.html
Normal file
1
source/demo/panels/ha-panel-iframe.html
Normal file
@ -0,0 +1 @@
|
||||
<html><head><meta charset="UTF-8"></head><body><dom-module id="ha-panel-iframe"><template><style include="ha-style">iframe{border:0;width:100%;height:calc(100% - 64px)}</style><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">[[panel.title]]</div></app-toolbar><iframe src="[[panel.config.url]]" sandbox="allow-forms allow-popups allow-pointer-lock allow-same-origin allow-scripts"></iframe></template></dom-module><script>Polymer({is:"ha-panel-iframe",properties:{panel:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean}}})</script></body></html>
|
4
source/demo/panels/ha-panel-logbook.html
Normal file
@ -78,10 +78,11 @@ This page contains a list of people who have contributed in one way or another t
|
||||
- [Florian Holzapfel](https://github.com/florianholzapfel)
|
||||
- [fotoetienne](https://github.com/fotoetienne)
|
||||
- [Fredrik Haglund](https://github.com/PetitCircuitLab)
|
||||
- [Fredrik Lindqvist](https://github.com/Landrash)
|
||||
- [GadgetReactor](https://github.com/GadgetReactor)
|
||||
- [Geoff Norton](https://github.com/kangaroo)
|
||||
- [goir](https://github.com/goir)
|
||||
- [gottsman](https://github.com/gottsman)
|
||||
- [Kevin Gottsman](https://github.com/gottsman)
|
||||
- [Greg Dowling](https://github.com/pavoni)
|
||||
- [Guillem Barba](https://github.com/gbarba)
|
||||
- [Gustav Ahlberg](https://github.com/Gyran)
|
||||
@ -97,6 +98,7 @@ This page contains a list of people who have contributed in one way or another t
|
||||
- [Ian Copp](https://github.com/icopp)
|
||||
- [Igor Shults](https://github.com/ishults)
|
||||
- [Issac Kelly](https://github.com/issackelly)
|
||||
- [Jacob Tomlinson](https://github.com/jacobtomlinson)
|
||||
- [James Cole](https://github.com/jamespcole)
|
||||
- [Jan Harkes](https://github.com/jaharkes)
|
||||
- [Jan-Preben Mossin](https://github.com/jpmossin)
|
||||
|
67
source/developers/development_validation.markdown
Normal file
@ -0,0 +1,67 @@
|
||||
---
|
||||
layout: page
|
||||
title: "Validate the input"
|
||||
description: "Validation of entries in configuration.yaml"
|
||||
date: 2016-08-11 20:00
|
||||
sidebar: true
|
||||
comments: false
|
||||
sharing: true
|
||||
footer: true
|
||||
---
|
||||
|
||||
The `configuration.yaml` file contains the configuration options for components and platforms. To ensure that the given configuration provided by the user is valid we use [voluptuous](https://pypi.python.org/pypi/voluptuous) to check it. Certain entries are optional or could be required for the setup of a platform or a component. Others must be of a certain type or out of an already defined list. This will ensure that the users are notified if something is wrong with a platform or component setup before Home Assistant is running.
|
||||
|
||||
Beside the [voluptuous](https://pypi.python.org/pypi/voluptuous) default types are a bunch of custom types available. To get a full overview take a look at the [config_validation.py](https://github.com/home-assistant/home-assistant/blob/master/homeassistant/helpers/config_validation.py) helper.
|
||||
|
||||
- Types: `string`, `byte`, and `boolean`
|
||||
- Entity ID: `entity_id` and `entity_ids`
|
||||
- Numbers: `small_float` and `positive_int`
|
||||
- Time: `time`, `time_zone`
|
||||
- Misc: `template`, `slug`, `temperature_unit`, `latitude`, `longitude`, `isfile`, `sun_event`, `ensure_list`, and `icon`
|
||||
|
||||
To validate plaforms using [MQTT](/components/mqtt/) there are `valid_subscribe_topic` and `valid_publish_topic` present.
|
||||
|
||||
### {% linkable_title Snippets %}
|
||||
|
||||
This section contains a couple of snippets for the validation we use.
|
||||
|
||||
### {% linkable_title Default name %}
|
||||
|
||||
```python
|
||||
DEFAULT_NAME = 'Sensor name'
|
||||
|
||||
PLATFORM_SCHEMA = vol.Schema({
|
||||
...
|
||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||
```
|
||||
|
||||
### {% linkable_title Port %}
|
||||
|
||||
As all port numbers are coming out of the range 1 till 65535 a range check should be performed.
|
||||
|
||||
```python
|
||||
DEFAULT_PORT = 993
|
||||
|
||||
PLATFORM_SCHEMA = vol.Schema({
|
||||
[...]
|
||||
vol.Optional(CONF_PORT, default=DEFAULT_PORT):
|
||||
vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)),
|
||||
```
|
||||
|
||||
### {% linkable_title Sensor types %}
|
||||
|
||||
If a sensor has a pre-defined list of available options it should be tested if the configuration entry matches it.
|
||||
|
||||
```python
|
||||
SENSOR_TYPES = {
|
||||
'article_cache': ('Article Cache', 'MB'),
|
||||
'average_download_rate': ('Average Speed', 'MB/s'),
|
||||
}
|
||||
|
||||
PLATFORM_SCHEMA = vol.Schema({
|
||||
....
|
||||
vol.Optional(CONF_MONITORED_VARIABLES, default=[]):
|
||||
[vol.In(SENSOR_TYPES)],
|
||||
```
|
||||
|
||||
|
@ -45,7 +45,7 @@ class ExampleSensor(Entity):
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""Return the state of the sensor.""
|
||||
"""Return the state of the sensor."""
|
||||
return 23
|
||||
|
||||
@property
|
||||
|
@ -29,8 +29,8 @@ Example of using condition:
|
||||
entity_id: sensor.mini_despacho
|
||||
to: 'ON'
|
||||
condition:
|
||||
condition: or
|
||||
conditions:
|
||||
condition: or
|
||||
conditions:
|
||||
- condition: template
|
||||
value_template: '{{ states.sun.sun.attributes.elevation < 4 }}'
|
||||
- condition: template
|
||||
|
@ -59,15 +59,15 @@ The following tables show the available trigger data per platform.
|
||||
| `trigger.entity_id` | Entity ID that we observe.
|
||||
| `trigger.below` | The below threshold, if any.
|
||||
| `trigger.above` | The above threshold, if any.
|
||||
| `trigger.from_state` | The previous state of the entity.
|
||||
| `trigger.to_state` | The new state that triggered trigger.
|
||||
| `trigger.from_state` | The previous [state object] of the entity.
|
||||
| `trigger.to_state` | The new [state object] that triggered trigger.
|
||||
|
||||
| Template variable | Data |
|
||||
| ---- | ---- |
|
||||
| `trigger.platform` | Hardcoded: `state`
|
||||
| `trigger.entity_id` | Entity ID that we observe.
|
||||
| `trigger.from_state` | The previous state of the entity.
|
||||
| `trigger.to_state` | The new state that triggered trigger.
|
||||
| `trigger.from_state` | The previous [state object] of the entity.
|
||||
| `trigger.to_state` | The new [state object] that triggered trigger.
|
||||
| `trigger.for` | Timedelta object how long state has been to state, if any.
|
||||
|
||||
| Template variable | Data |
|
||||
@ -80,8 +80,8 @@ The following tables show the available trigger data per platform.
|
||||
| ---- | ---- |
|
||||
| `trigger.platform` | Hardcoded: `template`
|
||||
| `trigger.entity_id` | Entity ID that caused change.
|
||||
| `trigger.from_state` | Previous state of entity that caused change.
|
||||
| `trigger.to_state` | New state of entity that caused template to change.
|
||||
| `trigger.from_state` | Previous [state object] of entity that caused change.
|
||||
| `trigger.to_state` | New [state object] of entity that caused template to change.
|
||||
|
||||
| Template variable | Data |
|
||||
| ---- | ---- |
|
||||
@ -92,7 +92,9 @@ The following tables show the available trigger data per platform.
|
||||
| ---- | ---- |
|
||||
| `trigger.platform` | Hardcoded: `zone`
|
||||
| `trigger.entity_id` | Entity ID that we are observing.
|
||||
| `trigger.from_state` | Previous state of the entity.
|
||||
| `trigger.to_state` | New state of the entity.
|
||||
| `trigger.from_state` | Previous [state object] of the entity.
|
||||
| `trigger.to_state` | New [state object] of the entity.
|
||||
| `trigger.zone` | State object of zone
|
||||
| `trigger.event` | Event that trigger observed: `enter` or `leave`.
|
||||
|
||||
[state object]: /topics/state_object/
|
||||
|
@ -15,7 +15,7 @@ To get Home Assistant installed as a background service, run:
|
||||
|
||||
|
||||
```bash
|
||||
$ hass --install-osx
|
||||
$ hass --script macos install
|
||||
|
||||
Home Assistant has been installed. Open it here: http://localhost:8123
|
||||
```
|
||||
@ -25,7 +25,7 @@ Home Assistant will log to `~/Library/Logs/homeassistant.log`
|
||||
To uninstall the service, run:
|
||||
|
||||
```bash
|
||||
$ hass --uninstall-osx
|
||||
$ hass --script macos uninstall
|
||||
|
||||
Home Assistant has been uninstalled.
|
||||
```
|
||||
|
@ -20,7 +20,7 @@ If the preceding command returns the string `systemd`, you are likely using `sys
|
||||
If you want Home Assistant to be launched automatically, an extra step is needed to setup `systemd`. You need a service file to control Home Assistant with `systemd`. If you are using a Raspberry Pi with Raspbian then replace the `[your user]` with `pi` otherwise use your user you want to run Home Assistant. `ExecStart` contains the path to `hass` and this may vary. Check with `whereis hass` for the location.
|
||||
|
||||
```bash
|
||||
$ su -c 'cat <<EOF >> /lib/systemd/system/home-assistant@[your user].service
|
||||
$ su -c 'cat <<EOF >> /etc/systemd/system/home-assistant@[your user].service
|
||||
[Unit]
|
||||
Description=Home Assistant
|
||||
After=network.target
|
||||
@ -38,7 +38,7 @@ EOF'
|
||||
There is also another [sample service file](https://raw.githubusercontent.com/home-assistant/home-assistant/master/script/home-assistant%40.service) available. To use this one, just download it.
|
||||
|
||||
```bash
|
||||
$ sudo wget https://raw.githubusercontent.com/home-assistant/home-assistant/master/script/home-assistant%40.service -O /lib/systemd/system/home-assistant@[your user].service
|
||||
$ sudo wget https://raw.githubusercontent.com/home-assistant/home-assistant/master/script/home-assistant%40.service -O /etc/systemd/system/home-assistant@[your user].service
|
||||
```
|
||||
|
||||
You need to reload `systemd` to make the daemon aware of the new configuration. Enable and launch Home Assistant after that.
|
||||
@ -54,7 +54,7 @@ If everything went well, `sudo systemctl start home-assistant@[your user]` shoul
|
||||
```bash
|
||||
$ sudo systemctl status home-assistant@[your user] -l
|
||||
● home-assistant@fab.service - Home Assistant for [your user]
|
||||
Loaded: loaded (/usr/lib/systemd/system/home-assistant@[your user].service; enabled; vendor preset: disabled)
|
||||
Loaded: loaded (/etc/systemd/system/home-assistant@[your user].service; enabled; vendor preset: disabled)
|
||||
Active: active (running) since Sat 2016-03-26 12:26:06 CET; 13min ago
|
||||
Main PID: 30422 (hass)
|
||||
CGroup: /system.slice/system-home\x2dassistant.slice/home-assistant@[your user].service
|
||||
@ -66,5 +66,10 @@ $ sudo systemctl status home-assistant@[your user] -l
|
||||
To get Home Assistant's logging output, simple use `journalctl`.
|
||||
|
||||
```bash
|
||||
$ sudo journalctl -f -u home-assistant@[your user]
|
||||
$ journalctl -f -u home-assistant@[your user]
|
||||
```
|
||||
|
||||
Because the log can scroll quite quickly, you might want to open a second terminal to view only the errors:
|
||||
```bash
|
||||
$ journalctl -f -u home-assistant@[your user] | grep -i 'error'
|
||||
```
|
||||
|
@ -21,6 +21,12 @@ This will launch Home Assistant and serve the web interface from port 8123 on yo
|
||||
When using boot2docker on OS X you are unable to map the local time to your Docker container. Replace `-v /etc/localtime:/etc/localtime:ro` with `-e "TZ=America/Los_Angeles"` (replacing America/Los_Angeles with [your timezone](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones))
|
||||
</p>
|
||||
|
||||
If you change the config you have to restart the server.
|
||||
To do that you have 2 options.
|
||||
|
||||
1. You can go to the <img src='/images/screenshots/developer-tool-services-icon.png' alt='service developer tool icon' class="no-shadow" height="38" /> service developer tools, select the service `homeassistant/restart` and click "Call Service".
|
||||
2. Or you can restart it from an terminal by running `docker restart home-assistant`
|
||||
|
||||
### {% linkable_title Troubleshooting %}
|
||||
|
||||
If you run into any issues, please see [the troubleshooting page](/getting-started/troubleshooting/). It contains solutions to many of the more commonly encountered issues.
|
||||
|
@ -9,7 +9,7 @@ footer: true
|
||||
|
||||
The [Raspberry Pi All-In-One Installer](https://github.com/home-assistant/fabric-home-assistant) deploys a complete Home Assistant server including support for MQTT with websockets, Z-Wave, and the Open-Zwave Control Panel.
|
||||
|
||||
The only requirement is that you have a Raspberry Pi with a fresh installation of [Raspbian Jessie/Jessie Lite](https://www.raspberrypi.org/downloads/raspbian/) connected to your network.
|
||||
The only requirement is that you have a Raspberry Pi with a fresh installation of [Raspbian Jessie](https://www.raspberrypi.org/downloads/raspbian/) connected to your network.
|
||||
|
||||
* Login to Raspberry Pi. For example with `ssh pi@your_raspberry_pi_ip`
|
||||
* Run the following command
|
||||
@ -73,6 +73,7 @@ After upgrading, you can restart Home Assistant a few different ways:
|
||||
|
||||
To launch the OZWCP web application:
|
||||
|
||||
* Make sure Home Assistant is not running! So stop that first
|
||||
* Login to Raspberry Pi `ssh pi@your_raspberry_pi_ip`
|
||||
* Change to the ozwcp directory `cd /srv/hass/src/open-zwave-control-panel/`
|
||||
* Launch the control panel `sudo ./ozwcp -p 8888`
|
||||
|
@ -9,7 +9,7 @@ sharing: true
|
||||
footer: true
|
||||
---
|
||||
|
||||
A `Vagrantfile` is avalable into `virtualization/vagrant` folder for quickly spinning up a Linux virtual machine running Home Assistant. This can be beneficial for those who want to experiment with Home Assistant and/or developers willing to easily test local changes and run test suite against them.
|
||||
A `Vagrantfile` is available into `virtualization/vagrant` folder for quickly spinning up a Linux virtual machine running Home Assistant. This can be beneficial for those who want to experiment with Home Assistant and/or developers willing to easily test local changes and run test suite against them.
|
||||
|
||||
<p class='note'>
|
||||
Vagrant is intended for testing/development only. It is NOT recommended for permanent installations.
|
||||
@ -21,21 +21,29 @@ You must have [Vagrant](https://www.vagrantup.com/downloads.html) and [Virtualbo
|
||||
|
||||
## {% linkable_title Get Home Assistant source code %}
|
||||
|
||||
Download the home-assistant source code by either downloading the .zip file from [GitHub releases page](https://github.com/home-assistant/home-assistant/releases), or by using [Git](https://git-scm.com/)
|
||||
Download the Home Assistant source code by either downloading the .zip file from [GitHub releases page](https://github.com/home-assistant/home-assistant/releases) or by using [Git](https://git-scm.com/)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/home-assistant/home-assistant.git
|
||||
cd home-assistant/virtualization/vagrant
|
||||
$ git clone https://github.com/home-assistant/home-assistant.git
|
||||
$ cd home-assistant/virtualization/vagrant
|
||||
```
|
||||
|
||||
<p class='note'>
|
||||
The following instructions will assume you changed your working directory to be home-assistant/virtualization/vagrant. This is mandatory because Vagrant will look for informations about the running VM inside that folder and won't work otherwise
|
||||
The following instructions will assume you changed your working directory to be `home-assistant/virtualization/vagrant`. This is mandatory because Vagrant will look for informations about the running VM inside that folder and won't work otherwise
|
||||
</p>
|
||||
|
||||
<p class='note'>
|
||||
When using Vagrant on Windows, change git's `auto.crlf` to input before cloning the Home Assistant repository. With input setting git won't automatically change line endings from Unix LF to Windows CRLF. Shell scripts executed during provision won't work with Windows line endings.
|
||||
</p>
|
||||
|
||||
```bash
|
||||
$ git config --global core.autocrlf input
|
||||
```
|
||||
|
||||
## {% linkable_title Create the Vagrant VM and start Home Assistant %}
|
||||
|
||||
```bash
|
||||
vagrant up
|
||||
$ vagrant up
|
||||
```
|
||||
|
||||
This will download and start a virtual machine using Virtualbox, which will internally setup the development environment necessary to start Home Assistant process and run test suite as well. After the VM has started succesfully, the Home Assistant frontend will be accessible locally from your browser at [http://localhost:8123](http://localhost:8123)
|
||||
@ -45,7 +53,7 @@ This will download and start a virtual machine using Virtualbox, which will inte
|
||||
To shutdown the Vagrant host:
|
||||
|
||||
```bash
|
||||
vagrant halt
|
||||
$ vagrant halt
|
||||
```
|
||||
|
||||
To start it again, just run `vagrant up`
|
||||
@ -57,7 +65,7 @@ The root `home-assistant` directory on your workstation will be mirrored with `/
|
||||
Any changes made to the local directory on your workstation will be available from the Vagrant host, so to apply your changes to the Home Assistant process, just restart it:
|
||||
|
||||
```bash
|
||||
touch restart ; vagrant provision
|
||||
$ touch restart ; vagrant provision
|
||||
```
|
||||
|
||||
## {% linkable_title Run test suite (Tox) %}
|
||||
@ -65,7 +73,7 @@ touch restart ; vagrant provision
|
||||
To run tests against your changes:
|
||||
|
||||
```bash
|
||||
touch run_tests ; vagrant provision
|
||||
$ touch run_tests ; vagrant provision
|
||||
```
|
||||
|
||||
## {% linkable_title Cleanup %}
|
||||
@ -73,7 +81,7 @@ touch run_tests ; vagrant provision
|
||||
To completely remove the VM:
|
||||
|
||||
```bash
|
||||
rm setup_done ; vagrant destroy -f
|
||||
$ rm setup_done ; vagrant destroy -f
|
||||
```
|
||||
|
||||
You can now recreate a completely new Vagrant host with `vagrant up`
|
||||
|
@ -72,7 +72,7 @@ delay:
|
||||
```yaml
|
||||
# Waits however many minutes input_slider.minute_delay is set to
|
||||
# Valid formats include HH:MM and HH:MM:SS
|
||||
delay: {% raw %}'00:{{ input_slider.minute_delay }}:00'{% endraw %}
|
||||
delay: {% raw %}'00:{{ input_slider.minute_delay | int }}:00'{% endraw %}
|
||||
```
|
||||
|
||||
#### {% linkable_title Fire an Event %}
|
||||
|
@ -29,7 +29,7 @@ $ python3 get-pip.py
|
||||
```
|
||||
|
||||
#### {% linkable_title distutils.errors.DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both %}
|
||||
This is a known issue if you're on a Mac using Homebrew to install Python. Please follow [these instructions](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Homebrew-and-Python.md#note-on-pip-install---user) to resolve it.
|
||||
This is a known issue if you're on a Mac using Homebrew to install Python. Please follow [these instructions](https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Homebrew-and-Python.md#note-on-pip-install---user) to resolve it.
|
||||
|
||||
#### {% linkable_title CentOS and Python 3 %}
|
||||
To run Python 3.x on [CentOS](https://www.centos.org/) or RHEL, [Software Collections](https://www.softwarecollections.org/en/scls/rhscl/rh-python34/) needs to be activated.
|
||||
|
@ -25,6 +25,8 @@ After updating, restart Home Assistant for the changes to take effect. This mean
|
||||
The upgrade needs to be run as the same user as the installation was done to avoid permission errors.
|
||||
</p>
|
||||
|
||||
[BRUH automation](http://www.bruhautomation.com) has created [a tutorial video](https://www.youtube.com/watch?v=tuG2rs1Cl2Y) explaining how to upgrade Home Assistant.
|
||||
|
||||
#### {% linkable_title Run the development version %}
|
||||
If you want to stay on top of the development of Home Assistant then you can upgrade to the `dev` branch.
|
||||
|
||||
|
@ -29,6 +29,8 @@ The basics of YAML syntax are block collections and mappings containing key-valu
|
||||
|
||||
Note that indentation is an important part of specifying relationships using YAML. Things that are indented are nested "inside" things that are one level higher. So in the above example, `platform: pushbullet` is a property of (nested inside) the `notify` component.
|
||||
Getting the right indentation can be tricky if you're not using an editor with a fixed width font. Tabs are not allowed to be used for indentation. Convention is to use 2 spaces for each level of indentation.
|
||||
You can use [YAMLLint](http://www.yamllint.com/) to check if your YAML-syntax is correct before loading it into Home Assistant which will save you some time.
|
||||
*Please pay attention on not putting in private data, as it is a 3rd-party website not maintained by Home Assistant.*
|
||||
|
||||
Lines that start with **#** are comments and are ignored by the system.
|
||||
|
||||
|
@ -9,76 +9,120 @@ sharing: true
|
||||
footer: true
|
||||
---
|
||||
|
||||
##### {% linkable_title Motion or alarm sensors %}
|
||||
|
||||
In order for Home Assistant to recognize well the sensor, you will need to change its configuration from `Basic Set (default)` to `Binary Sensor report` or `Alarm report`. Currently there's no way to do this in Home Assistant but you can use ozwcp (OpenZWave control panel), Domoticz or similar to do it
|
||||
These devices will either show as a binary sensor or a sensor called `Alarm xxxx` and will report a numeric value. Test to see what value is what. Sometimes this is noted in the device manual.
|
||||
|
||||
|
||||
##### {% linkable_title Locks and other secure devices %}
|
||||
|
||||
These devices require a network key to be set for the zwave network before they are paired. This key is set in OpenZwave's `options.xml` which is located in Open Zwave's directory. This should also be the same directory as `config_path:` in your `configuration.yaml`. If it's not, make sure you have the same values in all the files you are using.
|
||||
The option is commented out by default in `options.xml` and is a default key. Make your own unique key. The key is in Hexadecimals.
|
||||
It is best to pair these devices in Open Zwave Control Panel or other Zwave tool that can show you logs while pairing. Test the device before you save the configuration.
|
||||
Make sure you copy the newly saved `zwcfg_[home_id].xml`into your HomeAssistant config directory.
|
||||
|
||||
##### {% linkable_title Event basic_level for automation %}
|
||||
HomeAssistant will trigger a event when command_class_basic changes value on a node.
|
||||
This can be virtually anything, so tests have to be made to determine what value equals what.
|
||||
You can use this for automations.
|
||||
|
||||
Example:
|
||||
|
||||
```yaml
|
||||
- alias: Minimote Button Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.node_event
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
basic_level: 255
|
||||
```
|
||||
|
||||
##### {% linkable_title Event scene_id for automation %}
|
||||
HomeAssistant will trigger a event when a scene is activated by a node in the zwave network.
|
||||
This can be a press of a button, so tests have to be made to determine what scene_id equals what.
|
||||
You can use this for automations.
|
||||
|
||||
Example:
|
||||
|
||||
```yaml
|
||||
- alias: Minimote Button 1 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 1
|
||||
```
|
||||
|
||||
|
||||
##### {% linkable_title Aeon Minimote %}
|
||||
|
||||
Here's a handy configuration for the Aeon Labs Minimote that defines all possible button presses. Put it into `automation.yaml`.
|
||||
|
||||
```yaml
|
||||
- alias: Minimote Button 1 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 1
|
||||
- alias: Minimote Button 1 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 1
|
||||
|
||||
- alias: Minimote Button 1 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 2
|
||||
- alias: Minimote Button 1 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 2
|
||||
|
||||
- alias: Minimote Button 2 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 3
|
||||
- alias: Minimote Button 2 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 3
|
||||
|
||||
- alias: Minimote Button 2 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 4
|
||||
- alias: Minimote Button 2 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 4
|
||||
|
||||
- alias: Minimote Button 3 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 5
|
||||
- alias: Minimote Button 3 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 5
|
||||
|
||||
- alias: Minimote Button 3 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 6
|
||||
- alias: Minimote Button 3 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 6
|
||||
|
||||
- alias: Minimote Button 4 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 7
|
||||
- alias: Minimote Button 4 Pressed
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 7
|
||||
|
||||
- alias: Minimote Button 4 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
entity_id: aeon_labs_minimote_1
|
||||
scene_id: 8
|
||||
- alias: Minimote Button 4 Held
|
||||
trigger:
|
||||
platform: event
|
||||
event_type: zwave.scene_activated
|
||||
event_data:
|
||||
object_id: aeon_labs_minimote_1
|
||||
scene_id: 8
|
||||
```
|
||||
|
||||
##### {% linkable_title Aeotec MultiSensor 6 %}
|
||||
|
||||
In order for Home Assistant to recognize well the motion sensor, you will need to change its configuration from `Basic Set (default)` to `Binary Sensor report`. Currently there's no way to do this in Home Assistant but you can use ozwcp (OpenZWave control panel), Domoticz or similar to do it
|
||||
|
@ -15,7 +15,7 @@ There are various ways to get in touch with the Home Assistant community. It doe
|
||||
|
||||
- [Forum](https://community.home-assistant.io/)
|
||||
- [Gitter Chatroom](https://gitter.im/home-assistant/home-assistant) for general Home Assistant discussions and questions.
|
||||
- Follow us on [Twitter](https://twitter.com/home_assistant), use @home_assistant
|
||||
- Follow us on [Twitter](https://twitter.com/home_assistant), use [@home_assistant](https://twitter.com/home_assistant)
|
||||
- Join the [Google+ community](https://plus.google.com/u/0/b/110560654828510104551/communities/106562234893511202708)
|
||||
- Join the [Reddit subreddit](https://reddit.com/r/homeassistant) in [/r/homeassistant](https://reddit.com/r/homeassistant)
|
||||
|
||||
@ -33,6 +33,7 @@ Have you found an issue in your Home Assistant installation? Please report it. R
|
||||
- [Home Assistant Support 101 - Getting around in Home Assistant](https://www.youtube.com/watch?v=dRfk9JAlPJk) ([Slides](https://docs.google.com/presentation/d/1PUnOpeFZxNj4LEjaohGqH_1hOGQGuS5yRHD1ThHr6nk/edit?usp=sharing)) - June 2016
|
||||
- [Awaken your home: Python and the Internet of Things](https://www.youtube.com/watch?v=Cfasc9EgbMU&list=PLKsVm4cWHDQB9JBcD7_ZfNcvC6xx47QHT&index=1) at PyCon 2016 - June 2016
|
||||
- [Automating your Home with Home Assistant](https://www.youtube.com/watch?v=4-6rTwKl6ww&list=PLKsVm4cWHDQB9JBcD7_ZfNcvC6xx47QHT&index=2) at OpenIoT 2016 - March 2016
|
||||
- [Automating Your Life - Home Automation](http://slides.com/teagan42/life_automation#/) at Develop Denver 2016 - August
|
||||
|
||||
|
||||
### {% linkable_title Roadmap %}
|
||||
|
@ -13,7 +13,7 @@ This page contains only irrelevant and unhelpful information about Home Assistan
|
||||
|
||||
### {% linkable_title Name %}
|
||||
|
||||
Unknown at the moment.
|
||||
Isn't it obvious? Home Assistant is the good soul that is assisting you in your home. It's also common to refer to Home Assistant simply as HA or hass (not to be confused with the German word "Hass", it's more like the abbreviation of **H**ome **A**ssistant **S**erver **S**ervice).
|
||||
|
||||
### {% linkable_title Website %}
|
||||
|
||||
@ -33,7 +33,7 @@ This sections just contains some random numbers of the Home Assistant eco-system
|
||||
|
||||
| Description | 2015 |
|
||||
|---|---|
|
||||
| [Gitter.io](https://gitter.im/home-assistant/home-assistant) | 334 |
|
||||
| [Gitter.io](https://gitter.im/home-assistant/home-assistant) | 334 |
|
||||
| [Forum posts](https://community.home-assistant.io/) | 352 |
|
||||
| [Forum topics](https://community.home-assistant.io/) | 83 |
|
||||
| [Forum members](https://community.home-assistant.io/) | 92 |
|
||||
|
BIN
source/images/blog/2016-07-laundry-automation/block-diagram.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
source/images/blog/2016-07-laundry-automation/data-graph.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
source/images/blog/2016-07-laundry-automation/protoboard.jpg
Normal file
After Width: | Height: | Size: 654 KiB |
BIN
source/images/blog/2016-07-laundry-automation/screenshot-ha.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 109 KiB |
BIN
source/images/supported_brands/nzbget.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
@ -15,8 +15,8 @@ hide_github_edit: true
|
||||
<div class="grid">
|
||||
<div class="grid__item one-third lap-one-third palm-one-whole">
|
||||
<div class='current-version material-card text'>
|
||||
<h1>Current Version: 0.25</h1>
|
||||
Released: <span class='release-date'>July 30, 2016</span>
|
||||
<h1>Current Version: 0.25.2</h1>
|
||||
Released: <span class='release-date'>August 2, 2016</span>
|
||||
|
||||
<div class='links'>
|
||||
<a href='/blog/2016/07/30/custom-frontend-panels-jupyter-notebooks-directv/'>Release notes</a>
|
||||
|
BIN
source/static/icons/favicon-192x192.png
Normal file
After Width: | Height: | Size: 15 KiB |