class Arlo::API

Public Class Methods

new() click to toggle source
# File lib/arlo/init.rb, line 4
def initialize
  @token = login
  @devices = get_devices
  @profile = get_profile
end

Public Instance Methods

arm_device(device, armed) click to toggle source
# File lib/arlo/devices.rb, line 15
def arm_device(device, armed)
  device_id = device['deviceId']
  payload = {
    'from': 'arlogem',
    'to': device_id,
    'action': 'set',
    'resource': 'modes',
    'transId': SecureRandom.uuid,
    'publishResponse': true,
    'properties': {
      'active': armed ? 'mode1' : 'mode0'
    }
  }

  ret_val = post("https://arlo.netgear.com/hmsweb/users/devices/notify/#{device_id}",
                 payload, 'xcloudId': device['xCloudId'])

  JSON.parse(ret_val.body)
end
devices() click to toggle source
# File lib/arlo/init.rb, line 14
def devices
  @devices
end
get(url) click to toggle source
# File lib/arlo/network_helper.rb, line 8
def get url
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  request = Net::HTTP::Get.new(uri)
  request.add_field('Content-Type', 'application/json;charset=UTF-8')
  request.add_field('Authorization', @token)

  http.request(request)
end
get_device_info(device_name) click to toggle source
# File lib/arlo/devices.rb, line 10
def get_device_info(device_name)
  raise 'Missing device_name' unless device_name
  @devices['data'].select {|device| device['deviceName'] == device_name }[0]
end
get_devices() click to toggle source
# File lib/arlo/devices.rb, line 5
def get_devices
  devices = get 'https://arlo.netgear.com/hmsweb/users/devices'
  @devices = JSON.parse(devices.body)
end
get_library(from_date, to_date) click to toggle source
# File lib/arlo/library.rb, line 3
def get_library(from_date, to_date)
  payload = {
    'dateFrom': from_date,
    'dateTo': to_date
  }
  library = post('https://arlo.netgear.com/hmsweb/users/library', payload)
  JSON.parse(library.body)
end
get_profile() click to toggle source
# File lib/arlo/profile.rb, line 3
def get_profile
  profile = get 'https://arlo.netgear.com/hmsweb/users/profile'
  @profile = JSON.parse(profile.body)
end
login() click to toggle source
# File lib/arlo/init.rb, line 22
def login
  email = ENV['ARLO_EMAIL']
  raise 'Missing ARLO_EMAIL environment variable' unless email
  password = ENV['ARLO_PASSWORD']
  raise 'Missing ARLO_PASSWORD environment variable' unless password

  payload = {
    'email': email,
    'password': password
  }
  response = post('https://arlo.netgear.com/hmsweb/login/v2', payload)
  JSON.parse(response.body)['data']['token']
end
post(url, payload, xheaders = nil) click to toggle source
# File lib/arlo/network_helper.rb, line 20
def post url, payload, xheaders = nil
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  request = Net::HTTP::Post.new(uri)

  headers = {
    'Content-Type': 'application/json;charset=UTF-8',
    'Authorization': @token
  }

  headers.merge!(xheaders) if xheaders

  headers.each do |key, value|
    request.add_field(key, value)
  end
  request.body = payload.to_json

  http.request(request)
end
profile() click to toggle source
# File lib/arlo/init.rb, line 18
def profile
  @profile
end
record_video(camera, duration) click to toggle source
# File lib/arlo/devices.rb, line 81
def record_video(camera, duration)
  camera_id = camera['deviceId']
  parent_id = camera['parentId']

  ret_val = start_stream(camera, parent_id)
  return ret_val unless ret_val['success']

  # ret_val['data']['url']
  payload = {
    'xcloudId': camera['xCloudId'],
    'parentId': parent_id,
    'deviceId': camera_id,
    'olsonTimeZone': camera['properties']['olsonTimeZone']
  }

  ret_val = post('https://arlo.netgear.com/hmsweb/users/devices/startRecord',
                 payload, 'xcloudId': camera['xCloudId'])

  sleep(duration)

  stop_stream(camera)

  JSON.parse(ret_val.body)
end
set_siren_on(device, duration) click to toggle source
# File lib/arlo/devices.rb, line 35
def set_siren_on(device, duration)
  device_id = device['deviceId']

  payload = {
    'from': 'arlogem',
    'to': device_id,
    'action': 'set',
    'transId': SecureRandom.uuid,
    'publishResponse': true,
    'resource': 'siren',
    'properties': {
      'duration': duration,
      'pattern': 'alarm',
      'sirenState': 'on',
      'volume': 8
    }
  }

  ret_val = post("https://arlo.netgear.com/hmsweb/users/devices/notify/#{device_id}",
                 payload, 'xcloudId': device['xCloudId'])

  JSON.parse(ret_val.body)
end
take_snapshot(camera) click to toggle source
# File lib/arlo/devices.rb, line 59
def take_snapshot(camera)
  camera_id = camera['deviceId']

  ret_val = start_stream(camera, camera_id)
  return ret_val unless ret_val['success']

  payload = {
    'cameraId': camera_id,
    'parentId': camera_id,
    'deviceId': camera_id,
    'olsonTimeZone': camera['properties']['olsonTimeZone']
  }

  ret_val = post('https://arlo.netgear.com/hmsweb/users/devices/takeSnapshot',
                 payload, 'xcloudId': camera['xCloudId'])

  snapshot_ret_val = JSON.parse(ret_val.body)

  stop_stream(camera)
  snapshot_ret_val
end
token() click to toggle source
# File lib/arlo/init.rb, line 10
def token
  @token
end

Private Instance Methods

start_stream(camera, dest) click to toggle source
# File lib/arlo/devices.rb, line 130
def start_stream(camera, dest)
  camera_id = camera['deviceId']
  payload = {
    'to': dest,
    'from': 'ArloGem',
    'resource': "cameras/#{camera_id}",
    'action': 'set',
    'publishResponse': true,
    'transId': SecureRandom.uuid,
    'properties': {
      'activityState': 'startUserStream',
      'cameraId': camera_id
    }
  }

  ret_val = post('https://arlo.netgear.com/hmsweb/users/devices/startStream',
       payload, 'xcloudId': camera['xCloudId'])
  JSON.parse(ret_val.body)
end
stop_stream(camera) click to toggle source
# File lib/arlo/devices.rb, line 108
def stop_stream(camera)
  camera_id = camera['deviceId']

  payload = {
      'to': camera_id,
      'from': 'ArloGem',
      'resource': "cameras/#{camera_id}",
      'action': 'set',
      'publishResponse': true,
      'transId': SecureRandom.uuid,
      'properties': {
          'activityState': 'stopUserStream',
          'cameraId': camera_id
      }
  }

  ret_val = post('https://arlo.netgear.com/hmsweb/users/devices/stopStream',
                 payload, 'xcloudId': camera['xCloudId'])

  JSON.parse(ret_val.body)
end