Wir machen ja schon einiges mit Node-RED im IoT Umfeld und nach einem Hinweis von Reinhard Nickels auf Twitter habe ich auch mal den Worldmap Node eingerichtet.

Das Ergebnis ist die hier oben gezeigte Karte.
Wie kommen wir nun zu diesem Ergebnis?
Es ist relativ Trivial zu erstellen:
- Worldmap Node installieren (https://flows.nodered.org/node/node-red-contrib-web-worldmap)
- Einen HTTP Request erstellen der die Daten der TTN API abfragt.
- Ein wenig Funktions-Magic um die Daten aufzubereiten.

Den Worldmap Node installieren
Wir folgen der Anleitung unter https://flows.nodered.org/node/node-red-contrib-web-worldmap um die drei neuen Nodes zu installieren. Wir nutzen davon den “Worldmap” Node, in dem Bild oben als Gateway Map bezeichnet und den “Worldmap in” Node der im Bild als GW Map Response benannt wurde.
und einstellen
Zur Einstellung der beiden Nodes ist wenig zu sagen, der Response Node wird nur mit der richtigen Adresse gefüllt und der Name wird vergeben:

Der eigentliche Map Node hat zwar deutlich umfangreichere Optionen, aber auch hier ist nur wenig einzustellen. Die Geo Koordinaten, die gewünschte Base Map und der Web Path reichen schon aus um den kompletten Node zu konfigurieren.

Der HTTP Request Node
Unser HTTP Request Node hat im Flow den Namen “Community abfragen” erhalten.
Die URL ist der selbe Request der auch auf der Community Seite vom The Things Network verwendet wird.
https://www.thethingsnetwork.org/gateway-data/location?latitude=54.64110174068876&longitude=9.412811212241651&distance=45000
Wir sind eine Flächen Community, das erkennt man auch wenn man den Radius betrachtet der hier mit 45km doch recht groß ist. Die Rückgabe des Node wird auf parsed JSON Object eingestellt so das wir ein gut zu verarbeitenden Payload erhalten.

Aufbereiten der erhaltenen Daten
Nun müssen wir die Daten die wir aus der Abfrage gewonnen haben für die Gateway Map aufbereiten. Dazu wird ein Funktions Node eingerichtet. Der Inhalt ist nun etwas komplexer, wir wollen ja den Status der Gateways auch an der Farbe der Pins erkennen.
var NumOfGW = Object.keys(msg.payload).length;
var gwArr=[];
var mapArr=[];
var timeDiff15 = new Date((new Date()) -15100060);
var timeDiff60 = new Date((new Date()) -60100060);
for (var i = 0; i< NumOfGW; i++){
gwArr.push(Object.keys(msg.payload)[i]);
}
for (var i = 0; i< NumOfGW; i++){
if (typeof(msg.payload[gwArr[i]].location)!== "undefined"){
message = {
lat: msg.payload[gwArr[i]].location.latitude,
lon: msg.payload[gwArr[i]].location.longitude,
name: msg.payload[gwArr[i]].id,
};
if (new Date(msg.payload[gwArr[i]].last_seen) === "undefined"){
message.iconColor="green";
}
else if (new Date(msg.payload[gwArr[i]].last_seen)<timeDiff60){
message.iconColor="red";
}
else if (new Date(msg.payload[gwArr[i]].last_seen)<timeDiff15){
message.iconColor="orange";
}
else {
message.iconColor="green";
}
message.Description = msg.payload[gwArr[i]].description;
message.Owner = msg.payload[gwArr[i]].owner;
message.lastSeen = msg.payload[gwArr[i]].last_seen;
mapArr.push(message);
}
}
msg.payload=mapArr;
return msg;
Ich hoffe das sich der Code selbst erklärt, im groben wird ermittelt wie viele Gateways sich gemeldet haben. Danach wir ein Array gefüllt welches die Geo Daten der Gateways, die anzuzeigenden Texte und die Farbe des Pins angibt. Die Pin Farbe wir an hand der letzten Meldung des Gateways erzeugt, ist es aktiv oder hat keinen “last_seen” Wert ist es grün. Nach 15 Minuten wird es orange und sollte es sich seit einer Stunde nicht gemeldet haben ist es rot.
Der Funktions Node der im Flow als Trigger bezeichnet ist bekommt nur ein Payload msg.payload.action === “connected” angelegt.
if (msg.payload.action === "connected")
return msg;
Sobald die Karte angezeigt wird löst das Event aus, der Worldmap in Node wird abgefeuert um den Trigger zu setzen. Damit wird der HTTP Request angestoßen und die Daten dann aufbereitet und an die Gateway Map übertragen.
Viel Spaß beim Nachbauen
unsere Karte ist hier zu finden: https://node-red.iot-usergroup.de/ttnsslgw/