iBeacon trials and errors

by Gaspar Torriero on 30/07/2014

Trials:

  • Selected users of the American Airlines app will be sent messages aimed primarily at guiding them round the airport. This will include information about walking time to gates and boarding updates.
    American Airlines says that 65% of passengers arrive at their gate early because they are worried about being late or getting lost.
  • Tesco’s trial began earlier this year in its Chelmsford store. It has said that the technology won’t be used to push out marketing messages, but will instead notify shoppers that their pre-ordered goods are waiting for them.
    Ultimately iBeacons could be a central feature in Tesco’s new beta MyStore app, helping customers to find specific items in-store.

And errors:

  • Initially launched with just 100 users, the trial involved sending marketing messages to customers as they entered one of Eat’s stores.

  • The technology enabled fans at 20 baseball stadiums to check-in at games and receive exclusive offers.

  • Virgin passengers with an electronic boarding pass loaded in their iPhone Passbook app could receive messages relevant to their location within the airport.

  • For example, passengers in the departures section of the airport would be sent special offers such as a commission-free currency exchange.

  • In June Odeon Cinemas announced that it planned to imminently begin trials with iBeacons to welcome people to its cinemas, share information and inform them of special offers.

There is no demand for messages. (*)

{ Comments on this entry are closed }

Arduberry_finale

Dato che Yahoo Weather offre il feed della situazione meteo della mia città, ho deciso di aggiungere questi dati al mio database, in modo da avere sia la temperatura interna che quella esterna. Ho quindi modificato il codice in Python aggiungendo queste righe:

from xml.dom.minidom import *
import urllib
import csv
LocationID = '714505'
# Fetch weather XML for Como, Italy
Trier = urllib.urlopen('http://weather.yahooapis.com/forecastrss?w=' + LocationID + '&u=c').read()
# Parse the XML
Trier = parseString(Trier)
# Get date
Date = Trier.getElementsByTagName('lastBuildDate')[0].firstChild.data
# Get today's weather
Today = Trier.getElementsByTagName('yweather:condition')[0]
T = Today.attributes["temp"].value
W = Today.attributes["text"].value
#print(W,T)

Se vuoi divertirti anche tu, ho messo online il nuovo arduinotomysql.py con le relative modifiche.

Tra parentesi, questa sera canto nel coro alla prima della Cavalleria Rusticana che dovrebbe tenersi all’aperto nell’Arena del teatro Sociale. In questo momento splende il sole, ma si prevede nuvolo con occasionali piogge. Incrocio le dita.

{ Comments on this entry are closed }

Arduino: connessione a MySQL su Raspberry Pi

by Gaspar Torriero on 20/06/2014

Ecco il mio Arduberry:

Arduberry

Un Arduino Leonardo con sensore di temperatura e di luce, connesso direttamente via porta USB a un Raspberry Pi su cui gira un server LAMP. I dati del sensore vengono scritti ogni dieci minuti su un database MySql sul Raspberry.

Il vantaggi di questa soluzione rispetto a quella precedente sono che a) non si appoggia a nessun servizio esterno e quindi ne ho il pieno controllo, e b) che mi sono divertito un casino a smanettare tra java, python, sudo nano e crontab. Ho tratto grande giovamento dai vari tutorial in circolazione, in particolare Connect Raspberry Pi and Arduino with Serial USB CableTutorial: store Arduino data with RaspBerry PI to MySql che ringrazio di cuore: ragazzi, non ce l’avrei mai fatta senza di voi.

Prossimo passo: trovare un alimentatore separato per l’Arduino, che la porta USB del Raspberry alimenta ma appena appena. Potrei provare a utilizzare il server Apache del Raspberry per la visualizzazione dei dati. Magari un’altra volta.

Ecco la non semplicissima ricetta, al netto degli innumerevoli prova ed errore:

1)

/*
  Termometro 
  con smoothing dei valori del sensore
  (media di 10 letture)

  vedi
  http://www.arduino.cc/en/Tutorial/Smoothing
  
*/


const int numReadings = 10;     // numero di letture per la media
int readings[numReadings];      // le letture dal sensore analogico
int index = 0;                  // 'indice della lettura corrente
int total = 0;                  // il totale corrente
int average = 0;                // la media
float temp;                       // la temperatura in C°
int light;
int inputPin = A0;              //la connessione al sensore di temperatura
int lightPin = A1;
int x;
int y;
unsigned long temptot;



void setup()
{
  Serial.begin(9600);
  // metto a 0 le letture: 
  for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;          
}

void loop() {
  // tolgo l'ultima lettura:
  total= total - readings[index];         
  // leggo più volte dal sensore
  // e faccio la media per stabilità: 
  temptot = 0;
  for(x = 0; x < 64; x++) {
    temptot += analogRead(inputPin);
  }
  y = temptot >> 6;
  readings[index] = y;
 
  //readings[index] = analogRead(inputPin); 
  // aggiungo la lettura al totale:
  total= total + readings[index];       
  // avanzo alla posizione seguente nell'array:  
  index = index + 1;                    

  // se siamo alla fine dell'array...
  if (index >= numReadings) {              
    // ...ricomincio da capo: 
    index = 0;                           
  }
  // calcolo la media:
  average = total / numReadings;
  
  // converto voltaggio sensore in °C
  temp = ( 5.0 * average * 100.0) / 1024.0;  
  // leggo l'output per debug:
  // Serial.println(temp); 
  light = analogRead(lightPin);
  

  // scrivo sulla porta seriale:
  Serial.print(temp);
  //Serial.print(average);
  Serial.print(" ");
  Serial.print(light);
  Serial.println();

  delay(2000);        // ritardo tra le letture per stabilità 
  
}

2)

Codice in python (il file è questo) che legge la USB del Raspberry , preleva i valori dei sensori e li scrive nel database MySQL:

arduinotomysql1

 

3)

La riga aggiunta in Raspberry con il comando crontab -e che esegue la lettura della porta seriale ogni dieci minuti (l’ultima parte serve a evitare le mail di alert):

*/10 * * * * /usr/bin/arduinotomysql.py >/dev/null 2>&1

 4)

Enjoy!

{ Comments on this entry are closed }

Arduino: il grafico delle temperature

by Gaspar Torriero on 17/06/2014

ArduTemp

Per cucinare il grafico della temperatura della mia camera da letto, ho impiegato i seguenti ingredienti:

  • Un Arduino 2009 con Internet Shield
  • Un sensore analogico di temperatura LM35
  • Un database MySQL su Amazon Web Services (gratis) su cui registrare i dati ogni 10 minuti
  • MySQL Workbench (gratis) per creare e gestire il database e la tabella
  • Un account su Temboo (gratis fino a 1000 calls/mese)) per trasferire i dati da Arduino a MySQL
  • MySQL for Excel (gratis) per riversare i dati raccolti in un foglio di Excel
  • Excel 2013 per trasformare i dati del sensore in gradi centigradi e creare la media oraria con relativo grafico.

La ricetta ha molti passaggi ma non è complicatissima. Richiede qualche conoscenza di programmazione, di SQL e di Excel, oppure richiede il tempo di fare numerosi errori, consultare gli innumerevoli manuali presenti in rete, riprovare con maggiore fortuna.

E’ un buon inizio e sono soddisfatto, ma c’è molto da migliorare.

Il fatto è che avevo già in casa un server MySQL sul Raspberry Pi, e il Raspberry ha i suoi bei pin di input/output. Ma ho scoperto che i PIO del Rasberry sono digitali, mentre il mio sensore è analogico. Morale: comprerò un sensore di temperatura digitale (tipo questo) e riproverò con una soluzione più diretta e più elegante.

Nel frattempo: come spiegare il picco delle ore sei?

AGGIORNAMENTO:

MySQL for Excel è fantastico e funziona perfettamente; inoltre importa automaticamente le connessioni create con MySQL Workbench; ma alla terza volta che riscaricavo i dati per aggiornare il grafico mi sono stufato.

Ho invece installato il driver ODBC per MySQL, e adesso la pivot si aggiorna direttamente dal database, senza passaggi intermedi e senza dove ogni volta rifare il lavoro. Molto meglio.

{ Comments on this entry are closed }

Temp/light sensor

Una delle cose interessanti dello Spark (il simil-Arduino con WiFi integrato) è che pubblica automaticamente nel cloud il suo stato.

Una delle cose interessanti di Google Spreadsheets è che è programmabile, e gli puoi chiedere di prendere i dati da una url:
Gdocscript

Metti insieme le due cose, e questo è il risultato:

gdocsresult

Ero molto contento della scoperta, che mi apriva nuovi e mirabolanti orizzonti. Poi sono andato ad automatizzare il tutto, creando un trigger che mi eseguisse automaticamente lo script ogni 15 minuti:

Gdocstrigger

E qui il bel sogno è svanito. Il trigger di Google Drive non funziona, oppure funziona quando vuole lui. Una veloce ricerca mi ha confermato che è un problema comune a tutti quelli che ci hanno provato.

Morale: bisogna cercare altre strade. Per esempio, alimentare direttamente un database MySQL tramite Temboo.

 

{ Comments on this entry are closed }

Cavalleria Rusticana – Appunti di regia

by Gaspar Torriero on 27/05/2014

(post in progress, mentre aspetto che mi venga affidata la messa in scena)

La trama dell’opera: Turiddu torna da soldato, trova la sua antica fiamma Lola sposata con il carrettiere Alfio e per dispetto si mette con Santuzza, che abita vicino a Lola. Lola si ingelosisce e, approfittando dell’assenza di Alfio, si riprende Turiddu come amante. Il giorno di Pasqua Santuzza scopre la tresca e affronta Turiddu, che la maltratta. Santuzza si vendica andando a a spifferare tutto ad Alfio, nel frattempo ritornato dall’ennesimo viaggio. Alfio sfida a duello Turiddu, e lo ammazza.

L’ambientazione

La scena si svolge nel tempo presente, sulla piazza principale di un paesino della cintura industriale di Milano. E’ bandito qualsiasi riferimento folcloristico.

Turiddu

Da adolescente, Turiddu è stato sradicato dalla sua rete sociale (famiglia, amori, amici) per fare il soldato. Da uomo, è tornato a casa dalla mamma, non ha lavoro, veste diverso (giacca mimetica?), parla diverso. Nel frattempo i suoi vecchi amici si sono sistemati, hanno un lavoro e una famiglia. Turiddu è un uomo solo. Quando si rimette con Lola è consapevole delle conseguenze ma se ne frega. Il Coro gli farà sempre il vuoto intorno.

Alfio

Alfio è uno che si sbatte e che ci tiene. Il lavoro (camionista? agente di commercio?) lo porta spesso lontano da casa, dalla moglie, dagli amici, da cui alla fine si è estraniato. Anche lui è un uomo solo, e anche lui verrà sempre tenuto lontano dal Coro.

Lola

Lola è una che se la tira. Non è bella ma è capace di mettersi bene. Crede di avere il controllo della situazione, e come Turiddu ha sottovalutato la reazione di Santuzza. Il Coro la avvolge e la protegge in tutte le scene, e se la porta via quando le cose si mettono male.

Santuzza

Santuzza è giovanissima e bellissima ma non lo sa, così come non si accorge di tante altre cose. E’ una ingenua innocente fino a quando capisce di essere tradita. Quando spiffera tutto ad Alfio sa già come andrà a finire, e ne gode. Anche lei è sempre protetta dal Coro (o forse no?).

Le coppie

Lola non ama Alfio che ha sposato per interesse, ma nemmeno ama Turiddu: se l’è ripreso come fanno i bambini quando vedono un altro bambino che usa il loro giocattolo.

Turiddu non ama Santuzza, con cui si è messo per far dispetto a Lola, e in fondo non ama neanche Lola, con cui si è messo nell’illusione che “tutto torni come prima”.

Alfio ama Lora? Forse. Sicuramente la considera sua proprietà, guadagnata con il sudore della fronte.

Santuzza, unica, ama Turiddu di un amore purissimo; che però si tramuta in odio quando si scopre ingannata, e scatena la tragedia.

Il Coro

Il Coro è il vero personaggio negativo di questa storia. Vede tutto, sa tutto, ma non fa niente per evitare il putiferio. Quando si rivolge ai vari personaggi, lo fa sempre in modo stereotipato e insincero I coristi hanno un gruppo chiuso su facebook, a cui Turiddu e Alfio non sono invitati. La pagina del gruppo è proiettata in scena e aggiornata in tempo reale dai coristi stessi.

Possibile variante: Santuzza scopre tutto quando qualcuno del Coro posta pubblicamente una cattiveria, credendo di postare nel gruppo chiuso di Facebook .

Il senso

L’opera si concentra sul momento in cui il precario equilibrio tra il gruppo chiuso (il Coro) e gli alieni (Turiddu e Alfio) viene rotto da Santuzza, l’agnello ferito che diventa tigre. Scenografia, luci e costumi sottolineeranno la differenza tra prima che Santuzza si ribelli e dopo che ha fatto la spia ad Alfio.

Tu come lo faresti?

{ Comments on this entry are closed }

Excel: anni e mesi tra due date

by Gaspar Torriero on 14/04/2014

Aggiornamento:

Su prezioso suggerimento di Federico Giacanelli che qui pubblicamente ringrazio, ho modificato la formula originale in modo che funzioni correttamente anche per periodi superiori ai 24 mesi, e ho corretto il post di conseguenza.

Paola lavora per una associazione professionale e si occupa delle iscrizioni, che iniziano in periodi diversi e valgono per periodi diversi. Anche l’ammontare della quota varia a seconda del tipo di socio.

Paola ha bisogno di imputare a ogni anno la parte di quota di iscrizione proporzionale ai mesi di validità di quell’anno. I dati rilevanti che estrae dal gestionale in un foglio di Excel sono la data di inizio, la data di fine e l’ammontare della quota:

situazione_iniziale

Ti faccio un esempio: se un socio in data 01/06/2012 ha pagato $240 per 24 mesi, Paola vuole imputare $70 nel 2012, $120 nel 2013 e $50 nel 2014. Il primo passo è trovare il numero di mesi

  • del primo anno fino a fine anno se finisce in un anno diverso altrimenti dalla data di inizio alla data di fine:
    E2==SE(ANNO(C2)>ANNO(B2);13-MESE(B2);MESE(C2)-MESE(B2)+1)
  • dell’ultimo anno se maggiore del primo:
    F2=SE(ANNO($C2)>ANNO($B2);MESE($C2);0)
  • degli anni intermedi se maggiori del primo e minori dell’ultimo:
    =SE(ANNO($C2)>ANNO($B2);(ANNO(C2)-ANNO(B2)-1)*12;0)

Questa è la tabella risultante:

situazione_intrmedia_1

A questo punto bisogna aggiungere una colonna per ogni anno in cui calcolare la parte di quota da imputare, controllando se l’anno nella riga 1 è iniziale, finale o intermedio e moltiplicando la quota mensile (Amount / Total months) per il relativo numero di mesi. Se invece l’anno in questione è esterno all’intervallo, la cella viene lasciata vuota. La formula in I2, copiabile a destra con gli opportuni $, è la seguente:

=SE(ANNO($B2)=I$1;$D2/$H2*$E2;
SE(ANNO($C2)=I$1;$D2/$H2*$F2;
SE(E(I$1>ANNO($B2);I$1<ANNO($C2));$D2/$H2*12;””)))

Questa è la tabella risultante:

situazione_intrmedia_2

A questo punto è possibile nascondere le colonne da E a H, oppure eliminarle dopo aver copiato in I2 (con santa pazienza) le loro formule al posto dei relativi riferimenti di cella, ottenendo questa bella lenzuolata:

=SE(ANNO($B2)=E$1;$D2/(13-MESE($B2)+SE(ANNO($C2)>ANNO($B2);
MESE($C2);0)+SE(ANNO($C2)>ANNO($B2);
(ANNO($C2)-ANNO($B2)-1)*12;0))*(13-MESE($B2));
SE(ANNO($C2)=E$1;$D2/(13-MESE($B2)+SE(ANNO($C2)>ANNO($B2);
MESE($C2);0)+SE(ANNO($C2)>ANNO($B2);
(ANNO($C2)-ANNO($B2)-1)*12;0))*(SE(ANNO($C2)>ANNO($B2);
MESE($C2);0));SE(E(E$1>ANNO($B2);E$1<ANNO($C2));
$D2/(13-MESE($B2)+SE(ANNO($C2)>ANNO($B2);
MESE($C2);0)+SE(ANNO($C2)>ANNO($B2);
(ANNO($C2)-ANNO($B2)-1)*12;0))*12;””)))

E questa è la situazione finale:

situazione_finale

Se ti serve, il file è questo: Esempio – mesi e anni tra due date. Se hai qualche altra soluzione più elegante, come ad esempio quella di Federico, fatti sotto.

{ Comments on this entry are closed }

Campionato Velico del Lario 2014 ORC/Metrico

by Gaspar Torriero on 04/04/2014

Comincia domani il primo Campionato Velico del Lario con le regate organizzate dallo Yacht Club Como: sabato pomeriggio un percorso a bastone, domenica mattina la crociera Cernobbio-brienno-Cernobbio.

Siamo ben 55 imbarcazioni iscritte: 11 Orza6, 6 J24, 5 Fun, 4 Explorer 20, 3 Melges 24 e altri 23 tipi vari. I circoli più rappresentati sono quelli che hanno il vento: Valmadrera, Dervio e Bellano (31 barche).

Noi partecipiamo con il First211 di Arturo, barca molto meno tecnica del Fun a cui siamo (mal)abituati. Niente complicate volanti, comodo rollafiocco, gennaker invece dello spinnaker. Il prodiere si farà delle grosse penniche.

{ Comments on this entry are closed }

Excel per iPad: cosa c’è che non va

aprile 2, 2014

Niente macro Niente connessione dati Niente PowerPivot Niente collegamenti ipertestuali Niente filtro interattivo (slicer) Visualizza ma non crea tabelle Pivot Visualizza ma non crea formattazioni condizionali Visualizza ma non crea convalide visualizza ma non crea sparklines, smartart, wordart Lo potrei vedere in mano agli agenti di commercio: buono per consultare, buono per compilare, no buono […]

Read the full article →

Corso online: Making Sense of Data

marzo 21, 2014

Ti segnalo questa buona iniziativa di Google: Making Sense of Data: si tratta di un corso online attivo dal 18 marzo al 4 aprile in cui vengono spiegati i fondamentali sulla raccolta e analisi di dati con le Fusion Tables. Il corso è di livello base, si rivolge a chi non ha esperienza di analisi […]

Read the full article →