BathHacked/energy-sparks

View on GitHub
app/services/cads/live_data_service.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Cads
  class LiveDataService
    CACHE_KEY = 'geo-token'.freeze
    DEFAULT_EXPIRY = 45

    def initialize(cad)
      @cad = cad
    end

    def read(type = :electricity)
      result = 0
      data = api.live_data(@cad.device_identifier)
      if data['powerTimestamp'] == 0
        api.trigger_fast_update(@cad.device_identifier)
      else
        result = power_for_type(data['power'], type)
      end
      result
    rescue MeterReadingsFeeds::GeoApi::NotAuthorised, MeterReadingsFeeds::GeoApi::NotAllowed => e
      reset_token
      Rollbar.error(e, school_id: @cad.school.id, school: @cad.school.name, device_identifier: @cad.device_identifier)
    rescue => e
      Rollbar.error(e, school_id: @cad.school.id, school: @cad.school.name, device_identifier: @cad.device_identifier)
    end

    private

    def power_for_type(powers, type)
      if powers
        power = powers.select { |p| p['type'].downcase == type.to_s }.last
      end
      power ? power['watts'] : 0
    end

    def api
      @api ||= MeterReadingsFeeds::GeoApi.new(token: token)
    end

    def token
      Rails.cache.fetch(CACHE_KEY, expires_in: expiry) do
        MeterReadingsFeeds::GeoApi.new(username: ENV['GEO_API_USERNAME'], password: ENV['GEO_API_PASSWORD']).login
      end
    end

    def reset_token
      Rails.cache.delete(CACHE_KEY)
    end

    def expiry
      ENV['GEO_API_TOKEN_EXPIRY_MINUTES'].blank? ? DEFAULT_EXPIRY.minutes : ENV['GEO_API_TOKEN_EXPIRY_MINUTES'].to_i.minutes
    end
  end
end