savant-echo 0.1.9 → 0.1.91

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 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