在使用 Linux 系统的 NAS 上部署 Fitbit 数据同步程序

使用 Fitbit 已经三个多月了,用它来记录每天的运动量以及睡眠质量感觉很方便。

不过因为我用的电脑是笔记本,如果要同步 Fitbit 的数据,就需要把 Fitbit Base Station 连接在笔记本电脑上,然后 Fitbit 的数据才会同步到官网上。

因为家里没有 24 小时开机的电脑,所以没办法直接把 Fitbit Base Station 连接在一台电脑上实现回家自动同步。

但是家里有下载机是 24 小时运行的,于是去 Fitbit 官网看看有没有提供 Linux 下的 Fitbit 同步程序。

很不幸的是,Fitbit 官方只提供了 Windows 和 Mac OS X 版本的同步程序,没有提供 Linux 下的 Fitbit 同步程序。

昨天突然想到去网上找找看有没有非官方的 Linux 平台 Fitbit 同步程序,没想到还真找到了。

在网上找到了两个项目,用来提供跨平台的 Fitbit 同步功能。

开源的 Fitbit 同步程序

libfitbit

项目地址:

libfitbit is an implementation of the data retrieval protocol for the fitbit health tracking device. It also implements a synchronization client for synchronizing data with the fitbit website on platforms not supported by Fitbit currently.

fitbitd

项目地址:

fitbitd synchronises FitBit trackers with the FitBit.com service. You simply leave it running in the background and it will synchronise the tracker periodically, just like the official FitBit software does for Windows or Mac OS.

libfitbit 是用 python 编写的,功能上可能相对简陋一些,而 fitbitd 是使用 C 编写的,功能相对于 libfitbitd 强大一点,并且提供了 Linux 桌面环境中的状态栏插件。

不过因为我是要在 DS211j 上安装,而 DS211j 的 CPU 是 ARM 而非 x86,因此如果要安装这些程序都需要自己来编译。

在多次尝试之后,我选择了 libfitbit 而不是 fitbitd,因为 fitbitd 要用到 dbus,在编译时会遇到很多问题。如果只是为了同步 Fitbit 数据,libfitbit 已经基本够用,并且像 daemon 模式,也可以通过 nohup 来实现。

在 DS211j 上安装包管理程序 ipkg

注意:文中所有在 NAS 上的操作均以 root 用户进行

首先需要在 DS211j 的控件台里启用 SSH 服务,然后使用 SSH 连接到 NAS,安装 ipkg:

wget http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/syno-mvkw-bootstrap_1.2-7_arm.xsh
chmod +x syno-mvkw-bootstrap_1.2-7_arm.xsh
./syno-mvkw-bootstrap_1.2-7_arm.xsh
ipkg update

注意,如果安装完 ipkg 可能需要修改一下 .profile 文件,防止 /opt 可能没有加到 PATH 环境变量的问题,需要把:

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
export PATH

修改为:

PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
export PATH

安装所需软件

编译以及运行所需软件包如下:

  • gcc
  • python27

直接使用 ipkg 安装即可:

ipkg install gcc python27

编译 libusb-1.0

DS211j 使用的软件源中的 libusb 是 0.1 版本的,而 libfitbit 需要的是 1.0。如果使用 libusb-0.1 虽然 libfitibt 可以运行,但是无法接收数据。

先去 下载一个 libusb-1.0.9,解压到放到 NAS 上,然后进行编译安装。

注意在编译前需要修改 libusb 的 Makefile,默认情况下编译的话,在使用时会出现“undefined reference to `clock_gettime'” 错误。

./configure --prefix=/opt
vi libusb/Makefile
# 修改 LDFLAGS= 为 LDFLAGS=-lrt
make
make install

使用 libfitbit

下载 libfitbit,解压后把 python 目录放到 NAS 的 /root 中,并且重命令为 libfitbit。

下载 libfitbit 依赖的 pyusb 模块,解压后把 usb 目录放到 NAS 的 /root/libfitbit 目录中。

这时需要把 Fitbit Base Station 连接到 DS211j 上。

在 NAS 上进入 /root/libfitbit 目录,运行 python2 fitbit.py 测试安装是否正常。

Start reset () {}
    sent: ['a4', '01', '4a', '00', 'ef']
received: ['a4', '01', '6f', '20', 'ea']
End reset None
# 其他日志省略...
End open_channel None
Waiting for receive

如果出现 Waiting for receive 就说明 fitbit.py 已经正常运行了,如果有 Fitbit Ultra Tracker 在 Fitbit Base Station 附近,那么就会继续出现其他日志。

接下来就要让 libfitbit 在后台一直运行了。libfitbit 本身提供了每隔 15 分钟同步一次数据的功能,但没有提供后台运行的功能,不过借助于 Linux 中的 nohup 命令可以轻松实现。

nohup python2 fitbit_client.py > /tmp/libfitbit.log &

注意,这里会把 libfitbit 产生的日志输出到 /tmp/libfitbit.log 中,但是 /tmp 的容量不会很大,所以正式使用时,可以直接将日志输出到 /dev/null:

nohup python2 fitbit_client.py > /dev/null &

结语

感谢 Kyle Machulis 带来这么棒的开源项目。

最开始一直尝试在 My Book Live 上配置 libfitbit 和 fitbitd,但是弄到最后突然发现,My Book Live 并没有 USB 接口⋯⋯

如果只是 Linux 用户希望在 Linux 系统下同步数据,如果又刚好是 Ubuntu 或 Mint 用户的话,那么使用 fitbitd 可能是一个更好的选择,因为作者已经提供了一个 PPA 源来直接安装 fitbitd,并且还有状态栏插件可以用。Arch 用户也可以直接用 sudo pacman -Sy fitbitd-git 来安装。

当然,如果你也像我一样,不喜欢电脑上拖着个小尾巴,家里也刚好有个带 USB 接口并且 24 小时运行的 Linux 设备,也么也可以折腾一下。

希望此文对爱好 量化生活 的朋友们有所帮助。

参考资料

  1. Overview on modifying the Synology Server, bootstrap, ipkg etc
  2. What kind of CPU does my NAS have
  3. http://sourceforge.net/projects/libusb/files/libusb-1.0/
  4. undefined reference to涉及的链接问题
  5. https://github.com/qdot/libfitbit
  6. http://sourceforge.net/projects/pyusb/files/PyUSB%201.0/
  7. http://www.paulburton.eu/projects/fitbitd/
  8. http://www.fitbit.com/

--- EOF ---

发表评论?

13 条评论。

  1. 会折腾的人真了不起,羡慕嫉妒恨啊!

    话说我在等 Fitbit One ,但这玩意儿只支持 iPhone 4S/5 ,手上还是 iPhone 4 的我汗颜啊,好在 One 也还没发布,5 也还搞不到。。。 :roll:

  2. 哥 ,我更新了你的goagentx,不能用了啊
    Error: Not Found

    The requested URL /2 was not found on this server.

  3. eZ430 Chronos Dev Tool | Y12 Studio - pingback on 11月 27, 2012 在 5:16 下午
  4. Hello!
    Thank you for this very good tutorial.
    I followed it step by step but
    make
    fails with an error:
    core.c:1771: error: implicit declaration of function 'usbi_gettimeofday'
    make[2]: *** [libusb_1_0_la-core.lo] Error 1

    I did change the libusb/Makefile to:
    LDFLAGS = -LRT

    Do you know how to fix this problem?

    Thank you!

    • Use libusb 1.0.9 and change -LRT to -lrt and have a try?

      • Using libusb 1.0.8 make and make install were successful.
        But trying to run python2 fitbit.py I receive error:

        Traceback (most recent call last):
        File "fitbit.py", line 386, in
        sys.exit(main())
        File "fitbit.py", line 352, in main
        if not base.open():
        File "/root/libfitbit2/antprotocol/bases.py", line 26, in open
        if not super(FitBitANT, self).open(vid, pid):
        File "/root/libfitbit2/antprotocol/libusb.py", line 63, in open
        idProduct = pid)
        File "/root/libfitbit2/usb/core.py", line 856, in find
        raise ValueError('No backend available')
        ValueError: No backend available

        It seems Python cannot find libusb in /opt/lib/
        I tried all versions of PyUSB.

  5. I have a Ultra. lsusb does not find a device with VID = 0x0fcf PID = 0×1008.
    My FitBit base matches Vendor:0x10c4 Product:0x84c4.
    lsusb reports:
    Bus 001 Device 006: ID 10c4:84c4 Cygnal Integrated Products, Inc.
    Python can find and load libusb1 correctly.

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Trackbacks and Pingbacks: