Sha256: 609984287627523dd70953ba426e660620d3d4673a2da2bff1f8eee17b2207a4

Contents?: true

Size: 1.49 KB

Versions: 4

Compression:

Stored size: 1.49 KB

Contents

# frozen_string_literal: true

require 'ruby-units'

module WeatherLink
  class LocalClient
    attr_reader :api, :desired_units

    def initialize(host:, station_units: IMPERIAL_WEATHER_UNITS, desired_units: METRIC_WEATHER_UNITS)
      @api = LocalAPIv1.new(host: host, units: station_units)
      @desired_units = desired_units
    end

    META_KEYS = %w[lsid data_structure_type txid].freeze

    def transform_like_api_v2(hash)
      hash.select { |k, _| META_KEYS.include?(k) }.merge('data' => [{
        'ts' => Time.now.to_i,
      }.merge(hash.reject { |k, _| META_KEYS.include?(k) })])
    end

    def attach_units(data)
      data.map do |field, value|
        unit = api.unit_for(field)
        [field, unit ? Unit.new("#{value} #{unit}") : value]
      end.to_h
    end

    def desired_unit_for(field)
      desired_units.fetch(api.type_for(field))
    end

    def convert(field, value)
      desired_unit = desired_unit_for(field)
      return value unless desired_unit

      value.convert_to(desired_unit)
    end

    def current_conditions
      sensors = api.current_conditions['conditions'].map do |conditions|
        SensorData.new(self, transform_like_api_v2(conditions))
      end

      SensorDataCollection.new(self, sensors)
    end

    def stations
      @stations ||= api.station['stations'].map do |data|
        Station.new(self, data) if data
      end
    end

    def sensors
      @sensors ||= api.sensors['sensors'].map do |data|
        Sensor.new(self, data)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
weatherlink-0.1.3 lib/weatherlink/local_client.rb
weatherlink-0.1.2 lib/weatherlink/local_client.rb
weatherlink-0.1.1 lib/weatherlink/local_client.rb
weatherlink-0.1.0 lib/weatherlink/local_client.rb