class Kakaxi::Client

Constants

BASE_URL
COMMON_HEADER

Attributes

current_device[R]
devices[R]
farm[R]
humidities[R]
interval_photo_data[R]
interval_photos[R]
rainfalls[R]
solar_radiations[R]
temp_data[R]
temps[R]
timelapses[R]
token[R]

Public Class Methods

new(email, password) click to toggle source
# File lib/kakaxi/client.rb, line 14
def initialize(email, password)
  @email = email
  @password = password
end

Public Instance Methods

load_devices() click to toggle source
# File lib/kakaxi/client.rb, line 33
def load_devices
  @devices = get_devices
  @current_device = @devices[0]
end
load_farm() click to toggle source
# File lib/kakaxi/client.rb, line 29
def load_farm
  @farm = get_farm
end
load_humidities(days: 5) click to toggle source
# File lib/kakaxi/client.rb, line 48
def load_humidities(days: 5)
  uri = URI.parse(BASE_URL + "kakaxi_devices/#{@current_device.id}/indicators/humidity?days=#{days}")
  humidities = get(uri)['data']
  Struct.new('HumidityMetaData', :size, :device_id)
  @humidities = humidities.map do |humidity|
    Kakaxi::Data::Humidity.new(
      value: humidity['humidity'],
      recorded_at: humidity['recorded_at'],
      interpolation: humidity['interpolation'],
      deficit: humidity['humidity_deficit']
    )
  end
  @humidity_data = Struct::HumidityMetaData.new(@humidities.length, @current_device.id)
end
load_interval_photos(pagination: false, start_date: Date.today, end_date: Date.today + 7) click to toggle source
# File lib/kakaxi/client.rb, line 104
def load_interval_photos(pagination: false, start_date: Date.today, end_date: Date.today + 7)
  uri = URI.parse(BASE_URL + "kakaxi_devices/#{@current_device.id}/interval_photos")
  params = { pagination: false, start_date: start_date, end_date: end_date }
  uri.query = URI.encode_www_form(params)
  interval_photos = get(uri)
  Struct.new('IntervalPhotoMetaData', :size, :pagination, :start_date, :end_date)
  @interval_photos = interval_photos.map do |photo|
    Kakaxi::IntervalPhoto.new(
      id: photo['id'],
      url: photo['url'],
      taken_at: photo['takenAt']
      )
  end
  @interval_photo_data = Struct::IntervalPhotoMetaData.new(@interval_photos.size, pagination, start_date, end_date)
end
load_rainfalls(days: 5) click to toggle source
# File lib/kakaxi/client.rb, line 77
def load_rainfalls(days: 5)
  uri = URI.parse(BASE_URL + "kakaxi_devices/#{@current_device.id}/indicators/rainfall?days=#{days}&unit=inch")
  rainfalls = get(uri)['data']
  Struct.new('RainfallMetaData', :size, :unit, :device_id)
  @rainfalls = rainfalls.map do |rainfall|
    Kakaxi::Data::Rainfall.new(value: rainfall['amount'], recorded_at: rainfall['recorded_at'], interpolation: rainfall['interpolation'])
  end
  @rainfall_data = Struct::RainfallMetaData.new(@rainfalls.length, 'inch', @current_device.id)
end
load_solar_radiations(days: 5) click to toggle source
# File lib/kakaxi/client.rb, line 63
def load_solar_radiations(days: 5)
  uri = URI.parse(BASE_URL + "kakaxi_devices/#{@current_device.id}/indicators/solar_radiation?days=#{days}&unit=watt")
  solar_radiations = get(uri)['data']
  Struct.new('SolarRadiationMetaData', :size, :unit, :device_id)
  @solar_radiations = solar_radiations.map do |solar_radiation|
    Kakaxi::Data::SolarRadiation.new(
      value: solar_radiation['amount'],
      recorded_at: solar_radiation['recorded_at'],
      interpolation: solar_radiation['interpolation']
     )
  end
  @solar_radiation_data = Struct::SolarRadiationMetaData.new(@solar_radiations.length, 'watt',  @current_device.id) 
end
load_temps(days: 5, unit: 'celsius') click to toggle source
# File lib/kakaxi/client.rb, line 38
def load_temps(days: 5, unit: 'celsius')
  uri = URI.parse(BASE_URL + "kakaxi_devices/#{@current_device.id}/indicators/temperature?days=#{days}&unit=#{unit}")
  temps = get(uri)['data']
  Struct.new('TempMetaData', :size, :unit, :device_id)
  @temps = temps.map do |temp|
    Kakaxi::Data::Temperature.new(value: temp['temperature'], recorded_at: temp['recorded_at'], interpolation: temp['interpolation'])
  end
  @temp_data = Struct::TempMetaData.new(@temps.length, unit, @current_device.id)
end
load_timelapses(days: 5) click to toggle source
# File lib/kakaxi/client.rb, line 87
def load_timelapses(days: 5)
  uri = URI.parse(BASE_URL + "kakaxi_devices/#{@current_device.id}/indicators/timelapse?days=#{days}")
  timelapses = get(uri)['data']
  Struct.new('TimelapseMetaData', :size, :device_id)
  @timelapses = timelapses.map do |timelapse|
    Kakaxi::Data::Timelapse.new(
      id: timelapse['id'],
      start_datetime: timelapse['beginningTime'],
      end_datetime: timelapse['endTime'],
      url: timelapse['videoURL'],
      thumbnail_name: timelapse['thumbnail']['name'],
      thumbnail_url: timelapse['thumbnail']['url']
    )
  end
  @timelapse_data = Struct::TimelapseMetaData.new(@timelapses.length, @current_device.id)
end
load_token() click to toggle source
# File lib/kakaxi/client.rb, line 25
def load_token
  @token = get_token
end
set_current_device(index: 0, id: nil, name: nil) click to toggle source
# File lib/kakaxi/client.rb, line 19
def set_current_device(index: 0, id: nil, name: nil)
  @current_device = @devices[index] if id.nil? && name.nil?
  @current_device = @devices.find { |device| device.id == id } unless id.nil?
  @current_device = @devices.find { |device| device.name == name } unless name.nil?
end

Private Instance Methods

get(uri) click to toggle source
# File lib/kakaxi/client.rb, line 147
def get(uri)
  header = COMMON_HEADER.merge('Authorization' => "Bearer #{@token}")
  request = Net::HTTP::Get.new(uri)
  set_header(header, request)
  JSON.parse(https(uri).request(request).body)
end
get_devices() click to toggle source
# File lib/kakaxi/client.rb, line 134
def get_devices
  uri = URI.parse(BASE_URL + "farms/#{@farm.id}/kakaxi_devices?pagination=false")
  devices = get(uri)
  devices.map { |device| Kakaxi::Device.new(id: device['id'], name: device['name']) }
end
get_farm() click to toggle source
# File lib/kakaxi/client.rb, line 129
def get_farm
  farm = get(URI.parse(BASE_URL + 'users/me'))['farm']
  Kakaxi::Farm.new(id: farm['id'], name: farm['name'])
end
get_token() click to toggle source
# File lib/kakaxi/client.rb, line 121
def get_token
  uri = URI.parse(BASE_URL + 'oauth/token')
  params = { username: @email, password: @password, grant_type: 'password', scope: 'all' }
  response = post(uri, params)
  raise InvalidCredentialsError.new(@email, @password) if response.code == '404'
  JSON.parse(response.body)['access_token']
end
https(uri) click to toggle source
# File lib/kakaxi/client.rb, line 158
def https(uri)
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  https
end
indicator_uri(device_id, indicator, days, unit) click to toggle source
# File lib/kakaxi/client.rb, line 164
def indicator_uri(device_id, indicator, days, unit)
  URI.parse(BASE_URL + "kakaxi_devices/#{device_id}/indicators/#{indicator}?days=#{days}")
end
post(uri, params, header=COMMON_HEADER) click to toggle source
# File lib/kakaxi/client.rb, line 140
def post(uri, params, header=COMMON_HEADER)
  request = Net::HTTP::Post.new(uri.path)
  request.body = params.to_json
  set_header(header, request)
  https(uri).request(request)
end
set_header(header, request) click to toggle source
# File lib/kakaxi/client.rb, line 154
def set_header(header, request)
  header.each { |key, value| request[key] = value }
end