From 583e4f93d726b021468487fedb17281877102266 Mon Sep 17 00:00:00 2001 From: Flyte Date: Thu, 28 Jan 2016 17:07:22 +0000 Subject: [PATCH] Add ZigBee component documentation. --- .../_components/binary_sensor.zigbee.markdown | 33 ++++++++++ source/_components/light.zigbee.markdown | 33 ++++++++++ source/_components/sensor.zigbee.markdown | 59 ++++++++++++++++++ source/_components/switch.zigbee.markdown | 33 ++++++++++ source/_components/zigbee.markdown | 55 ++++++++++++++++ source/images/supported_brands/zigbee.png | Bin 0 -> 18965 bytes 6 files changed, 213 insertions(+) create mode 100644 source/_components/binary_sensor.zigbee.markdown create mode 100644 source/_components/light.zigbee.markdown create mode 100644 source/_components/sensor.zigbee.markdown create mode 100644 source/_components/switch.zigbee.markdown create mode 100644 source/_components/zigbee.markdown create mode 100644 source/images/supported_brands/zigbee.png diff --git a/source/_components/binary_sensor.zigbee.markdown b/source/_components/binary_sensor.zigbee.markdown new file mode 100644 index 00000000000..7d270316e27 --- /dev/null +++ b/source/_components/binary_sensor.zigbee.markdown @@ -0,0 +1,33 @@ +--- +layout: component +title: ZigBee Binary Sensor +description: "Instructions on how to set up ZigBee binary sensors within Home Assistant." +date: 2016-01-28 12:38 +sidebar: true +comments: false +sharing: true +footer: true +logo: zigbee.png +ha_category: Binary Sensor +--- + +A ZigBee binary sensor in this context is a device connected to one of the digital input pins on a ZigBee module. The states reported by such a device are limited to 'on' or 'off'. By default, a binary sensor is considered 'on' when the ZigBee device's digital input pin is held 'high' and considered 'off' when it is held 'low'. This behaviour can be inverted by setting the `on_state` configuration variable to `low`. + +To configure a digital input as a binary sensor, use the following variables: + +- **name** (*Required*): The name you'd like to give the binary sensor in Home Assistant. +- **platform** (*Required*): Set to `zigbee`. +- **pin** (*Required*): The number identifying which pin to use. +- **address**: The long 64bit address of the remote ZigBee device whose digital input pin you'd like to sample. Do not include this variable if you want to sample the local ZigBee device's pins. +- **on_state**: Either `high` (default) or `low`, depicting whether the binary sensor is considered 'on' when the pin is 'high' or 'low'. + +#### Example + +```yaml +binary_sensor: + - name: Hallway PIR Sensor + platform: zigbee + pin: 0 + address: 0013A20040892FA2 + on_state: low +``` diff --git a/source/_components/light.zigbee.markdown b/source/_components/light.zigbee.markdown new file mode 100644 index 00000000000..0c71f8e4bfc --- /dev/null +++ b/source/_components/light.zigbee.markdown @@ -0,0 +1,33 @@ +--- +layout: component +title: ZigBee Light +description: "Instructions on how to set up ZigBee lights within Home Assistant." +date: 2016-01-28 12:38 +sidebar: true +comments: false +sharing: true +footer: true +logo: zigbee.png +ha_category: Light +--- + +A ZigBee light in this context is a light connected to one of the digital output pins on a ZigBee module. It can simply be switched on and off. By default, a light is considered 'on' when the ZigBee device's digital output is held 'high' and considered 'off' when it is held 'low'. This behaviour can be inverted by setting the `on_state` configuration variable to `low`. + +To configure a digital output pin as a light, use the following variables: + +- **name** (*Required*): The name you'd like to give the light in Home Assistant. +- **platform** (*Required*): Set to `zigbee`. +- **pin** (*Required*): The number identifying which pin to use. +- **address**: The long 64bit address of the remote ZigBee device whose digital output pin you'd like to switch. Do not include this variable if you want to switch the local ZigBee device's pins. +- **on_state**: Either `high` (default) or `low`, depicting whether the digital output pin is pulled high or low when the light is turned on. + +#### Example + +```yaml +light: + - name: Desk Lamp + platform: zigbee + pin: 0 + address: 0013A20040791FA2 + on_state: low +``` diff --git a/source/_components/sensor.zigbee.markdown b/source/_components/sensor.zigbee.markdown new file mode 100644 index 00000000000..c8a3e450797 --- /dev/null +++ b/source/_components/sensor.zigbee.markdown @@ -0,0 +1,59 @@ +--- +layout: component +title: ZigBee Sensor +description: "Instructions on how to set up ZigBee sensors within Home Assistant." +date: 2016-01-28 10:08 +sidebar: true +comments: false +sharing: true +footer: true +logo: zigbee.png +ha_category: Sensor +--- + +There are two types of ZigBee sensor available to Home Assistant: + +- Analog input pin +- Temperature sensor (XBee Pro) + +## Analog Input Pin + +The analog input pins on an XBee (non-pro) will read 0-1.2 Volts. This is translated by the [xbee-helper](https://github.com/flyte/xbee-helper) library into a percentage. The maximum voltage your ZigBee device will read is configurable using the `max_volts` configuration variable. + +To configure an analog input pin sensor, use the following variables: + +- **name** (*Required*): The name you'd like to give the sensor in Home Assistant. +- **platform** (*Required*): Set to `zigbee`. +- **type** (*Required*): Set to `analog`. +- **pin** (*Required*): The number identifying which pin to sample. +- **address**: The long 64bit address of the remote ZigBee device whose analog input pin you'd like to sample. Do not include this variable if you want to sample the local ZigBee device's pins. + +#### Example + + sensor: + - name: My Analog Input + platform: zigbee + type: analog + pin: 0 + address: 0013A2004233D138 + +See the [Digi knowledge base](http://knowledge.digi.com/articles/Knowledge_Base_Article/Digital-and-analog-sampling-using-XBee-radios) for more XBee sampling details. + +## Temperature Sensor + +The XBee Pro (and perhaps other third party modules) contains a thermometer device which can be read by using the `TP` AT command. To set this up as a temperature sensor device in Home Assistant use the following config variables: + +- **name** (*Required*): The name you'd like to give the temperature sensor in Home Assistant +- **platform** (*Required*): Set to `zigbee` +- **type** (*Required*): Set to `temperature` +- **address**: The long 64bit address of the remote ZigBee device whose temperature sensor you'd like to sample. Do not include this variable if you want to sample the local ZigBee device's temperature. + +#### Example + +```yaml +sensor: + - name: Living Room Temperature + platform: zigbee + type: temperature + address: 0013A20050E752C5 +``` \ No newline at end of file diff --git a/source/_components/switch.zigbee.markdown b/source/_components/switch.zigbee.markdown new file mode 100644 index 00000000000..e75435b0184 --- /dev/null +++ b/source/_components/switch.zigbee.markdown @@ -0,0 +1,33 @@ +--- +layout: component +title: ZigBee Switch +description: "Instructions on how to set up ZigBee switches within Home Assistant." +date: 2016-01-28 11:52 +sidebar: true +comments: false +sharing: true +footer: true +logo: zigbee.png +ha_category: Switch +--- + +A ZigBee switch in this context is a device connected to one of the digital output pins on a ZigBee module. It can simply be switched on and off. By default, a switch is considered 'on' when the ZigBee device's digital output is held 'high' and considered 'off' when it is held 'low'. This behaviour can be inverted by setting the `on_state` configuration variable to `low`. + +To configure a digital output pin as a switch, use the following variables: + +- **name** (*Required*): The name you'd like to give the switch in Home Assistant. +- **platform** (*Required*): Set to `zigbee`. +- **pin** (*Required*): The number identifying which pin to use. +- **address**: The long 64bit address of the remote ZigBee device whose digital output pin you'd like to switch. Do not include this variable if you want to switch the local ZigBee device's pins. +- **on_state**: Either `high` (default) or `low`, depicting whether the digital output pin is pulled high or low when the switch is turned on. + +#### Example + +```yaml +switch: + - name: Pond Fountain + platform: zigbee + pin: 0 + address: 0013A20040791FA2 + on_state: low +``` diff --git a/source/_components/zigbee.markdown b/source/_components/zigbee.markdown new file mode 100644 index 00000000000..115bbbb4818 --- /dev/null +++ b/source/_components/zigbee.markdown @@ -0,0 +1,55 @@ +--- +layout: component +title: "ZigBee" +description: "Instructions on how to integrate a ZigBee network with Home Assistant." +date: 2016-01-27 17:10 +sidebar: true +comments: false +sharing: true +footer: true +logo: zigbee.png +ha_category: DIY +--- + +[ZigBee](http://www.zigbee.org/what-is-zigbee/) integration for Home Assistant allows you to utilise modules such as the [XBee](http://www.digi.com/lp/xbee) as wireless General Purpose Input/Output (GPIO) devices. The component requires a local ZigBee device to be connected over a serial port. Through this it will send and receive commands to and from other devices on the ZigBee mesh network. + +There is currently support for the following device types within Home Assistant: + +- Binary Sensor (digital input pins) +- Sensor (analog input pins and temperature sensor) +- Light (digital output pins) +- Switch (digital output pins) + +The local ZigBee device (assuming XBee) must have an up to date Router or Coordinator API firmware installed. + +## Configuration + +A `zigbee` section must be present in the `configuration.yaml` file and contain the following options as required: + +- **device**: The serial port to which the local ZigBee device is connected. Default: `/dev/ttyUSB0` + +- **baud**: The baud rate at which to communicate with the local ZigBee device. Default: `9600` + +#### Example + +```yaml +zigbee: + device: /dev/ttyUSB0 + baud: 115200 +``` + +Or to simply use the defaults: + +```yaml +zigbee: +``` + +To find the possible serial port names of your device, run: + +```bash +$ ls /dev/ttyUSB* +``` + +

+The port may also appear as /dev/ttyACM* if you're communicating with the ZigBee device through an Arduino. +

diff --git a/source/images/supported_brands/zigbee.png b/source/images/supported_brands/zigbee.png new file mode 100644 index 0000000000000000000000000000000000000000..444407c349e7ef3c4759f92259fb649ca543f5bb GIT binary patch literal 18965 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 ut6`&pja9_P%c9cuW(4Tr;o&hC@c#qTldk{L