2019 年度 OSS リテラシ 3 : IoT システム

はじめに

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     'hogehoge@matsue-ct.jp'    # 送信元 (@matsue-ct.jp にしておく)
  to       'herohero@matsue-ct.jp'    # 送信先
  subject  "mail test"
#  body      "this is test mail."
end

# 本文が長い場合は以下のようにヒアドキュメントを使う方が簡単. 
mail.body = <<"EOS"
このメールは、
#{Time.now} に送信されました。
EOS 

# 送信
mail.delivery_method :smtp, options
mail.deliver

最終課題 : 環境データを利用したシステム

IoT と称されるシステムは, センサーから送られてきたデータを解析し, 何らかのアクションを 起こすものである. それを行う前提として, 得られたデータの特徴を把握しておく必要がある. データの特徴の掌握の第一歩は前回までの統計解析である.

教室内の気温といった環境データを利用することでできることを考えてみよ. 今までサンプルとして提示したプログラムを活用すれば色々なアイデアを実現できると思う. 例えば, 松江高専 環境モニタリングシステムでは 特に夏季においてクーラー基準をチェックしている.

以下では, 参考となる例をいくつか提示する. なお, 課題に使うデータは自分のセンサーで 得た情報だけでなく, 友人のセンサーから得られた情報も用いて良い.

環境の「見える化」

IoT システムの良いところは, 「暑い」「寒い」などの体感的に語られてきたことを 数値で示すことができることである. さらに継続的に観測を行うことで, 今まで知らなかった/意識してこなかったことが見えてくることもある. センサーから得られたデータを統計処理してグラフ表示・Web 表示し, その図から何か新しいことが言えないか議論してみよ.

冬季の室内において, 高さ方向にどの程度温度差がついているか明らかにするといったことは, 「見える化」の一例である.

室内の温度環境が基準を満たしているかのチェック

室内温度については, 文科省が「学校の教室の望ましい温度」の指針を定めている.

  • 17 <= 気温 <= 28

また, 松江高専の基準では, 夏季にクーラーを入れる条件は以下の 2 つの条件のうち 1 つが満たされた場合である.

  • 気温 > 28 度
  • 不快指数 > 78

現在は冬季であるので, 上記基準を下回るような場合には Web ページにアラートを出すようなシステムを作成してみよ.

電気の消し忘れのチェック

夜間に照明をつけっぱなしにすることはエネルギーの無駄である. そこで照度計から得られたデータを使って, 夜間に照度が閾値を超えている場合には Web ページにアラートを出すようなシステムを作成してみよ.

なお, 閾値は観測より得られた平均的な値から各自決めてみよ.

教室を使っているかのチェック

得られた温度のデータを見てみると, 冬場の平日は以下の特徴がある.

  • 朝, 暖房が ON されたタイミングで気温が急激に高くなる.
  • 日中は暖房のために気温が高い.
  • 1 日の平均気温の標準偏差が大きい.

一方, 休日は以下の特徴がある.

  • 暖房が入らないので気温が低い.
  • 1 日の平均気温の標準偏差が小さい.

これらの特徴を使うと, 例えば以下がわかりそうである.

  • 標準偏差 < 閾値 (例えば 1) => 教室は使われなかった.
  • 温度の時間変化 (dT/dt) > 閾値 => 学生が教室に入って暖房を付けた時刻
  • 昼から夜にかけて温度変化が小さい => 暖房が点きっぱなし?

これらの判断をプログラム中で行うと,

  • 教室が使われたかどうかの結果を Web ページに表示.
  • 暖房がついたらその時刻を Web ページに表示.
  • 暖房が点きっぱなしなら, Web ページにアラートを出す.

ができそうである. なかなか検証は難しいが, 興味を持った人は是非考えてみてほしい.

課題の提出方法

上記の例を参考にしつつ自分なりの課題を 1 つ設定し, それに関する簡単なレポートを作成し, 電子ファイルで提出せよ. レポートには以下の内容を入れること.

  • はじめに: 作成したプログラムの目的
  • 手法: プログラム中でのデータ処理の概要.
    • 使ったデータの説明 (使ったテーブルやカラム, それを使った理由)
    • データを使って何を判断したか. 判断の基準.
  • 結果: 判断結果を使って行ったことを示すもの.
    • 送られたメールのコピー
    • Web ページのスナップショット
  • まとめ
    • 何を行って何が実現できたかのサマリ.
  • 作成したプログラムの添付