class TuyaCloud::API::Auth

Attributes

access_token[RW]
brand[RW]
country_code[RW]
expire_time[RW]
password[RW]
refresh_token[RW]
region[RW]
username[RW]

Public Class Methods

new(username, password, country_code, brand, region) click to toggle source
# File lib/tuya_cloud/api.rb, line 60
def initialize(username, password, country_code, brand, region)
  raise ArgumentError unless username.is_a?(String) &&
                             password.is_a?(String) &&
                             country_code.is_a?(String) &&
                             brand.is_a?(String) &&
                             region.is_a?(String)

  self.username     = username
  self.password     = password
  self.country_code = country_code
  self.brand        = brand
  self.region       = region
end

Public Instance Methods

cloud_url() click to toggle source
# File lib/tuya_cloud/api.rb, line 74
def cloud_url
  CLOUD_URL.gsub('%', region)
end
login() click to toggle source
# File lib/tuya_cloud/api.rb, line 78
def login
  uri = URI.parse("#{cloud_url}/homeassistant/auth.do")
  response = Net::HTTP.post_form(uri,
                                 userName: username,
                                 password: password,
                                 countryCode: country_code,
                                 bizType: brand,
                                 from: 'tuya')
  unless response.is_a?(Net::HTTPOK)
    raise Error,
          'invalid HTTP response from Tuya Cloud whilst trying to '\
          'get access token'
  end

  json = JSON.parse(response.body)
  process_auth_response(json)
end
process_auth_response(json) click to toggle source
# File lib/tuya_cloud/api.rb, line 114
def process_auth_response(json)
  unless json['access_token'] &&
         json['refresh_token'] &&
         json['expires_in']
    raise Error,
          'invalid JSON response from Tuya Cloud whilst trying to '\
          'get access token'
  end

  self.access_token = json['access_token']
  self.refresh_token = json['refresh_token']
  self.expire_time = Time.now + json['expires_in'].to_i
  true
end
process_request(name, namespace, device_id: nil, payload: {}) click to toggle source
# File lib/tuya_cloud/api.rb, line 129
def process_request(name, namespace, device_id: nil, payload: {})
  raise ArgumentError unless name.is_a?(String) &&
                             namespace.is_a?(String)

  refresh_access_token
  header = {
    name: name,
    namespace: namespace,
    payloadVersion: 1
  }
  payload[:accessToken] = access_token
  payload[:devId] = device_id unless namespace == 'discovery'
  data = {
    header: header,
    payload: payload
  }
  uri = URI.parse("#{cloud_url}/homeassistant/skill")
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Post.new(uri.request_uri,
                                'Content-Type' => 'application/json')
  request.body = data.to_json
  response = http.request(request)
  unless response.is_a?(Net::HTTPOK)
    raise Error,
          'request was not processed by Tuya Cloud'
  end

  json = JSON.parse(response.body)
  unless json['header']['code'] == 'SUCCESS'
    raise Error,
          'request was not processed by Tuya Cloud'
  end

  json['payload']
end
refresh_access_token() click to toggle source
# File lib/tuya_cloud/api.rb, line 96
def refresh_access_token
  return unless token_expired?

  uri = URI.parse("#{cloud_url}/homeassistant/access.do?grant_type=refresh_token&"\
              "refresh_token=#{refresh_token}")
  response = Net::HTTP.get uri
  unless response.is_a?(String) && !response.empty?
    raise Error, 'failed to refresh access token'
  end

  json = JSON.parse(response)
  process_auth_response(json)
end
token_expired?() click to toggle source
# File lib/tuya_cloud/api.rb, line 110
def token_expired?
  Time.now > expire_time
end