There is a new SVG (Scalar Vector Graphics) node that is available for Node-Red Dashboards. This node allows for animated Node-Red graphics that can be viewed on a smart phone.
In this blog I wanted to document an example of integrating MQTT messaging to SVG animated graphics.
Getting Started
If you’re unfamiliar with SVG graphics that are some good tutorials. For my own reference I wrote some notes on SVG and Javascript integration.
The Web Dashboards should be at the latest version, you can do this in the “Manage Palette” option. The node-red-contrib-ui-svg node can be install from the “Manage Palette” option, or manually by:
cd ~/.node-red)
npm install node-red-contrib-ui-svg
There is some excellent documentation on this node.
The SVG Graphic node has a built-in SVG graphic editor or SVG code can be pasted directly into the “SVG Source” tab.
For my project I used industrial SVG examples from: https://www.opto22.com/support/resources-tools/demos/svg-image-library
The SVG editor is useful for identified and defining SVG items that are you’d like to animate.
For this project the solar panels (id=panels) and the output (id=watts) were to be dynamically updated from MQTT.
SVG items can be dynamically update by: 1) the “Input Bind” tab in the node’s definition or, 2) as an input message.
An example using the input message approach would be:
In this example the colour of the panels is set to green using an injector and function node.
MQTT with SVG Graphics
There are some good MQTT brokers, such as Mosquitto that can be used. Node-Red also has a MQTT broker node (MOSCA) that is easy to install.
The earlier test logic can be adapted to connect MQTT inputs:
For this example two MQTT tags were used: 1) watts, and 2) panel_status.
MQTT testing can be done with the MQTT client tools, that are installed by:
sudo apt-get install mosquitto mosquitto-clients -y
From a terminal MQTT tags can be published to a broker (-h servername) with a topic (-t thetopic) and a message (-m themessage) :
mosquitto_pub -h 192.168.0.111 -t watts -m "123" mosquitto_pub -h 192.168.0.111 -t panel_status -m "gold"
In Node-Red the watts text is updated by the function node code of:
// Pass the MQTT payload // and update the text, hardcode the units // msg.payload = { "command": "update_text", "selector": "#watts", "textContent": (msg.payload + " C") } return msg;
The panels color is changed by the function node code of:
// // Pass the MQTT payload // as a fill color attribute // msg.payload = { "command": "update_style", "selector": "#panels", "attributeName": "fill", "attributeValue": msg.payload } return msg;
Final Comments
Drawing SVG graphics from scratch is awkward, but there are some great Internet examples of pre-build SVG graphics. All it takes is a bit of time to find the graphic items that you need to animate.
In this blog I looked at making SVG files dynamic. It is also possible to put “hot links” on the SVG file to call URLs or to send messages back to Node-Red.