New Youtube vid – see below for code!
The Youtube vid covers general concepts, and below I’ve listed the basic steps to getting this working, plus posted some code samples you can use.
- Buy your Shelly EM with one or two current clamp sensors. Shelly make a 50A and a 120A sensor for the same price. The difference between these should be very obvious, in which case why would you buy the 50A version? I don’t know. The only other difference is the size, the 120A is a bit bigger. I bought both, to compare / contrast and for flexibility.
- Set up Node-RED, MQTT server, InfluxDB, and Grafana. This is a big topic I won’t cover here. Technically you could use a different combination of software if you prefer.
- Set up the Shelly:
- wire it as per the enclosed manual / online doc – hire an electrician if you are unsure – set up on your wifi using the Shelly app, give it a static IP if you like, but this is not needed
- you must turn on MQTT, do this either from within Shelly app or from the device’s own web interface. Do this according to your own understanding, i.e. doing this prevents it from operating with Shelly Cloud. This is my preference anyway. You can always change it back.
- Enter your MQTT server address and use Custom MQTT Prefix. Set this to anything you like, e.g. “house_power”. This is needed in Node-RED later.
- In this case I’m using Node-RED to combine the multiple messages from the Shelly EM into a single message, then populate the database. If Shelly provided its sensor data output in a single message, this wouldn’t be required, but it’s not a problem since we can do this ourselves.
- import the flow (see below)
- change the purple MQTT path to reflect your MQTT prefix you set above
- Each current sensor in the EM (there are 2) outputs 7 messages. Take a quick look at the Shelly EM MQTT reference here. In my case I have both current clamp sensors connected and want to monitor both channels, so we want to combine 14 messages into one, which is done using the Node-RED flow posted below.
- If you only have one current clamp sensor, then you’ll need to change the JOIN node to forward its message after receiving only 7 incoming messages.
- edit the Influx Out node, and change to the relevant measurement name you’d like (I used “hallway_power”)
- Check messages are coming in to InfluxDB. Log on to your Influx server over SSH or whatever you like, then issue these commands:
- use database nodered (unless you changed the DB name in the flow)
- run a query to show data: select * from hallway_power
- Success? Move on to Grafana
- Import the JSON dashboard from below. You will need to go through each panel and change the query. If you have set up Grafana from scratch then you’ll need to ensure InfluxDB has been set up within Grafana, it’s quite easy to do.
Are you using the Shelly 3EM? It’s probably very easy for you to adapt to that, just check the Shelly API docs linked above. Hopefully you find the Youtube video is general / conceptual enough to help here.
The above was a bit of a whistle-stop tour, if you are starting from scratch then don’t expect it to be quick! And if you already run NR, Grafana, Influx, then I probably over-explained it to you!
Feel free to copy/paste the code for various parts of this project.
(Sorry it’s not formatted very well for copy/pasting, if anyone can show me a decent WP plugin that provides syntax highlighting, expandable / collapsible code OR a scrollable fixed size window, AND a quick code-copy button then I’m all ears. p.s. there isn’t one.)
Here’s the JSON for the Grafana dashboard
{ "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "gnetId": null, "graphTooltip": 0, "id": 9, "links": [], "panels": [ { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": { "align": null }, "mappings": [], "max": 4000, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "super-light-yellow", "value": 1000 }, { "color": "light-orange", "value": 1500 }, { "color": "dark-orange", "value": 2000 }, { "color": "light-red", "value": 3000 }, { "color": "dark-red", "value": 3500 } ] }, "unit": "watt" }, "overrides": [] }, "gridPos": { "h": 6, "w": 4, "x": 0, "y": 0 }, "id": 9, "options": { "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true }, "pluginVersion": "7.1.5", "targets": [ { "alias": "Pergola", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_power" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Pergola Power NOW", "type": "gauge" }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watt" }, "overrides": [] }, "fill": 4, "fillGradient": 8, "gridPos": { "h": 5, "w": 8, "x": 4, "y": 0 }, "hiddenSeries": false, "id": 3, "legend": { "alignAsTable": false, "avg": false, "current": false, "max": false, "min": false, "show": false, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Pergola", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "hide": false, "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_power" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Pergola Instantaneous Power (W)", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "decimals": null, "format": "watt", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": { "align": null }, "mappings": [], "max": 4000, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "super-light-yellow", "value": 1000 }, { "color": "light-orange", "value": 1500 }, { "color": "dark-orange", "value": 2000 }, { "color": "light-red", "value": 3000 }, { "color": "dark-red", "value": 3500 } ] }, "unit": "watt" }, "overrides": [] }, "gridPos": { "h": 6, "w": 4, "x": 12, "y": 0 }, "id": 19, "options": { "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true }, "pluginVersion": "7.1.5", "targets": [ { "alias": "Pergola", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_power" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Site Power NOW", "type": "gauge" }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] } }, "overrides": [] }, "fill": 4, "fillGradient": 8, "gridPos": { "h": 5, "w": 8, "x": 16, "y": 0 }, "hiddenSeries": false, "id": 22, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": false, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Pergola", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "hide": false, "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_power" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Site Instantaneous Power (W)", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "decimals": null, "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": { "Pergola Power (aggregated)": "semi-dark-blue", "hallway_power.derivative": "light-purple", "hallway_power.difference": "semi-dark-blue" }, "bars": true, "dashLength": 10, "dashes": false, "datasource": null, "fieldConfig": { "defaults": { "custom": {}, "unit": "watth" }, "overrides": [] }, "fill": 2, "fillGradient": 7, "gridPos": { "h": 7, "w": 8, "x": 4, "y": 5 }, "hiddenSeries": false, "id": 15, "legend": { "alignAsTable": true, "avg": true, "current": true, "max": false, "min": false, "rightSide": false, "show": true, "total": true, "values": true }, "lines": false, "linewidth": 1, "nullPointMode": "connected", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Pergola Power (aggregated)", "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Energy By Hour", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "transformations": [], "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "decimals": null, "format": "watth", "label": "", "logBase": 1, "max": null, "min": null, "show": true }, { "decimals": 2, "format": "none", "label": "Cost", "logBase": 1, "max": null, "min": null, "show": false } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": { "Site Power (aggregated)": "semi-dark-blue", "hallway_power.derivative": "light-purple", "hallway_power.difference": "semi-dark-blue" }, "bars": true, "dashLength": 10, "dashes": false, "datasource": null, "fieldConfig": { "defaults": { "custom": {}, "unit": "watth" }, "overrides": [] }, "fill": 2, "fillGradient": 7, "gridPos": { "h": 7, "w": 8, "x": 16, "y": 5 }, "hiddenSeries": false, "id": 20, "legend": { "alignAsTable": true, "avg": true, "current": true, "max": false, "min": false, "rightSide": false, "show": true, "total": true, "values": true }, "lines": false, "linewidth": 1, "nullPointMode": "connected", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Site Power (aggregated)", "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Energy By Hour", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "watth", "label": "", "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ], "yaxis": { "align": false, "alignLevel": null } }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "displayName": "Total For Period", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watth" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 0, "y": 6 }, "id": 16, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "sum" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Pergola", "type": "stat" }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "displayName": "Total For Period", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watth" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 12, "y": 6 }, "id": 21, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "sum" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Site", "type": "stat" }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "decimals": 2, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "semi-dark-orange", "value": null } ] }, "unit": "currencyGBP" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 0, "y": 10 }, "id": 26, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "sum" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Pergola", "transformations": [ { "id": "calculateField", "options": { "alias": "Cost", "binary": { "left": "hallway_power.difference", "operator": "*", "reducer": "sum", "right": "0.00014" }, "mode": "binary", "reduce": { "reducer": "sum" }, "replaceFields": true } } ], "type": "stat" }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "decimals": 2, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "semi-dark-orange", "value": null } ] }, "unit": "currencyGBP" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 12, "y": 10 }, "id": 27, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "sum" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Site", "transformations": [ { "id": "calculateField", "options": { "alias": "Cost", "binary": { "left": "hallway_power.difference", "operator": "*", "reducer": "sum", "right": "0.00014" }, "mode": "binary", "reduce": { "reducer": "sum" }, "replaceFields": true } } ], "type": "stat" }, { "aliasColors": { "hallway_power.derivative": "light-purple", "hallway_power.difference": "semi-dark-purple" }, "bars": true, "dashLength": 10, "dashes": false, "datasource": null, "fieldConfig": { "defaults": { "custom": {} }, "overrides": [] }, "fill": 1, "fillGradient": 0, "gridPos": { "h": 6, "w": 8, "x": 4, "y": 12 }, "hiddenSeries": false, "id": 14, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": false, "total": false, "values": false }, "lines": false, "linewidth": 1, "nullPointMode": "null", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "groupBy": [ { "params": [ "24h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Energy By Day", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "decimals": null, "format": "currencyGBP", "label": null, "logBase": 1, "max": "20", "min": "0", "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": { "hallway_power.derivative": "light-purple", "hallway_power.difference": "semi-dark-purple" }, "bars": true, "dashLength": 10, "dashes": false, "datasource": null, "fieldConfig": { "defaults": { "custom": {} }, "overrides": [] }, "fill": 1, "fillGradient": 0, "gridPos": { "h": 6, "w": 8, "x": 16, "y": 12 }, "hiddenSeries": false, "id": 25, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": false, "total": false, "values": false }, "lines": false, "linewidth": 1, "nullPointMode": "null", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "groupBy": [ { "params": [ "24h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Energy By Day", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "displayName": "Hourly Average", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watth" }, "overrides": [] }, "gridPos": { "h": 4, "w": 2, "x": 0, "y": 14 }, "id": 17, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "mean" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Pergola", "type": "stat" }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "displayName": "Daily Average", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watth" }, "overrides": [] }, "gridPos": { "h": 4, "w": 2, "x": 2, "y": 14 }, "id": 18, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "mean" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "24h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Pergola", "type": "stat" }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "displayName": "Hourly Average", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watth" }, "overrides": [] }, "gridPos": { "h": 4, "w": 2, "x": 12, "y": 14 }, "id": 23, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "mean" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "1h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Site", "type": "stat" }, { "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "displayName": "Daily Average", "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watth" }, "overrides": [] }, "gridPos": { "h": 4, "w": 2, "x": 14, "y": 14 }, "id": 24, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "mean" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "groupBy": [ { "params": [ "24h" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "1_total" ], "type": "field" }, { "params": [], "type": "last" }, { "params": [], "type": "difference" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Site", "type": "stat" }, { "datasource": null, "fieldConfig": { "defaults": { "custom": { "align": null }, "decimals": 2, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 250 } ] }, "unit": "volt" }, "overrides": [] }, "gridPos": { "h": 6, "w": 4, "x": 0, "y": 18 }, "id": 6, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", "orientation": "vertical", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "textMode": "auto" }, "pluginVersion": "7.1.5", "targets": [ { "alias": "", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_voltage" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [] } ], "timeFrom": null, "timeShift": null, "title": "Pergola", "type": "stat" }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {}, "unit": "volt" }, "overrides": [] }, "fill": 1, "fillGradient": 0, "gridPos": { "h": 6, "w": 20, "x": 4, "y": 18 }, "hiddenSeries": false, "id": 2, "legend": { "alignAsTable": true, "avg": true, "current": true, "hideEmpty": false, "hideZero": false, "max": true, "min": true, "rightSide": true, "show": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "nullPointMode": "null", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Pergola", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "none" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "0_voltage" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] }, { "alias": "Site", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "none" ], "type": "fill" } ], "measurement": "hallway_power", "orderByTime": "ASC", "policy": "default", "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "1_voltage" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Voltage (V)", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "volt", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } } ], "refresh": "1m", "schemaVersion": 26, "style": "dark", "tags": [], "templating": { "list": [] }, "time": { "from": "now-12h", "to": "now" }, "timepicker": {}, "timezone": "", "title": "House Power", "uid": "Ewfd2pxMk", "version": 23 }
Here’s the Node-RED flow, heavily commented
[{"id":"7bb7c12b.e48bf","type":"influxdb out","z":"3d86e78e.17ff28","influxdb":"9d9ad3f4.49ce7","name":"","measurement":"hallway_power","precision":"","retentionPolicy":"","x":1060,"y":1260,"wires":[]},{"id":"9b7b9a79.fed2a8","type":"mqtt in","z":"3d86e78e.17ff28","name":"","topic":"shellies/my_shelly_em/#","qos":"2","datatype":"auto","broker":"b144405e.a9f63","x":250,"y":1260,"wires":[["3aca629d.d5506e"]]},{"id":"f54b9a2b.1a16d8","type":"comment","z":"3d86e78e.17ff28","name":"Shelly EM (see note)","info":"Shelly EM docs for MQTT here:\n\nhttps://shelly-api-docs.shelly.cloud/#shelly-em-overview\n\nThis flow assumes we have two current clamps connected. If we only have one, we'd need to just change the JOIN node to send the message after receiving 7 parts, not 14 parts.\n\n(The Shelly EM has 7 different electricity monitoring metrics per current clamp sensor)\n","x":210,"y":1220,"wires":[]},{"id":"8109cfde.f2e78","type":"join","z":"3d86e78e.17ff28","name":"Join messages","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"key","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"14","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":640,"y":1260,"wires":[["a179a235.d32b9"]]},{"id":"3aca629d.d5506e","type":"function","z":"3d86e78e.17ff28","name":"Prep message","func":"// This function preps msg.key, and converts the payload to a number.\n// example incoming MQTT path: shellies/my_shelly_em/emeter/0/energy\n\n// The below IF statement basically filters out the relay stuff which\n// would come in on a shorter path (see shelly docs)\nif (msg.topic.split(\"/\")[4] !== undefined) {\n // combine the current clamp ID with the measurement name\n // prepare msg.key for the JOIN node to follow \n msg.key = msg.topic.split(\"/\")[3] + \"_\" + msg.topic.split(\"/\")[4] \n // convert measurement to number\n msg.payload = Number(msg.payload)\n return msg;\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":460,"y":1260,"wires":[["8109cfde.f2e78"]]},{"id":"a179a235.d32b9","type":"change","z":"3d86e78e.17ff28","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"my_shelly_em","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":810,"y":1260,"wires":[["7bb7c12b.e48bf","d3b7f090.3543a"]]},{"id":"d3b7f090.3543a","type":"debug","z":"3d86e78e.17ff28","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":910,"y":1320,"wires":[]},{"id":"9d9ad3f4.49ce7","type":"influxdb","z":"","hostname":"127.0.0.1","port":"8086","protocol":"http","database":"nodered","name":"","usetls":false,"tls":""},{"id":"b144405e.a9f63","type":"mqtt-broker","z":"","name":"Mayfield MQTT","broker":"10.1.1.34","port":"1883","clientid":"nodered","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
Leave a Reply