Sha256: 9cc13c48792252c790affbce59e97b959f6ecd891cee57c45079e6dd0f1f035c

Contents?: true

Size: 1.92 KB

Versions: 7

Compression:

Stored size: 1.92 KB

Contents

require 'socket'
require 'json'

module PulseMeter
  module Sensor

    # Remote sensor, i.e. a simple UDP proxy for sending data without
    # taking in account backend performance issues
    class Remote < Base

      DEFAULT_PORT = 27182
      DEFAULT_HOST = 'localhost'

      # @!attribute [r] name
      #   @return [String] sensor name
      attr_reader :name

      # Initializes sensor and creates UDP socket
      # @param name [String] sensor name
      # @option options [Symbol] :host host for remote pulse-meter daemon
      # @option options [Symbol] :port port for remote pulse-meter daemon
      # @raise [BadSensorName] if sensor name is malformed
      # @raise [ConnectionError] if invalid host or port are provided
      def initialize(name, options={})
        @name = name.to_s
        raise BadSensorName, @name unless @name =~ /\A\w+\z/
        @host = options[:host].to_s || DEFAULT_HOST
        @port = options[:port].to_i || DEFAULT_PORT
        @socket = UDPSocket.new
      end

      # Send value to remote sensor
      # @param value value for remote sensor
      # @raise [ConnectionError] if remote daemon is not available
      # @raise [MessageTooLarge] if event data is too large to be serialized into a UDP datagram
      def event(value)
        events(name => value)
      end

      # Send values to multiple remote sensors
      # @param event_data hash with remote sensor names as keys end event value for each value as sensor
      def events(event_data)
        raise ArgumentError unless event_data.is_a?(Hash)
        socket_action do
          @socket.send(event_data.to_json, 0, @host, @port)
        end
      end

      private

      def socket_action
        yield
      rescue SocketError, Errno::EADDRNOTAVAIL, Errno::EINVAL => exc
        raise PulseMeter::Remote::ConnectionError, exc.to_s
      rescue Errno::EMSGSIZE => exc
        raise PulseMeter::Remote::MessageTooLarge, exc.to_s
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
pulse-meter-0.2.6 lib/pulse-meter/sensor/remote.rb
pulse-meter-0.2.5 lib/pulse-meter/sensor/remote.rb
pulse-meter-0.2.3 lib/pulse-meter/sensor/remote.rb
pulse-meter-0.2.2 lib/pulse-meter/sensor/remote.rb
pulse-meter-0.2.1 lib/pulse-meter/sensor/remote.rb
pulse-meter-0.2.0 lib/pulse-meter/sensor/remote.rb
pulse-meter-0.1.11 lib/pulse-meter/sensor/remote.rb