weathermatic 0.0.7
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 +7 -0
- data/lib/weathermatic.rb +919 -0
- metadata +51 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2e28492ac4f3228ff514d72a5daaefa3253a4dfb
|
4
|
+
data.tar.gz: 1a88898be55a76472491d622afa8c96c05d7e7d0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3f0524b0bc25ae9522167fe7f341446d23fd22cdf4134279676947770295c0156df2e1b1a1828cdad4f4f7f53e0149ca102683f05fe250d45846124c3e598bd5
|
7
|
+
data.tar.gz: 13d3691e6758ff967f094d16fc220289bd5966a07efdaa7e64a11bfb4161315a0fb0ec8b7ae86945525467b8d3971bf015542875df9be5c640ba4c2eb101bb10
|
data/lib/weathermatic.rb
ADDED
@@ -0,0 +1,919 @@
|
|
1
|
+
class WeatherMatic
|
2
|
+
attr_reader :username, :password
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
require 'openssl'
|
6
|
+
require 'json'
|
7
|
+
require 'base64'
|
8
|
+
|
9
|
+
# Usage: wm = WeatherMatic.new(:username => 'YOUR USERNAME', :password => 'YOUR PASSWORD')
|
10
|
+
# Automatically sets the base_uri to staging or production so that we don't have to change it by hand - should only be production for public release.
|
11
|
+
|
12
|
+
def initialize(args)
|
13
|
+
@username = args[:username]
|
14
|
+
@password = args[:password]
|
15
|
+
# @base_uri = "https://my.smartlinknetwork.com"
|
16
|
+
@base_uri = 'http://localhost:3000'
|
17
|
+
end
|
18
|
+
|
19
|
+
# All requests are essentially the same - the purpose of this note is really just to show the basic authorization header for reference
|
20
|
+
# Example Request:
|
21
|
+
# {
|
22
|
+
# "accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"],
|
23
|
+
# "accept"=>["application/json"],
|
24
|
+
# "user-agent"=>["Ruby"],
|
25
|
+
# "content-type"=>["application/json"],
|
26
|
+
# "authorization"=>["Basic thisisnotarealbasicauthorizationstringbuthackitifyoumust=="]
|
27
|
+
# }
|
28
|
+
|
29
|
+
# Usage: wm.sites_list
|
30
|
+
|
31
|
+
# Returns a list of all sites that you have permission to administer. Permissions are set within the SmartLink UI
|
32
|
+
#
|
33
|
+
# Example Response:
|
34
|
+
# {
|
35
|
+
# "meta":{
|
36
|
+
# "access":true,
|
37
|
+
# "hmac":true,
|
38
|
+
# "success":true,
|
39
|
+
# "request":{
|
40
|
+
# "timestamp":"1407355110",
|
41
|
+
# "action":"index",
|
42
|
+
# "controller":"api/v2/sites",
|
43
|
+
# "site":{
|
44
|
+
|
45
|
+
# },
|
46
|
+
# "filters":{
|
47
|
+
|
48
|
+
# }
|
49
|
+
# },
|
50
|
+
# "message":null
|
51
|
+
# },
|
52
|
+
# "total":1,
|
53
|
+
# "total_pages":1,
|
54
|
+
# "page_num":1,
|
55
|
+
# "per_page":50,
|
56
|
+
# "result":{
|
57
|
+
# "sites":[
|
58
|
+
# {
|
59
|
+
# "address1":"3425 Black Canyon",
|
60
|
+
# "address2":"",
|
61
|
+
# "city":"Plano",
|
62
|
+
# "state":"TX",
|
63
|
+
# "contact":"",
|
64
|
+
# "name":"Test Site",
|
65
|
+
# "latitude":"33.084593",
|
66
|
+
# "longitude":"-96.759224",
|
67
|
+
# "id":223,
|
68
|
+
# "site_href":"/sites/223",
|
69
|
+
# "reports_href":"/sites/223/report",
|
70
|
+
# "create_controller_href":"/sites/223/new_controller",
|
71
|
+
# "can_edit":true,
|
72
|
+
# "can_read":true,
|
73
|
+
# "controllers":[
|
74
|
+
# {
|
75
|
+
# "name":"NS Test 1",
|
76
|
+
# "run_status":0,
|
77
|
+
# "id":754,
|
78
|
+
# "location":"Plano, TX",
|
79
|
+
# "activation_status":1,
|
80
|
+
# "controller_href":"/controls/754",
|
81
|
+
# "faults":[
|
82
|
+
# {
|
83
|
+
# "description":"Aircard Communications Error",
|
84
|
+
# "date":"2014-01-16T09:09:50Z",
|
85
|
+
# "id":6746
|
86
|
+
# }
|
87
|
+
# ],
|
88
|
+
# "alerts":[
|
89
|
+
|
90
|
+
# ]
|
91
|
+
# }
|
92
|
+
# ]
|
93
|
+
# }
|
94
|
+
# ]
|
95
|
+
# }
|
96
|
+
# }
|
97
|
+
|
98
|
+
def sites_list
|
99
|
+
uri = parse_uri(@base_uri+"/api/v2/sites?"+add_timestamp)
|
100
|
+
puts uri
|
101
|
+
@request = make_get(uri)
|
102
|
+
make_request(uri,@request)
|
103
|
+
end
|
104
|
+
|
105
|
+
# This turns controllers 684 and 750 'on' - you can get the controller ID out of the list_sites reply. You will only be able to run this command against controllers you own.
|
106
|
+
# Possible commands: remote_on, remote_off, rain_delay (requires :rain_delay => INTEGER param), clear_all_faults, stop_all
|
107
|
+
#
|
108
|
+
# Usage: wm.global_batch_command(:instruction_type => "2", :payload => {"action"=>"remote_on"}, :controllers => ["684","750"])
|
109
|
+
#
|
110
|
+
# Example Response
|
111
|
+
# {
|
112
|
+
# "meta":{
|
113
|
+
# "access":true,
|
114
|
+
# "hmac":true,
|
115
|
+
# "success":true,
|
116
|
+
# "message":null,
|
117
|
+
# "request":{
|
118
|
+
# "instruction_type":"2",
|
119
|
+
# "payload":{
|
120
|
+
# "action":"remote_on"
|
121
|
+
# },
|
122
|
+
# "controllers":[
|
123
|
+
# "699",
|
124
|
+
# "700"
|
125
|
+
# ],
|
126
|
+
# "timestamp":"1407510064",
|
127
|
+
# "action":"create",
|
128
|
+
# "controller":"api/v2/batches",
|
129
|
+
# "batch":{
|
130
|
+
# "instruction_type":"2",
|
131
|
+
# "payload":{
|
132
|
+
# "action":"remote_on"
|
133
|
+
# },
|
134
|
+
# "controllers":[
|
135
|
+
# "699",
|
136
|
+
# "700"
|
137
|
+
# ],
|
138
|
+
# "timestamp":"1407510064"
|
139
|
+
# }
|
140
|
+
# }
|
141
|
+
# },
|
142
|
+
# "result":{
|
143
|
+
# "user":{
|
144
|
+
# "id":205,
|
145
|
+
# "name":"Tyler Merritt",
|
146
|
+
# "email":"tyler.merritt@weathermatic.com"
|
147
|
+
# },
|
148
|
+
# "affected":[
|
149
|
+
# {
|
150
|
+
# "global_batch_id":47,
|
151
|
+
# "controller_id":699,
|
152
|
+
# "instruction_id":109,
|
153
|
+
# "action":null,
|
154
|
+
# "description":null
|
155
|
+
# },
|
156
|
+
# {
|
157
|
+
# "global_batch_id":47,
|
158
|
+
# "controller_id":700,
|
159
|
+
# "instruction_id":110,
|
160
|
+
# "action":null,
|
161
|
+
# "description":null
|
162
|
+
# }
|
163
|
+
# ],
|
164
|
+
# "instructions":[
|
165
|
+
# {
|
166
|
+
# "id":109,
|
167
|
+
# "type_common_name":"Command",
|
168
|
+
# "exception":null,
|
169
|
+
# "is_overnight":false,
|
170
|
+
# "status_id":1,
|
171
|
+
# "action":"Remote On",
|
172
|
+
# "user":"Tyler Merritt",
|
173
|
+
# "status":"Queued",
|
174
|
+
# "started_at":null,
|
175
|
+
# "ended_at":null,
|
176
|
+
# "delay_run_time":null,
|
177
|
+
# "controller":{
|
178
|
+
# "modem_version":"0.18",
|
179
|
+
# "created_at":"2013-02-15T18:08:29Z",
|
180
|
+
# "id":699,
|
181
|
+
# "name":"Super Roamer",
|
182
|
+
# "controller_href":"/controls/699"
|
183
|
+
# }
|
184
|
+
# },
|
185
|
+
# {
|
186
|
+
# "id":110,
|
187
|
+
# "type_common_name":"Command",
|
188
|
+
# "exception":null,
|
189
|
+
# "is_overnight":false,
|
190
|
+
# "status_id":1,
|
191
|
+
# "action":"Remote On",
|
192
|
+
# "user":"Tyler Merritt",
|
193
|
+
# "status":"Queued",
|
194
|
+
# "started_at":null,
|
195
|
+
# "ended_at":null,
|
196
|
+
# "delay_run_time":null,
|
197
|
+
# "controller":{
|
198
|
+
# "modem_version":"0.18",
|
199
|
+
# "created_at":"2013-02-15T22:19:19Z",
|
200
|
+
# "id":700,
|
201
|
+
# "name":"TMOB",
|
202
|
+
# "controller_href":"/controls/700"
|
203
|
+
# }
|
204
|
+
# }
|
205
|
+
# ]
|
206
|
+
# }
|
207
|
+
# }
|
208
|
+
|
209
|
+
def global_batch_command(params)
|
210
|
+
uri = parse_uri(@base_uri+"/api/v2/batches")
|
211
|
+
@request = make_post(uri)
|
212
|
+
if params[:payload]['action'] == "rain_delay"
|
213
|
+
params_hash = ({"instruction_type" => params[:instruction_type], "payload" => params[:payload], "controllers" => params[:controllers], "rain_delay" => params[:rain_delay], "timestamp" => Time.now.to_i.to_s}).to_json
|
214
|
+
else
|
215
|
+
params_hash = ({"instruction_type" => params[:instruction_type], "payload" => params[:payload], "controllers" => params[:controllers], "timestamp" => Time.now.to_i.to_s}).to_json
|
216
|
+
end
|
217
|
+
@request.body = params_hash
|
218
|
+
make_request(uri,@request)
|
219
|
+
end
|
220
|
+
|
221
|
+
# Gathers zone information about a single controller. Params are ":id => 'value'" where $value is a string
|
222
|
+
|
223
|
+
# Usage : wm.controller_zones(:id => '684')
|
224
|
+
|
225
|
+
# Example response:
|
226
|
+
# {
|
227
|
+
# "meta":{
|
228
|
+
# "access":true,
|
229
|
+
# "success":true,
|
230
|
+
# "hmac": "pass",
|
231
|
+
# "request":{
|
232
|
+
# "timestamp":"1407357310",
|
233
|
+
# "format":"json",
|
234
|
+
# "action":"index",
|
235
|
+
# "controller":"api/v2/zones",
|
236
|
+
# "id":"699",
|
237
|
+
# "zone":{
|
238
|
+
|
239
|
+
# }
|
240
|
+
# },
|
241
|
+
# "message":null
|
242
|
+
# },
|
243
|
+
# "result":{
|
244
|
+
# "zone":[
|
245
|
+
# {
|
246
|
+
# "id":38265,
|
247
|
+
# "number":1,
|
248
|
+
# "description":null,
|
249
|
+
# "sprinkler_type":2,
|
250
|
+
# "plant_type":3,
|
251
|
+
# "soil_type":1,
|
252
|
+
# "soil_slope":0,
|
253
|
+
# "adjustment":0,
|
254
|
+
# "created_at":"2012-01-03T22:18:28Z",
|
255
|
+
# "updated_at":"2012-01-05T21:51:09Z",
|
256
|
+
# "controller_id":699,
|
257
|
+
# "plant_type_definition_type":null,
|
258
|
+
# "sprinkler_type_definition_type":"index",
|
259
|
+
# "ignore_rain":false,
|
260
|
+
# "ignore_freeze":false,
|
261
|
+
# "ignore_sensor":false,
|
262
|
+
# "gpm":null,
|
263
|
+
# "valve_size":"0.0",
|
264
|
+
# "mv_enabled":null,
|
265
|
+
# "realtime_flow_enabled":false,
|
266
|
+
# "high_flow_limit":65535,
|
267
|
+
# "low_flow_limit":0,
|
268
|
+
# "current_seconds_ran":0,
|
269
|
+
# "running_average_reset_date":null,
|
270
|
+
# "current_average_flow":0,
|
271
|
+
# "ppg":null
|
272
|
+
# },
|
273
|
+
# {
|
274
|
+
# "id":38266,
|
275
|
+
# "number":2,
|
276
|
+
# "description":null,
|
277
|
+
# "sprinkler_type":2,
|
278
|
+
# "plant_type":3,
|
279
|
+
# "soil_type":1,
|
280
|
+
# "soil_slope":0,
|
281
|
+
# "adjustment":10,
|
282
|
+
# "created_at":"2012-01-03T22:18:28Z",
|
283
|
+
# "updated_at":"2012-01-05T21:51:09Z",
|
284
|
+
# "controller_id":699,
|
285
|
+
# "plant_type_definition_type":null,
|
286
|
+
# "sprinkler_type_definition_type":"index",
|
287
|
+
# "ignore_rain":false,
|
288
|
+
# "ignore_freeze":false,
|
289
|
+
# "ignore_sensor":false,
|
290
|
+
# "gpm":null,
|
291
|
+
# "valve_size":"0.0",
|
292
|
+
# "mv_enabled":null,
|
293
|
+
# "realtime_flow_enabled":false,
|
294
|
+
# "high_flow_limit":65535,
|
295
|
+
# "low_flow_limit":0,
|
296
|
+
# "current_seconds_ran":0,
|
297
|
+
# "running_average_reset_date":null,
|
298
|
+
# "current_average_flow":0,
|
299
|
+
# "ppg":null
|
300
|
+
# }
|
301
|
+
# ]
|
302
|
+
# }
|
303
|
+
# }
|
304
|
+
|
305
|
+
def controller_zones(params)
|
306
|
+
uri = parse_uri(@base_uri+"/api/v2/controllers/"+params[:id].to_s+"/zones?"+add_timestamp)
|
307
|
+
@request = make_get(uri)
|
308
|
+
make_request(uri,@request)
|
309
|
+
end
|
310
|
+
|
311
|
+
# Example -
|
312
|
+
# params[:id] = The ID of the controller you want to manually run as a STRING
|
313
|
+
# params[:run_action] = "start" <-- must be explicitly passed
|
314
|
+
# params[:program] = INTEGER. Valid options are 1, 2, 3, or 4 corresponding to the programs on the controller
|
315
|
+
# params[:zone] = INTEGER. 1-64. If you send a zone that does not exist, you will get an error
|
316
|
+
# params[:run_time] = INTEGER in minutes. 0-60 will run zones for $this number of minutes. 61+ will run in 5 minute increments. Example - passing 62 will run for 70 minutes (60 minutes in single-minute intervals, 2 in two 5-minute increments or 10. 60 + 10 = 70)
|
317
|
+
# params[:valve_zone] = INTEGER. 1-64. If you send a valve zone that does not exist, you will get an error
|
318
|
+
|
319
|
+
# Usage: wm.controller_manual_run(:run_action => "start", :zone => 1, :id => "699")
|
320
|
+
|
321
|
+
# Example Response:
|
322
|
+
# {
|
323
|
+
# "meta":{
|
324
|
+
# "access":true,
|
325
|
+
# "hmac":{
|
326
|
+
# "pass":true
|
327
|
+
# },
|
328
|
+
# "success":true,
|
329
|
+
# "request":{
|
330
|
+
# "run_action":"start",
|
331
|
+
# "program":null,
|
332
|
+
# "zone":1,
|
333
|
+
# "run_time":null,
|
334
|
+
# "valve_zone":null,
|
335
|
+
# "timestamp":"1407353317",
|
336
|
+
# "format":"json",
|
337
|
+
# "action":"manual_run",
|
338
|
+
# "controller":{
|
339
|
+
|
340
|
+
# },
|
341
|
+
# "id":"700"
|
342
|
+
# },
|
343
|
+
# "message":null
|
344
|
+
# },
|
345
|
+
# "result":{
|
346
|
+
# "instruction":{
|
347
|
+
# "id":16,
|
348
|
+
# "type_common_name":"Command",
|
349
|
+
# "exception":null,
|
350
|
+
# "is_overnight":false,
|
351
|
+
# "status_id":1,
|
352
|
+
# "action":"Manual Run ( minutes)",
|
353
|
+
# "user":"Tyler Merritt",
|
354
|
+
# "status":"Queued",
|
355
|
+
# "started_at":null,
|
356
|
+
# "ended_at":null,
|
357
|
+
# "delay_run_time":null,
|
358
|
+
# "controller":{
|
359
|
+
# "modem_version":"0.18",
|
360
|
+
# "created_at":"2013-02-15T22:19:19Z",
|
361
|
+
# "id":700,
|
362
|
+
# "name":"TMOB",
|
363
|
+
# "controller_href":"/controls/700"
|
364
|
+
# }
|
365
|
+
# }
|
366
|
+
# }
|
367
|
+
# }
|
368
|
+
|
369
|
+
def controller_manual_run(params)
|
370
|
+
uri = parse_uri(@base_uri+"/api/v2/controllers/"+params[:id].to_s+"/manual_run.json")
|
371
|
+
@request = make_post(uri)
|
372
|
+
@request.body = ({
|
373
|
+
"run_action" => params[:run_action],
|
374
|
+
"program" => params[:program],
|
375
|
+
"zone" => params[:zone],
|
376
|
+
"run_time" => params[:run_time],
|
377
|
+
"valve_zone" => params[:valve_zone],
|
378
|
+
"timestamp" => Time.now.to_i.to_s
|
379
|
+
}).to_json
|
380
|
+
make_request(uri,@request)
|
381
|
+
end
|
382
|
+
|
383
|
+
# Returns information about your user account
|
384
|
+
|
385
|
+
# Usage: wm.me
|
386
|
+
|
387
|
+
# Example Response:
|
388
|
+
# {
|
389
|
+
# "meta":{
|
390
|
+
# "access":true,
|
391
|
+
# "hmac":true,
|
392
|
+
# "success":true,
|
393
|
+
# "request":{
|
394
|
+
# "timestamp":"1407352539",
|
395
|
+
# "action":"me",
|
396
|
+
# "controller":"api/v2/users",
|
397
|
+
# "user":{
|
398
|
+
|
399
|
+
# }
|
400
|
+
# },
|
401
|
+
# "message":null
|
402
|
+
# },
|
403
|
+
# "result":{
|
404
|
+
# "user":{
|
405
|
+
# "id":205,
|
406
|
+
# "email":"tyler.merritt@weathermatic.com",
|
407
|
+
# "first_name":"Tyler",
|
408
|
+
# "last_name":"Merritt",
|
409
|
+
# "address_1":"3301 W Kingsley Rd.",
|
410
|
+
# "address_2":"",
|
411
|
+
# "city":"Garland",
|
412
|
+
# "company":"",
|
413
|
+
# "phone_1":null,
|
414
|
+
# "phone_2":null,
|
415
|
+
# "phone_3":null,
|
416
|
+
# "postal":"75041",
|
417
|
+
# "province":"Texas",
|
418
|
+
# "temp_units":"f"
|
419
|
+
# }
|
420
|
+
# }
|
421
|
+
# }
|
422
|
+
|
423
|
+
def me
|
424
|
+
uri = parse_uri(@base_uri+"/api/v2/users/me?"+add_timestamp)
|
425
|
+
@request = make_get(uri)
|
426
|
+
make_request(uri,@request)
|
427
|
+
end
|
428
|
+
|
429
|
+
# Example
|
430
|
+
# params[:range_start] should be passed as 'YYYY-MM-DD' as the start date (on and after) you would like a usage report from
|
431
|
+
# params[:range_end] should be passed as 'YYYY-MM-DD' as the end date (on and before) you would like the usage report from
|
432
|
+
# params[:interval] *optional* w = Weekly Intervals, m = Monthly Intervals, y = Yearly Intervals. SUM of the usage by Interval passed
|
433
|
+
# params[:controller_id] *optional* pass a specific controller ID or an array of controller IDs with the request to get controller usage instead of entire SITE usage
|
434
|
+
# params[:zone_number] *optional* pass a specific zone number with the request to get zone usage instead of entire SITE usage (DEPENDS ON A SINGLE CONTROLLER ALSO BEING PASSED)
|
435
|
+
|
436
|
+
# Usage: wm.site_usage(:site_id => 157, :controller_id => [794,750], :range_start => "2014-06-01", :range_end => "2014-07-25", :interval => 'w' )
|
437
|
+
|
438
|
+
# Example Response: (all units are in gallons for this site)
|
439
|
+
# {
|
440
|
+
# "meta":{
|
441
|
+
# "access":true,
|
442
|
+
# "hmac":true,
|
443
|
+
# "success":true,
|
444
|
+
# "request":{
|
445
|
+
# "range_start":"2014-06-01",
|
446
|
+
# "range_end":"2014-07-25",
|
447
|
+
# "interval":"w",
|
448
|
+
# "controller_id":[
|
449
|
+
# "794",
|
450
|
+
# "750"
|
451
|
+
# ],
|
452
|
+
# "zone_number":null,
|
453
|
+
# "timestamp":"1407506612",
|
454
|
+
# "action":"usage",
|
455
|
+
# "controller":"api/v2/reports_sites",
|
456
|
+
# "id":"157",
|
457
|
+
# "format":"json",
|
458
|
+
# "reports_site":{
|
459
|
+
|
460
|
+
# }
|
461
|
+
# },
|
462
|
+
# "message":null
|
463
|
+
# },
|
464
|
+
# "result":{
|
465
|
+
# "site":{
|
466
|
+
# "id":157,
|
467
|
+
# "name":"Engineering Dept",
|
468
|
+
# "controllers":[
|
469
|
+
# {
|
470
|
+
# "id":750,
|
471
|
+
# "name":"Andey's",
|
472
|
+
# "usage":[
|
473
|
+
# {
|
474
|
+
# "gallons":1512,
|
475
|
+
# "date":"2014-06-02"
|
476
|
+
# },
|
477
|
+
# {
|
478
|
+
# "gallons":1454,
|
479
|
+
# "date":"2014-06-09"
|
480
|
+
# },
|
481
|
+
# {
|
482
|
+
# "gallons":1240,
|
483
|
+
# "date":"2014-06-16"
|
484
|
+
# },
|
485
|
+
# {
|
486
|
+
# "gallons":1620,
|
487
|
+
# "date":"2014-06-23"
|
488
|
+
# },
|
489
|
+
# {
|
490
|
+
# "gallons":1582,
|
491
|
+
# "date":"2014-06-30"
|
492
|
+
# },
|
493
|
+
# {
|
494
|
+
# "gallons":1217,
|
495
|
+
# "date":"2014-07-07"
|
496
|
+
# },
|
497
|
+
# {
|
498
|
+
# "gallons":1357,
|
499
|
+
# "date":"2014-07-14"
|
500
|
+
# },
|
501
|
+
# {
|
502
|
+
# "gallons":454,
|
503
|
+
# "date":"2014-07-21"
|
504
|
+
# }
|
505
|
+
# ]
|
506
|
+
# },
|
507
|
+
# {
|
508
|
+
# "id":794,
|
509
|
+
# "name":"Plan-Id Test - 1 year basic",
|
510
|
+
# "usage":[
|
511
|
+
# {
|
512
|
+
# "gallons":8306,
|
513
|
+
# "date":"2014-06-02"
|
514
|
+
# },
|
515
|
+
# {
|
516
|
+
# "gallons":9015,
|
517
|
+
# "date":"2014-06-09"
|
518
|
+
# },
|
519
|
+
# {
|
520
|
+
# "gallons":8068,
|
521
|
+
# "date":"2014-06-16"
|
522
|
+
# },
|
523
|
+
# {
|
524
|
+
# "gallons":8564,
|
525
|
+
# "date":"2014-06-23"
|
526
|
+
# },
|
527
|
+
# {
|
528
|
+
# "gallons":8693,
|
529
|
+
# "date":"2014-06-30"
|
530
|
+
# },
|
531
|
+
# {
|
532
|
+
# "gallons":7871,
|
533
|
+
# "date":"2014-07-07"
|
534
|
+
# },
|
535
|
+
# {
|
536
|
+
# "gallons":5892,
|
537
|
+
# "date":"2014-07-14"
|
538
|
+
# },
|
539
|
+
# {
|
540
|
+
# "gallons":949,
|
541
|
+
# "date":"2014-07-21"
|
542
|
+
# }
|
543
|
+
# ]
|
544
|
+
# }
|
545
|
+
# ]
|
546
|
+
# }
|
547
|
+
# }
|
548
|
+
# }
|
549
|
+
|
550
|
+
def site_usage(params)
|
551
|
+
data = URI.encode_www_form({
|
552
|
+
"range_start" => params[:range_start],
|
553
|
+
"range_end" => params[:range_end],
|
554
|
+
"interval" => params[:interval],
|
555
|
+
"controller_id[]" => params[:controller_id],
|
556
|
+
"zone_number" => params[:zone_number],
|
557
|
+
"timestamp" => Time.now.to_i.to_s
|
558
|
+
})
|
559
|
+
uri = parse_uri(@base_uri+"/api/v2/reports/sites/"+params[:site_id].to_s+"/usage.json?" + data)
|
560
|
+
@request = make_get(uri)
|
561
|
+
make_request(uri,@request)
|
562
|
+
end
|
563
|
+
|
564
|
+
# Example
|
565
|
+
# params[:site_id] should be the integer value of the site for which you would like weather data
|
566
|
+
# params[:range_start] should be passed as 'YYYY-MM-DD' as the start date (on and after) you would like a usage report from
|
567
|
+
# params[:range_end] should be passed as 'YYYY-MM-DD' as the end date (on and before) you would like the usage report from
|
568
|
+
# params[:interval] *optional* w = Weekly Intervals, m = Monthly Intervals, y = Yearly Intervals. AVERAGE of the usage by Interval passed
|
569
|
+
# params[:controller_id] *optional* pass a specific controller ID or an array of controller IDs with the request to get controller usage instead of entire SITE usage
|
570
|
+
|
571
|
+
# Usage wm.site_weather(:site_id => 157, :controller_id => [699,700], :range_start => "2014-01-01", :range_end => "2014-03-30", :interval => 'w')
|
572
|
+
|
573
|
+
# {
|
574
|
+
# "meta":{
|
575
|
+
# "access":true,
|
576
|
+
# "hmac":true,
|
577
|
+
# "success":true,
|
578
|
+
# "message":nil,
|
579
|
+
# "request":{
|
580
|
+
# "range_start":"2014-01-01",
|
581
|
+
# "range_end":"2014-03-30",
|
582
|
+
# "interval":"w",
|
583
|
+
# "controller_id":[
|
584
|
+
# "699",
|
585
|
+
# "700"
|
586
|
+
# ],
|
587
|
+
# "timestamp":"1407274155",
|
588
|
+
# "action":"weather",
|
589
|
+
# "controller":"api/v2/reports_sites",
|
590
|
+
# "id":"157",
|
591
|
+
# "format":"json",
|
592
|
+
# "reports_site":{
|
593
|
+
|
594
|
+
# }
|
595
|
+
# }
|
596
|
+
# },
|
597
|
+
# "result":{
|
598
|
+
# "site":{
|
599
|
+
# "id":157,
|
600
|
+
# "name":"Engineering Dept",
|
601
|
+
# "controllers":[
|
602
|
+
# {
|
603
|
+
# "id":699,
|
604
|
+
# "name":"My Controller",
|
605
|
+
# "location":"Desk",
|
606
|
+
# "weather":[
|
607
|
+
# {
|
608
|
+
# "date":"2014-01-01",
|
609
|
+
# "high":0,
|
610
|
+
# "low":-2
|
611
|
+
# },
|
612
|
+
# {
|
613
|
+
# "date":"2014-01-05",
|
614
|
+
# "high":17,
|
615
|
+
# "low":-3
|
616
|
+
# },
|
617
|
+
# {
|
618
|
+
# "date":"2014-01-12",
|
619
|
+
# "high":20,
|
620
|
+
# "low":9
|
621
|
+
# }
|
622
|
+
# ]
|
623
|
+
# },
|
624
|
+
# {
|
625
|
+
# "id":700,
|
626
|
+
# "name":"Another Controller",
|
627
|
+
# "location":"Other Desk",
|
628
|
+
# "weather":[
|
629
|
+
# {
|
630
|
+
# "date":"2014-01-01",
|
631
|
+
# "high":19,
|
632
|
+
# "low":16
|
633
|
+
# },
|
634
|
+
# {
|
635
|
+
# "date":"2014-01-05",
|
636
|
+
# "high":22,
|
637
|
+
# "low":22
|
638
|
+
# },
|
639
|
+
# {
|
640
|
+
# "date":"2014-01-12",
|
641
|
+
# "high":22,
|
642
|
+
# "low":21
|
643
|
+
# }
|
644
|
+
# ]
|
645
|
+
# }
|
646
|
+
# ]
|
647
|
+
# }
|
648
|
+
# }
|
649
|
+
# }
|
650
|
+
|
651
|
+
def site_weather(params)
|
652
|
+
data = URI.encode_www_form({
|
653
|
+
"range_start" => params[:range_start],
|
654
|
+
"range_end" => params[:range_end],
|
655
|
+
"interval" => params[:interval],
|
656
|
+
"controller_id[]" => params[:controller_id],
|
657
|
+
"timestamp" => Time.now.to_i.to_s
|
658
|
+
})
|
659
|
+
uri = parse_uri(@base_uri+"/api/v2/reports/sites/"+params[:site_id].to_s+"/weather.json?"+data)
|
660
|
+
@request = make_get(uri)
|
661
|
+
make_request(uri,@request)
|
662
|
+
end
|
663
|
+
|
664
|
+
# Example
|
665
|
+
# params[:range_start] should be passed as 'YYYY-MM-DD' as the start date (on and after) you would like a usage report from
|
666
|
+
# params[:range_end] should be passed as 'YYYY-MM-DD' as the end date (on and before) you would like the usage report from
|
667
|
+
# params[:interval] *optional* w = Weekly Intervals, m = Monthly Intervals, y = Yearly Intervals. SUM of the usage by Interval passed
|
668
|
+
# params[:controller_id] *optional* pass a specific controller ID or an array of controller IDs with the request to get controller usage instead of entire SITE usage
|
669
|
+
# params[:zone_number] *optional* pass a specific zone number or an array of zone numbers with the request to get zone usage instead of entire SITE usage (DEPENDS ON SINGLE CONTROLLER ID ALSO BEING PASSED)
|
670
|
+
|
671
|
+
# Usage wm.site_events(:site_id => 157, :controller_id => [699,700], :zone_number => [1,2], :range_start => "2013-12-01", :range_end => "2013-12-30")
|
672
|
+
# This also works: wm.site_events(:site_id => 157, :controller_id => [699], :range_start => "2013-12-01", :range_end => "2013-12-05")
|
673
|
+
|
674
|
+
# {
|
675
|
+
# "meta":{
|
676
|
+
# "access":true,
|
677
|
+
# "hmac":true,
|
678
|
+
# "success":true,
|
679
|
+
# "request":{
|
680
|
+
# "range_start":"2013-12-01",
|
681
|
+
# "range_end":"2013-12-30",
|
682
|
+
# "interval":null,
|
683
|
+
# "controller_id":[
|
684
|
+
# "699",
|
685
|
+
# "700"
|
686
|
+
# ],
|
687
|
+
# "zone_number":[
|
688
|
+
# "1",
|
689
|
+
# "2"
|
690
|
+
# ],
|
691
|
+
# "timestamp":"1407505556",
|
692
|
+
# "action":"events",
|
693
|
+
# "controller":"api/v2/reports_sites",
|
694
|
+
# "id":"157",
|
695
|
+
# "format":"json",
|
696
|
+
# "reports_site":{
|
697
|
+
|
698
|
+
# }
|
699
|
+
# },
|
700
|
+
# "message":null
|
701
|
+
# },
|
702
|
+
# "result":{
|
703
|
+
# "site":{
|
704
|
+
# "id":157,
|
705
|
+
# "name":"Engineering Dept",
|
706
|
+
# "controllers":[
|
707
|
+
# {
|
708
|
+
# "id":699,
|
709
|
+
# "name":"Super Roamer",
|
710
|
+
# "zones":[
|
711
|
+
# {
|
712
|
+
# "zone_number":1,
|
713
|
+
# "name":null,
|
714
|
+
# "events":[
|
715
|
+
# {
|
716
|
+
# "id":5800,
|
717
|
+
# "date":"2013-12-18T15:38:13Z",
|
718
|
+
# "status":1,
|
719
|
+
# "created_at":"2013-12-18T15:38:13Z",
|
720
|
+
# "updated_at":"2014-08-08T13:45:08Z",
|
721
|
+
# "description":"Changed From None to Normal",
|
722
|
+
# "event_type":699,
|
723
|
+
# "is_fault":10
|
724
|
+
# },
|
725
|
+
# {
|
726
|
+
# "id":6014,
|
727
|
+
# "date":"2013-12-25T09:13:16Z",
|
728
|
+
# "status":1,
|
729
|
+
# "created_at":"2013-12-25T09:13:16Z",
|
730
|
+
# "updated_at":"2014-08-08T13:45:10Z",
|
731
|
+
# "description":"Changed From Freeze to Normal",
|
732
|
+
# "event_type":699,
|
733
|
+
# "is_fault":10
|
734
|
+
# }
|
735
|
+
# ]
|
736
|
+
# },
|
737
|
+
# {
|
738
|
+
# "zone_number":2,
|
739
|
+
# "name":null,
|
740
|
+
# "events":[
|
741
|
+
# {
|
742
|
+
# "id":5956,
|
743
|
+
# "date":"2013-12-23T09:25:14Z",
|
744
|
+
# "status":1,
|
745
|
+
# "created_at":"2013-12-23T09:25:14Z",
|
746
|
+
# "updated_at":"2014-08-08T13:45:09Z",
|
747
|
+
# "description":"Changed From Normal to Freeze",
|
748
|
+
# "event_type":699,
|
749
|
+
# "is_fault":10
|
750
|
+
# },
|
751
|
+
# {
|
752
|
+
# "id":6161,
|
753
|
+
# "date":"2013-12-30T11:13:09Z",
|
754
|
+
# "status":1,
|
755
|
+
# "created_at":"2013-12-30T11:13:09Z",
|
756
|
+
# "updated_at":"2014-08-08T13:45:11Z",
|
757
|
+
# "description":"Changed From Normal to Freeze",
|
758
|
+
# "event_type":699,
|
759
|
+
# "is_fault":10
|
760
|
+
# }
|
761
|
+
# ]
|
762
|
+
# }
|
763
|
+
# ]
|
764
|
+
# },
|
765
|
+
# {
|
766
|
+
# "id":700,
|
767
|
+
# "name":"TMOB",
|
768
|
+
# "zones":[
|
769
|
+
# {
|
770
|
+
# "zone_number":1,
|
771
|
+
# "name":null,
|
772
|
+
# "events":[
|
773
|
+
# {
|
774
|
+
# "id":1,
|
775
|
+
# "date":"2013-12-18T15:38:13Z",
|
776
|
+
# "status":0,
|
777
|
+
# "created_at":"2013-12-18T15:38:13Z",
|
778
|
+
# "updated_at":"2014-08-08T13:44:42Z",
|
779
|
+
# "description":"Changed Could not establish connection to Zone 4",
|
780
|
+
# "event_type":700,
|
781
|
+
# "is_fault":null
|
782
|
+
# },
|
783
|
+
# {
|
784
|
+
# "id":2,
|
785
|
+
# "date":"2013-12-18T16:38:13Z",
|
786
|
+
# "status":0,
|
787
|
+
# "created_at":"2013-12-18T16:38:13Z",
|
788
|
+
# "updated_at":"2014-08-08T13:44:42Z",
|
789
|
+
# "description":"Changed Could not establish connection to Zone 4",
|
790
|
+
# "event_type":700,
|
791
|
+
# "is_fault":null
|
792
|
+
# },
|
793
|
+
# {
|
794
|
+
# "id":3,
|
795
|
+
# "date":"2013-12-18T17:38:13Z",
|
796
|
+
# "status":0,
|
797
|
+
# "created_at":"2013-12-18T17:38:13Z",
|
798
|
+
# "updated_at":"2014-08-08T13:44:42Z",
|
799
|
+
# "description":"Changed Could not establish connection to Zone 4",
|
800
|
+
# "event_type":700,
|
801
|
+
# "is_fault":null
|
802
|
+
# }
|
803
|
+
# ]
|
804
|
+
# },
|
805
|
+
# {
|
806
|
+
# "zone_number":2,
|
807
|
+
# "name":null,
|
808
|
+
# "events":[
|
809
|
+
# {
|
810
|
+
# "id":4,
|
811
|
+
# "date":"2013-12-18T18:38:13Z",
|
812
|
+
# "status":1,
|
813
|
+
# "created_at":"2013-12-18T18:38:13Z",
|
814
|
+
# "updated_at":"2014-08-08T13:44:42Z",
|
815
|
+
# "description":"Changed Could not establish connection to Zone 4",
|
816
|
+
# "event_type":700,
|
817
|
+
# "is_fault":null
|
818
|
+
# },
|
819
|
+
# {
|
820
|
+
# "id":5,
|
821
|
+
# "date":"2013-12-18T19:38:13Z",
|
822
|
+
# "status":0,
|
823
|
+
# "created_at":"2013-12-18T19:38:13Z",
|
824
|
+
# "updated_at":"2014-08-08T13:44:42Z",
|
825
|
+
# "description":"Changed Could not establish connection to Zone 4",
|
826
|
+
# "event_type":700,
|
827
|
+
# "is_fault":null
|
828
|
+
# },
|
829
|
+
# {
|
830
|
+
# "id":6,
|
831
|
+
# "date":"2013-12-18T20:38:13Z",
|
832
|
+
# "status":1,
|
833
|
+
# "created_at":"2013-12-18T20:38:13Z",
|
834
|
+
# "updated_at":"2014-08-08T13:44:42Z",
|
835
|
+
# "description":"Changed Could not establish connection to Zone 4",
|
836
|
+
# "event_type":700,
|
837
|
+
# "is_fault":null
|
838
|
+
# }
|
839
|
+
# ]
|
840
|
+
# }
|
841
|
+
# ]
|
842
|
+
# }
|
843
|
+
# ]
|
844
|
+
# }
|
845
|
+
# }
|
846
|
+
# }
|
847
|
+
|
848
|
+
def site_events(params)
|
849
|
+
data = URI.encode_www_form({
|
850
|
+
"range_start" => params[:range_start],
|
851
|
+
"range_end" => params[:range_end],
|
852
|
+
"interval" => params[:interval],
|
853
|
+
"controller_id[]" => params[:controller_id],
|
854
|
+
"zone_number[]" => params[:zone_number],
|
855
|
+
"timestamp" => Time.now.to_i.to_s
|
856
|
+
})
|
857
|
+
uri = parse_uri(@base_uri+"/api/v2/reports/sites/"+params[:site_id].to_s+"/events.json?"+data)
|
858
|
+
@request = make_get(uri)
|
859
|
+
make_request(uri,@request)
|
860
|
+
end
|
861
|
+
|
862
|
+
|
863
|
+
private
|
864
|
+
|
865
|
+
# This is the generic request - it cannot be called directly
|
866
|
+
def make_request(uri,request)
|
867
|
+
@http = Net::HTTP.new(uri.host, uri.port)
|
868
|
+
# @http.use_ssl = true
|
869
|
+
# @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
870
|
+
@request = request
|
871
|
+
data = @request.method.eql?('GET') ? uri.query : @request.body
|
872
|
+
@request["Accept"] = "application/json"
|
873
|
+
@request["Content-Type"] = "application/json"
|
874
|
+
@request['x-api-hmac'] = generate_hmac_string(data)
|
875
|
+
@request["x-api-key"] = api_key
|
876
|
+
@request.basic_auth(username,password)
|
877
|
+
# puts "request headers are " + @request.to_hash.to_s
|
878
|
+
# puts "request body is " + @request.body.inspect
|
879
|
+
response = @http.request(@request)
|
880
|
+
return JSON.parse(response.body)
|
881
|
+
# puts JSON.parse(response.body)
|
882
|
+
end
|
883
|
+
|
884
|
+
def parse_uri(uri)
|
885
|
+
URI.parse(uri)
|
886
|
+
end
|
887
|
+
|
888
|
+
def generate_hmac_string(data)
|
889
|
+
key = secret_api_key
|
890
|
+
digest = OpenSSL::Digest.new('sha256')
|
891
|
+
hmac = OpenSSL::HMAC.digest(digest, key, data)
|
892
|
+
hmac = Base64.encode64(hmac).strip()
|
893
|
+
return hmac
|
894
|
+
end
|
895
|
+
|
896
|
+
def api_key
|
897
|
+
# ENV['SLN_API_KEY']
|
898
|
+
'998174b6f911b8e95db1c15d1ac59c4f' # This should be an environment variable for best security - this is not a production key
|
899
|
+
end
|
900
|
+
|
901
|
+
def secret_api_key
|
902
|
+
# ENV['SLN_API_SECRET_KEY']
|
903
|
+
# '245aa67451c534803dc93e7953ff40b6' # This should be an environment variable for best security - this is not a production key
|
904
|
+
'245aa67451c534803dc93e7953ffffff'
|
905
|
+
end
|
906
|
+
|
907
|
+
def make_get(uri)
|
908
|
+
Net::HTTP::Get.new(uri.request_uri)
|
909
|
+
end
|
910
|
+
|
911
|
+
def make_post(uri)
|
912
|
+
Net::HTTP::Post.new(uri.request_uri)
|
913
|
+
end
|
914
|
+
|
915
|
+
def add_timestamp
|
916
|
+
'timestamp='+Time.now.to_i.to_s
|
917
|
+
end
|
918
|
+
|
919
|
+
end
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: weathermatic
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.7
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tyler Merritt
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: SmartLink provides a web portal which connects SmartLine controllers
|
14
|
+
in the field to the cloud allowing basic operations like starting or stopping irrigation
|
15
|
+
for a specific zone on a specified controller. All controllers which belong to
|
16
|
+
a customer account can be managed via the web portal, iOS and Android applications,
|
17
|
+
or this API. The current version is v2 of the API. You must have a developer key
|
18
|
+
in order to use this version.
|
19
|
+
email:
|
20
|
+
- tyler.merritt@weathermatic.com
|
21
|
+
executables: []
|
22
|
+
extensions: []
|
23
|
+
extra_rdoc_files: []
|
24
|
+
files:
|
25
|
+
- lib/weathermatic.rb
|
26
|
+
homepage: http://www.smartlinknetwork.com/
|
27
|
+
licenses:
|
28
|
+
- MIT
|
29
|
+
metadata: {}
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 2.2.2
|
47
|
+
signing_key:
|
48
|
+
specification_version: 4
|
49
|
+
summary: An API wrapper in Ruby for interfacing with the SmartLink Network site at
|
50
|
+
my.smartlinknetwork.com
|
51
|
+
test_files: []
|