From 041d0d8c45c40a516d93ecdb130372df62c70ca0 Mon Sep 17 00:00:00 2001 From: Nate Clark Date: Tue, 15 May 2018 14:04:06 -0400 Subject: [PATCH] Add Konnected component (#5102) --- .../binary_sensor.konnected.markdown | 45 ++++++++ source/_components/konnected.markdown | 102 ++++++++++++++++++ source/_components/switch.konnected.markdown | 46 ++++++++ source/images/supported_brands/konnected.png | Bin 0 -> 15134 bytes 4 files changed, 193 insertions(+) create mode 100644 source/_components/binary_sensor.konnected.markdown create mode 100644 source/_components/konnected.markdown create mode 100644 source/_components/switch.konnected.markdown create mode 100644 source/images/supported_brands/konnected.png diff --git a/source/_components/binary_sensor.konnected.markdown b/source/_components/binary_sensor.konnected.markdown new file mode 100644 index 00000000000..727cc4e9440 --- /dev/null +++ b/source/_components/binary_sensor.konnected.markdown @@ -0,0 +1,45 @@ +--- +layout: page +title: "Konnected Binary Sensor" +description: "Connect wired open/close sensors to Home Assistant with Konnected and a NodeMCU ESP8266" +date: 2018-04-03 12:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: konnected.png +ha_category: Binary Sensor +ha_release: "0.70" +ha_iot_class: "Local Push" +--- + +The `konnected` binary sensor allows you to monitor wired door sensors, window sensors, motion sensors, smoke detectors, +CO detectors, glass-break sensors, water leak sensors or any other simple wired open/close circuit attached to a +NodeMCU ESP8266 WiFi module running the [open source Konnected software](https://github.com/konnected-io/konnected-security). + +See the [`konnected`](/components/konnected/) component for configuration and setup instructions. Please visit the +[Konnected.io website](https://konnected.io) for more information about the Konnected Alarm Panel board and compatible +hardware. + +This component supports all of the built-in device classes of the generic [Binary Sensor](/components/binary_sensor/) +component. + +{% configuration %} + +pin: + description: The number corresponding to the _IO index_ of the labeled pin on the NodeMCU dev board. See the [NodeMCU GPIO documentation](https://nodemcu.readthedocs.io/en/master/en/modules/gpio/) for more details. Valid values are 1, 2, 5, 6, 7 and 9. + required: exclusive +zone: + description: The number corresponding to the labeled zone on the [Konnected Alarm Panel](https://konnected.io) board. Valid values are 1, 2, 3, 4, 5 and 6. + required: exclusive +type: + description: Any [binary sensor](/components/binary_sensor/) class, typically `door`, `window`, `motion` or `smoke`. + required: true +name: + description: The name of the device used in the front end. + required: false + default: automatically generated + +{% endconfiguration%} + +**Note:** Either **pin** or **zone** is required for each sensor. Do not use both in the same sensor definition. \ No newline at end of file diff --git a/source/_components/konnected.markdown b/source/_components/konnected.markdown new file mode 100644 index 00000000000..f9e9a5e9a07 --- /dev/null +++ b/source/_components/konnected.markdown @@ -0,0 +1,102 @@ +--- +layout: page +title: "Konnected" +description: "Connect wired alarm sensors and siren using the NodeMCU based Konnected Alarm Panel" +date: 2018-04-03 12:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: konnected.png +ha_category: Alarm +ha_release: "0.70" +--- + +The `konnected` component lets you connect wired sensors and switches to a NodeMCU ESP8226 based device running the +[open source Konnected software](https://github.com/konnected-io/konnected-security). Reuse the wired sensors and +siren from an old or pre-wired alarm system installation and integrate them directly into Home Assistant. + +Visit the [Konnected.io website](https://konnected.io) for more information about the Konnected Alarm Panel board and +compatible hardware. + +The component currently supports the following device types in Home Assistant: +- [Binary Sensor](/components/binary_sensor.konnected/): Wired door and window sensors, motion detectors, glass-break +detectors, leak sensors, smoke & CO detectors or any open/close switch. +- [Switch](/components/switch.konnected/): Actuate a siren, strobe, buzzer, or relay module. + +This component requires the [`discovery`](https://www.home-assistant.io/components/discovery) component to be enabled. + +A `konnected` section must be present in the `configuration.yml` file that specifies the Konnected devices on the network +and the sensors or actuators attached to them: + +```yaml +# Example configuration.yaml entry +konnected: + access_token: REPLACE_ME_WITH_A_RANDOM_STRING + devices: + - id: 8bcd53 + binary_sensors: + - zone: 1 + type: door + name: 'Front Door' + - zone: 3 + type: motion + name: 'Test Motion' + switches: + - zone: out + name: siren + - id: 438a38 + binary_sensors: + - pin: 1 + type: motion + name: 'Office Motion' + - pin: 2 + type: door + name: 'Office Door' + switches: + - pin: 5 + name: 'Garage Door' + activation: low +``` + +{% configuration %} + +access_token: + description: Any random string. This is used to ensure that only those devices which you have configured can authenticate to Home Assistant to change a device state. For security, we recommend using `secrets.yml` to specify this. + required: true + type: string +devices: + description: A list of Konnected devices that you have on your network. + required: true + type: list + keys: + id: + description: The MAC address of the WiFi module with colons/punctuation removed. You can either use the full 12-character MAC address or only the last 6 characters. This is visible in the device's WiFi SSID and hostname. + required: true + type: string + binary_sensors: + description: A list of binary sensors connected to the device. See [Konnected Binary Sensor](/components/binary_sensor.konnected/) for configuration variables. + required: false + type: list + switches: + description: A list of actuators (on/off switches) connected to the device. See [Konnected Switch](/components/switch.konnected/) for configuration variables. + required: false + type: list + +{% endconfiguration%} + +### {% linkable_title Pin Mapping %} + +Konnected runs on an ESP8266 board with the NodeMCU firmware. It is commonly used with the NodeMCU dev kit WiFi module and +optionally Konnected's Alarm Panel hardware. The following table shows the pin mapping between the Konnected hardware +labeled zones, the NodeMCU labeled pins, and the ESP8266 GPIO pins. + +| Konnected Alarm Panel Zone | NodeMCU pin | IO Index | ESP8266 GPIO | +|---|---|---|---| +| 1 | D1 | 1 | GPIO5 | +| 2 | D2 | 2 | GPIO4 | +| 3 | D5 | 5 | GPIO14 | +| 4 | D6 | 6 | GPIO12 | +| 5 | D7 | 7 | GPIO13 | +| 6 | RX | 9 | GPIO3 | +| ALARM or OUT | D8 | 8 | GPIO15 | diff --git a/source/_components/switch.konnected.markdown b/source/_components/switch.konnected.markdown new file mode 100644 index 00000000000..224ce8af5f3 --- /dev/null +++ b/source/_components/switch.konnected.markdown @@ -0,0 +1,46 @@ +--- +layout: page +title: "Konnected Switch" +description: "Connect wired actuators to Home Assistant with Konnected and a NodeMCU ESP8266" +date: 2018-04-03 12:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: konnected.png +ha_category: Switch +ha_release: "0.70" +ha_iot_class: "Local Push" +--- + +The `konnected` switch allows you to actuate an alarm system siren, strobe light, buzzer, or any other wired device using +a [Konnected Alarm Panel board](https://konnected.io) or relay module and a NodeMCU ESP8266 WiFi module running the +[open source Konnected software](https://github.com/konnected-io/konnected-security). + +Please visit the [Konnected.io website](https://konnected.io) for more information about the Konnected Alarm Panel board and compatible +hardware. + +See the [`konnected`](/components/konnected/) component for configuration and setup instructions. + +{% configuration %} + +pin: + description: The number corresponding to the _IO index_ of the labeled pin on the NodeMCU dev board. See the [NodeMCU GPIO documentation](https://nodemcu.readthedocs.io/en/master/en/modules/gpio/) for more details. Valid values are 1, 2, 5, 6, 7 and 8. + required: exclusive +zone: + description: The number corresponding to the labeled zone on the [Konnected Alarm Panel](https://konnected.io) board, or the word `out` to specify the dedicated ALARM/OUT terminal on the Konnected board. Valid values are 1, 2, 3, 4, 5 and out. + required: exclusive +name: + description: The name of the device used in the front end. + required: false + default: automatically generated +activation: + description: Either "low" or "high" to specify the state when the switch is turned on. + default: high + required: false + +{% endconfiguration%} + +#### Configuration Notes +- Either **pin** or **zone** is required for each actuator. Do not use both in the same definition. +- Pin `D8` or the `out` zone will only work when activation is set to high (the default). diff --git a/source/images/supported_brands/konnected.png b/source/images/supported_brands/konnected.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6ebbf7970ee1550e6127b485b6e5109e0ef97d GIT binary patch literal 15134 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