diff --git a/README.md b/README.md index 102d30c..6feb31b 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,20 @@ # msv-clubhouse-node +- Work in progress ! +- Technical demo + +## Overview + +![architecture diagram](doc/architecture.png) ## Hardware ## -[ESP32 LoRa 868MHz OLED DevBoard](https://de.aliexpress.com/item/33018609928.html) +- [ESP32 LoRa 868MHz OLED DevBoard](https://de.aliexpress.com/item/33018609928.html) +- [Bosch BMP280](https://de.aliexpress.com/item/1005003406725433.html) +- [Reed Switch](https://de.aliexpress.com/item/1005004549803034.html) +- [Wind speed sensor](https://de.aliexpress.com/item/1005001330214766.html) +- [Wind direction sensor](https://de.aliexpress.com/item/4000590284491.html) -[Wind speed sensor](https://de.aliexpress.com/item/1005001330214766.html) - -[Wind direction sensor](https://de.aliexpress.com/item/4000590284491.html) - -## Build ## +## Build Node Firmware 0. Clone repo 1. Init GIT-submodules @@ -43,7 +49,7 @@ TTN LoRa frequency / region - `nano /etc/systemd/system/msv-clubhouse-backend.service` - `systemctl daemon-reload && systemctl enable --now msv-clubhouse-backend.service` -JS Payload Formatter: +## JS Payload Formatter ``` function Decoder(bytes, port) { @@ -116,4 +122,10 @@ function sflt162f(rawSflt16) return f_unscaled; } - ``` \ No newline at end of file +``` + +## Grafana Dashboard + +see `frontend/` + +![screenshot of grafana-dashboard](doc/screenshot_dashboard.png) \ No newline at end of file diff --git a/doc/architecture.drawio b/doc/architecture.drawio new file mode 100644 index 0000000..b986c0d --- /dev/null +++ b/doc/architecture.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/doc/architecture.png b/doc/architecture.png new file mode 100644 index 0000000..286562b Binary files /dev/null and b/doc/architecture.png differ diff --git a/doc/screenshot_dashboard.png b/doc/screenshot_dashboard.png new file mode 100644 index 0000000..f4ecf7a Binary files /dev/null and b/doc/screenshot_dashboard.png differ diff --git a/frontend/grafana_dashboard.json b/frontend/grafana_dashboard.json index b34c076..2cd4b33 100644 --- a/frontend/grafana_dashboard.json +++ b/frontend/grafana_dashboard.json @@ -36,21 +36,18 @@ "description": "Wenn die Türe offen, dann ist wohl jemand am Platz.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "mappings": [ { "options": { "0": { - "color": "red", - "index": 1, - "text": "Türe geschlossen" - }, - "1": { "color": "green", "index": 0, "text": "Türe offen" + }, + "1": { + "color": "red", + "index": 1, + "text": "Türe geschlossen" } }, "type": "value" @@ -68,7 +65,8 @@ "value": 80 } ] - } + }, + "unit": "short" }, "overrides": [] }, @@ -80,8 +78,8 @@ }, "id": 2, "options": { - "colorMode": "value", - "graphMode": "area", + "colorMode": "background", + "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { @@ -550,7 +548,7 @@ }, "editorMode": "builder", "expr": "msv_clubhouse_temperature", - "legendFormat": "Luftdruck Außen", + "legendFormat": "Temperatur Außen", "range": true, "refId": "A" } @@ -558,6 +556,193 @@ "title": "Tempertur Außen", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "x08D2Hlnz" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "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": "velocityms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 15 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "x08D2Hlnz" + }, + "editorMode": "builder", + "expr": "msv_clubhouse_windspeed", + "legendFormat": "Windgeschwindigkeit", + "range": true, + "refId": "A" + } + ], + "title": "Windgeschwindigkeit ", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 14, + "panels": [], + "title": "Metadaten des Systems", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "x08D2Hlnz" + }, + "description": "", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 1, + "text": "Error" + }, + "1": { + "color": "green", + "index": 0, + "text": "OK" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 0, + "y": 24 + }, + "id": 18, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "x08D2Hlnz" + }, + "editorMode": "builder", + "expr": "msv_clubhouse_exporter_scrape_healthy", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Zustand TTN Scrape", + "type": "stat" + }, { "datasource": { "type": "prometheus", @@ -620,8 +805,8 @@ "gridPos": { "h": 9, "w": 12, - "x": 0, - "y": 15 + "x": 5, + "y": 24 }, "id": 10, "options": { @@ -714,8 +899,8 @@ "gridPos": { "h": 9, "w": 12, - "x": 12, - "y": 15 + "x": 5, + "y": 33 }, "id": 12, "options": { @@ -761,6 +946,6 @@ "timezone": "", "title": "MSV Moos Modellflugplatz", "uid": "nuH5csxVz", - "version": 6, + "version": 11, "weekStart": "" } \ No newline at end of file