savant-echo 0.1.9 → 0.1.91

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d055d6fd16f0c7df90f623d58434ae6746e5767e
4
- data.tar.gz: dee0c1c44798684ff002df389a18beb808e2bfd5
3
+ metadata.gz: ed57683c8b0620aaa11e1cc51005db16bf1ff13d
4
+ data.tar.gz: 66adca2de26b7c7bc219ae17a7c2dea0f13e50cc
5
5
  SHA512:
6
- metadata.gz: b3582fda369b18d27569c3ee94a1e46626a2beb3d124e30f7df98318f428f0c4e542a978ef354d96a3dfe5415542b5d95c69f3b3810862263f46de3cadc95777
7
- data.tar.gz: 7e2f5a81daba6894ae185609bb3809368cd0f7e989e42140a6f1d49d49223ac59992aedb2cf2116a19d1628546f1829eafc1f1c3ef6f95a04493b22f06e2965b
6
+ metadata.gz: 231c5288041d2c30446a7f5ed23b3256c73b23c48a2652c2a190a64fd53344754b526a6b3cc8be986d267261d5a86b3e1c19f034f9bb9a439a2077da5778ad32
7
+ data.tar.gz: 4126ede314691f8ac2992ba8bdf8512e03302fff1446f3842d19da5df429261a6d7c41bd595a9c7eb2de0fa90dac645912ec28ccb8abdc3507a10cb65a00e8ea
@@ -0,0 +1,1177 @@
1
+ # TO DO
2
+
3
+ # INSTALL PASSWORD PROMPT
4
+ # ADD MENU ITEM FOR DEBUG?
5
+ # PACKAGE INSTALLER
6
+
7
+
8
+ require 'rubygems'
9
+ require 'net/http'
10
+ require 'net/scp'
11
+ require 'uri'
12
+ require 'socket'
13
+ require 'timeout'
14
+ require 'ipaddress'
15
+ class Savant
16
+ include GladeGUI
17
+
18
+ #####Method to check to see if HA Bridge is running on host#####
19
+ def up?(server, port)
20
+ http = Net::HTTP.start(server, port, {open_timeout: 1, read_timeout: 1})
21
+ response = http.head("/")
22
+ if response.code == "200"
23
+ @builder["buttonHabridgeStatus"].label = "HA Bridge is Online\nClick to open in browser."
24
+ @habridgeStatus = "Online"
25
+ end
26
+ rescue Timeout::Error, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED
27
+ false
28
+ @builder["buttonHabridgeStatus"].label = "HA Bridge is Offline\nClick for help."
29
+ @habridgeStatus = "Offline"
30
+ end
31
+
32
+ #####Method to check to see if Racepoint and SCLI bridge ports are open on host#####
33
+ def is_port_open?(ip, port)
34
+ begin
35
+ Timeout::timeout(1) do
36
+ begin
37
+ s = TCPSocket.new(ip, port)
38
+ s.close
39
+ return true
40
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
41
+ return false
42
+ end
43
+ end
44
+ rescue Timeout::Error
45
+ end
46
+
47
+ return false
48
+ end
49
+
50
+ #####Set variables before windows load#####
51
+ def before_show()
52
+ @savantURL = "192.168.77.178"
53
+ @haName = ""
54
+ @habridgeStatus = "Offline"
55
+ @installStatus = ""
56
+
57
+ @savantRequestOn = ''
58
+ @savantRequestOff = ''
59
+ @savantRequestDim = ''
60
+
61
+ @strRequestOn = ''
62
+ @strRequestOff = ''
63
+ @strRequestDim = ''
64
+
65
+ @requestOnValue1 = "percent"
66
+ @requestOnValue2 = "percent"
67
+ @requestOnValue3 = "percent"
68
+ @requestOnValue4 = "percent"
69
+ @requestOnValue5 = "percent"
70
+ @requestOnValue6 = "percent"
71
+ @requestOnValue7 = "percent"
72
+ @requestOnValue8 = "percent"
73
+ @requestOnValue9 = "percent"
74
+
75
+ @requestOffValue1 = "percent"
76
+ @requestOffValue2 = "percent"
77
+ @requestOffValue3 = "percent"
78
+ @requestOffValue4 = "percent"
79
+ @requestOffValue5 = "percent"
80
+ @requestOffValue6 = "percent"
81
+ @requestOffValue7 = "percent"
82
+ @requestOffValue8 = "percent"
83
+ @requestOffValue9 = "percent"
84
+
85
+ @requestDimValue1 = "percent"
86
+ @requestDimValue2 = "percent"
87
+ @requestDimValue3 = "percent"
88
+ @requestDimValue4 = "percent"
89
+ @requestDimValue5 = "percent"
90
+ @requestDimValue6 = "percent"
91
+ @requestDimValue7 = "percent"
92
+ @requestDimValue8 = "percent"
93
+ @requestDimValue9 = "percent"
94
+
95
+ up?(@savantURL,"8888")
96
+ end
97
+
98
+ #####Check HA bridge server status for feedback when textbox is edited#####
99
+ def savantURL__focus_out_event(*argv)
100
+ @savantURL = @builder["savantURL"].text
101
+ up?(@savantURL,"8888")
102
+ end
103
+
104
+ def savantHelpURL__focus_out_event(*argv)
105
+ @savantURL = @builder["savantHelpURL"].text
106
+ up?(@savantURL,"8888")
107
+ end
108
+
109
+ #####Launch HA Bridge if online or help window if offline#####
110
+ def buttonHabridgeStatus__clicked(*argv)
111
+ if @habridgeStatus == "Offline"
112
+ @builder["savantHelpURL"].text = @savantURL
113
+ @builder["dialogHelp"].show
114
+ elsif @habridgeStatus == "Online"
115
+ system("open http://" + @savantURL + ":8888")
116
+ end
117
+ end
118
+
119
+ ##### #####
120
+ ##### Help and installation window #####
121
+ ##### #####
122
+
123
+ ##### Try to launch HA bridge at specified IP #####
124
+ def buttonHelpHAbridge__clicked(*argv)
125
+ if IPAddress.valid? @savantURL
126
+ if is_port_open?(@savantURL,"8888")
127
+ system("open " + @savantURLstr + ":8888")
128
+ else
129
+ alert "HA Bridge is not online at specified IP address.\nPlease change IP address or install HA bridge and set to port 8888."
130
+ end
131
+ else
132
+ alert "Invalid IP Address."
133
+ end
134
+ end
135
+
136
+ ##### Try to launch SCLI bridge at specified IP #####
137
+ def buttonHelpSCLIbridge__clicked(*argv)
138
+ if IPAddress.valid? @savantURL
139
+ if is_port_open?(@savantURL,"12000")
140
+ system("open http://" + @savantURL + ":12000/userzones")
141
+ else
142
+ alert "SCLI_HTTP bridge is not online at specified IP address.\nPlease change IP address or install SCLI_HTTP bridge and set to port 120000."
143
+ end
144
+ else
145
+ alert "Invalid IP Address."
146
+ end
147
+ end
148
+
149
+ ##### Install all components at specified IP #####
150
+ def buttonHelpInstall__clicked(*argv)
151
+ #Check that specified host is a Savant Host running Racepoint
152
+ if IPAddress.valid? @savantURL
153
+ if is_port_open?(@savantURL,"11263")
154
+ @builder["dialogInstall"].show
155
+ login = 'RPM'
156
+ @password = 'RPM'
157
+ javaCount = 0
158
+ result = ''
159
+ Net::SSH.start(@savantURL, login, :password => @password, :paranoid => false) do |ssh|
160
+ #Copy files to host
161
+ @builder["installStatus"].label = "Copying Files..."
162
+ clear_events()
163
+ ssh.exec!("mkdir -p /Users/RPM/habridge/")
164
+ path = File.expand_path("..",__dir__)
165
+ ssh.scp.upload!(path + "/habridge/", '/Users/RPM/', :recursive => true)
166
+ ssh.exec!("mv /Users/RPM/habridge/com.habridge.plist /Users/RPM/Library/LaunchAgents/")
167
+ ssh.exec!("mv /Users/RPM/habridge/com.SCLI_HTTP.plist /Users/RPM/Library/LaunchAgents/")
168
+ @builder["installStatus"].label += "\nFiles copied!\n\nInstalling Homebrew on Host...this might take a minute.\n"
169
+ clear_events()
170
+ sleep 2
171
+ #Create terminal session with host
172
+ ssh.open_channel do |ch, success|
173
+ #debug alert "ch open"
174
+ ch.request_pty do |ch, success|
175
+ if success
176
+ #debug alert "pty successfully obtained"
177
+ else
178
+ #debug alert "could not obtain pty"
179
+ end
180
+ end
181
+ #Install homebrew on host
182
+ ch.exec(%q{ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"}) do |ch, success|
183
+ abort "could not execute command" unless success
184
+ end
185
+ ch.on_data do |ch, data|
186
+ #debug alert "got data:" + data
187
+ if data.to_s.include? "100%"
188
+ print "."
189
+ end
190
+ if data.to_s.include? "Password:"
191
+ ch.send_data @password
192
+ ch.send_data "\n"
193
+ end
194
+ if data.to_s.include? "RETURN"
195
+ ch.send_data "\n"
196
+ end
197
+ if data.to_s.include? "expected shallow list"
198
+ @builder["installStatus"].label += "Homebrew already installed on Host.\n\n"
199
+ clear_events()
200
+ sleep 1
201
+ #debug #ch.send_data "brew cask install java"
202
+ end
203
+ if data.to_s.include? "Further documentation: https://git.io/brew-docs"
204
+ @builder["installStatus"].label += "Homebrew installed on Host.\n\n"
205
+ clear_events()
206
+ sleep 1
207
+ #ch.send_data "brew cask install java"
208
+ end
209
+ end
210
+ ch.on_extended_data do |ch, type, data|
211
+ alert "got stderr: #{data.inspect}"
212
+ end
213
+
214
+ ch.wait
215
+
216
+ end
217
+ ssh.loop
218
+
219
+ #Create terminal session on host
220
+ ssh.open_channel do |ch, success|
221
+ ch.request_pty do |ch, success|
222
+ if success
223
+ #debug alert "pty successfully obtained"
224
+ else
225
+ #debug alert "could not obtain pty"
226
+ end
227
+ end
228
+ @builder["installStatus"].label += "Installing Java Dev Kit on Host...this might take a minute.\n"
229
+ clear_events()
230
+ sleep 1
231
+ #Install JDK on host
232
+ ch.exec(%q{/bin/bash -lc "brew cask install java"}) do |ch, success|
233
+ abort "could not execute command" unless success
234
+ end
235
+ ch.on_data do |ch, data|
236
+ #debug alert "got data:" + data
237
+ if data.to_s.include? "0.0%"
238
+ javaCount = javaCount + 1
239
+ if (javaCount%10).zero?
240
+ @builder["installStatus"].label += "."
241
+ clear_events()
242
+ end
243
+ end
244
+ if data.to_s.include? "Password:"
245
+ ch.send_data @password
246
+ ch.send_data "\n"
247
+ end
248
+ if data.to_s.include? "RETURN"
249
+ ch.send_data "\n"
250
+ end
251
+
252
+ if data.to_s.include? "A Cask for java is already installed."
253
+ @builder["installStatus"].label += "Java already installed on Host.\n\n"
254
+ clear_events()
255
+ sleep 1
256
+ #ch.send_data "brew cask install java"
257
+ end
258
+ if data.to_s.include? "java was successfully installed!"
259
+ @builder["installStatus"].label += "\nJava Installed on Host.\n\n"
260
+ clear_events()
261
+ sleep 1
262
+ #ch.send_data "brew cask install java"
263
+ end
264
+ end
265
+ ch.on_extended_data do |ch, type, data|
266
+ #debug alert "got stderr: #{data.inspect}"
267
+ end
268
+ ch.wait
269
+ end
270
+ ssh.loop
271
+
272
+ #Update status window
273
+ @builder["installStatus"].label += "Installing Launch Agents...\n"
274
+ clear_events()
275
+ result = ssh.exec!("launchctl load /Users/RPM/Library/LaunchAgents/com.SCLI_HTTP.plist")
276
+ @builder["installStatus"].label += result
277
+ clear_events()
278
+ result = ssh.exec!("launchctl load /Users/RPM/Library/LaunchAgents/com.habridge.plist")
279
+ @builder["installStatus"].label += result
280
+ clear_events()
281
+ @builder["installStatus"].label += "Launch Agents installed!\n\n"
282
+ clear_events()
283
+ sleep 1
284
+ @builder["installStatus"].label += "Installation complete.\n"
285
+ clear_events()
286
+ sleep 1
287
+ @builder["installStatus"].label += "To verify installation, test the following URLs\nto make certain both the habridge and the scli_http bridge are active.\n\nhttp://" + @savantURL + ":8888/\nhttp://" + @savantURL + ":12000/userzones\n"
288
+ clear_events()
289
+ @builder["installStatus"].label += "\nWould you like to open these URLs in a browser now?"
290
+ @builder["buttonInstallOK"].visible = true
291
+ @builder["buttonInstallCancel"].visible = true
292
+ clear_events()
293
+ end
294
+ else
295
+ alert "Racepoint services not running at specified IP Address. Target for installation must be a Savant Pro Host."
296
+ end
297
+ else
298
+ alert "Invalid IP Address."
299
+ end
300
+ end
301
+
302
+ ##### Repeat install process in reverse for uninstall. BUG: Java uninstall can be flaky an might fail. #####
303
+ def buttonHelpUninstall__clicked(*argv)
304
+ if IPAddress.valid? @savantURL
305
+ if is_port_open?(@savantURL,"11263")
306
+ @builder["dialogInstall"].show
307
+ login = 'RPM'
308
+ @password = 'RPM'
309
+ result = ''
310
+ result = ''
311
+ Net::SSH.start(@savantURL, login, :password => @password, :paranoid => false) do |ssh|
312
+ @builder["installStatus"].label += "\nUninstalling Launch Agents..."
313
+ clear_events()
314
+ result = ssh.exec!("launchctl unload /Users/RPM/Library/LaunchAgents/com.SCLI_HTTP.plist")
315
+ result = ssh.exec!("launchctl unload /Users/RPM/Library/LaunchAgents/com.habridge.plist")
316
+ @builder["installStatus"].label += result
317
+ @builder["installStatus"].label += "Launch Agents uninstalled!\n\n"
318
+ clear_events()
319
+ sleep 3
320
+ ssh.open_channel do |ch, success|
321
+ ch.request_pty do |ch, success|
322
+ end
323
+ @builder["installStatus"].label += "Uninstalling Java on Host...this might take a minute.\n"
324
+ clear_events()
325
+ ch.exec(%q{brew cask uninstall java}) do |ch, success|
326
+ abort "could not execute command" unless success
327
+ end
328
+ ch.on_data do |ch, data|
329
+ if data.to_s.include? "Password:"
330
+ ch.send_data @password
331
+ ch.send_data "\n"
332
+ end
333
+ if data.to_s.include? "RETURN"
334
+ ch.send_data "\n"
335
+ end
336
+ if data.to_s.include? "java is not installed"
337
+ @builder["installStatus"].label += "Java already uninstalled on Host.\n\n"
338
+ clear_events()
339
+ sleep 1
340
+ end
341
+ if data.to_s.include? "Removing files: ["
342
+ @builder["installStatus"].label += "Java uninstalled on Host.\n\n"
343
+ clear_events()
344
+ sleep 1
345
+ end
346
+ end
347
+ ch.on_extended_data do |ch, type, data|
348
+ end
349
+ ch.wait
350
+ end
351
+ ssh.loop
352
+ ssh.open_channel do |ch, success|
353
+ ch.request_pty do |ch, success|
354
+ end
355
+ @builder["installStatus"].label += "Uninstalling Homebrew on Host...this might take a minute.\n"
356
+ clear_events()
357
+ ch.exec(%q{ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"}) do |ch, success|
358
+ abort "could not execute command" unless success
359
+ end
360
+ ch.on_data do |ch, data|
361
+ if data.to_s.include? "Password:"
362
+ ch.send_data @password
363
+ ch.send_data "\n"
364
+ end
365
+ if data.to_s.include? "RETURN"
366
+ ch.send_data "\n"
367
+ end
368
+ if data.to_s.include? "uninstall Homebrew? [y/N]"
369
+ ch.send_data "y\n"
370
+ end
371
+ if data.to_s.include? "Failed to locate Homebrew!"
372
+ @builder["installStatus"].label += "Homebrew already uninstalled on Host.\n\n"
373
+ clear_events()
374
+ sleep 3
375
+ end
376
+ if data.to_s.include? "You may wish to remove them yourself."
377
+ @builder["installStatus"].label += "Homebrew uninstalled on Host.\n\n"
378
+ clear_events()
379
+ sleep 3
380
+ end
381
+ end
382
+ ch.on_extended_data do |ch, type, data|
383
+ @builder["installStatus"].label += "got stderr: #{data.inspect}"
384
+ clear_events()
385
+ end
386
+ ch.wait
387
+ end
388
+ ssh.loop
389
+ @builder["installStatus"].label += "\nRemoving Files..."
390
+ clear_events()
391
+ ssh.exec!("rm –Rf /Users/RPM/habridge/")
392
+ ssh.exec!("rm -f /Users/RPM/habridge/com.habridge.plist /Users/RPM/Library/LaunchAgents/")
393
+ ssh.exec!("rm -f /Users/RPM/habridge/com.SCLI_HTTP.plist /Users/RPM/Library/LaunchAgents/")
394
+ @builder["installStatus"].label += "Files removed!\n\n"
395
+ clear_events()
396
+ @builder["installStatus"].label += "Uninstallation complete.\n\n"
397
+ @builder["installStatus"].label += "To verify installation, test that the following URLs\nare no longer active.\n\nhttp://" + @savantURL + ":8888/\nhttp://" + @savantURL + ":12000/userzones\n"
398
+ clear_events()
399
+ @builder["installStatus"].label += "\nWould you like to open these URLs in a browser now?"
400
+ @builder["buttonInstallOK"].visible = true
401
+ @builder["buttonInstallCancel"].visible = true
402
+ clear_events()
403
+ end
404
+ else
405
+ alert "Racepoint services not running at specified IP Address. Target for installation must be a Savant Pro Host."
406
+ end
407
+ else
408
+ alert "Invalid IP Address."
409
+ end
410
+ end
411
+
412
+ ##### Close window #####
413
+ def buttonHelpCancel__clicked(*argv)
414
+ @builder["dialogHelp"].hide
415
+ end
416
+
417
+ ##### Launch HABridge and SCLIbridge in browser and close installation status window #####
418
+ def buttonInstallOK__clicked(*argv)
419
+ @builder["installStatus"].label = ""
420
+ @builder["buttonInstallOK"].visible = false
421
+ @builder["buttonInstallCancel"].visible = false
422
+ @builder["dialogInstall"].hide
423
+ system("open http://" + @savantURL + ":8888")
424
+ system("open http://" + @savantURL + ":12000/userzones")
425
+ end
426
+
427
+ ##### Close installation status window #####
428
+ def buttonInstallCancel__clicked(*argv)
429
+ @builder["buttonInstallOK"].visible = false
430
+ @builder["buttonInstallCancel"].visible = false
431
+ @builder["installStatus"].label = ""
432
+ @builder["dialogInstall"].hide
433
+ end
434
+
435
+ ##### #####
436
+ ##### Zone request only toggle buttons #####
437
+ ##### #####
438
+
439
+ ##### Toggle On Request to/from Zone only #####
440
+ def buttonOnZoneOnly__clicked(*argv)
441
+ if @builder["buttonOnZoneOnly"].active?
442
+ @savantRequestOn = @builder["savantRequestOn"].text
443
+ if !@savantRequestOn.empty?
444
+ zoneOnlyOnArray = @savantRequestOn.split('-')
445
+ zoneOnlyOnArray.fill('',1,4)
446
+ @builder["savantRequestOn"].text = zoneOnlyOnArray.join('-')
447
+ end
448
+ else
449
+ @builder["savantRequestOn"].text = @savantRequestOn
450
+ end
451
+
452
+ end
453
+
454
+ ##### Toggle Off Request to/from Zone only #####
455
+ def buttonOffZoneOnly__clicked(*argv)
456
+ if @builder["buttonOffZoneOnly"].active?
457
+ @savantRequestOff = @builder["savantRequestOff"].text
458
+ if !@savantRequestOff.empty?
459
+ zoneOfflyOffArray = @savantRequestOff.split('-')
460
+ zoneOfflyOffArray.fill('',1,4)
461
+ @builder["savantRequestOff"].text = zoneOfflyOffArray.join('-')
462
+ end
463
+ else
464
+ @builder["savantRequestOff"].text = @savantRequestOff
465
+ end
466
+
467
+ end
468
+
469
+ ##### Toggle Dim Request to/from Zone only #####
470
+ def buttonDimZoneOnly__clicked(*argv)
471
+ if @builder["buttonDimZoneOnly"].active?
472
+ @savantRequestDim = @builder["savantRequestDim"].text
473
+ if !@savantRequestDim.empty?
474
+ zoneDimlyDimArray = @savantRequestDim.split('-')
475
+ zoneDimlyDimArray.fill('',1,4)
476
+ @builder["savantRequestDim"].text = zoneDimlyDimArray.join('-')
477
+ end
478
+ else
479
+ @builder["savantRequestDim"].text = @savantRequestDim
480
+ end
481
+
482
+ end
483
+
484
+ ##### #####
485
+ ##### Add command(s) to HA Bridge, first parsing for errors and needed parameters #####
486
+ ##### #####
487
+
488
+ def buttonAdd__clicked(*argv)
489
+ get_glade_variables()
490
+
491
+ #Error checking for empty fields and non-compliant workflows
492
+ @error = nil
493
+ errorCount = 0
494
+
495
+ #Check for valid Host IP and build bridge strings
496
+ if @savantURL.to_s.empty?
497
+ @error = "Missing Savant Host URL"
498
+ elsif !(IPAddress.valid? @savantURL)
499
+ @error = "Invalid URL"
500
+ else
501
+ @haURLstr = "http://" + @savantURL + ":8888/api/devices"
502
+ @savantURLstr = "http://" + @savantURL + ":12000"
503
+ end
504
+
505
+ #Check for device name entry
506
+ if @error.nil? && @haName.to_s.empty?
507
+ @error = "Missing Device Name"
508
+ end
509
+
510
+ #Check for HA bridge online at specified IP
511
+ if @habridgeStatus != "Online"
512
+ @error = "HA Bridge Not Online"
513
+ end
514
+
515
+ #Proceed if no errors
516
+ if @error.nil?
517
+ #Check for empty On entry, create empty array if so, and count to make sure at least one entry is present
518
+ if @savantRequestOn.to_s.empty?
519
+ @requestOnArray = []
520
+ errorCount += 1
521
+ elsif @savantRequestOn.to_s.include?(":") || @savantRequestOn.to_s.include?("-")
522
+ #Split off main service request from arguments if they exist
523
+ @requestOnArray = @savantRequestOn.split(/:/)
524
+ #Add escapes and formatting to pass through JSON to Ha Bridge
525
+ @requestOnCmd = @requestOnArray.shift.gsub!(/[- ']/, '-' => '\\\'-\\\'', ' ' => '%20')
526
+ @strRequestOn = %q{'onUrl' : '} + @savantURLstr + %q{/servicerequestcommand%20\'} + @requestOnCmd + %q{\'}
527
+ else
528
+ @error = "Not a valid On workflow."
529
+ end
530
+
531
+ #Repeat for off
532
+ if @savantRequestOff.to_s.empty?
533
+ @requestOffArray = []
534
+ errorCount += 1
535
+ elsif @savantRequestOff.to_s.include?(":") || @savantRequestOff.to_s.include?("-")
536
+ @requestOffArray = @savantRequestOff.split(/:/)
537
+ @requestOffCmd = @requestOffArray.shift.gsub!(/[- ']/, '-' => '\\\'-\\\'', ' ' => '%20')
538
+ @strRequestOff = %q{'offUrl' : '} + @savantURLstr + %q{/servicerequestcommand%20\'} + @requestOffCmd + %q{\'}
539
+ else
540
+ @error = "Not a valid Off workflow."
541
+ end
542
+
543
+ #Repeat for dim
544
+ if @savantRequestDim.to_s.empty?
545
+ @requestDimArray = []
546
+ errorCount += 1
547
+ elsif @savantRequestDim.to_s.include?(":") || @savantRequestDim.to_s.include?("-")
548
+ @requestDimArray = @savantRequestDim.split(/:/)
549
+ @requestDimCmd = @requestDimArray.shift.gsub!(/[- ']/, '-' => '\\\'-\\\'', ' ' => '%20')
550
+ @strRequestDim = %q{'dimUrl' : '} + @savantURLstr + %q{/servicerequestcommand%20\'} + @requestDimCmd + %q{\'}
551
+ else
552
+ @error = "Not a valid Dim workflow."
553
+ end
554
+ if errorCount == 3
555
+ @error = "You must enter at least one command to proceed."
556
+ end
557
+
558
+ end
559
+
560
+ #Proceed as long as there is one valid command
561
+ if @error.nil?
562
+ #Checks to see how many action arguments are in the On 3rd party workflow, saves the Argument names to display on the UI
563
+ #and hides ones that are not needed from appearing on the popup dialog.
564
+ if @requestOnArray.length >= 1
565
+ @requestOnComplex = 1
566
+ requestOnArgs = @requestOnArray.shift.split(',')
567
+ @requestOnArg1 = requestOnArgs.shift.chop
568
+ if requestOnArgs.length > 0
569
+ @requestOnArg2 = requestOnArgs.shift.chop
570
+
571
+ @builder["frameOnArg2"].visible = true
572
+ else
573
+ @builder["frameOnArg2"].visible = false
574
+ @requestOnValue2 = nil
575
+ end
576
+ if requestOnArgs.length > 0
577
+ @requestOnArg3 = requestOnArgs.shift.chop
578
+ @builder["frameOnArg3"].visible = true
579
+ else
580
+ @builder["frameOnArg3"].visible = false
581
+ @requestOnValue3 = nil
582
+ end
583
+ if requestOnArgs.length > 0
584
+ @requestOnArg4 = requestOnArgs.shift.chop
585
+ @builder["frameOnArg4"].visible = true
586
+ else
587
+ @builder["frameOnArg4"].visible = false
588
+ @requestOnValue4 = nil
589
+ end
590
+ if requestOnArgs.length > 0
591
+ @requestOnArg5 = requestOnArgs.shift.chop
592
+ @builder["frameOnArg5"].visible = true
593
+ else
594
+ @builder["frameOnArg5"].visible = false
595
+ @requestOnValue5 = nil
596
+ end
597
+ if requestOnArgs.length > 0
598
+ @requestOnArg6 = requestOnArgs.shift.chop
599
+ @builder["frameOnArg6"].visible = true
600
+ else
601
+ @builder["frameOnArg6"].visible = false
602
+ @requestOnValue6 = nil
603
+ end
604
+ if requestOnArgs.length > 0
605
+ @requestOnArg7 = requestOnArgs.shift.chop
606
+ @builder["frameOnArg7"].visible = true
607
+ else
608
+ @builder["frameOnArg7"].visible = false
609
+ @requestOnValue7 = nil
610
+ end
611
+ if requestOnArgs.length > 0
612
+ @requestOnArg8 = requestOnArgs.shift.chop
613
+ @builder["frameOnArg8"].visible = true
614
+ else
615
+ @builder["frameOnArg8"].visible = false
616
+ @requestOnValue8 = nil
617
+ end
618
+ if requestOnArgs.length > 0
619
+ @requestOnArg9 = requestOnArgs.shift.chop
620
+ @builder["frameOnArg9"].visible = true
621
+ else
622
+ @builder["frameOnArg9"].visible = false
623
+ @requestOnValue9 = nil
624
+ end
625
+ else
626
+ #Add JSON quote terminator is string is not empty
627
+ if !@savantRequestOn.to_s.empty?
628
+ @strRequestOn += %q{'}
629
+ end
630
+ @requestOnComplex = 0
631
+ end
632
+
633
+ #Repeat for Off
634
+ if @requestOffArray.length >= 1
635
+ @requestOffComplex = 1
636
+ requestOffArgs = @requestOffArray.shift.split(',')
637
+ @requestOffArg1 = requestOffArgs.shift.chop
638
+ if requestOffArgs.length > 0
639
+ @requestOffArg2 = requestOffArgs.shift.chop
640
+ @builder["frameOffArg2"].visible = true
641
+ else
642
+ @builder["frameOffArg2"].visible = false
643
+ @requestOffValue2 = nil
644
+ end
645
+ if requestOffArgs.length > 0
646
+ @requestOffArg3 = requestOffArgs.shift.chop
647
+ @builder["frameOffArg3"].visible = true
648
+ else
649
+ @builder["frameOffArg3"].visible = false
650
+ @requestOffValue3 = nil
651
+ end
652
+ if requestOffArgs.length > 0
653
+ @requestOffArg4 = requestOffArgs.shift.chop
654
+ @builder["frameOffArg4"].visible = true
655
+ else
656
+ @builder["frameOffArg4"].visible = false
657
+ @requestOffValue4 = nil
658
+ end
659
+ if requestOffArgs.length > 0
660
+ @requestOffArg5 = requestOffArgs.shift.chop
661
+ @builder["frameOffArg5"].visible = true
662
+ else
663
+ @builder["frameOffArg5"].visible = false
664
+ @requestOffValue5 = nil
665
+ end
666
+ if requestOffArgs.length > 0
667
+ @requestOffArg6 = requestOffArgs.shift.chop
668
+ @builder["frameOffArg6"].visible = true
669
+ else
670
+ @builder["frameOffArg6"].visible = false
671
+ @requestOffValue6 = nil
672
+ end
673
+ if requestOffArgs.length > 0
674
+ @requestOffArg7 = requestOffArgs.shift.chop
675
+ @builder["frameOffArg7"].visible = true
676
+ else
677
+ @builder["frameOffArg7"].visible = false
678
+ @requestOffValue7 = nil
679
+ end
680
+ if requestOffArgs.length > 0
681
+ @requestOffArg8 = requestOffArgs.shift.chop
682
+ @builder["frameOffArg8"].visible = true
683
+ else
684
+ @builder["frameOffArg8"].visible = false
685
+ @requestOffValue8 = nil
686
+ end
687
+ if requestOffArgs.length > 0
688
+ @requestOffArg9 = requestOffArgs.shift.chop
689
+ @builder["frameOffArg9"].visible = true
690
+ else
691
+ @builder["frameOffArg9"].visible = false
692
+ @requestOffValue9 = nil
693
+ end
694
+ else
695
+ @requestOffComplex = 0
696
+ if !@savantRequestOff.to_s.empty?
697
+ @strRequestOff += %q{'}
698
+ end
699
+ end
700
+
701
+ #Repeat for Dim
702
+ if @requestDimArray.length >= 1
703
+ @requestDimComplex = 1
704
+ requestDimArgs = @requestDimArray.shift.split(',')
705
+ @requestDimArg1 = requestDimArgs.shift.chop
706
+ if requestDimArgs.length > 0
707
+ @requestDimArg2 = requestDimArgs.shift.chop
708
+ @builder["frameDimArg2"].visible = true
709
+ else
710
+ @builder["frameDimArg2"].visible = false
711
+ @requestDimValue2 = nil
712
+ end
713
+ if requestDimArgs.length > 0
714
+ @requestDimArg3 = requestDimArgs.shift.chop
715
+ @builder["frameDimArg3"].visible = true
716
+ else
717
+ @builder["frameDimArg3"].visible = false
718
+ @requestDimValue3 = nil
719
+ end
720
+ if requestDimArgs.length > 0
721
+ @requestDimArg4 = requestDimArgs.shift.chop
722
+ @builder["frameDimArg4"].visible = true
723
+ else
724
+ @builder["frameDimArg4"].visible = false
725
+ @requestDimValue4 = nil
726
+ end
727
+ if requestDimArgs.length > 0
728
+ @requestDimArg5 = requestDimArgs.shift.chop
729
+ @builder["frameDimArg5"].visible = true
730
+ else
731
+ @builder["frameDimArg5"].visible = false
732
+ @requestDimValue5 = nil
733
+ end
734
+ if requestDimArgs.length > 0
735
+ @requestDimArg6 = requestDimArgs.shift.chop
736
+ @builder["frameDimArg6"].visible = true
737
+ else
738
+ @builder["frameDimArg6"].visible = false
739
+ @requestDimValue6 = nil
740
+ end
741
+ if requestDimArgs.length > 0
742
+ @requestDimArg7 = requestDimArgs.shift.chop
743
+ @builder["frameDimArg7"].visible = true
744
+ else
745
+ @builder["frameDimArg7"].visible = false
746
+ @requestDimValue7 = nil
747
+ end
748
+ if requestDimArgs.length > 0
749
+ @requestDimArg8 = requestDimArgs.shift.chop
750
+ @builder["frameDimArg8"].visible = true
751
+ else
752
+ @builder["frameDimArg8"].visible = false
753
+ @requestDimValue8 = nil
754
+ end
755
+ if requestDimArgs.length > 0
756
+ @requestDimArg9 = requestDimArgs.shift.chop
757
+ @builder["frameDimArg9"].visible = true
758
+ else
759
+ @builder["frameDimArg9"].visible = false
760
+ @requestDimValue9 = nil
761
+ end
762
+ else
763
+ @requestDimComplex = 0
764
+ if !@savantRequestDim.to_s.empty?
765
+ @strRequestDim += %q{'}
766
+ end
767
+ end
768
+
769
+ #Set all variables to UI before showing next window
770
+ set_glade_variables()
771
+
772
+ #Shows popup dialog for action argument value entry if needed, else finishes building the string and sends it to the HA Bridge.
773
+ if @requestOnComplex == 1
774
+ @builder["dialogOn"].show
775
+ elsif @requestOffComplex == 1
776
+ @builder["dialogOff"].show
777
+ elsif @requestDimComplex == 1
778
+ @builder["dialogDim"].show
779
+ else
780
+ sendHaRequest()
781
+ end
782
+
783
+ else
784
+ #If any errors were found, alert user.
785
+ alert @error
786
+ end
787
+ end
788
+
789
+ ##### Exit main program #####
790
+ def buttonExit__clicked(*args)
791
+ @builder["window1"].destroy
792
+ end
793
+
794
+ ##### #####
795
+ ##### Action argument windows #####
796
+ ##### #####
797
+
798
+ #For each On parameter field that is possible, check if user entered value, percent, or number, and push into arg/val array.
799
+ def buttonAcceptOn__clicked(*argv)
800
+ get_glade_variables()
801
+ if @requestOnValue1 == 'percent'
802
+ @requestOnValue1 = '${intensity.percent}'
803
+ elsif @requestOnValue1 == 'number'
804
+ @requestOnValue1 = '${intensity.byte}'
805
+ end
806
+ requestOnValues = [@requestOnArg1, @requestOnValue1]
807
+ unless @requestOnArg2.nil?
808
+ if @requestOnValue2 == 'percent'
809
+ @requestOnValue2 = '${intensity.percent}'
810
+ elsif @requestOnValue2 == 'number'
811
+ @requestOnValue2 = '${intensity.byte}'
812
+ end
813
+ requestOnValues.push(@requestOnArg2)
814
+ requestOnValues.push(@requestOnValue2)
815
+ end
816
+ unless @requestOnArg3.nil?
817
+ if @requestOnValue3 == 'percent'
818
+ @requestOnValue3 = '${intensity.percent}'
819
+ elsif @requestOnValue3 == 'number'
820
+ @requestOnValue3 = '${intensity.byte}'
821
+ end
822
+ requestOnValues.push(@requestOnArg3)
823
+ requestOnValues.push(@requestOnValue3)
824
+ end
825
+ unless @requestOnArg4.nil?
826
+ if @requestOnValue4 == 'percent'
827
+ @requestOnValue4 = '${intensity.percent}'
828
+ elsif @requestOnValue4 == 'number'
829
+ @requestOnValue4 = '${intensity.byte}'
830
+ end
831
+ requestOnValues.push(@requestOnArg4)
832
+ requestOnValues.push(@requestOnValue4)
833
+ end
834
+ unless @requestOnArg5.nil?
835
+ if @requestOnValue5 == 'percent'
836
+ @requestOnValue5 = '${intensity.percent}'
837
+ elsif @requestOnValue5 == 'number'
838
+ @requestOnValue5 = '${intensity.byte}'
839
+ end
840
+ requestOnValues.push(@requestOnArg5)
841
+ requestOnValues.push(@requestOnValue5)
842
+ end
843
+ unless @requestOnArg6.nil?
844
+ if @requestOnValue6 == 'percent'
845
+ @requestOnValue6 = '${intensity.percent}'
846
+ elsif @requestOnValue6 == 'number'
847
+ @requestOnValue6 = '${intensity.byte}'
848
+ end
849
+ requestOnValues.push(@requestOnArg6)
850
+ requestOnValues.push(@requestOnValue6)
851
+ end
852
+ unless @requestOnArg7.nil?
853
+ if @requestOnValue7 == 'percent'
854
+ @requestOnValue7 = '${intensity.percent}'
855
+ elsif @requestOnValue7 == 'number'
856
+ @requestOnValue7 = '${intensity.byte}'
857
+ end
858
+ requestOnValues.push(@requestOnArg7)
859
+ requestOnValues.push(@requestOnValue7)
860
+ end
861
+ unless @requestOnArg8.nil?
862
+ if @requestOnValue8 == 'percent'
863
+ @requestOnValue8 = '${intensity.percent}'
864
+ elsif @requestOnValue8 == 'number'
865
+ @requestOnValue8 = '${intensity.byte}'
866
+ end
867
+ requestOnValues.push(@requestOnArg8)
868
+ requestOnValues.push(@requestOnValue8)
869
+ end
870
+ unless @requestOnArg9.nil?
871
+ if @requestOnValue9 == 'percent'
872
+ @requestOnValue9 = '${intensity.percent}'
873
+ elsif @requestOnValue9 == 'number'
874
+ @requestOnValue9 = '${intensity.byte}'
875
+ end
876
+ requestOnValues.push(@requestOnArg9)
877
+ requestOnValues.push(@requestOnValue9)
878
+ end
879
+
880
+ #Create On request string by joining each arg/val from array with proper JSON syntax
881
+ @strRequestOn += '%20\\\'' + requestOnValues.join('\\\'%20\\\'') + '\\\''
882
+ @strRequestOn += %q{'}
883
+
884
+ #Hide On parameter window and check to see if Off or Dim commands had parameters, then show them. Else, send the string to the HA Bridge.
885
+ @builder["dialogOn"].hide
886
+ if @requestOffComplex == 0 && @requestDimComplex == 0
887
+ sendHaRequest()
888
+ elsif @requestOffComplex == 1
889
+ @builder["dialogOff"].show
890
+ elsif @requestDimComplex == 1
891
+ @builder["dialogDim"].show
892
+ end
893
+ end
894
+
895
+ def buttonCancelOn__clicked(*args)
896
+ @builder["dialogOn"].hide
897
+ end
898
+
899
+ ##### Repeat for off #####
900
+ def buttonAcceptOff__clicked(*argv)
901
+ get_glade_variables()
902
+ if @requestOffValue1 == 'percent'
903
+ @requestOffValue1 = '${intensity.percent}'
904
+ elsif @requestOffValue1 == 'number'
905
+ @requestOffValue1 = '${intensity.byte}'
906
+ end
907
+ requestOffValues = [@requestOffArg1, @requestOffValue1]
908
+ unless @requestOffArg2.nil?
909
+ if @requestOffValue2 == 'percent'
910
+ @requestOffValue2 = '${intensity.percent}'
911
+ elsif @requestOffValue2 == 'number'
912
+ @requestOffValue2 = '${intensity.byte}'
913
+ end
914
+ requestOffValues.push(@requestOffArg2)
915
+ requestOffValues.push(@requestOffValue2)
916
+ end
917
+ unless @requestOffArg3.nil?
918
+ if @requestOffValue3 == 'percent'
919
+ @requestOffValue3 = '${intensity.percent}'
920
+ elsif @requestOffValue3 == 'number'
921
+ @requestOffValue3 = '${intensity.byte}'
922
+ end
923
+ requestOffValues.push(@requestOffArg3)
924
+ requestOffValues.push(@requestOffValue3)
925
+ end
926
+ unless @requestOffArg4.nil?
927
+ if @requestOffValue4 == 'percent'
928
+ @requestOffValue4 = '${intensity.percent}'
929
+ elsif @requestOffValue4 == 'number'
930
+ @requestOffValue4 = '${intensity.byte}'
931
+ end
932
+ requestOffValues.push(@requestOffArg4)
933
+ requestOffValues.push(@requestOffValue4)
934
+ end
935
+ unless @requestOffArg5.nil?
936
+ if @requestOffValue5 == 'percent'
937
+ @requestOffValue5 = '${intensity.percent}'
938
+ elsif @requestOffValue5 == 'number'
939
+ @requestOffValue5 = '${intensity.byte}'
940
+ end
941
+ requestOffValues.push(@requestOffArg5)
942
+ requestOffValues.push(@requestOffValue5)
943
+ end
944
+ unless @requestOffArg6.nil?
945
+ if @requestOffValue6 == 'percent'
946
+ @requestOffValue6 = '${intensity.percent}'
947
+ elsif @requestOffValue6 == 'number'
948
+ @requestOffValue6 = '${intensity.byte}'
949
+ end
950
+ requestOffValues.push(@requestOffArg6)
951
+ requestOffValues.push(@requestOffValue6)
952
+ end
953
+ unless @requestOffArg7.nil?
954
+ if @requestOffValue7 == 'percent'
955
+ @requestOffValue7 = '${intensity.percent}'
956
+ elsif @requestOffValue7 == 'number'
957
+ @requestOffValue7 = '${intensity.byte}'
958
+ end
959
+ requestOffValues.push(@requestOffArg7)
960
+ requestOffValues.push(@requestOffValue7)
961
+ end
962
+ unless @requestOffArg8.nil?
963
+ if @requestOffValue8 == 'percent'
964
+ @requestOffValue8 = '${intensity.percent}'
965
+ elsif @requestOffValue8 == 'number'
966
+ @requestOffValue8 = '${intensity.byte}'
967
+ end
968
+ requestOffValues.push(@requestOffArg8)
969
+ requestOffValues.push(@requestOffValue8)
970
+ end
971
+ unless @requestOffArg9.nil?
972
+ if @requestOffValue9 == 'percent'
973
+ @requestOffValue9 = '${intensity.percent}'
974
+ elsif @requestOffValue9 == 'number'
975
+ @requestOffValue9 = '${intensity.byte}'
976
+ end
977
+ requestOffValues.push(@requestOffArg9)
978
+ requestOffValues.push(@requestOffValue9)
979
+ end
980
+ @strRequestOff += '%20\\\'' + requestOffValues.join('\\\'%20\\\'') + '\\\''
981
+ @strRequestOff += %q{'}
982
+ @builder["dialogOff"].hide
983
+ if @requestDimComplex == 1
984
+ @builder["dialogDim"].show
985
+ else
986
+ sendHaRequest()
987
+ end
988
+ end
989
+
990
+ ##### Close window #####
991
+ def buttonCancelOff__clicked(*args)
992
+ @builder["dialogOff"].hide
993
+ end
994
+
995
+ ##### Repeat for Dim #####
996
+ def buttonAcceptDim__clicked(*argv)
997
+ get_glade_variables()
998
+ if @requestDimValue1 == 'percent'
999
+ @requestDimValue1 = '${intensity.percent}'
1000
+ elsif @requestDimValue1 == 'number'
1001
+ @requestDimValue1 = '${intensity.byte}'
1002
+ end
1003
+ requestDimValues = [@requestDimArg1, @requestDimValue1]
1004
+ unless @requestDimArg2.nil?
1005
+ if @requestDimValue2 == 'percent'
1006
+ @requestDimValue2 = '${intensity.percent}'
1007
+ elsif @requestDimValue2 == 'number'
1008
+ @requestDimValue2 = '${intensity.byte}'
1009
+ end
1010
+ requestDimValues.push(@requestDimArg2)
1011
+ requestDimValues.push(@requestDimValue2)
1012
+ end
1013
+ unless @requestDimArg3.nil?
1014
+ if @requestDimValue3 == 'percent'
1015
+ @requestDimValue3 = '${intensity.percent}'
1016
+ elsif @requestDimValue3 == 'number'
1017
+ @requestDimValue3 = '${intensity.byte}'
1018
+ end
1019
+ requestDimValues.push(@requestDimArg3)
1020
+ requestDimValues.push(@requestDimValue3)
1021
+ end
1022
+ unless @requestDimArg4.nil?
1023
+ if @requestDimValue4 == 'percent'
1024
+ @requestDimValue4 = '${intensity.percent}'
1025
+ elsif @requestDimValue4 == 'number'
1026
+ @requestDimValue4 = '${intensity.byte}'
1027
+ end
1028
+ requestDimValues.push(@requestDimArg4)
1029
+ requestDimValues.push(@requestDimValue4)
1030
+ end
1031
+ unless @requestDimArg5.nil?
1032
+ if @requestDimValue5 == 'percent'
1033
+ @requestDimValue5 = '${intensity.percent}'
1034
+ elsif @requestDimValue5 == 'number'
1035
+ @requestDimValue5 = '${intensity.byte}'
1036
+ end
1037
+ requestDimValues.push(@requestDimArg5)
1038
+ requestDimValues.push(@requestDimValue5)
1039
+ end
1040
+ unless @requestDimArg6.nil?
1041
+ if @requestDimValue6 == 'percent'
1042
+ @requestDimValue6 = '${intensity.percent}'
1043
+ elsif @requestDimValue6 == 'number'
1044
+ @requestDimValue6 = '${intensity.byte}'
1045
+ end
1046
+ requestDimValues.push(@requestDimArg6)
1047
+ requestDimValues.push(@requestDimValue6)
1048
+ end
1049
+ unless @requestDimArg7.nil?
1050
+ if @requestDimValue7 == 'percent'
1051
+ @requestDimValue7 = '${intensity.percent}'
1052
+ elsif @requestDimValue7 == 'number'
1053
+ @requestDimValue7 = '${intensity.byte}'
1054
+ end
1055
+ requestDimValues.push(@requestDimArg7)
1056
+ requestDimValues.push(@requestDimValue7)
1057
+ end
1058
+ unless @requestDimArg8.nil?
1059
+ if @requestDimValue8 == 'percent'
1060
+ @requestDimValue8 = '${intensity.percent}'
1061
+ elsif @requestDimValue8 == 'number'
1062
+ @requestDimValue8 = '${intensity.byte}'
1063
+ end
1064
+ requestDimValues.push(@requestDimArg8)
1065
+ requestDimValues.push(@requestDimValue8)
1066
+ end
1067
+ unless @requestDimArg9.nil?
1068
+ if @requestDimValue9 == 'percent'
1069
+ @requestDimValue9 = '${intensity.percent}'
1070
+ elsif @requestDimValue9 == 'number'
1071
+ @requestDimValue9 = '${intensity.byte}'
1072
+ end
1073
+ requestDimValues.push(@requestDimArg9)
1074
+ requestDimValues.push(@requestDimValue9)
1075
+ end
1076
+ @strRequestDim += '%20\\\'' + requestDimValues.join('\\\'%20\\\'') + '\\\''
1077
+ @strRequestDim += %q{'}
1078
+ @builder["dialogDim"].hide
1079
+ sendHaRequest()
1080
+ end
1081
+
1082
+ ##### Close window #####
1083
+ def buttonCancelDim__clicked(*args)
1084
+ @builder["dialogDim"].hide
1085
+ end
1086
+
1087
+ ##### #####
1088
+ ##### Send commands to HA Bridge #####
1089
+ ##### #####
1090
+
1091
+ def sendHaRequest
1092
+
1093
+ #Build JSON string of On, Off, and Dim commands, if they exist.
1094
+ @haRequest = %q{\{'name' : '} + @haName + %q{','deviceType' : 'custom',}
1095
+ if !@strRequestOn.empty?
1096
+ @haRequest += @strRequestOn
1097
+ end
1098
+ if !@strRequestOff.empty?
1099
+ if !@strRequestOn.empty?
1100
+ @haRequest += ','
1101
+ end
1102
+ @haRequest += @strRequestOff
1103
+ end
1104
+ if !@strRequestDim.empty?
1105
+ if (!@strRequestOn.empty? || !@strRequestOff.empty?)
1106
+ @haRequest += ','
1107
+ end
1108
+ @haRequest += @strRequestDim
1109
+ end
1110
+ @haRequest += %q{\}}
1111
+
1112
+ #Debug alert "Host address = " + @savantURLstr + "\n\nHA Bridge address = " + @haURLstr + "\n\nDevice name = " + @haName + "\n\nOnCommand = " + @strRequestOn + "\n\nOffCommand = " + @strRequestOff + "\n\nDimCommand = " + @strRequestDim + "\n\nRequest String = " + @haRequest
1113
+
1114
+
1115
+ #Send JSON string to specified host IP. Alert user of any errors or success.
1116
+ uri = URI.parse(@haURLstr)
1117
+ begin
1118
+ http = Net::HTTP.start(uri.host, uri.port, {open_timeout: 3, read_timeout: 3})
1119
+ begin
1120
+ request = Net::HTTP::Post.new(
1121
+ uri.request_uri,
1122
+ 'Content-Type' => 'application/json'
1123
+ )
1124
+ request.body = @haRequest
1125
+ response = http.request(request)
1126
+ if response.code == "201"
1127
+ alert 'Command successfully added to HA Bridge.'
1128
+ elsif response.code.include?("4" || "5")
1129
+ alert 'Command failed to be added to HA Bridge.'
1130
+ end
1131
+ rescue Timeout::Error, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED
1132
+ alert "Unable to reach host."
1133
+ end
1134
+ rescue Timeout::Error, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED
1135
+ alert "Unable to reach host."
1136
+ end
1137
+
1138
+ #Reset variables for next command, preserving host IP
1139
+ @savantRequestOn = ''
1140
+ @savantRequestOff = ''
1141
+ @savantRequestDim = ''
1142
+
1143
+ @strRequestOn = ''
1144
+ @strRequestOff = ''
1145
+ @strRequestDim = ''
1146
+
1147
+ @requestOnValue1 = "percent"
1148
+ @requestOnValue2 = "percent"
1149
+ @requestOnValue3 = "percent"
1150
+ @requestOnValue4 = "percent"
1151
+ @requestOnValue5 = "percent"
1152
+ @requestOnValue6 = "percent"
1153
+ @requestOnValue7 = "percent"
1154
+ @requestOnValue8 = "percent"
1155
+ @requestOnValue9 = "percent"
1156
+
1157
+ @requestOffValue1 = "percent"
1158
+ @requestOffValue2 = "percent"
1159
+ @requestOffValue3 = "percent"
1160
+ @requestOffValue4 = "percent"
1161
+ @requestOffValue5 = "percent"
1162
+ @requestOffValue6 = "percent"
1163
+ @requestOffValue7 = "percent"
1164
+ @requestOffValue8 = "percent"
1165
+ @requestOffValue9 = "percent"
1166
+
1167
+ @requestDimValue1 = "percent"
1168
+ @requestDimValue2 = "percent"
1169
+ @requestDimValue3 = "percent"
1170
+ @requestDimValue4 = "percent"
1171
+ @requestDimValue5 = "percent"
1172
+ @requestDimValue6 = "percent"
1173
+ @requestDimValue7 = "percent"
1174
+ @requestDimValue8 = "percent"
1175
+ @requestDimValue9 = "percent"
1176
+ end
1177
+ end