はじめに
この記事はRaspberry Pi Advent Calendar 2025の19日目の記事です。
前日はIzumi TsutsuiさんのNetBSD/evbarm-earmv7hfeb のビッグエンディアン環境のテストで Raspberry Pi 3Bを使ってデバッグした話でした。
おウチ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 = truedocker-compose.yamlのvolumesでコンテナ内外のディレクトリを紐づけています。Data sourceとしてCSVファイルを使うには、別途プラグインのインストールが必要になります。
詳細な設定方法は割愛しますが、現在の(環境センサの)ダッシュボードは以下の様になっています。

デモ環境
即売会用にデモ環境を構築しました。デモ環境は、Raspberry Pi 4ではなくRaspberry Pi Zero 2 WHを使用しています。また、Waveshare社製e-Paper HAT+ 2.13インチを取り付けて計測値を表示しています。メーカの製品WikiやGithubのリポジトリにサンプルコードがあり、ほとんどそのままで動かしています。
※この記事を書いた段階で、Githubのページでサンプルがあったリポジトリが無くなっていました。。。
e-Paper部分のソースコードはまた割愛いたしますが、実際のデモ環境の写真を掲載します。(2025年4月に開催されたつくろがや!3でのデモです。)

最後に
処理について
おウチIoTでRaspberry Pi 4を使った処理についてご紹介いたしました。この処理方法のお陰で移植(デモ環境の構築)がラクに出来ました。一方で、セキュリティ的にはガバガバなのであくまでもローカル向きです。
加えて、GrafanaのCSVプラグインもメンテナンスについて考慮する必要がありました。
同人誌について
今のところ、委託の予定はありません。。。
コメントを残す