class MideaAirCondition::Client

Client for Midea AC server

Constants

CLIENT_TYPE
FORMAT
LANGUAGE
SERVER_URL

Attributes

debug[RW]

Public Class Methods

new(email, password, app_key:, app_id: 1017, src: 17) click to toggle source
# File lib/client.rb, line 18
def initialize(email, password, app_key:, app_id: 1017, src: 17)
  @app_id   = app_id
  @src      = src
  @email    = email
  @password = password
  @app_key  = app_key
  @debug    = false

  @security = Security.new(app_key: @app_key)

  @current = nil
end

Public Instance Methods

appliance_list() click to toggle source
# File lib/client.rb, line 43
def appliance_list
  response = api_request(
    'appliance/list/get',
    homegroupId: default_home['id']
  )
  response['list']
end
appliance_transparent_send(appliance_id, data) click to toggle source
# File lib/client.rb, line 51
def appliance_transparent_send(appliance_id, data)
  response = api_request(
    'appliance/transparent/send',
    order: encode(@security.transcode(data).join(',')),
    funId: '0000',
    applianceId: appliance_id
  )

  response = decode(response['reply']).split(',').map { |p| p.to_i & 0xff }

  response
end
login() click to toggle source
# File lib/client.rb, line 31
def login
  login_id = user_login_id_get['loginId']

  encrypted_password = @security.encrypt_password(@password, login_id)
  @current = api_request(
    'user/login',
    loginAccount: @email,
    password: encrypted_password
  )
  @security.access_token = @current['accessToken']
end
new_packet_builder() click to toggle source
# File lib/client.rb, line 64
def new_packet_builder
  PacketBuilder.new(@security)
end

Private Instance Methods

api_home_list() click to toggle source
# File lib/client.rb, line 118
def api_home_list
  api_request('homegroup/list/get')
end
api_request(endpoint, **args) click to toggle source
# File lib/client.rb, line 78
def api_request(endpoint, **args)
  args = {
    appId: @app_id, format: FORMAT, clientType: CLIENT_TYPE,
    language: LANGUAGE, src: @src,
    stamp: Time.now.strftime('%Y%m%d%H%M%S')
  }.merge(args)

  args[:sessionId] = @current['sessionId'] unless @current.nil?

  path = "/#{SERVER_URL.split('/').last}/#{endpoint}"
  args[:sign] = @security.sign(path, args)

  result = send_api_request(URI("#{SERVER_URL}/#{endpoint}"), args)

  result['result']
end
decode(data) click to toggle source
# File lib/client.rb, line 74
def decode(data)
  @security.aes_decrypt(data, @security.data_key)
end
default_home() click to toggle source
# File lib/client.rb, line 112
def default_home
  @default_home ||= api_home_list['list'].select do |h|
    h['isDefault'].to_i == 1
  end.first
end
encode(data) click to toggle source
# File lib/client.rb, line 70
def encode(data)
  @security.aes_encrypt(data, @security.data_key)
end
log(data) click to toggle source
# File lib/client.rb, line 122
def log(data)
  p data if @debug
end
send_api_request(uri, args) click to toggle source
# File lib/client.rb, line 95
def send_api_request(uri, args)
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    request = Net::HTTP::Post.new(uri)
    request.set_form_data(args)

    result = JSON.parse(http.request(request).body)
    raise result['msg'] unless result['errorCode'] == '0'

    log(result['result'])
    result
  end
end
user_login_id_get() click to toggle source
# File lib/client.rb, line 108
def user_login_id_get
  api_request('user/login/id/get', loginAccount: @email)
end