在MongoDB和Metabase中可视化IoT数据的技巧
首先
初次见面。这是我在 Qiita 的首次投稿!
我希望将传感器收集的温度、湿度和气压数据传输到云端并进行可视化。虽然使用AWS IoT Core或Azure IoT Hub这样的云服务是最便捷的选择,但为了节省费用,我尝试使用开源软件搭建自己的数据库和可视化工具(商业智能工具)。
用过的开源软件
-
- Database : MongoDB(v4.2.2)
- BI Tool : Metabase(v0.33.5.1)
因为这两个都是主要的开源软件,所以关于它们的使用方式有很多说明,在各个地方都可以找到。但是关于MongoDB + Metabase组合的解释文章并不多,也没有在文档中写明一些容易陷入困境的地方,所以我将在这里进行解释。
所有成員
详细内容省略,但我使用VM环境和OpenStack在家中的服务器上进行了搭建。
数据的流动
-
- 使用BME280(温度・湿度・気圧)+ ESP32通过Wi-Fi发送数据
-
- IoT-Hub和数据代理OM2M接收数据
-
- 当新数据到达时,OM2M通知应用程序(ADN-AE)
-
- 应用程序提取传感器数据并存储到MongoDB中
-
- 使用BI工具(Metabase)可视化数据
- 另外,使用M5Stack可以监控最新的数据
MongoDB的技巧
数据的描述方式
用JSON格式化数据并以键值对形式表示如下。
{
"Location" : "Outside",
"RSSI" : -55,
"TemperatureC" : 10.79,
"Humidity" : 79.7,
"PressureHpa" : 988.53,
"Battery" : 2.78,
"CreateDate" : "2019-12-26T21:29:59Z",
}
-
- JSONの「キー」はMongoDBの検索キーにもなりますので、簡潔で分かりやすい名前を付けます
-
- 他の人が見ても分かるように名前に単位情報(TempretureC → 摂氏だよ)を入れると親切
-
- データの収集時刻(CreateDate)はUTC時間をISO8601形式でフォーマット → UTCで格納しておけば、Metabaseがブラウザの設定に合わせたローカルタイムに変換して表示します
- 収集時間に加えてセンサーの設置場所も入れておくとよい
让MongoDB识别日期
在连接MongoDB和Metabase之前,并不需要像RDB一样创建模式来定义每个数据的属性。但是,为了连接MongoDB和Metabase,只有日期需要进行”这是一个日期的数据”的注释。如果不这样做,当从Metabase执行指定日期范围的查询时,可能会发生”无法将BSON类型字符串转换为日期”的错误,并且无法获取数据。
因此,在将日期数据存储到MongoDB中时,需要将日期转换为ISODate对象。为此,在服务器上的应用程序中,我们将从”CreateDate”生成和添加ISODate,并将其存储到MongoDB中。
{
"Location" : "Outside",
"RSSI" : -55,
"TemperatureC" : 10.79,
"Humidity" : 79.7,
"PressureHpa" : 988.53,
"Battery" : 2.78,
"CreateDate" : "2019-12-26T21:29:59Z",
"isodate" : ISODate("2019-12-26T21:29:59Z")
}
在JavaScript中,可以通过以下方式生成和添加ISODate。
var isoDate = new Date(jsonData.CreateDate);
jsonData.isodate = isoDate;
-
- JSONデータから”CreateDate”フィールドを取り出し、この値を引数にしてDateを生成 → これでISODateになる
- JSONデータに追加する
Metabase的技巧
注册数据库名称等
为了与MongoDB进行配合,您需要在Metabase的数据库管理员界面中进行各种注册。以下是需要注意的事项:
-
- Database nameはMongoDBに書き込みを行った際に使用したDB名(コレクション名ではない)
- Database usernameに加えて、Authentication Databaseを指定する → これを指定しないと認証エラーになり接続できません
在MetabaseAdmin → DataModel中,您可以为每个数据设置属性,但无需特别设置。例如温度、湿度等是数值数据,isodate被识别为日期信息。
不要更改与图表源信息相关的表格列。
这是我感到最着迷的地方。
当将数据转换为图形时,您可以从数据列表界面点击Visualization按钮,并指定图表的类型以及在X-Y轴上显示的列。这个列表的列是按照从MongoDB检索到的关键信息按字母顺序排列的,但您可以选择隐藏列或更改显示顺序。
为了使这个列表更易于阅读,最初进行了一些显示定制,如隐藏ID并将日期移至左侧。从定制后的显示生成图表时,当将日期指定在X轴时出现了以下问题。
-
- 日付は表示されるが、時刻を表示してくれない
- バージョンによっては、X軸にIsoDateを指定させてくれない
换句话说,不要修改成为图形源的表列,也就是说不要修改这些列!(可能)文档里根本没有写到这个!!
当数据量增加时需要注意的事项
当数据库的记录数超过2000条时,默认情况下,Metabase将只显示前2000条记录。因此,如果数据量增加,绘制图表时需要设置过滤条件来指定查询范围,例如”最近一个月”。
仪表盘的样本
以下是一个将收集到的数据转化为图形并显示在仪表盘上的示例界面。它展示了非常漂亮的图形。