lib/cs/relation/sensor_relation.rb
module CS
module Relation
# Class that used to query List of sensor data from CS.
#
# == parameters
# The relation object has serveral parameter
#
# * page : Integer, number of page in pagination. starts from 0
# * per_page : Integer, number of sensor per page, default 1000, max: 1000
# * shared : Boolean, filter only sensor that is shared.
# * onwed : Boolean, filter only sensor that user own.
# * physical : Boolean, filter only physical sensor (sensor that connected to device).
# * details : String "no" or "full", gives full description of sensor
#
# == Examples
# This is an example how would you use the sensors relation object
#
# === Create Sensors Relation
#
# client = CS::Client.new
# client.login('user', 'password')
# session = client.session
#
# # create sensors relation
# sensors = client.sensors
#
# # is the same as
# sensors = CS::Relation::Sensors.new
# sensors.session = session
#
# === Get all sensor
#
# sensors = client.sensors
# sensors.to_a
#
# === Get sensor by specifying parameters
#
# client.sensors.where(page: 0, per_page: 1000)
# client.sensors.where(owned: true)
# client.sensors.where(physical: true)
# client.sensors.where(page: 0, per_page: 1000, physical: true, owned: true, details: "full")
#
# === Chain parameters
#
# client.sensors.where(page:0, per_page: 10).where(physical: true)
#
# === Find sensor by name
#
# client.sensors.find_by_name(/position/)
# client.sensors.find_by_name(/position/, owned: true) # or
# client.sensors.where(owned: true).find_by_name(/position/)
#
# === Get first sensor or last sensor
#
# sensor = client.sensors.first
# sensor = client.sensors.last
#
# === Get number of sensors
#
# client.sensors.count
# client.sensors.where(owned: true).count
class SensorRelation
include Relation
parameter :page, Integer, default: 0, required: true
parameter :per_page, Integer, default: 1000, required: true, maximum: 1000
parameter :shared, Boolean
parameter :owned, Boolean
parameter :physical, Boolean
parameter :details, String, valid_values: ["no", "full"]
parameter :group_id, String
# Find {EndPoint::Sensor Sensor} by id
#
# example:
#
# sensor = client.sensors.find("1")
def find!(id)
check_session!
sensor = EndPoint::Sensor.new(id: id)
sensor.session = self.session
sensor.retrieve! ? sensor : false
end
def find(id)
find!(id) rescue false
end
# Find sensor by name in regular expression.
# The second argument is parameter that is usualy us in {#where where}
#
# example:
#
# client.sensors.find_by_name(/position/, owned: true)
def find_by_name(regex, parameters={})
check_session!
self.where(parameters)
regex = /\A#{regex}\z/ if regex.kind_of?(String)
self.select { |sensor| sensor.name =~ regex }
end
def triggers()
Relation::SensorTriggersRelation.new(@session)
end
# Create new sensor with properties from other sensor
#
# example :
#
# client.sensors.clone_from(client.sensors.find(123))
def clone_from(other_sensor)
sensor = EndPoint::Sensor.new(other_sensor.to_cs_value)
sensor.id = nil
sensor.session = self.session
sensor
end
private
def resource_class
EndPoint::Sensor
end
def get_url
"/sensors.json"
end
end
class SensorTriggersRelation
include Relation
parameter :page, Integer, default: 0, required: true
def get_url
"/sensors/triggers.json"
end
end
end
end