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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 K^y!IDIR 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 literal 0 HcmV?d00001