This repository contains a docker-compose and Arduino MKR NB 1500 based project for monitoring some real world sensor over an NB-IoT network.
The work is based on Gautier Mechling's home-monitoring-grafana repository, described in his blog post.
The present repository has been adapted for the IoThon 2019 hackathon, and is considerably different from Gautier Mechling's original one.
Your Arduino will be communicating over ethernet with you server
(denoteted as User VM in the figure), which runs some suitable software
to communicate with the Arduino, to store any needed data, and to provide
a user interface.
The default instructions below explain how to install and test the presented approach using two computers:
- A laptop (or similar) used to program the Arduino
- A server (or similar) running an MQTT server, InfluxDB database, and Grafana data visualisation.
Of course, you don't need to have a laptop, but may instead have a Raspberry Pi or similar, used to program the Arduino. However, we call that machine as a laptop in these instructions. If you want to, you can also run everything on a single machine.
NOTE that your server must have a public IP address for being able to receive MQTT data over the NB-IoT network from your Arduino. You should have this IP address handly, since you will need to know it below. If you are using an IoThon VM, you have received the IP address when you signed for your VM information.
Note that these instructions do not explain how to secure your MQTT or other communication with your server, e.g., with TLS. If you want to use TLS, see e.g. this Dev Side Story for running a TLS front end on your server side. For your Arduino, you may want to adapt from the instructions for securely connecting to Azure.
The first three subfolders are prepared for your server:
00-docker: Docker compose configuration for MQTT, InfluxDB and Grafana01-mosquitto: Docker container configuration files for Eclipse Mosquitto02-bridge: Python script that receives MQTT data and stores them to InfluxDB
The final subfolder is meant to be used in your laptop:
03-arduino_mqtt: Arduino sketch file for the MKR NB 1500 that publishes sensor data to MQTT
The networking between you server and your IoT device will be different depending on which kind of a SIM you are using. The instructions below assume that you have a "normal" SIM, from a commercial vendor. If you have an IoThon 2019 Aalto/COMNET SIM, please see the Networking instructions.
For cloning this repository, you need git. Most probably your Linux or Mac OS X has it already. For Windows (or if your Linux/whatever doesn't have git), you can follow the official instructions. If you haven't worked with git before, you may want to install GitHub Desktop instead.
Once you have git installed, clone this repository to a suitable
folder in both of your laptop and server. On the command line, simply give the command
git clone https://github.com/iothon/docker-compose-mqtt-influxdb-grafana.git
cd docker-compose-mqtt-influxdb-grafanaAlternatively, use your GitHub Desktop or equivalent.
Install
docker and
docker-compose, if you don't have
them installed in your server yet.
If you don't know if you have them installed or not, simply try to run the
commands docker and docker-compose on the command line.
For Windows or Mac OS X, the easiest way is to install
Docker for Desktop.
Alternatively, for Mac OS X you can use Homebrew,
with brew install docker docker-compose.
For Linux (Ubuntu or other Debian based), just use apt install:
sudo apt install docker.io
sudo apt install docker-composeFor anything else, follow the official instructions.
In Linux, if you don't want to use sudo in the front of every docker or
docker-compose command below, you need to assing yourself to the docker group.
You can follow the official instructions.
For the IoThon Ubuntu default VM, just give the following command:
sudo usermod -aG docker userLog out from your SSH session (or terminal) and log in again (or open new terminal).
Set the DATA_DIR environment variable to the path where will be stored local data, e.g. /tmp
if you are just testing. For your IoThon demonstration or other "production", choose
something else.
export DATA_DIR=/tmp(Note: For Mac OS X with Docker for Desktop, use export DATA_DIR=/private/tmp instead,
as docker has problems in understanding that /tmp is a symbolic link.)
Create data directories, with write access for the Mosquitto and Grafana containers:
mkdir -p ${DATA_DIR}/mosquitto/data ${DATA_DIR}/mosquitto/log ${DATA_DIR}/influxdb ${DATA_DIR}/grafana
sudo chown -R 1883:1883 ${DATA_DIR}/mosquitto
sudo chown -R 472:472 ${DATA_DIR}/grafanaRun docker compose:
cd 00-docker
docker-compose up -dThis starts four containers on your server: Mosquitto, InfluxDB, Grafana, and
the Mosquitto-to-InfluxDB bridge from the 02-bridge folder. You can check that
they are nicely up and running with
docker psYou should see all the four containers running continuously, and not restarting.
If any of them is restarting, you can use docker logs <container-name> to see its
logs, or docker exec -it <container-name> sh to run a shell in the container.
To shut down your containers, e.g. if you need to change the settings, run
docker-compose downYou can now test your Granafa at http://:3000. See below how to log in to and configure Grafana, and how to get the data flowing.
The Mosquitto username and passwords are mqttuser and mqttpassword.
To change these, see the Optional: Update mosquitto credentials section below.
Start InfluxDB using
influxCreate the database
CREATE DATABASE smartlabCreate a user and grant all permissions on database Create the database
CREATE USER mqtt WITH PASSWORD ‘mqtt’
GRANT ALL ON smartlab TO mqttIt is a good idea to log in your Grafana right away and change your
admin password. You can also add an InfluxDB data source already now,
or later. For having a meaningful Dashboard, you must first get some
data to your InfluxDB database.
- Access Grafana from
http://<your-server-ip>:3000 - Log in with user/password
admin/admin - Go to Configuration > Data Sources
- Add data source (InfluxDB)
- Name:
InfluxDB - URL:
http://influxdb:8086 - Database:
smartlab - User:
root - Password:
root - Save & Test
- Name:
- Create a Dashboard
- Add Graph Panel
- Edit Panel
- Data Source: InfluxDB
- FROM:
[default] [temperature] WHERE [location]=[bme280] - SELECT:
field(value) - FORMAT AS:
Time series - Draw mode: Lines
- Stacking & Null value: Null value [connected]
- Left Y
- Unit: Temperature > Celcius
- Panel title: Temperature (°C)
For programming your sensors, the easiest way is to use the Arduino IDE.
Sensors should send data to the mosquitto broker to the following MQTT topic:
{experiment}/{peripheralName}/{sensorname}.
For example: altes/mkrnb1500/temperature.
Arduino sketches are provided to in 03-arduino_mqtt.
Before flashing, you need to change the MQTT_SERVER constant to MQTT server IP address.
If you want to test your server setup without your sensors, e.g. to make sure that your server works while you are debugging your sensor, we recommend MQTT.FX. Install the latest version, click the gear wheel icon to add a Connection Profile for your Mosquitto server, and publish some data on a topic, as explained above.
For your Connection Profile, you can use the following data:
Profile Name whatever you like
Profile Type MQTT Broker
Broker Address your server ip
Broker Port 1883
Client ID whatever you like
User Name mqttuser # or as changed, see below
Password mqttpassword # or as changed, see below
To see that your server works, the easiest way is to inspect your MQTT bridge logs:
docker logs mqttbridgeTo enter some data, Connect, and Publish, e.g. at altes/testing/temperature.
To change default MQTT username and password, run the following, replacing <USER> and <PASSWORD>:
cd 01-mosquitto
echo -n "" > users
docker run --rm -v `pwd`/mosquitto.conf:/mosquitto/config/mosquitto.conf \
-v `pwd`/users:/mosquitto/config/users eclipse-mosquitto:1.5 \
mosquitto_passwd -b /mosquitto/config/users <USER> <PASSWORD>
cd ..Then, update the MQTT_USER and MQTT_PASSWORD constants in all the subdirectories, and launch docker compose again.
Once you have your cloud and sensor communicating, you should see the
(fake) temperature and/or RSSI data getting entered into your InfludDB
by the mqttbridge, as can be verified with docker logs mqttbridge.
For visualising it, see the Grafana instructions above.
Once you have your data being visualised, you are on your own to innovate.
For the cloud, you are more or less on our own. Good starting points for potentially problematic parts are the following:
- Docker networking tutorial video
- Docker networking with standalone containers
- Docker networking in Compose
The Docker compose script
creates by default a new Docker network, 00-docker_default, using the compose directory name.
You can inspect the network with docker network inspect 00-docker_default.