Microsoft Azure provides IoT Hub. It might sound great because it has support for MQTT. It is very important to mention that Azure IoT Hub has a different way how it operates than Mosquitto which means that architecture of your IoT solution must be different.
Let’s check differences.
- Mosquitto is 1883 which is not secure, it is possible to enable TLS
- IoT Hub 8883 secured by TLS/SSL (only)
Publishing and subscription of messages:
That’s a huge difference. In the case of Mosquitto you can easily build network of devices which can communicate together and management logic could be injected by Node-RED. In the case of IoT Hub whole interaction is managed by the cloud.
If you still want to play with IoT Hub and MQTT, I recommend article written by Satish Pagare who explains how to use mosquitto_sub and mosquitto_pub to interact with IoT Hub.
I’ve described how to send server load as a number to MQTT in the previous article. The number could be then translated via Node-RED to command for LampESP with RGB LED. The result is simple. LED indicates server load by displaying different colors.
The other option is to deliver color command directly from the server using Python.
Just install paho-mqtt:
pip install paho-mqtt
Here is small snippet of Python code (publish_server_load.py):
import paho.mqtt.publish as publish
color = 'red'
load = os.getloadavg()
if load < 0.7:
color = 'black'
elif load < 1.5:
color = 'blue'
elif load < 3:
color = 'green'
elif load < 7:
color = 'orange'
publish.single('/server/monitoring/command', color, hostname='iot.sinusgear.com')
ESP should listen to /server/monitoring. Code of LampESP 0.3 is available at GitHub.
Put this code into crontab
* * * * * /usr/local/bin/publish_server_load.py
If you’re using virtualenv the command should be:
* * * * * /opt/my-python-env3/bin/python /usr/local/bin/publish_server_load.py
In previous article I wrote how to subscribe to MQTT topics and display also timestamp with color. There was one MQTT topic which represented server load and it demonstrates that MQTT could be used for server monitoring.
Here is an example how to measure server load and publish it as MQTT topic. Open crontab:
Add following line:
* * * * * /usr/bin/mosquitto_pub -t /server/reactor/load -m `cat /proc/loadavg | sed -e 's/ .*//g'`
Cron will invoke the command every minute. Command will publish data to MQTT topic /server/reactor/load (note: reactor is the name of my server).
We can subscribe at a workstation to the topic and execute some commands. mosquitto_sub will keep running in the background and we can use xargs to invoke a new command once the new message arrives.
Following example shows how to display notification on Linux Mint – Cinnamon using
mosquitto_sub -t '/server/reactor/load' -h iot.sinusgear.com | xargs -d$'\n' -L1 sh -c 'notify-send "Server load: $0"'
The result at workstation:
The only downside is that notifications are spamming desktop every minute. It does not make sense to notify admin when server load is too low. We can add a little bit of logic and display notifications about load which exceeded a certain threshold.
mosquitto_sub -t '/server/reactor/load' -h iot.sinusgear.com | xargs -d$'\n' -L1 /bin/zsh -c 'if (( $(echo "$0 > 1.2" | bc -l ) )); then notify-send "Server load: $0"; fi'
Note: just be aware that message from MQTT is not sanitized. Run such command only in trusted environment or add type check of value received from MQTT.
The easiest way to subscribe to all messages on MQTT server like Mosquitto is following command:
mosquitto_sub -v -t '/#'
The only problem is that result is just plain text without timestamp which makes it harder to spot some messages.
The solution to the problem is quite simple. Just pipe output of subscription command to xargs which will inject date and to ccze which will add colors. Here is the command:
mosquitto_sub -v -t '/#' | xargs -d$'\n' -L1 sh -c 'date "+%d.%m.%Y %T $0"' | ccze -m ansi
I’d like to announce small updates to LampESP code.
The first feature is that you can send commands with color via MQTT to RGB LED. It’s easy, just send color name to topic /parent/host/command. Available colors are:
Or you can send just off to turn the led off.
The other small feature is a configuration for PIR sensor. I moved the configuration of PIR uptime minimal limit to configuration. You can set a number of seconds which represents how long it will take to turn off the light. The configuration could be set by URL:
Here you can see a configuration of ESP8266 with Photocell sensor, PIR and 3W LED powered by power bank.
One interesting thing is small breadboard ZY. Dimensions are just 5×5 and it’s very useful for small configurations like this one.