From 67b6d00e0afcb234f713e48bd7a114cf2e1027f2 Mon Sep 17 00:00:00 2001 From: Jonathan Baginski Date: Thu, 12 May 2016 10:46:47 -0400 Subject: [PATCH 01/35] raspberry pi installation all-in-one --- .../asides/getting_started_navigation.html | 1 + ...tallation-raspberry-pi-all-in-one.markdown | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 source/getting-started/installation-raspberry-pi-all-in-one.markdown diff --git a/source/_includes/asides/getting_started_navigation.html b/source/_includes/asides/getting_started_navigation.html index 21c7496446d..82bc03dedce 100644 --- a/source/_includes/asides/getting_started_navigation.html +++ b/source/_includes/asides/getting_started_navigation.html @@ -8,6 +8,7 @@ {% active_link /getting-started/ Installation %} @@ -45,9 +45,9 @@
  • {% active_link /getting-started/autostart/ Auto-start Home Assistant %}
  • From 5535c1f84c482b0d4e732fa57b8e6c2e7c5eef8a Mon Sep 17 00:00:00 2001 From: Johann Kellerman Date: Sun, 15 May 2016 22:52:31 +0200 Subject: [PATCH 21/35] Update development_environment.markdown (#465) * Update development_environment.markdown * Update development_environment.markdown venv & farcy * Update development_environment.markdown --- .../development_environment.markdown | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/source/developers/development_environment.markdown b/source/developers/development_environment.markdown index b3303f0944c..63ed5a996d5 100644 --- a/source/developers/development_environment.markdown +++ b/source/developers/development_environment.markdown @@ -22,7 +22,7 @@ Home Assistant is open-source and MIT licensed. The source can be found here: You will need to set up a development environment if you want to start developing a new feature or component for Home Assistant. Please follow these steps to get setup. Visit the [the Home Assistant repository](https://github.com/home-assistant/home-assistant) first and click fork in the top right. -We suggest that you setup a [virtual environment](https://docs.python.org/3.4/library/venv.html) aka `venv` before running the setup script. +We suggest that you setup a virtual environment using [`venv`](https://docs.python.org/3.4/library/venv.html) before running the setup script. ```bash $ git clone https://github.com/YOUR_GIT_USERNAME/home-assistant.git @@ -30,6 +30,9 @@ $ cd home-assistant $ git remote add upstream https://github.com/home-assistant/home-assistant.git $ script/setup ``` +On Windows you can use `python setup.py develop` instead of the setup script. + +After following these steps, running `hass` will invoke your local installation. ### {% linkable_title Testing your work %} @@ -39,8 +42,6 @@ Testing your work requires `tox` to be installed: $ pip3 install tox ``` -After following these steps, running `hass` will invoke your local installation. - ### {% linkable_title Prevent Linter Errors %} Home Assistant enforces strict [PEP8 style](https://www.python.org/dev/peps/pep-0008/) compliance on all code submitted. You can save yourself the hassle of extra commits just to fix style errors by enabling the flake8 git commit hook. It will check your code when you attempt to commit to the repo. It will block the commit if there are any style issues, giving you a chance to fix it. @@ -74,14 +75,17 @@ If you're taking a while developing your feature request and would like to catch ```bash # Run this from your feature branch -$ git fetch upstream dev # to pull the latest changes into a local dev branch +$ git fetch upstream dev # to pull the latest changes into a local dev branch $ git rebase upstream/dev # to put those changes into your feature branch before your changes ``` -### {% linkable_title Squashing your commits %} - -Your feature is done, it looks great and the tests are all passing. What now? Squash your commits, and create a pull request. Squashing your commits makes for a more readable git commit history. It's an interactive process that is best explained by Matt Stauffer in [this video](https://www.youtube.com/watch?v=7IfkL8swmFw). +If rebase detects conflicts, you can repeat the following process until all changes have been resolved: +1. `git status` will show you the file with the conflict. +2. Edit the file and resolving the lines between `<<<< | >>>>` +3. Add the modified file `git add ` or `git add .` +4. Continue rebase `git rebase --continue` +5. Repeat until you've resolved all conflicts. ### {% linkable_title Further reading %} @@ -92,3 +96,4 @@ Your feature is done, it looks great and the tests are all passing. What now? Sq - [Rest API](/developers/api/) - [Server-sent events](/developers/server_sent_events/) - [Website](/developers/website/) +- [Home Assitant on Github - CONTRIBUTING.md](https://github.com/home-assistant/home-assistant/blob/dev/CONTRIBUTING.md) From 8d826dd5cb4eb953b0fff485db3ca21be235da5e Mon Sep 17 00:00:00 2001 From: Jonathan Baginski Date: Mon, 16 May 2016 20:32:37 -0400 Subject: [PATCH 22/35] Updates to installer instructions and editing notes --- ...tallation-raspberry-pi-all-in-one.markdown | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/source/getting-started/installation-raspberry-pi-all-in-one.markdown b/source/getting-started/installation-raspberry-pi-all-in-one.markdown index 4d2e90a1623..1dca90855d5 100644 --- a/source/getting-started/installation-raspberry-pi-all-in-one.markdown +++ b/source/getting-started/installation-raspberry-pi-all-in-one.markdown @@ -7,38 +7,41 @@ sharing: true footer: true --- -The "[Raspberry Pi All-In-One Installer](https://github.com/jbags81/fabric-home-assistant)" deploy a complete Home Assistant server including support for MQTT with websocket support and Z-Wave using [Fabric](http://www.fabfile.org/). +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 websocket support, Z-Wave, and the Open-Zwave-Control-Panel. Requirements before installation: -* You have a Raspberry Pi with a fresh installation of [Raspbian Jessie/Jessie Lite](https://www.raspberrypi.org/downloads/raspbian/) or Debian 8 connected to your network. +* You have a Raspberry Pi with a fresh installation of [Raspbian Jessie/Jessie Lite](https://www.raspberrypi.org/downloads/raspbian/) connected to your network. * You are able to SSH into your Raspberry Pi. -* You have a computer with Python 3 and `git` installed. -Installation instructions (all from your PC): - 1. Install fabric: `pip3 install fabric3` - 2. Clone the repository: `git clone https://github.com/jbags81/fabric-home-assistant.git` - 3. Change the directory: `cd fabric-home-assistant` - 4. Edit the `fabfile.py` file and add the hostname or the IP address of your Raspberry Pi to `env.hosts`. If you are using Debian 8 then replace the username `pi` in the `fabfile.py` file with your Debian user as well. - 5. Build your new Home Assistant server: `fab deploy` - 6. Reboot your Raspberry Pi. +Installation instructions: + + 1. SSH into your Raspberry Pi + 2. Run `wget -Nnv https://raw.githubusercontent.com/home-assistant/fabric-home-assistant/master/hass_rpi_installer.sh && bash hass_rpi_installer.sh;` + 3. Installation will take approx 1-2 hour's depending on the model of Raspberry Pi the installer is being run against. + Once rebooted, your Raspberry Pi will be up and running with Home Assistant. You can access it at **http://your_raspberry_pi_ip:8123**. -The Home Assistant configuration is located at `/home/hass`. The virtualenv with the Home Assistant installation is located at `/srv/hass/hass_venv`. +The Home Assistant configuration is located at `/home/hass`. The virtualenv with the Home Assistant installation is located at `/srv/hass/hass_venv`. As part of the secure installation, a new user is added to your Raspberry Pi to run Home Assistant as named, "hass". This is a system account and does not have login or other abilities by design. When editing your configuration.yaml files, you will need to run the commands as "Sudo" or switching users. Setting up WinSCP to allow this seemlessly is detailed below. -The All-In-One Fabric script will do the following automatically: +By default, installation makes use of a Python Virtualenv. If you wish to not follow this recommendation, you may add the flag `-n` to the end of the install command specified above. + +The All-In-One installer script will do the following automatically: * Create all needed directories * Create needed service accounts * Install OS and Python dependencies -* Setup a virtualenv to run Home Assistant and components inside. -* Run as a service account +* Setup a python virtualenv to run Home Assistant and components inside. +* Run as `hass` service account * Install Home Assistant in a virtualenv -* Build and install Mosquitto from source with websocket support +* Build and install Mosquitto from source with websocket support running on ports 1883 and 9001 * Build and Install Python-openzwave in the Home Assistant virtualenv +* Build openzwave-control-panel in `/srv/hass/src/open-zwave-control-panel` * Add both Home Assistant and Mosquitto to systemd services to start at boot -Fabric allows any of the underlying functions to be ran individually as well. Run `fab -l` to see a list of all callable jobs. + + +Windows Users - Please note that after running the installer, you will need to modify a couple settings allowing you to "switch users" to edit your configuration files. The needed change within WinSCP can be seen here: [Imgur](http://i.imgur.com/tlOljo6.jpg) From f86cb023f7bc73a138ea98c898de9302f8144c78 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 16 May 2016 21:52:47 -0700 Subject: [PATCH 23/35] Update demo --- source/demo/frontend.html | 22 +++++++++++----------- source/demo/webcam.jpg | Bin 85138 -> 51891 bytes 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/demo/frontend.html b/source/demo/frontend.html index e21fd545978..ae2bbc3ad41 100644 --- a/source/demo/frontend.html +++ b/source/demo/frontend.html @@ -1,8 +1,8 @@ \ No newline at end of file + clear: both;white-space:pre-wrap} \ No newline at end of file diff --git a/source/demo/webcam.jpg b/source/demo/webcam.jpg index 4ea945c6e13de08bfbadad4b866900c97f56e9e3..4d6b94348c47a23404c0ce10af8757b22bd0a060 100644 GIT binary patch literal 51891 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 + +Polymer does not have the nice developer experience that one can have with React and the [React Dev Tools] but that's a matter of time. The developer tools in every browser have seen a lot of improvements recently and each improvement helps support for web components. + +Another major benefit of Polymer for Home Assistant is that we get [material design for free]. The material design components that come with Polymer have a very high quality. Google is using these components themselves and make sure that performance and accessibility using screen readers/keyboards are great. As an open source project, the more we can outsource, the better - so our contributors can focus on the core product: home automation. + +What about Flux, data management and interaction between components? It's actually pretty similar to React or any other component based framework. Flux-like architectures work with Polymer just like with React: whenever data changes it will update the attributes of a component which will propagate to the children. For Home Assistant we use [NuclearJS] with our [own Polymer bindings]. For data moving from child to parent the Polymer pattern is using DOM events instead of callbacks but the end result is the same. It is so similar in fact, that it took me only two hours to make a [React Native frontend for on top of our core][ha-rn]. + +So what about Babel and ES2015? Also this is covered. Each web component exists of a HTML template and a JavaScript class to back it. Think of the HTML template as the render method in React. In Home Assistant we have the HTML templates import one another and have a separate chain for the JavaScript classes backing each component. This allows us to use Babel and NPM modules for the JavaScript part ([more info here][tools-js]). This does however come with the downside of other JS based frameworks: the browser blocks any painting while the JavaScript is being parsed instead of upgrading the website incrementally. This, however, is something we take for granted right now and hope that module bundlers will be able to solve this for us eventually. Tree shaking is a very promising improvement in this space. + +Most of this blog post has been comparing Polymer to React. In many ways Polymer is similar to React but it is not as far evolved yet. I like React but I do not see it as a technology that will be around forever. Given the trend of previous popular JS frameworks, React will probably get replaced by another framework that works even better. Web components however will be here forever as they are part of the HTML standard. And this gives us peace of mind at the virtual Home Assistant headquarters: we do not have to be afraid of having to rewrite our frontend just to stay relevant or because people don't want to include another dependency just to run this legacy piece. + +So there it is, the reason why we use Polymer. + +[web components]: https://www.w3.org/standards/techs/components#w3c_all +[CSS variables]: https://www.w3.org/TR/css-variables/ +[React Dev Tools]: https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en +[NuclearJS]: https://optimizely.github.io/nuclear-js/ +[own Polymer bindings]: http://paulusschoutsen.nl/blog/2015/07/using-polymer-with-flux-and-a-global-app-state/ +[ha-rn]: https://github.com/balloob/home-assistant-react-native-ios +[tools-js]: https://github.com/home-assistant/home-assistant-polymer#building-the-app +[material design for free]: https://elements.polymer-project.org/browse?package=paper-elements +[demo]: https://home-assistant.io/demo + From b75fd3dbe58025c4a12991a661f95ee78cdb0eac Mon Sep 17 00:00:00 2001 From: Dani Date: Wed, 18 May 2016 15:45:42 +0200 Subject: [PATCH 27/35] Update light.markdown (#487) When turning off and when toggling a light, transition is optional --- source/_components/light.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/light.markdown b/source/_components/light.markdown index c544d7d9af0..2259e97ac88 100644 --- a/source/_components/light.markdown +++ b/source/_components/light.markdown @@ -48,7 +48,7 @@ Turns one or multiple lights off. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`s of lights. Else targets all. -| `transition` | no | Integer that represents the time the light should take to transition to the new state. +| `transition` | yes | Integer that represents the time the light should take to transition to the new state. ### {% linkable_title Service `light.toggle` %} @@ -59,4 +59,4 @@ Toggles the state of one or multiple lights using [groups]({{site_root}}/compone | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`s of lights. Else targets all. -| `transition` | no | Integer that represents the time the light should take to transition to the new state. +| `transition` | yes | Integer that represents the time the light should take to transition to the new state. From 7e21cbab8f6a15fb12fbeb13b004bb8c15f31a2c Mon Sep 17 00:00:00 2001 From: tradiuz Date: Thu, 19 May 2016 19:02:02 -0500 Subject: [PATCH 28/35] Spelling fix (#489) --- source/_components/automation.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/automation.markdown b/source/_components/automation.markdown index 99e2c26329d..3585196f9b0 100644 --- a/source/_components/automation.markdown +++ b/source/_components/automation.markdown @@ -11,6 +11,6 @@ logo: home-assistant.png ha_category: Automation --- -Please see the [getting started section] for in-depth documentation on how to use the automation compnoent. +Please see the [getting started section] for in-depth documentation on how to use the automation component. [getting started section]: /getting-started/automation/ From 0df9563fd29185a02e4fff791779d9cd28a378e5 Mon Sep 17 00:00:00 2001 From: Bart274 Date: Fri, 20 May 2016 17:19:18 +0200 Subject: [PATCH 29/35] Update scripts-conditions.markdown (#491) --- .../scripts-conditions.markdown | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/source/getting-started/scripts-conditions.markdown b/source/getting-started/scripts-conditions.markdown index 3ee0d281bd2..10022a1c719 100644 --- a/source/getting-started/scripts-conditions.markdown +++ b/source/getting-started/scripts-conditions.markdown @@ -26,6 +26,42 @@ conditions: below: '20' ``` +#### {% linkable_title OR condition %} + +Test multiple conditions in 1 condition statement. Passes if any embedded conditions is valid. + +```yaml +condition: or +conditions: + - condition: state + entity_id: 'device_tracker.paulus' + state: 'home' + - condition: numeric_state + entity_id: 'sensor.temperature' + below: '20' +``` + +#### {% linkable_title MIXED AND and OR conditions %} + +Test multiple AND and OR conditions in 1 condition statement. Passes if any embedded conditions is valid. +This allows you to mix several AND and OR conditions together. + +```yaml +condition: and +conditions: + - condition: state + entity_id: 'device_tracker.paulus' + state: 'home' + - condition: or + conditions: + - condition: state + entity_id: sensor.weather_precip + state: 'rain' + - condition: numeric_state + entity_id: 'sensor.temperature' + below: '20' +``` + #### {% linkable_title Numeric state condition %} This type of condition attempts to parse the state of specified entity as a number and triggers if the value matches all of the above or below thresholds. @@ -43,21 +79,6 @@ below: 25 value_template: {{ float(state.state) + 2 }} ``` -#### {% linkable_title OR condition %} - -Test multiple conditions in 1 condition statement. Passes if any embedded conditions is valid. - -```yaml -condition: or -conditions: - - condition: state - entity_id: 'device_tracker.paulus' - state: 'home' - - condition: numeric_state - entity_id: 'sensor.temperature' - below: '20' -``` - #### {% linkable_title State condition %} Tests if an entity is a specified state. From 23372151fc4d7db1adcfec9f590f16b65dacf8df Mon Sep 17 00:00:00 2001 From: Landrash Date: Fri, 20 May 2016 17:35:15 +0200 Subject: [PATCH 30/35] Added known issue. (#493) Add information about [known issue](https://github.com/home-assistant/home-assistant/issues/2098) --- source/_components/media_player.samsungtv.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/media_player.samsungtv.markdown b/source/_components/media_player.samsungtv.markdown index 75cff8e9a34..25cc592450a 100644 --- a/source/_components/media_player.samsungtv.markdown +++ b/source/_components/media_player.samsungtv.markdown @@ -44,3 +44,5 @@ Currently known supported models: If your model is not on the list then give it a test, if everything works correctly then add it to the list on [GitHub](https://github.com/home-assistant/home-assistant.io). The two letters at the beginning of the model number represent the region, UE is Europe, UN is North America and UA is Asia & Australia. The two numbers following that represent the screen size. If you add your model remember to remove these before adding them to the list. + +There's currently a [known issue](https://github.com/home-assistant/home-assistant/issues/2098) with some TV's receiving a *Key press UP* that can interrupt certain applications. From fad06bc0758c3eccce9a21402d0d9bb66e308d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Fri, 20 May 2016 20:02:41 +0200 Subject: [PATCH 31/35] Update automation-condition.markdown --- .../automation-condition.markdown | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/getting-started/automation-condition.markdown b/source/getting-started/automation-condition.markdown index 8a712153168..89c18d3b271 100644 --- a/source/getting-started/automation-condition.markdown +++ b/source/getting-started/automation-condition.markdown @@ -20,4 +20,24 @@ automation: The available conditions for an automation are the same as for the script syntax. So see that page for a [full list of available conditions][script-condition]. +Example of using condition: + +```yaml +- alias: 'Enciende Despacho' + trigger: + platform: state + entity_id: sensor.mini_despacho + to: 'ON' + condition: + condition: or + conditions: + - condition: template + value_template: '{{ states.sun.sun.attributes.elevation < 4 }}' + - condition: template + value_template: '{{ states.sensor.sensorluz_7_0.state < 10 }}' + action: + - service: scene.turn_on + entity_id: scene.DespiertaDespacho +``` + [script-condition]: /getting-started/scripts-conditions/ From 7e25694941bdf1267adc38c122231cb17a4281cb Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 21 May 2016 10:00:45 +0200 Subject: [PATCH 32/35] Remove left-over from other sensor --- source/_components/binary_sensor.apcupsd.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/binary_sensor.apcupsd.markdown b/source/_components/binary_sensor.apcupsd.markdown index 650786af19e..e2e1db42d4c 100644 --- a/source/_components/binary_sensor.apcupsd.markdown +++ b/source/_components/binary_sensor.apcupsd.markdown @@ -14,7 +14,7 @@ ha_release: 0.13 In addition to the [APCUPSd Sensor](/components/sensor.apcupsd/) devices, you may also create a device which is simply "on" when the UPS status is online and "off" at all other times. -To enable this sensor, add the following lines to your `configuration.yaml` file for a GET request: +To enable this sensor, add the following lines to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry From 6172f33e65fcd3fc1fc42e9f7e176b5d5bd72258 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 21 May 2016 10:03:01 +0200 Subject: [PATCH 33/35] Minor changes --- source/_components/media_player.webostv.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_components/media_player.webostv.markdown b/source/_components/media_player.webostv.markdown index 32e65807f16..69f8fa65547 100644 --- a/source/_components/media_player.webostv.markdown +++ b/source/_components/media_player.webostv.markdown @@ -13,11 +13,11 @@ ha_iot_class: "Local Poll" ha_release: 0.18 --- -The `webostv` platform allows you to control a LG WebOS Smart TV. +The `webostv` platform allows you to control a [LG](http://www.lg.com) WebOS Smart TV. When the TV is first connected, you will need to accept Home Assistant on the TV to allow communication. -To add a TV to your installation, add the following to your `configuration.yaml` file and follow the configurator instructions: +To add a TV to your installation, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry @@ -29,7 +29,7 @@ media_player: Configuration variables: -- **host** *Optional*: The IP of the LG WebOS Smart TV, e.g. 192.168.0.10 -- **name** *Optional*: The name you would like to give to the LG WebOS Smart TV. +- **host** (*Optional*): The IP of the LG WebOS Smart TV, eg. 192.168.0.10 +- **name** (*Optional*): The name you would like to give to the LG WebOS Smart TV. If you do not provide a host name, all LG WebOS Smart TV's within your network will be auto-discovered if your TV network name is set to `[LG] webOS TV` From f4a14b18180d78c151eab18cec07dfaa0e39b947 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 21 May 2016 10:49:35 +0200 Subject: [PATCH 34/35] Format update for the configuration variables --- source/_components/media_player.cast.markdown | 2 +- source/_components/media_player.firetv.markdown | 6 +++--- source/_components/media_player.itunes.markdown | 4 ++-- source/_components/media_player.kodi.markdown | 10 +++++----- source/_components/media_player.mpd.markdown | 8 ++++---- .../_components/media_player.panasonic_viera.markdown | 6 +++--- source/_components/media_player.pioneer.markdown | 4 ++-- source/_components/media_player.samsungtv.markdown | 4 ++-- source/_components/media_player.squeezebox.markdown | 8 ++++---- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/source/_components/media_player.cast.markdown b/source/_components/media_player.cast.markdown index 0ce3920e4ec..2ffa7180414 100644 --- a/source/_components/media_player.cast.markdown +++ b/source/_components/media_player.cast.markdown @@ -26,4 +26,4 @@ media_player: Configuration variables: -- **host** *Optional*: Use only if you don't want to scan for devices. +- **host** (*Optional*): Use only if you don't want to scan for devices. diff --git a/source/_components/media_player.firetv.markdown b/source/_components/media_player.firetv.markdown index 9a5aca9937b..eead6cfc6dc 100644 --- a/source/_components/media_player.firetv.markdown +++ b/source/_components/media_player.firetv.markdown @@ -45,9 +45,9 @@ media_player: Configuration variables: -- **host** *Optional*: Where `firetv-server` is running. Default is *localhost:5556*. -- **device** *Optional*: The device ID, default is *default*. -- **name** *Optional*: The friendly name of the device, default is 'Amazon Fire TV'. +- **host** (*Optional*): Where `firetv-server` is running. Default is *localhost:5556*. +- **device** (*Optional*): The device ID, default is *default*. +- **name** (*Optional*): The friendly name of the device, default is 'Amazon Fire TV'.

    diff --git a/source/_components/media_player.itunes.markdown b/source/_components/media_player.itunes.markdown index 625a46a59ff..3b9b590d3e8 100644 --- a/source/_components/media_player.itunes.markdown +++ b/source/_components/media_player.itunes.markdown @@ -30,5 +30,5 @@ media_player: Configuration variables: -- **host** *Required*: The URL of the itunes-api API, eg. http://192.168.1.50 -- **port** *Optional*: The port where itunes-api is accessible, eg. 8181. +- **host** (*Required*): The URL of the itunes-api API, eg. http://192.168.1.50 +- **port** (*Optional*): The port where itunes-api is accessible, eg. 8181. diff --git a/source/_components/media_player.kodi.markdown b/source/_components/media_player.kodi.markdown index 8861c04c1d4..9cd3a203358 100644 --- a/source/_components/media_player.kodi.markdown +++ b/source/_components/media_player.kodi.markdown @@ -31,8 +31,8 @@ media_player: Configuration variables: -- **host** *Required*: The host name or address of the device that is running XBMC/Kodi -- **port** *Required*: The port number, default 8080 -- **name** *Optional*: The name of the device used in the frontend. -- **username** *Optional*: The XBMC/Kodi HTTP username. -- **password** *Optional*: The XBMC/Kodi HTTP password. +- **host** (*Required*): The host name or address of the device that is running XBMC/Kodi +- **port** (*Required*): The port number, default 8080 +- **name** (*Optional*): The name of the device used in the frontend. +- **username** (*Optional*): The XBMC/Kodi HTTP username. +- **password** (*Optional*): The XBMC/Kodi HTTP password. diff --git a/source/_components/media_player.mpd.markdown b/source/_components/media_player.mpd.markdown index 449a5972500..b5d10aee92d 100644 --- a/source/_components/media_player.mpd.markdown +++ b/source/_components/media_player.mpd.markdown @@ -29,10 +29,10 @@ media_player: Configuration variables: -- **server** *Required*: IP address of the Music Player Daemon, eg. 192.168.1.32 -- **port** *Optional*: Port of the Music Player Daemon, defaults to 6600. -- **location** *Optional*: Location of your Music Player Daemon. -- **password** *Optional*: Password for your Music Player Daemon. +- **server** (*Required*): IP address of the Music Player Daemon, eg. 192.168.1.32 +- **port** (*Optional*): Port of the Music Player Daemon, defaults to 6600. +- **location** (*Optional*): Location of your Music Player Daemon. +- **password** (*Optional*): Password for your Music Player Daemon. This platform works with [Music Player Daemon](http://www.musicpd.org/) and [mopidy](https://www.mopidy.com/) with [Mopidy-MPD](https://docs.mopidy.com/en/latest/ext/mpd/) as used by [Pi MusicBox](http://www.pimusicbox.com/). diff --git a/source/_components/media_player.panasonic_viera.markdown b/source/_components/media_player.panasonic_viera.markdown index f9135c75fc2..8eceb7a2660 100644 --- a/source/_components/media_player.panasonic_viera.markdown +++ b/source/_components/media_player.panasonic_viera.markdown @@ -34,7 +34,7 @@ media_player: Configuration variables: -- **host** *Required*: The IP of the Panasonic Viera TV, e.g. `192.168.0.10` -- **port** *Optional*: The port of your Panasonic Viera TV. Defaults to `55000` -- **name** *Optional*: The name you would like to give to the Panasonic Viera TV. +- **host** (*Required*): The IP of the Panasonic Viera TV, e.g. `192.168.0.10` +- **port** (*Optional*): The port of your Panasonic Viera TV. Defaults to `55000` +- **name** (*Optional*): The name you would like to give to the Panasonic Viera TV. diff --git a/source/_components/media_player.pioneer.markdown b/source/_components/media_player.pioneer.markdown index 0d05f454731..e0a20c48c57 100644 --- a/source/_components/media_player.pioneer.markdown +++ b/source/_components/media_player.pioneer.markdown @@ -27,6 +27,6 @@ media_player: Configuration variables: -- **host** *Required*: The IP of the Pioneer device, eg. `192.168.0.10` -- **name** *Optional*: The name you would like to give to the receiver. +- **host** (*Required*): The IP of the Pioneer device, eg. `192.168.0.10` +- **name** (*Optional*): The name you would like to give to the receiver. diff --git a/source/_components/media_player.samsungtv.markdown b/source/_components/media_player.samsungtv.markdown index 25cc592450a..87d3cd23c5c 100644 --- a/source/_components/media_player.samsungtv.markdown +++ b/source/_components/media_player.samsungtv.markdown @@ -29,8 +29,8 @@ media_player: Configuration variables: -- **host** *Required*: The IP of the Samsung Smart TV, e.g. 192.168.0.10 -- **name** *Optional*: The name you would like to give to the Samsung Smart TV. +- **host** (*Required*): The IP of the Samsung Smart TV, eg. 192.168.0.10 +- **name** (*Optional*): The name you would like to give to the Samsung Smart TV. Currently known supported models: diff --git a/source/_components/media_player.squeezebox.markdown b/source/_components/media_player.squeezebox.markdown index e819dba2bc6..faa59f84265 100644 --- a/source/_components/media_player.squeezebox.markdown +++ b/source/_components/media_player.squeezebox.markdown @@ -30,7 +30,7 @@ media_player: Configuration variables: -- **host** *Required*: The host name or address of the Logitech Media Server, eg. 192.168.1.21. -- **port** *Optional*: Telnet port to Logitech Media Server, default 9090. -- **username** *Optional*: The username, if password protection is enabled. -- **password** *Optional*: The password, if password protection is enabled. +- **host** (*Required*): The host name or address of the Logitech Media Server, eg. 192.168.1.21. +- **port** (*Optional*): Telnet port to Logitech Media Server, default 9090. +- **username** (*Optional*): The username, if password protection is enabled. +- **password** (*Optional*): The password, if password protection is enabled. From ece3b37de777946ff3835cab9e7b2623d17cb052 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Sat, 21 May 2016 15:47:01 +0200 Subject: [PATCH 35/35] Add note on zwave thermostat (#494) --- source/_components/thermostat.zwave.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/_components/thermostat.zwave.markdown b/source/_components/thermostat.zwave.markdown index 3817564c5bd..6c4d7de9946 100644 --- a/source/_components/thermostat.zwave.markdown +++ b/source/_components/thermostat.zwave.markdown @@ -13,3 +13,9 @@ ha_release: 0.17 --- To get your Z-Wave thermostat working with Home Assistant, follow the instructions for the general [Z-Wave component](/components/zwave/). + +## NOTE +If your thermostat support fan modes or different operating modes, it should be considered a hvac component, and will also be detected as one. Thermostat component does not support setting fan or operation mode. This is controlled via the hvac component. + +If the thermostat support different operationg modes, you will get one thermostat entity for each mode. +These can be hidden with settings using the customize setting in the config file.