class Fluent::Plugin::EverySenseInput

Public Instance Methods

configure(conf) click to toggle source

received message format of EverySense is as follows

[

[
  {
    "farm_uuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "sensor_name": "collection_data_1",
    "data_class_name": "AirTemperature",
    "data": {
      "at": "2016-05-12 21:38:52 UTC",
      "memo": null,
      "value": 23,
      "unit": "degree Celsius"
    }
  },
  {
    "farm_uuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "sensor_name": "collection_data_2",
    "data_class_name": "AirHygrometer",
    "data": {
      "at": "2016-05-12 21:38:52 UTC",
      "memo": null,
      "value": 30,
      "unit": "%RH"
    }
  }
]

]

Calls superclass method
# File lib/fluent/plugin/in_everysense.rb, line 70
def configure(conf)
  super
  configure_parser(conf)
end
configure_parser(conf) click to toggle source
# File lib/fluent/plugin/in_everysense.rb, line 75
def configure_parser(conf)
  compat_parameters_convert(conf, :parser)
  parser_config = conf.elements('parse').first
  @parser = parser_create(conf: parser_config)
end
emit(messages) click to toggle source

Converted record for emission [

{"farm_uuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
 "device":
  [
    {
      "farm_uuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
      "sensor_name": "collection_data_1",
      "data_class_name": "AirTemperature",
      "data": {
        "at": "2016-05-12 21:38:52 UTC",
        "memo": null,
        "value": 23,
        "unit": "degree Celsius"
      }
    },
    {
      "farm_uuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
      "sensor_name": "collection_data_2",
      "data_class_name": "AirHygrometer",
      "data": {
        "at": "2016-05-12 21:38:52 UTC",
        "memo": null,
        "value": 30,
        "unit": "%RH"
      }
    }
  ]
}

]

# File lib/fluent/plugin/in_everysense.rb, line 135
def emit(messages)
  begin
    time, record = @parser.parse(messages) do |time, record|
      [time, record]
    end
    #log.debug "time: #{time.inspect}"
    #log.debug "record: #{record.inspect}"
    if record.is_a?(Array) && record[0].is_a?(Array) # Multiple devices case
      mes = Fluent::MultiEventStream.new
      record.each do |single_record|
        # use timestamp of the first sensor (single_record[0])
        mes.add(parse_time(single_record[0]), {
          farm_uuid: single_record[0]["farm_uuid"],
          device: single_record
        })
      end
      router.emit_stream(@tag, mes)
    elsif record.is_a?(Array) && record[0].is_a?(Hash) # Single device case
      # use timestamp of the first sensor (single_record[0])
      router.emit(@tag, parse_time(record[0]), {
        farm_uuid: record[0]["farm_uuid"],
        device: record
      })
    else # The other case
      raise Fluent::Plugin::Parser::ParserError, "Unexpected input format."
    end
  rescue Exception => e
    log.error error: e.to_s
    log.debug_backtrace(e.backtrace)
  end
end
parse_time(record) click to toggle source
# File lib/fluent/plugin/in_everysense.rb, line 96
def parse_time(record)
  if record["data"]["at"].nil?
    log.debug "Since time_key field is nil, Fluent::EventTime.now is used."
    Fluent::EventTime.now
  else
    @parser.parse_time(record["data"]["at"])
  end
end
shutdown() click to toggle source
Calls superclass method
# File lib/fluent/plugin/in_everysense.rb, line 167
def shutdown
  shutdown_proxy
  super
end
start() click to toggle source
Calls superclass method
# File lib/fluent/plugin/in_everysense.rb, line 81
def start
  #raise StandardError.new if @tag.nil?
  super
  start_proxy
  timer_execute(:in_everysense, @polling_interval) do
    begin
      messages = get_messages
      emit(messages) if !(messages.nil? || messages.empty?)
    rescue Exception => e
      log.error error: e.to_s
      log.debug_backtrace(e.backtrace)
    end
  end
end