Web of Things gateway.
If you have a Rasberry Pi, the easiest way to use the gateway is to download and flash a pre-built software image from Mozilla to an SD card. Otherwise you can build it from source yourself (see below).
(If you're just installing on your PC, you can skip this step).
If you're installing on a Raspberry Pi then you may need to set up the OS on the Raspberry Pi first. See here for instructions.
Under Ubuntu/Debian Linux:
$ sudo apt-get update Under Fedora Linux:
$ sudo dnf --refresh upgrade Under Ubuntu/Debian Linux:
$ sudo apt-get install pkg-config Under Fedora Linux:
$ sudo dnf install pkgconfig Under macOS:
Under Ubuntu/Debian Linux:
$ sudo apt-get install curl Under Fedora Linux:
$ sudo dnf install curl nvm allows you to easily install different versions of node. To install nvm:
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash Reinitialize your terminal session.
$ . ~/.bashrc (If you already installed node via nvm you can skip this step)
Follow the directions from NodeJS to install on your platform.
The following is required in order to let node and python3 use the Bluetooth adapter.
$ sudo setcap cap_net_raw+eip $(eval readlink -f `which node`) $ sudo setcap cap_net_raw+eip $(eval readlink -f `which python3`) The following are required in order to install the Python modules that support Bluetooth
Under Ubuntu/Debian Linux:
$ sudo apt-get install libboost-python-dev libboost-thread-dev libbluetooth-dev libglib2.0-dev Under Fedora Linux:
$ sudo dnf install boost-python-devel boost-devel bluez-libs-devel glib2-devel Under Ubuntu/Debian Linux:
$ sudo apt-get install libusb-1.0-0-dev libudev-dev Under Fedora Linux:
$ sudo dnf install libudev-devel libusb1-devel Under Ubuntu/Debian Linux:
$ sudo apt-get install autoconf Under Fedora Linux:
$ sudo dnf install autoconf Under macOS:
$ brew install autoconf Under x86-64 or x86 Ubuntu/Debian Linux:
$ sudo apt-get install libpng16-16 Under ARM Ubuntu/Debian Linux:
$ sudo apt-get install libpng-dev Under Fedora Linux:
$ sudo dnf install libpng-devel You'll need git to checkout the repositories.
Under Ubuntu/Debian Linux:
$ sudo apt-get install git Under Fedora Linux:
$ sudo dnf install git Under Ubuntu/Debian Linux:
$ sudo apt-get install build-essential Under Fedora Linux:
$ sudo dnf group install "C Development Tools and Libraries" $ cd $ git clone https://github.com/OpenZWave/open-zwave.git $ cd open-zwave $ CFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0 make && sudo CFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0 make install $ sudo ldconfig Note: You may need to manually add /usr/local/lib to your LD_LIBRARY_PATH enviroment variable by adding the following to your ~/.profile file:
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
You can run this on the command line as well so it has immediate effect. After running it, you should run sudo ldconfig again to make sure the configuration change goes through.
Under Ubuntu/Debian Linux:
$ sudo apt-get install libnanomsg4 libnanomsg-dev - Follow the directions from nanomsg to install in the same bitness as your Python 3.X.
- If you want to build for 64-bit, you need to execute cmake with
-DCMAKE_GENERATOR_PLATFORM=x64. - Add
C:\path\to\nanomsg\bintoPATH.
The Gateway depends on ursa, which requires OpenSSL.
Install OpenSSL =< 1.0.2 (normal, not light) in the same bitness as your Node.js.
PageKite works with Python 2.7.
Install Python 2.7 from here.
Enable "register extensions" on installing package, or associate file extension .py with python.
This is required in order to use Python 3 add-ons, e.g. tplink-adapter.
- Install Python 3.4+ from here.
- Enable "Install launcher for all users" and "Add Python 3.X to PATH" on installing.
- Enable
python3command using the following.
mklink "C:\path\to\python3\python3.exe" "C:\path\to\python3\python.exe" - Install nnpy
git clone https://github.com/nanomsg/nnpy.git cd nnpy Add a file: site.cfg
[DEFAULT] include_dirs = C:\path\to\nanomsg\include\nanomsg library_dirs = C:\path\to\nanomsg\lib host_library = C:\path\to\nanomsg\bin\nanomsg.dll This is required in order to use Python 3 add-ons, e.g. tplink-adapter.
Execute the following command as sudo (Linux) or administrator (Windows).
python2 -m pip install git+https://github.com/mozilla-iot/gateway-addon-python#egg=gateway_addon python3 -m pip install git+https://github.com/mozilla-iot/gateway-addon-python#egg=gateway_addon Note: 2018-04-12: pip3 has an issue with some languages.
-
Clone the GitHub repository (or fork it first):
$ cd $ git clone https://github.com/mozilla-iot/gateway.git -
Change into the gateway directory:
$ cd gateway -
If you have chosen to install nvm above, install and use an LTS version of node and then set the default version. The
.nvmrcfile will be used by nvm to determine which version of node to install.$ nvm install $ nvm use $ nvm alias default $(node -v) -
Verify that node and npm have been installed:
$ node --version v8.12.0 $ npm --version 6.4.1Note: these versions might differ from the LTS version installed locally.
-
Install dependencies:
- NOTE:
yarnis preferred butnpm installwill also work. To temporarily useyarnrunnpx yarnor for a permanent installation follow the directions for your OS.
$ yarn - NOTE:
-
Add Firewall exceptions (Fedora Linux Only)
$ sudo firewall-cmd --zone=public --add-port=4443/tcp --permanent $ sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent $ sudo firewall-cmd --zone=public --add-port=5353/udp --permanent -
Set up domain:
- If you plan to use Mozilla's provided tunneling service to set up a
*.mozilla-iot.orgdomain:-
Start the web server:
$ npm start -
Load
http://localhost:8080in your web browser (or use the server's IP address if loading remotely). Then follow the instructions on the web page to set up domain and register. Once this is done you can loadhttps://localhost:4443in your web browser (or use the server's IP address if loading remotely).
-
- If you plan to use your own SSL certificate:
-
The HTTPS server looks for
privatekey.pemandcertificate.pemin thesslsub-directory of theuserProfiledirectory specified in your config. You can use a real certificate or generate a self-signed one by following the steps below.$ MOZIOT_HOME="${MOZIOT_HOME:=${HOME}/.mozilla-iot}" $ SSL_DIR="${MOZIOT_HOME}/ssl" $ [ ! -d "${SSL_DIR}" ] && mkdir -p "${SSL_DIR}" $ openssl genrsa -out "${SSL_DIR}/privatekey.pem" 2048 $ openssl req -new -sha256 -key "${SSL_DIR}/privatekey.pem" -out "${SSL_DIR}/csr.pem" $ openssl x509 -req -in "${SSL_DIR}/csr.pem" -signkey "${SSL_DIR}/privatekey.pem" -out "${SSL_DIR}/certificate.pem" -
Start the web server:
$ npm start -
Load
https://localhost:4443in your web browser (or use the server's IP address if loading remotely). Since you're using a self-signed certificate, you'll need to add a security exception in the browser.
-
- If you plan to use Mozilla's provided tunneling service to set up a
The Gateway only supports the following browsers, due to its use of the Fetch API and WebSocket API:
- Firefox 52+
- Chrome 43+
- Edge 14+
- Safari 10.1+
- Opera 29+
If you are using VS Code, simply use the "launch" target. It will build the gateway in debugger mode.
If you are not using VS Code, run npm run debug and it will build the gateway and launch it with --inspect.
These steps are required on Debian (where python points to python 2.7)
apt install python-pip apt install python3-pip pip3 install git+https://github.com/mycroftai/adapt#egg=adapt-parser apt install firefox apt install openjdk-8-jre To run the linter and all tests:
$ npm test To run a single test:
$ jest src/test/{test-name}.js (assumes you have the jest command on your PATH, otherwise use ./node_modules/jest/bin/jest.js)
To compare UI with parent branch:
$ npm run screenshots $ npm test (if you have the screenshots in the folder ./browser-test-screenshots, npm test should compare UI with screenshots stored)
config/- Gateway configuration filesimage/- Tools for building the Raspberry Pi imagesrc/addons-test/- Add-ons used strictly for testingcontrollers/- App URL routes and their logicmodels/- Data model and business logicplugin/- Utility classes and methods used by add-onsrules-engine/- The rules enginetest/- Integration testsviews/- HTML viewswifi-setup/- Initial WiFi setup code for Raspberry Piaddon-loader.js- Script used for starting up Node-based add-onsaddon-manager.js- Manages add-ons (e.g. ZigBee, Z-Wave)app.js- The main back endapp-instance.js- Application wrapper for integration testscommand-utils.js- Utilities used by commands parserconstants.js- System-wide constantsdb.js- Manages the SQLite3 databasedeferred.js- Wraps up a promise in a slightly more convenient manner for passing around, or savingec-crypto.js- Elliptic curve helpers for the ES256 curvejwt-middleware.js- Express middleware for determining authentication statuslog-timestamps.js- Utilities for adding timestamps to console logging functionsmdns-server.js- mDNS serveroauth-types.js- OAuth typespasswords.js- Password utilitiesplatform.js- Platform-specific utilitiespush-service.js- Push notification servicerouter.js- Routes app URLs to controllersssltunnel.js- Utilities to determine state of tunnel and manage the PageKite processuser-profile.js- Manages persistent user datautils.js- Various utility functions
static/- Static CSS, JavaScript & image resources for web app front endtools/- Helpful utilities (not part of the build)package.json- npm module manifest