Giter Site home page Giter Site logo

pizero-workshop's Introduction

PiZero Easy IoT

安価で簡単に IoT を始めよう! - Raspberry Pi Zero によるプログラミングレス IoT 環境データ収集

概要

非エンジニアが IoT を試してみる場合は勿論、探求の授業などで子供に IoT を体験学習させる場合などにも使って頂けるよう、プログラミング不要で簡単に環境センサーなどの値を取得・記録しつつ無償で試用可能なクラウドサービスに送信してログデータとして蓄積したり、異常値を検知した時に通知や音声読み上げを行うシステムです。

背景や特徴などについては ドキュメント をご覧ください。

特徴と利用方法

セットアップ済み SD Image を使えばすぐにでもお試し頂けます。

使い方や自分でセットアップする手順は ドキュメント をご覧ください。

ファイル構成

このリポジトリのファイルは以下のような構成になっています。それぞれの使い方などについて詳しくは ドキュメント をご覧ください。

  • bootPi
    • Raspberry Pi 起動時に処理するスクリプト
  • bootWifi
    • Raspberry Pi の WiFi 接続設定用スクリプト
  • docs
  • lib
    • bootPi, bootWifi などで使用するライブラリファイル
  • log
    • センサーデータログファイルの保存先ディレクトリ
  • packages
    • Web Agent, Speech Agent プログラム
  • script
    • メンテナンス・試験用スクリプト
  • setting
    • 設定ファイルのテンプレート
  • syncLog
    • ログファイルを /boot パーティーション配下や Google Drive に同期するスクリプト

pizero-workshop's People

Contributors

dynamis avatar kou029w avatar takashinishio avatar mahallon avatar

Stargazers

おじき | 隅っこエンジニア | Hideaki Takahashi avatar aiya000 avatar

Watchers

Masakazu Muraoka avatar  avatar James Cloos avatar  avatar  avatar  avatar

pizero-workshop's Issues

Machinist 対応 (Ambient 以外のデータ収集・可視化サービス検討)

Ambient は超簡単に試すのにはいいけど色々制約あるので他に手軽でもう少し柔軟なものがないか調査・検討している。

Machinist

https://machinist.iij.jp

10 metric を 1 ヶ月分までは無料。1 ヶ月だけだと基本的には有料で使う前提で最初無料というイメージになる。Pro 向けプランは準備中だが、長期保存に対応すればお手軽に使えるデータ保存・可視化・閾値通知サービスとしては良いかもしれない。

ベータ時点の紹介資料:
https://www.iij.ad.jp/dev/tech/technight/pdf/20181214-TECHNIGHT-VOL6-Session1.pdf
Nodeのサンプルコード:
http://route-b.iij.ad.jp/archives/1309

Azure IoT Hub

https://azure.microsoft.com/ja-jp/pricing/details/iot-hub/
https://azure.microsoft.com/ja-jp/free/free-account-faq/

0.5KB までのサイズで 8000 メッセージ/日までなら無料。但しアカウントのセットアップにはクレジットカード (またはデビットカード) が必要なので学生個人向けではない。企業向けのトレーニングにならその後の拡張性もあってとても良いがある程度のレベルが求められる。

グラフを描く機能などは別で Azure App Service なども連携させる必要がある
https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-live-data-visualization-in-web-apps
https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-live-data-visualization-in-power-bi

Elasticsearch + Kibana

https://www.elastic.co/products/elasticsearch
https://www.elastic.co/jp/products/kibana

広く使われている実践的なものだが、このワークショップのようなレベルのサンプルとしては本格的すぎだし、学校や学生が使うのには 14 日間限定の無償サービスなどしかなさそうでお手軽ではない

InfluxDB/ES/etc + Grafana

https://grafana.com/get

ES + Kibana より少しシンプル、データは ElasticSearch に限らないのでいろいろなデータを可視化するのに便利で grafana 側は hosted で無料なものもあるが DB 側の課金もあるし初学者向けには複雑すぎる

SSH 接続やドライバインストールがが不要なワークショップに

一般的な開発では ssh 接続して raspi 上でいろいろな操作をするのだが、子供だったり非エンジニアが体験できるように、ssh などのツールのインストールや usb で接続する場合はドライバーのインストールが必要だったり、多数同時にやる場合には各端末の host 名を変えて bonjour で特定するようにしたりする。

もはや sd カードを編集するだけで計測データを収集できるものにしてしまい、どちらかというとデータの分析などの方に重きをおいたワークショップにしていくべき。

  • すべてインストール済み、node_modules も入っている状態を用意
    • できればセットアップスクリプトも用意する
  • 動作確認と可視化用に ambient に投げつつも同時にローカル csv にも書き出すように
    • ローカル CSV がどの程度のペースで容量を食うのか、logrotate で圧縮した場合でも boot パーティーションを食い潰さないか確認しておく。必要なら sdcard 容量大きくする等も検討
  • 特定のファイル名で Wifi ssid/pass を書いたら wpa supplicant 生成する起動スクリプトを用意
  • sd イメージ作成手順を更新
  • チュートリアルの手順も sd リーダーでファイル書き換えて電源入れるだけに更新
  • ssh したりする手順については参考・上級者向け的に残す

イメージの更新

@takashinishio さんのビルドから差分を含めてSDカードイメージを作成する

やること

  • Wifi 接続
  • HDMI 音声出力 & 音量MAX
  • キーボード配列を101 JPに変更
  • git stash && git pull && git pop
  • sudo ./install.sh -installFiles
  • sudo ./install.sh -setupKiosk
  • sudo apt update && sudo apt install
  • npm i … 1時間近くビルドにかかる
  • Wifi 接続情報の初期化: vi /etc/wpa_suplicant...
  • dpkg --list | grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --purge
  • sudo apt autoremove && sudo apt clean && sudo apt autoclean
  • sudo rm -rf /var/lib/apt/lists/* && sudo mkdir -p /var/lib/apt/lists/partial
  • rm ~/.bash_history ~/.gitconfig && history -c
  • status*.txt 削除 ログファイル 削除
  • イメージを吸い上げる
  • PiShrink などでシュリンクする
  • イメージをSDカードに書き込んでテストする

太陽電池駆動の検討

単純に USB 電流計を介して Raspberry Pi Zero + OMRON センサーに給電しながら駆動した場合、5V 0.09〜0.21A = 約 0.5~1W で連続動作する。

モバイルバッテリーで 1 日駆動させるには (0.09〜) 0.21A x 24h / 1000 = (2160〜) 5040mAh の容量が必要。5200mAh で Pi0W 何もせず 28 時間駆動などの報告記事もあるので大体そんなところか。(単三電池での Pi0+OMRON : センサー単体の駆動時間が 2:56 など消費電力の殆どは Pi0 本体ということも確認済み)

ソーラーパネルの駆動期待時間は国内で 3-4 時間/日 とされているため発電時の充電能力は消費電力の 6-8 倍以上必要で、連続雨天などもあるので少なくとも無発電で 3-4 日駆動可能なバッテリーと組み合わせる必要がある。

とすると 15000~20000mah バッテリーに 10-30W くらいのソーラーパネルを組み合わせれば安価な市販品で連続動作しそう。勿論バッテリーがすぐにへたっていってホントに長期稼働は出来ないだろうが、プロトタイピングで試すには使えるかも。

プロジェクト名を決めて repo 名などを変更したい

確かに Raspberry Pi Zero を使ったワークショップ用のツールセットとして始めたが別に Pi Zero でなければ使えないわけでも、ワークショップではない実践に使えないわけでもない (というか実践で使えるものを教えるワークショップという趣旨)。

取りあえずはドキュメントの方だけ、安価で簡単に IoT という趣旨の雰囲気にしておいたが、もう少しちゃんとプロジェクト名なり何なりを設定して pizero-workshop という用語を無くしてワークショップ専用のプロトタイプ感をなくしたい。

何か良い名称はないか。

npm install に失敗する

原因詳細未確認だが先日米子で利用した日以降に npm install を pizero で実行すると失敗しているので npm i できるようにする必要あり。

wifi.txt のフォーマット確認・実行時エラー確認 (失敗すると WiFi に繋がらなくなる)

9/3 ビルドテストでの問題報告。初回起動時に USB からのネットワーク共有で接続した状態で wifi.txt 編集して設定したケースだが、
/etc/wpa_supplicant/wpa_supplicant.conf の中に明らかに wpa_passphrase のコマンド実行失敗の結果が含まれたりしている

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

usage: wpa_passphrase <ssid> [passphrase]

If passphrase is left out, it will be read from stdin
network={
  ...
}

なお、Buster からは WiFi の country 設定をしないと WiFi に繋がらない。

sudo raspi-config nonint do_wifi_country JP

このコマンドで wpa_supplicant.confに country が追加される:

country=JP

この設定が入った上で再起動する (wpa_supplicant サービスだけ再起動すれば良い?) と接続可能になるハズ。

GPIO シリアルコンソール対応

Raspi のへ接続は WiFi や USB OTG 以外に GPIO シリアルコンソール接続が出来る。
OMRON センサー利用時に WiFi から繋ぐのではなく GPIO シリアルで繋いだ方が多人数ワークショップがやりやすい可能性がある。

USB OTG はドライバーのインストールも大変だったが GPIO シリアルコンソールの方はどうか確認し、やりやすそうであればそれを使って制御する手順などを書き足す。

ブラウザから動かしたい

普通の IoT 的には Node で動かすだけで良いのだけど、ブラウザ上の JS からも OMRON センサーを読み取り、Machinist などに送信するところまで出来ると面白いというか、CHIRIMEN などから利用できるので嬉しい。

ローカルで画面・ライトや音声での通知機能

センサーの値が一定条件を満たした場合にサーバに UP/通知するだけでなく、ローカルで視覚・聴覚による通知を行いたい。工場などに設置するときはまた故障しないようハードなどを選定し直すとして、取りあえず簡単に試せるものとして作る。

視覚通知

単純に小型の Raspberry Pi 向けディスプレイを繋いでブラウザをフル画面表示すれば現在のセンサーの値を表示しつつ、背景色の変化で通知が可能。パネルの明るさの変更は多分出来ないので諦める。細かな表示は要らないからとにかく明るく色などで通知をして欲しいケースであれば WS2812B のカラー LED HAT をつけて通知するのがよさそう。

聴覚通知

HDMI ディスプレイだと音声出力端子も付いているのでそれを 100 均で帰る 100〜300 円くらいのスピーカーに接続し、音声ファイルを再生させるのがシンプル。

音声合成などはしても良いけど事前にしたファイルを再生しておけば良いんじゃないか。数値読み上げするなら音声合成をすることになるが。。。

端末のリモートコンソール対応

sdcard の編集だけでログを取れるようにするものは #4 で用意しているが、流石にそれだけでは物足りないケースにはコンソールへの接続がしたくなるので、何らかの形で PiZero のコンソールに接続させたい。

ssh や USB Serial Driver などを入れられない企業の人や Chromebook ユーザを相手にするのが難しいケースがあるので IIJ Legs のクライアントを入れて、その認証情報だけ sdcard で書き込めば接続可能なようにすれば良いのではないか。

https://dev.smf.jp/legs/

電源オン直後のセンサーからデータを読み取ると全てのメトリックの値が 0 として記録されてしまう

Pi0 以外から給電、Pi0 よりもあとにセンサーに電源を入れた場合、タイミング悪くセンサーの電源投入後まもなく読み取った時に一度だけセンサーの値が 7 つともすべて 0 として記録されることがある。次回以降の計測ではちゃんと値が取れる。

  • 修正されるまでは既知の問題として記載して、全部 0 が記録されている場合はフィルタして分析するようお願いする。

  • 全ての値が 0 であった場合は計測エラーとして記録しない

  • 単に記録しないだけでなく数秒開けてリトライするとなお良い (例えば 5 秒まってから 3 回目までリトライ、次の計測は予定通りの時間に)

GROVE など他の入力データ送信に対応する

防塵などの観点から企業向けのワークショップ・実環境での長期間の計測には OMRON 環境センサーなどを使う想定としているが、学校などでの教育・体験目的で試すケースには OMRON 環境センサーは単価・再利用性から少し厳しいので、同じような流れて単純に試すだけをしたいケース向けとして Grove のセンサーを使って実施するパターンも用意するのはどうか検討する

sdcard 必要容量の概算

csv データを sdcard にも保存する場合に必要な総容量を見積もっておく。

  • 1 分ごとに OMRON センサー 7 データを記録した場合の月間容量

machinist の agent 名を config.js から設定可能に

現在 agent の指定が "playground" と決め打ちになっている:

return {agent: "playground",

    return {agent: "playground",
	    metrics: metrics};}

私がサンプルで試したときのデータ由来だと思うが、これは「お試し用」って意味なので実際利用するとき向けじゃないので適切な名前を設定可能にすべきだし、そもそもこの手の値委をコード中にハードコードしてはならないので変数に分離する。

意味合いとしては送信元の識別用と言うことなのでとか office とか 剣道場とかの場所、デバイス系の名前にするなら pizero とかそういうのを書くことになると思うが、これを分けることで複数のセンサー、複数の pizero から同じ machinist アカウントにデータを集めることが可能になるはず。そして、複数の場所でのメトリクスの比較などといった用途に使える。

従って、agent は config.js から設定可能にしたい。

月間通信量の概算

このワークショップのセットアップで利用した場合にどの程度の通信量になるか概算をしておきたい

  • OMRON 環境センサーデータのアップロードにかかる通信
    • Machinist 利用時
    • Ambient 利用時
    • Machinist + Ambient 利用時

WiFi ではなく IoT 向けの小容量 SIM を使ったデータ通信環境で利用する場合の参考あるいは、データ送信頻度の上限を事前に把握できるようにするため。

WEP キーの WiFi 設定を入れると起動しない

現状 WEP のパスワードが 6 文字などの WiFi を登録すると以下のように WPA パスフレーズの長さを想定したお叱りのメッセージと共にエラーで止まる。

せめて WEP はダメだよって無視して他の WiFi 設定は利用したい。

bootWifiStatus.txt

Passphrase must be 8..63 characters
start wlan0 ...
Successfully initialized wpa_supplicant
Line 14: unknown global field 'Passphrase must be 8..63 characters'.
Line 14: Invalid configuration line 'Passphrase must be 8..63 characters'.
Failed to read or parse configuration '/etc/wpa_supplicant/wpa_supplicant.conf'.

今時使うなという意味では enhancement だが気もするのだけど実際繋いでしまうユーザもいるというかポケット WiFi のデフォルトでも使われていることがあるので bug でもあるかな。

pingによる通信確認と起動直後のwifi接続に関するエラー

ping webdino.org コマンドが3箇所。bootWifi、メインのstarter.sh、syncLogのrcloneの直前。
一般的なプログラムのなかにこのような特定のサーバへの接続確認を記述するのは問題か。

syncLogStatus.txytとerror.txtで確認できるが、一番始めのrcloneとセンシングデータのアップロードは失敗することがある。2つともpingで通信確認をした後に実行しているが、タイミングによってはbootWifiによるwifi再接続との問題がおきることがある。

初期設定ファイルとその生成方法を整理したい

install.sh から設定ファイルのテンプレートを分離すべき

install.sh では /boot/setting 配下などにいろいろな設定テキストファイルを作成するが、これらのファイルはシェルスクリプト中にヒアドキュメントでべた書きすべきではなく、テンプレートファイルとして個別のファイルにしてあるものをスクリプトで読み込んで変数置き換えした上で出力するべき。

setting/{config.js|rclone.conf} は必要なのか

install.sh では config.js などをヒアドキュメントから生成しているが同じもの?が setting ディレクトリの config.js ファイルなどとして存在する。使ってないなら消すというか、上記の通りテンプレートとして使う形にすべき

wifi.txt ファイル末尾に改行がないと最終行が無視される

wifi 設定が複数されていないケースが多かったのを不審に思いコード見たのですが、単なる while read $line ループしているので行末に改行文字がない行が無視されます (read は改行含まないと false 返します)。

https://github.com/webdino/pizero-workshop/blob/master/setup.sh#L84

memo: バグのあるコード (手元の mac での試験用に単純化)

	cat wifi.txt | while read _LINE; do
	    if echo $_LINE | grep -q '^\s*$'; then continue; fi #skip empty line
	    echo $_LINE | awk -F ',' '{print "wpa_passphrase \"" $1 "\" \"" $2 "\""}'
	    priority=$(( $priority + 1 ))
	done

意図したとおりに動く例:

	cat wifi.txt | while read _LINE || [ -n "${_LINE}" ]; do
	    if echo $_LINE | grep -q '^\s*$'; then continue; fi #skip empty line
	    echo $_LINE | awk -F ',' '{print "wpa_passphrase \"" $1 "\" \"" $2 "\""}'
	    priority=$(( $priority + 1 ))
	done

入力テストファイルと関数呼び出しの結果のテストコードが必要と言いたいところですが、ひとまずバグは修正しましょう。テスト入力ファイルは末尾改行自動付与しないエディタで作って下さいね。

もちろん、wpa_supplicant 編集コードだけでなくフォーマット確認も同じく、その他の read しているコードも同じくです。

rclone の設定をある程度自由に出来ると嬉しい

rclone はできるが pizero-workshop サブディレクトリに毎日 0 時に同期する固定設定となっているのをもう少し柔軟に出来ると嬉しい。また実行タイミングは複数タスク同時は避ける。

  • rsync と同時に rclone を実行せず、rsync 終わってから rclone すべき
    • rclone で gdrive に同期中のディレクトリの中身が rsync で書き換えられるという状態になってしまっているので rsync してから rclone するのを一つのタスクとして登録するか、単に実行時間を十分な時間 (数分) ずらす必要がある。
  • 定時実行のタイミングを /boot/settings 配下から変更可能に
    • 毎日何時に実行するかの時間のリスト (crontab 2 つ目の時間指定部分) だけでも指定できると良いかも
  • サブディレクトリ名を /boot/setting 配下のファイルから変更可能に
    • 今のところ rclone.txt の root_folder_id を変えることで同じアカウントに複数端末からの Upload も可能だが、サブディレクトリ名も変更可能だとより嬉しい

サブディレクトリハードコーディング箇所:

to=/pizero-workshop

crontab 設定:

cat <<EOF > /etc/cron.d/pizero-workshop

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot	       root $dir/setup.sh -wifi_txt
@reboot	       root /sbin/iw dev wlan0 set power_save off
@reboot	       root $dir/pizero-workshop-starter.sh
#*/1 * * * *    pi bash -c "$dir/traffic.sh >> $dir/log/traffic.csv"
00 0 * * *  root $dir/rclone.sh
00 0 * * *  root rsync -a $dir/log/ /boot/setting/log/
@reboot     root rsync -a $dir/log/ /boot/setting/log/

ディレクトリパスの修正

src/Omron2jceBu01 などとなっているがデバイスの型番は 2JCIE-BU01 なので Omron2jcieBu01 なり Omron-2JCIE-BU01 なりにすべき。実際デプロイするものを src ディレクトリ配下におくのも違和感があれば /home/pi 直下に Omron2jcieBu01 ディレクトリ作るなり他の名前の配下にするなり。

ドキュメント類だけでなく servie 登録するファイルに記載のパスの変更も必要になるので注意
https://github.com/webdino/pizero-workshop/blob/master/omron2jciebu01.service

エラーログ出力の整理

sdcard だけで編集するので、設定ファイル類にの記述に問題があるときはその問題がエラーログで分かるようにしたい。

  • wifi.txt
    • フォーマットのエラーがあればその旨を出力
    • どの行に問題があるのか分かるのが望ましい
  • config.js
    • js としての構文エラーがあればそのエラーを出力。eslint ログだとなお良い。
    • 構文の問題は無いが必須の設定値がない場合はその旨を出力したい
    • 設定としてあってはならない値が入っている場合もその旨を出力したい
    • address のフォーマットは検査して間違いがあれば出力したい (典型的な間違いは : 付きで書く人。アドレス書かれたシール見ながら書かせるときは問題ないけどコマンドとかツールで Mac アドレス調べるときにはよくある)
  • rclone.txt
    • 設定ファイルの間違いがあれば。。。まぁ rclone コマンドで生成するのが普通なので rclone の実行エラーだけ記録できれば十分
  • hostname
    • フォーマットエラーがあれば

また、現在 error.txt に "false" とだけ出力されるケースが見られるのが謎。

複数回計測分のデータ一括送信を可能にしたい

現在はセンサーの計測周期 = データの送信周期だが、都度データを送信するとデータ自体よりも HTTPS のハンドシェイクでの通信が大きいため、SIM 環境で使うには通信量が増えてしまう課題がある。

センサーの計測データを数回分はメモリ (配列) に蓄積して、N 回に一度まとめてデータを送信するようにすることで、リアルタイム性は落ちるが通信のオーバーヘッドを減らすことが出来て嬉しい。

see: #9 (comment)

設定ファイルをブラウザで変更可能にしたい

エディタ問題、記号類の入力ミス問題が発生するため、本当に初心者相手にするのであれば間違えることが出来ない環境で編集させる、つまりブラウザのフォームで編集可能にできないか。

但し、WiFi 接続させてホスト名を設定させるところまでは sd card 編集 (or ネットワーク or シリアルで PC から直接接続) しなければ PiZero 自体がネットワーク接続できない&してくれても discovery の問題があるため、WiFi/host 設定だけは sdcard 編集が残る。

ディスプレイ (KVM) まで用意できる場合は PiZero 上で行えば良いがその場合もケアしたい。

  • Node ローカルサーバに繋いで各設定ファイルを編集・保存するフォームを用意する
    • フォーム入力の他にテキストエリアでの自由入力も可能にして拡張性を残す
  • 起動時に未設定であれば設定ページをフル画面表示、設定済みであれば動作した結果ページを表示 (現在のもの)
  • 結果表示画面もマウスクリックなどで設定画面に遷移する方法を残しておき、KVM 接続時には PiZero 上で簡単に設定変更可能に

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.