We leggen graag uit hoe je de data van onze stadssensoren zelf ook kunt gebruiken. Deze uitleg vind je op onze pagina: https://junioriot.nl/burgernetwerken-data-explained/

De meeste sensoren horen bij ons Smart City project voor de Kanaalzone in Alkmaar: https://junioriot.nl/burgernetwerken/

Op deze pagina ontwikkelen we onze planning en taken voor de migratie van V2 naar V3 in TTN.

medio 2021: Overstap van The Things Network V2 naar The Things Stack Community Edition

(juli 2021)

In 2020 zien we dat The Things Network is geëvolueerd naar een robuust wereldwijd netwerk. Technische mogelijkheden in het netwerk groeien. De software en hardware van de sensoren wordt telkens krachtiger, waardoor meer requirements in het Lora protocol worden opgenomen. Een update is nodig en wenselijk om het verkeer meer de-centraal en meer efficient af te handelen, en om de nieuwe features te implementeren. Een technologie-update is daarmee nu wenselijk. De gratis community versie en de niet-gratis versie van TTI evolueren in hetzelfde ritme.

In 2020 is de migratie van de bestaande V2 versie naar V3 aangekondigd. Gebruikers moeten hiervoor in 2021 de devices en de gateways migreren. De data afhandeling via de V2 route zal eind 2021 eindigen.

Keuze: De meeste V2 sensoren te migreren zonder deze aan te raken (indien mogelijk)

(juli 2021)

Het meest stabiele migratiepad omvat het aanmaken van een nieuwe V3 app omgeving in de V3 TTN console, het implementeren van nieuwe firmware voor de sensors volgens de nieuwe Lora en V3 requirements, en dan elke sensor te voorzien van deze nieuwe firmware. De officiële supportdocumentatie ondersteunt deze route. Bekijk vooral de film op: https://www.thethingsnetwork.org/docs/the-things-stack/migrate-to-v3/

Voor ons is dit migratiepad wat onhandig. De sensors in het veld zouden in dat geval  teruggehaald moeten worden, en we willen dit liever niet om de communicatie overhead en kostenpost te voorkomen. In de blogs en chats in de TTN community zien we dat andere gebruikers inmiddels al ervaring hebben met een alternatieve route, en we vinden we in deze onofficiële kanalen een goede uitleg voor een alternatieve aanpak.

We kiezen daarom voor een migratiepad waarbij we de (meeste) bestaande sensoren mee migreren zonder deze aan te raken. Het succes hangt er van af in hoeverre de in onze regio aanwezige gateways het V2 dataverkeer naar onze nieuwe V3 backbone zullen doorgeven. We zullen de migratie eerst inzetten met slechts enkele test sensoren om te zien in hoeverre dit gaat werken.

Technisch gezien betekent dit dat we een nieuwe V3 app aanmaken, en daarin handmatig de eerste (één of twee) registraties overnemen van bestaande V2 sensoren. Let op: bij eerste keer moeten de gegevens juist en volledig worden overgenomen; voor bepaalde gegevens heeft ‘terug en edit’ niet het juiste effect. De V2 registratie van betreffende sensor wordt gesaboteerd door het laatste teken van de APP code of Dev code (zie instructie) met één te verhogen; zo kunnen we de registratie van betreffende device nog herstellen. Zodra we data zien binnenkomen, zullen we ook een nieuwe  integratie opbouwen met de AWS API (V2 en V3 compatible data component) en de data laten instromen in de (originele V2 versie van de) S3 opslag.

Vraag: Zijn we verplicht om de V2 gateways in leven te houden, of gaat onze omgeving met V2 en V3 sensors op een V3 app ook werken met alleen V3 gateways?  —> we onderzoeken deze vraag door, zodra nodig, een V3 gateway toe te voegen. Zo stappen we over op een mix

(oktober 2021)

In de laatste maanden hebben we ontdekt dat de device-upgrade-zonder-aanraken prima mogelijk is. De registratie halen we dan weg uit de oude V2 app in de TTN V2 console, voegen we toe aan onze nieuwe app definitie in de V3 conzole. Belangrijk: na dit herconfigureren wordt de data alleen in de V3 app ontvangen indien er een V3 gateway is om inderdaad de data te ontvangen. Dit betekende dat het pas bij ons ging werken nadat we in het bereik van de sensors ook een V3 gateway hadden geplaatst.

Keuze: Eind 2021 een mix van V2 en V3 gateways in Alkmaar

We hebben geen directe toegang tot de meeste gateways in onze regio. We verwachten dat de beheerders binnen de gemeente de V2 gateways niet zullen upgraden naar V3, tenzij wij daar dringend om vragen. We zijn benieuwd of de gatweays met V2 firmware ook in de toekomst zullen blijven functioneren.

We lezen dat de V3 gateways de ontvangen data niet zullen doorgeven aan bestaande V2 applicaties. Daarmee is het verstandig om alle lopende applicaties in een regio te migreren naar V3 alvorens de bestaande V2 gateways naar V3 te migreren. Zelf hebben we een aantal gateways op reserve met welke we op korte termijn een aanvullend V3 netwerk kunnen inrichten; we moeten dan nog op zoek naar werkbare opstelpunten.

Vraag: Zijn we verplicht om de V2 gateways in leven te houden, of gaat onze omgeving met V2 en V3 sensors op een V3 app ook werken met alleen V3 gateways?

Vraag: We kunnen wellicht niet alle gateways updaten. Blijven de V2 gateways functioneel? Zal in de toekomst de ontvangen V2 en V3 data via packet broker blijven doorstromen naar de V3 applicaties?

(oktober 2021)

We ontdekken dat de v3 gateway nodig is om data te ontvangen in de v3 app. Volgens de berichtgeving lijkt het erop dat de v2 gateways zullen blijven werken, en zullen data via packetbroker doorspelen; het is ons niet duidelijk hoe dit werkt en waar dit nut heeft.

Ons scenario is dat we vanuit de bewoners in eigen beheer (of waar mogelijk in overleg met gemeente) een aantal v3 gateways zullen realiseren.

Voor de gateways die via de gemeente zijn geplaatst (kerlink devices op Stadskantoor, Telefooncentrale, Sportcentrum de Meent) wachten we eerst onze eigen resultaten af. We bieden onze diensten aan om middels swap/update deze gateways te vervangen (mogelijk te vervangen door de Lorix-one gateways). Het gesprek met de gemeente, die onze data gebruikt, zal duidelijker en daarmee makkelijker worden zodra de v2 functionaliteit wordt uitgeschakeld.

Keuze: Onze V3 data packages maken we V2 backwards compatibel

De JSON data berichten welke in de datapipeline ontvangen, zullen in V3 een ander dataformat hebben dan in V2. Onze V2 TTN applicatie slaat de data betichten op in AWS S3, waarna deze wordt opgehaald door onze weergave applicatie voor grafieken. Deze grafiek software is ingericht om specifieke JSON velden te lezen volgens de V2 definitie.

Ook de datapipeline van de Azure omgeving van Gemeente Alkmaar is ingericht om onze data te lezen uit de JSON velden volgens de V2 definitie. De implementatie van dit gedeelte van de datapipeline is gerealiseerd door een scrum-team welke middels een aanbesteding voor een specifieke periode is aangetrokken. Op dit moment zijn betrokken developers niet aanwezig, en het aantrekken van een nieuw team zal veel tijd (en geld) kosten.

We kiezen ervoor om de V3 data (voorlopig) ook V2 compatibel op te slaan. Dit kost extra resources in AWS en in de datapipeline. Middels een TO DO notitie herinneren we ons eraan dat de V2 versie zal worden uitgefaseerd. We mogen stellen dat we verwachten dat downstream processen binnen een jaar zijn omgebouwd naar V3 (we schrijven dit in juli 2021). We testen de haalbaarheid van deze ombouw later via onze eigen grafiek implementatie.

TO DO – De backwards V2 compatibiliteit in de S3 datastore in AWS is slechts tijdelijk. De downstream dataverwerking zal moeten overschakelen naar de V3 data om een blijvende verstoring in de dataflow te voorkomen. Doelstelling: ombouw van downstream processen gereed per juni 2022.

(oktober 2021)

De data van de v3 devices stroomt nu nog eerst naar een separate datapool. Deze data zal na een visuele controle bijgevoegd worden aan dezelfde datapool waar de v2 sensoren hun data afleveren, en welke locatie door de gemeente wordt uitgelezen. Deze omzetting is nog gaande.

Keuze: tot bijna een jaar V2 + V3 overlap voor Big Data verwerking

Zolang de opgeslagen databetichten compatibel zijn met V2 én V3 tegelijk, kan een Big Data uitvraging over deze berichten volgens het oude format alsook het nieuwe format gebeuren. De downstream data verwerker kan daardoor een eigen keuze maken over de uitvrating van historische data in analyses.

Vraag: Wordt in de Azure datapipeline de nieuwe data voldoende verwerkt? Werkt de V2 compatibiliteit, en komt ook de V3 versie correct aan in de Azure data opslag?

(oktober 2021)

Over de overlap periode doen we in 2021 nog geen verdere uitspraken, anders dan dat we in 2022 deze overlap willen uitfaseren. Downstream partijen (onze grafiek, Azure data van gemeente) zullen zich daarop moeten voorbereiden.

Tijdlijn van de V2-V3 migratie

Juli 2021 – strategie en aanpak

In The Things Network is de V3 versie nu geruime tijd beschikbaar. De community blogs geven duidelijke stappen, welke goed zijn aangepast naar de eerdere ervaringen. We kunnen nu de stappen en strategie van onze migratie vormgeven; zo zijn bovengenoemde uitgangspunten ontstaan.

In de V2 omgeving kunnen vanaf juli 2021 al geen nieuwe sensors worden toegevoegd.

Inlezen –

Augustus 2021 – Nieuwe V2-V3 App aanmaken in V3 voor de V2 devices

We maken een nieuwe app aan. Dezelfde toegangsrechten, dezelfde users als de V2 app. Hier zetten we de devices welke nog draaien op V2 firmware en sessies.

In https://eu1.cloud.thethings.network/console/ zie ik bij ‘applications’ dat de lijst nog leeg is. We kijken inderdaad naar de nieuwe V3 console. Dit herken je ook aan het logo links boven “The Things Stack, Community Edition”.

We maken een nieuwe app voor de devices die we van V2 naar V3 willen migreren.

We voegen collaborators toe. Hiervoor nemen we de belangrijkste collaborator namen over uit onze bestaande applicatie ‘bvhva-samenmeten’ in de V2 console: https://v2console.thethingsnetwork.org/

In deze app zullen we de devices verzamelen die nog zijn ingeregeld volgens de V2 keys. De registratie van deze devices in V3 is non-standaard, en dit houden we in de gaten middels deze app naam.

TO DO: In de bestaande V2 app bebben we toegang gegeven middels enkele access keys. De default key gebruikten we voor excel integratie, de key ”rivm_read’ voor de integratie vanuit RIVM. Moeten we deze overzetten naar het tabje ‘API keys’ in V3? Hoe gaat dit werken?

(oktober 2021)

De v3 app “burgernetwerken-alkmaar-v2-v4” draait in de nieuwe console. Enkele test devices zijn aangemaakt, cq gemogreerd. De binnenkomende data wordt succesvol doorgestuurd naar onze AWS api.

In de v3 console hebben we een nieuwe “rivm_read” API key aangemaakt. Derko bij RIVM bevestigt dat hij data ziet. Integratie met RIVM kaart voltooien zij in oktober/november.

Augustus 2021 – Nieuwe V3 App aanmaken voor nieuwe V3 devices

In 2021 zullen we de V3 devices voorlopig nog toevoegen aan de v2-v3 app, dus we maken nog geen extra applicatie aan.

Augustus 2021 – Overleg community grenzen gratis of betaald

Online documentatie geeft aan dat de gratis community versie geschikt is voor 30 devices, 3 users en 3 gateways. Dit heet the things stack discovery. https://accounts.thethingsindustries.com/fee-calculator

De kostendrempel is pittig. We menen dat we onze community sensors eerst implementeren in de discovery stack. We zullen moeten onderzoeken hoe de genoemde grenzen worden gerekend. Zodra onze inzet is gericht op commerciële trajecten in plaats van community/burgernetwerken is het zeker nodig om over te stappen naar de betaalde versie.

Keuze: we beginnen met de gratis versie in de cloud.

TO DO – welke scenario’s zijn er, wat is daarin toegestaan, en in hoeverre voldoen wij daaraan? –> we zullen dit as-it-happens ontdekken

Augustus 2021 – V2 proof of concept – één of twee bestaande ABP devices Lora32u4 migreren zonder deze aan te raken

Onze sensors volgen ABP V2, hardcoded adressen in de firmware met een ouderwetse micro lora stack. Ze luisteren niet naar downlinks. De Arduino libraries hebben we in 2016/2017 ontwikkeld voor de Arduino Pro Mini met de RFM95; en later de Lora32U4 II. Dit ontwerp was voor ons succesvol genoeg om dit tot heden (2021) in stand te houden.

In deze stap migreren we de devices zonder de devices aan te raken. Dit betekent dat de firmware niet verandert, en dus ook niet de ingebakken ABP keys. In TTN termen heet dit dat de bestaande sessie middels de TTN console wordt overgezet naar V3.

Er is geen officiële ondersteuning voor deze vorm van migratie, omdat deze niet wordt aanbevolen. Maar het forum geeft wel een duidelijke instructie, welke is opgesteld en getest door de gebruikers in de community. Wij volgen dan ook deze instructie: https://www.thethingsnetwork.org/forum/t/how-to-migrate-abp-devices-from-v2-to-v3/43705/1

Binnen die set van instructies kiezen we het pad wat bij ons past. We volgen de not-recommended route van de bestaande ABP keys. We hebben relatief weinig devices, en we zien graag precies wat we doen, we gebruiken daarom geen migratie script, maar stellen alles handmatig in.

Let op: de gegevens moeten meteen in de eerste keer dat we de gegevens invullen volledig en juist zijn; een aantal velden laat zich niet goed aanpassen middels terug/edit. Dit komt doordat bij eerste aanmaak de gegevens naar de V2/V3 broker gaan?

Dit is voor ons nog erg experimenteel. Er is een kans op fouten. We kiezen daarom als eerst voor die devices waarvoor we toch al het plan hebben ze eerdaags uit het veld op te halen en te herbouwen.

  • TO DO: alleen middels configuraties in de TTN consolde, één of twee bestaande devices overzetten. Devices worden niet aangeraakt, niet gereboot, niet her-geprogrammeerd.
    • Onze testdevices: alkmaar_meten001, alkmaar_meten002 en alkmaar2021-011 gebruiken we als proof-of-concept voor de V2 naar V3 sessie migratie
    • Dit is een migratie zonder de devices te rebooten, of van nieuwe software of settings te voorzien
    • Pas nadat het succes van de migratiestappen is bevestigd en gedocumenteerd, zijn deze devices weer beschikbaar voor andere tests.

Over te zetten device: alkmaar_meten001

In de V2 console zien we de details van ons device. Ik zie in de console de framecounter waarde van 58247, dit getal wordt zichtbaar elke 4 minuten met 1 opgehoogd.

Overigens, op onze kaart http://junioriotchallenge.nl/game/ kan je dit device vinden in het centrum van Alkmaar. Ik zie een databericht, de grafiek pagina, en een uitgebreidere log file voor vandaag (8 augustus 2021). De timestamp van het laatste bericht in de logfile is op het moment dat ik daarnaar kijk nu 13:15.

In de V2 console zien we onze details voor het device alkmaar-meten001. Kopieer deze naar bijvoorbeeld notepad. Om mijn waardes geheim te houden heb ik hier de laatste twee posities vervangen door zz:

  • Device EUI 00636F800B004Bzz
  • Application EUI 70B3D57ED0015Bzz
  • Device Address 260119zz
  • Network Session Key A4E6A3E5D40FC49E9311C3293366F8zz
  • App Session Key A7CBACECF26AC7C8D380E3504A421Fzz
  • Example Code
    const char *devAddr = “260119zz”;
    const char *nwkSKey = “A4E6A3E5D40FC49E9311C3293366F8zz”;
    const char *appSKey = “A7CBACECF26AC7C8D380E3504A421Fzz”;

In de V3 console kiezen we bij End Devices voor ‘Add new device’. Negeer de repository (waar je een merk en type kunt kiezen) en kies de optie ‘Manually’.

  • LoraWanVersion, kies de V2 default: MAC V1.0.2  (idee: ook proberen met MAC V1.0)
  • Regional Parameters version, kies de V2 default: PHY V1.0.2.REV B (bij MAC V1.0 is er geen keuze)
  • Frequency plan, in Nederland kies je: Europe 863-870 MHz (SF9 for RX2 – recommended).
  • Open ‘advanced activation’ –> The Advanced settings must be set on registration –> dus meteen bij het aanmaken van het device, niet later.
    • Activation mode, we kiezen: ABP
    • Additional LoraWAN Class Capablities, kies: None (class A only)
    • Network defaults: Unselect Use network’s Rx and frequency defaults, meer opties worden zichtbaar:
  • Network defaults:
    • Rx1 data rate offset: 0
    • Rx1 delay: 1  (Rx window delay in V2 is 1 seconde, maar we gebruiken eigenlijk geen Rx)
    • Rx2 data rate: 3
    • Rx2 frequency: 869525000
    • Factory preset frequencies, maak 8 invulvelden:
      • 868100000
      • 868300000
      • 868500000
      • 867100000
      • 867300000
      • 867500000
      • 867700000
      • 867900000
  • Cluster settings: niet selecteren

 

  • DevEUI (in de uitleg noemen ze dit optional) – the hardware key printed on device – exactly your V2 value: 00636F800B004Bzz
  • Device Address DevAddr – exactly your V2 value: 260119zz
  • AppSKey – exactly your V2 value: A7CBACECF26AC7C8D380E3504A421Fzz
  • NwkSKey – exactly your V2 value:  A4E6A3E5D40FC49E9311C3293366F8zz
  • End device ID, mag je zelf een nieuwe waarde voor invulen: alkmaar-meten001-v2

Registreer je device. Bekijk de device status.

Op dit moment kan er nog geen data binnenkomen.

V2 device registratie uitschakelen/saboteren.

In de V2 console komt in mijn geval nu bij het device geen data meer binnen.

In plaats van de device te verwijderen uit de V2 console gebruiken we deze tip: “What works best for me is to change the device’s NWSkey in V2 to disable the device in V2. (changing only the last byte is already sufficient).”

  • In de V2 console, dit device, settings verander je de NWSkey: ik verander het laatste cijfer door er één bij op te tellen. Zo kan je de registratie nog herstellen.

Na deze aanpassingen hoop ik in de V3 console data te zien. De packetbroker zou vanaf nu de berichten vanuit de V2 gateways naar de V3 omgeving moeten doorsturen.

Helaas – de data komt nog niet binnen.

Onze logfile in V2 toont als laatste timestamp nu 14:26. De laatste 20 minuten hebben we dus geen nieuwe data gezien. We moeten nu de registratie verder oplossen.

    • het device is binnen het bereik van de V2 gateways. Er zijn in Alkmaar ook V3 gateways, maar niet echt binnen bereik van dit device. We denken dat het via de V2 gateways zou moeten werken
    • hebben we een fout gemaakt met de registratie?
    • moeten we gewoon meer geduld hebben?

We willen eerst deze stap met succes afronden voordat we verder gaan met de verdere migratie onderdelen. (de video vertelt in V2 console bij het device een nieuwe app key te genereren)

Pogingen:

  • in V2 console: nwskey, appskey en devEUI laatste twee cijfers nu op 00
    • –> error, kan niet saven vant V2 is nu read-only
  • in V2 console: device deleted
    • –> paar minuten wachten of data binnenkomt
  • in V3 console: 16 bit frame counter, allow reset frame counter
  • in V3 console: onze decoder overgenomen, met lichte aanpassingen in de wrapper
  • in v3 console: 32 bit frame counter (zoals bij werkende nieuwe lora32u4)

Nog steeds geen data. Verdere ideeën:

  • in v3 console: 32 bit frame counter (zoals bij werkende nieuwe lora32u4)
  • bij aanmaken (kan nu niet meer): LoraWanVersion, kies de oudste/laagste setting: MAC V1.0

(oktober 2021)

De oplossing bleek vrij simpel. Om de data voor de v3 app goed te ontvangen was een v3 gateway nodig. Nadat Leo één van onze Lorix-one gateways had voorzien van nieuwe firmware, en geregistreerd had in onze console, kwam de v3 data soepel binnen.

Augustus 2021 decoder aanmaken in V3

De instructie video vertelt hoe je jouw bestaande V2 decoder kunt gebruiken.

  • We kopieren de V2 decoder naar de V3 console. Er is één extra regel nodig, en de wrapper is iets anders. Nadat we een nieuwe device toevoegen zien we dat onze nieuwe decoder werkt.

(oktober 2021)

De data blijft doorlopen, wordt tot oktober 2021 opgeslagen op een aparte locatie, zodat deze nog niet inloopt op onze grafieken en die van gemeente Alkmaar.

Augustus 2021 – nieuwe Lora32u4 sensoren toevoegen aan V3

Leo heeft op 8 augustus een eerste device voorzien van onze software, en heeft deze succesvol aan de V3 console toegevoegd.

In de V3 console kiezen we bij End Devices voor ‘Add new device’. Negeer de repository (waar je een merk en type kunt kiezen) en kies de optie ‘Manually’.

  • LoraWanVersion, kies de V2 default: MAC V1.0.2 (idee: bij volgende poging kiezen voor oudste/kleinste versie MAC V1.0)
  • Regional Parameters version: PHY V1.0.2.REV A
  • Frequency plan, in Nederland kies je: Europe 863-870 MHz (SF9 for RX2 – recommended).
  • Open ‘advanced activation’
    • Activation mode: ABP
    • Additional LoraWAN Class Capablities, kies: None (class A only)
    • Network defaults: Unselect Use network’s Rx and frequency defaults, meer opties worden zichtbaar:
  • Network defaults:
      • Leo heeft alle velden leeg gelaten om de defaults te handhaven
  • Cluster settings: niet selecteren

 

  • DevEUI (in de uitleg noemen ze dit optional) : klik ‘generate’ en noteer de waarde
  • Device Address (DevAddr) : klik ‘generate’ en noteer de waarde
  • AppSKey : klik ‘generate’ en noteer de waarde
  • NwkSKey : klik ‘generate’ en noteer de waarde
  • End device ID, mag je zelf een nieuwe waarde voor invulen; Leo kiest: test-v3-stack

Registreer je device. Bekijk de device status in de V3 console. Data komt nog niet binnen.

Neem de genoteerde keys over in je ABP settings van de software op je Lora32u4 device. Programmeer deze in je device.

Bekijk de device status in de V3 console. We zien data, en we zien nu ook dat onze decoder werkt. De live data zien we alleen op de momenten dat we de v3 console live in de browser open hebben, en anders zien we een ‘Network Error’ en  ‘stream reconnected’ melding. Als het werkt zoals V2 dan verwachten we een betere ervaring door het aanzetten van storage integration.

(oktober 2021)

We zien in oktober 2021 in de v3 console de volgende actieve sensor devices:

  • alkmaar2021-011-v2
  • alkmaar-meten001-v2
  • alkmaar-meten002-v2

Augustus 2021 – storage integration aanzetten

Bij de integration settings van onze nieuwe V3 app:

  • We activeren we met één druk op de knop de storage integration. Hiermee zien we in de console de device data zien, ook van de momenten dat we de console niet actief in de browser hebben.

Augustus 2021 – in Amazon nieuwe AWS API aanmaken volgens V3

Nieuwe API aanmaken, code vanuit bestaande overnemen. Alle game implementatie verwijderen.

De nieuwe API ontvangt dan alleen V3 data. Aan het opgeslagen databericht voegen we de backwards-compatible V2 data eilanden toe.

TO DO: nieuwe AWS API aanmaken, op basis van bestaande API code. Game functies mogen verwijderd worden. Locatie en werking van S3 dataopslag verandert niet.

 

Hoe ziet ons landschap in Amazon eruit? In TTN V2 hebben we geconfigureerd naar welk HTTP adres de berichten worden geforward:

  • In de V2 applicatie zien we een HTTP integratie bij onze app bvhva-samenmeten.
    • Url: https://a8gd4bvizz.execute-api.eu-west-1.amazonaws.com/prod
    • Method: PUT
    • Authorization: zz
    • Custom Header Name: zz
    • Custom Header Value: zz

In het API overzicht in de AWS console zien we onze aangemaakte V2 API’s, en aan de ID herkennen we welke wordt gebruikt door de V2 integratie – https://eu-west-1.console.aws.amazon.com/apigateway/main/apis?region=eu-west-1

  • Name: pushNewTtnMessage_api
  • ID: a8gd4bvizz
  • Protocol: REST
  • Endpoint type: Edge
  • Created: 2017-11-22
  • De Any, get en Put resources zijn geconfigureerd om de berichten door te geven aan Lambda: pushNewTtnMessage

De Lambda functie welke gebruikt wordt voor onze AWS API voor de V2 integratie:

  • De naam van de Lambda functie: pushNewTtnMessage
  • runtime nodejs6.10 is depricated
  • de code
    • leest environment variables
    • leest datum/tijd uit ontvangen content
    • bepaalt pad en filenaam vanuit ingestelde environment variables en datum/tijd
    • schrijft de ontvangen content naar een file in S3
  • environment variables
    • dailyAggregatePath ttn_data/daily/
    • defaultApp app=junioriot2017test
    • hardcodedPassword zz (de werkelijke waarde wordt hier niet gepubliceerd)
    • s3bucket junioriotchallenge.nl
    • storagePath ttn_data/ttn_messages_partitioned/
    • testPath ttn_messages_test/

We maken een nieuwe Lambda functie:

  • Kies: Author from scratch
  • Function Name: pushNewTtnMessage-v3
  • Runtime, kies de nieuwste Node.js: Node.js 14.x
  • Permissions: niet aanpassen, dat doen we later wanneer we triggers toevoegen
  • Advanced settings: niet aanpassen
  • Create function
  • index.js
    • code copy/pasten vanuit v2 versie [TO DO: code hier invoegen]
    • klik bovenaan de editor op ‘deploy’
  • Configuration / Environment variables, toevoegen:
    • dailyAggregatePath ttn_data_v3test/daily/  (later veranderen we het pad)
    • defaultApp app=test_v3
    • hardcodedPassword zz (de juiste waarde overnemen uit de V2 versie)
    • s3bucket junioriotchallenge.nl
    • storagePath ttn_data_v3test/ttn_messages_partitioned/  (later veranderen we het pad)
    • testPath ttn_messages_test/
  • Function overview /add trigger
    • trigger gonfiguration / select a trigger: API Gateway
    • API: Create an API
    • API Type: REST API
    • Security: Open
    • Additional settings
      • API name, laten staan op: pushNewTtnMessage-v3-API
      • Deployment stage, laten staan op: default
      • Enable metrics and error logging: on
    • Add

We stellen de memory en time-out settings voor de nieuwe Lambda functie in zodat ze gelijk zijn aan de oude versie. Memory 128 MB en timeout 0 minuten en 10 seconde.

 

Onze nieuwe API voor V3 integration om in TTN V3 te gebruiken is nu:
API endpoint: https://85mi4dcrzz.execute-api.eu-west-1.amazonaws.com/default/pushNewTtnMessage-v3 (vervang zz door de echte waarde)

Controle of deze api echt bestanden schrijft naar S3

  • Lambda / pushNewTtnMessage-v3 / Code / test /kies je eerder aangemaakte test event, maar deze is er niet, dus nu kies: new event
    • template: Amazon API Gateway AWS Proxy
    • name: test1
    • bericht: overnemen van de test van de V2 app, datums aanpassen
    • save deze test
    • Klik de oranje button: Test
    • Na completeren van de test, bekijk de test results
      • Execution result: succeeded
      • Resources configured: 128 MB, used 90 Mb
      • Log output: lange tekst, waatin ook de file save locatie. junioriotchallenge.nl/ttn_messages_test/app=junioriot2017testzz/y=2021/m=08/d=06/2021-08-06 00.01.17.46070.txt
    • Controle of nieuwe file bestaat:
      • Geen resultaat op: http://junioriotchallenge.nl/ttn_messages_test/app=junioriot2017testzz/y=2021/m=08/d=06/2021-08-06%2000.01.17.46070.txt
      • In de AWS S3 console blijkt het nieuwe pad niet aangemaakt. –> rechten te controleren

De nieuwe Lambda functie is nog niet in staat om de S3 file te schrijven. Permissions controleren.

We bekijken de permissions in onze V2 functie: Lambda / pushNewTtnMessage / Configuration / Permissions

  • Execution Role: PushNewTtnMessage aanklikken om naar IAM pagina te gaan:
    • Role description: can save in S3 bucket
    • Policies, 2 policies applied:
      • pushNewTtnMessage, policy arn: arn:aws:iam::667242083879:policy/pushNewTtnMessage –> hierin definieert de JSON schrijfrechten naar de specifieke S3 ‘folders’ in onze data store
      • AWSLambdaEdgeExecutionRole-8b9a5bf1-f062-45da-… – hierin cloudwatch toegang

De permissions voor de specifieke S3 ‘folders’ nemen we over naar de nieuwe functie, Lambda / pushNewTtnMessage-v3 / Configuration / Permissions

  • klik op de execution role om naar het IAM scherm te gaan
  • Role description, invullen: Can also write into specific S3 locations
  • Permissions / policies / klik: attach policies
    • gebruik zoekveld om op te zoeken en te selecteren: pushNewTtnMessage
    • klik: attach policy

Opnieuw testen van V3 functie

  • Lambda / pushNewTtnMessage-v3 / Test (negeer het oude resultaat)

De nieuwe Lambda functie is nu in staat om de S3 file te schrijven. S3 triggert de volgende stap in de data pipeline; het omwerken naar V2 compatibele logfile en andere status files.

We hebben in de lambda achter onze nieuwe integratie API een tijdelijke nieuwe locatie ingesteld, om te testen. Het V3 data format is echter anders dan wat we verwachten in de V2 compatible pipeline. We moeten bij deze schrijfactie dus nog eerst de V2 data onderdelen aan het JSON bericht toevoegen. Om te bepalen hoe de nieuwe data er uit ziet, zullen we eerst op de nieuwe, tijdelijke locatie een aantal live data berichten opvangen vanuit de devices in het veld.

Voor deze tijdelijke locatie moeten we nog de juiste toestemming toevoegen aan onze policy.

  • In de policy editor open je de policy pushNewTtnMessage. Maak de volgende aanpassing:

{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["s3:ListAllMyBuckets"],
"Resource": "arn:aws:s3:::*"
}, {
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetBucketLocation"],
"Resource": "arn:aws:s3:::junioriotchallenge.nl"
}, {
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::junioriotchallenge.nl/ttn_messages_test/*"
}, {
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::junioriotchallenge.nl/ttn_data/*"
}, {
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::junioriotchallenge.nl/ttn_data_v3test/*"
}] }

—-

  • save de aangepaste policy

We gaan nu de live data opvangen van onze devices. Let op, deze datafiles zijn nog in V3 format en dus niet geschikt voor onze pipeline. Daarom hebben we een tijdelijke locatie ingesteld in S3, weg van onze productie pipeline.

In de AWS console kiezen we bij de nieuwe API voor deploy

  • Bij de nieuwe API kies je voor actions / deploy api
  • AWS toont de invocation Url: https://85mi4dcrpe.execute-api.eu-west-1.amazonaws.com/default

We voegen de integratie toe aan TTN.

  • Ga naar de V3 TTN console / Applications / Burgernetwerken Alkmaar V2-V3 / Webhooks
  • Kies voor ‘Add webhook’ en dan: custom webhook
    • Webhook ID: data-naar-s3-junioriotchallenge
    • Webhook format: JSON
    • Base url: https://85mi4dcrzz.execute-api.eu-west-1.amazonaws.com/default/pushNewTtnMessage-v3 (zz vervangen door echte waarde)
    • Base URL: https://85mi4dcrzz.execute-api.eu-west-1.amazonaws.com/default (zz vervangen door echte waarde)
    • Downlink API key: leeg laten
    • Enabled messages: Alleen enablen en geen pad invullen: Uplink message
    • opslaan door te klikken op blauwe knop ‘Add webhook’

Nu proberen we live TTN V3 data te ontvangen in AWS S3

In de TTN V3 console kijken we nu naar de tab voor live data voor deze app. Zodra er een bericht binnenkomt kijken we of deze in AWS wordt ontvangen. Daarvoor kijken we naar:

  • AWS console / Lambda / Functions  / pushNewTtnMessage-v3 / Logs
  • We zien de log entry van onze eerdere test. We drukken af en toe op refresh, en we wachten af of er een nieuwe entry bijkomt. Dit kan even duren omdat betreffend device niet iedere 4 minuten een succesvolle verzending doet.

Tevens kijken we of er in de S3 console een nieuwe folder/file is ontstaan.

We ontvangen een real-live V3 pakket. https://s3.eu-west-1.amazonaws.com/junioriotchallenge.nl/ttn_data_v3test/ttn_messages_partitioned/app%3Dtest_v3/y%3D2021/m%3D08/d%3D10/2021-08-10+16.49.52.124.txt

 

—-

{
"resource": "/pushNewTtnMessage-v3",
"path": "/pushNewTtnMessage-v3",
"httpMethod": "POST",
"headers": {
"accept-encoding": "gzip",
"content-type": "application/json",
"Host": "85mi4dcrpe.execute-api.eu-west-1.amazonaws.com",
"User-Agent": "TheThingsStack/3.14.1 (linux/amd64)",
"X-Amzn-Trace-Id": "Root=1-6112ae2f-0df28f5a4b1c05065caf0201",
"X-Forwarded-For": "63.34.43.96",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https",
"x-tts-domain": "eu1.cloud.thethings.network"
},
"multiValueHeaders": {
"accept-encoding": ["gzip"],
"content-type": ["application/json"],
"Host": ["85mi4dcrpe.execute-api.eu-west-1.amazonaws.com"],
"User-Agent": ["TheThingsStack/3.14.1 (linux/amd64)"],
"X-Amzn-Trace-Id": ["Root=1-6112ae2f-0df28f5a4b1c05065caf0201"],
"X-Forwarded-For": ["63.34.43.96"],
"X-Forwarded-Port": ["443"],
"X-Forwarded-Proto": ["https"],
"x-tts-domain": ["eu1.cloud.thethings.network"] },
"queryStringParameters": null,
"multiValueQueryStringParameters": null,
"pathParameters": null,
"stageVariables": null,
"requestContext": {
"resourceId": "omjhc4",
"resourcePath": "/pushNewTtnMessage-v3",
"httpMethod": "POST",
"extendedRequestId": "D3AneGqSDoEFmDA=",
"requestTime": "10/Aug/2021:16:49:51 +0000",
"path": "/default/pushNewTtnMessage-v3",
"accountId": "667242083879",
"protocol": "HTTP/1.1",
"stage": "default",
"domainPrefix": "85mi4dcrpe",
"requestTimeEpoch": 1628614191618,
"requestId": "6aaaccf1-dcfa-481d-bba6-8bf0b739497d",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"sourceIp": "63.34.43.96",
"principalOrgId": null,
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "TheThingsStack/3.14.1 (linux/amd64)",
"user": null
},
"domainName": "85mi4dcrpe.execute-api.eu-west-1.amazonaws.com",
"apiId": "85mi4dcrpe"
},
"isBase64Encoded": false,
"body": {
"end_device_ids": {
"device_id": "test-v3-stack",
"application_ids": {
"application_id": "burgernetwerken-alkmaar-v2-v3"
},
"dev_eui": "70B3D57ED0043C0F",
"dev_addr": "260BF683"
},
"correlation_ids": ["as:up:01FCRFGTFAD5QQJTWQKFPQQBCP", "ns:uplink:01FCRFGT8RP92MXN73RP6XHT00", "pba:conn:up:01FCN5CYEQPRPNAPPRYMR5WS9M", "pba:uplink:01FCRFGT8K5C4NHVJQGZ4F4PRP", "rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01FCRFGT8R1A0R61PMFNY7WW0F", "rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01FCRFGTF9C3N282RHMXWNY1J5"],
"received_at": "2021-08-10T16:49:51.595967116Z",
"uplink_message": {
"f_port": 1,
"f_cnt": 500,
"frm_payload": "f///f///AqbKAAAAAAAAAAAAAAAAAAAAAAAnEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAK4AAAAAAAAAAAAAAAAAAAAAAAAJxAAAAAAAo4AAA==",
"decoded_payload": {
"BME280_Hum": 0,
"BME280_Press": 0,
"BME280_Temp": 0,
"BME280internal_Hum": -1,
"BME280internal_Press": -1,
"BME280internal_Temp": -1,
"LAT": 0,
"LON": 0,
"Lux": 0,
"P": 0,
"PM10": 0,
"PM25": 0,
"RH": 0,
"T": 0,
"Vbat": 0,
"Vsupply": null,
"arduino_VCC": 0,
"arduino_Vbat": 0,
"arduino_tempCPU": -100,
"bytes_length": 94,
"dB_EQ7_1____63Hz": "-Infinity",
"dB_EQ7_2___160Hz": "-Infinity",
"dB_EQ7_3___400Hz": "-Infinity",
"dB_EQ7_4__1000Hz": "-Infinity",
"dB_EQ7_5__2500Hz": "-Infinity",
"dB_EQ7_6__6250Hz": "-Infinity",
"dB_EQ7_7_16000Hz": "-Infinity",
"dB_Vmic": 0,
"dB_Vmic_ref": 0,
"dB_activated": 0,
"dB_flag": 0,
"dB_levelflag": null,
"dB_samplecount": 0,
"dBa_avg": 0,
"dBa_max": 0,
"dBa_min": 0,
"dBc_avg": 0,
"dBc_max": 0,
"dBc_min": 0,
"dBc_val": 0,
"gps_alt": 678,
"gps_hdop": 20.2,
"gps_lat": 0,
"gps_lng": 0,
"pm10": 0,
"pm25": 0,
"raw_dB_EQ7_1": 0,
"raw_dB_EQ7_2": 0,
"raw_dB_EQ7_3": 0,
"raw_dB_EQ7_4": 0,
"raw_dB_EQ7_5": 0,
"raw_dB_EQ7_6": 0,
"raw_dB_EQ7_7": 0,
"raw_dBa_avg": 0,
"raw_dBa_max": 0,
"raw_dBa_min": 0,
"raw_dBc_avg": 0,
"raw_dBc_max": 0,
"raw_dBc_min": 0
},
"decoded_payload_warnings": [],
"rx_metadata": [{
"gateway_ids": {
"gateway_id": "packetbroker"
},
"packet_broker": {
"message_id": "01FCRFGT8K5C4NHVJQGZ4F4PRP",
"forwarder_net_id": "000013",
"forwarder_tenant_id": "ttnv2",
"forwarder_cluster_id": "ttn-v2-eu-4",
"forwarder_gateway_eui": "008000000000BA5B",
"forwarder_gateway_id": "eui-008000000000ba5b",
"home_network_net_id": "000013",
"home_network_tenant_id": "ttn",
"home_network_cluster_id": "ttn-eu1"
},
"time": "2021-08-10T19:44:56.051889Z",
"rssi": -118,
"channel_rssi": -118,
"snr": -7,
"location": {
"latitude": 52.62452,
"longitude": 4.7743616
},
"uplink_token": "eyJnIjoiWlhsS2FHSkhZMmxQYVVwQ1RWUkpORkl3VGs1VE1XTnBURU5LYkdKdFRXbFBhVXBDVFZSSk5GSXdUazVKYVhkcFlWaFphVTlwU210VlJtaFZaVVZhV0dSWFJuRlVhbHBwVWpCd1QwbHBkMmxrUjBadVNXcHZhVkZWVG5WT1dGcElVMWhHVDFsWE9VbGtia1kwVGtSa00xa3pUbE5SVTBvNUxuVmZXRzkzTVdScExVWlVja1ozVEc1eFVrSk9SVUV1UW1WUlQxUjRjRFp6YWs5eVkxcGZaaTQzYkY5b1dEaERUR3BHU214SGRXeFNWa1JoYWtsMVRsbDNlbGxWWlMxblF6QXlaMnRoYUV0WVgxTnZXQzFLVjBscFFXd3RMV3Q0WldveFNEaFRWRjlMZEdwZmFYRjRRV0ZaT1VwSlFuRkdRV3Q0VVhCMVJHVndRMVJNUlZsS1QyWm9NVk14WVROYVZrdE9TM0k0TlVOWWJYWmZjR2RvTVU1eFdIbEVVMWRyYW5OS01uRklWamx0WnpGU1dXRXpPRzR6Y1dab1lXdzRXRjlyWlVsS2J5MW9NbXcxYkRCYVJGUkJOMnh6Y0RKSkxuVlRNVFpvTkVKa1NXVnhVRmM1VUdjM1ZqZHZWSGM9IiwiYSI6eyJmbmlkIjoiMDAwMDEzIiwiZnRpZCI6InR0bnYyIiwiZmNpZCI6InR0bi12Mi1ldS00In19"
}, {
"gateway_ids": {
"gateway_id": "packetbroker"
},
"packet_broker": {
"message_id": "01FCRFGT85278QE4RG0F0DPZRR",
"forwarder_net_id": "000013",
"forwarder_tenant_id": "ttnv2",
"forwarder_cluster_id": "ttn-v2-eu-4",
"forwarder_gateway_eui": "0000024B080E0BB6",
"forwarder_gateway_id": "eui-0000024b080e0bb6",
"home_network_net_id": "000013",
"home_network_tenant_id": "ttn",
"home_network_cluster_id": "ttn-eu1"
},
"time": "2021-08-10T16:49:51.346237Z",
"rssi": -106,
"channel_rssi": -106,
"snr": 5.8,
"location": {
"latitude": 52.63517,
"longitude": 4.746429
},
"uplink_token": "eyJnIjoiWlhsS2FHSkhZMmxQYVVwQ1RWUkpORkl3VGs1VE1XTnBURU5LYkdKdFRXbFBhVXBDVFZSSk5GSXdUazVKYVhkcFlWaFphVTlwU25wVE0xWlRaV3RSTlZacE1YQlhSRXBKWlc1a2VrbHBkMmxrUjBadVNXcHZhV0ZGYkZSUmJFSjJZakJhZVdNelFUUlZWVXB0WlZabmQwNVZiRXhhZVVvNUxsUkRPVWd4ZGxsMGRVWlFhWFppTFVKT1FXUkRVM2N1YUhBMFRsWXRVVGRhTW5oRmIwNWlaaTVSVkhWd1oxa3dTRzVUTTB0NlYxSm1iRkJHTW5STmMwTnNhMHAwVTB4eVZqaEVXVk5JTWs5eVUySnROalZXZDI1Nk56UnBZbW95T1dsNU9YWmZiV1pyTmpreE4wTjRRbGhJZVV0WVEwczFMVlUwTld3ME5XSk5iMU5tUlhWa1pXMXhjbWhvVUVGR01tZHhZMWhsWVc0MVRYUXpTR2d3YmtwcFUwOW9SbGxSYVZSdWQybzJhRnBaT1dWcWNERjVZamRsYlhaTFMwaHNRVU10UlV4MVRqVnNNVjlUV1dabWMySndlVVZUWVRCTkxuWlNXVjh4UlhaS1dqUk1WME5YZGt4aVUzaHhMWGM9IiwiYSI6eyJmbmlkIjoiMDAwMDEzIiwiZnRpZCI6InR0bnYyIiwiZmNpZCI6InR0bi12Mi1ldS00In19"
}],
"settings": {
"data_rate": {
"lora": {
"bandwidth": 125000,
"spreading_factor": 7
}
},
"data_rate_index": 5,
"coding_rate": "4/5",
"frequency": "868300000"
},
"received_at": "2021-08-10T16:49:51.384493715Z",
"consumed_airtime": "0.184576s",
"locations": {
"user": {
"latitude": 52.629907947162515,
"longitude": 4.751428663730622,
"source": "SOURCE_REGISTRY"
}
},
"network_ids": {
"net_id": "000013",
"tenant_id": "ttn",
"cluster_id": "ttn-eu1"
}
}
},
"url": "http://junioriotchallenge.nl/ttn_data_v3test/ttn_messages_partitioned/app=test_v3/y=2021/m=08/d=10/2021-08-10 16.49.52.124.txt"
}

Het format is anders dan onze recente V2 pakketten. http://junioriotchallenge.nl/ttn_data/ttn_messages_partitioned/app=bvhva-samenmeten/y=2021/m=08/d=10/2021-08-10%2020.26.04.55378.txt

{
"resource": "/",
"path": "/",
"httpMethod": "PUT",
"headers": {
"Accept-Encoding": "gzip",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "IE",
"content-type": "application/json",
"Host": "a8gd4bvigb.execute-api.eu-west-1.amazonaws.com",
"User-Agent": "http-ttn/2.6.0",
"Via": "2.0 141b2946c85d0758bf433bc8ee4a9298.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "zwgLVwFlxE8Iaf5Qmq3O-QL2weAp6SfJKR4ncP7Lum7aFRuKXo_hKA==",
"X-Amzn-Trace-Id": "Root=1-6112e0dc-389e6dd904f1d71039c0c181",
"X-Forwarded-For": "52.169.225.45, 70.132.46.134",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"multiValueHeaders": {
"Accept-Encoding": ["gzip"],
"CloudFront-Forwarded-Proto": ["https"],
"CloudFront-Is-Desktop-Viewer": ["true"],
"CloudFront-Is-Mobile-Viewer": ["false"],
"CloudFront-Is-SmartTV-Viewer": ["false"],
"CloudFront-Is-Tablet-Viewer": ["false"],
"CloudFront-Viewer-Country": ["IE"],
"content-type": ["application/json"],
"Host": ["a8gd4bvigb.execute-api.eu-west-1.amazonaws.com"],
"User-Agent": ["http-ttn/2.6.0"],
"Via": ["2.0 141b2946c85d0758bf433bc8ee4a9298.cloudfront.net (CloudFront)"],
"X-Amz-Cf-Id": ["zwgLVwFlxE8Iaf5Qmq3O-QL2weAp6SfJKR4ncP7Lum7aFRuKXo_hKA=="],
"X-Amzn-Trace-Id": ["Root=1-6112e0dc-389e6dd904f1d71039c0c181"],
"X-Forwarded-For": ["52.169.225.45, 70.132.46.134"],
"X-Forwarded-Port": ["443"],
"X-Forwarded-Proto": ["https"] },
"queryStringParameters": null,
"multiValueQueryStringParameters": null,
"pathParameters": null,
"stageVariables": null,
"requestContext": {
"resourceId": "3owsj86a35",
"resourcePath": "/",
"httpMethod": "PUT",
"extendedRequestId": "D3gSjHwpjoEFlqQ=",
"requestTime": "10/Aug/2021:20:26:04 +0000",
"path": "/prod",
"accountId": "667242083879",
"protocol": "HTTP/1.1",
"stage": "prod",
"domainPrefix": "a8gd4bvigb",
"requestTimeEpoch": 1628627164903,
"requestId": "4e25f99d-ac95-4020-a65f-9c74402c9b4e",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"sourceIp": "52.169.225.45",
"principalOrgId": null,
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "http-ttn/2.6.0",
"user": null
},
"domainName": "a8gd4bvigb.execute-api.eu-west-1.amazonaws.com",
"apiId": "a8gd4bvigb"
},
"isBase64Encoded": false,
"body": {
"app_id": "bvhva-samenmeten",
"dev_id": "alkmaar2021-009",
"hardware_serial": "00D6FD994A11DE4A",
"port": 1,
"counter": 42628,
"payload_raw": "yt0Sg2CeAAAAAAAAAAAAAAAAAAAAAAAAAAAtDBu8J8IC8gOaAAAAAAAAAAAAsAEUAQ0AuADAAP0A7gkBAAAAAAMNAAI8AAROAAGeAAMgAAW4AAI0JxAAAAAAAg4AAA==",
"payload_fields": {
"BME280_Hum": 71,
"BME280_Press": 101780,
"BME280_Temp": 15.32,
"BME280internal_Hum": 0,
"BME280internal_Press": 0,
"BME280internal_Temp": 0,
"LAT": "52.638446",
"LON": "4.749495",
"Lux": 0,
"P": 1017.8,
"PM10": 92.2,
"PM25": 75.4,
"RH": 71,
"T": 15.32,
"Vbat": 3.49,
"Vsupply": 5.13,
"arduino_VCC": 0,
"arduino_Vbat": 0,
"arduino_tempCPU": -100,
"bytes_length": 94,
"dB_EQ7_1____63Hz": -9.07,
"dB_EQ7_2___160Hz": -5.16,
"dB_EQ7_3___400Hz": -5.38,
"dB_EQ7_4__1000Hz": -8.68,
"dB_EQ7_5__2500Hz": -8.31,
"dB_EQ7_6__6250Hz": -5.92,
"dB_EQ7_7_16000Hz": -6.45,
"dB_Vmic": 0,
"dB_Vmic_ref": 0,
"dB_activated": 0,
"dB_flag": 1,
"dB_levelflag": 0,
"dB_samplecount": 9,
"dBa_avg": 52.8,
"dBa_max": 58.49,
"dBa_min": 49.99,
"dBc_avg": 55.71,
"dBc_max": 60.96,
"dBc_min": 52.68,
"dBc_val": 0,
"gps_alt": 0,
"gps_hdop": 0,
"gps_lat": "52.638446",
"gps_lng": "4.749495",
"pm10": 92.2,
"pm25": 75.4,
"raw_dB_EQ7_1": 176,
"raw_dB_EQ7_2": 276,
"raw_dB_EQ7_3": 269,
"raw_dB_EQ7_4": 184,
"raw_dB_EQ7_5": 192,
"raw_dB_EQ7_6": 253,
"raw_dB_EQ7_7": 238,
"raw_dBa_avg": 572,
"raw_dBa_max": 1102,
"raw_dBa_min": 414,
"raw_dBc_avg": 800,
"raw_dBc_max": 1464,
"raw_dBc_min": 564
},
"metadata": {
"time": "2021-08-10T20:26:04.553788358Z",
"frequency": 867.3,
"modulation": "LORA",
"data_rate": "SF7BW125",
"coding_rate": "4/5",
"gateways": [{
"gtw_id": "eui-fcc23dfffe0f04eb",
"timestamp": 767229107,
"time": "2021-08-10T20:26:04.55238Z",
"channel": 4,
"rssi": -118,
"snr": -2.5,
"rf_chain": 0
}, {
"gtw_id": "eui-0000024b080e0c15",
"timestamp": 3241644163,
"time": "2021-08-10T20:26:04.535394Z",
"channel": 4,
"rssi": -112,
"snr": 6.2,
"rf_chain": 0,
"latitude": 52.61757,
"longitude": 4.76674,
"altitude": 23
}, {
"gtw_id": "eui-0000024b080e0bb6",
"timestamp": 2691367875,
"time": "2021-08-10T20:26:04.535386Z",
"channel": 4,
"rssi": -83,
"snr": 10.5,
"rf_chain": 0,
"latitude": 52.63544,
"longitude": 4.7461,
"altitude": 15
}] }
},
"message_ymdhm": 202108102026,
"url": "http://junioriotchallenge.nl/ttn_data/ttn_messages_partitioned/app=bvhva-samenmeten/y=2021/m=08/d=10/2021-08-10 20.26.04.55378.txt"
}

—-

De json velden die onze V2 code verwacht zijn waarschijnlijk:

{
"body": {
"app_id": "bvhva-samenmeten",
"dev_id": "alkmaar2021-009",
"port": 1,
"counter": 42628,
"payload_raw": "yt0Sg2CeAAAAAAAAAAAAAAAAAAAAAAAAAAAtDBu8J8IC8gOaAAAAAAAAAAAAsAEUAQ0AuADAAP0A7gkBAAAAAAMNAAI8AAROAAGeAAMgAAW4AAI0JxAAAAAAAg4AAA==",
"payload_fields": {
"BME280_Hum": 71,
"BME280_Press": 101780,
"BME280_Temp": 15.32,
"LAT": "52.638446",
"LON": "4.749495",
"Lux": 0, …
},
"metadata": {
"time": "2021-08-10T20:26:04.553788358Z",
"frequency": 867.3,
"modulation": "LORA",
"data_rate": "SF7BW125",
"coding_rate": "4/5",
"gateways": [{
"gtw_id": "eui-fcc23dfffe0f04eb",
"timestamp": 767229107,
"time": "2021-08-10T20:26:04.55238Z",
"channel": 4,
"rssi": -118,
"snr": -2.5,
"rf_chain": 0
}] }
},
"message_ymdhm": 202108102026,
"url": "http://junioriotchallenge.nl/ttn_data/ttn_messages_partitioned/app=bvhva-samenmeten/y=2021/m=08/d=10/2021-08-10 20.26.04.55378.txt"
}

Als eerste stap controleren we in de code waarom het veld ‘message_ymdhm’ in ons opgeslagen V3 bericht ontbreekt. We lopen nog eens rustig door de code van de nieuwe API en maken een correctie.

TO DO – afmaken

(oktober 2021)

Voorbeeld v2: http://junioriotchallenge.nl/ttn_data/ttn_messages_partitioned/app=bvhva-samenmeten/y=2021/m=10/d=22/2021-10-22%2016.27.51.05804.txt

Voorbeeld v3: http://junioriotchallenge.nl/ttn_data_v3test/ttn_messages_partitioned/app=burgernetwerken-alkmaar-v2-v3/y=2021/m=10/d=22/2021-10-22%2016.26.51.12002.txt

Formatteren van deze json doen we middels https://jsonlint.com/

Een detail vergelijking van alle datavelden in beide berichten geeft de indicatie dat alle voor onze v2 map code aanwezig zijn. Dat is inclusief de eerder genoemde message_ymdhm. De volgende stap is om de s3 locatie om te zetten van ttn_data_v3test naar de ttn_data folder.

De AWS API gateway gebruikt de Lambda functies. In de AWS console, Lambda, bij pushNewTtnMessage-v3, Configuration, Environment variables, de values aanpassen in 2 variables.

Controle 1: na deze wijziging ontstaat in S3 een nieuw pad, met de meest recente file vanuit de v3 app: http://junioriotchallenge.nl/ttn_data/ttn_messages_partitioned/app=burgernetwerken-alkmaar-v2-v3/y=2021/m=10/d=22/2021-10-22%2017.24.54.30060.txt

Controle 2: In de nodes file van vandaag moet dit nieuwe device zichtbaar worden; echter ontbreekt nu nog: http://junioriotchallenge.nl/ttn_data/gamedata/nodes.json

TO DO: Waarom wordt de device niet aan device lijst toegevoegd?
Dit deel wordt afgehandeld door de Lambda functie “ttn_s3_to_DynamoDB”, waar de naamgeving suggereert dat we opslaan in DynamoDB gaat de data toch naar S3.

De code in deze Lambda functie bleek een aantal velden uit de v2 data structuur te halen, welke voor de 2016/2017/2018 games werden gebruikt. Ook gateway data werd nog gelezen, terwijl we daar op dit moment eigenlijk geen gebruik van maken. De datumtijd detail string staat in v3 op een andere plek in de data. De code is nu aangepast om compatible te zijn met onze v2 én met onze v3 implementatie. Let op: het is goed mogelijk dat in de custom code in de Gemeente Alkmaar data backbone onbedoeld ook vergelijkbare keuzes zijn gemaakt.

Test voor Gemeente Alkmaar: de implementatie is okay indien actuele data vanaf 2021/10/22 zichtbaar is voor nieuwe nodes alkmaar2021-011-v2, alkmaar-meten001-v2, alkmaar-meten002-v2. Klopt dit?

 

Augustus 2021 – Game map integratie controleren in V2-V3 app

TO DO: Bevestiging, komt data van gemigreerde devices aan op de kaart?

(oktober 2021)

Na teests en edits aan onze kant komt de data vanaf 22 oktober 2021 aan op de kaart.

Augustus 2021 – RIVM integratie toevoegen aan V2-V3 app

RIVM integratie moet nu aan de kant van RIVM per applicatie worden ingesteld. Overleg of we vanuit onze apps zelf een push kunnen instellen.

TO DO: Bevestiging, komt data van gemigreerde devices aan op de RIVM grafiek?

(oktober 2021)

Op 22 oktober 2021 contact met Derko Drukker van RIVM. Hij kan onze v3 data zien. Integratie volgt over één of twee weken.

Augustus 2021 – controle data Alkmaar Datalake

TO DO: Bevestiging, komt data van gemigreerde devices aan op de kaart en grafieken binnen gemeente Alkmaar?

(oktober 2021)

Aan Niek, Barrita van Gemeente Alkmaar gevraagd om nu te kijken of nieuwe data zonder problemen instroomt. “Test voor Gemeente Alkmaar: de implementatie in Azure is okay indien actuele data vanaf 2021/10/22 zichtbaar is voor nieuwe nodes alkmaar2021-011-v2, alkmaar-meten001-v2, alkmaar-meten002-v2.”

 

Augustus 2021 – Controle datapipeline all-in

Onze kaart- en grafieken applicatie passen we nog niet aan. Controle of deze voor de gemigreerde sensors blijft werken.

De gemeente data pipeline passen we nog niet aan. Controle of deze voor de gemigreerde sensors blijft werken.

Overige controles.

(oktober 2021)

Na de aanpassingen in de datapipeline op 22 oktober blijven onze kaart- en grafiek pagina’s zonder wijzigingen doorwerken.

 

September 2021 – bestaande V2 sensoren migreren naar V3

TO DO: Pas na validatie van eerdere tests en pipeline integraties. Betreft 10 stuks sensoren.

(oktober 2021)

Update: we kiezen ervoor om langzaam te migreren. Immers, we hebben nog geen volledige dekking met v3 gateways. Ook is de raamafspraak met Gemeente Alkmaar nog in afwachting.

Een aantal voorbeelden zullen we als test omzetten om te kunnen zien of de data goed doorkomt. De rest zal wellicht last-minute gebeuren, of zelfs pas in december/januari zodra de gemeente dit aangeeft.

September 2021 – strategie bepalen omtrent gateways

In overleg bepalen we een juiste strategie

(oktober 2021)

We hebben geleerd dat de v3 gateways echt nodig zijn. De gateways die wij als burgernetwerk beheren, die proberen we komende maand om te zetten naar v3.

Oktober 2021 – Readyness check V2 exit

Bevestiging, de V2 app zou in principe mogen verdwijnen?

(oktober 2021)

Technisch hebben we de meeste onderwerpen nu allemaal wel aangestipt. We overleggen nog of we kjlaar genoeg zijn voor de v2 exit. We zullen nog een aantal stappen doen ter bevestiging van de how-to. De laatste migratie stappen doen we pas na overleg.

TTN mapper

(oktober 2021)

Per v3 applicatie voegen we de integratie toe met TTN mapper. Hoe dit gaat staat keurig uitgelegd: https://docs.ttnmapper.org/integration/tts-integration-v3.html

Ons device op ttn mapper: https://ttnmapper.org/devices/?device=alkmaar-meten002-v2&startdate=2021-10-22&enddate=2021-10-22&gateways=on&lines=on&points=on

Oktober-december 2021 – Gateways implementeren

Strategie implementeren samen met Gemeente Alkmaar.

(oktober 2021)

We hebben de gemeente een voorstel gedaan voor swap/update van de gateways. Dit overleg zal tijd kosten. Ondertussen proberen we in eigen beheer het v3 gateway netwerk met eigen apparatuur dekkend te krijgen.

November – laatste restjes

De proof-of-concept van de pipeline draait. Een aantal proefdevices is omgezet. De dekking van het v3 netwerk is nog niet optimaal, waarvoor verder overleg kan helpen.

We helpen bij de upgrade van v2 gateways waarvan we de eigenaren kennen. We proberen uit eigen kosten enkele v3 gateways te plaatsen. Vanuit de gemeente vragen we hierin de benodigde steun.

Enkele eigen sensors migreren we, zonder ze van de opstelpunten te demonteren. Wellicht als proof-of-concept ook enkele uit de reeks van de gemeente, voor zover we hiermee de datastroom niet verstoren.

December – stilgevallen functionaliteiten alsnog weer aanzetten

In december wordt duidelijk welke functionaliteit nu echt stil komt te vallen. Welke onderdelen zijn nog nodig om het werkend te houden, en verder te verbeteren.

De discussie wordt makkelijker. De beslissing wordt duidelijker om nu de dingen te upgraden die nu zijn stilgevallen. Als het goed is ligt nu voor elk scenario een draaiboek klaar.

We kijken in onze data logs of de gemeente gateways (kerlink geplaatst in circa 2016) inderdaad geen data meer doorgeven. We bieden aan deze met swap/upgrade te vervangen of te upgraden zodat deze mooie locaties deel worden van het v3 netwerk.

Sensoren uit de pool, welke nog niet naar v3 zijn omgezet, geven nu wellicht geen data meer door. Ook deze brengen we naar v3. Hopelijk lukt dat zonder dat deze van hun opstelpunt gedemonteerd hoeven te worden. Hiervoor is voldoende dekking nodig.