m2x 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -0
- data/lib/m2x.rb +6 -3
- data/lib/m2x/client.rb +37 -2
- data/lib/m2x/collection.rb +32 -0
- data/lib/m2x/device.rb +68 -3
- data/lib/m2x/distribution.rb +2 -0
- data/lib/m2x/job.rb +21 -0
- data/lib/m2x/key.rb +2 -0
- data/lib/m2x/stream.rb +2 -0
- data/lib/m2x/version.rb +1 -1
- metadata +5 -4
- data/lib/megatest.rb +0 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe1dabe03b3a24e0b5136816f19c3f6347a6498a
|
4
|
+
data.tar.gz: 978105c867176fbb810ae6a511112aa637abec58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9160f22d3eb90282ed6ab715aec926ea0297f7405216407aed56c86b7e42c6e9f5762f79d16ced129906515471c200cd0929263390e492ebe2246a1a79e410e3
|
7
|
+
data.tar.gz: 8275e6b70fe22def7e83fa2f90f7f096765fddad39ed5d30f5a1bf858fb6850a9ca8049672179af7127565e0aeacd1af083f9915d70dae4b5fba9609f53e976c
|
data/README.md
CHANGED
@@ -41,6 +41,13 @@ This provides an interface to your data in M2X
|
|
41
41
|
devices = m2x.devices
|
42
42
|
```
|
43
43
|
|
44
|
+
- [Collection](lib/m2x/collection.rb)
|
45
|
+
```ruby
|
46
|
+
collection = m2x.collection("<COLLECTION-ID>")
|
47
|
+
|
48
|
+
collections = m2x.collections
|
49
|
+
```
|
50
|
+
|
44
51
|
- [Key](lib/m2x/key.rb)
|
45
52
|
```ruby
|
46
53
|
key = m2x.key("<KEY-TOKEN>")
|
@@ -48,6 +55,11 @@ This provides an interface to your data in M2X
|
|
48
55
|
keys = m2x.keys
|
49
56
|
```
|
50
57
|
|
58
|
+
- [Job](lib/m2x/job.rb)
|
59
|
+
```ruby
|
60
|
+
job = m2x.job("<JOB-ID>")
|
61
|
+
```
|
62
|
+
|
51
63
|
Refer to the documentation on each class for further usage instructions.
|
52
64
|
|
53
65
|
## Time
|
data/lib/m2x.rb
CHANGED
@@ -3,8 +3,11 @@ module M2X; end
|
|
3
3
|
require_relative "m2x/version"
|
4
4
|
require_relative "m2x/response"
|
5
5
|
require_relative "m2x/client"
|
6
|
-
|
7
|
-
require_relative "m2x/
|
6
|
+
|
7
|
+
require_relative "m2x/collection"
|
8
8
|
require_relative "m2x/device"
|
9
|
-
require_relative "m2x/stream"
|
10
9
|
require_relative "m2x/distribution"
|
10
|
+
require_relative "m2x/job"
|
11
|
+
require_relative "m2x/key"
|
12
|
+
require_relative "m2x/stream"
|
13
|
+
|
data/lib/m2x/client.rb
CHANGED
@@ -37,6 +37,26 @@ class M2X::Client
|
|
37
37
|
get("/status")
|
38
38
|
end
|
39
39
|
|
40
|
+
# Obtain a Collection from M2X
|
41
|
+
#
|
42
|
+
# This method instantiates an instance of Collection and calls `Collection#view`
|
43
|
+
# method, returning the collection instance with all its attributes initialized
|
44
|
+
def collection(id)
|
45
|
+
M2X::Client::Collection.new(self, "id" => id).tap(&:view)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Creates a new collection on M2X with the specified parameters
|
49
|
+
def create_collection(params)
|
50
|
+
M2X::Client::Collection.create!(self, params)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Retrieve the list of collections accessible by the authenticated API key
|
54
|
+
#
|
55
|
+
# See M2X::Client::Collection.list for more details
|
56
|
+
def collections(params={})
|
57
|
+
M2X::Client::Collection.list(self, params)
|
58
|
+
end
|
59
|
+
|
40
60
|
# Obtain a Device from M2X
|
41
61
|
#
|
42
62
|
# This method instantiates an instance of Device and calls `Device#view`
|
@@ -50,14 +70,21 @@ class M2X::Client
|
|
50
70
|
M2X::Client::Device.create!(self, params)
|
51
71
|
end
|
52
72
|
|
53
|
-
# Retrieve the list of devices accessible by the authenticated API key
|
54
|
-
# meet the search criteria.
|
73
|
+
# Retrieve the list of devices accessible by the authenticated API key
|
55
74
|
#
|
56
75
|
# See M2X::Client::Device.list for more details
|
57
76
|
def devices(params={})
|
58
77
|
M2X::Client::Device.list(self, params)
|
59
78
|
end
|
60
79
|
|
80
|
+
# Retrieve the list of devices accessible by the authenticated API key that
|
81
|
+
# meet the search criteria.
|
82
|
+
#
|
83
|
+
# See M2X::Client::Device.search for more details
|
84
|
+
def search_devices(params={})
|
85
|
+
M2X::Client::Device.list(self, params)
|
86
|
+
end
|
87
|
+
|
61
88
|
# Search the catalog of public Devices.
|
62
89
|
#
|
63
90
|
# This allows unauthenticated users to search Devices from other users that
|
@@ -92,6 +119,14 @@ class M2X::Client
|
|
92
119
|
M2X::Client::Distribution.list(self, params)
|
93
120
|
end
|
94
121
|
|
122
|
+
# Obtain a Job from M2X
|
123
|
+
#
|
124
|
+
# This method instantiates an instance of Job and calls `Job#view`
|
125
|
+
# method, returning the job instance with all its attributes initialized
|
126
|
+
def job(id)
|
127
|
+
M2X::Client::Job.new(self, "id" => id).tap(&:view)
|
128
|
+
end
|
129
|
+
|
95
130
|
# Obtain an API Key from M2X
|
96
131
|
#
|
97
132
|
# This method instantiates an instance of Key and calls
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative "./resource"
|
2
|
+
|
3
|
+
# Wrapper for AT&T M2X Collections API
|
4
|
+
# https://m2x.att.com/developer/documentation/v2/collections
|
5
|
+
class M2X::Client::Collection < M2X::Client::Resource
|
6
|
+
|
7
|
+
PATH = "/collections"
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# Retrieve the list of collections accessible by the authenticated API key
|
11
|
+
#
|
12
|
+
# https://m2x.att.com/developer/documentation/v2/collections#List-collections
|
13
|
+
def list(client, params={})
|
14
|
+
res = client.get(PATH, params)
|
15
|
+
|
16
|
+
res.json["collections"].map{ |atts| new(client, atts) } if res.success?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Create a new collection
|
20
|
+
#
|
21
|
+
# https://m2x.att.com/developer/documentation/v2/collections#Create-Collection
|
22
|
+
def create!(client, params)
|
23
|
+
res = client.post(PATH, nil, params, "Content-Type" => "application/json")
|
24
|
+
|
25
|
+
new(client, res.json) if res.success?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def path
|
30
|
+
@path ||= "#{ PATH }/#{ URI.encode(@attributes.fetch("id")) }"
|
31
|
+
end
|
32
|
+
end
|
data/lib/m2x/device.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "./resource"
|
2
|
+
|
1
3
|
# Wrapper for AT&T M2X Device API
|
2
4
|
# https://m2x.att.com/developer/documentation/v2/device
|
3
5
|
class M2X::Client::Device < M2X::Client::Resource
|
@@ -5,16 +7,25 @@ class M2X::Client::Device < M2X::Client::Resource
|
|
5
7
|
PATH = "/devices"
|
6
8
|
|
7
9
|
class << self
|
8
|
-
# Retrieve the list of devices accessible by the authenticated API key
|
9
|
-
# meet the search criteria.
|
10
|
+
# Retrieve the list of devices accessible by the authenticated API key
|
10
11
|
#
|
11
|
-
# https://m2x.att.com/developer/documentation/v2/device#List-
|
12
|
+
# https://m2x.att.com/developer/documentation/v2/device#List-Devices
|
12
13
|
def list(client, params={})
|
13
14
|
res = client.get(PATH, params)
|
14
15
|
|
15
16
|
res.json["devices"].map{ |atts| new(client, atts) } if res.success?
|
16
17
|
end
|
17
18
|
|
19
|
+
# Retrieve the list of devices accessible by the authenticated API key that
|
20
|
+
# meet the search criteria.
|
21
|
+
#
|
22
|
+
# https://m2x.att.com/developer/documentation/v2/device#Search-Devices
|
23
|
+
def search(client, params={})
|
24
|
+
res = client.get("#{PATH}/search", params)
|
25
|
+
|
26
|
+
res.json["devices"].map{ |atts| new(client, atts) } if res.success?
|
27
|
+
end
|
28
|
+
|
18
29
|
# Search the catalog of public Devices.
|
19
30
|
#
|
20
31
|
# This allows unauthenticated users to search Devices from other users
|
@@ -107,6 +118,60 @@ class M2X::Client::Device < M2X::Client::Resource
|
|
107
118
|
@client.post("#{path}/updates", nil, params, "Content-Type" => "application/json")
|
108
119
|
end
|
109
120
|
|
121
|
+
# Post Device Update (Single Value to Multiple Streams)
|
122
|
+
#
|
123
|
+
# This method allows posting a single value to multiple streams
|
124
|
+
# belonging to a device and optionally, the device's location.
|
125
|
+
#
|
126
|
+
# All the streams should be created before posting values using this method.
|
127
|
+
#
|
128
|
+
# The `params` parameter accepts a Hash which can contain the following keys:
|
129
|
+
# - values: A Hash in which the keys are the stream names and the values
|
130
|
+
# hold the stream values.
|
131
|
+
# - location: (optional) A hash with the current location of the specified
|
132
|
+
# device.
|
133
|
+
# - timestamp: (optional) The timestamp for all the passed values and
|
134
|
+
# location. If ommited, the M2X server's time will be used.
|
135
|
+
#
|
136
|
+
# {
|
137
|
+
# values: {
|
138
|
+
# temperature: 30,
|
139
|
+
# humidity: 80
|
140
|
+
# },
|
141
|
+
# location: {
|
142
|
+
# name: "Storage Room",
|
143
|
+
# latitude: -37.9788423562422,
|
144
|
+
# longitude: -57.5478776916862,
|
145
|
+
# elevation: 5
|
146
|
+
# }
|
147
|
+
# }
|
148
|
+
#
|
149
|
+
# https://m2x.att.com/developer/documentation/v2/device#Post-Device-Update--Single-Values-to-Multiple-Streams-
|
150
|
+
def post_update(params)
|
151
|
+
@client.post("#{path}/update", nil, params, "Content-Type" => "application/json")
|
152
|
+
end
|
153
|
+
|
154
|
+
# List Values from all Data Streams of a Device
|
155
|
+
#
|
156
|
+
# https://m2x.att.com/developer/documentation/v2/device#List-Values-from-all-Data-Streams-of-a-Device
|
157
|
+
def values(params = {})
|
158
|
+
@client.get("#{path}/values", params)
|
159
|
+
end
|
160
|
+
|
161
|
+
# Export Values from all Data Streams of a Device
|
162
|
+
#
|
163
|
+
# https://m2x.att.com/developer/documentation/v2/device#Export-Values-from-all-Data-Streams-of-a-Device
|
164
|
+
def values_export(params = {})
|
165
|
+
@client.get("#{path}/values/export.csv", params)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Search Values from all Data Streams of a Device
|
169
|
+
#
|
170
|
+
# https://m2x.att.com/developer/documentation/v2/device#Search-Values-from-all-Data-Streams-of-a-Device
|
171
|
+
def values_search(params)
|
172
|
+
@client.get("#{path}/values/search", nil, params, "Content-Type" => "application/json")
|
173
|
+
end
|
174
|
+
|
110
175
|
# Retrieve list of data streams associated with the device.
|
111
176
|
#
|
112
177
|
# https://m2x.att.com/developer/documentation/v2/device#List-Data-Streams
|
data/lib/m2x/distribution.rb
CHANGED
data/lib/m2x/job.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "./resource"
|
2
|
+
|
3
|
+
# Wrapper for AT&T M2X Job API
|
4
|
+
# https://m2x.att.com/developer/documentation/v2/jobs
|
5
|
+
class M2X::Client::Job < M2X::Client::Resource
|
6
|
+
|
7
|
+
PATH = "/jobs"
|
8
|
+
|
9
|
+
def path
|
10
|
+
@path ||= "#{PATH}/#{ URI.encode(@attributes.fetch("id")) }"
|
11
|
+
end
|
12
|
+
|
13
|
+
# Updating and deleting jobs is not supported by the M2X API
|
14
|
+
def update!(_)
|
15
|
+
fail NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete!
|
19
|
+
fail NotImplementedError
|
20
|
+
end
|
21
|
+
end
|
data/lib/m2x/key.rb
CHANGED
data/lib/m2x/stream.rb
CHANGED
data/lib/m2x/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: m2x
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leandro López
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-08-31 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: AT&T’s M2X is a cloud-based fully managed data storage service for network
|
16
16
|
connected machine-to-machine (M2M) devices. From trucks and turbines to vending
|
@@ -29,14 +29,15 @@ files:
|
|
29
29
|
- lib/m2x.rb
|
30
30
|
- lib/m2x/cacert.pem
|
31
31
|
- lib/m2x/client.rb
|
32
|
+
- lib/m2x/collection.rb
|
32
33
|
- lib/m2x/device.rb
|
33
34
|
- lib/m2x/distribution.rb
|
35
|
+
- lib/m2x/job.rb
|
34
36
|
- lib/m2x/key.rb
|
35
37
|
- lib/m2x/resource.rb
|
36
38
|
- lib/m2x/response.rb
|
37
39
|
- lib/m2x/stream.rb
|
38
40
|
- lib/m2x/version.rb
|
39
|
-
- lib/megatest.rb
|
40
41
|
- m2x.gemspec
|
41
42
|
homepage: http://github.com/attm2x/m2x-ruby
|
42
43
|
licenses:
|
@@ -58,7 +59,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
58
59
|
version: '0'
|
59
60
|
requirements: []
|
60
61
|
rubyforge_project:
|
61
|
-
rubygems_version: 2.4.5
|
62
|
+
rubygems_version: 2.4.5.1
|
62
63
|
signing_key:
|
63
64
|
specification_version: 4
|
64
65
|
summary: Ruby client for AT&T M2X
|
data/lib/megatest.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "time"
|
4
|
-
require "pp"
|
5
|
-
|
6
|
-
require_relative "./m2x"
|
7
|
-
|
8
|
-
$m2x = M2X::Client.new("cdc032a8d7bfbf1ce5948a8c474eaa25", "http://staging-api.m2x.sl.attcompute.com")
|
9
|
-
$running = true
|
10
|
-
|
11
|
-
stop = Proc.new { $running = false }
|
12
|
-
|
13
|
-
trap(:INT, &stop)
|
14
|
-
trap(:TERM, &stop)
|
15
|
-
|
16
|
-
5.times do |i|
|
17
|
-
break unless $running
|
18
|
-
puts "Creating device #{i}"
|
19
|
-
|
20
|
-
device = $m2x.create_device(name: "Test Device #{i}", description: "Some test device", visibility: "private")
|
21
|
-
fail $m2x.last_response.inspect if $m2x.last_response.error?
|
22
|
-
|
23
|
-
device = $m2x.device(device["id"])
|
24
|
-
fail $m2x.last_response.inspect if $m2x.last_response.error?
|
25
|
-
|
26
|
-
device.create_stream("testdevicestream", type: "numeric", unit: { label: "points", symbol: "pt" })
|
27
|
-
fail $m2x.last_response.inspect if $m2x.last_response.error?
|
28
|
-
|
29
|
-
stream = device.stream("testdevicestream")
|
30
|
-
|
31
|
-
values = 2.times.map{ sleep 0.001; { timestamp: Time.now.utc.iso8601(3), value: rand(0..999999) } }
|
32
|
-
|
33
|
-
stream.post_values(values)
|
34
|
-
fail $m2x.last_response.inspect if $m2x.last_response.error?
|
35
|
-
end
|
36
|
-
|
37
|
-
puts "All devices created"
|
38
|
-
|
39
|
-
arduino = $m2x.create_device(name: "My Arduinos", description: "Some test device", visibility: "private")
|
40
|
-
puts arduino.create_stream("temperature")
|
41
|
-
puts arduino.create_stream("humidity")
|
42
|
-
puts arduino.create_stream("loudness")
|
43
|
-
|
44
|
-
arduino.post_updates({
|
45
|
-
values: {
|
46
|
-
temperature: [
|
47
|
-
{ timestamp: (Time.now - 2).iso8601, value: rand(0..37) },
|
48
|
-
{ timestamp: (Time.now + 2).iso8601, value: rand(0..37) }
|
49
|
-
],
|
50
|
-
humidity: [
|
51
|
-
{ timestamp: (Time.now - 3).iso8601, value: rand(0..100) },
|
52
|
-
{ timestamp: (Time.now + 3).iso8601, value: rand(0..100) }
|
53
|
-
]
|
54
|
-
},
|
55
|
-
location: { latitude: 80.3712, longitude: 100, elevation: 300 }
|
56
|
-
})
|
57
|
-
|
58
|
-
loudness = arduino.stream("loudness")
|
59
|
-
|
60
|
-
loudness.post_values(1000.times.map{ |i| { timestamp: (Time.now + i).iso8601, value: rand(0..120) } })
|
61
|
-
|
62
|
-
loudness.update_value(rand(90..9999))
|
63
|
-
|
64
|
-
raspberries = $m2x.create_distribution(name: "Raspberries", description: "Group of raspberries", visibility: "private")
|
65
|
-
|
66
|
-
all_raspberries = 10.times.map{ |i| raspberries.add_device(i.to_s) }
|
67
|
-
|
68
|
-
all_raspberries.each do |device|
|
69
|
-
device.update_location(latitude: rand(-90..90), longitude: rand(-180..180), elevation: rand(0..7000))
|
70
|
-
end
|
71
|
-
|
72
|
-
pp loudness.stats.json
|
73
|
-
pp loudness.sampling(interval: 1).json
|
74
|
-
pp loudness.values.json
|
75
|
-
|
76
|
-
loudness.delete_values!((Time.now - 3600).iso8601, Time.now.iso8601)
|
77
|
-
|
78
|
-
loudness.delete!
|
79
|
-
arduino.delete!
|
80
|
-
raspberries.delete!
|