{ "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "target": { "limit": 100, "matchAny": false, "tags": [], "type": "dashboard" }, "type": "dashboard" } ] }, "description": "Hoymiles solar inverter visualisation", "editable": true, "fiscalYearStartMonth": 0, "gnetId": null, "graphTooltip": 0, "id": 20, "iteration": 1651604945245, "links": [], "liveNow": true, "panels": [ { "datasource": null, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "kwatth" }, "overrides": [] }, "gridPos": { "h": 4, "w": 24, "x": 0, "y": 0 }, "id": 30, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "text": {}, "textMode": "auto" }, "pluginVersion": "8.2.2", "repeat": "location", "repeatDirection": "h", "targets": [ { "query": "// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: \"${rp}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => (\n r[\"_measurement\"] == \"mqtt_consumer\" and exists r.string and\n r[\"location\"] =~ /${location:regex}/ and\n r[\"type\"] == \"total\" and r[\"_field\"] == \"value\"))\n |> difference(columns: [\"_value\"])\n |> group(columns: [\"location\"])\n |> sum()\n |> yield(name: \"value\")", "refId": "A" } ], "title": "Inverter $location Energy", "type": "stat" }, { "collapsed": false, "datasource": null, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 4 }, "id": 20, "panels": [], "title": "Inverter Stats", "type": "row" }, { "datasource": null, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watt" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 5 }, "id": 22, "interval": null, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "query": "// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: \"${rp}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => (\n r[\"_measurement\"] == \"mqtt_consumer\" and exists r.phase and\n r[\"location\"] =~ /${location:regex}/ and\n r[\"type\"] == \"power\" and r[\"_field\"] == \"value\"))\n |> group(columns: [\"location\",\"phase\"])\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n |> yield(name: \"mean\")", "refId": "A" } ], "title": "AC Power", "type": "timeseries" }, { "datasource": null, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "volt" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 5 }, "id": 25, "interval": null, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "query": "// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: \"${rp}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => (\n r[\"_measurement\"] == \"mqtt_consumer\" and exists r.phase and\n r[\"location\"] =~ /${location:regex}/ and\n r[\"type\"] == \"voltage\" and r[\"_field\"] == \"value\"))\n |> group(columns: [\"location\",\"phase\"])\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n |> yield(name: \"mean\")", "refId": "A" } ], "title": "AC Voltage", "type": "timeseries" }, { "datasource": null, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "celsius" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 12 }, "id": 18, "interval": null, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "query": "// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: \"${rp}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => (\n r[\"_measurement\"] == \"mqtt_consumer\" and\n r[\"location\"] =~ /${location:regex}/ and\n r[\"type\"] == \"temperature\" and r[\"_field\"] == \"value\"))\n |> group(columns: [\"location\"])\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n |> yield(name: \"mean\")", "refId": "A" } ], "title": "Temperature", "type": "timeseries" }, { "datasource": null, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "decimals": 2, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "rothz" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 12 }, "id": 23, "interval": null, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "query": "// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: \"${rp}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => (\n r[\"_measurement\"] == \"mqtt_consumer\" and\n r[\"location\"] =~ /${location:regex}/ and\n r[\"type\"] == \"frequency\" and r[\"_field\"] == \"value\"))\n |> group(columns: [\"location\"])\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n |> yield(name: \"mean\")", "refId": "A" } ], "title": "Netzfrequenz", "type": "timeseries" }, { "datasource": null, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "watt" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 19 }, "id": 21, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "query": "// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: \"${rp}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => (\n r[\"_measurement\"] == \"mqtt_consumer\" and exists r.string and\n r[\"location\"] =~ /${location:regex}/ and\n r[\"type\"] == \"power\" and r[\"_field\"] == \"value\"))\n |> group(columns: [\"location\",\"string\"])\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n |> yield(name: \"mean\")", "refId": "A" } ], "title": "String Power", "type": "timeseries" }, { "datasource": null, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "volt" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 19 }, "id": 24, "interval": null, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "query": "// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: \"${rp}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => (\n r[\"_measurement\"] == \"mqtt_consumer\" and exists r.string and\n r[\"location\"] =~ /${location:regex}/ and\n r[\"type\"] == \"voltage\" and r[\"_field\"] == \"value\"))\n |> group(columns: [\"location\",\"string\"])\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n |> yield(name: \"mean\")", "refId": "A" } ], "title": "String Voltages", "type": "timeseries" } ], "refresh": "30s", "schemaVersion": 31, "style": "dark", "tags": [ "solar" ], "templating": { "list": [ { "allValue": null, "current": { "selected": false, "text": "telegraf/autogen", "value": "telegraf/autogen" }, "datasource": null, "definition": "//Bucketfilter to filter only buckets beginning with name telegraf..\nbucketfilter = /telegraf.*/\n\nbuckets()\n |> filter(fn: (r) => r.name =~ bucketfilter)\n //convert retentionperiod from nanosecond to days\n |> map(fn: (r) => ({r with \n retentionPeriodinDays: r.retentionPeriod / 86400000000000}) \n )\n //replace retentionpolicy infinity with a high number in NS\n |> map(fn: (r) => ({r with\n retentionPeriod: if r.retentionPeriod == 0 then 999999999999999999\n else r.retentionPeriod})\n )\n //calculate the duration from \"to\" and \"from\" timespan and convert it to nanosecond\n |> map(fn: (r) => ({r with \n DashboardDurationinNS: (${__to} - ${__from}) * 1000000})\n )\n |> filter(fn: (r) => \n r.DashboardDurationinNS <= r.retentionPeriod and\n r.retentionPeriod >= uint(v: now()) - uint(v: ${__from} * 1000000)\n )\n |> sort(columns: [\"retentionPeriod\"], desc: false)\n |> limit(n: 1)\n |> keep(columns: [\"name\"]) //remove all fields except for \"name\"", "description": null, "error": null, "hide": 2, "includeAll": false, "label": null, "multi": false, "name": "rp", "options": [], "query": "//Bucketfilter to filter only buckets beginning with name telegraf..\nbucketfilter = /telegraf.*/\n\nbuckets()\n |> filter(fn: (r) => r.name =~ bucketfilter)\n //convert retentionperiod from nanosecond to days\n |> map(fn: (r) => ({r with \n retentionPeriodinDays: r.retentionPeriod / 86400000000000}) \n )\n //replace retentionpolicy infinity with a high number in NS\n |> map(fn: (r) => ({r with\n retentionPeriod: if r.retentionPeriod == 0 then 999999999999999999\n else r.retentionPeriod})\n )\n //calculate the duration from \"to\" and \"from\" timespan and convert it to nanosecond\n |> map(fn: (r) => ({r with \n DashboardDurationinNS: (${__to} - ${__from}) * 1000000})\n )\n |> filter(fn: (r) => \n r.DashboardDurationinNS <= r.retentionPeriod and\n r.retentionPeriod >= uint(v: now()) - uint(v: ${__from} * 1000000)\n )\n |> sort(columns: [\"retentionPeriod\"], desc: false)\n |> limit(n: 1)\n |> keep(columns: [\"name\"]) //remove all fields except for \"name\"", "refresh": 2, "regex": "", "skipUrlSync": false, "sort": 0, "type": "query" }, { "allValue": null, "current": { "selected": true, "text": [ "114172220143" ], "value": [ "114172220143" ] }, "datasource": null, "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n bucket: \"${rp}\",\n tag: \"location\",\n predicate: (r) => exists r.string,\n start: -1d\n)", "description": null, "error": null, "hide": 0, "includeAll": true, "label": "Inverter", "multi": true, "name": "location", "options": [], "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n bucket: \"${rp}\",\n tag: \"location\",\n predicate: (r) => exists r.string,\n start: -1d\n)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "type": "query" } ] }, "time": { "from": "now-12h", "to": "now" }, "timepicker": {}, "timezone": "", "title": "Hoymiles", "uid": "e654tH_7k", "version": 3 }