jazmy/laravel-skinnypi

SkinnyPi - 一个基于 Laravel、Raspberry Pi、FitBit 和 MQTT 的项目。当你减肥时,你的 Raspberry Pi 会播放音乐并闪烁灯光。

dev-master 2020-08-29 15:55 UTC

README

SkinnyPi - 减肥派对

一个 LaravelRaspberry PiFitBit 项目,用于减肥派对模式

查看我的网站: https://jazmy.com

Skinny Pi 实际应用 - 视频演示

演示 Laravel 网站

我想设置一个 Raspberry Pi,每次我减肥时,它都会闪烁灯光和播放音乐。我把这称为“派对模式”或“快乐舞蹈”。这将成为积极的强化,也是一个有趣的方式开始我的早晨。我刚刚完成了一门研究生院的“物联网”课程,所以我基本了解通信协议。

要求

  1. Fitbit 兼容的体重秤  任何允许您无线同步体重到 Fitbit 网站的体重秤。我使用的是 Fitbit Aria

  2. 带有 wifi 的 Raspberry Pi 我使用的是 Raspberry Pi 3 Model B

  3. 托管云服务器 我使用的是 Cloudways 它对 Laravel 很容易

  4. 托管 MQTT 服务器 我使用的是 CloudMQTT 的免费版本

工作原理 (简化版)

  1. 您站在 Fitbit Aria 体重秤上,并通过 wifi 同步到 fitbit 服务器

  2. Fitbit API 触发新体重的添加,并向您的云服务器发出调用

  3. 您的云服务器存储新的体重并计算是否高于或低于以前的体重

  4. 如果体重降低,则向您的 MQTT 服务发送消息

  5. 您的 Raspberry Pi 订阅了 MQTT 服务,因此它接收消息并触发一个 Python 脚本。

  6. Python 脚本播放音乐并闪烁灯光。

SkinnyPi Diagram

第 1 部分 - Raspberry Pi

要求

1.1 组装您的 Pi

我假设如果您正在阅读这篇文章,您知道如何组装 Raspberry Pi。

1.2 安装软件

1.2.1 从您的 PC 安装 Raspbian

  1. 您需要在 Raspberry Pi 上安装 Raspbian:https://www.raspberrypi.org/downloads/

  2. 要将 Raspbian 图像安装在您的 Raspberry Pi 上,您需要一个名为 win32 disk imager 的工具:https://sourceforge.net/projects/win32diskimager/

  3. 解压 raspbian 软件,它只是一个镜像文件。由于它是 2 GB,所以可能需要几分钟。

  4. 打开 Win32 disk,浏览到 raspbian 镜像。

  5. 选择“设备”,即您的 SD 卡所在的驱动器。在选择设备时,请确保选择正确的字母,因为它将删除该驱动器上的所有内容。人们经常意外删除他们可能还连接的 USB 备份驱动器,这是一个常见问题。

  6. 然后点击“写入”按钮。根据卡的速度,写入可能需要几分钟。

  7. 完成后,Windows可能会搞混,因为它不能再识别驱动器,它会要求您格式化SD卡。忽略这个错误。您的SD卡已安装完成,现在将其放入您的树莓派

1.2.2 第一次设置您的Pi

  1. 开启您的树莓派
  2. 使用默认凭据登录:用户名:pi,密码:raspberry
  3. 它将要求您更改这些凭据
  4. 它将进行更新
  5. 它将要求您连接到您的WiFi
  6. 打开终端窗口
  7. 输入“ifconfig”以查找您的IP地址 (另一个选项是输入:sudo /etc/rc.local)
  8. 单击树莓派图标以打开下拉菜单,然后选择“首选项”>“树莓派配置”
  9. 启用SSH

1.2.3 安装Mosquitto

有几个应用程序可以用于通过MQTT发送和接收,但在树莓派上最简单的可能是Mosquitto。我们首先在树莓派上安装这个程序

sudo 
apt-get install -y mosquitto mosquitto-clients 

1.2.4 安装Paho MQTT

为了允许您的Pi订阅您的MQTT频道并监听消息,您需要安装Paho-mqtt。教程:https://tutorials-raspberrypi.com/raspberry-pi-mqtt-broker-client-wireless-communication/

安装python 2和3的版本。如果您使用Thonny测试代码,它会查找python3版本。如果您在终端运行代码,则默认使用python2。根据我的经验,安装两者会使生活更简单。

sudo pip install paho-mqtt 
sudo pip3 install paho-mqtt 

1.2.5 安装Blinkt脚本

Blinkt是八种超亮RGB LED灯,您可以将其添加到树莓派并从Python脚本中控制。Blinkt!上的每个像素都可以单独控制并调节亮度,让您能够创建渐变、脉冲效果,或者像疯了一样闪烁。

为SkinnyPi提供的Blinkt Python脚本:https://github.com/jazmy/raspberrypi-skinnypi

Blinkt Python代码示例:https://github.com/pimoroni/blinkt/tree/master/examples

在“skinnypi”文件夹中创建一个文件夹 /home/pi/skinnypi/skinnypi.py

将WAV格式的音频文件放在该文件夹中。最好将音频文件命名为1.wav、2.wav、3.wav等...

确保音频设置为“模拟”。如果您通过HDMI将树莓派连接到显示器,则默认在HDMI上播放音频。要更改此设置,请右键单击树莓派OS右上角的音频图标。

执行文件

sudo python skinnypi/skinnypi.py 

1.2.6 设置Blinkt脚本来在启动时自动运行

https://learn.sparkfun.com/tutorials/how-to-run-a-raspberry-pi-program-on-startup#method-1-rclocal

sudo nano /etc/rc.local 

这有点棘手,但您需要确保在运行脚本之前等待10秒钟,以便给Pi足够的时间启动和连接到网络。如果存在问题,这将创建一个日志文件。

sudo bash -c '(sleep 10;/usr/bin/python3 /home/pi/skinnypi/skinnypi.py > /home/pi/skinnypi/skinnypi.log 2>&1)' & 

第二部分 - 云服务器

如果您正在寻找一个管理型网络托管服务,可以轻松创建Laravel网站,那么我强烈推荐Cloudways。Cloudways可以在几分钟内设置Laravel网站和MySQL数据库。

2.1 Laravel应用程序

SkinnyPi Laravel App Screenshot

要求

  • Laravel 5.7

  • MySQL

  • Laravel认证 - php artisan make:auth

包含的依赖项

此项目包括适用于OAuth 2.0客户端的Fitbit Provider https://github.com/djchen/oauth2-fitbit

安装说明

此存储库是一个完整的Laravel网站,而不仅仅是一个包。安装需要几个步骤,但我将尽量使其尽可能简单。

composer require jazmy/laravel-skinnypi 

注意:对于版本5.6及以上的包,该包将自动使用Laravel的包发现功能进行注册。这意味着您不需要更新config/app.php文件。

第三步

我们需要添加额外的数据库表,因此运行以下命令

bash php artisan migrate 

2.2 配置Fitbit应用程序(客户端ID和客户端密钥)

Fitbit API文档:https://dev.fitbit.com/ 创建Laravel Fitbit应用程序非常棘手,但以下是基本步骤

  • 用户授权应用程序
  • Fitbit将用户返回到回调URL,并带有授权令牌

示例回调URL:https://your.domain.com/authorize 当您设置Fitbit应用程序时,您需要提供一个回调URL,以便它发送令牌。我们必须存储该授权令牌,以便我们可以在稍后代表用户进行后续请求。

  • 我们使用存储的授权令牌的ID,在订阅端点为用户创建订阅。这意味着每次发生更改时,Fitbit都会触发您的回调页面。

示例端点订阅URL:https://your.domain.com[/callback]

  • 订阅完成后,用户会在屏幕上看到一个消息,说明他们的订阅已创建,或者如果已经存在,则说明订阅已存在。

  • 当用户的体重数据进入Fitbit时,Fitbit将通过调用订阅URL来通知我们的应用程序。 https://your.domain.com[/callback]

  • Fitbit只会通知我们用户体重数据已更改。它不会发送实际的体重。

  • 在FitBitController中的getCallback方法中,我们必须快速保存发送给我们的通知数据,并返回一个204响应给Fitbit,以便Fitbit知道我们已经收到通知。

  • 应用程序在回调中接收通知数据、从Fitbit获取通知详情、解析通知、获取受影响的用户、保存新的体重记录、进行体重比较检查、发送请求的MQTT消息,并在3秒内回复Fitbit所需的'HTTP 204 No Content'状态是不可能的。因此,您需要将其分解成几个步骤,以防止Fitbit禁止您的API访问。

  • 解决方案是设置一个Laravel队列监听器,使其始终运行。当Fitbit触发回调时,您将任务添加到队列中。队列监听器应在收到回调推送后大约5秒内处理通知。

  • 'Supervisor'是一个进程监控程序,它将监控队列监听器进程,并在进程崩溃时自动重启。

  • 您创建的任务将执行以下操作

  • 从Fitbit获取通知详情

  • 解析通知

  • 获取受影响的用户

  • 保存新的体重记录

  • 进行体重比较检查

  • 发送请求的MQTT消息

  • 然后我们将运行http://your.domain.com/notification-details路由,遍历我们保存的通知,并向Fitbit发送请求以获取每个通知的详细信息。我们将从Fitbit的响应中获取已更改的体重。

  • 体重数据将被写入到storage/app/weight_logs文件夹中的文件中。

第三部分 - MQTT服务器

MQTT 是一种推送和订阅消息的方式,在物联网(IoT)设备如树莓派上表现良好。您可以将 Pi 设置为订阅 MQTT 通道,这样每当您的服务器向该 MQTT 通道推送消息时,MQTT 将自动将其推送到任何已订阅的设备。MQTT 介绍:[http://www.steves-internet-guide.com/mqtt/](http://www.steves-internet-guide.com/mqtt/)

如果用户减重了,应该将此 JSON 发送到 MQTT

$message = { "color": "1", "style": "1", "seconds": "10", "audio": "1"} 

如果用户没有减重,应该将此 JSON 发送到 MQTT

$message = { "color": "2", "style": "2", "seconds": "10", "audio": "2"}