KPN IoT – PAXcounter

PAXcounter… een bekende applicatie die vaak standaard geprogrameerd is op een LilyGo ESP32 LoRa device. Wat kun je hier eigenlijk mee?

Ik ben al enige tijd geleden een experiment gestart met een LoRa device om te ontdekken of dat “iets is” om mee te experimenteren. Nieuwe ontwikkelingen welke met radio en internet te maken hebben zullen immers altijd mijn interesse hebben en houden.
Je hebt TTN, The Things Network (en in de tijd dat ik begon begin 2023 was er ook een Helium Mining Netwerk een soort blockchain verzinsel wat volgens mij al weer verdwenen is) en je hebt het KPN IoT | Things netwerk. Met deze laatste heb ik een volledig PAX counter Flow gebouwd. Ik heb mede gekozen voor KPN IoT omdat de dekking in Nederland 100% en die van TTN helaas niet. Gelukkig biedt KPN een zogeheten Freemium abonnement aan waarbij je gratis mag experimenteren.

Ingredienten nodig voor een totaal experiment: (zoals ik het heb gemaakt)

  • LilyGO TTGO T3 LoRa32 868MHz V1.6.1 ESP32 device. (via Tinytronics.nl of Amazon)
    • Geprinte behuizing van Thingverse. Sluit de print mooi in en is lekker compact.
    • Li-Po Batterij 3.7V 350mAh voor kort gebruik ca. 2 uur ingebouwd in de behuizing.
  • Freemium Abonnement KPN IoT. ( portal.kpnthings.com/ )
  • Firmware van GitHub at github.com/cyberman54/ESP32-Paxcounter
  • Create je Device on KPN Things platform
  • AppEUI, DeviceEUI en AppKey vanaf het KPN Things platform
  • Maak op je eigen webserver een Endpoint of Webhook aan waar KPN IoT de payload van je LoRa bericht naar toe stuurt. De Webhook is geschreven in php en heeft de volgende functies:
    • Ontvangt en decodeerd het ontvangen JSON bericht.
    • Slaat de relevante payload informatie op in een .csv file op de server.
    • Heeft een verbinding met en Telegram bot zodat je real time kunt checken of de applicatie werkt.
  • en op de webserver heb ik een pagina om de resultaten weer te geven.
    • paxviewer toont de counts (alleen bluetooth), de radio link kwaliteit en de gebruikte LoRa kanalen.

Hoe doe je dit? Nou google is je beste vriend en op de diverse fora staan natuurlijk ook handige tips.

1. De gedownloade firmware van cyberman54 geeft al veel informatie hoe je de firmware kunt aanpassen. In feite het enige wat je moet doen is de juiste device kiezen en de aansluitcodes voor het KPN IoT netwerk invoeren.

platformio.ini :

[board]
halfile = ttgov21new.h

in loraconfig.h :

//KPN
static const u1_t DEVEUI[8]  = {0x00, 0x5A, 0xAC, 0x0A, 0x00, 0x10, 0x19, 0x19};    8 byte
static const u1_t APPEUI[8]  = {0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x0B, 0xCD};    8 byte
static const u1_t APPKEY[16] = {0xD5, 0xA7, 0x5A, 0xB3, ....... 0x1D, 0x12, 0x09}; 16 byte

Om de LoRa codes te krijgen moet je het abonnenment geregeld hebben. Dit gaat geheel via internet en je abonnement is meteen beschikbaar. Op de site van KPN Things is al veel informatie te vinden hoe je kunt starten en welke mogelijkheden er zijn. Maak je device aan als “Own LoRa device (programmable)” en verkrijg de codes.

2. Flash de firmware en schakel de TTGO aan. Als het goed is en je hebt KPN IoT dekking, dan moeten er na enige tijd data records verschijnen op de KPN Things Manager site.

3. Maak je eigen Telegram BOT aan op Telegram met behulp van BotFather. Kijk hier hoe.

4. Maak de Flow op KPN Things en definieer het Endpoint. Ik heb een php script geschreven welke de berichten van KPN IoT ontvangt en tevens verbinding heeft met een Telegram BOT. Het script doet in grote lijnen het volgende:

// lees de .ini file met o.a. de telegram bot codes
$config = parse_ini_file("bothook.ini");
// open de logfile
$logfile = fopen("bothooklog.txt","a");

// verkrijg het meegestuurde bericht en decodeer json
$content = file_get_contents("php://input");
$update  = json_decode($content, true);
fwrite ($logfile, "received_message: ".$content."\n");

// controleer of het bericht van de Telegram BOT komt in dat geval is er een sectie text
if (isset($update["message"]["text"])) $command = $update["message"]["text"];

if ($command) {
   // lijkt op een BOT commando dus kijk of het geldig is
   switch (strtolower($command)) {
    case 'help':
      $telegram_message = "BOThelp | Possible commands:
          start, stop, status
          -> parsing LoRa msg to bot.
          clearlog, clearpax
          -> clear files.
          records
          -> # of rx-ed LoRa msg.";
    break;
   // en stuur tekst naar de Telegram BOT

} else {
   // geen BOT bericht dus een KPN IoT bericht. Controleer of het volledig is
   if (isset($update["0"]["vs"]))  $payload = $update["0"]["vs"]; 
   if (isset($update["5"]["v"]))   $snr = $update["5"]["v"]; 
   if (isset($update["10"]["vs"])) $channel = $update["10"]["vs"];
   if (($payload) && ($channel) && ($snr)) {
   // lijkt een volledig bericht 
   $counter = hexdec(substr($payload, 4, 8));
   $telegram_message = "PAXcounter | ".$counter." | Ch: ".$channel.", SNR: ".$snr;
   // en stuur naar de Telegram Bot
}

function telegram($msg) {
   // send bericht naar Telegram BOT
   global $config;
   $url="https://api.telegram.org/bot" .$config['bot']. "/sendMessage?parse_mode=html
         &chat_id=" .$config['chat_id']. "&text=" .urlencode($msg);
   $result=@file_get_contents($url);
}

NB: Bovenstaande code is onvolledig weergegeven en zal niet direct functioneren. Mail indien je belangstelling hebt.

Ik neem de PAX counter af en toe mee naar plekken met veel mensen en zie daar, de teller loopt mooi op en het zendsignaal wordt vrijwel altijd opgepikt door KPN IoT en doorgestuurd naar mijn website.