Tag: trenitalia

  • Viaggiatreno Ruby gem: version 1.0.5

    On the background of all my activities, I continued the developing of viaggiatreno, a Ruby gem to parse Italian railway real-time system information of the status of the various trains: location, delay, expected and real arrival time. Yesterday I released the version 1.0.5 of this gem, which improves the overall code quality of this gem (0 rubocops violations!):

    viaggiatreno gem source code is hosted on GitHub.

    Simple usage of this gem has been included in the README.

    Another interesting fact that I dealt while writing continuous integration test (with Travis) in the development of this gem: as it fetches and parses information from Internet URLs, one way of writing RSpec tests is to “mock” the remote web part.

    Using vcr gem, I mocked the response of the remote web server in order to write static test-cases (since the informations on train change over time, subsequent web requests did not fetch the same results).

  • Trenord/Trenitalia: è più conveniente un abbonamento mensile o annuale?

    Gennaio, tempi di rinnovi abbonamenti: nel mio caso, devo scegliere se pagare il (dis)servizio fornito da Trenord/Trenitalia.
    Mi è venuto un dubbio:

    È più conveniente acquistare 11/12 abbonamenti mensile o un abbonamento annuale, tenendo conto dei bonus?

    Se non sai cos’è un bonus: è una riduzione sul prezzo dell’abbonamento in base al rispetto dei tempi calcolato sul mese precedente.

    Ora passiamo ai calcoli.

    Alla pagina relativa alle tariffe di Trenord, segnati, per la tua fascia km, quanto costa un abbonamento mensile e quanto un abbonamento annuale.

    Screen Shot 2015-01-10 at 4.14.30 PM

    Per esempio, per un abbonamento di fascia km 28, segnati 57€ e 547€.

    Per quanto riguarda i bonus mensili, la riduzione è pari al 30% del prezzo dell’abbonamento. Per quanto riguarda l’abbonamento annuale, il bonus è “pari ad 1/12 del 10% del prezzo dell’abbonamento per ciascun mese in cui la soglia è stata superata sulla direttrice utilizzata, fino ad un valore massimo annuo del 10% del prezzo dell’abbonamento“.

    Ora si tratta di tradurre il tutto in termini matematici e impostare la disequazione per conoscere quale delle due soluzioni sia più conveniente:

    < costo abbonamento annuale > - < costo abbonamento annuale > * 10/100 * 1/12 * x ≤ <costo abbonamento mensile> * 12 - (<costo abbonamento mensile> * 30/100) * x

    (dove con x indichiamo il numero di mesi percui l’abbonamento è ridotto grazie al bonus).

    Usando WolframAlpha per risolvere la disequazione del caso considerato:

    Screen Shot 2015-01-10 at 4.21.52 PM

    Otteniamo il risultato:

    Screen Shot 2015-01-10 at 4.22.57 PM

    che significa: se il numero di mesi in cui il bonus è presente è minore o uguale a 10, allora l’abbonamento annuale è più conveniente. Viceversa, è più conveniente il mensile. Attenzione: il valore risultante dipende dai prezzi annotati all’inizio, percui ripetete il calcolo per il vostro caso.

    Ora, armandoci di pazienza, verifichiamo nell’archivio dei bonus quante volte in un anno si è verificata la presenza del bonus per la tratta di riferimento. Nel caso considerato, per la linea direttrice, 6 “eventi” bonus nel corso dell’anno 2012, 3 “eventi” nel corso del 2011, e 1 “evento” nel 2010.

    6 eventi sono minore o uguale a 10, e di conseguenza per il caso considerato conviene l’acquisto di un abbonamento annuale. Non dimenticatevi di richiedere il bonus a scadenza abbonamento usando questo modulo.

    Ripetete i calcoli per il vostro caso e fate attenzione!

    [tutti i link verso Trenord presenti su questo sito sono in nofollow, ovviamente].

  • Trenitalia: ho utilizzato il rimborso straordinario!

    Come vi avevo accennato ho richiesto il rimborso straordinario di Trenitalia, pari al 10% dell’abbonamento mensile del mese di dicembre 2010 (bei tempi, in cui per una fascia chilometrica di 10km ci venivano chiesti 25Euro; ora, invece, Trenitalia ne chiede 31).

    Il rimborso è arrivato nel mese di Settembre 2011 (intorno al 10) e riporta la dicitura: “da utilizzare entro settembre 2011“: fortunatamente non avevo ancora acquistato l’abbonamento per il mese successivo, altrimenti non avrei potuto beneficiare del bonus. Direi che la tempistica di arrivo del bonus e scadenza per l’utilizzo sono in linea con i modi e i tempi di Trenitalia!

    Ho acquistato l’abbonamento mensile di Ottobre 2011  presentando il buono sconto alla biglietteria e con mia grande sorpresa il buono è stato riconosciuto ed utilizzato (!), garantendomi uno sconto di 2,55Euro sul prezzo del biglietto. Ovviamente lo sconto è esiguo, ma sempre meglio che niente.

  • Il curioso caso di Trenitalia: l’indennizzo si può avere solo in biglietteria?

    Devo segnalare che Trenitalia, e in particolare in Lombardia, ha un indice di performances riguardante il livello di servizio (quello che in gergo si chiama SLA, Service Level Agreement) dei propri mezzi sul territorio lombardo. In particolare, gli abbonamenti mensili/annuali vengono scontati nel caso in cui non venga rispettato lo SLA accordato tra Trenitalia e Regione Lombardia nel periodo relativo a 3 mesi prima (cioè: l’abbonamento di marzo è scontato in base alle performances di Trenitalia a dicembre dell’anno precedente). Trenitalia ha una sezione apposita del sito in cui pubblica le direttrici su cui è calcolata la performance e (di conseguenza) la disponibilità dello sconto.

    Tale sconto, però, non è richiedibile online, ma soltanto alla biglietteria della stazione. Dopo aver provato entrambe le modalità di acquisto, posso affermare che non c’è distinzione nel processo di acquisto (alla biglietteria non vengono richiesti documenti o altro), per cui il processo di acquisto non è differente: lo sconto (che in alcuni casi può arrivare al 20%) può essere ottenuto soltanto acquistando presso la biglietteria. Sfortunatamente, le biglietterie di Trenitalia sono quasi sempre molto affollate (a mio avviso, il numero dei serventi è sottodimensionato rispetto alla quantità di persone che richiedono assistenza), e di conseguenza la maggior parte delle persone finisce per non acquistare i biglietti scontati per mancanza di tempo.

    Trenitalia, se sei in ascolto: implementare la possibilità di usufruire dello sconto anche online potrebbe essere una buona mossa per aumentare il grado di soddisfazione dei tuoi clienti.

  • Trenitalia: rimborso straordinario del 10% per tutti

    In via straordinaria, Trenitalia ha concesso un rimborso pari al 10% dell’abbonamento mensile per tutti [link all’annuncio] [Trenitalia ha prontamente rimosso il link al modulo di richiesta dopo il raggiungimento del termine ultimo per la presentazione del rimborso].

    Quindi, se a dicembre 2010 avete acquistato un abbonamento mensile e l’avete conservato:

    1. Stampate il modulo di richiesta;
    2. Compilate il modulo in ogni parte (scegliete se ottenere un assegno direttamente a casa o uno sconto sull’acquisto di un abbonamento) e allegate l’abbonamento originale del mese di dicembre 2010;
    3. Recatevi in una biglietteria Trenitalia, presentate il modulo, e conservate la ricevuta che vi fornirà l’addetto.

    La mia esperienza: Mi sono recato alla biglietteria FS della mia città. Sia che abbiate il normale abbonamento che l’abbonamento stampato tramite lo sportello virtuale (il biglietto con il QR code che stampate a casa), il rimborso è garantito! Nel mio caso ho dovuto spiegare all’addetto che il mio abbonamento stampato da Internet non era una fotocopia, ma bensì l’abbonamento originale che regolarmente presentavo al controllore. A quel punto mi è stata fornita la ricevuta che attesta l’avvenuta richiesta di rimborso correttamente formalizzata.

    Vi terrò informati sull’esito della richiesta!

    Update: il rimborso è finalmente arrivato. La data della lettera riporta maggio 2011, tuttavia la lettera è stata recapitata agli inizi di settembre 2011. E ovviamente, il buono è da utilizzare entro settembre 2011. Notevole.

  • Un caso curioso: che algoritmo di ricerca informata usano in Trenitalia?

    Vi racconterò di un caso curioso che mi è capitato; come molti di voi sapranno, sono un pendolare tra Bergamo e Milano.

    Lunedì scorso mi trovavo a Sesto San Giovanni, stazione 1° maggio FS, verso le ore 19:30. Il tabellone della stazione, e anche l’orario online di Trenitalia, indicano che il primo treno disponibile per Bergamo è quello delle 20:13, con arrivo a Bergamo alle 21:08 [il treno 10787].

    Per avvicinarmi a Bergamo, ho deciso di prendere il treno delle 19:33 che partiva di lì a poco e diretto a Lecco [il treno 10582]. Infatti, i treni da Milano per Bergamo/Lecco condividono buona parte del percorso fino a Carnate.

    Sceso a Carnate alle 19:49, mi accorgo che da Carnate a Bergamo è disponibile un treno subito dopo, alle 20:01 [il treno 10747], che arriva da Seregno (e quindi non passa sulla tratta da me frequentata; la prima stazione utile dove salire sul treno è proprio Carnate – la mappa ferroviaria della regione Lombardia e il semplice schema che ho preparato vi aiuteranno a capire).

    Risultato? Sono arrivato a Bergamo alle 20:33, anziché 21:08. La soluzione che ho scoperto per puro caso mi ha fatto risparmiare ben 35 minuti, ed è sconcertante che non sia suggerita dal sito di Trenitalia. Ok, sui tabelloni delle stazioni non ci sarebbe spazio materiale per suggerire tutte le possibili combinazioni; ma il sito di Trenitalia le suggerisce (infatti ci chiede di inserire partenza e destinazione). Solitamente, il sito suggerisce le soluzioni con cambi di treno solo se c’è abbastanza tempo per il cambio; mi sembra che 12 minuti siano più che sufficienti per cambiare il treno; oltretutto risparmiare ben 35 minuti è senza dubbio un buon motivo per includere la soluzione tra quelle proposte sull’orario online.

    La mia domanda è quindi: in Trenitalia, come identificano le soluzioni di viaggio da proporre al cliente? Vista l’esperienza che ho descritto, suggerirei di cambiare l’algoritmo di ricerca informata che usano attualmente… ecco un buon inizio. Buona lettura!

    PS: ovviamente tutti i link verso Trenitalia & co. sono in nofollow.

    Update: Andrea mi segnala e mi allega le immagini di un caso analogo: partenza da Bergamo ed arrivo a Milano Lambrate. L’orario ufficiale offre due corse: 9:02-9:41 e 10:02-10:41. Utilizzando un percorso alternativo, invece, è possibile raggiungere Milano Lambrate alle 10:25 partendo da Bergamo alle 9:21 e cambiando treno a Treviglio (treni 24766 e 2094). La domanda si ripete: Trenitalia, che algoritmo di ricerca informata utilizzate?

    Update 2: Stefano F. mi segnala che è più opportuno modellare la rete Trenitalia con una rete di Petri temporizzataInfatti, un algoritmo di ricerca informata non basta, in quanto non tiene conto dell’eventuale ritardo di ogni treno. Si deve integrare l’informazione sulla località e sulle connessioni delle stazioni utilizzando il fattore tempo, pesando ogni arco con il ritardo accumulato da ciascun treno.

  • Trenitalia e Viaggiatreno: come implementare un servizio “fai da te” per avere le informazioni dello stato di un treno via SMS

    Da quando sono diventato un pendolare (per lavoro), ho iniziato a (ri)frequentare assiduamente le stazioni ferroviarie e i treni di Trenitalia.

    station.

    Dopo un paio di settimane passate sui treni, mi sono accorto di un servizio interessante: il sito Viaggiatreno: il sito contiene le informazioni sui treni (informazioni in tempo reale sullo stato di un treno come ritardo o anticipo, ora prevista di arrivo e fermate già effettuate).

    Esigenza

    Dopo aver provato il disagio di un treno soppresso (e quindi essermi svegliato un’ora prima per stare un’ora ad aspettare in stazione), mi sono reso conto di poter, perlomeno, arginare il problema se si fosse presentato in futuro; conoscere lo stato del treno direttamente sul telefonino mi permetterebbe, la mattina, di poter scegliere un mezzo alternativo senza recarmi in stazione nel caso in cui il treno sia in ritardo o soppresso. Oppure, se il treno è in anticipo, di accelerare i tempi.

    Soluzioni esistenti

    • Potrei controllare il sito Viaggiatreno accedendo il computer, connettendomi a Internet e andando sul sito Viaggiatreno. Contro: il tempo richiesto è troppo (~ 5 minuti. E la mattina anche 5 minuti sono preziosissimi).
    • Potrei installare su iPhone l’applicazione ProntoTreno, un’applicazione che fornisce lo stato di tutti i treni in tempo reale. Contro: il mio access point WIFI non è sempre attivo; non ho a disposizione la connessione 3G. Inoltre, se dovessi cambiare telefono per passare ad un telefono senza WIFI/3G, questa soluzione non è più applicabile.

    L’idea

    Il mezzo da utilizzare è sicuramente il mobile. L’incognita era semplicemente trovare il modo per raggiungere i telefoni, ed è stato individuato negli SMS, supportati da tutti i telefoni.

    L’altro fattore da tenere in considerazione è: come ottenere i dati da Viaggiatreno? Il sito utilizza Flash, ed estrarre informazioni testuali e puntuali da Flash penso sia infattibile. La soluzione è presto trovata: fortunatamente, Viaggiatreno offre anche una versione mobile, realizzata in (X)HTML, per la gioia dei parser.

    La realizzazione

    Per la realizzazione del servizio abbiamo bisogno di:

    • Un server Linux attivo e connesso a Internet durante il lasso di tempo in cui vogliamo essere avvisati via SMS. Inoltre, il server Linux deve avere installato crontab, l’interprete python e alcuni pacchetti python che vedremo più avanti.
    • Un servizio per mandare SMS gratuitamente: io mi appoggio a virgilio.it, che mi permette di ricevere via sms tutte le email ricevute all’indirizzo indirizzo@sms.tin.it [per i più impazienti: in questo modo per ricevere SMS è sufficiente mandare una mail]. Se invece non potete usare virgilio.it, vi raccomando di utilizzare MoioSMS per l’invio gratuito di SMS.
    • Un account GMail da cui mandare la mail del punto sopra (se siete degli smanettoni, non avete bisogno di questo e potrete usare il vostro SMTP, a patto di sostituirlo nel codice).
    • Un telefono mobile abilitato alla ricezione di SMS e attivo (ovviamente!)
    • Il numero del treno di nostro interesse: per conoscere il numero del treno, è sufficiente andare su TreniItalia, immettere partenza e arrivo e annotarsi il numero del treno. Il numero del treno è unico e non cambia.
    • Lo script python seguente, che ho scritto in Python utilizzando le librerie python-mechanize e python-beautifulsoup (installatele seguendo la guida per la vostra distribuzione. Per Ubuntu/Debian ho usato apt-get install python-mechanize python-beautifulsoup). Il codice è ancora immaturo, ma funziona (vedi screenshot):
      “`
      #! /usr/bin/python

      import BeautifulSoup
      import mechanize
      import smtplib
      import time
      import datetime
      from email.MIMEMultipart import MIMEMultipart
      from email.MIMEBase import MIMEBase
      from email.MIMEText import MIMEText
      from email import Encoders
      import os
      import sys

      gmail_user = "gmail username"
      gmail_pwd = "gmail pass"

      def mail(to, subject, text):
      msg = MIMEMultipart()

      msg['From'] = gmail_user
      msg['To'] = to
      msg['Subject'] = subject

      msg.attach(MIMEText(text))

      mailServer = smtplib.SMTP("smtp.gmail.com", 587)
      mailServer.ehlo()
      mailServer.starttls()
      mailServer.ehlo()
      mailServer.login(gmail_user, gmail_pwd)
      mailServer.sendmail(gmail_user, to, msg.as_string())
      mailServer.close()

      numtreno = sys.argv[1]
      stazione = sys.argv[2]

      tobeparsed = mechanize.urlopen(str(str('https://mobile.viaggiatreno.it/viaggiatreno/mobile/scheda?numeroTreno=') + str(numtreno) + str('&tipoRicerca=numero&lang=IT')))
      f = BeautifulSoup.BeautifulSoup(tobeparsed)
      f = f.prettify()
      f = f[f.find('<!– SITUAZIONE –>'):]
      f = f[:f.find('</div>')]
      s1 = f[f.find('<strong>')+len('<strong>'):f.find('<br />')]
      s2 = f[f.rfind('–>')+len('–>'):f.find('</strong>')]
      s1 = s1.replace(''',"'")
      s1 = s1.split()
      s2 = s2.split()
      tobeparsed = mechanize.urlopen(str(str('https://mobile.viaggiatreno.it/viaggiatreno/mobile/scheda?dettaglio=visualizza&numeroTreno=') + str(numtreno) + str('&tipoRicerca=numero&lang=IT')))
      f = BeautifulSoup.BeautifulSoup(tobeparsed)
      f = f.prettify()
      f = f[f.find(stazione):]
      f = f[:f.find("</div>")]
      arr1 = f[f.find('')+len('<p>'):f.find('<br />')]
      or1 = f[f.find('<strong>')+len('<strong>'):f.find('</strong>')]
      arr = f[f.rfind('<p>'):f.rfind('</p>')]
      arr2 = arr[arr.find('<p>')+len('<p>'):arr.find('<br />')]
      or2 = arr[arr.find('<strong>')+len('<strong>'):arr.find('</strong>')]
      arr1 = arr1.split()
      or1 = or1.split()
      arr2 = arr2.split()
      or2 = or2.split()
      arr1.extend(or1)
      arr2.extend(or2)

      L = [s1, s2, arr2]
      for i in xrange(len(L)):
      L[i] = ' '.join(L[i])
      message = '\n'.join(L)

      mail("indirizzo@sms.tin.it",
      sys.argv[1],
      message,
      )
      “`

      Il codice estrae le informazioni di interesse da Viaggiatreno mobile (come detto, per fare il parsing occore usare il sito in versione mobile) come lo stato corrente del treno (posizione ed eventuali minuti di ritardo o anticipo) e l’orario di arrivo previsto e manda queste informazioni all’indirizzo mail “speciale” che gira il messaggio al mio numero di cellulare via SMS [per l’invio della mail il servizio usa GMail]. Come detto, potreste usare MoioSMS (via pipe o python import) semplicemente sostituiendo la parte di invio della mail.

    Come si utilizza?

    • Lo script accetta due parametri da command-line: il numero di treno a cui siete interessati e la stazione di cui volete conoscere l’orario di arrivo stimato (es. “LECCO MAGGIANICO”).
    • Modificate, nello script le variabili gmail_user e gmail_password con le credenziali del vostro account GMail che useremo per spedire la mail verso l’indirizzo speciale che girerà le mail in SMS. Sempre nel codice, sostituite appunto indirizzo@sms.tin.it con il vostro indirizzo “speciale” che tramuta il messaggio e-mail in SMS.
    • Usando crontab, inserite una entry del tipo:
      08 07 * * 1-5 python /home/mbologna/parser.py 5033 “LECCO MAGGIANICO”
      Per avere un aggiornamento via SMS alle 07:08 di tutti i giorni feriali del treno 5033 specificando che deve fornirci l’orario di arrivo previsto alla stazione di “LECCO MAGGIANICO”.

    Risultati

    La mattina, prima di recarmi in stazione, controllo sul mio telefono e automaticamente ricevo 3 SMS gratuiti diversi contenenti lo stato del treno man mano che si avvicina alla stazione in cui io salgo sul treno. In questo modo, ancora prima di uscire di casa, posso sapere se il treno è in ritardo o se è stato soppresso.

    Qui accanto, la testimonianza di 2 degli SMS che ricevo quotidianamente.

    Sviluppi futuri

    • Miglioramento del codice di download/parsing
    • Integrazione con MoioSMS

    Curiosità