venerdì 13 gennaio 2012

Datalogger + GDocs + Python + Android

Una versione differente del datalogger con salvataggio non in locale ma in real timesu Goggle Docs

Per prima cosa si deve creare uno Spreadsheet su Google Docs mettendo nella prima riga il nome delle colonne che saranno poi di riferimento per lo scrpit Python (i nomi devono essere minucoli e senza caratteri speciali)
Ci si deve inoltre annotare la key che compare nella URL


a questo punto lo script del Datalogger e' modificato come segue utilizzando le librerie GData che sono incluse in Python per SL4A nel pacchetto extra
-----------------------------------------------------------------------------------------------------
import android, time
from time import strftime
import gdata.spreadsheet.service

droid = android.Android()

email = 'lucainnoc@gmail.com'
password = 'password'
# Find this value in the url with 'key=XXX' and copy XXX below
spreadsheet_key = '0AvBeE7yoBqdHdFdmOW1UQUthVFpMZzF1S0lRWjRWdFE'
worksheet_id = 'od6' #indica il primo foglio

spr_client = gdata.spreadsheet.service.SpreadsheetsService()
spr_client.email = email
spr_client.password = password
spr_client.source = 'Example Spreadsheet Writing Application'
spr_client.ProgrammaticLogin()


droid.startSensingTimed(1,1000)
time.sleep(3)
acq = 0
while True:
    accx = str(droid.sensorsReadAccelerometer().result[0])
    accy = str(droid.sensorsReadAccelerometer().result[1])
    accz = str(droid.sensorsReadAccelerometer().result[2])
    az = str(droid.sensorsReadOrientation().result[0])
    pitch = str(droid.sensorsReadOrientation().result[1])
    roll =  str(droid.sensorsReadOrientation().result[2])
    orario = strftime("%Y-%m-%d %H:%M:%S")
    dict = {}
    #dict['date'] = time.strftime('%m/%d/%Y')
    dict['time'] = orario
    dict['accx'] = accx
    dict['accy'] = accy
    dict['accz'] = accz
    dict['az'] = az
    dict['pitch'] = pitch
    dict['roll'] = roll

    entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id)
    if isinstance(entry, gdata.spreadsheet.SpreadsheetsList):
          #print "Insert row succeeded."
          acq = acq + 1
          print "Dato " + str(acq)
    else:
          print "Insert row failed."   
       time.sleep(1)

droid.stopSensing()
conn.close()
-----------------------------------------------------------------------------------

Lanciando lo script su telefono e tenendo aperto il foglio di calcolo nel browser del computer si vedranno le righe popolarsi con il passare del tempo. Il tempo di campionamento minimo e' piuttosto lungo (al minimo occorre circa 1 secondo per acquisizione) a causa della latenza della rete

Riferimenti :  http://www.brokenairplane.com/2011/08/im-not-texting-im-programming.html (il sistema di autenticazione del mio script rispetto a quello di DoScience.py e' differente in quanto con il metodo proposto al link Google risponde con un errore di autenticazione)