Ist mein Gateway online? – Stack V3 API

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.

Stack V3 API

Import des Flows in Node-RED

Den unten angefügten Flow importiert ihr einfach in Node-RED. Dabei müsst ihr zwei Dinge anpassen:

  1. eure Gateway ID im http request Node mit dem Namen Gateway-ID
  2. 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.

1 Gefällt mir

10 Gedanken zu „Ist mein Gateway online? – Stack V3 API“

  1. 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

    Antworten
    • 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

      Antworten
  2. 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

    Antworten
  3. 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

    Antworten
  4. 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

    Antworten

Schreibe einen Kommentar