Ich hatte ja bereits zwei Methoden vorgestellt um den Status eures Gateways im alten V2 abzurufen. Natürlich kam bei mir die Frage auf wie es sich mit dem Stack V3 verhält. Die Antwort war schnell gefunden, denn dank der Stack V3 API kann der Status eines Gateways abgefragt werden. Dazu bedarfs es nicht mal viel. Dank Node-RED ist eine Abfrage schnell erzeugt und ihr entscheidet wie es danach weiter geht.
Stack V3 API Key erzeugen
Wir beginnen damit einen API Key zu erzeugen. Vergebt einen Namen mit dem ihr was anfangen könnt und wählt als Berechtigung „View gateway status“. Dieses wiederholt ihr für jedes Gateway, welches ihr überwachen möchtet. Kopiert euch den Key gut weg, denn ihr könnt ihn danach nicht mehr auslesen.
Import des Flows in Node-RED
Den unten angefügten Flow importiert ihr einfach in Node-RED. Dabei müsst ihr zwei Dinge anpassen:
- eure Gateway ID im http request Node mit dem Namen Gateway-ID
- euren API-Key im change Node mit dem Namen API-Key
[
{
"id": "ebabc705.205658",
"type": "inject",
"z": "fe6f12a2.7baa7",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "300",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 130,
"y": 980,
"wires": [
[
"6cff82c1.5a90ec"
]
]
},
{
"id": "e7378b8f.cbd688",
"type": "http request",
"z": "fe6f12a2.7baa7",
"name": "Gateway-ID",
"method": "GET",
"ret": "obj",
"paytoqs": "ignore",
"url": "https://eu1.cloud.thethings.network/api/v3/gs/gateways/Your-GW-ID/connection/stats",
"tls": "",
"persist": false,
"proxy": "",
"authType": "",
"x": 490,
"y": 980,
"wires": [
[
"68be1fc7.83e8c"
]
]
},
{
"id": "6cff82c1.5a90ec",
"type": "change",
"z": "fe6f12a2.7baa7",
"name": "API-Key",
"rules": [
{
"t": "set",
"p": "headers",
"pt": "msg",
"to": "{\"Authorization\":\" Bearer Your-API-Key\"}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 300,
"y": 980,
"wires": [
[
"e7378b8f.cbd688"
]
]
},
{
"id": "68be1fc7.83e8c",
"type": "function",
"z": "fe6f12a2.7baa7",
"name": "",
"func": "\nvar msg2 = {};\nvar msg3 = {};\nvar msg4 = {};\n\nif (msg.payload.last_status_received_at == null)\n {\n return msg3; \n } else {\nmsg.payload = msg.payload.last_status_received_at;\n\nmsg2.payload = new Date((new Date) * 1 - 250 * 3600);\n\nmsg3.payload = \"GW offline\";\n\nmsg4.payload = \"GW online\"\n\n\t\t if (msg2.payload > new Date(msg.payload)){\n return msg3;\n } else {\n return msg4;\n }\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 680,
"y": 980,
"wires": [
[
"5aa7c8be.720738"
]
]
},
{
"id": "5aa7c8be.720738",
"type": "debug",
"z": "fe6f12a2.7baa7",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 850,
"y": 980,
"wires": []
}
]
Das von mir verwendete Gateway nutz den Multi Protocol Packet Forwarder von Jac Kersing welcher wiederum das TTN Gatway Connector Protokoll unterstützt. Dieses hat den charmanten Vorteil regelmäßig seinen Status zu übermitteln. Somit frage ich auch den last_status_received_at Zeitpunkt ab und vergleiche ihn mit der aktuellen Zeit. Sollte dieser größer 15 Minuten sein, wird das Gateway als offline angesehen. Es liegt noch an euch eine entsprechend mit den Daten umzugehen. Ich lasse mir, bei einem Ausfall, eine Nachricht mittels Pushover auf das Handy schicken.
Das neue Basic Station Protokoll macht dieses nicht, und meldet sich nur wenn es ein Paket übermittelt. Somit müsst ihr dafür eure Abfrage entsprechend anpassen.
Hier exemplarisch eine Rückmeldung der API. Unter last_status verstecken sich noch weitere Infos, die ihr ebenfalls auswerten könntet.
connected_at: "2021-02-17T10:29:00.228974205Z"
protocol: "mqtt"
last_status_received_at: "2021-02-22T10:48:16.844147541Z"
last_status: object
last_uplink_received_at: "2021-02-22T10:41:45.485792344Z"
uplink_count: "2030"
last_downlink_received_at: "2021-02-22T10:19:10.910550886Z"
downlink_count: "230"
Ich hoffe ich konnte euch weiter helfen und ihr könnt euere Gateway nun auch im Stack V3 überwachen.
Hallo Björn,
bei mir klappt es erst, wenn ich im http-Node den Haken bei: „Append msg.payload as query string parameters“ entferne!
Gruß
E_T
Hi,
vermutlich liegt das an einer unterschiedlichen Node-RED Version, bzw. Node Version. Bei mir gibt es für die Payload ein Auswahlfeld, welches mit „Ignore“ vorbelegt ist. Daneben gibt es noch „Apennd to query string parameters“ und „Send as request body“. Ich nutze die v1.2.7.
Grüße,
Björn
Bei der Verwendung des Basic Station Protokolls genügt zur Abfrage im Funktions-Node:
if (!msg.payload.connected_at)
{
msg.payload = „GW offline“;
return msg;
}
Gruß
M
Danke für die Info!
Durch neue API ist die Abfrage nun auch ohne Key und unabhängig vom verwendeten Forwarder möglich.
[
{
„id“: „1be640bb.d52d3f“,
„type“: „inject“,
„z“: „e442f327.2ae01“,
„name“: „“,
„props“: [
{
„p“: „payload“
},
{
„p“: „topic“,
„vt“: „str“
}
],
„repeat“: „1800“,
„crontab“: „“,
„once“: false,
„onceDelay“: 0.1,
„topic“: „“,
„payload“: „“,
„payloadType“: „date“,
„x“: 270,
„y“: 360,
„wires“: [
[
„40b4aea4.b2bc“
]
]
},
{
„id“: „40b4aea4.b2bc“,
„type“: „http request“,
„z“: „e442f327.2ae01“,
„name“: „Gateway-ID“,
„method“: „GET“,
„ret“: „obj“,
„paytoqs“: „ignore“,
„url“: „https://mapper.packetbroker.net/api/v2/gateways/netID=000013,tenantID=ttn,id=Your-GW-ID“,
„tls“: „“,
„persist“: false,
„proxy“: „“,
„authType“: „“,
„x“: 470,
„y“: 360,
„wires“: [
[
„108c01c7.6b5b7e“
]
]
},
{
„id“: „3f2d6847.385838“,
„type“: „debug“,
„z“: „e442f327.2ae01“,
„name“: „GW online?“,
„active“: true,
„tosidebar“: true,
„console“: false,
„tostatus“: false,
„complete“: „payload“,
„targetType“: „msg“,
„statusVal“: „“,
„statusType“: „auto“,
„x“: 890,
„y“: 360,
„wires“: []
},
{
„id“: „108c01c7.6b5b7e“,
„type“: „function“,
„z“: „e442f327.2ae01“,
„name“: „GW status“,
„func“: „if (msg.payload.online == false)\n {\n msg.payload = \“GW offline\“;\n return msg;\n }“,
„outputs“: 1,
„noerr“: 0,
„initialize“: „“,
„finalize“: „“,
„x“: 670,
„y“: 360,
„wires“: [
[
„3f2d6847.385838“
]
]
}
]
Gruß
M
Leider wurde die Formatierung zerstört und Zeichen ausgetauscht.
Grundsätzlich geht es um diese Adresse: https://mapper.packetbroker.net/api/v2/gateways/netID=000013,tenantID=ttn,id=Your-GW-ID
Welche als Information unter anderem auch den Status des GW zurückgibt. (Your-GW-ID = eure Gateway ID)
Noch besser, danke dir!
Grüße aus dem Urlaub
Achtung: Du hast die v2 API abgefragt, Björn verwendet die v3 API, da muss man sich sehr wohl authentifizieren. Und der Status wird in in der v3 API auch nicht mehr direkt ausgegeben (true oder false), sondern nur der Zeitstempel.
Hi Bjoern,
ich habe alles nach Anleitung eingefügt. Die http Abfrage gibt in meinem Fall folgendes zurück:
{„connected_at“:“2021-07-13T15:49:39.407459998Z“,“protocol“:“ws“,“last_status_received_at“:“2021-07-13T15:49:39.443284968Z“,“last_status“:{„time“:“2021-07-13T15:49:39.443152026Z“,“boot_time“:“0001-01-01T00:00:00Z“,“versions“:{„firmware“:“1.0.0″,“package“:“1.0.0″,“platform“:“rpi – Firmware 1.0.0 – Protocol 2″,“station“:“2.0.5(rpi/std)“},“advanced“:{„features“:“rmtsh“,“model“:“rpi“}},“last_uplink_received_at“:“2021-07-16T13:35:19.663893433Z“,“uplink_count“:“2278″,“last_downlink_received_at“:“2021-07-15T08:07:30.029531688Z“,“downlink_count“:“1″,“sub_bands“:[{„min_frequency“:“863000000″,“max_frequency“:“865000000″,“downlink_utilization_limit“:0.001},{„min_frequency“:“865000000″,“max_frequency“:“868000000″,“downlink_utilization_limit“:0.01},{„min_frequency“:“868000000″,“max_frequency“:“868600000″,“downlink_utilization_limit“:0.01},{„min_frequency“:“868700000″,“max_frequency“:“869200000″,“downlink_utilization_limit“:0.001},{„min_frequency“:“869400000″,“max_frequency“:“869650000″,“downlink_utilization_limit“:0.1},{„min_frequency“:“869700000″,“max_frequency“:“870000000″,“downlink_utilization_limit“:0.01}]}
Wie man sieht ist „last_status_received_at“:“2021-07-13T15:49:39.443284968Z“ – das entspricht der Zeit des letzten Boots.
Unter „last_uplink_received_at“:“2021-07-16T13:35:19.663893433Z“ sieht man, dass das GW aktuell Packets empfängt.
Kann es sein, dass das GW seinen Status nicht aktualisiert?
Gruß
Reinhard
Hi Reinhard,
du benutzt das Basic Station Protokoll. Schau mal in die Kommentare, da wirst du fündig.
Grüße aus dem Urlaub,
Björn
Gefunden !
Danke und noch einen schönen Urlaub
Reinhard
Hallo,
ich finde das ja mal sehr Interessant.
Könnte man damit nicht auch die Gateway Auslastung RX TX ausgeben.
Einfach mal um zu sehen wie viel sich da tut.