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