fluent-plugin-serialport

Fluentdのプラグインを書いてみました.
SerialPortrからながれてくるデータをそのままfluentdにinputする
pluginです.

in_serialport.rb

id:tagomoris さんの記事を参考に作成しました.
http://github.com/katsyoshi/fluent-plugin-serialportに公開してあります.

module Fluent
class SerialPortInput < Input
  Plugin.register_input('serial_input', self)
  config_param :data, :string, :default => ""
  config_param :delimiter, :string, :default => ','
  config_param :eol, :string, :default => $/
  config_param :com_port, :string
  config_param :baud_rate, :integer

  def initialize
    require 'serialport'
    super
  end

  def configure(conf)
    super
  end

  def start
    @serial = SerialPort.new(@com_port, @baud_rate, 8, 1, SerialPort::NONE)

    @thread = Thread.new do
      ary = []
      loop do
        unless @serial.closed?
          begin
            d = @serial.readline(@eol)
            data = {}
            if @data.empty?
              data = {:default => d}
            else
              d = d.split(@delimiter)
              @data.split(",").each do |x|
                dd = d.shift
                if dd =~ /^(0x)|(\d+)/
                  if dd =~ /\./
                    dd = dd.strip.to_f
                  else
                    dd = dd.strip.to_i
                  end
                end
                data[x.strip.to_sym] = dd
              end
            end
            Engine.emit("serial.#{device}", Engine.now, data)
          rescue => e
            STDERR.puts caller(), e
            break
          end
        end
      end
    end
  end

  def shutdown
    @serial.close
    @thread.join
  end

  private
  def average(ary)
    ary.inject(:+).to_f/ary.size.to_f
  end

  def device
    File.basename(@com_port).gsub(/\./,"_")
  end
end
end

設定例

ここでは,設定例について書きます.
入力は以下の例となっています.

<source>
  type serial_input
  com_port /path/to/serial/port
  baud_rate 9600
  data device, sensor, value
  delimiter ,
</source>

typeは,serial_inputとなります(これでいいの?).com_portはシリアルポートの
絶対パス,baud_rateは転送速度,dataはシリアルポートから流れてくるデータの
タイトル(なくてもok),delimiterは流れてくるデータの区切文字(なくてもok)と
なっています.

さいごに

簡単にserialportからfluentdに投げるpluginを書いてみました.
自分で見ててソースがいけてないので,だれかお願いします.
ヽ('ω')ノ三ヽ('ω')ノ