Mar 162014
 

fitbit linux
Recentemente ho ricevuto un FitBit flex come regalo, e mi piace, questo dispositivo personale registra i passi, la distanza e le calorie bruciate. Di notte, traccia la qualità del sonno e ti sveglia silenziosamente al mattino. Basta controllare le luci per vedere come si accumulano rispetto al proprio obiettivo personale. Flex consente di impostare un obiettivo e utilizza luci a LED per mostrare come si sta andando. Ogni indicatore rappresenta il 20% del proprio obiettivo . Si sceglie quale – passi, calorie, o la distanza. Si accende come un tabellone, invogliando ad essere ogni giorno più attivi.

Flex sincronizza automaticamente i dati con PC e Mac con il dongle Wireless di Fitbit ( incluso), molti dispositivi iOS ed alcuni telefoni Android si collegano al dispositivo. Ora tutto questo suono fantastico e davvero divertente se vi piace prendere le vostre statistiche e vedere bei grafici, ma c’è un piccolo (grande) problema circa Fitbit, non supporta ufficialmente Linux.

Certo, è possibile utilizzare un smartphone , ma in generale mi piace l’idea di utilizzare i miei computer Linux per tutto e facendo alcune ricerche ed alcuni test sono stato in grado di sincronizzare con successo il mio flex con il mio Linux Mint 16 .



Da Fitbit one and Debian:

In primo luogo, inizierò con alcune informazioni tecniche sul Fitbit. I nuovi sistemi FitBit utilizzano Bluetooth 4.0 LE per la sincronizzazione, piuttosto che il protocollo ANT proprietario. Questo è un bene ed un male per gli sviluppatori. Il protocollo Bluetooth è abbastanza aperto per sviluppare, ma vi sono ancora problemi di come comunicare con il tracker Fitbit. Fortunatamente per noi, ci sono sviluppatori che hanno lavorato sui modi per farlo .

La più antica implementazione per sincronizzare Fitbit era con libfitbit – questo era il protocollo ANT per sincronizzare i tracker. Questo si è evoluto fino a quando una brava persona di nome Benoît Allard ha creato uno script python chiamato galileo . Questo è lo script che ci accingiamo a utilizzare per sincronizzare il tracker. Una cosa interessante Fitbit, è che il server analizza l’ID del dispositivo e collega i dati trasmessi ai conti appropriati, piuttosto che un’applicazione client – side che svolgesse il collegamento ad un determinato account. Questo rende la sincronizzazione un po’ più facile.

Galileo è un programma di utilità Python per sincronizzare in modo sicuro un dispositivo Fitbit con il servizio web Fitbit. Esso permette di consultare i dati sul loro sito web, e le loro applicazioni.

Tutti i tracker basati su Bluetooth sono supportati. Questi sono:

  • Fitbit One
  • Zip Fitbit
  • Fitbit Flex
  • Probabilmente Fitbit Force

nota : Il tracker Ultra di Fitbit è ** non supportato ** in quanto comunica utilizzando il protocollo ANT. Per sincronizzarlo si può utilizzare libfitbit.

Le caratteristiche principali di Galileo sono:

  • Sincronizza i tracker Fitbit con il server Fitbit utilizzando il dongle incluso.
  • Comunica (tramite HTTPS) con il server Fitbit.
  • Salvare tutti i tuoi dati a livello locale con un dump per un eventuale successiva analisi.

Dan, l’autore dell’articolo ha correttamente installato la versione stabile di Galileo in una Debian 7 e tutto ha funzionato senza problemi per lui, io non ho avuto la stessa fortuna sulla mia Mint 16, quindi probabilmente la maggior parte degli utenti di Ubuntu avranno i miei stessi problemi, ma con qualche cambiamento sono riuscito a farlo funzionare, ecco come.

Attenzione: Galileo è ancora nelle sue prime fasi di sviluppo ed è disponibile solo dalla riga di comando, quindi non aspettatevi di avere un’applicazione grafica simile a quella che si trova in Windows, per usarlo si deve lavorare sul terminale, la buona notizia è che non è così difficile farlo funzionare e probabilmente in futuro qualche applicazione grafica basata su di esso sarà disponibile per tutti.

Installare le librerie necessarie

Galileo è scritto in python e quindi abbiamo bisogno delle librerie usb per python, per distribuzioni basate su Debian potete usare questo comando:

sudo apt-get install python-usb python-requests

Inoltre Galileo richiede le librerie pyusb alla versione 1.0 o superiore, la 0.4 non è supportata, quindi ho seguito il suggerimento di Dan ed ho aggiornato manualmente la libreria python-usb con le sue istruzioni:

Scaricare lo script pyusb dal file zip che si trova qui .

Decomprimere la cartella in una posizione comoda.

Andare nella nuova directory in un terminale come root ed eseguire il seguente comando:

 python setup.py install

Ora avete i prerequisiti installati.

Installare Galileo, metodo 1

Come primo metodo vi suggerisco di provare a installare Galileo in modo “standard”, questo sembra funzionare per alcune distribuzioni (Debian e Arch), per fare questo aprire un terminale e digitare:

sudo pip install galileo

Dovreste avere un output di questo tipo:

$ sudo pip install galileo
Downloading/unpacking galileo
  Downloading galileo-0.3.1.tar.gz
  Running setup.py egg_info for package galileo
 
Requirement already satisfied (use --upgrade to upgrade): requests in /usr/lib/python2.7/dist-packages (from galileo)
Requirement already satisfied (use --upgrade to upgrade): pyusb in /usr/local/lib/python2.7/dist-packages (from galileo)
Installing collected packages: galileo
  Running setup.py install for galileo
 
    Installing galileo script to /usr/local/bin
Successfully installed galileo
Cleaning up...

Ora è possibile testare questa versione di Galileo con il comando :

 sudo galileo

Se tutto funziona dovreste vedere qualcosa di simile a :

1 trackers found, 0 skipped, 1 successfully synchronized

E si può passare alla sezione “Come eseguire Galileo come utente diverso da root” , nel mio caso ho ottenuto questo errore :

$ sudo galileo
Traceback (most recent call last):
  File "/usr/local/bin/galileo", line 9, in 
    load_entry_point('galileo==0.3.1', 'console_scripts', 'galileo')()
  File "/usr/local/lib/python2.7/dist-packages/galileo.py", line 564, in main
    total, success, skipped = syncAllTrackers(cmdlineargs.force, cmdlineargs.dump)
  File "/usr/local/lib/python2.7/dist-packages/galileo.py", line 423, in syncAllTrackers
    fitbit.disconnect()
  File "/usr/local/lib/python2.7/dist-packages/galileo.py", line 203, in disconnect
    self.dongle.ctrl_write([2, 2])
  File "/usr/local/lib/python2.7/dist-packages/galileo.py", line 150, in ctrl_write
    l = self.dev.write(0x02, data, self.CtrlIF.bInterfaceNumber, timeout=timeout)
TypeError: write() got multiple values for keyword argument 'timeout'

Installare Galileo, metodo 2

Ho scaricato lo zip della versione più recente dalla pagina del progetto e l’ho decompresso.
Ora, nella nuova directory troverete il comando run , che in questa versione sostituisce il comando galileo .

Per testarlo muoversi nella nuova directory e dare il comando:

sudo ./run

Ancora una volta, se si vede un output di successo tutto è fatto e si può passare alla sezione successiva, nel mio caso avevo ancora un errore:

$ sudo ./run
No handlers could be found for logger "galileo.config"
# A serious error happened, which is probably due to a
# programming error. Please open a new issue with the following
# information on the galileo bug tracker:
#    https://bitbucket.org/benallard/galileo/issues/new
# ./run: 0.4dev
# Python: 2.7.5+ (default, Feb 27 2014, 19:37:08) [GCC 4.8.1]
# Platform: Linux mint-desktop 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64
# pyusb: 1.0.0b2
# requests: 1.2.3
# yaml: own version
Traceback (most recent call last):
  File "./run", line 5, in 
    main()
  File "/home/linuxaria/Downloads/benallard-galileo-540c1f6d394a/galileo/main.py", line 239, in main
    }[config.mode](config)
  File "/home/linuxaria/Downloads/benallard-galileo-540c1f6d394a/galileo/main.py", line 174, in sync
    total, success, skipped = syncAllTrackers(config)
  File "/home/linuxaria/Downloads/benallard-galileo-540c1f6d394a/galileo/main.py", line 37, in syncAllTrackers
    fitbit.disconnect()
  File "/home/linuxaria/Downloads/benallard-galileo-540c1f6d394a/galileo/tracker.py", line 36, in disconnect
    self.dongle.ctrl_write([2, 2])
  File "/home/linuxaria/Downloads/benallard-galileo-540c1f6d394a/galileo/dongle.py", line 115, in ctrl_write
    l = self.dev.write(0x02, data, self.CtrlIF.bInterfaceNumber, timeout)
TypeError: write() takes at most 4 arguments (5 given)

Guardando nella lista di bug di Galileo ho trovato questa  informazione:

Benoît Allard

This is a duplicate of issue #36 and #27. Please use a tagged release of pyusb, or remove the third parameter in the calls to write and read in galileo/dongle.py

Io non sono un programmatore python, ma ho provato a seguire l’istruzione e così ho tolto il terzo parametro nel file galileo/dongle.py, per farla breve ho rimosso il parametro self.CtrlIF.bInterfaceNumber nelle linee: 115, 122, 136 e 144 (il numero di riga potrebbe cambiare nelle versioni future).

Questo è un diff dal file originale e quello ho cambiato:

115c115
< l = self.dev.write(0x02, data, self.CtrlIF.bInterfaceNumber, timeout) --- >         l = self.dev.write(endpoint=0x02, data=data, timeout=timeout)
122c122
< data = self.dev.read(0x82, length, self.CtrlIF.bInterfaceNumber, --- >             data = self.dev.read(0x82, length,
136c136
< l = self.dev.write(0x01, msg.asList(), self.DataIF.bInterfaceNumber, --- >         l = self.dev.write(0x01, msg.asList(), 
144c144
< data = self.dev.read(0x81, 32, self.DataIF.bInterfaceNumber, --- >             data = self.dev.read(0x81, 32,

E con questo cambiamento finalmente funziona con Mint 16 !!

$ ./ sudo run -v
2014-03-16 22:38:11,302:INFO: Running in mode: sync
2014-03-16 22:38:11,314:INFO: Disconnecting from any connected trackers
2014-03-16 22:38:13,328:INFO: Discovering trackers to synchronize
2014-03-16 22:38:17,340:INFO: 1 trackers discovered
2014-03-16 22:38:17,340:INFO: Attempting to synchronize tracker EDB71B44D7D7
2014-03-16 22:38:17,353:INFO: Starting new HTTPS connection (1): client.fitbit.com
2014-03-16 22:38:26,911:INFO: Getting data from tracker
2014-03-16 22:38:27,819:INFO: Sending tracker data to Fitbit
2014-03-16 22:38:27,821:INFO: Starting new HTTPS connection (1): client.fitbit.com
2014-03-16 22:38:29,566:INFO: Successfully sent tracker data to Fitbit
2014-03-16 22:38:29,567:INFO: Passing Fitbit response to tracker
1 trackers found, 0 skipped, 1 successfully synchronized

Opzioni utili di Galileo

Stò utilizzando la versione 0.4dev, nella versione 0.3 potreste non avere tutte queste opzioni:

Livello di logging :
-v, –verbose Mostra i progressi durante la sincronizzazione
-d, –debug Mostra le attività interne (implica anche l’output dell’opzione verbose)
-q, –quiet Mostra solo gli errori ed il sommario finale (default)

se sincronizzare anche se il tracker segnala un recente sync (< 15 minuti)

--force
--no-force DEFAULT

Quindi, per impostazione predefinita, se si utilizza il comando run 2 volte di seguito NON invierà i dati a fitbit.com e vedrete un messaggio di skipping:

$ sudo ./run  -v
No handlers could be found for logger "galileo.config"
2014-03-16 22:39:51,946:INFO: Disconnecting from any connected trackers
2014-03-16 22:39:53,959:INFO: Discovering trackers to synchronize
2014-03-16 22:39:57,971:INFO: 1 trackers discovered
2014-03-16 22:39:57,972:INFO: Tracker EDB71B44D7D7 was recently synchronized; skipping for now
2014-03-16 22:39:57,972:INFO: Tracker EDB71B44D7D7 is to be skipped due to configuration; skipping
1 trackers found, 1 skipped, 0 successfully synchronized
Se salvare o no il megadump su file:
 
--dump DEFAULT
--no-dump
 
I dump si trovano per default nella directory ~/.galileo/YOURTRACKERID/ e sono file binari, se non avete intenzione di usarli si può usare l'opzione --no-dump.
 
<h3>Come eseguire Galileo come utente non privilegiato</h3>
 
L'esecuzione di galileo richiede sudo, ma si può aggirare questa limitazione aggiungendo una semplice regola udev. Creare e aggiungere quanto segue a /etc/udev/rules.d/99-fitbit.rules
 
<pre lang="bash">SUBSYSTEM=="usb", ATTR{idVendor}=="2687", ATTR{idProduct}=="fb01", SYMLINK+="fitbit", MODE="0666"

Non dimenticatevi di:

Fare un restart dei servizi udev con :

sudo service udev restart

.
togliere e rimettere il dongle usb fornito da fitbit per attivare la nuova regola.

Conclusioni

Come si può vedere il progetto è ancora nuovo ed ha bisogno di qualche ritocco per funzionare, ma ha un sacco di potenzialità ed opzioni utili.
Una volta che funziona sul vostro PC è possibile impostare un cron ogni 30 minuti o più per sincronizzare i dati con il sito web, oppure è possibile eseguirlo come demone (solo versione 0.4 o successiva) ed avere tutte le statistiche aggiornate dal vostro PC GNU/Linux.

Ora è anche possibile invitarmi ad essere vostro amico su fitbit.com, la mia email è [email protected]

Buon allenamento a tutti gli utenti GNU/Linux !



Popular Posts:

flattr this!

  9 Responses to “Come sincronizzare il proprio Fitbit usando Linux”

  1. Galileo is great! One less reason to keep Windows around in a VM.

    After I downloaded galileo, it installed on Fedora 19 without a hitch. I used the following two commands

    yum -y install python-pip pyusb python-requests
    pip install galileo

    Looking forward to seeing the evolution of this product.

  2. Excellent, thank you for this guide.
    I only have one issue left now and thats running it as non sudo
    Followed your guide and created the udev rule, restarted udev etc and it works, but only once , after that it will only work using sudo.
    Seems to work if i pull dongle out and put it back in but will have to check that again in a bit.

    Again thank you for your superb guide

  3. I’ve made it easier for Ubuntu users and packaged galileo in a PPA, so now all you need to do is `sudo add-apt-repository ppa:cwayne18 && sudo apt-get update && sudo apt-get install galileo` and then reboot, and syncing will take place automatically

  4. Followed Chris’s instructions for Ubuntu dated 04/26/2014 above on 14.04 amd64 and was advised “Unable to locate package galileo.”

  5. The install mostly worked for Ubuntu Precise, except for galileo itself.
    ]$ sudo apt-get install galileo
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    E: Unable to locate package galileo

    ]$ sudo apt-get install fitbit-steps-indicator
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    The following packages were automatically installed and are no longer required:
    libts-0.0-0:i386 twolame linux-headers-3.2.0-29
    linux-headers-3.2.0-29-generic libaften0 nvidia-settings-304 mjpegtools
    Use ‘apt-get autoremove’ to remove them.
    The following NEW packages will be installed:
    fitbit-steps-indicator
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 8,070 B of archives.
    After this operation, 60.4 kB of additional disk space will be used.
    Get:1 http://ppa.launchpad.net/cwayne18/fitbit/ubuntu/ precise/main fitbit-steps-indicator amd64 0.2~precise1 [8,070 B]
    Fetched 8,070 B in 0s (25.4 kB/s)
    Selecting previously unselected package fitbit-steps-indicator.
    (Reading database … 839219 files and directories currently installed.)
    Unpacking fitbit-steps-indicator (from …/fitbit-steps-indicator_0.2~precise1_amd64.deb) …
    Setting up fitbit-steps-indicator (0.2~precise1) …

  6. This is fantastic. I was wanting to get this going on Raspberry Pi.
    Worked on it with both Raspbian and Pidora. Pidora required less work.

    Raspbian:
    be sure to apt-get update and apt-get dist-upgrade and apt-get install python-requests (as mentioned above)
    usbhid.quirks=0x2687:0xfb01:0x0004 added to /boot/cmdline.txt (to keep usbhid from taking over the dongle)
    manual upgrade of libusb (1.0.19 I think, http://sourceforge.net/projects/libusb/, download, unpack, ./configure, make and make install — configure required more packages but I don’t recall which) in order for 1.0.0b2 of pyusb and 0.5dev (maybe 0.4 too) of galileo to work.

    Pidora needed pyusb updated only.

    galileo needed adjustments to the write and read params in dongle.py similarly as mentioned above.

    Also had trouble running in daemon mode (my preference). Kept getting Resource busy on the second run. Finally figured out how to fix that (after many hours trying to understand the code). In dongle.py in class USBDevice change:

    def __del__(self):
    pass

    to:

    def __del__(self):
    self.dev.reset()
    pass

    This made it work nicely.

    Now just need to add wifi dongle and connect to local wireless, pick a nice central location and power it up and let it go.

  7. I have the same unable to locate package issue:
    E: unable to locate package galileo

    Ubuntu version is 12.04

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>