TTN V2 -> V3

Die Update Reise zum neuen TTN The Things Stack Version 3

Nachdem mit Ende 2021 der alte V2 stack vom TTN abgedreht wird, musste es ja irgendwann soweit sein. Nicht immer muss man bei den ersten sein, die ein Upgrade durchführen. Aber als plötzlich der MQTT Dienst vom TTN V2 nicht mehr funktioniert hat und ich damit keine Werte ins OpenHAB bekommen habe, war es so weit.

LoRa WAN Gateway Dragino LPS8

Zuerst einmal musste das LoRa WAN Gateway Dragino LPS8 für TTN V3 vorbereitet werden. Dazu wurde die neue Firmware dragino-lgw–v5.4.1628078462-squashfs-sysupgrade.bin eingespielt. Von früheren Updates habe ich gelernt, dass es meist gut ist die checkbox Preserve Settings anzuklicken, damit man nicht alle Einstellungen wieder durchführen muss. Nach dem Update war es mir jedoch nicht möglich den neuen TTN V3 Server auszuwählen. Ein Reset to factory defaults und das Nachziehen der Einstellungen (statische IP, etc.) hat dann aber das gewünschte Ergebnis gebracht.

TTN V3 Console

Der nächste Schritt war das Löschen des Gateways auf der TTN V2 Console und das Eintragen des Gateways auf der TTN V3 Console (https://eu1.cloud.thethings.network/console), was schnell und einfach geht.

Danach mussten die einzelnen LoRa Nodes portiert werden. Die 3 Dragino LHT65 Geräte sind kein Problem, da es dafür bereits vorbereitete Templates gibt. Da ich später die Daten über MQTT ins OpenHAB hole, ist es praktisch für jeden Sensor eine eigene Applikation anzulegen mit genau einem Device. Das gleiche habe ich dann für den Dragino LSN50v2 gemacht, auch für diesen gibt es ein Template. Beim Vicotee Aurora XDLSN3 schaut das schon anders aus, für ihn gibt es kein Template, d.h. man muss alles manuell eingeben.
Sinnvollerweise habe ich gleich einmal die Namensgebung der Applikationen und der Devices überarbeitet, die waren bei TTN V2 von mir schlecht vergeben worden.

Damit die Nodes sich jetzt im TTN V3 anmelden muss man sie zuerst einmal aus dem TT V2 löschen. Der Trick einfach die Application ID zu ändern geht nicht mehr, da seit 1. Juli 2021 alles im TTN V2 auf read only gesetzt wurde. Daher löschen. Nicht vergessen die Payload Decoder java-scripts zu sichern, denn die braucht man ja wieder im TTN V3, zumindest teilweise.

LoRa Nodes rejoin

Nachdem also alle Nodes im V3 angelegt und im V2 gelöscht wurden, bedarf es einem Reset der Nodes, damit sie sich versuchen neu anzumelden, was sie dann auch im V3 machen. Bei den LHT65 recht einfach, da diese einen Taster haben, der von außen zu drücken ist (länger als 3 Sekunden). Der Vicotee Sensor kann mittels eines Magneten von außen bedient werden, nur der LSN50v2 muss aufgeschraubt werden, Power Jumper runter, warten, wieder rauf und wieder zuschrauben.

In der TTN V3 console sieht man bei den Live Data Einstellungen die Nachrichten, die geschickt werden. Die Draginos haben auch einen Payload Decoder, der jetzt Payload Formatter heißt, automatisch installiert, d.h. man sieht sofort die gelieferten Sensordaten. Beim Vicotee musste ich den Code erst einfügen. Damit man nicht allzu viel anpassen muss, kann man den alten Code einfach verwenden und dann folgendes Programm am Ende hinzufügen.

... 
// alter Decoder Code
...

function decodeUplink(input) {
  var data = input.bytes;
  var valid = true;

  if (typeof Decoder === "function") {
    data = Decoder(data, input.fPort);
  }

  if (typeof Converter === "function") {
    data = Converter(data, input.fPort);
  }

  if (typeof Validator === "function") {
    valid = Validator(data, input.fPort);
  }

  if (valid) {
    return {
      data: data
    };
  } else {
    return {
      data: {},
      errors: ["Invalid data received"]
    };
  }
}

Wenn die Nodes ihre Daten senden (5 bis 15 min. Intervall) sollte man im Live data Fenster die Sensordaten sehen.

OpenHAB

Um die Werte mittels MQTT nach OpenHAB zu bekommen, muss bei den Integrationen auf der MQTT Seite ein API Key erzeugt werden, der als Passwort dient. Den Key sofort kopieren und abspeichern, denn sobald man diese Seite einmal verlassen hat, kommt man nicht mehr an diesen Key ran. User und Passwort brauchen wir im OH für die Definition der MQTT Bridge.

Bridge mqtt:broker:TTNV3_LSNv2_1 "MQTT Broker TTN V3 LSN50v2-1" 
[ host="eu1.cloud.thethings.network", 
  secure=true, 
  port=8883, 
  clientID="iot-antoni-lsn50v2-1", 
  username="username aus TTNV3", 
  password="Generierter API Key aus TTNV3"]

Wie gesagt, für jede Applikation im TTN V3 wird eine eigene MQTT Bridge angelegt. Auch die einzelnen Channels müssen überarbeitet werden, da die topics jetzt anders heißen und man auch die transformationPattern anpassen muss. Am besten man nimmt sich das Programm mqtt.FX, oder ein ähnliches, her und baut eine Verbindung zum TTN V3 MQTT Broker auf. Folgendes topic muss subscribed werden

stateTopic= "v3/iot-antoni-lsn50v2-1@ttn/devices/+/up"

Um nun den richtigen JSON Path für das tranformationPattern zu bekommen, eignet sich fas Programm JSONPath Online Evaluator gut. Dort die payload aus dem mqtt.FX reinkopieren und dann den richtigen JSON Path zusammenbauen. Hier die Beispiele für meine Sensoren.

// Dragino
transformationPattern="JSONPATH:$.uplink_message.decoded_payload.ILL_lx"
transformationPattern="JSONPATH:$.uplink_message.decoded_payload.TempC_SHT"
...
transformationPattern="JSONPATH:$.uplink_message.rx_metadata[0].time"

// Vicotee
transformationPattern="JSONPATH:$.uplink_message.decoded_payload.payload.sensors[*].measurements[?(@.key=='TEMPERATURE')].values[0]
transformationPattern="JSONPATH:$.uplink_message.decoded_payload.payload.sensors[*].measurements[?(@.key=='HUMIDITY')].values[0]
...
transformationPattern="JSONPATH:$.uplink_message.rx_metadata[0].time"

Damit heißt es noch die entsprechenden Items in OH anzulegen bzw. anzupassen und natürlich auch die sitemaps, rules, persistence, etc.

Tipps & Tricks

ACHTUNG: Sobald man an den TTN MQTT things im OH etwas ändert und abspeichert, muss man OH neu starten. Ein restart hilft nicht immer. Besser ist folgende Sequenz

sudo systemctl stop openhab
sudo openhab-cli clean-cache
sudo systemctl daemon-reload
sudo systemctl start openhab

Fazit: Das Ganze ist doch ein gewisser Aufwand, aber ich hab die Gelegenheit genutzt die Namensvergabe zu überarbeiten und damit besser für zukünftige Erweiterungen gerüstet zu sein. Schlussendlich funktioniert jetzt wieder alles perfekt und ist am neuesten Stand.

  1. Rene says:

    Jetzt habe ich diese Anleitung gefunden und den Code noch einmal umgestellt:
    Bridge mqtt:broker:ttn „MQTT Broker TTN“ [host=“eu1.cloud.thethings.network“, port=“1883″, secure=false, username=“xxx@ttn“, password=“xxxx“, clientID=“oh3ttn“, enableDiscovery=false]
    {
    Thing topic lora „lora“ [ stateTopic=“v3/xxx@ttn/devices/+/up“ ] {
    Channels:
    Type number : LORA_WAN_TMP „LORA-WAN-TEMP“ [ transformationPattern=“JSONPATH:$.uplink_message.decoded_payload.temperature“ ]
    Type number : LORA_WAN_HUM „LORA-WAN-HUMI“ [ transformationPattern=“JSONPATH:$.uplink_message.decoded_payload.humidity“ ]
    }
    }

    Den JSON Text habe ich aus MQTTLens. Es werden keine Fehler angezeigt und alle Objekte sind Online. Aber Daten kommen leider immer noch nicht an. Ein Neustart hat keine Änderung gebracht. Was mache ich falsch?

    1. peter says:

      Servus, also im xxx.things file muss es folgendermaßen lauten:
      Bridge mqtt:broker:ttn „MQTT Broker TTN“ [host=“eu1.cloud.thethings.network“, port=“1883″, secure=false, username=“xxx@ttn“, password=“xxxx“, clientID=“oh3ttn“, enableDiscovery=false]
      {
      Thing topic lora „lora“ {
      Channels:
      Type number : LORA_WAN_TMP „LORA-WAN-TEMP“ [stateTopic=“v3/xxx@ttn/devices/+/up“, transformationPattern=“JSONPATH:$.uplink_message.decoded_payload.temperature“ ]
      # hier noch weitere channels
      }}

      # im item file dann so:
      Number LORA_WAN_TMP „Beschreibung“ {channel=“mqtt:topic:lora:LORA_WAN_TMP „}

      Du kannst auch mit tools wie MQTT.fx oder MQTT Explorer schauen, ob bei den topics, die du angegeben hast, wirklich Infos bekommst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Begin typing your search above and press return to search. Press Esc to cancel.