WIP: Tutorial for Weave Device Manager Shell
diff --git a/doc/guides/tools/using-device-manager-shell.md b/doc/guides/tools/using-device-manager-shell.md
new file mode 100644
index 0000000..5753ed8
--- /dev/null
+++ b/doc/guides/tools/using-device-manager-shell.md
@@ -0,0 +1,196 @@
+# Using the Weave Device Manager Shell
+
+The Weave Device Manager Shell is a command-line tool that provides a convenient way for developers to interact with and manage
+Weave-enabled devices over a local network connection. The tool presents a shell-like interface with various built-in commands.
+The commands can be used to discover a device, establish connectivity to it, and invoke device operations. The Device Manager Shell
+is implemented in Python, and is designed to be used in a desktop environment (generally linux or OSX). The shell can be used interactively,
+or it can be given a list of commands to execute via stdin.
+
+At its core, the Weave Device Manager Shell is built around the WeaveDeviceManager C++ library, which is part of the openweave-core
+project. This same library is also used by the Nest mobile application when it interacts locally with devices. Because of this, the Weave
+Device Manager Shell is capable of performing the same device management activities as the Nest app, including pairing new devices.
+
+The Weave Device Manager Shell can communicate with a device over a variety of network types. Any form of IP-bearing network can be
+used, including Ethernet, WiFi and Thread, provided the host machine has a suitably configured interface. Additionally, both IPv4 and
+IPv6 communication is supported.
+
+Weave-over-BLE (WoBLE) communication can be used on hosts that provide compatible BLE interfaces (currently BlueZ on Linux and
+Core Bluetooth on OSX).
+
+Necessarily, the process of connecting to a device will differ depending on the type of network interface used. However, once a connection
+is established, all further interactions with the device are the same regardless of network type.
+
+## Building
+
+The Weave Device Manager Shell is built as part of a “standalone” build of the openweave-core source tree. A standalone build builds
+OpenWeave specifically configured for use on a desktop system.
+
+To build the Weave Device Manager Shell, perform the following steps:
+
+- Install prerequisites
+
+ # On Linux:
+ $ sudo apt-get install git make gcc g++ python python-pip python-setuptools libdbus-1-dev libudev-dev libical-dev libreadline-dev libssl-dev
+
+ # On OS X:
+ $ sudo cpan -i Text::Template
+
+- Clone the openweave-core repository
+
+ $ cd ~
+ $ git clone https://github.com/openweave/openweave-core.git
+
+- Build OpenWeave
+
+ $ cd ~/openweave-core
+ $ make -f Makefile-Standalone DEBUG=1 stage
+
+Once the build completes, the Weave Device Manager Shell can be run using the following command:
+
+ # On Linux:
+ $ ~/openweave-core/output/x86_64-unknown-linux-gnu/bin/weave-device-mgr
+
+ # On OS X:
+ $ ~/openweave-core/output/x86_64-apple-darwin/bin/weave-device-mgr
+
+Alternatively, you can add the output bin directory to your path:
+
+ $ OPENWEAVE_BIN=`echo ${HOME}/openweave-core/output/x86_64-*/bin`
+ $ export PATH=${PATH}:${OPENWEAVE_BIN}
+
+## How To's
+
+The following sections show how to perform various common tasks using the Weave Device Manager Shell.
+
+### Connecting using Weave-over-BLE (WoBLE)
+
+This how-to demonstrates the process of connecting to a device using Weave-over-BLE.
+
+To connect to a device using WoBLE, the device must be advertising in connectable mode. Most Weave devices do this automatically when
+they power on in an unpaired state. However some devices may require a press a button before they begin advertising.
+
+In order to locate the correct device, one must know it's BLE device name. This can often be found in the log output of the
+device when it boots. E.g.:
+
+ <info> weave: [DL] Configuring BLE advertising (interval 500 ms, connectable, device name NEST-0003)
+
+Nest devices typically use a BLE name of ‘N’ or ‘NEST-’ followed by 4 hex digits. On production devices this information can often be found
+on the back of the device. Failing that, the BLE name of a device can be found by issuing a `ble-scan` command:
+
+ weave-device-mgr > ble-scan
+ 2019-05-09 12:53:48,206 WeaveBLEMgr INFO BLE is ready!
+ 2019-05-09 12:53:50,441 WeaveBLEMgr INFO
+ 2019-05-09 12:53:50,471 WeaveBLEMgr INFO adding to scan list:
+ 2019-05-09 12:53:50,471 WeaveBLEMgr INFO
+ 2019-05-09 12:53:50,471 WeaveBLEMgr INFO Name = NEST-0003
+ 2019-05-09 12:53:50,471 WeaveBLEMgr INFO ID = ADC13F9D-35FD-40FB-81E6-F8EF461BC030
+ 2019-05-09 12:53:50,471 WeaveBLEMgr INFO RSSI = -73
+ 2019-05-09 12:53:50,472 WeaveBLEMgr INFO ADV data: {
+ kCBAdvDataIsConnectable = 1;
+ kCBAdvDataLocalName = "NEST-0003";
+ kCBAdvDataServiceUUIDs = (
+ FEAF
+ );
+ }
+ 2019-05-10 10:28:45,183 WeaveBLEMgr INFO scanning stopped
+
+Once the device name has been determined, a WoBLE connection can be established as follows:
+
+* Scan for the target device and establish a BLE connection
+
+ weave-device-mgr > ble-scan-connect NEST-0003
+ 2019-03-22 12:43:05,744 WeaveBLEMgr INFO BLE is ready!
+ 2019-03-22 12:43:06,101 WeaveBLEMgr INFO adding to scan list:
+ 2019-03-22 12:43:06,101 WeaveBLEMgr INFO
+ 2019-03-22 12:43:06,101 WeaveBLEMgr INFO Name = NEST-0003
+ 2019-03-22 12:43:06,101 WeaveBLEMgr INFO ID = 63B7C6D9-DF17-4E0A-89B6-58FDD58DE718
+ 2019-03-22 12:43:06,101 WeaveBLEMgr INFO RSSI = -59
+ 2019-03-22 12:43:06,101 WeaveBLEMgr INFO ADV data: {
+ kCBAdvDataIsConnectable = 1;
+ kCBAdvDataLocalName = "NEST-0003";
+ kCBAdvDataServiceUUIDs = (
+ FEAF
+ );
+ }
+ 2019-03-22 12:43:06,101 WeaveBLEMgr INFO
+ 2019-03-22 12:43:06,102 WeaveBLEMgr INFO scanning stopped
+ 2019-03-22 12:43:06,102 WeaveBLEMgr INFO trying to connect to NEST-0003
+ 2019-03-22 12:43:07,204 WeaveBLEMgr INFO Discovering services
+ 2019-03-22 12:43:07,208 WeaveBLEMgr INFO Discovering services
+ 2019-03-22 12:43:07,363 WeaveBLEMgr INFO connect success
+ weave-device-mgr >
+
+* Establish a Weave-over-BLE connection with the device:
+
+ weave-device-mgr > connect --ble
+ WEAVE:BLE: subscribe complete, ep = 0x1080c5d30
+ WEAVE:BLE: peripheral chose BTP version 3; central expected between 2 and 3
+ WEAVE:BLE: using BTP fragment sizes rx 20 / tx 101.
+ WEAVE:BLE: local and remote recv window size = 3
+ WEAVE:ML: WoBle con complete BBD0
+ WEAVE:ML: Con complete BBD0
+ WEAVE:DM: Connected to device
+ WEAVE:DM: Initializing Weave BLE connection
+ WEAVE:EM: ec id: 1, AppState: 0x6b018800
+ WEAVE:DM: Sending IdentifyRequest to device
+ WEAVE:EM: Msg sent 0000000E:1 16 FFFFFFFFFFFFFFFF BBD0 ACD9 0 MsgId:00000000
+ WEAVE:EM: Msg rcvd 0000000E:2 29 18B4300000000003 BBD0 ACD9 0 MsgId:00000000
+ WEAVE:DM: Received identify response from device 18B4300000000003 (ble con BBD0)
+ Connected to device.
+
+ weave-device-mgr (18B4300000000003 @ ::) >
+
+Once the WoBLE connection has been established, the Device Manager Shell prompt will change to show the Weave
+node id of the connected device. At this point the connection can be used to issue commands to the device, as shown
+below.
+
+NOTE: The above example shows connecting to a device without authenticating. While this is allowed, production devices
+will restrict what commands can be sent over such a connection. See the sections on connecting using a pairing code or
+an access token for how to establish an authenticated connection.
+
+### Connecting using a device WiFi Soft-AP network
+
+This how-to demonstrates the process of connecting to a device that presents a WiFi Soft-AP network.
+
+Some devices will present WiFi Soft-AP network when they first boot in an unpaired state. To talk to such a device, the
+computer running the Weave Device Manager Shell must be manually connected to the soft-AP network prior to connecting
+the Device Manager Shell.
+
+Most devices present an open WiFi network that requires no password to connect. Other devices will use a short fixed WiFi
+password that is printed on the device. Either way, the security of the interaction is ensured by the Weave protocol itself,
+not by the security of the WiFi network.
+
+The name of the device's Soft-AP network is unique to each device. Nest devices will typically use a name that begins with
+'NEST-' followed by 4 hex digits. On some devices the network name will be printed on the device. For development devices,
+the name of the Soft-AP network can often be found in the device's log output; e.g:
+
+ I (9126) weave[DL]: Configuring WiFi AP: SSID NEST-2F50, channel 1
+
+Devices in an unpaired state will automatically present a Soft-AP network. Usually this will time-out after a period of
+inactivity. On some devices, a button press can be used to get the device to re-enable its Soft-AP network. Other devices
+will require a power-cycle.
+
+Devices that have already been paired will generally not present a Soft-AP network on boot. Often, though, a button press
+can be used to get the device to re-enable its Soft-AP network. This is convenient in cases where the device's WiFi configuration
+must be changed; e.g. when the password for the home WiFi network changes.
+
+To connect to a device using its Wifi Soft-AP network:
+
+
+
+
+
+### Connecting using an existing WiFi or Thread network
+
+This how-to demonstrates the process of connecting to a device over a WiFi or Thread network.
+
+This process is typically used on devices that present a WiFi soft-AP when they first boot in an unpaired state. To talk
+to a device this way, the computer running the Weave Device Manager Shell must be manually connected to the device's soft-AP
+network prior to connecting the Device Manager Shell. Most devices present an open WiFi network that requires no password
+to connect. Other devices use a short fixed WiFi password that is printed on the device. Either way, the security of the
+interaction is ensured by the Weave protocol itself, not by the security of the WiFi network.
+
+This process can also be used to connect to a device over an existing WiFi or Thread network to which the device itself is
+already connected. This scenario arises when
+
+