From b3d950a42dfa6927a9ae7d4f657e8551345a7293 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Sat, 28 Sep 2019 09:13:51 -0400 Subject: [PATCH] Add diagram Add diagram and update docs --- README.md | 2 ++ docs/How_It_Works.md | 2 ++ docs/images/BumperDiagram.drawio | 1 + docs/images/BumperDiagram.png | Bin 0 -> 18560 bytes 4 files changed, 5 insertions(+) create mode 100644 docs/images/BumperDiagram.drawio create mode 100644 docs/images/BumperDiagram.png diff --git a/README.md b/README.md index 5531f5b..7f45e8c 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Bumper is a standalone and self-hosted implementation of the central server used by Ecovacs vacuum robots. Bumper allows you to have full control of your Ecovacs robots, without the robots or app talking to the Ecovacs servers and transmitting data outside of your home. +![Bumper Diagram](./docs/images/BumperDiagram.png "Bumper Diagram") + **Note:** The current master branch is unstable, and in active development. | Master Branch | Status | diff --git a/docs/How_It_Works.md b/docs/How_It_Works.md index 978b46b..1421b51 100644 --- a/docs/How_It_Works.md +++ b/docs/How_It_Works.md @@ -1,5 +1,7 @@ # How does Bumper work? +![Bumper Diagram](./images/BumperDiagram.png "Bumper Diagram") + Bumper runs multiple services to re-create what the central EcoVacs servers provide the bots and users. At this point two different protocols have been seen, **XMPP** and **MQTT**. **Services** diff --git a/docs/images/BumperDiagram.drawio b/docs/images/BumperDiagram.drawio new file mode 100644 index 0000000..e715e02 --- /dev/null +++ b/docs/images/BumperDiagram.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/images/BumperDiagram.png b/docs/images/BumperDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..53b8ad7c4a4e9da27af0a18bb86ff74ead62dce5 GIT binary patch literal 18560 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 literal 0 HcmV?d00001