2013年8月1日木曜日

モニタリングポスト仕様/cpmロガー作成

さて材料が揃ったのでいよいよモニタリングポストを構築しよう。
例によって先人の記録(ガイガーカウンターキット GC10 データをグラフ化)を参考にして以下のようにしよう。

  1. GC10のcpmをログファイルに記録
  2. 1分間隔でcpmと線量をtweet
  3. 1分間隔でxively.comにcpmと線量をアップロード
  4. 1時間隔でgnuplotでグラフ作成してブログにアップロード
  5. 1日間隔でログファイルをgoogleドライブにアップロード
時間間隔での動作はcronで動作させる。
というわけでまずは1.のロガー作成。

バージョン1

# coding:utf-8
 
require 'pp'
require 'fileutils'
#require 'serialport'
 
class GC10Logger
  def initialize
     @sp = SerialPort.new('/dev/ttyUSB0',9600,8,1,0)
  end
 
  def get_cpm
    line = @sp.gets("\n")
    if /^\d+/ =~ line
      return line.to_i
    else
      return nil
    end
  end
 
  def run
    loop do
      cpm = get_cpm
      now = Time.now
      next unless cpm
 
      dir = File.join(ENV["HOME"],"gc10",now.strftime("%Y"),now.strftime("%m"))
      file = File.join(dir,now.strftime("%d")+".txt")
      FileUtils.mkdir_p(dir)
      mode = File.exists?(file) ? "a" : "w"
      File.open(file,mode) do |io|
        out = "#{now.strftime("%Y%m%d%H%M%S")}\t#{cpm}"
        io.puts out
      end
    end
  end
end
 
gc10 = GC10Logger.new
gc10.run

これで$HOME/gc10/2013/08/01.txtのようなファイルが延々とできる。
内容は

20130801212453 25
20130801212454 24
20130801212455 24
20130801212456 24
20130801212457 23
20130801212458 23
20130801212459 23
20130801212500 22

みたいな感じ。

さらに自動起動するようにしたいのでロックファイルを確認して既に実行中だったら終了するよう改造してcronで定時起動する作戦。

で、バージョン2

# coding:utf-8
 
require 'pp'
require 'fileutils'
require 'serialport'

class Locked < StandardError
end

def lock(lock_file_path='/tmp/gc10lock')
  File.open(lock_file_path, 'w') do |lock_file|
    if lock_file.flock(File::LOCK_EX|File::LOCK_NB)
      yield
    else
      raise Locked
    end
  end
end

class GC10Logger
  def initialize
     @sp = SerialPort.new('/dev/ttyUSB0',9600,8,1,0)
  end
 
  def get_cpm
    line = @sp.gets("\n")
    if /^\d+/ =~ line
      return line.to_i
    else
      return nil
    end
  end

  def run
    loop do
      cpm = get_cpm
      now = Time.now
      next unless cpm
 
      dir = File.join(ENV["HOME"],"gc10",now.strftime("%Y"),now.strftime("%m"))
      file = File.join(dir,now.strftime("%d")+".txt")
      FileUtils.mkdir_p(dir)
      mode = File.exists?(file) ? "a" : "w"
      File.open(file,mode) do |io|
        out = "#{now.strftime("%Y%m%d%H%M%S")}\t#{cpm}"
        io.puts out
      end
    end
  end
end

begin 
  lock do
    gc10 = GC10Logger.new
    gc10.run
  end
rescue Locked
  puts "already running..."
  exit 0
end

あとはcronの設定。

cronからrvmのrubyを実行するのに若干手間取ったができた。
/etc/cron.d/gc10loggerを以下の内容で作成。


* * * * * pi /home/pi/.rvm/bin/ruby /home/pi/scripts/gc10logger.rb

みっしょんこんぷりーと

0 件のコメント:

amazonアソシエイト