これはブログです

3DCGとかプログラミングとか

おウチIoTという同人誌を書きました

おウチIoTという同人誌を書いた

今年の10月26日に第十二回技術書同人誌博覧会(略称:技書博)が開催されました。おウチIoTは技書博に向けて書いた同人誌です。

大まかな内容

おウチIoTとは、「M5Stackシリーズでセンシング(環境値と土壌水分量)したデータをBLEで送信、Raspberry Pi 4で受信して保存、ダッシュボード(Grafana)にグラフ表示をする。」という至ってシンプル?なシステムです。図で表すと以下になります。(実際にはインターネットに出ていないので、IoTではないのですが。。。)

本記事はRaspberry PiのAdvent Calendarの記事ですので、Raspberry Pi 4の処理について書きたいと思います。

Raspberry Pi 4の処理

データの保存

データの保存は、シェルスクリプトを定周期で叩いて行っています。シェルスクリプトは「計測データの受信」から「データの保存」までを行っています。

当初は、PythonやJavascript(Node.js)を考えていました。しかし、使用する(であろう)ライブラリの更新が Github のリポジトリを確認すると結構前だったのも気になり、シェルスクリプトにしました。

CSVファイルでのデータ保存にしたのは、一次保存として如何様にも使いやすく、システムも大規模ではないのでこの形式にしました。(DockerでSQLやNoSQLのデータベースを立てる/Grafanaのコンテナと連携させるのがめんどうだった、締め切りがあって検証できていないというのもあります。。。)

定周期実行にはCronを使っています。1分周期で動くようにしています。

#!/bin/sh

echo "Receive BLE Data"

# ============
# GATT
# ============
GATT_RAW=$(gatttool -b XX:XX:XX:XX:XX --char-read --handle=0x002a)
GATT=$(echo ${GATT_RAW##*: } | for n in `xargs`;do echo "$((0x$n))" | awk '{printf "%c",$1}'; done;echo)

# ============
# NULL判定
# ============
if [ -z "$GATT" ]; then
  return 0
elif [ -z "$GATT_RAW" ]; then
  return 0
fi

# ============
# 書き出し
# ============
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H:%M:%S)
echo "${DATE}T${TIME}+09:00,${GATT}" >> /home/sierra/csv/env4.csv

はじめにgatttoolコマンドを叩いて生データを取得します。あらかじめ、送信端末と接続、MACアドレスを調べておきます。

生データは16進数になっているので10進数に変換します。一応、不正な値のチェックを行います。

最後に日付をつけてCSVファイルに書き込みます。

ダッシュボードの表示

ダッシュボードにはGrafanaを使用しています。GrafanaはDockerでデプロイしています。

docker-compose.yamlとgrafana.iniは以下のようになります。

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
     - '3000:3000'
    volumes:
     - /home/sierra/csv:/var/lib/grafana/csv
     - /home/sierra/docker/grafana/grafana.ini:/etc/grafana/grafana.ini
     - grafana-data:/var/lib/grafana
    environment:
     - GF_INSTALL_PLUGINS=marcusolsson-csv-datasource
    restart: unless-stopped

volumes:
  grafana-data:
[plugins]
plugin_admin_enabled = false

[plugin.marcusolsson-csv-datasource]
allow_local_mode = true

docker-compose.yamlのvolumesでコンテナ内外のディレクトリを紐づけています。Data sourceとしてCSVファイルを使うには、別途プラグインのインストールが必要になります。

詳細な設定方法は割愛しますが、現在の(環境センサの)ダッシュボードは以下の様になっています。

デモ環境

即売会用にデモ環境を構築しました。デモ環境は、Raspberry Pi 4ではなくRaspberry Pi Zero 2 WHを使用しています。また、Waveshare社製e-Paper HAT+ 2.13インチを取り付けて計測値を表示しています。メーカの製品WikiGithubのリポジトリにサンプルコードがあり、ほとんどそのままで動かしています。

※この記事を書いた段階で、Githubのページでサンプルがあったリポジトリが無くなっていました。。。

e-Paper部分のソースコードはまた割愛いたしますが、実際のデモ環境の写真を掲載します。(2025年4月に開催されたつくろがや!3でのデモです。)

最後に

処理について

おウチIoTでRaspberry Pi 4を使った処理についてご紹介いたしました。この処理方法のお陰で移植(デモ環境の構築)がラクに出来ました。一方で、セキュリティ的にはガバガバなのであくまでもローカル向きです。

加えて、GrafanaのCSVプラグインもメンテナンスについて考慮する必要がありました。

同人誌について

今のところ、委託の予定はありません。。。


Category :

Tags :


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください