From b9a26cf5391365d4dfdb6c22aee88c5d577eafc8 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Mon, 15 Mar 2021 15:08:45 +0100 Subject: [PATCH] Add zwave_js dev docs readme (#47621) --- homeassistant/components/zwave_js/README.md | 49 ++++++++++++++++++ .../docs/running_z_wave_js_server.png | Bin 0 -> 3786 bytes .../zwave_js/docs/z_wave_js_connection.png | Bin 0 -> 10602 bytes 3 files changed, 49 insertions(+) create mode 100644 homeassistant/components/zwave_js/README.md create mode 100644 homeassistant/components/zwave_js/docs/running_z_wave_js_server.png create mode 100644 homeassistant/components/zwave_js/docs/z_wave_js_connection.png diff --git a/homeassistant/components/zwave_js/README.md b/homeassistant/components/zwave_js/README.md new file mode 100644 index 00000000000..920fc4a6a0b --- /dev/null +++ b/homeassistant/components/zwave_js/README.md @@ -0,0 +1,49 @@ +# Z-Wave JS Architecture + +This document describes the architecture of Z-Wave JS in Home Assistant and how the integration is connected all the way to the Z-Wave USB stick controller. + +## Architecture + +### Connection diagram + +![alt text][connection_diagram] + +#### Z-Wave USB stick + +Communicates with devices via the Z-Wave radio and stores device pairing. + +#### Z-Wave JS + +Represents the USB stick serial protocol as devices. + +#### Z-Wave JS Server + +Forward the state of Z-Wave JS over a WebSocket connection. + +#### Z-Wave JS Server Python + +Consumes the WebSocket connection and makes the Z-Wave JS state available in Python. + +#### Z-Wave JS integration + +Represents Z-Wave devices in Home Assistant and allows control. + +#### Home Assistant + +Best home automation platform in the world. + +### Running Z-Wave JS Server + +![alt text][running_zwave_js_server] + +Z-Wave JS Server can be run as a standalone Node app. + +It can also run as part of Z-Wave JS 2 MQTT, which is also a standalone Node app. + +Both apps are available as Home Assistant add-ons. There are also Docker containers etc. + +[connection_diagram]: docs/z_wave_js_connection.png "Connection Diagram" +[//]: # (https://docs.google.com/drawings/d/10yrczSRwV4kjQwzDnCLGoAJkePaB0BMVb1sWZeeDO7U/edit?usp=sharing) + +[running_zwave_js_server]: docs/running_z_wave_js_server.png "Running Z-Wave JS Server" +[//]: # (https://docs.google.com/drawings/d/1YhSVNuss3fa1VFTKQLaACxXg7y6qo742n2oYpdLRs7E/edit?usp=sharing) diff --git a/homeassistant/components/zwave_js/docs/running_z_wave_js_server.png b/homeassistant/components/zwave_js/docs/running_z_wave_js_server.png new file mode 100644 index 0000000000000000000000000000000000000000..53b5bdd3f8f3dc4ae8e1216f011b46dc25d58e17 GIT binary patch literal 3786 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 literal 0 HcmV?d00001 diff --git a/homeassistant/components/zwave_js/docs/z_wave_js_connection.png b/homeassistant/components/zwave_js/docs/z_wave_js_connection.png new file mode 100644 index 0000000000000000000000000000000000000000..dd40a78728f101758430b81f390778123fb48f30 GIT binary patch literal 10602 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 QTF{zFPgg&ebxsLQ0Mj%er~m)} literal 0 HcmV?d00001