foscam-ruby 0.0.2 → 0.0.3
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 +8 -8
- data/.travis.yml +2 -0
- data/README.md +4 -1
- data/Rakefile +2 -1
- data/lib/foscam-ruby.rb +1 -0
- data/lib/foscam/client.rb +450 -22
- data/lib/foscam/version.rb +2 -1
- data/spec/fixtures/vcr/foscam_get_params.yml +1 -1
- data/spec/spec_helper.rb +13 -6
- metadata +2 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTM1YTU4NzIxZDQ1OTVhM2M5NWRhMDczZmFmY2ZlNDJkMjlkM2Q4Zg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MGRiZTRmZWQyZDk2ODg1YWJlOTVhZTBiNGU5ZjQ5MWUyZjc2Yjg0NQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTIzN2ZiYTFhODg4NzE0YjZiNGU2MjQ2ODljNTNjNTQ1ZjdkYTUyY2RhNmJj
|
10
|
+
YzQyOWZmNjcyZjU4MjkwZGEyYmNkYWNjOTUxY2I3ODk2YTM2NjU4ZGIyYmE5
|
11
|
+
NWNhZGRjZDQ5YmM1N2Y1NWIzYmY3YmEzZjNiZmExYjdjZDQ5ZWU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2UxMTgxNmVlNTgyMzM3YWYwYzIxYzRhNTJlYTQ5MTA4MWQ5ZWNkZmVjYTZj
|
14
|
+
MjlmZTJlMzU1OGFkYmI4ZmNiMmVkNThkYjdlNmY0Y2Q3NmZlMTBiNTMyMDBk
|
15
|
+
ZGU3MWE3NjdiM2RkZjhkNmMyN2E0Yzc5MDgyZWU2NmVkY2VlNmE=
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# Foscam::Ruby
|
2
|
+
[](http://badge.fury.io/rb/foscam-ruby)
|
3
|
+
[](https://travis-ci.org/cwadding/foscam-ruby)
|
4
|
+
[](https://codeclimate.com/github/cwadding/foscam-ruby)
|
2
5
|
|
3
|
-
A client library written in ruby to communicate to your [foscam webcam](http://www.
|
6
|
+
A client library written in ruby to communicate to your [foscam webcam](http://www.amazon.com/gp/product/B006ZP8UOW/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B006ZP8UOW&linkCode=as2&tag=foscamruby-20) using the [foscam SDK](http://site.usajumping.com/Download/ipcam_cgi_sdk.pdf).
|
4
7
|
|
5
8
|
## Installation
|
6
9
|
|
data/Rakefile
CHANGED
data/lib/foscam-ruby.rb
CHANGED
data/lib/foscam/client.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Foscam
|
2
2
|
|
3
|
+
# DDNS_STATUS
|
3
4
|
DDNS_STATUS = {
|
4
5
|
0 => "No Action",
|
5
6
|
1 => "It's connecting...",
|
@@ -21,6 +22,7 @@ module Foscam
|
|
21
22
|
17 => "Oray Succeed"
|
22
23
|
}
|
23
24
|
|
25
|
+
# UPNP_STATUS
|
24
26
|
UPNP_STATUS = {
|
25
27
|
0 => "No Action",
|
26
28
|
1 => "Succeed",
|
@@ -30,19 +32,24 @@ module Foscam
|
|
30
32
|
5 => "Rejected by UPnP Device, Maybe Port Conflict"
|
31
33
|
}
|
32
34
|
|
35
|
+
# ALARM_STATUS
|
33
36
|
ALARM_STATUS = {
|
34
37
|
0 => "No alarm",
|
35
38
|
1 => "Motion alarm",
|
36
39
|
2 => "Input Alarm"
|
37
40
|
}
|
38
41
|
|
42
|
+
# CAMERA_PARAMS_MODE
|
39
43
|
CAMERA_PARAMS_MODE = {
|
40
44
|
0 => "50hz",
|
41
45
|
1 => "60hz",
|
42
46
|
2 => "outdoor"
|
43
47
|
}
|
48
|
+
|
49
|
+
# CAMERA_CONTROL_MODE
|
44
50
|
CAMERA_CONTROL_MODE = CAMERA_PARAMS_MODE.inject({}){|memo,(k,v)| memo[v.to_sym] = k; memo}
|
45
51
|
|
52
|
+
# CAMERA_PARAMS_ORIENTATION
|
46
53
|
CAMERA_PARAMS_ORIENTATION = {
|
47
54
|
0 => "default",
|
48
55
|
1 => "flip",
|
@@ -50,15 +57,19 @@ module Foscam
|
|
50
57
|
3 => "flip+mirror"
|
51
58
|
}
|
52
59
|
|
60
|
+
# CAMERA_CONTROL_ORIENTATION
|
53
61
|
CAMERA_CONTROL_ORIENTATION = CAMERA_PARAMS_ORIENTATION.inject({}){|memo,(k,v)| memo[v.to_sym] = k; memo}
|
54
62
|
|
63
|
+
# CAMERA_PARAMS_RESOLUTION
|
55
64
|
CAMERA_PARAMS_RESOLUTION = {
|
56
65
|
8 => "qvga",
|
57
66
|
32 => "vga"
|
58
67
|
}
|
59
68
|
|
69
|
+
# CAMERA_CONTROL_RESOLUTION
|
60
70
|
CAMERA_CONTROL_RESOLUTION = CAMERA_PARAMS_RESOLUTION.inject({}){|memo,(k,v)| memo[v.to_sym] = k; memo}
|
61
71
|
|
72
|
+
# CAMERA_CONTROLS
|
62
73
|
CAMERA_CONTROLS = {
|
63
74
|
:resolution => 0,
|
64
75
|
:brightness => 1,
|
@@ -67,6 +78,7 @@ module Foscam
|
|
67
78
|
:flip => 5
|
68
79
|
}
|
69
80
|
|
81
|
+
# DECODER_CONTROLS
|
70
82
|
DECODER_CONTROLS = {
|
71
83
|
:up => 0,
|
72
84
|
:stop => 1,
|
@@ -86,26 +98,35 @@ module Foscam
|
|
86
98
|
:io_output_low => 95,
|
87
99
|
}
|
88
100
|
|
101
|
+
# USER_PERMISSIONS
|
89
102
|
USER_PERMISSIONS = {
|
90
103
|
0 => :visitor,
|
91
104
|
1 => :operator,
|
92
105
|
2 => :administrator
|
93
106
|
}
|
94
107
|
|
108
|
+
# PTZ_AUTO_PATROL_TYPE
|
95
109
|
PTZ_AUTO_PATROL_TYPE = {
|
96
110
|
0 => :none,
|
97
111
|
1 => :horizontal,
|
98
112
|
2 => :vertical,
|
99
113
|
3 => :"horizontal+vertical"
|
100
114
|
}
|
115
|
+
|
116
|
+
# PTZ_AUTO_PATROL_TYPE_ID
|
101
117
|
PTZ_AUTO_PATROL_TYPE_ID = PTZ_AUTO_PATROL_TYPE.invert
|
102
118
|
|
119
|
+
# LED_MODE
|
103
120
|
LED_MODE = {
|
104
121
|
0 => :mode1,
|
105
122
|
1 => :mode2,
|
106
123
|
2 => :disabled
|
107
124
|
}
|
125
|
+
|
126
|
+
# LED_MODE_ID
|
108
127
|
LED_MODE_ID = LED_MODE.invert
|
128
|
+
|
129
|
+
# DECODER_BAUD
|
109
130
|
DECODER_BAUD = {
|
110
131
|
9 => :B1200,
|
111
132
|
11 => :B2400,
|
@@ -116,13 +137,26 @@ module Foscam
|
|
116
137
|
4097 => :B57600,
|
117
138
|
4098 => :B115200
|
118
139
|
}
|
119
|
-
|
140
|
+
# DECODER_BAUD_ID
|
120
141
|
DECODER_BAUD_ID = DECODER_BAUD.invert
|
121
142
|
|
122
|
-
|
143
|
+
# TODO: put in some documentation for this class
|
123
144
|
class Client
|
124
145
|
|
125
|
-
|
146
|
+
|
147
|
+
# @!attribute [rw] url
|
148
|
+
# @return [String] the url to the camera
|
149
|
+
attr_accessor :url
|
150
|
+
# @!attribute [rw] username
|
151
|
+
# @return [String] The username for authentication to the camera
|
152
|
+
attr_accessor :username
|
153
|
+
# @!attribute [rw] password
|
154
|
+
# @return [String] The password for authentication to the camera
|
155
|
+
attr_accessor :password
|
156
|
+
|
157
|
+
# @!attribute [rw] connection
|
158
|
+
# @return [Faraday] The HTTP connection object to the camera
|
159
|
+
attr_accessor :connection
|
126
160
|
|
127
161
|
def initialize(args = {})
|
128
162
|
@url = args.delete(:url)
|
@@ -131,6 +165,15 @@ module Foscam
|
|
131
165
|
connect(@url, @username, @password)
|
132
166
|
end
|
133
167
|
|
168
|
+
##
|
169
|
+
# Connects to the foscam webcam
|
170
|
+
|
171
|
+
# @param url [String] The address to your camera
|
172
|
+
# @param username [String] username to authorize with the camera
|
173
|
+
# @param password [String] password to authorize with the camera
|
174
|
+
# @example connect to a camera
|
175
|
+
# client = Foscam::Client.new
|
176
|
+
# client.connect('http://192.168.0.1', 'foobar', 'secret')
|
134
177
|
def connect(url, username = nil, password = nil)
|
135
178
|
@url = url
|
136
179
|
@username = username
|
@@ -139,11 +182,30 @@ module Foscam
|
|
139
182
|
@connection.basic_auth(@username, @password) unless @username.nil? && @password.nil?
|
140
183
|
end
|
141
184
|
|
185
|
+
##
|
186
|
+
# Obtains a snapshot of the current image
|
187
|
+
# @return [nil, ::MiniMagick::Image]
|
188
|
+
# @example Save a captured image
|
189
|
+
# client = Foscam::Client.new(url: 'http://192.168.0.1', username: 'foobar', password: 'secret')
|
190
|
+
# image = client.snapshot
|
191
|
+
# unless image.nil?
|
192
|
+
# image.write('image_filename.jpg')
|
193
|
+
# end
|
142
194
|
def snapshot
|
143
195
|
response = @connection.get('snapshot.cgi')
|
144
196
|
response.success? ? ::MiniMagick::Image.read(response.body) : nil
|
145
197
|
end
|
146
198
|
|
199
|
+
##
|
200
|
+
# Obtains the cameras status information
|
201
|
+
# @see DDNS_STATUS
|
202
|
+
# @see UPNP_STATUS
|
203
|
+
# @see ALARM_STATUS
|
204
|
+
# @return [Hash] The cameras status
|
205
|
+
# * :now (DateTime) The current time on the camera
|
206
|
+
# * :alarm_status (String) Returns an Alarm status
|
207
|
+
# * :ddns_status (String) Returns an UPNP status
|
208
|
+
# * :upnp_status (String) Returns an DDNS status
|
147
209
|
def get_status
|
148
210
|
response = @connection.get('get_status.cgi')
|
149
211
|
response = response.success? ? parse_response(response) : {}
|
@@ -151,11 +213,23 @@ module Foscam
|
|
151
213
|
response[:ddns_status] = DDNS_STATUS[response[:ddns_status].to_i]
|
152
214
|
response[:upnp_status] = UPNP_STATUS[response[:upnp_status].to_i]
|
153
215
|
response[:alarm_status] = ALARM_STATUS[response[:alarm_status].to_i]
|
154
|
-
response[:now] = DateTime.strptime(response[:now],'%s')
|
216
|
+
response[:now] = ::DateTime.strptime(response[:now],'%s')
|
155
217
|
end
|
156
218
|
response
|
157
219
|
end
|
158
220
|
|
221
|
+
|
222
|
+
##
|
223
|
+
# Obtains the cameras parameters (orientation, resolution, contrast, brightness)
|
224
|
+
# @see CAMERA_PARAMS_ORIENTATION
|
225
|
+
# @see CAMERA_PARAMS_MODE
|
226
|
+
# @see CAMERA_PARAMS_RESOLUTION
|
227
|
+
# @return [Hash] The cameras parameters
|
228
|
+
# * :flip (String) The camera orientation.
|
229
|
+
# * :mode (String) The camera mode.
|
230
|
+
# * :resolution (String) The camera resolution.
|
231
|
+
# * :brightness (Fixnum) The camera brightness.
|
232
|
+
# * :contrast (Fixnum) The camera contrast.
|
159
233
|
def get_camera_params
|
160
234
|
response = @connection.get('get_camera_params.cgi')
|
161
235
|
response = response.success? ? parse_response(response) : {}
|
@@ -168,6 +242,11 @@ module Foscam
|
|
168
242
|
response
|
169
243
|
end
|
170
244
|
|
245
|
+
##
|
246
|
+
# Controls the pan and tilt of the camera
|
247
|
+
# @see DECODER_CONTROLS
|
248
|
+
# @param action [Symbol] A symbol corresponding to the desired action.
|
249
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
171
250
|
def decoder_control(action)
|
172
251
|
case action
|
173
252
|
when Symbol || String
|
@@ -179,6 +258,18 @@ module Foscam
|
|
179
258
|
response.success?
|
180
259
|
end
|
181
260
|
|
261
|
+
##
|
262
|
+
# Sets the camera sensor parameters
|
263
|
+
# @see CAMERA_CONTROL_MODE
|
264
|
+
# @see CAMERA_CONTROL_ORIENTATION
|
265
|
+
# @see CAMERA_PARAMS_RESOLUTION
|
266
|
+
# @param [Hash] params Parameters to set
|
267
|
+
# @option params [Symbol,String] :resolution Set to one of the keys or values in CAMERA_PARAMS_RESOLUTION
|
268
|
+
# @option params [Fixnum] :brightness Value between 0 and 255
|
269
|
+
# @option params [Fixnum] :contrast Value between 0 and 6
|
270
|
+
# @option params [Symbol, Integer] :mode Value between 0 and 2 or option in CAMERA_CONTROL_MODE
|
271
|
+
# @option params [Symbol, Integer] :flip Value between 0 and 3 or option in CAMERA_CONTROL_ORIENTATION
|
272
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
182
273
|
def camera_control(params)
|
183
274
|
params.all? do |key, value|
|
184
275
|
# validation
|
@@ -230,39 +321,197 @@ module Foscam
|
|
230
321
|
end
|
231
322
|
end
|
232
323
|
|
324
|
+
##
|
325
|
+
# Reboots the camera
|
326
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
233
327
|
def reboot
|
234
328
|
response = @connection.get("reboot.cgi")
|
235
329
|
response.success?
|
236
330
|
end
|
237
331
|
|
332
|
+
##
|
333
|
+
# Restore settings to the factory defaults
|
334
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
238
335
|
def restore_factory
|
239
336
|
response = @connection.get("restore_factory.cgi")
|
240
337
|
response.success?
|
241
338
|
end
|
242
339
|
|
340
|
+
##
|
341
|
+
# Returns all the parameters for the camera
|
342
|
+
# @return [Hash] If the request is unsuccessful the hash will be empty. Otherwise it contains the following fields:
|
343
|
+
# * :id (String) The device id.
|
344
|
+
# * :sys_ver (String) Firmware version number.
|
345
|
+
# * :resolution (String) Web UI version number.
|
346
|
+
# * :alias (String) The assigned camera name.
|
347
|
+
# * :now (DateTime) The camera's time.
|
348
|
+
# * :tz (String) The camera time zone.
|
349
|
+
# * :ntp_enable (FalseClass, TrueClass) Whether the ntp server is enabled.
|
350
|
+
# * :ntp_svr (String) Address to the ntp server.
|
351
|
+
# * :user1_name (String) Username of user1.
|
352
|
+
# * :user1_pwd (String) Password of user1.
|
353
|
+
# * :user1_pri (String) Privilages of user1.
|
354
|
+
# * ...
|
355
|
+
# * :user8_name (String) Username of user8.
|
356
|
+
# * :user8_pwd (String) Password of user8.
|
357
|
+
# * :user8_pri (String) Privilages of user8.
|
358
|
+
# * :dev2_alias (String) The 2nd Device alias
|
359
|
+
# * :dev2_host (String) The 2nd Device host(IP or Domain name)
|
360
|
+
# * :dev2_port (String) The 2nd Device port.
|
361
|
+
# * :dev2_user (String) The 2nd Device user name .
|
362
|
+
# * :dev2_pwd (String) The 2nd Device password.
|
363
|
+
# * ...
|
364
|
+
# * :dev9_alias (String) The 9th Device alias
|
365
|
+
# * :dev9_host (String) The 9th Device host(IP or Domain name)
|
366
|
+
# * :dev9_port (Fixnum) The 9th Device port.
|
367
|
+
# * :dev9_user (String) The 9th Device user name .
|
368
|
+
# * :dev9_pwd (String) The 9th Device password.
|
369
|
+
# * :ip_address (String) The network ip address of the camera.
|
370
|
+
# * :mask (String) The network mask of the camera.
|
371
|
+
# * :gateway (String) The network gateway of the camera.
|
372
|
+
# * :dns (String) The address of the dns server.
|
373
|
+
# * :port (Fixnum) The network port.
|
374
|
+
# * :wifi_enable (FalseClass, TrueClass) Whether wifi is enabled or not.
|
375
|
+
# * :wifi_ssid (String) Your WIFI SSID
|
376
|
+
# * :wifi_encrypt (FalseClass, TrueClass) Whether wifi is encrypted or not.
|
377
|
+
# * :wifi_defkey (String) Wep Default TX Key
|
378
|
+
# * :wifi_key1 (String) Key1
|
379
|
+
# * :wifi_key2 (String) Key2
|
380
|
+
# * :wifi_key3 (String) Key3
|
381
|
+
# * :wifi_key4 (String) Key4
|
382
|
+
# * :wifi_autht (String) ype The Authetication type 0:open 1:share
|
383
|
+
# * :wifi_keyfo (String) rmat Keyformat 0:Hex 1:ASCII
|
384
|
+
# * :wifi_key1_bits (String) 0:64 bits; 1:128 bits
|
385
|
+
# * :wifi_key2_bits (String) 0:64 bits; 1:128 bits
|
386
|
+
# * :wifi_key3_bits (String) 0:64 bits; 1:128 bits
|
387
|
+
# * :wifi_key4_bits (String) 0:64 bits; 1:128 bits
|
388
|
+
# * :wifi_channel (String) Channel (default 6)
|
389
|
+
# * :wifi_mode (String) Mode (default 0)
|
390
|
+
# * :wifi_wpa_psk (String) wpa_psk
|
391
|
+
# * :pppoe_enable (FalseClass, TrueClass)
|
392
|
+
# * :pppoe_user (String)
|
393
|
+
# * :pppoe_pwd (String)
|
394
|
+
# * :upnp_enable (FalseClass, TrueClass)
|
395
|
+
# * :ddns_service (String)
|
396
|
+
# * :ddns_user (String)
|
397
|
+
# * :ddns_pwd (String)
|
398
|
+
# * :ddns_host (String)
|
399
|
+
# * :ddns_proxy_svr (String)
|
400
|
+
# * :ddns_proxy_port (Fixnum)
|
401
|
+
# * :mail_svr (String)
|
402
|
+
# * :mail_port (Fixnum)
|
403
|
+
# * :mail_tls (String)
|
404
|
+
# * :mail_user (String)
|
405
|
+
# * :mail_pwd (String)
|
406
|
+
# * :mail_sender (String)
|
407
|
+
# * :mail_receiver1 (String)
|
408
|
+
# * :mail_receiver2 (String)
|
409
|
+
# * :mail_receiver3 (String)
|
410
|
+
# * :mail_receiver4 (String)
|
411
|
+
# * :mail_inet_ip (String)
|
412
|
+
# * :ftp_svr (String)
|
413
|
+
# * :ftp_port (String)
|
414
|
+
# * :ftp_user (String)
|
415
|
+
# * :ftp_pwd (String)
|
416
|
+
# * :ftp_dir (String)
|
417
|
+
# * :ftp_mode (String)
|
418
|
+
# * :ftp_upload_interval (String)
|
419
|
+
# * :ftp_filename (String)
|
420
|
+
# * :ftp_numberoffiles (Fixnum)
|
421
|
+
# * :ftp_schedule_enable (FalseClass, TrueClass)
|
422
|
+
# * :ftp_schedule_sun_0 (Fixnum)
|
423
|
+
# * :ftp_schedule_sun_1 (Fixnum)
|
424
|
+
# * :ftp_schedule_sun_2 (Fixnum)
|
425
|
+
# * :ftp_schedule_mon_0 (Fixnum)
|
426
|
+
# * :ftp_schedule_mon_1 (Fixnum)
|
427
|
+
# * :ftp_schedule_mon_2 (Fixnum)
|
428
|
+
# * :ftp_schedule_tue_0 (Fixnum)
|
429
|
+
# * :ftp_schedule_tue_1 (Fixnum)
|
430
|
+
# * :ftp_schedule_tue_2 (Fixnum)
|
431
|
+
# * :ftp_schedule_wed_0 (Fixnum)
|
432
|
+
# * :ftp_schedule_wed_1 (Fixnum)
|
433
|
+
# * :ftp_schedule_wed_2 (Fixnum)
|
434
|
+
# * :ftp_schedule_thu_0 (Fixnum)
|
435
|
+
# * :ftp_schedule_thu_1 (Fixnum)
|
436
|
+
# * :ftp_schedule_thu_2 (Fixnum)
|
437
|
+
# * :ftp_schedule_fri_0 (Fixnum)
|
438
|
+
# * :ftp_schedule_fri_1 (Fixnum)
|
439
|
+
# * :ftp_schedule_fri_2 (Fixnum)
|
440
|
+
# * :ftp_schedule_sat_0 (Fixnum)
|
441
|
+
# * :ftp_schedule_sat_1 (Fixnum)
|
442
|
+
# * :ftp_schedule_sat_2 (Fixnum)
|
443
|
+
# * :alarm_motion_armed (FalseClass, TrueClass)
|
444
|
+
# * :alarm_motion_sensitivity (Fixnum)
|
445
|
+
# * :alarm_motion_compensation (Fixnum)
|
446
|
+
# * :alarm_input_armed (FalseClass, TrueClass]
|
447
|
+
# * :alarm_ioin_level (Fixnum)
|
448
|
+
# * :alarm_iolinkage (Fixnum)
|
449
|
+
# * :alarm_preset (Fixnum)
|
450
|
+
# * :alarm_ioout_level (Fixnum)
|
451
|
+
# * :alarm_mail (FalseClass, TrueClass)
|
452
|
+
# * :alarm_upload_interval (Fixnum)
|
453
|
+
# * :alarm_http (FalseClass, TrueClass)
|
454
|
+
# * :alarm_msn (FalseClass, TrueClass)
|
455
|
+
# * :alarm_http_url (String)
|
456
|
+
# * :alarm_schedule_enable (FalseClass, TrueClass)
|
457
|
+
# * :alarm_schedule_sun_0 (Fixnum)
|
458
|
+
# * :alarm_schedule_sun_1 (Fixnum)
|
459
|
+
# * :alarm_schedule_sun_2 (Fixnum)
|
460
|
+
# * :alarm_schedule_mon_0 (Fixnum)
|
461
|
+
# * :alarm_schedule_mon_1 (Fixnum)
|
462
|
+
# * :alarm_schedule_mon_2 (Fixnum)
|
463
|
+
# * :alarm_schedule_tue_0 (Fixnum)
|
464
|
+
# * :alarm_schedule_tue_1 (Fixnum)
|
465
|
+
# * :alarm_schedule_tue_2 (Fixnum)
|
466
|
+
# * :alarm_schedule_wed_0 (Fixnum)
|
467
|
+
# * :alarm_schedule_wed_1 (Fixnum)
|
468
|
+
# * :alarm_schedule_wed_2 (Fixnum)
|
469
|
+
# * :alarm_schedule_thu_0 (Fixnum)
|
470
|
+
# * :alarm_schedule_thu_1 (Fixnum)
|
471
|
+
# * :alarm_schedule_thu_2 (Fixnum)
|
472
|
+
# * :alarm_schedule_fri_0 (Fixnum)
|
473
|
+
# * :alarm_schedule_fri_1 (Fixnum)
|
474
|
+
# * :alarm_schedule_fri_2 (Fixnum)
|
475
|
+
# * :alarm_schedule_sat_0 (Fixnum)
|
476
|
+
# * :alarm_schedule_sat_1 (Fixnum)
|
477
|
+
# * :alarm_schedule_sat_2 (Fixnum)
|
478
|
+
# * :decoder_baud (Fixnum)
|
479
|
+
# * :msn_user (String)
|
480
|
+
# * :msn_pwd (String)
|
481
|
+
# * :msn_friend1 (String)
|
482
|
+
# * :msn_friend2 (String)
|
483
|
+
# * :msn_friend3 (String)
|
484
|
+
# * :msn_friend4 (String)
|
485
|
+
# * :msn_friend5 (String)
|
486
|
+
# * :msn_friend6 (String)
|
487
|
+
# * :msn_friend7 (String)
|
488
|
+
# * :msn_friend8 (String)
|
489
|
+
# * :msn_friend9 (String)
|
490
|
+
# * :msn_friend10 (String)
|
243
491
|
def get_params
|
244
492
|
response = @connection.get("get_params.cgi")
|
245
493
|
response = response.success? ? parse_response(response) : {}
|
246
494
|
unless response.empty?
|
247
|
-
response[:now] = DateTime.strptime(response[:now],'%s')
|
495
|
+
response[:now] = ::DateTime.strptime(response[:now],'%s')
|
248
496
|
[:ntp_enable, :wifi_enable, :pppoe_enable, :upnp_enable, :alarm_schedule_enable, :ftp_schedule_enable].each do |field|
|
249
497
|
response[field] = response[field].to_i > 0
|
250
498
|
end
|
251
|
-
[
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
499
|
+
[
|
500
|
+
:ftp_schedule_sun_0, :ftp_schedule_sun_1, :ftp_schedule_sun_2,
|
501
|
+
:ftp_schedule_mon_0, :ftp_schedule_mon_1, :ftp_schedule_mon_2,
|
502
|
+
:ftp_schedule_tue_0, :ftp_schedule_tue_1, :ftp_schedule_tue_2,
|
503
|
+
:ftp_schedule_wed_0, :ftp_schedule_wed_1, :ftp_schedule_wed_2,
|
504
|
+
:ftp_schedule_thu_0, :ftp_schedule_thu_1, :ftp_schedule_thu_2,
|
505
|
+
:ftp_schedule_fri_0, :ftp_schedule_fri_1, :ftp_schedule_fri_2,
|
506
|
+
:ftp_schedule_sat_0, :ftp_schedule_sat_1, :ftp_schedule_sat_2,
|
507
|
+
:alarm_schedule_sun_0, :alarm_schedule_sun_1, :alarm_schedule_sun_2,
|
508
|
+
:alarm_schedule_mon_0, :alarm_schedule_mon_1, :alarm_schedule_mon_2,
|
509
|
+
:alarm_schedule_tue_0, :alarm_schedule_tue_1, :alarm_schedule_tue_2,
|
510
|
+
:alarm_schedule_wed_0, :alarm_schedule_wed_1, :alarm_schedule_wed_2,
|
511
|
+
:alarm_schedule_thu_0, :alarm_schedule_thu_1, :alarm_schedule_thu_2,
|
512
|
+
:alarm_schedule_fri_0, :alarm_schedule_fri_1, :alarm_schedule_fri_2,
|
513
|
+
:alarm_schedule_sat_0, :alarm_schedule_sat_1, :alarm_schedule_sat_2,
|
514
|
+
:daylight_savings_time, :ddns_proxy_port, :ftp_port, :mail_port, :port, :dev2_port, :dev3_port, :dev4_port, :dev5_port, :dev6_port, :dev7_port, :dev8_port, :dev9_port].each do |field|
|
266
515
|
response[field] = response[field].to_i
|
267
516
|
end
|
268
517
|
[:user1_pri, :user2_pri, :user3_pri, :user4_pri, :user5_pri, :user6_pri, :user7_pri, :user8_pri].each do |key|
|
@@ -272,20 +521,35 @@ module Foscam
|
|
272
521
|
response
|
273
522
|
end
|
274
523
|
|
524
|
+
##
|
525
|
+
# Upgrade the camera firmware
|
526
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
275
527
|
def upgrade_firmware
|
276
528
|
response = @connection.post("upgrade_firmware.cgi")
|
277
529
|
end
|
278
530
|
|
531
|
+
##
|
532
|
+
# Upgrade the cameras html pages.
|
533
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
279
534
|
def upgrade_htmls
|
280
535
|
response = @connection.post("upgrade_htmls.cgi")
|
281
536
|
end
|
282
537
|
|
538
|
+
|
539
|
+
##
|
540
|
+
# Set the name of the camera
|
541
|
+
# @param [String] name The name of the camera which is 20 characters or less.
|
542
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
283
543
|
def set_alias(name)
|
284
544
|
throw "invalid parameter value" if name.length > 20
|
285
545
|
response = @connection.get("set_alias.cgi?alias=#{name}")
|
286
546
|
response.success?
|
287
547
|
end
|
288
548
|
|
549
|
+
##
|
550
|
+
# Set the datetime of the camera
|
551
|
+
# @param [Hash] params
|
552
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
289
553
|
def set_datetime(params)
|
290
554
|
# Extract the time zone
|
291
555
|
throw "invalid parameter value" if params.has_key?(:ntp_svr) && params[:ntp_svr].length > 64
|
@@ -293,6 +557,10 @@ module Foscam
|
|
293
557
|
response.success?
|
294
558
|
end
|
295
559
|
|
560
|
+
##
|
561
|
+
# Set usernames, passwords and privilages
|
562
|
+
# @param [Hash] params
|
563
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
296
564
|
def set_users(params)
|
297
565
|
[:user1, :pwd1, :user2, :pwd2, :user3, :pwd3, :user4, :pwd4, :user5, :pwd5, :user6, :pwd6, :user7, :pwd7, :user8, :pwd8].each do |key|
|
298
566
|
throw "invalid parameter value" if params.has_key?(key) && params[key].length > 12
|
@@ -305,16 +573,34 @@ module Foscam
|
|
305
573
|
# response = @connection.get("set_devices.cgi?#{params.to_query}")
|
306
574
|
# end
|
307
575
|
|
576
|
+
##
|
577
|
+
# Set usernames, passwords and privilages
|
578
|
+
# @param [Hash] params
|
579
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
308
580
|
def set_network(params)
|
309
581
|
response = @connection.get("set_network.cgi?#{params.to_query}")
|
310
582
|
response.success?
|
311
583
|
end
|
312
|
-
|
584
|
+
##
|
585
|
+
# Set the wifi parameters
|
586
|
+
# @param [Hash] params
|
587
|
+
# @option params [FalseClass, TrueClass] :enable Whether wifi is enabled or not.
|
588
|
+
# @option params [String] :ssid Your WIFI SSID
|
589
|
+
# @option params [FalseClass, TrueClass] :encrypt Whether wifi is encrypted or not.
|
590
|
+
# @option params [String] :wpa_psk wpa_psk
|
591
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
313
592
|
def set_wifi(params)
|
314
593
|
response = @connection.get("set_wifi.cgi?#{params.to_query}")
|
315
594
|
response.success?
|
316
595
|
end
|
317
|
-
|
596
|
+
|
597
|
+
##
|
598
|
+
# Set the pppoe parameters
|
599
|
+
# @param [Hash] params
|
600
|
+
# @option params [FalseClass, TrueClass] :enable
|
601
|
+
# @option params [String] :user
|
602
|
+
# @option params [String] :pwd
|
603
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
318
604
|
def set_pppoe(params)
|
319
605
|
throw "invalid parameter value" if params.has_key?(:user) && params[:user].length > 20
|
320
606
|
throw "invalid parameter value" if params.has_key?(:pwd) && params[:pwd].length > 20
|
@@ -322,11 +608,24 @@ module Foscam
|
|
322
608
|
response.success?
|
323
609
|
end
|
324
610
|
|
611
|
+
##
|
612
|
+
# Enable or disable upnp
|
613
|
+
# @param [FalseClass, TrueClass] flag A boolean for whether to enable or disable upnp.
|
614
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
325
615
|
def set_upnp(flag)
|
326
616
|
response = @connection.get("set_upnp.cgi?enable=#{handle_boolean(flag)}")
|
327
617
|
response.success?
|
328
618
|
end
|
329
619
|
|
620
|
+
|
621
|
+
##
|
622
|
+
# Set the ddns parameters
|
623
|
+
# @param [Hash] params
|
624
|
+
# @option params [String] :user
|
625
|
+
# @option params [String] :pwd
|
626
|
+
# @option params [String] :host
|
627
|
+
# @option params [String] :service
|
628
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
330
629
|
def set_ddns(params)
|
331
630
|
throw "invalid parameter value" if params.has_key?(:user) && params[:user].length > 20
|
332
631
|
throw "invalid parameter value" if params.has_key?(:pwd) && params[:pwd].length > 20
|
@@ -335,11 +634,34 @@ module Foscam
|
|
335
634
|
response.success?
|
336
635
|
end
|
337
636
|
|
637
|
+
##
|
638
|
+
# Set the ftp parameters
|
639
|
+
# @param [Hash] params
|
640
|
+
# @option params [String] :dir
|
641
|
+
# @option params [String] :user
|
642
|
+
# @option params [String] :pwd
|
643
|
+
# @option params [String] :svr
|
644
|
+
# @option params [Fixnum] :port
|
645
|
+
# @option params [Fixnum] :upload_interval in seconds
|
646
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
338
647
|
def set_ftp(params)
|
339
648
|
response = @connection.get("set_ftp.cgi?#{params.to_query}")
|
340
649
|
response.success?
|
341
650
|
end
|
342
651
|
|
652
|
+
##
|
653
|
+
# Set the smtp server mail notification parameters
|
654
|
+
# @param [Hash] params
|
655
|
+
# @option params [String] :user must be less than 20 characters
|
656
|
+
# @option params [String] :pwd must be less than 20 characters
|
657
|
+
# @option params [String] :svr
|
658
|
+
# @option params [Fixnum] :port
|
659
|
+
# @option params [String] :sender must be less than 40 characters
|
660
|
+
# @option params [String] :receiver1 must be less than 40 characters
|
661
|
+
# @option params [String] :receiver2 must be less than 40 characters
|
662
|
+
# @option params [String] :receiver3 must be less than 40 characters
|
663
|
+
# @option params [String] :receiver4 must be less than 40 characters
|
664
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
343
665
|
def set_mail(params)
|
344
666
|
throw "invalid parameter value" if params.has_key?(:user) && params[:user].length > 20
|
345
667
|
throw "invalid parameter value" if params.has_key?(:pwd) && params[:pwd].length > 20
|
@@ -350,26 +672,110 @@ module Foscam
|
|
350
672
|
response.success?
|
351
673
|
end
|
352
674
|
|
675
|
+
##
|
676
|
+
# Set alarm parameters
|
677
|
+
# @param [Hash] params
|
678
|
+
# @option params [TrueClass, FalseClass] :motion_armed Whether the motion is enabled or disabled
|
679
|
+
# @option params [TrueClass, FalseClass] :input_armed Whether the motion is enabled or disabled
|
680
|
+
# @option params [TrueClass, FalseClass] :mail whether to send email on alarm
|
681
|
+
# @option params [TrueClass, FalseClass] :iolinkage whether to send email on alarm
|
682
|
+
# @option params [Fixnum] :motion_sensitivity
|
683
|
+
# @option params [Fixnum] :upload_interval in seconds
|
684
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
353
685
|
def set_alarm(params)
|
354
686
|
response = @connection.get("set_alarm.cgi?#{params.to_query}")
|
355
687
|
response.success?
|
356
688
|
end
|
357
689
|
|
690
|
+
##
|
691
|
+
# Write to comm
|
692
|
+
# @param [Hash] params
|
693
|
+
# @option params [Fixnum] :baud
|
694
|
+
# @option params [String] :bytes
|
695
|
+
# @option params [String] :data
|
696
|
+
# @option params [Fixnum] :port
|
697
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
358
698
|
def comm_write(params)
|
359
699
|
response = @connection.get("comm_write.cgi?#{params.to_query}")
|
360
700
|
response.success?
|
361
701
|
end
|
362
702
|
|
703
|
+
##
|
704
|
+
# Set Forbidden
|
705
|
+
# @param [Hash] params
|
706
|
+
# @option params [Fixnum] :schedule_fri_0
|
707
|
+
# @option params [Fixnum] :schedule_fri_1
|
708
|
+
# @option params [Fixnum] :schedule_fri_2
|
709
|
+
# @option params [Fixnum] :schedule_mon_0
|
710
|
+
# @option params [Fixnum] :schedule_mon_1
|
711
|
+
# @option params [Fixnum] :schedule_mon_2
|
712
|
+
# @option params [Fixnum] :schedule_sat_0
|
713
|
+
# @option params [Fixnum] :schedule_sat_1
|
714
|
+
# @option params [Fixnum] :schedule_sat_2
|
715
|
+
# @option params [Fixnum] :schedule_sun_0
|
716
|
+
# @option params [Fixnum] :schedule_sun_1
|
717
|
+
# @option params [Fixnum] :schedule_sun_2
|
718
|
+
# @option params [Fixnum] :schedule_thu_0
|
719
|
+
# @option params [Fixnum] :schedule_thu_1
|
720
|
+
# @option params [Fixnum] :schedule_thu_2
|
721
|
+
# @option params [Fixnum] :schedule_tue_0
|
722
|
+
# @option params [Fixnum] :schedule_tue_1
|
723
|
+
# @option params [Fixnum] :schedule_tue_2
|
724
|
+
# @option params [Fixnum] :schedule_wed_0
|
725
|
+
# @option params [Fixnum] :schedule_wed_1
|
726
|
+
# @option params [Fixnum] :schedule_wed_2
|
727
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
363
728
|
def set_forbidden(params)
|
364
729
|
response = @connection.get("set_forbidden.cgi?#{params.to_query}")
|
365
730
|
response.success?
|
366
731
|
end
|
367
732
|
|
733
|
+
##
|
734
|
+
# Returns the forbidden schedule for the camera
|
735
|
+
# @return [Hash] If the request is unsuccessful the hash will be empty. Otherwise it contains the following fields:
|
736
|
+
# * :schedule_sun_0 (Fixnum)
|
737
|
+
# * :schedule_sun_1 (Fixnum)
|
738
|
+
# * :schedule_sun_2 (Fixnum)
|
739
|
+
# * :schedule_mon_0 (Fixnum)
|
740
|
+
# * :schedule_mon_1 (Fixnum)
|
741
|
+
# * :schedule_mon_2 (Fixnum)
|
742
|
+
# * :schedule_tue_0 (Fixnum)
|
743
|
+
# * :schedule_tue_1 (Fixnum)
|
744
|
+
# * :schedule_tue_2 (Fixnum)
|
745
|
+
# * :schedule_wed_0 (Fixnum)
|
746
|
+
# * :schedule_wed_1 (Fixnum)
|
747
|
+
# * :schedule_wed_2 (Fixnum)
|
748
|
+
# * :schedule_thu_0 (Fixnum)
|
749
|
+
# * :schedule_thu_1 (Fixnum)
|
750
|
+
# * :schedule_thu_2 (Fixnum)
|
751
|
+
# * :schedule_fri_0 (Fixnum)
|
752
|
+
# * :schedule_fri_1 (Fixnum)
|
753
|
+
# * :schedule_fri_2 (Fixnum)
|
754
|
+
# * :schedule_sat_0 (Fixnum)
|
755
|
+
# * :schedule_sat_1 (Fixnum)
|
756
|
+
# * :schedule_sat_2 (Fixnum)
|
368
757
|
def get_forbidden
|
369
758
|
response = @connection.get("get_forbidden.cgi")
|
370
759
|
response.success? ? parse_response(response) : {}
|
371
760
|
end
|
372
761
|
|
762
|
+
##
|
763
|
+
# Set miscellaneous parameters
|
764
|
+
# @param [Hash] params
|
765
|
+
# @option params [Fixnum] :led_mode
|
766
|
+
# @option params [Fixnum] :ptz_auto_patrol_interval
|
767
|
+
# @option params [Fixnum] :ptz_auto_patrol_type
|
768
|
+
# @option params [Fixnum] :ptz_patrol_down_rate
|
769
|
+
# @option params [Fixnum] :ptz_patrol_h_rounds
|
770
|
+
# @option params [Fixnum] :ptz_patrol_left_rate
|
771
|
+
# @option params [Fixnum] :ptz_patrol_rate
|
772
|
+
# @option params [Fixnum] :ptz_patrol_right_rate
|
773
|
+
# @option params [Fixnum] :ptz_patrol_up_rate
|
774
|
+
# @option params [Fixnum] :ptz_patrol_v_rounds
|
775
|
+
# @option params [FalseClass,TrueClass] :ptz_preset_onstart
|
776
|
+
# @option params [FalseClass,TrueClass] :ptz_center_onstart
|
777
|
+
# @option params [FalseClass,TrueClass] :ptz_disable_preset
|
778
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
373
779
|
def set_misc(params)
|
374
780
|
url_params = params.clone
|
375
781
|
[:ptz_patrol_rate, :ptz_patrol_up_rate, :ptz_patrol_down_rate, :ptz_patrol_left_rate, :ptz_patrol_right_rate].each do |key|
|
@@ -387,6 +793,23 @@ module Foscam
|
|
387
793
|
response.success?
|
388
794
|
end
|
389
795
|
|
796
|
+
|
797
|
+
##
|
798
|
+
# Get miscellaneous parameters
|
799
|
+
# @return [Hash] If the request is unsuccessful the hash will be empty. Otherwise it contains the following fields:
|
800
|
+
# * :led_mode (Fixnum)
|
801
|
+
# * :ptz_auto_patrol_interval (Fixnum)
|
802
|
+
# * :ptz_auto_patrol_type (Fixnum)
|
803
|
+
# * :ptz_patrol_down_rate (Fixnum)
|
804
|
+
# * :ptz_patrol_h_rounds (Fixnum)
|
805
|
+
# * :ptz_patrol_left_rate (Fixnum)
|
806
|
+
# * :ptz_patrol_rate (Fixnum)
|
807
|
+
# * :ptz_patrol_right_rate (Fixnum)
|
808
|
+
# * :ptz_patrol_up_rate (Fixnum)
|
809
|
+
# * :ptz_patrol_v_rounds (Fixnum)
|
810
|
+
# * :ptz_preset_onstart (FalseClass,TrueClass)
|
811
|
+
# * :ptz_center_onstart (FalseClass,TrueClass)
|
812
|
+
# * :ptz_disable_preset (FalseClass,TrueClass)
|
390
813
|
def get_misc
|
391
814
|
response = @connection.get("get_misc.cgi")
|
392
815
|
response = response.success? ? parse_response(response) : {}
|
@@ -404,6 +827,11 @@ module Foscam
|
|
404
827
|
response
|
405
828
|
end
|
406
829
|
|
830
|
+
|
831
|
+
##
|
832
|
+
# Set decoder baud
|
833
|
+
# @param [String,Symbol] baud
|
834
|
+
# @return [FalseClass,TrueClass] whether the request was successful.
|
407
835
|
def set_decoder(baud)
|
408
836
|
baud = DECODER_BAUD_ID[baud.to_sym] if baud.is_a?(String) || baud.is_a?(Symbol)
|
409
837
|
response = @connection.get("set_decoder.cgi?baud=#{baud}")
|
data/lib/foscam/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -4,9 +4,10 @@ require 'bundler/setup'
|
|
4
4
|
require 'vcr'
|
5
5
|
require 'foscam-ruby' # and any other gems you need
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
|
8
|
+
FOSCAM_USERNAME = 'my_username' #:nodoc:all
|
9
|
+
FOSCAM_PASSWORD = 'my_password' #:nodoc:all
|
10
|
+
FOSCAM_URL = "http://192.168.0.117/" #:nodoc:all
|
10
11
|
|
11
12
|
VCR.configure do |c|
|
12
13
|
c.cassette_library_dir = 'spec/fixtures/vcr'
|
@@ -14,9 +15,15 @@ VCR.configure do |c|
|
|
14
15
|
# c.allow_http_connections_when_no_cassette = true
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
|
19
|
+
module Boolean #:nodoc:all
|
20
|
+
end
|
21
|
+
class TrueClass #:nodoc:all
|
22
|
+
include Boolean
|
23
|
+
end
|
24
|
+
class FalseClass #:nodoc:all
|
25
|
+
include Boolean
|
26
|
+
end
|
20
27
|
|
21
28
|
RSpec.configure do |config|
|
22
29
|
# some (optional) config here
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foscam-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Waddington
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -242,4 +242,3 @@ test_files:
|
|
242
242
|
- spec/fixtures/vcr/foscam_upgrade_htmls.yml
|
243
243
|
- spec/foscam/client_spec.rb
|
244
244
|
- spec/spec_helper.rb
|
245
|
-
has_rdoc:
|