使用 Python 从 Fitbit 手环获取数据并在 Grafana 中显示图表

事情进行的怎么样了? 今天,我们将提供一份文件,所有拥有 Fitbit 手环的人肯定会对此感兴趣, 您已经知道我们可以获取有关我们的生活方式等的数据… 井, 如果您想利用这些信息并以漂亮的图形查看它, 这是您的文档! 使用 Python 脚本,我们将获取我们感兴趣的测量值,并将它们存储在 MySQL 数据库中, 然后使用 Grafana 绘制我们感兴趣的图形!

我想这里会有很多 Raspberry Pi 和其他 fricadas 的粉丝, 假设您有一个 魔镜 安装, 您已经知道一面镜子后面有显示器,并且您想通过再给它一个额外的触摸来自动化您的家,当您看到镜子中的自己时,您就会知道自己的进度, 行驶公里数, 采取的步骤, 燃烧的卡路里, 脉动图, 攀爬楼层数… 井… 您可以按照以下步骤完成所有操作, 总有一天,我会把我设置的有趣的项目放在家里 🙂

 

我说了什么, 我们需要的内容? 安装了 Apache 和 MySQL 的服务器, 我们将创建一个数据库,用于存储我们感兴趣的内容 (我们将看几个例子), 我们将在 Fitbit 网站上注册以创建一个应用程序,我们将了解如何获取访问令牌,我们将在 python 脚本中使用该令牌,以将 Fitbit 云中的信息提取到一个 json 文件中,我们将将其保存在本地,以便稍后将其导出到数据库. 在那之后他已经被吸走了, 因为我确定您已经安装了 Grafana (如果你不看一眼 这里), 我们要做的是对数据库进行 MySQL 查询,以获取我们感兴趣的内容!

场景非常简单, 一个 Raspberry Pi,每天在 23:55h 执行一个 Python 脚本,该脚本执行上述操作, 将每天的数据存储在 MySQL 数据库的表中,并且可以从我们安装了 Grafana 的任何地方访问, 位于同一 Raspberry Pi 上, 在另一台计算机上… 我一如既往地告诉你, 我不是程序员或开发人员, 我只告诉你我是怎么得到的,以防有人对做很酷的事情感兴趣! 当然还有其他方法, 但这个并不复杂!

 

首先要做的是访问网站 https://dev.fitbit.com 并创建一个帐户(如果我们没有帐户), 然后, 我们访问 https://dev.fitbit.com/apps/new 并按照以下步骤创建新应用程序:

  • 应用程序名称: 我们表示一个描述性名称, 在我的情况下,Python Pi 197
  • 描述: 我们编写一些东西,将这个应用程序与我们正在进行的项目相关联.
  • 申请网站: 我们放置一个 URL, 例如 http://www.bujarra.com
  • 组织: 组织名称, p. 例如: 布哈拉
  • 组织网站: 我们再次指示 URL, HTTP 协议://www.bujarra.com
  • 哦 2.0 应用程序类型: 我们选择“员工”’
  • 回调 URL: 我们离开 http://google.com
  • 默认访问类型: 我们确认它保持为“只读”.

 

我们记录应用程序,并在其属性上看到哪个是我们的 客户端 ID 以及我们的 客户端密钥 我们会在那里写下来,因为我们需要它.

 

我们访问 https://dev.fitbit.com/apps/oauthinteractivetutorial 要生成 访问令牌 从 Python 进行查询时,我们需要验证自己的内容是什么. 所以我们在 section 中填写数据 1, 我们将在其中指示我们的 客户端 ID, 我们 客户端密钥 我们指示您将我们重定向到任何网站, 我们标记了我们想要访问的有关我们健康的信息,并且这些信息很重要, 我们必须指明 令 牌 (86400 为 1 日 604800 为 1 周 2592000 为 30 日 31536000 为 1 年), 正常情况下,将 1 年,这样就不必续订 令 牌. 单击它向我们显示的链接,然后在新选项卡中打开它, 我们复制 URL.

 

在零件 2 我们粘贴答案并验证数据是否正确, 如果是这样,我们最终将拥有我们的 令 牌!

 

因此,如果我们想验证我们已经可以从 Raspberry 访问数据,我们可以执行以下命令来可视化最后一天每分钟行驶的距离数据, 如果一切正确,它将以 JSON 格式显示. 跑:

[源代码]curl -H “授权”: 不记名 NUESTRO_TOKEN" https://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json[/源代码]

 

在此网站上,您有更多示例来查看有关其他值或其他期间的更多信息: https://dev.fitbit.com/reference/web-api/activity/#get-daily-activity-summary.

 

如果一切正确,我们可以创建一个小脚本,我将其命名为 'fitbit_carga_datos.sh‘ 它将获取 Fitbit 数据的最后一天, 行驶的距离, 采取的步骤, 楼层攀升, 心跳或睡眠时间等信息. 我将把每种类型的信息保存在一个 json 文件中,我将把它留在 Apache 目录中, 因为我们以后会需要它. 这将是将数据加载到 DB 中的脚本:

[源代码]# 距离
curl -H “授权”: 不记名 eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json > /var/www/temp/fitbit_distancia.json

/usr/bin/python /home/pi/fitbit_distancia.py

# 步骤
curl -H “授权”: 不记名 eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/steps/date/today/1d.json > /var/www/html/fitbit_pasos.json

/usr/bin/python /home/pi/fitbit_pasos.py

# 地板
curl -H “授权”: 不记名 eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/floors/date/today/1d.json > /var/www/html/fitbit_pisos.json

/usr/bin/python /home/pi/fitbit_pisos.py

# 心
curl -H “授权”: 不记名 eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/heart/date/today/1d.json > /var/www/html/fitbit_corazon.json

/usr/bin/python /home/pi/fitbit_corazon.py

# 睡
FETXA='日期 +“%Y-%m-%d”'
curl -H “授权”: 不记名 eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/sleep/date/$FETXA.json > /var/www/html/fitbit_dormir.json

/usr/bin/python /home/pi/fitbit_dormir.py[/源代码]

 

正如我们所看到的, 我们将不得不改变并把我们的代币放好, 从网站下载数据后,正如我们所说,它将其保存在 JSON 文件中,然后在 Python 中执行一个文件,该文件获取每个 JSON 并将其插入到不同的数据库中.

我们保存它并使其可执行!

 

因此, 我们必须创建与我们将要分析的指标一样多的 Python 脚本, 但在我们继续前进之前,我们将在途中停下来,我们将 创建数据库和表 我们需要的, 这将是 python 文件将每个 json 导入到相应的 TABLE 中的位置. 我们可以通过 HeidiSQL 等 MySQL 管理器或直接从 shell 连接的 linux shell 来完成. 我们为每个测量创建一个 TABLE, 在我的情况下,它们被称为 Tables: fitbit_distancia, fitbit_pasos, fitbit_dormir… 而且它们非常简单, 有 2 列, 一个叫做“公里”’ (浮) 另一个叫做 'Date’ (日期) 在距离 DB 的情况下; 在 fitbit_pasos 中将是 2 列: 步骤和日期, 为了 fitbit_pisos: 楼层和日期… 等等, 是的? 我们也可以创建一个包含更多列的表, 但我们每一次都想怎么去. 创建表的示例:

[源代码]创建表 'fitbit_distancia' (
'kilometers' FLOAT NOT NULL,
'date' 日期 NOT NULL
)
COLLATE='latin1_swedish_ci’
引擎=InnoDB
;[/源代码]

 

定义数据存储位置后, 我们要做的是创建 Python 文件,该文件将读取包含数据的 JSON 文件,然后通过查找我们感兴趣的值并将其插入相应的表格来处理其内容, 歌词大意: 我就是我得到它的方式, 我想已经说过的会有更好的方法。. 我给你留下一个 Python 文件的示例, 在这种情况下,他将负责读取公里并将其输入到 DB 中:

 

fitbit_distancia.py

[源代码]导入 urllib
导入 JSON
导入 MySQLdb
db = MySQLdb.connect(“本地主机”,“根”,“密码”,“NOMBRE_BASE_DATOS”)
游标 = db.cursor()

url = 'http://IP_RASPBERRY/fitbit_distancia.json’
urllib.url打开(网址).读()
响应 = urllib.urlopen(网址).读()

json_obj = json.loads(响应)

对于 json_obj 中的产品[“活动 - 距离”]:
价值 = 产品[“值”]
DATE = 产品[“日期时间”]
cursor.execute 命令(“”“插入 fitbit_distancia (公里,日期) 值 (%s,%s) """,(价值,日期))
db.commit 文件()[/源代码]

所以, 第一个 'fitbit_carga_datos.sh 脚本’ Fitbit 网站的统计数据将以 JSON 格式下载, 每个 Python 脚本将读取该 JSON 并将其放入相应的表中. 更舒适, 或者如果您有疑问, 我把我的剧本留给你这个链接, 您只需输入您的 Token 并创建您需要的表格! 我们对其进行编程,使其每天在 23:59h, 这就是您获得当天所有指标的方式. En 'crontab -e’ 加:

[源代码]59 23 * * * /首页/PI/fitbit_carga_datos.sh[/源代码]

 

现在是坏的… 不错, 这是做什么的? 仅获取今天的, 不? 如果我们没有同步会发生什么? 或者如果上次是 4 小时前? 是的, 我们会丢失未同步的数据, 所以一个滚动, 不? 好吧,我上面所说的是为了了解它是如何工作的. 我真正做什么?? 嗯,类似于这个, 但不是获取今天的指标, 我向 Ftibit 询问上周的指标! 等等, 是的,例如昨天, 或者 2 我们没有同步手环的天数, 没关系, 因为每晚我都会降低上一 7 天,我在 BD 中粉碎了他们, 每天都这样, 最后一批人要下车了 7 和问题解决了. 是的?

所以我离开你 以下是脚本 我正在使用什么, 如果您只对今天同步感兴趣,并从每一分钟获取更多详细信息… 或者如果您只对每天的总数感兴趣!

 

现在什么都没有了, 我们将不得不自己制作 仪表 板 无论我们喜欢什么! 我说了什么, 我们将使用我们已经拥有的 Grafana. 它只不过是将 MySQL 添加为源源并进行我们感兴趣的查询. 我们可以添加面板并添加 制作典型图表… 或 单一统计 显示值 (MySQL 查询结果)… 如果你看这个截图, 我显示的数据来自 2 手镯, 蓝色是我,粉红色是 Txabala (他已经患了几个星期了), 所以这是关于做你喜欢的事情, 是的? 这一切的最终想法是把它捕捉在一个魔镜中,总有一天我会向你展示 =)

以下是一些 示例查询 我在 Grafana 中使用了它,以防它们对您有任何用处:

阶梯图:

[源代码]SELECT pasos 作为值, “赫克托的台阶" 作为公制, UNIX_TIMESTAMP(日期) 作为 time_sec FROM fitbit_pasos 其中 $__timeFilter(日期) 按日期排序 ASC[/源代码]

距离图 (公里):

[源代码]SELECT 千米作为值, “赫克托" 作为公制, UNIX_TIMESTAMP(日期) 作为 time_sec FROM fitbit_distancia 其中 $__timeFilter(日期) 按日期排序 ASC[/源代码]

Singlestat 显示我本周所做的公里数:

[源代码]选择 Sum(公里) 从 fitbit_distancia WHERE 日期(日期) >= 当前日期() – 间隔 7 日[/源代码]

 

使用 Grafana 是 非常、非常、简单, 所以真的, 如果您尚未安装, 按照 这些说明 ,然后尝试创建 Dashboard, 添加面板并对其进行编辑 (从其标题), 您会发现您有很多选择,而且都很容易理解, 以便您可以完全根据自己的喜好对其进行自定义! 啤酒, 我们的身体完全处于控制之中! 我们将把我们采取的所有步骤存储在数据库中, 我们所做的公里数, 我们的心跳, 我们睡觉的时间, 我们攀爬的楼层… 是时候利用它了!

 

我们继续新的一天,还有更多, 你会看到我们在生活中可以控制哪些可爱的事情。.

 

推荐文章

作者

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, 请随时与我联系, 我会尽我所能帮助你, 分享就是生活 ;) . 享受文档!!!