plugins/ifttt_plugin.rb in ladder_drive-0.6.0 vs plugins/ifttt_plugin.rb in ladder_drive-0.6.1

- old
+ new

@@ -55,80 +55,113 @@ value3: 値3 DOC require 'net/https' -def plugin_ifttt_init plc - @plugin_ifttt_config = load_plugin_config 'ifttt' - return if @plugin_ifttt_config[:disable] +module LadderDrive +module Emulator - @plugin_ifttt_values = {} - @plugin_ifttt_times = {} - @plugin_ifttt_worker_queue = Queue.new - Thread.start { - plugin_ifttt_worker_loop - } -end +class IftttPlugin < Plugin -def plugin_ifttt_exec plc - return if @plugin_ifttt_config[:disable] - return unless @plugin_ifttt_config[:web_hook_key] + def initialize plc + super #plc + return if disabled? - @plugin_ifttt_config[:events].each do |event| - begin - triggered = false - case event[:trigger][:type] - when "interval" - now = Time.now - t = @plugin_ifttt_times[event.object_id] || now - triggered = t <= now - if triggered - t += event[:trigger][:interval] || 300 - @plugin_ifttt_times[event.object_id] = t - end - else - d = plc.device_by_name event[:trigger][:device] - v = d.send event[:trigger][:value_type], event[:trigger][:text_length] || 8 - unless @plugin_ifttt_values[event.object_id] == v - @plugin_ifttt_values[event.object_id] = v - case event[:trigger][:type] - when "raise" - triggered = !!v - when "fall" - triggered = !v - else - triggered = true + @values = {} + @times = {} + @worker_queue = Queue.new + setup + end + + def run_cycle plc + return if disabled? + config[:events].each do |event| + begin + triggered = false + case event[:trigger][:type] + when "interval" + now = Time.now + t = @times[event.object_id] || now + triggered = t <= now + if triggered + t += event[:trigger][:interval] || 300 + @times[event.object_id] = t end + else + d = plc.device_by_name event[:trigger][:device] + v = d.send event[:trigger][:value_type], event[:trigger][:text_length] || 8 + unless @values[event.object_id] == v + @values[event.object_id] = v + case event[:trigger][:type] + when "raise" + triggered = !!v + when "fall" + triggered = !v + else + triggered = true + end + end end + + next unless triggered + + @worker_queue.push event:event[:name], payload:event[:params].dup || {}, value:v + rescue => e + p e end + end if config[:events] + end - next unless triggered + def disabled? + return false unless super + unless config[:web_hook_key] + puts "ERROR: IftttPlugin requires web_hook_key." + false + else + super + end + end - @plugin_ifttt_worker_queue.push event:event[:name], payload:event[:params].dup || {}, value:v - rescue => e - p e + + private + + def setup + Thread.start { + thread_proc + } end - end if @plugin_ifttt_config[:events] -end -def plugin_ifttt_worker_loop - while arg = @plugin_ifttt_worker_queue.pop - begin - uri = URI.parse("https://maker.ifttt.com/trigger/#{arg[:event]}/with/key/#{@plugin_ifttt_config[:web_hook_key]}") - http = Net::HTTP.new(uri.host, uri.port) - http.use_ssl = true - http.verify_mode = OpenSSL::SSL::VERIFY_NONE + def thread_proc + while arg = @worker_queue.pop + begin + uri = URI.parse("https://maker.ifttt.com/trigger/#{arg[:event]}/with/key/#{config[:web_hook_key]}") + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = true + http.verify_mode = OpenSSL::SSL::VERIFY_NONE - req = Net::HTTP::Post.new(uri.path) - payload = arg[:payload] - payload.keys.each do |key| - payload[key] = arg[:value] if payload[key] == "__value__" - end - req.set_form_data(payload) + req = Net::HTTP::Post.new(uri.path) + payload = arg[:payload] + payload.keys.each do |key| + payload[key] = arg[:value] if payload[key] == "__value__" + end + req.set_form_data(payload) - http.request(req) - rescue => e - # TODO: Resend if it fails. - p e + http.request(req) + rescue => e + # TODO: Resend if it fails. + p e + end + end end - end + +end + +end +end + +def plugin_ifttt_init plc + @ifttt_plugin = LadderDrive::Emulator::IftttPlugin.new plc +end + +def plugin_ifttt_exec plc + @ifttt_plugin.run_cycle plc end