Merge remote-tracking branch 'origin/current' into next

This commit is contained in:
Paulus Schoutsen 2018-03-14 17:15:23 -07:00
commit 47e1b3c171
30 changed files with 1257 additions and 93 deletions

View File

@ -15,6 +15,7 @@
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#038FC7">
{% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
<link rel="canonical" href="{{ canonical }}">

View File

@ -60,6 +60,13 @@ task :generate do
abort("Generating CSS failed") unless success
success = system "jekyll build"
abort("Generating site failed") unless success
if ENV["CONTEXT"] != 'production'
File.open("#{public_dir}robots.txt", 'w') do |f|
f.write "User-agent: *\n"
f.write "Disallow: /\n"
end
end
public_dir
end
desc "Watch the site and regenerate when it changes"

View File

@ -140,13 +140,13 @@ social:
# Home Assistant release details
current_major_version: 0
current_minor_version: 65
current_patch_version: 3
date_released: 2018-03-11
current_patch_version: 5
date_released: 2018-03-14
# Either # or the anchor link to latest release notes in the blog post.
# Must be prefixed with a # and have double quotes around it.
# Major release:
patch_version_notes: "#release-0652---march-11"
patch_version_notes: "#release-0655---march-14"
# Minor release (Example #release-0431---april-25):
# Date we moved to Discourse for comments

View File

@ -11,10 +11,6 @@ footer: true
Setup and manage a [Dnsmasq](http://thekelleys.org.uk/dnsmasq/doc.html) DNS server. This allows you to manipulate DNS requests. For example, you can have your Home Assistant domain resolve with an internal address inside your network.
<p class='note info'>
`interface` options are for resinos based installation. On other system you can set it to `""`, for listen on every interface.
</p>
```json
{
"defaults": ["8.8.8.8", "8.8.4.4"],
@ -23,8 +19,7 @@ Setup and manage a [Dnsmasq](http://thekelleys.org.uk/dnsmasq/doc.html) DNS serv
],
"hosts": [
{"host": "home.mydomain.io", "ip": "192.168.1.10"}
],
"interface": "eth1"
]
}
```
@ -33,4 +28,3 @@ Configuration variables:
- **defaults** (*Required*): A list of DNS servers to forward default requests to.
- **forwards** (*Optional*): A list of domains that will forward to a specific server.
- **hosts** (*Optional*): A list of hosts to resolve statically.
- **interface** (*Optional*): If an interface is set, it listens only on this interface. Needs to be set for ResinOS. Normally is `eth0` for ethernet wired connection and `wlan0` for wireless connection.

View File

@ -23,7 +23,7 @@ binary_sensor:
- platform: trend
sensors:
solar_angle:
entity_id: sun.sun
entity_id: sensor.cpu_speed
```
Configuration variables:
@ -59,7 +59,7 @@ binary_sensor:
- platform: trend
sensors:
sun_rising:
entity_id: sun.sun
entity_id: sensor.cpu_speed
```
This example creates two sensors to indicate whether the temperature is rising or falling at a rate of at least 3 degrees an hour, and collects samples over a two hour period:

View File

@ -13,11 +13,11 @@ ha_release: "0.60"
---
The `caldav` platform allows you to connect to your WebDav calendar and generate binary sensors. A different sensor will be created for each individual calendar, or you can specify custom calendars which match a criteria you define (more on that below). These sensors will be `on` if you have an on going event in that calendar or `off` if the event is later in time, or if there is no event at all. The WebDav calendar get updated roughly every 10 minutes.
The `caldav` platform allows you to connect to your WebDav calendar and generate binary sensors. A different sensor will be created for each individual calendar, or you can specify custom calendars which match a criteria you define (more on that below). These sensors will be `on` if you have an on going event in that calendar or `off` if the event is later in time, or if there is no event at all. The WebDav calendar get updated roughly every 15 minutes.
### {% linkable_title Prerequisites %}
You need to have a CalDav server and eventually credentials for it. This component was tested against [Baikal](http://sabre.io/baikal/) but any component complying with the RFC4791 should work.
You need to have a CalDav server and credentials for it. This component was tested against [Baikal](http://sabre.io/baikal/) but any component complying with the RFC4791 should work. [Nextcloud](https://nextcloud.com/) and [Owncloud](https://owncloud.org/) work fine.
You might need some additional system packages to compile the Python caldav library. On a Debian based system, install them by:
@ -30,7 +30,7 @@ $ sudo apt-get install libxml2-dev libxslt1-dev zlib1g-dev
To integrate a WebDav calendar in Home Assistant, add the following section to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
# Example configuration.yaml entry for baikal
calendar:
- platform: caldav
username: john.doe@test.com
@ -38,6 +38,15 @@ calendar:
url: https://baikal.my-server.net/cal.php/calendars/john.doe@test.com/default
```
```yaml
# Example configuration.yaml entry for nextcloud, calendars will be found automatically
calendar:
- platform: caldav
username: john.doe
password: !secret caldav
url: https://nextcloud.example.com/remote.php/dav
```
This example will generate default binary sensors for each calendar you have in your account. Those calendars will be `on` when there is an ongoing event and `off` if not. Events that last a whole day are ignored in those calendars. You have to setup custom calendars in order to take them into account or for advanced event filtering.
@ -80,7 +89,7 @@ password:
type: string
calendars:
required: false
description: List of the calendars to filter. Empty or absent means no filtering.
description: List of the calendars to filter. Empty or absent means no filtering, i.e. all calendars will be added.
type: list
custom_calendars:
required: false
@ -97,7 +106,7 @@ custom_calendars:
type: string
search:
required: true
pending_charges: Regular expression for filtering the events based on the content of their summary, description or location.
description: Regular expression for filtering the events based on the content of their summary, description or location.
type: string
{% endconfiguration %}
@ -111,3 +120,50 @@ custom_calendars:
- **location**: The event Location.
- **start_time**: Start time of event.
- **end_time**: End time of event.
### {% linkable_title Examples %}
All events of the calendars "private" and "holidays". Note that all day events are not included.
```yaml
# Example configuration.yaml entry for nextcloud
calendar:
- platform: caldav
url: https://nextcloud.example.com/remote.php/dav
username: 'me'
password: !secret caldav
calendars:
- private
- holidays
```
Full example with automation to wake up to music if not holiday. Prerequisite: you have a calendar named "work" where you create calendar entries containing "Holiday".
Custom calendar names are built from the main calendar + name of the custom calendar.
```yaml
# configuration.yaml
calendar:
- platform: caldav
url: https://nextcloud.example.com/remote.php/dav
username: 'me'
password: !secret caldav
custom_calendars:
- name: holiday
calendar: work
search: 'Holiday'
# automations.yaml
- id: wakeup
alias: worktime wakeup
trigger:
platform: time
at: 06:40:00
action:
- service: media_player.media_play
entity_id: media_player.bedroom
condition:
- condition: state
entity_id: calendar.work_holiday
state: 'off'
```

View File

@ -79,6 +79,7 @@ Valid values for ignore are:
* `sabnzbd`: SABnzbd downloader
* `samsung_tv`: Samsung TVs
* `sonos`: Sonos speakers
* `songpal` : Songpal
* `tellduslive`: Telldus Live
* `wink`: Wink Hub
* `yamaha`: Yamaha media player

View File

@ -2,7 +2,7 @@
layout: page
title: "Egardia"
description: "Instructions how to setup Egardia / Woonveilig within Home Assistant."
date: 2018-03-02 09:00
date: 2018-03-13 09:00
sidebar: true
comments: false
sharing: true
@ -16,29 +16,81 @@ The `egardia` platform enables the ability to control an [Egardia](http://egardi
You will need to know the IP of your alarm panel on your local network. Test if you can login to the panel by browsing to the IP address and log in using your Egardia/Woonveilig account.
To enable the integration with your alarm panel, add the following lines to your `configuration.yaml` file:
## {% linkable_title Basic configuration %}
```yaml
# Example configuration.yaml entry
egardia:
host: YOUR_HOST
username: YOUR_USERNAME
password: YOUR_PASSWORD
To enable the integration with your alarm panel, add the following lines to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
egardia:
host: YOUR_HOST
username: YOUR_USERNAME
password: YOUR_PASSWORD
```
Configuration variables:
- **host** (*Required*): The local IP address of the Egardia/Woonveilig alarm panel.
- **username** (*Required*): Username for the Egardia/Woonveilig account.
- **password** (*Required*): Password for Egardia/Woonveilig account.
- **version** (*Optional*): The version of the Egardia system. `GATE-01`, `GATE-02` and `GATE-03` are currently supported. Defaults to `GATE-01`.
- **port** (*Optional*): The port of the alarm panel. Defaults to 80.
- **report_server_enabled** (*Optional*): Enable reporting by server. Defaults to `False`.
- **report_server_port** (*Optional*): Port of the Egardia server. Defaults to 52010.
- **report_server_codes** list (*Optional*): List of codes for the different states.
{% configuration %}
host:
description: The local IP address of the Egardia/Woonveilig alarm panel.
required: true
type: string
username:
description: Username for the Egardia/Woonveilig account.
required: true
type: string
password:
description: Password for Egardia/Woonveilig account.
required: true
type: string
version:
description: The version of the Egardia system. `GATE-01`, `GATE-02` and `GATE-03` are currently supported.
required: false
type: string
default: 'GATE-01'
port:
description: The port of the alarm panel.
required: false
type: int
default: 80
report_server_enabled:
description: Enable reporting by server.
required: false
type: string
default: false
report_server_port:
description: Port of the Egardia server.
required: false
type: int
default: 52010
report_server_codes:
description: Map of list of codes for the different states.
required: false
type: map
keys:
arm:
description: List of codes for the 'arm' state.
required: false
type: list
disarm:
description: List of codes for the 'disarm' state.
required: false
type: list
armhome:
description: List of codes for the 'armhome' state.
required: false
type: list
triggered:
description: List of codes for the 'triggered' state.
required: false
type: list
ignore:
description: List of codes that will be ignored.
required: false
type: list
{% endconfiguration %}
Note that this basic configuration will only enable you to read the armed/armed away/disarmed status of your alarm and will **not** update the status if the alarm is triggered. This is because of how Egardia built their system. The alarm triggers normally go through their servers.
You can change this, however, using the following procedure. This is a more advanced configuration.
You can change this, however, using the following procedure. This is a more advanced (and more useful) configuration.
## {% linkable_title Advanced configuration %}
1. Log in to your alarm system's control panel. You will need to access http://[IP of your control panel]. You know this already since you need it in the basic configuration from above. Log in to the control panel with your Egardia/Woonveilig username and password.
2. Once logged in, go to *System Settings*, *Report* and change the Server Address for your primary server to the IP or hostname of your Home Assistant machine. You can leave the port number set to 52010 or change it to anything you like. **Make sure to change the settings of the primary server otherwise the messages will not come through. Note that this will limit (or fully stop) the number of alarm messages you will get through Egardia's / Woonveilig services.** Maybe, that is just what you want. Make sure to save your settings by selecting 'OK'.
@ -47,9 +99,9 @@ You can change this, however, using the following procedure. This is a more adva
```yaml
# Example configuration.yaml entry
egardia:
  host: YOUR_HOST
  username: YOUR_USERNAME
  password: YOUR_PASSWORD
host: YOUR_HOST
username: YOUR_USERNAME
password: YOUR_PASSWORD
report_server_enabled: True
report_server_port: PORT_OF_EGARDIASERVER (optional, defaults to 52010)
report_server_codes:
@ -63,5 +115,3 @@ You can change this, however, using the following procedure. This is a more adva
Note that for all code groups (*arm*,*disarm*, etc) multiple codes can be entered since each sensor triggers with a different code and each user of the system has its own arm and disarm codes. Also note that your system will do regular system checks which will be reported as well. Since Home Assistant provides no way of handling them properly, you can enter those codes as *ignore* (again, multiple codes can be used here). The egardia component will ignore these codes and continue returning the old status if it receives any of the codes that are listed as ignore. This is useful for example when you have armed your alarm at night: normally a system check will occur at least once during the night and if that code is not specified anywhere Home Assistant will set the status of the alarm to its default, which is unarmed. This is in fact wrong. Listing the code as ignore changes this behavior and Home Assistant will continue to show the status the alarm is in (disarm, arm, home, triggered) even when system checks occur.
5. Test your setup and enjoy. The component will update if the alarm status changes, including triggers. You can use this to build your own automations and send notifications as you wish. *Note*: previous versions required a separate egardiaserver to be set up. This is no longer necessary and corresponding system services can be removed (using systemctl).

View File

@ -90,3 +90,16 @@ When starting Home Assistant, the last recorded state will be shown. This might
If you control your LimitlessLED lights via the MiLight mobile application or other means while Home Assistant is running, Home Assistant can not track those changes and you may observe obsolete information.
This lack of synchronization is due to a LimitlessLED limitation.
<p class='img'>
<img src='/images/screenshots/limitlessled_assumed_state.png' />
</p>
Because LimitlessLED lights may have an obsolete state, Home Assistant shows the power switch as two buttons rather than a toggle. This ensures that the power can be set with a single click even if the assumed state is wrong. You can change to use the power toggle with [Customize](/docs/configuration/customizing-devices/):
```yaml
homeassistant:
customize_domain:
light:
assumed_state: false
```

View File

@ -9,7 +9,7 @@ sharing: true
footer: true
logo: dark_sky.png
ha_category: Weather
featured: true
featured: false
ha_release: "0.30"
redirect_from: /components/sensor.forecast/
ha_iot_class: "Cloud Polling"

View File

@ -16,12 +16,13 @@ ha_iot_class: "Cloud Polling"
The `speedtest` sensor component uses the [Speedtest.net](https://speedtest.net/) web service to measure network bandwidth performance.
By default, it will run every hour. The user can change the update frequency in the configuration by defining the minute, hour, and day for a speedtest to run. For the `server_id` check the list of [available servers](https://www.speedtest.net/speedtest-servers.php).
By default, it will run every hour. The user can change the update frequency in the configuration by defining the minute, hour, and day for a speed test to run. For the `server_id` check the list of [available servers](https://www.speedtest.net/speedtest-servers.php).
To add a Speedtest.net sensor to your installation, add the following to your `configuration.yaml` file:
Once per hour, on the hour (default):
{% raw %}
```yaml
# Example configuration.yaml entry
sensor:
@ -31,32 +32,63 @@ sensor:
- download
- upload
```
{% endraw %}
Configuration variables:
- **monitored_conditions** array (*Required*): Sensors to display in the frontend.
- **ping**: Reaction time in ms of your connection (how fast you get a response after you've sent out a request).
- **download**: Download speed in Mbps.
- **upload**: Upload speed in Mbps.
- **server_id** (*Optional*): Specify the speedtest server to perform test against.
- **minute** (*Optional*): Specify the minute(s) of the hour to schedule the speedtest. Use a list for multiple entries. Default is 0.
- **hour** (*Optional*): Specify the hour(s) of the day to schedule the speedtest. Use a list for multiple entries. Default is None.
- **day** (*Optional*): Specify the day(s) of the month to schedule the speedtest. Use a list for multiple entries. Default is None.
- **manual** (*Optional*): True or False to turn manual mode on or off. Manual mode will disable scheduled speedtests.
{% configuration %}
monitored_conditions:
description: Sensors to display in the frontend.
required: true
type: list
keys:
ping:
description: Reaction time in ms of your connection (how fast you get a response after you've sent out a request).
download:
description: Download speed (Mbit/s)
upload:
description: Upload speed (Mbit/s)
server_id:
description: Specify the speed test server to perform the test against.
required: false
type: int
day:
description: Specify the day(s) of the month to schedule the speed test. Use a list for multiple entries.
required: false
type: [int, list]
hour:
description: Specify the hour(s) of the day to schedule the speed test. Use a list for multiple entries.
required: false
type: [int, list]
minute:
description: Specify the minute(s) of the hour to schedule the speed test. Use a list for multiple entries.
required: false
type: [int, list]
default: 0
second:
description: Specify the second(s) of the minute to schedule the speed test. Use a list for multiple entries.
required: false
type: [int, list]
default: 0
manual:
description: True or False to turn manual mode on or off. Manual mode will disable scheduled speed tests.
required: false
type: bool
default: false
{% endconfiguration %}
This component uses [speedtest-cli](https://github.com/sivel/speedtest-cli) to gather network performance data from Speedtest.net. Please be aware of the potential [inconsistencies](https://github.com/sivel/speedtest-cli#inconsistency) that this component may display.
When Home Assistant first starts up, the values of the speedtest will show as `Unknown`. You can use the service `sensor.update_speedtest` to run a manual speedtest and populate the data or just wait for the next regularly scheduled test. You can turn on manual mode to disable the scheduled speedtests.
When Home Assistant first starts up, the values of the speed test will show as `Unknown`. You can use the service `sensor.update_speedtest` to run a manual speed test and populate the data or just wait for the next regularly scheduled test. You can turn on manual mode to disable the scheduled speed tests.
## {% linkable_title Examples %}
In this section you find some real life examples of how to use this sensor.
In this section, you find some real-life examples of how to use this sensor.
### {% linkable_title Run periodically %}
Every half hour of every day:
{% raw %}
```yaml
# Example configuration.yaml entry
sensor:
@ -69,11 +101,13 @@ sensor:
- download
- upload
```
{% endraw %}
### {% linkable_title Run at a specific time %}
Everyday at 12:30AM, 6:30AM, 12:30PM, 6:30PM:
{% raw %}
```yaml
# Example configuration.yaml entry
sensor:
@ -89,29 +123,33 @@ sensor:
- download
- upload
```
{% endraw %}
### {% linkable_title Using as a trigger in an automation %}
{% raw %}
```yaml
# Example configuration.yaml entry
automation:
- alias: 'Internet Speed Glow Connect Great'
trigger:
platform: template
value_template: '{% raw %}{{ states.sensor.speedtest_download.state|float > 10}}{% endraw %}'
action:
service: shell_command.green
- alias: 'Internet Speed Glow Connect Poor'
trigger:
platform: template
value_template: '{% raw %}{{ states.sensor.speedtest_download.state| float < 10 }}{% endraw %}'
action:
service: shell_command.red
- alias: "Internet Speed Glow Connect Great"
trigger:
- platform: template
value_template: "{{ states('sensor.speedtest_download')|float > 10 }}"
action:
- service: shell_command.green
- alias: "Internet Speed Glow Connect Poor"
trigger:
- platform: template
value_template: "{{ states('sensor.speedtest_download')|float < 10 }}"
action:
- service: shell_command.red
```
{% endraw %}
## {% linkable_title Notes %}
- When running on Raspberry Pi, just note that the maximum speed is limited by its 100 Mbit/s LAN adapter.
- Entries under `monitored_conditions` only control what entities are available under home-assistant, it does not disable the condition from running.
- If ran frequently, this component has the capability of using a very large amount of data. Frequent updates should be avoided on bandwidth capped connections.
- While running, network usage is fully utilized. This may have a negative affect on other devices in use the network such as gaming consoles or streaming boxes.
- Entries under `monitored_conditions` only control what entities are available in Home Assistant, it does not disable the condition from running.
- If ran frequently, this component has the ability to use a considerable amount of data. Frequent updates should be avoided on bandwidth-capped connections.
- While running, your network capacity is fully utilized. This may have a negative effect on other devices in use the network such as gaming consoles or streaming boxes.

View File

@ -32,6 +32,8 @@ Install the latest version of [PhantomJS]( http://phantomjs.org/download.html).
Don't use apt-get to install PhantomJS. This version is not compatible.
</p>
If you use the PhantomJS option, specify `driver: phantomjs` in your `usps` configuration.
### Chrome
@ -60,6 +62,7 @@ Configuration options for the USPS component:
- **username** (*Required*): The username to access the MyUSPS service.
- **password** (*Required*): The password for the given username.
- **driver** (*Required*): Specify if you're using `phantomjs` or `chrome`.
- **name** (*Optional*): Prefix for sensor names (defaults to "USPS")
<p class='note warning'>

View File

@ -7,6 +7,7 @@ sidebar: true
comments: false
sharing: true
footer: true
featured: true
logo: dark_sky.png
ha_category: Weather
ha_release: 0.61

View File

@ -14,7 +14,7 @@ redirect_from: /getting-started/installation/
Beginners should check our [Getting started guide](/getting-started/) first. This is for users that require advanced installations.
</p>
Home Assistant provides multiple ways to be installed. A requirement is that you have [Python 3.5+](https://www.python.org/downloads/) installed.
Home Assistant provides multiple ways to be installed. A requirement is that you have [Python 3.5.3 or later](https://www.python.org/downloads/) installed.
<div class="text-center hass-option-cards" markdown="0">
<a class='option-card' href='/getting-started/'>

View File

@ -21,10 +21,10 @@ $ sudo pacman -S python-pip
and Home Assistant itself.
```bash
$ pip3 install homeassistant
$ pip3 install --user homeassistant
```
Home Assistant is part of the [AUR](https://aur.archlinux.org/packages/home-assistant/). This means that it can be installed with `pacaur`:
Home Assistant is part of the [AUR](https://aur.archlinux.org/packages/home-assistant/). This means that it can be installed with `pacaur`. This package is often broken or outdated:
```bash
$ pacaur -S home-assistant

View File

@ -11,6 +11,8 @@ footer: true
[armbian](https://www.armbian.com) runs on a wide-variety of [ARM development boards](https://www.armbian.com/download/). Currently there are around 50 boards supported inclusive the OrangePi family, Cubieboard, Pine64, and Odroid.
Python 3.5.3 or later is required.
Setup Python and `pip`
```bash

View File

@ -9,9 +9,9 @@ sharing: true
footer: true
---
To run Python 3.x on [CentOS](https://www.centos.org/) or RHEL (Red Hat Enterprise Linux), [Software Collections](https://www.softwarecollections.org/en/scls/rhscl/rh-python34/) needs to be activated first.
To run Python 3.x on [CentOS](https://www.centos.org/) or RHEL (Red Hat Enterprise Linux), [Software Collections](https://www.softwarecollections.org/en/scls/rhscl/rh-python36/) needs to be activated first.
There are effort in progress to bring Python 3.4 to [Extra Packages for Enterprise Linux (EPEL)](https://fedoraproject.org/wiki/EPEL) which will allow you to follow the [Fedora Instructions](/docs/installation/fedora/).
You must install Python 3.5.3 or later. Software Collections version of Python 3.5 is 3.5.1 so this guide uses Python 3.6.
### {% linkable_title Using Software Collections %}
@ -21,21 +21,21 @@ First of all install the software collection repository as root. For example, on
$ yum install centos-release-scl
```
Then install the Python 3.5 package:
Then install the Python 3.6 package:
```bash
$ yum install rh-python35
$ yum install rh-python36
```
Once installed, switch to your `homeassistant` user (if you've set one up), enable the software collection and check that it has set up the new version of Python:
```bash
$ scl enable rh-python35 bash
$ scl enable rh-python36 bash
$ python --version
Python 3.5.1
Python 3.6.3
```
You will be in a command shell set up with Python 3.5 as your default version. The virtualenv and pip commands will be correct for this version, so you can now create a virtual environment and install Home Assistant following the main [instructions](https://home-assistant.io/docs/installation/virtualenv/#step-4-set-up-the-virtualenv).
You will be in a command shell set up with Python 3.6 as your default version. The virtualenv and pip commands will be correct for this version, so you can now create a virtual environment and install Home Assistant following the main [instructions](https://home-assistant.io/docs/installation/virtualenv/#step-4-set-up-the-virtualenv).
You will need to enable the software collection each time you log on before you activate your virtual environment.
@ -55,7 +55,7 @@ User=homeassistant
Environment=VIRTUAL_ENV="/srv/homeassistant"
Environment=PATH="$VIRTUAL_ENV/bin:$PATH"
# ExecStart using software collection:
ExecStart=/usr/bin/scl enable rh-python35 -- /srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"
ExecStart=/usr/bin/scl enable rh-python36 -- /srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"
[Install]
WantedBy=multi-user.target

View File

@ -12,7 +12,7 @@ redirect_from: /docs/hassbian/installation/
The easiest way to install Home Assistant on your Raspberry Pi is by using HASSbian: a Raspberry Pi image with Home Assistant built-in. The image will install the latest version of Home Assistant on initial boot (~10 minutes).
1. [Download the Hassbian image][image-download] (364 MB)
1. [Download the Hassbian image][image-download]
2. Use [Etcher][etcher] to flash the image to your SD card
3. Ensure your Raspberry Pi has wired access to the internet for the entire process or configure your wireless network settings **before proceeding to step 4**.
4. Insert SD card to Raspberry Pi and turn it on. Initial installation of Home Assistant will take about 5 minutes.

View File

@ -11,7 +11,7 @@ footer: true
[macOS](http://www.apple.com/macos/) is available by default on Apple computer. If you run a different operating system, please refer to the other section of the documentation.
To run Home Assistant on macOS you need to install Python first. Download Python from https://www.python.org/downloads/mac-osx/ and follow the instructions of the installer.
To run Home Assistant on macOS you need to install Python first. Download Python 3.5.3 or later from https://www.python.org/downloads/mac-osx/ and follow the instructions of the installer.
Open a terminal and install Home Assistant.

View File

@ -12,6 +12,8 @@ redirect_from: /getting-started/installation-raspberry-pi/
This installation of Home Assistant requires the Raspberry Pi to run [Raspbian Lite](https://www.raspberrypi.org/downloads/raspbian/). The installation will be installed in a [Virtual Environment](/docs/installation/virtualenv) with minimal overhead. Instructions assume this is a new installation of Raspbian Lite.
You must have Python 3.5.3 or later installed, which is the case for Raspbian Stretch.
<p class='note'>
Although these installation steps specifically mention a Raspberry Pi, you can go ahead and proceed on any Linux install as well. This guide is also referred to as the "Advanced Guide" for a virtual environment install.
</p>

View File

@ -26,7 +26,7 @@ Running these commands will:
Using the Synology webadmin:
- Install python3 using the Synology Package Center
- Install python3 using the Synology Package Center (be aware, this provides 3.5.1, which is not compatible with Home Assistant 0.65.0 or later)
- Create homeassistant user and add to the "users" group
SSH onto your synology & login as admin or root
@ -57,6 +57,10 @@ Use PIP to install Homeassistant package
# ./python3 -m pip install homeassistant
```
<p class='note'>
Until Synology offer an updated version of Python, Home Assistant 0.64 is the most recent version that will be able to be installed. You can manually specify the version of Home Assistant to install, for example to install version 0.64.3 you would do `./python3 -m pip install homeassistant==0.64.3`
</p>
Create homeassistant config directory & switch to it
```bash

View File

@ -28,6 +28,21 @@ condition:
below: '20'
```
If you do not want to combine AND and OR conditions, you can also just list them sequentially, by default all conditions have to be true.
The following configuration works the same as the one listed above:
```yaml
condition:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
```
Currently you need to format your conditions like this to be able to edit them using the [automations editor](/docs/automation/editor/).
### {% linkable_title OR condition %}
Test multiple conditions in 1 condition statement. Passes if any embedded condition is valid.

View File

@ -7,7 +7,7 @@
<div class="credit">
Contact us at <a href='mailto:hello@home-assistant.io'>hello@home-assistant.io</a> (no support!).<br>
Website powered by <a href='http://jekyllrb.com/'>Jekyll</a> and the <a href='https://github.com/coogie/oscailte'>Oscalite theme</a>.<br />
Hosted by <a href='https://pages.github.com/'>GitHub</a> and served by <a href='https://cloudflare.com'>CloudFlare</a>.
Hosted by <a href='https://www.netlify.com/'>Netlify</a>.
</div>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">home-assistant.io</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
</div>

View File

@ -146,6 +146,21 @@ intent_script:
- Bump pyvera to 0.2.42. Improve event loop robustness. ([@pavoni] - [#13095]) ([vera docs])
- Fix Kodi by updateding jsonrpc-websocket to 0.6 ([@Tadly] - [#13096]) ([media_player.kodi docs])
## {% linkable_title Release 0.65.4 - March 12 %}
- Fix unavailable property for wemo switch ([@balloob] - [#13106]) ([switch.wemo docs])
- Hue: Catch if bridge goes unavailable ([@balloob] - [#13109]) ([hue docs]) ([light.hue docs])
- Adding check for empty discovery info in alarm control panel Egardia. ([@jeroenterheerdt] - [#13114]) ([alarm_control_panel.egardia docs])
- Throttle Arlo api calls ([@arsaboo] - [#13143]) ([arlo docs])
## {% linkable_title Release Notes 0.65.5 - March 14 %}
- Bugfix HomeKit: Error string values for temperature ([@cdce8p] - [#13162]) ([homekit docs])
- Revert throttle Arlo api calls ([@arsaboo] - [#13174]) ([arlo docs])
- Ignore unsupported Sonos favorites ([@amelchio] - [#13195]) ([media_player.sonos docs])
- Avoid Sonos error when joining with self ([@amelchio] - [#13196]) ([media_player.sonos docs])
- Fix input_boolean Google Assistant serialize error ([@balloob] - [#13220]) ([google_assistant docs])
## {% linkable_title If you need help... %}
...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks.
@ -694,3 +709,28 @@ Experiencing issues introduced by this release? Please report them in our [issue
[media_player.cast docs]: https://home-assistant.io/components/media_player.cast/
[media_player.kodi docs]: https://home-assistant.io/components/media_player.kodi/
[vera docs]: https://home-assistant.io/components/vera/
[#13106]: https://github.com/home-assistant/home-assistant/pull/13106
[#13109]: https://github.com/home-assistant/home-assistant/pull/13109
[#13114]: https://github.com/home-assistant/home-assistant/pull/13114
[#13143]: https://github.com/home-assistant/home-assistant/pull/13143
[@arsaboo]: https://github.com/arsaboo
[@balloob]: https://github.com/balloob
[@jeroenterheerdt]: https://github.com/jeroenterheerdt
[alarm_control_panel.egardia docs]: https://home-assistant.io/components/alarm_control_panel.egardia/
[arlo docs]: https://home-assistant.io/components/arlo/
[hue docs]: https://home-assistant.io/components/hue/
[light.hue docs]: https://home-assistant.io/components/light.hue/
[switch.wemo docs]: https://home-assistant.io/components/switch.wemo/
[#13162]: https://github.com/home-assistant/home-assistant/pull/13162
[#13174]: https://github.com/home-assistant/home-assistant/pull/13174
[#13195]: https://github.com/home-assistant/home-assistant/pull/13195
[#13196]: https://github.com/home-assistant/home-assistant/pull/13196
[#13220]: https://github.com/home-assistant/home-assistant/pull/13220
[@amelchio]: https://github.com/amelchio
[@arsaboo]: https://github.com/arsaboo
[@balloob]: https://github.com/balloob
[@cdce8p]: https://github.com/cdce8p
[arlo docs]: https://home-assistant.io/components/arlo/
[google_assistant docs]: https://home-assistant.io/components/google_assistant/
[homekit docs]: https://home-assistant.io/components/homekit/
[media_player.sonos docs]: https://home-assistant.io/components/media_player.sonos/

View File

@ -7,7 +7,7 @@ sidebar: true
comments: false
sharing: true
footer: true
og_image: /images/architecture/ha_architecture.png
og_image: /images/architecture/ha_architecture.svg
---
Before we dive into the Home Assistant architecture, let's get a clear overview of the home automation landscape as a whole. This way, we can show how the different parts of Home Assistant fit into the picture.
@ -19,9 +19,9 @@ For more information about each part in this overview, <a href='/blog/2014/12/26
* Smart Home triggers commands based on previous behavior.
<p class='img'>
<a href='{{site_root}}/images/architecture/home_automation_landscape.png' name='landscape'>
<a href='{{site_root}}/images/architecture/home_automation_landscape.svg' name='landscape'>
<img alt='Home Automation landscape'
src='{{site_root}}/images/architecture/home_automation_landscape.png' />
src='{{site_root}}/images/architecture/home_automation_landscape.svg' />
</a>
Overview of the home automation landscape
</p>
@ -34,7 +34,7 @@ The Home Assistant core is responsible for Home Control. Home Assistant contains
* **Timer**: sends a `time_changed` event every 1 second on the event bus.
<p class='img'>
<a href='/images/architecture/ha_architecture.png' name='architecture'>
<a href='/images/architecture/ha_architecture.svg' name='architecture'>
<img src='/images/architecture/ha_architecture.svg' />
</a>
Overview of the Home Assistant core architecture

View File

@ -11,9 +11,41 @@ ha_release: 0.64
---
## {% linkable_title Translation Strings %}
Platform translation strings are stored as JSON in the [home-assistant](https://github.com/home-assistant/home-assistant) repository. These files must be located adjacent to the component/platform they belong to. They are named `strings.<component/platform name>.json`, unless the component being translated exists in its own directory, in which case the file is simply named `strings.json` in that directory. This file will contain the different strings that will be translatable. Currently only states are supported by the frontend.
Platform translation strings are stored as JSON in the [home-assistant](https://github.com/home-assistant/home-assistant) repository. These files must be located adjacent to the component/platform they belong to. Components must have their own directory, and the file is simply named `strings.json` in that directory. For platforms, they are named `strings.<platform name>.json` in the platform directory. This file will contain the different strings that will be translatable.
In order to test changes to translation files, the translation strings must be compiled into Home Assistants translation directories by running the following script:
```bash
$ script/translations_develop
```
After the pull request with the strings file is merged into the `dev` branch, the strings will be automatically uploaded to Lokalise, where contributors can submit translations. The translated strings in Lokalise will be periodically pulled in to the home-assistant repository.
## {% linkable_title States Localization %}
The first step when localizing platform states is to ensure that the states defined in the actual platform code are defined in `snake_case`. The states should not contain capital letters or spaces. Next, the strings file needs to be created. The states should exist under the `state` key, and map the backend state keys to their English translations. [The season sensor localization](https://github.com/home-assistant/home-assistant/pull/12453/commits/bb2f328ce10c3867990e34a88da64e2f8dc7a5c4) is a good example.
## {% linkable_title Configuration Flow Localization %}
The translation strings for the configuration flow handler are defined under the `config` key. An example strings file below describes the different supported keys:
```json
{
"config": {
"title": "This title is shown in the integrations list",
"step": {
"init": {
"title": "The user visible title of the `init` step.",
"description": "Markdown that is shown with the step.",
"data": {
"api_key": "The label for the `api_key` input field"
}
}
},
"error": {
"invalid_api_key": "This message will be displayed if `invalid_api_key` is returned as a flow error."
},
"abort": {
"stale_api_key": "This message will be displayed if `stale_api_key` is returned as the abort reason."
}
}
}
```

View File

@ -48,6 +48,7 @@ Looking for [talking points](/help/talking-points/) or [trivia](/help/trivia)?
Don't miss the regular [Home Assistant podcasts](https://hasspodcast.io/).
- [The winners of the Thomas-Krenn-Awards 2018](https://www.thomas-krenn.com/de/tkmag/allgemein/die-gewinner-des-thomas-krenn-awards-2018-stehen-fest/) - March 2018
- [Hausautomations-Schaltzentrale Home Assistant auf Python-Basis](https://www.heise.de/ct/ausgabe/2017-26-Hausautomations-Schaltzentrale-Home-Assistant-3909532.html) - December 2017
- [Using Home Assistant the ARTIK Cloud](https://developer.artik.io/documentation/developer-guide/wireless-iot/hass.html) - September 2017
- [Control home automation hardware with Home Assistant](http://www.linux-magazine.com/Issues/2017/203/Home-Assistant) - August 2017
@ -61,7 +62,7 @@ Don't miss the regular [Home Assistant podcasts](https://hasspodcast.io/).
- [Monitor IoT devices with Home Assistant and Datadog](https://www.datadoghq.com/blog/monitor-home-assistant/) - June 2017
- [Castálio Podcast - Episódio 102: Marcelo Mello - Red Hat e Automação Residencial com Home Assistant](https://youtu.be/hZq8ucpzjCs) - May 2017
- [Paulus Schoutsen and Home Assistant - Episode 8](http://codepop.com/open-sourcecraft/episodes/paulus-schoutsen/) - March 2017
- [Zammad, Home Assistant und Freifunk - are the winner of the Thomas-Krenn-Awards 2017](https://www.thomas-krenn.com/de/tkmag/allgemein/zammad-home-assistant-und-freifunk-das-sind-die-gewinner-des-thomas-krenn-awards-2017/) - March 2017
- [Zammad, Home Assistant and Freifunk - are the winner of the Thomas-Krenn-Awards 2017](https://www.thomas-krenn.com/de/tkmag/allgemein/zammad-home-assistant-und-freifunk-das-sind-die-gewinner-des-thomas-krenn-awards-2017/) - March 2017
- [10 open source software tools for developing IoT applications](http://www.cbronline.com/news/internet-of-things/10-open-source-software-tools-developing-iot-applications/) - March 2017
- [A Look at HASSbian: Raspberry Pi for Home Automation](http://www.piboards.com/2017/03/07/a-look-at-hassbian-raspberry-pi-for-home-automation/)- March 2017
- [Home Assistant with Paulus Schoutsen - Episode 94](https://www.podcastinit.com/episode-94-home-assistant-with-paulus-schoutsen/) - January 2017

View File

@ -12,7 +12,7 @@ footer: true
People are starting to present Home Assistant at meetings and get-togethers. Below you find a couple of bullet points for your presentation.
- [Numbers, numbers, numbers](/help/trivia/) and other details
- Over 750 implementations
- Over 1000 implementations
- Not depending on cloud services. We like to keep your privacy private
- Control all your devices from a single, mobile-friendly interface
- Written in Python3 with 94% test coverage

View File

@ -0,0 +1,904 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="223.45195mm"
height="150.39879mm"
viewBox="0 0 223.45195 150.39879"
version="1.1"
id="svg8"
inkscape:version="0.92.0 r15299"
sodipodi:docname="home_automation_landscape.svg">
<defs
id="defs2">
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4983"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="TriangleInS"
orient="auto"
refY="0"
refX="0"
id="marker4981"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4979"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.2)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="TriangleInM"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4823"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="TriangleInS"
orient="auto"
refY="0"
refX="0"
id="TriangleInS"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4826"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.2)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mstart"
orient="auto"
refY="0"
refX="0"
id="marker4973"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4971"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0"
refX="0"
id="marker4969"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4967"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(1.1,0,0,1.1,1.1,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mstart"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4711"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Torso"
orient="auto"
refY="0"
refX="0"
id="Torso"
style="overflow:visible"
inkscape:isstock="true">
<g
id="g4913"
transform="scale(0.7)"
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
<path
id="path4899"
d="m -4.7792281,-3.239542 c 2.350374,0.3659393 5.30026732,1.9375477 5.03715532,3.62748546 C -0.00518779,2.0778819 -2.2126741,2.6176539 -4.5630471,2.2517169 -6.9134221,1.8857769 -8.521035,0.75201414 -8.257922,-0.93792336 -7.994809,-2.6278615 -7.1296041,-3.6054813 -4.7792281,-3.239542 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
id="path4901"
d="M 4.4598789,0.08866574 C -2.5564571,-4.378332 5.2248769,-3.9061806 -0.84829578,-8.7197331"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
id="path4903"
d="M 4.9298719,0.05752074 C -1.3872731,1.7494689 1.8027579,5.4782079 -4.9448731,7.5462725"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
inkscape:connector-curvature="0" />
<rect
id="rect4905"
transform="matrix(0.527536,-0.849533,0.887668,0.460484,0,0)"
y="-1.7408575"
x="-10.391706"
height="2.7608147"
width="2.6366582"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
<rect
id="rect4907"
transform="matrix(0.671205,-0.741272,0.790802,0.612072,0,0)"
y="-7.9629307"
x="4.9587269"
height="2.8614161"
width="2.7327356"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
<path
id="path4909"
transform="matrix(0,-1.109517,1.109517,0,25.96648,19.71619)"
d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
id="path4911"
transform="matrix(0,-1.109517,1.109517,0,26.8245,16.99126)"
d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
inkscape:connector-curvature="0" />
</g>
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0"
refX="0"
id="marker4954"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4705"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(1.1,0,0,1.1,1.1,0)"
inkscape:connector-curvature="0" />
</marker>
<inkscape:path-effect
effect="powerstroke"
id="path-effect4685"
is_visible="true"
offset_points="0,0.13229166"
sort_points="true"
interpolator_type="CubicBezierJohan"
interpolator_beta="0.2"
start_linecap_type="zerowidth"
linejoin_type="extrp_arc"
miter_limit="4"
end_linecap_type="zerowidth" />
<marker
inkscape:stockid="Arrow2Sstart"
orient="auto"
refY="0"
refX="0"
id="Arrow2Sstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4590"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(0.3,0,0,0.3,-0.69,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0"
refX="0"
id="marker5272"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5270"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(1.1,0,0,1.1,1.1,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0"
refX="0"
id="marker5232"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5230"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(1.1,0,0,1.1,1.1,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4578"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(1.1,0,0,1.1,1.1,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-8"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-5"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-6"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-8"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-84"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-0"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-6-5"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-8-0"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-84-8"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-0-5"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-6-5-8"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-8-0-6"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-4"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-6"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-84-2"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-0-6"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-84-2-4"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-0-6-6"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-8-0"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-5-6"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-1"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-63"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-8-2"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-5-62"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-8-3"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-5-7"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-69"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-1"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
<marker
inkscape:stockid="TriangleInM"
orient="auto"
refY="0"
refX="0"
id="marker4985-5"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path4983-13"
d="M 5.77,0 -2.88,5 V -5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="scale(-0.4)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.5"
inkscape:cx="672.05655"
inkscape:cy="79.162523"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1536"
inkscape:window-height="809"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-10.588714,-116.71881)"
style="display:inline">
<rect
style="display:inline;fill:#9fc5e8;fill-opacity:1;stroke:#000000;stroke-width:0.677472;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5472-3-1-9"
width="222.7041"
height="41.217026"
x="10.997826"
y="219.45093" />
<rect
style="display:inline;fill:#cfe2f3;fill-opacity:1;stroke:#000000;stroke-width:0.99238181;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5474-3-8"
width="53.971424"
height="24.349827"
x="175.33235"
y="233.58411"
ry="4.6902986" />
<flowRoot
xml:space="preserve"
id="flowRoot4513"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(0.26458333,0,0,0.26458333,6.9043701,117.4865)"><flowRegion
id="flowRegion4515"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"><rect
id="rect4517"
width="25.714285"
height="106.42857"
x="775"
y="41.9524"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'" /></flowRegion><flowPara
id="flowPara4519" /></flowRoot> <rect
style="display:inline;fill:#9fc5e8;fill-opacity:1;stroke:#000000;stroke-width:0.48170522;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5472-3-8-8"
width="54.339752"
height="21.388721"
x="10.829567"
y="116.95966" />
<rect
style="fill:none;fill-opacity:1;stroke:none;stroke-width:1.06500006;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5470"
width="35.01231"
height="34.210499"
x="22.322157"
y="143.95389" />
<rect
style="fill:#cfe2f3;fill-opacity:1;stroke:#000000;stroke-width:0.99238175;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5474-3"
width="53.971424"
height="24.349825"
x="16.183468"
y="233.5192"
ry="4.6902981" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.46228218px;line-height:4.03892612px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.16155702"
x="36.045589"
y="235.3748"
id="text4525-5-9-5"
transform="scale(0.94728752,1.0556457)"><tspan
sodipodi:role="line"
x="36.045589"
y="235.3748"
style="line-height:0.37247187px;stroke-width:0.16155702"
id="tspan5341">Lights</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.85971832;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985)"
d="m 168.96722,166.03337 -0.0146,-1.15536 -0.0178,-26.4352"
id="path4951"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.94406116;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-8)"
d="m 182.86476,141.59973 0.0181,1.12869 0.022,25.82477"
id="path4951-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<rect
style="display:inline;fill:#9fc5e8;fill-opacity:1;stroke:#000000;stroke-width:0.48170522;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5472-3"
width="54.339752"
height="21.388721"
x="179.30098"
y="117.29016" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="214.21021"
y="125.508"
id="text4525-8-4"
transform="scale(0.9650764,1.0361874)"><tspan
sodipodi:role="line"
x="214.21021"
y="125.508"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5413-9">Smart Home</tspan></text>
<rect
style="display:inline;fill:#9fc5e8;fill-opacity:1;stroke:#000000;stroke-width:0.48170522;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5472-3-8"
width="54.339752"
height="21.388721"
x="117.56172"
y="117.22337" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="149.95982"
y="125.70148"
id="text4525-8-4-2"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="149.95982"
y="125.70148"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5413-9-6"
dy="-3.4999983">Home</tspan><tspan
sodipodi:role="line"
x="149.95982"
y="129.48259"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474">Automation</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="39.138622"
y="125.46329"
id="text4525-8-4-2-9"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="39.138622"
y="125.46329"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8">User</tspan></text>
<path
style="display:inline;fill:none;stroke:#000000;stroke-width:1.16749406;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-84-2-4)"
d="m 114.0517,127.63726 -2.04274,0.0152 -46.737832,0.0186"
id="path4951-3-4-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="93.829681"
y="118.77126"
id="text4525-8-4-2-9-4"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="93.829681"
y="118.77126"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-3">Configuration</tspan></text>
<rect
style="display:inline;fill:#9fc5e8;fill-opacity:1;stroke:#000000;stroke-width:0.48199999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5472-3-1"
width="222.23811"
height="20.90729"
x="10.98922"
y="168.71695" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="126.84965"
y="174.99847"
id="text4525-8-4-2-9-2"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="126.84965"
y="174.99847"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-4">Home Control</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="44.333305"
y="144.40453"
id="text4525-8-4-2-9-2-4"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="44.333305"
y="144.40453"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-4-6">Commands</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="32.77951"
y="157.53647"
id="text4525-8-4-2-9-2-1"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="32.77951"
y="157.53647"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-4-9">Information</tspan></text>
<path
style="display:inline;fill:none;stroke:#000000;stroke-width:0.94522905;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-8-0)"
d="m 13.434252,141.35309 0.01792,1.13976 0.02188,26.07814"
id="path4951-6-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="display:inline;fill:none;stroke:#000000;stroke-width:0.85722983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-1)"
d="m 61.946656,165.98792 -0.01452,-1.1553 -0.0177,-26.43364"
id="path4951-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<rect
style="display:inline;fill:#cfe2f3;fill-opacity:1;stroke:#000000;stroke-width:0.99238181;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.50078738;stroke-opacity:1"
id="rect5474-3-1"
width="53.971424"
height="24.349827"
x="92.93354"
y="233.9621"
ry="4.6902986" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.46228218px;line-height:4.03892612px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.16155702"
x="112.86232"
y="235.3748"
id="text4525-5-9-5-4"
transform="scale(0.94728752,1.0556457)"><tspan
sodipodi:role="line"
x="112.86232"
y="235.3748"
style="line-height:0.37247187px;stroke-width:0.16155702"
id="tspan5341-3">Switches</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.46228218px;line-height:4.03892612px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.16155702"
x="192.84842"
y="235.36662"
id="text4525-5-9-5-4-2"
transform="scale(0.94728752,1.0556457)"><tspan
sodipodi:role="line"
x="192.84842"
y="235.36662"
style="line-height:0.37247187px;stroke-width:0.16155702"
id="tspan5341-3-8">Many more...</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="41.44257"
y="221.21707"
id="text4525-8-4-2-9-4-7"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="41.44257"
y="221.21707"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-3-5">Internet of Things</tspan></text>
<path
style="display:inline;fill:none;stroke:#000000;stroke-width:0.94489706;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-8-2)"
d="m 120.63407,141.54543 0.018,1.13664 0.0219,26.00672"
id="path4951-6-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="display:inline;fill:none;stroke:#000000;stroke-width:0.91256553;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-8-3)"
d="m 69.84404,192.49 0.0168,1.13361 0.0205,25.93741"
id="path4951-6-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="display:inline;fill:none;stroke:#000000;stroke-width:0.85846782;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-69)"
d="m 230.8668,166.05561 -0.0146,-1.15201 -0.0178,-26.35835"
id="path4951-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="display:inline;fill:none;stroke:#000000;stroke-width:0.86219335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8.30000019;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4985-5)"
d="m 173.62583,217.27194 -0.0146,-1.16203 -0.0178,-26.58762"
id="path4951-1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="154.9097"
y="143.75829"
id="text4525-8-4-2-9-2-4-6"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="154.9097"
y="143.75829"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-4-6-2">Commands</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="143.38155"
y="157.1857"
id="text4525-8-4-2-9-2-1-9"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="143.38155"
y="157.1857"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-4-9-8">Information</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="207.90887"
y="157.44363"
id="text4525-8-4-2-9-2-1-2"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="207.90887"
y="157.44363"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-4-9-3">Information</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="219.16008"
y="143.75829"
id="text4525-8-4-2-9-2-4-6-8"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="219.16008"
y="143.75829"
style="line-height:0.34869605px;text-align:center;text-anchor:middle;stroke-width:0.15124445"
id="tspan5474-8-4-6-2-5">Commands</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="76.223282"
y="200.77679"
id="text4525-8-4-2-9-2-1-9-6"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="76.223282"
y="200.77679"
style="line-height:0.34869605px;text-align:start;text-anchor:start;stroke-width:0.15124445"
id="tspan5474-8-4-9-8-0"
dy="-4.0999999">Information</tspan><tspan
sodipodi:role="line"
x="76.223282"
y="204.55791"
style="line-height:0.34869605px;text-align:start;text-anchor:start;stroke-width:0.15124445"
id="tspan11003">(ie. light is on)</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:6.04977846px;line-height:3.78111124px;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15124445"
x="184.67532"
y="200.63307"
id="text4525-8-4-2-9-2-4-6-8-6"
transform="scale(0.96507639,1.0361874)"><tspan
sodipodi:role="line"
x="184.67532"
y="200.63307"
style="line-height:0.34869605px;text-align:start;text-anchor:start;stroke-width:0.15124445"
id="tspan5474-8-4-6-2-5-3"
dy="-3.5999999">Commands</tspan><tspan
sodipodi:role="line"
x="184.67532"
y="204.41418"
style="line-height:0.34869605px;text-align:start;text-anchor:start;stroke-width:0.15124445"
id="tspan11005">(ie. turn light on)</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.57105827px;line-height:2.85691118px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.11427645"
x="118.75391"
y="271.22955"
id="text11009"
transform="scale(1.0188363,0.98151192)"><tspan
sodipodi:role="line"
id="tspan11007"
x="118.75391"
y="271.22955"
style="stroke-width:0.11427645">Graphic by Paulus Schoutsen 2014, CC BY 4.0 </tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB