2020 年度 OSS リテラシ 3 : IoT システム (最終課題)
最終課題 : 環境データを利用したシステム
IoT と称されるシステムは, センサーから送られてきたデータを解析し, 何らかのアクションを 起こすものである. それを行う前提として, 得られたデータの特徴を把握しておく必要がある. データの特徴の掌握の第一歩は前回までの統計解析である.
教室や廊下の気温・湿度・照度といった環境データを利用することで実現できることを考えてみよ. 今までサンプルとして提示したプログラムを活用すれば色々なアイデアを実現できると思う. 例えば, 松江高専 環境モニタリングシステムでは 特に夏季においてクーラー基準をチェックして, 暑すぎる時は事務室へ「この教室は暑すぎるから 空調の温度設定を変更せよ」といった内容を送るようにしていたが, 2020年度から空調の設定が緩和されることにつながった.
課題 1) 環境の「見える化」と分析
IoT システムの良いところは, 「暑い」「寒い」などの体感的に語られてきたことを 数値で示すことができることである. さらに継続的に観測を行うことで, 今まで知らなかった/意識してこなかったことが見えてくることもある.
既にセンサーから得られたデータを統計処理してグラフ表示・Web 表示できるようになっているが, その数値やグラフから何が言えるかグループメンバーと議論して, それをまとめよ.
課題 2) IoT システムなアイデア出し・実装
課題 1) で得たデータの特徴をもとに, リアルタイムに得たデータを使って何か有益なシステムが作れないかアイデア出しをしなさい. 今あるセンサーで出来ることを考えるのを優先してほしいが, 「今あるデータに XX というデータが加わると ~~ が可能となる」という観点でまとめても良い.
もし時間的な余裕があれば, そのシステムを実装しなさい.
以下に IoT システムでよく見られるような例を挙げるので, 参考にして欲しい.
室内の温度環境が基準を満たしているかのチェック
室内温度については, 文科省が「学校の教室の望ましい温度」の指針を定めている.
- 17 <= 気温 <= 28
また, 松江高専の基準では, 夏季にクーラーを入れる条件は以下の 2 つの条件のうち 1 つが満たされた場合である.
- 気温 > 28 度
- 不快指数 > 78
現在は冬季であるので, 上記基準を下回るような場合には Web ページにアラートを出すようなシステムを作成してみよ.
電気の消し忘れのチェック
夜間に照明をつけっぱなしにすることはエネルギーの無駄である. そこで照度計から得られたデータを使って, 夜間に照度が閾値を超えている場合には Web ページにアラートを出すようなシステムを作成してみよ.
なお, 閾値は観測より得られた平均的な値から各自決めてみよ.
教室を使っているかのチェック
得られた温度のデータを見てみると, 冬場の平日は以下の特徴がある.
- 朝, 暖房が ON されたタイミングで気温が急激に高くなる.
- 日中は暖房のために気温が高い.
- 1 日の平均気温の標準偏差が大きい.
一方, 休日は以下の特徴がある.
- 暖房が入らないので気温が低い.
- 1 日の平均気温の標準偏差が小さい.
これらの特徴を使うと, 例えば以下がわかりそうである.
- 標準偏差 < 閾値 (例えば 1) => 教室は使われなかった.
- 温度の時間変化 (dT/dt) > 閾値 => 学生が教室に入って暖房を付けた時刻
- 昼から夜にかけて温度変化が小さい => 暖房が点きっぱなし?
これらの判断をプログラム中で行うと,
- 教室が使われたかどうかの結果を Web ページに表示.
- 暖房がついたらその時刻を Web ページに表示.
- 暖房が点きっぱなしなら, Web ページにアラートを出す.
ができそうである. なかなか検証は難しいが, 興味を持った人は是非考えてみてほしい.
課題の提出方法
上記の課題 1), 2) をレポートとしてまとめて, 電子ファイルで WBT に提出せよ.
[参考] 補足的な説明
IoT と称されるシステムでは, データ処理の結果を元にアラートをメールで送ったり, Web にアナウンスを出すことがよく行われる. 実際にデータ処理を行う前に, ruby スクリプトからメールを送信したり, Web を作成する方法について簡単に紹介する.
Ruby を用いた HTML の作成 (ヒアドキュメント)
ここではヒアドキュメントを用いて簡単に HTML ファイルを作ることにする ヒアドキュメントでは << を使う. << の後ろにヒアドキュメントの始まりと終わりを示す文字列の識別子を書く. EOS(End Of String)とEOL(End Of Line)が使われている例が多いが, 統一されていれば何を使っても問題ない. また, ruby の命令を埋め込む場合は #{...} のように書けば良い (サンプルでは現在時刻を示す Time.now を使っている).
以下のようなサンプルを作成し実行してみよ. 但し, 出力ファイルのパスは適宜変更すること (注意: << と "EOS" の間には空白を入れないこと).
$ vi make-html-1.rb #!/usr/bin/env ruby # coding: utf-8 html = "/home/hogehoge/public_html/sample.html" # 出力ファイル名 # HTML データ body = <<"EOS" <html> <head> <meta charset="utf-8" /> </head> <body> Hello World! <br> ファイル作成時の時刻は #{Time.now} です. </body> </html> EOS # ファイルへの書き出し output = File.open( html, "w" ) output.puts( body ) output.close
サンプルによって test.html というファイルが作成されるので, Web ブラウザで表示してみよ.
Ruby を用いた HTML の作成 (ERB)
別の方法として, 埋め込み Ruby (ERB) を用いることができる. ERB を用いてヒアドキュメントに Ruby スクリプトを埋め込むと 繰り返しなどのプログラム構造を簡潔に書くことができるようになる. ERB の説明は例えば, <URL:https://magazine.rubyist.net/articles/0017/0017-BundledLibraries.html> を参照すると良い. また, J4 DB 技術の資料 も参照すると良い.
ERB では埋め込む際に以下のタグを用いる.
<% … %> Ruby スクリプト片をその場で実行 <%= … %> 式を評価した結果をその場に挿入
ERB を用いて db1.rb を以下のように書き直す. ヒアドキュメント内の HTML に <%...%>, <%=...%> の形で ruby スクリプトが埋め込まれているのがわかると思う. なお, ヒアドキュメントでは << を使う. << の後ろにヒアドキュメントの始まりと終わりを示す文字列の識別子を書く (<< と識別子の間に空白を入れない). EOS(End Of String)とEOL(End Of Line)が使われている例が多いが, 統一されていれば何を使っても問題ない.
$ vi db1.rb require 'erb' # 配列 aray = ['テレビ', '携帯電話', 'カメラ'] contents = <<EOS <html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <body> <table><tr><th>商品名</th></tr> <% aray.each do |item| %> <tr> <td><%= item %></td> </tr> <% end %> </table> </body></html> EOS # おまじない erb = ERB.new(contents) puts erb.result(binding)
db1.rb を実行すると HTML が出力される.
$ ruby db1.rb ... 出力は省略 ...
メールの送信
Mail ライブラリを利用する. 以下のサンプルのようなスクリプトを作成して送信せよ (送信元と送信先は正しく変更すること. 送信先は自分の携帯にしてみよ (学校の学生用メールアドレスには制限がかかっているので, うまく動かないことあり)). メール本文は前述のヒアドキュメントを使うと良い.
まずは Mail ライブラリをインストールする.
# gem install mail
次に以下のようなスクリプトを作成してテストする.
#!/usr/bin/env ruby # coding: utf-8 require 'mail' options = { :address => "red.matsue-ct.jp", :port => 25, :authentication => 'plain', :enable_starttls_auto => true } mail = Mail.new do from '[email protected]' # 送信元 (@matsue-ct.jp にしておく) to '[email protected]' # 送信先 subject "mail test" # body "this is test mail." end # 本文が長い場合は以下のようにヒアドキュメントを使う方が簡単. mail.body = <<"EOS" このメールは、 #{Time.now} に送信されました。 EOS # 送信 mail.delivery_method :smtp, options mail.deliver