{ "annotations": { "list": [ { "builtIn": 1, "datasource": { "type": "grafana", "uid": "-- Grafana --" }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "target": { "limit": 100, "matchAny": true, "tags": [ "server" ], "type": "dashboard" }, "type": "dashboard" }, { "datasource": { "type": "datasource", "uid": "grafana" }, "enable": true, "iconColor": "light-yellow", "name": "Annotations", "target": { "limit": 100, "matchAny": true, "tags": [ "server", "MQTT" ], "type": "tags" } } ] }, "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, "id": 11, "links": [], "panels": [ { "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "description": "Total number of observed nodes in the mesh", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "nodes" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 0, "y": 0 }, "id": 15, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "editorMode": "builder", "format": "table", "rawSql": "SELECT COUNT(node_id) FROM node_details WHERE node_id <> '0' LIMIT 50 ", "refId": "A", "sql": { "columns": [ { "name": "COUNT", "parameters": [ { "name": "node_id", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [], "limit": 50, "whereJsonTree": { "children1": [ { "id": "8abb8aaa-4567-489a-bcde-f19082bbe79a", "properties": { "field": "node_id", "fieldSrc": "field", "operator": "not_equal", "value": [ "0" ], "valueError": [ null ], "valueSrc": [ "value" ], "valueType": [ "text" ] }, "type": "rule" } ], "id": "8a9ab9aa-0123-4456-b89a-b190828e3675", "type": "group" }, "whereString": "node_id <> '0'" }, "table": "node_details" } ], "title": "Total nodes in mesh", "type": "stat" }, { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "description": "Nodes that sent any packet in the last 30 minutes", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "nodes" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 4, "y": 0 }, "id": 21, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "editorMode": "code", "format": "table", "rawQuery": true, "rawSql": "SELECT COUNT(*) \nFROM node_details \nWHERE updated_at >= NOW() - INTERVAL '30 minutes';", "refId": "A", "sql": { "columns": [ { "parameters": [ { "name": "*", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [ { "property": { "type": "string" }, "type": "groupBy" } ], "limit": 50, "whereJsonTree": { "children1": [ { "id": "ab889ba9-4567-489a-bcde-f192911a31e3", "properties": { "field": "updated_at", "fieldSrc": "field", "operator": "greater", "value": [ "Invalid date" ], "valueError": [ null ], "valueSrc": [ "value" ], "valueType": [ "datetime" ] }, "type": "rule" } ], "id": "a8b9a88a-0123-4456-b89a-b19291157437", "type": "group" }, "whereString": "updated_at > NULL" }, "table": "node_details" } ], "title": "Active nodes in the last 30 minutes", "type": "stat" }, { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "description": "How many nodes are Unknonw and how many are Known.\n\nThe unknown are ones that are either NULL in their long name or \"Unknown\" in their value", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "fieldMinMax": false, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "nodes" }, "overrides": [ { "matcher": { "id": "byName", "options": "Unnamed" }, "properties": [ { "id": "color", "value": { "fixedColor": "red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 4, "w": 4, "x": 8, "y": 0 }, "id": 24, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "center", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "editorMode": "code", "format": "table", "rawQuery": true, "rawSql": "SELECT\n COUNT(CASE WHEN long_name IS NULL OR long_name = 'Unknown' AND node_id != '0' THEN 1 END) AS \"Unnamed\",\n COUNT(CASE WHEN long_name IS NOT NULL AND long_name != 'Unknown' AND node_id != '0' THEN 1 END) AS \"Named\"\nFROM\n node_details\n\n", "refId": "A", "sql": { "columns": [ { "name": "COUNT", "parameters": [ { "name": "short_name", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [ { "property": { "name": "short_name", "type": "string" }, "type": "groupBy" } ], "limit": 50 }, "table": "node_details" } ], "title": "Nodes naming status", "type": "stat" }, { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "description": "Status of nodes in the MQTT server", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "fieldMinMax": false, "mappings": [ { "options": { "none": { "color": "text", "index": 0, "text": "⚪️ Unknown" }, "offline": { "color": "red", "index": 1, "text": "🛑 Offline" }, "online": { "color": "green", "index": 2, "text": "🟢 Online" } }, "type": "value" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] } }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 12, "y": 0 }, "id": 17, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "center", "orientation": "vertical", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": true }, "showPercentChange": false, "textMode": "value_and_name", "wideLayout": true }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "editorMode": "builder", "format": "table", "rawSql": "SELECT COUNT(mqtt_status), mqtt_status FROM node_details WHERE (COALESCE(mqtt_status, '') <> '' AND mqtt_status NOT LIKE '%none%' AND mqtt_status NOT LIKE '%Unknown%') GROUP BY mqtt_status LIMIT 50 ", "refId": "A", "sql": { "columns": [ { "name": "COUNT", "parameters": [ { "name": "mqtt_status", "type": "functionParameter" } ], "type": "function" }, { "parameters": [ { "name": "mqtt_status", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [ { "property": { "name": "mqtt_status", "type": "string" }, "type": "groupBy" } ], "limit": 50, "whereJsonTree": { "children1": [ { "id": "89b8baab-cdef-4012-b456-7190836a7bf2", "properties": { "field": "mqtt_status", "fieldSrc": "field", "operator": "is_not_empty", "value": [], "valueSrc": [], "valueType": [] }, "type": "rule" }, { "id": "ab9a9b88-89ab-4cde-b012-3190836b4df7", "properties": { "field": "mqtt_status", "fieldSrc": "field", "operator": "not_like", "value": [ "none" ], "valueError": [ null ], "valueSrc": [ "value" ], "valueType": [ "text" ] }, "type": "rule" }, { "id": "ab89aa99-0123-4456-b89a-b191382ca762", "properties": { "field": "mqtt_status", "fieldSrc": "field", "operator": "not_like", "value": [ "Unknown" ], "valueError": [ null ], "valueSrc": [ "value" ], "valueType": [ "text" ] }, "type": "rule" } ], "id": "babb9899-0123-4456-b89a-b19079f5bfed", "properties": { "conjunction": "AND" }, "type": "group" }, "whereString": "(COALESCE(mqtt_status, '') <> '' AND mqtt_status NOT LIKE '%none%' AND mqtt_status NOT LIKE '%Unknown%')" }, "table": "node_details" } ], "title": "MQTT Node status", "type": "stat" }, { "datasource": { "type": "datasource", "uid": "-- Mixed --" }, "description": "Total packets sent in specified time range", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "fieldMinMax": false, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "Packets" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 16, "y": 0 }, "id": 22, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "disableTextWrap": false, "editorMode": "builder", "expr": "sum(sum by(portnum) (mesh_packet_source_types_total{source_id=~\"$Nodes\"}))", "fullMetaSearch": false, "includeNullMetadata": true, "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], "title": "Total packets sent", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "description": "Shows the total data sent on the mesh in bytes in the last hour. This includes all types of packets.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 20, "y": 0 }, "id": 6, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "disableTextWrap": false, "editorMode": "builder", "expr": "sum(sum_over_time(text_message_app_size_in_bytes{source_id=~\"$Nodes\"}[1h]))", "fullMetaSearch": false, "hide": false, "includeNullMetadata": false, "instant": false, "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], "title": "Data sent on mesh in last hour", "type": "stat" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 4 }, "id": 25, "panels": [], "title": "Highlighted Nodes", "type": "row" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 16, "panels": [], "title": "Main Data", "type": "row" }, { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "description": "Shows the max recorded chanel utilization and the average", "fieldConfig": { "defaults": { "color": { "mode": "thresholds", "seriesBy": "last" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "axisSoftMax": 11, "axisSoftMin": 3, "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": 3600000, "lineInterpolation": "linear", "lineStyle": { "fill": "solid" }, "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "dashed+area" } }, "fieldMinMax": false, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "yellow", "value": 8.5 }, { "color": "red", "value": 10 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 9, "w": 11, "x": 0, "y": 6 }, "id": 23, "options": { "legend": { "calcs": [ "lastNotNull", "max", "mean" ], "displayMode": "table", "placement": "bottom", "showLegend": false }, "tooltip": { "mode": "multi", "sort": "none" } }, "targets": [ { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "disableTextWrap": false, "editorMode": "builder", "expr": "avg(telemetry_app_channel_utilization{node_id=~\"$Nodes\"})", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, "instant": false, "legendFormat": "Chanel utilization (Avg)", "range": true, "refId": "Average Chanel Utilization", "useBackend": false } ], "title": "Channel Utilization (ChUtil)", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "description": "This panel shows the percentage of airtime used for transmissions in the last hour. Airtime in LoRa networks represents the duration a device occupies the radio frequency channel to send data. It's a critical metric for:\n\nNetwork capacity: Higher airtime usage indicates increased network load.\n\nRegulatory compliance: Many regions limit the total airtime per device.\n\nBattery life: More airtime generally means higher power consumption.\n\nThe data comes from Meshtastic packets, reflecting actual network usage. High percentages may suggest the need for optimization or capacity planning.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "axisSoftMax": 10, "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "points", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "dashed+area" } }, "fieldMinMax": false, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "yellow", "value": 5 }, { "color": "red", "value": 8 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 9, "w": 13, "x": 11, "y": 6 }, "id": 3, "options": { "legend": { "calcs": [ "mean" ], "displayMode": "table", "placement": "right", "showLegend": true, "sortBy": "Mean", "sortDesc": true }, "tooltip": { "mode": "single", "sort": "none" } }, "pluginVersion": "10.4.2", "targets": [ { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "disableTextWrap": false, "editorMode": "code", "exemplar": false, "expr": "telemetry_app_air_util_tx{node_id=~\"$Nodes\"} > -100\nand\ndelta(telemetry_app_air_util_tx{node_id=~\"$Nodes\"}[1m]) != 0", "format": "time_series", "fullMetaSearch": false, "includeNullMetadata": false, "instant": false, "legendFormat": "{{long_name}}", "range": true, "refId": "A", "useBackend": false } ], "title": "Duty Cycle (AirUtilTX)", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "description": "Displays the nodes that utilize most of the channel (On average with at least 1 update every hour)", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "dashed+area" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "yellow", "value": 8.5 }, { "color": "red", "value": 10 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 9, "w": 11, "x": 0, "y": 15 }, "id": 26, "options": { "legend": { "calcs": [ "lastNotNull" ], "displayMode": "table", "placement": "right", "showLegend": true, "sortBy": "Last *", "sortDesc": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "targets": [ { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "disableTextWrap": false, "editorMode": "code", "exemplar": false, "expr": "topk(3,\n avg by (node_id, short_name, long_name) (\n avg_over_time(telemetry_app_channel_utilization{node_id=~\"$Nodes\"}[$__range]) > 0\n and\n timestamp(telemetry_app_channel_utilization{node_id=~\"$Nodes\"}) > time() - 3600\n and\n changes(telemetry_app_channel_utilization{node_id=~\"$Nodes\"}[3h]) > 0\n )\n)", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, "legendFormat": "{{short_name}}:{{long_name}}", "range": true, "refId": "A", "useBackend": false } ], "title": "Top channel utilizers", "type": "timeseries" }, { "datasource": { "type": "datasource", "uid": "-- Mixed --" }, "description": "Displays types of packets in the selected time range.\n\nFor more details see:\nhttps://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.PortNum", "fieldConfig": { "defaults": { "color": { "fixedColor": "green", "mode": "palette-classic" }, "custom": { "hideFrom": { "legend": false, "tooltip": false, "viz": false } }, "fieldMinMax": false, "mappings": [], "unit": "Packets" }, "overrides": [] }, "gridPos": { "h": 9, "w": 4, "x": 11, "y": 15 }, "id": 5, "options": { "displayLabels": [ "name", "percent" ], "legend": { "displayMode": "list", "placement": "right", "showLegend": false }, "pieType": "donut", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "tooltip": { "mode": "single", "sort": "none" } }, "pluginVersion": "11.1.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "disableTextWrap": false, "editorMode": "builder", "expr": "sum by(portnum) (mesh_packet_source_types_total{source_id=~\"$Nodes\"})", "fullMetaSearch": false, "includeNullMetadata": true, "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], "title": "Packet types for selected time", "type": "piechart" }, { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "description": "How many hops are configured for each client", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "fieldMinMax": false, "mappings": [], "max": 7, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "#EAB839", "value": 4 }, { "color": "semi-dark-orange", "value": 5 }, { "color": "red", "value": 6 }, { "color": "dark-red", "value": 7 } ] }, "unit": "hops" }, "overrides": [] }, "gridPos": { "h": 9, "w": 9, "x": 15, "y": 15 }, "id": 9, "options": { "minVizHeight": 75, "minVizWidth": 75, "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true, "sizing": "auto" }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }, "disableTextWrap": false, "editorMode": "code", "expr": "max(\n mesh_packet_hop_start{source_id=~\"$Nodes\"}\n and\n (delta(mesh_packet_hop_start{source_id=~\"$Nodes\"}[1m]) != 0)\n) by (source_id, source_long_name)", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, "legendFormat": "{{source_long_name}}", "range": true, "refId": "A", "useBackend": false } ], "title": "The configured max hops for each client", "type": "gauge" }, { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "description": "Graph that is built from Neighbor Info reports and shows the signal strenth for each line", "gridPos": { "h": 22, "w": 11, "x": 0, "y": 24 }, "id": 20, "options": { "edges": { "mainStatUnit": "dB" }, "nodes": { "arcs": [] } }, "pluginVersion": "10.4.2", "targets": [ { "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "editorMode": "code", "format": "table", "rawQuery": true, "rawSql": "SELECT DISTINCT\n cd.node_id AS \"id\",\n cd.long_name AS \"title\",\n cd.hardware_model AS \"detail__Hardware Detail\",\n cd.role AS \"detail__Client Role\",\n cd.mqtt_status AS \"detail__MQTT Status\",\n cd.short_name AS \"subtitle\",\n CASE\n WHEN cd.mqtt_status = 'online' THEN '#2ECC71' -- Green for online\n WHEN cd.mqtt_status = 'offline' THEN '#E74C3C' -- Red for offline\n ELSE '#808080' -- Gray for none or any other status\n END AS \"color\"\nFROM\n node_details cd\nLEFT JOIN (\n SELECT node_id FROM node_neighbors\n UNION\n SELECT neighbor_id FROM node_neighbors\n) nn ON cd.node_id = nn.node_id\nWHERE nn.node_id IS NOT NULL", "refId": "nodes", "sql": { "columns": [ { "alias": "\"id\"", "parameters": [ { "name": "node_id", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"title\"", "parameters": [ { "name": "long_name", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"detail__Hardware Detail\"", "parameters": [ { "name": "hardware_model", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"detail__Client Role\"", "parameters": [ { "name": "role", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"detail__MQTT Status\"", "parameters": [ { "name": "mqtt_status", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"subtitle\"", "parameters": [ { "name": "short_name", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [ { "property": { "type": "string" }, "type": "groupBy" } ], "limit": 50 }, "table": "node_details" }, { "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "editorMode": "code", "format": "table", "hide": false, "rawQuery": true, "rawSql": "SELECT \n CONCAT(neighbor_id, '_', node_id) AS id,\n neighbor_id AS \"source\",\n node_id AS \"target\",\n snr AS \"mainstat\",\n CASE\n WHEN snr < -13 THEN '#E74C3C' -- Red for SNR < -13\n WHEN snr < -7 THEN '#F4D03F' -- Yellow for -13 ≤ SNR < -7\n ELSE '#2ECC71' -- Green for SNR ≥ -7\n END AS \"color\",\n GREATEST(0.1, LEAST(2, 1 + ((snr + 13) / 10))) AS \"thickness\"\nFROM \n node_neighbors", "refId": "edges", "sql": { "columns": [ { "parameters": [ { "name": "id", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"source\"", "parameters": [ { "name": "neighbor_id", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"target\"", "parameters": [ { "name": "node_id", "type": "functionParameter" } ], "type": "function" }, { "alias": "\"mainstat\"", "parameters": [ { "name": "snr", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [ { "property": { "type": "string" }, "type": "groupBy" } ], "limit": 50 }, "table": "node_neighbors" } ], "title": "Node Graph", "type": "nodeGraph" }, { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "description": "Information stored on the Redis DB which includes \"hard to get\" information - that is needed to be gathered over time.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "custom": { "align": "center", "cellOptions": { "type": "color-text" }, "filterable": true, "inspect": true }, "links": [], "mappings": [ { "options": { "none": { "color": "text", "index": 2, "text": "⚪️ Unknown" }, "offline": { "color": "red", "index": 1, "text": "🛑 offline" }, "online": { "color": "green", "index": 0, "text": "🟢 online" } }, "type": "value" }, { "options": { "match": "empty", "result": { "color": "text", "index": 3, "text": "⚪️ Unknown" } }, "type": "special" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [ { "matcher": { "id": "byName", "options": "Node ID" }, "properties": [ { "id": "links", "value": [ { "targetBlank": true, "title": "Go to node dashboard", "url": "http://localhost:3000/d/edqo1uh0eglq8g/node-dashboard?orgId=1&var-nodeID=${__data.fields[0]}" } ] }, { "id": "color", "value": { "fixedColor": "light-blue", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Record Created At" }, "properties": [ { "id": "unit", "value": "dateTimeFromNow" } ] }, { "matcher": { "id": "byName", "options": "Client Role" }, "properties": [ { "id": "custom.width", "value": 126 } ] }, { "matcher": { "id": "byName", "options": "Last Updated At" }, "properties": [ { "id": "unit", "value": "dateTimeFromNow" } ] }, { "matcher": { "id": "byName", "options": "Node ID Hex" }, "properties": [ { "id": "unit", "value": "hex" } ] } ] }, "gridPos": { "h": 22, "w": 13, "x": 11, "y": 24 }, "id": 14, "options": { "cellHeight": "sm", "footer": { "countRows": true, "enablePagination": false, "fields": [], "reducer": [ "count" ], "show": true }, "frameIndex": 0, "showHeader": true, "sortBy": [ { "desc": true, "displayName": "Last Updated At" } ] }, "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "editorMode": "code", "format": "table", "rawQuery": true, "rawSql": "SELECT * FROM node_details WHERE node_id <> '0' ", "refId": "A", "sql": { "columns": [ { "parameters": [ { "name": "*", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [ { "property": { "type": "string" }, "type": "groupBy" } ], "limit": 50, "whereJsonTree": { "children1": [ { "id": "aa8aab9b-4567-489a-bcde-f190819d6a21", "properties": { "field": "node_id", "fieldSrc": "field", "operator": "not_equal", "value": [ "0" ], "valueSrc": [ "value" ], "valueType": [ "text" ] }, "type": "rule" } ], "id": "aab899bb-0123-4456-b89a-b190819173ad", "type": "group" }, "whereString": "node_id <> '0'" }, "table": "node_details" } ], "title": "General Information", "transformations": [ { "id": "extractFields", "options": { "format": "json", "keepTime": false, "replace": true, "source": "Value" } }, { "id": "calculateField", "options": { "alias": "Node ID Hex", "mode": "reduceRow", "reduce": { "include": [ "node_id" ], "reducer": "lastNotNull" } } }, { "id": "organize", "options": { "excludeByName": { "altitude": true, "latitude": true, "longitude": true, "precision": true }, "includeByName": {}, "indexByName": { "Node ID Hex": 1, "altitude": 9, "created_at": 11, "hardware_model": 4, "latitude": 8, "long_name": 3, "longitude": 7, "mqtt_status": 6, "node_id": 0, "precision": 10, "role": 5, "short_name": 2, "updated_at": 12 }, "renameByName": { "created_at": "Record Created At", "hardware_model": "Hardware Model", "long_name": "Long name", "mqtt_status": "MQTT Status", "node_id": "Node ID", "role": "Client Role", "short_name": "Short Name", "updated_at": "Last Updated At" } } } ], "type": "table" }, { "datasource": { "type": "grafana-postgresql-datasource", "uid": "PA942B37CCFAF5A81" }, "description": "Displays the nodes on the map", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "custom": { "hideFrom": { "legend": false, "tooltip": false, "viz": false } }, "mappings": [ { "options": { "none": { "color": "blue", "index": 0, "text": "⚪️ Unknown" }, "offline": { "color": "red", "index": 2, "text": "🛑 Offline" }, "online": { "color": "green", "index": 1, "text": "🟢 Online" } }, "type": "value" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "blue" } ] }, "unit": "string" }, "overrides": [ { "matcher": { "id": "byName", "options": "created_at" }, "properties": [ { "id": "unit", "value": "dateTimeFromNow" } ] }, { "matcher": { "id": "byName", "options": "updated_at" }, "properties": [ { "id": "unit", "value": "dateTimeFromNow" } ] } ] }, "gridPos": { "h": 25, "w": 24, "x": 0, "y": 46 }, "id": 8, "options": { "basemap": { "config": {}, "name": "Layer 0", "opacity": 1, "tooltip": true, "type": "xyz" }, "controls": { "mouseWheelZoom": true, "showAttribution": true, "showDebug": false, "showMeasure": true, "showScale": true, "showZoom": true }, "layers": [ { "config": { "showLegend": true, "style": { "color": { "field": "mqtt_status", "fixed": "dark-green" }, "opacity": 1, "rotation": { "fixed": 0, "max": 360, "min": -360, "mode": "mod" }, "size": { "fixed": 3, "max": 5, "min": 1 }, "symbol": { "fixed": "img/icons/marker/circle.svg", "mode": "fixed" }, "symbolAlign": { "horizontal": "center", "vertical": "top" }, "text": { "fixed": "", "mode": "field" }, "textConfig": { "fontSize": 12, "offsetX": 0, "offsetY": 5, "textAlign": "center", "textBaseline": "middle" } } }, "filterData": { "id": "byRefId", "options": "Nodes" }, "location": { "latitude": "latitude_norm", "longitude": "longitude_norm", "mode": "coords" }, "name": "Layer 1", "tooltip": true, "type": "markers" } ], "tooltip": { "mode": "details" }, "view": { "allLayers": true, "id": "coords", "lat": 32.008273, "lon": 34.969099, "padding": 30, "zoom": 8 } }, "pluginVersion": "11.1.0", "targets": [ { "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "editorMode": "code", "format": "table", "hide": false, "rawQuery": true, "rawSql": "SELECT * FROM node_details WHERE longitude != 0 AND longitude IS NOT NULL", "refId": "Nodes", "sql": { "columns": [ { "parameters": [ { "name": "*", "type": "functionParameter" } ], "type": "function" } ], "groupBy": [ { "property": { "type": "string" }, "type": "groupBy" } ], "limit": 50 }, "table": "node_details" } ], "title": "Nodes map", "transformations": [ { "id": "organize", "options": { "excludeByName": { "Time 1": false, "Time 2": true, "Time 3": true, "Time 4": true, "__name__ 1": true, "__name__ 2": true, "hardware_model 2": true, "hardware_model 3": true, "hardware_model 4": true, "hardware_model 5": true, "instance 1": true, "instance 2": true, "instance 3": true, "instance 4": true, "job 1": true, "job 2": true, "job 3": true, "job 4": true, "long_name 2": true, "long_name 3": true, "long_name 4": true, "long_name 5": true, "role 2": true, "role 3": true, "role 4": true, "role 5": true, "short_name 2": true, "short_name 3": true, "short_name 4": true, "short_name 5": true }, "includeByName": {}, "indexByName": {}, "renameByName": { "Time 1": "Log Time", "__name__ 1": "", "hardware_model": "Hardware Model", "hardware_model 1": "Hardware Model", "long_name": "Long Name", "long_name 1": "Long Name", "mqtt_status": "MQTT_STATUS", "node_id": "Node ID", "role": "Client Role", "role 1": "Client Role", "short_name": "Short Name", "short_name 1": "Short Name" } } }, { "id": "calculateField", "options": { "alias": "longitude_norm", "binary": { "left": "longitude", "operator": "*", "right": "1e-7" }, "mode": "binary", "reduce": { "include": [ "longitude", "latitude" ], "reducer": "sum" }, "replaceFields": false } }, { "id": "calculateField", "options": { "alias": "latitude_norm", "binary": { "left": "latitude", "operator": "*", "right": "1e-7" }, "mode": "binary", "reduce": { "reducer": "sum" } } } ], "type": "geomap" } ], "refresh": "5m", "schemaVersion": 39, "tags": [], "templating": { "list": [ { "current": { "selected": false, "text": "All", "value": "$__all" }, "datasource": { "type": "postgres", "uid": "PA942B37CCFAF5A81" }, "definition": "SELECT \n concat(long_name, ' (', node_id, ')') as __text, \n node_id as __value \nFROM node_details \nORDER BY long_name", "hide": 0, "includeAll": true, "label": "Nodes", "multi": true, "name": "Nodes", "options": [], "query": "SELECT \n concat(long_name, ' (', node_id, ')') as __text, \n node_id as __value \nFROM node_details \nORDER BY long_name", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "type": "query" } ] }, "time": { "from": "now-12h", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "Main Dashboard", "uid": "edqkge9mf7v28g", "version": 78, "weekStart": "sunday" }