Der geneigte Besucher der Convention-X-Treme LAN-Party in Karlsdorf-Neuthard weiß, dass es vor Ort gerne mal heiß her geht.
Um zu analysieren wie sich die Temperaturen über das LAN-Party-Wochenende entwickeln, wurde dieses Projekt geboren. Es besteht insgesamt aus vier Repositories:
- cxt-heatmap (dieses Repository)
- cxt-heatmap-fe
- cxt-heatmap-sensor
- cxt-heatmap-data
Das Backend ist eine auf NestJS basierende Implementierung. Es stellt vier unterschiedliche Endpunkte zur Verfügung:
- / - Unter root wird das Frontend bereitgestellt, welches im cxt-heatmap-fe Repository liegt.
- /png - Hier gibt das Backend eine PNG Datei mit der aktuellen Heatmap zurück.
- /metrics - Hier gibt der Server Prometheus Informationen zurück
- /graphql - Um die Daten für das Frontend bereitszustellen, gibt es auch einen GraphQL Endpunkt, der auch Subscriptions erlaubt. Diese ermöglicht eine dynamische Aktualisierung des Frontends, sobald neue Daten vorliegen
Die Sensoren senden ihre Daten per MQTT. Das Backend abonniert das entsprechende MQTT-Topic (cxt/temperature). Wenn neue Daten ankommen, werden diese zusammen mit dem Zeitstempel in eine Influx-Datenbank geschrieben, so dass auch die historischen Daten im Nachgang zur Verfügung stehen. Die Sensoren übertragen dabei die eigene ID sowie die gemessene Temperatur. Die ID wird über eine Konfigurationsdatei (idMap.json) einem Sitzplatz zugeordnet.
Der Worker holt sich alle 30 Sekunden für jeden Sitzplatz die zuletzt gemessenen Temperaturen und überträgt diese auf die Karte. Dabei wurde die (temperatureMap)[https://github.com/optimisme/javascript-temperatureMap] Implementierung verwendet und geringfürig angepasst. Die Anpassungen beinhalten:
- Farben zum Temperaturbereich
- Farbbereich wird bis zum Bildrand gemalt
Die fertig erstellte Karte wird als png-Datei im Dateisystem abgelegt und der /png-Endpunkt spielt diese aus. Der Endpunkt ist bspw. für einen Discord-Bot gedacht, der ggf. vom CXT-Team noch entwickelt wird.
Für jeden Platz, welcher in der Konfigurationsdatei (idMap.json) konfiguriert ist, erstellt der Prometheus-Service eine Metric. Unter dem o.g. Endpunkt stellt das Backend dann einen Prometheus-Endpunkt bereit, mit den zuletzt gemessenen Daten an den jeweiligen Plätzen.
Mittels Apollo wird ein GraphQL Endpunkt bereitgestellt, der zum Einen über ein Query die Abfrage der aktuell gemessenen Temperaturen erlaubt und zum Anderen eine Subscription-Abfrage zur Verfügung stellt, die den Client über Temperaturveränderungen an den Plätzen informiert. Dieser Entpunkt wird vom Frontend verwendet.
Das Backend beinhaltet auch einen Discord-Bot, welcher eine DM versendet, sobald ein Sensor seit mehr als 15 Minuten keine Daten mehr gesendet hat. Sobald der Sensor wieder Daten sendet, wird ebenfalls eine Information per Discord-DM versendet.