Tutorial: da dati grezzi aperti a servizio. La filiera dei trasporti pubblici da TransitLand ad Arduino e Telegram

Il titolo già è autoesplicativo. I dati grezzi, aperti da qualche gestore dei Trasporti Pubblici, sono spesso appannaggio solo degli sviluppatori. Il famoso standard GTFS è leggibile solo da macchine o apps (che poi si appoggiano a macchine). In senso lato sono M2M : cioè sono prodotti da macchine per le macchine.

Come si fa a trasformare un dato in un servizio?
Innanzitutto magari ci fossero cosi tanti gestori dei TPL che forniscano i files in formato e licenza aperta. Se andate su Transit.Land e cercate “Italy” troverete 172 operatori:

Transit.Land ha avuto la brillante idea di costruire un unico DataBase interrogabile e interoperabile. Se siete fortunati troverete anche il gestore dei TPL  della vostra città. Se non è presente su Transit.Land ma riuscite tramite pressione civica, conoscenza o semplicemente avete trovato il link dei GTFS, potete segnalarlo sul sito di Transit.Land e dopo 10 giorni al max, li troverete nel mega data base.

Tramite le API di TransitLand un codice può interrogare per posizione geografica o per codice della fermata o della corsa etc. In base a questo realizzai già tempo fa un Bot Telegram e una Mappa e la cosa piacque molto a TransitLand. Nacque un loro articolo a riguardo.

Ho pensato che queste informazioni, potessero essere “facilmente” integrate anche tramite un Arduino e una pagina PHP che interroga Transit.Land. Lo schema è il seguente:
1) Arduino, collegato tramite la Ethernet Shield alla Rete Internet, alla pressione di un tasto, chiama via GET una pagina PHP passando il codice della fermata (onestop_id) .
2) La pagina PHP interroga le API di TransitLand per destination_onestop_id e filtrando solo corse nella prossima ora, riceve le linee dei Bus e rispettivi orari di passaggio in quella determinata fermata.
3) La pagina PHP dopo aver mostrato gli orari , manda tale risposta anche tramite un messaggio Telegram ad un utente (chat_id per la precisione) predeterminato.

Per realizzare tutto questo dovete recuperare queste informazioni:
1) onestop_id ( è il codice della fermata di mio interesse). Tale valore va inserito nel codice Arduino. Per trovare tale id, l’unica cosa che vi conviene fare è cercare le coordinate (latitudine e longitudine) e sostituirle in questo link:
https://transit.land/api/v1/stops?lon=18.15291&lat=40.33711&r=100

In questo esempio nella risposta troverete: onestop_id=s-srhvmp4sep-nocco2

2) Dopo aver seguito il punto 1) dovete salvarvi il seguente codice PHP in un vostro file . chiamarlo orarioarduino.php e salvarlo in una dir “gtfstutorial” su un vostro server. Nel codice di Arduino dovete quindi cambiare la sezione char server[] = “www.piersoft.it” inserendo il vostro sito web. In pratica Arduino cerca di collegarsi alla pagina www.nomedeltuosito.it/gtfstutorial/orarioarduino.php e aggiunge ?id=s-srhvmp4sep-nocco2 (sarà quello vostro del punto 1) . Ho impostato un IP statico nel codice di Arduino. Se avete una rete LAN con altra classe, inserite un vostro IP interno disponibile. Ho supposto la classica rete 192.168.1.X

3) Lo schema di collegamento di Arduino è:

La Ethernet Shield (montata sopra un Arduino UNO) è collegata tramite un dispositivo IC2 ad un Display 16×2. Ho usato questo convertitore perchè cosi bastano solo 4 pin di collegamento: GND, VCC e A4+A5 dell’Arduino da collegare verso la Ic2 saldata dietro il display (A5 a SCL e A4 a SDA).

4) la pagina PHP, richiamata da Arduino quando si clicca sul Pulsante collegato a D2, restituisce l’elenco dei prossimi Bus da quella determinata fermata nella prossima ora. C’è un bug nel mio codice dovuto probabilmente al Display di soli 16 caratteri x 2 righe, che non sono riuscito a risolvere. Magari con un display più grande si risolve a monte. Il bug è che se arrivano molti Bus in quella fermata, si visualizzano sull’ LCD solo 2 corse. Mentre via Telegram (prossimo step) arriva tutto correttamente. Anche se faccio fare uno scrolling del display, non sono riuscito a risolverlo. se ci riuscite, battete un colpo.

5) se funziona tutto, ora dobbiamo passare ad implementare il messaggio via Telegram. Dovete prima cercare l’utente “BotFather” su Telegram e digitare /newbot per creare un nuovo bot. Vi verrà chiesto il nome (mettete uno qualsiasi) e uno username che finirà per forza per “bot” tipo vostronomebot. Vi verrà assegnato un “Token” alfanumerico. Aprite la pagina PHP e inseritelo nella variabile $token. Rimane da trovare il vostro chat_id. Sempre su Telegram provate a cercare il bot che avete creato. Cliccate “avvio” e scrivete qualsiasi cosa. Ovviamente il bot non vi risponderà ma Telegram sta registrando tutti i comandi che stata inviando. Aprite un browser e digitate :

https://api.telegram.org/bot(vostrotoken)/getupdates

Nella risposta troverete il chat_id che è un numero. Anche questo lo dovete inserire nella pagina PHP alla variabile $chat_id. Ora cercate nel codice PHP la parola sendMessage verso la fine e decommentate (togliete le // all’inizio riga).

Salvate e provate di nuovo a premere il pulsante nell'Arduino. Se avete fatto tutto correttamente viene inviato un messaggio Telegram con i prossimi arrivi pianificati, e visualizzarete sull'LCD gli ultimi 2 ricevuti. Eccovi un video dimostrativo nel mio perfetto inglese maccheronico :)

Buon 2017

Piersoft
Licenza CC-BY-SA

Potrebbero interessarti anche...

Rispondi