The files contained in this repository can be downloaded to your computer using a svn client.
On Linux you simply type the command displayed below.

This URL has Read-Only access.

Statistics
| Revision:

root / trunk / DomotiGaServer / CXMLRPC.class @ 672

History | View | Annotate | Download (24.2 kB)

1
' Gambas class file
2
3
' Description:
4
' CXMLRPC.class
5
' Built-in XML-RPC server.
6
7
' Development Status:
8
' Just started.
9
10
' DomotiGa - an open source home automation program.
11
' Copyright(C) 2008-2011 Ron Klinkien
12
13
' Read file called COPYING for license details.
14
15
PROPERTY HTTPPort AS Integer
16
PROPERTY MaxConn AS Integer
17
PROPERTY XMLRPCDebug AS Boolean
18
19
PRIVATE iHTTPPort AS Integer
20
PRIVATE iMaxConn AS Integer
21
PRIVATE bXMLRPCDebug AS Boolean
22
23
PUBLIC hXMLRPC AS RpcServer
24
PRIVATE APIVersion AS String = "0.09"
25
26
PUBLIC FUNCTION Connect() AS Boolean
27
28
  DIM hRpcFunc AS RpcFunction
29
30
  hXMLRPC = NEW RpcServer AS "hXMLRPC"
31
32
  ' start method definitions
33
  hRpcFunc = NEW RpcFunction("system.program_uptime", NULL, XmlRpc.xString)
34
  hRpcFunc.Help = ("returns the program uptime.")
35
  hXMLRPC.Register(hRpcFunc)
36
  hRpcFunc = NEW RpcFunction("system.program_version", NULL, XmlRpc.xString)
37
  hRpcFunc.Help = ("returns the program version.")
38
  hXMLRPC.Register(hRpcFunc)
39
  hRpcFunc = NEW RpcFunction("api.version", NULL, XmlRpc.xString)
40
  hRpcFunc.Help = ("returns the api version.")
41
  hXMLRPC.Register(hRpcFunc)
42
  hRpcFunc = NEW RpcFunction("system.pid", NULL, XmlRpc.xString)
43
  hRpcFunc.Help = ("returns the process id.")
44
  hXMLRPC.Register(hRpcFunc)
45
  hRpcFunc = NEW RpcFunction("system.hostname", NULL, XmlRpc.xString)
46
  hRpcFunc.Help = ("returns the hostname.")
47
  hXMLRPC.Register(hRpcFunc)
48
  hRpcFunc = NEW RpcFunction("data.newmessages", NULL, XmlRpc.xArray)
49
  hRpcFunc.Help = ("returns new mails, calls and voicemails.")
50
  hXMLRPC.Register(hRpcFunc)
51
  hRpcFunc = NEW RpcFunction("data.sunmoon", NULL, XmlRpc.xArray)
52
  hRpcFunc.Help = ("returns sun and moon data.")
53
  hXMLRPC.Register(hRpcFunc)
54
  hRpcFunc = NEW RpcFunction("mode.get_housemode", NULL, XmlRpc.xString)
55
  hRpcFunc.Help = ("returns the house mode.")
56
  hXMLRPC.Register(hRpcFunc)
57
  hRpcFunc = NEW RpcFunction("mode.get_mutemode", NULL, XmlRpc.xBoolean)
58
  hRpcFunc.Help = ("returns the mute mode.")
59
  hXMLRPC.Register(hRpcFunc)
60
  hRpcFunc = NEW RpcFunction("globalvar.list", NULL, XmlRpc.xArray)
61
  hRpcFunc.Help = ("returns a list of global variables.")
62
  hXMLRPC.Register(hRpcFunc)
63
  hRpcFunc = NEW RpcFunction("device.list", NULL, XmlRpc.xStruct)
64
  hRpcFunc.Help = ("returns a list of devices.")
65
  hXMLRPC.Register(hRpcFunc)
66
  hRpcFunc = NEW RpcFunction("device.listswitch", NULL, XmlRpc.xStruct)
67
  hRpcFunc.Help = ("returns a list of devices which can be switched.")
68
  hXMLRPC.Register(hRpcFunc)
69
  hRpcFunc = NEW RpcFunction("device.listdim", NULL, XmlRpc.xStruct)
70
  hRpcFunc.Help = ("returns a list of devices which can be dimmed.")
71
  hXMLRPC.Register(hRpcFunc)
72
  hRpcFunc = NEW RpcFunction("module.restart", [XmlRpc.xString], XmlRpc.xBoolean)
73
  hRpcFunc.Help = ("reload config and restart module param1.")
74
  hXMLRPC.Register(hRpcFunc)
75
  hRpcFunc = NEW RpcFunction("send.email", [XmlRpc.xString, XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
76
  hRpcFunc.Help = ("send email to param1, with subject param2 and body param3.")
77
  hXMLRPC.Register(hRpcFunc)
78
  hRpcFunc = NEW RpcFunction("send.tweet", [XmlRpc.xString], XmlRpc.xBoolean)
79
  hRpcFunc.Help = ("send tweet with param1 as contents.")
80
  hXMLRPC.Register(hRpcFunc)
81
  hRpcFunc = NEW RpcFunction("send.sms", [XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
82
  hRpcFunc.Help = ("send sms to param1, with param2 as contents.")
83
  hXMLRPC.Register(hRpcFunc)
84
  hRpcFunc = NEW RpcFunction("set.housemode", [XmlRpc.xString], XmlRpc.xBoolean)
85
  hRpcFunc.Help = ("set house mode to param1.")
86
  hXMLRPC.Register(hRpcFunc)
87
  hRpcFunc = NEW RpcFunction("set.mutemode", [XmlRpc.xBoolean], XmlRpc.xBoolean)
88
  hRpcFunc.Help = ("set mute mode to param1.")
89
  hXMLRPC.Register(hRpcFunc)
90
  hRpcFunc = NEW RpcFunction("device.setdevice", [XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
91
  hRpcFunc.Help = ("set device param1 with value param2.")
92
  hXMLRPC.Register(hRpcFunc)
93
  hRpcFunc = NEW RpcFunction("set.alarmpin", [XmlRpc.xString], XmlRpc.xBoolean)
94
  hRpcFunc.Help = ("set alarm pin to param1.")
95
  hXMLRPC.Register(hRpcFunc)
96
  hRpcFunc = NEW RpcFunction("set.alarmmode", [XmlRpc.xString], XmlRpc.xBoolean)
97
  hRpcFunc.Help = ("set alarm mode to param1.")
98
  hXMLRPC.Register(hRpcFunc)
99
  hRpcFunc = NEW RpcFunction("play.sound", [XmlRpc.xString, XmlRpc.xInteger], XmlRpc.xBoolean)
100
  hRpcFunc.Help = ("play sound param1 with volume param2.")
101
  hXMLRPC.Register(hRpcFunc)
102
  hRpcFunc = NEW RpcFunction("voicetext.speak", [XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
103
  hRpcFunc.Help = ("speak text param1 with voice param2.")
104
  hXMLRPC.Register(hRpcFunc)
105
  hRpcFunc = NEW RpcFunction("pachube.list", NULL, XmlRpc.xString)
106
  hRpcFunc.Help = ("get pachube device list in eeml.")
107
  hXMLRPC.Register(hRpcFunc)
108
  hRpcFunc = NEW RpcFunction("rrdtool.listgraphs", NULL, XmlRpc.xString)
109
  hRpcFunc.Help = ("get list of rrdtool graph images in group param1.")
110
  hXMLRPC.Register(hRpcFunc)
111
  hRpcFunc = NEW RpcFunction("rrdtool.updategraphs", [XmlRpc.xString, XmlRpc.xString], XmlRpc.xString)
112
  hRpcFunc.Help = ("update rrdtool graph images in group param1.")
113
  hXMLRPC.Register(hRpcFunc)
114
  hRpcFunc = NEW RpcFunction("rrdtool.createrrds", [XmlRpc.xString], XmlRpc.xBoolean)
115
  hRpcFunc.Help = ("create rrdtool database for device id param1.")
116
  hXMLRPC.Register(hRpcFunc)
117
  hRpcFunc = NEW RpcFunction("display.ledmessage", [XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
118
  hRpcFunc.Help = ("display message param2 on display with id param1.")
119
  hXMLRPC.Register(hRpcFunc)
120
  hRpcFunc = NEW RpcFunction("av.setcontrol", [XmlRpc.xString, XmlRpc.xString, XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
121
  hRpcFunc.Help = ("set audio/video param1 with command param2, value param3, address param4.")
122
  hXMLRPC.Register(hRpcFunc)
123
  hRpcFunc = NEW RpcFunction("av.getcontrol", [XmlRpc.xString, XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
124
  hRpcFunc.Help = ("get audio/video param1 setting param2, address param3.")
125
  hXMLRPC.Register(hRpcFunc)
126
  hRpcFunc = NEW RpcFunction("globalvar.save", NULL, XmlRpc.xBoolean)
127
  hRpcFunc.Help = ("saves global variables to database.")
128
  hXMLRPC.Register(hRpcFunc)
129
  hRpcFunc = NEW RpcFunction("globalvar.get", NULL, XmlRpc.xArray)
130
  hRpcFunc.Help = ("returns a list of global variables with values.")
131
  hXMLRPC.Register(hRpcFunc)
132
  hRpcFunc = NEW RpcFunction("globalvar.set", [XmlRpc.xString, XmlRpc.xString], XmlRpc.xBoolean)
133
  hRpcFunc.Help = ("set global variable param1 to param2.")
134
  hXMLRPC.Register(hRpcFunc)
135
  hRpcFunc = NEW RpcFunction("zwave.removenodes", NULL, XmlRpc.xBoolean)
136
  hRpcFunc.Help = ("zwave remove all nodes.")
137
  hXMLRPC.Register(hRpcFunc)
138
  hRpcFunc = NEW RpcFunction("zwave.createnode", [XmlRpc.xInteger, XmlRpc.xInteger, XmlRpc.xInteger, XmlRpc.xInteger, XmlRpc.xInteger, XmlRpc.xInteger, XmlRpc.xBoolean], XmlRpc.xBoolean)
139
  hRpcFunc.Help = ("zwave create node.")
140
  hXMLRPC.Register(hRpcFunc)
141
  hRpcFunc = NEW RpcFunction("zwave.setids", [XmlRpc.xInteger, XmlRpc.xInteger], XmlRpc.xBoolean)
142
  hRpcFunc.Help = ("zwave set ids.")
143
  hXMLRPC.Register(hRpcFunc)
144
  hRpcFunc = NEW RpcFunction("zwave.basicreport", [XmlRpc.xInteger, XmlRpc.xInteger, XmlRpc.xInteger], XmlRpc.xBoolean)
145
  hRpcFunc.Help = ("zwave basic report.")
146
  hXMLRPC.Register(hRpcFunc)
147
  hRpcFunc = NEW RpcFunction("zwave.allqueried", NULL, XmlRpc.xBoolean)
148
  hRpcFunc.Help = ("zwave all queried.")
149
  hXMLRPC.Register(hRpcFunc)
150
  hRpcFunc = NEW RpcFunction("cmdr.culsimulate", NULL, XmlRpc.xString)
151
  hRpcFunc.Help = ("cmdr inject cul packet in simulator.")
152
  hXMLRPC.Register(hRpcFunc)
153
  hRpcFunc = NEW RpcFunction("cmdr.culqueuecommand", NULL, XmlRpc.xString)
154
  hRpcFunc.Help = ("cmdr queue cul command.")
155
  hXMLRPC.Register(hRpcFunc)
156
  TRY hXMLRPC.Listen(iHTTPPort, iMaxConn)
157
158
  IF NOT hXMLRPC.Listening THEN
159
    RETURN FALSE
160
  END IF
161
  RETURN TRUE
162
163
END
164
165
' shutdown our xmlrpc server
166
PUBLIC SUB Disconnect()
167
168
  hXMLRPC.Stop()
169
170
END
171
172
PRIVATE SUB ReturnDeviceListDimSwitch(sType AS String)
173
174
  DIM rResult AS Result
175
  DIM sString AS NEW Collection
176
  DIM sList AS NEW RpcStruct
177
  DIM sStatusIcon AS String
178
  DIM iCnt AS Integer
179
180
  rResult = Main.hDB.Exec("SELECT * FROM devices WHERE enabled is TRUE")
181
182
  IF NOT rResult.Available THEN
183
    Main.WriteLog(("Error: table 'devices' not found!"))
184
    RETURN
185
  END IF
186
187
  FOR iCnt = 0 TO rResult.Count - 1
188
    IF NOT rResult!hide THEN
189
      IF (sType = "switchable" AND rResult!switchable) OR (sType = "dimable" AND rResult!dimable) THEN
190
        ' status icon
191
        IF rResult!onicon OR rResult!officon THEN
192
          IF UCase$(rResult!value) = "ON" OR UCase$(rResult!value) = "OPEN" OR UCase$(rResult!value) = "MOTION" THEN
193
            sStatusIcon = rResult!onicon
194
          ELSE
195
            sStatusIcon = rResult!officon
196
          END IF
197
        END IF
198
        sString[iCnt] = rResult!id & ";;" & sStatusIcon & ";;" & rResult!name & ";;" & rResult!value
199
        sList.Add(rResult!name, sString[iCnt], XmlRpc.xString)
200
      END IF
201
    END IF
202
    rResult.MoveNext
203
  NEXT
204
205
  hXMLRPC.SetReply(sList)
206
207
END
208
209
PRIVATE SUB ModuleRestart(sParams AS Variant[])
210
211
  IF sParams.Count = 1 THEN
212
    Main.GetSettings()
213
    TRY Object.Call(Main, "Restart_" & sParams[0])
214
    IF ERROR THEN
215
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when restarting module!"))
216
      hXMLRPC.SetReply(FALSE)
217
    ELSE
218
      hXMLRPC.SetReply(TRUE)
219
    END IF
220
  ELSE
221
    hXMLRPC.SetReply(FALSE)
222
  END IF
223
224
END
225
226
PRIVATE SUB SendEmail(sParams AS Variant[])
227
228
  IF sParams.Count = 3 THEN
229
    TRY Mail.SendMail(sParams[1], sParams[2], sParams[0])
230
    IF ERROR THEN
231
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when sending an e-mail!"))
232
      hXMLRPC.SetReply(FALSE)
233
    ELSE
234
      hXMLRPC.SetReply(TRUE)
235
    END IF
236
  ELSE
237
    hXMLRPC.SetReply(FALSE)
238
  END IF
239
240
END
241
242
PRIVATE SUB SendTweet(sParams AS Variant[])
243
244
  IF sParams.Count = 1 THEN
245
    TRY Twitter.PostTweet(sParams[0])
246
    IF ERROR THEN
247
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when sending an Tweet!"))
248
      hXMLRPC.SetReply(FALSE)
249
    ELSE
250
      hXMLRPC.SetReply(TRUE)
251
    END IF
252
  ELSE
253
    hXMLRPC.SetReply(FALSE)
254
  END IF
255
256
END
257
258
PRIVATE SUB SendSMS(sParams AS Variant[])
259
260
  IF sParams.Count = 2 THEN
261
    TRY Main.hSMS.SendSMS(sParams[1], sParams[0])
262
    IF ERROR THEN
263
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when sending an SMS!"))
264
      hXMLRPC.SetReply(FALSE)
265
    ELSE
266
      hXMLRPC.SetReply(TRUE)
267
    END IF
268
  ELSE
269
    hXMLRPC.SetReply(FALSE)
270
  END IF
271
272
END
273
274
PRIVATE SUB SetHouseMode(sParams AS Variant[])
275
276
  IF sParams.Count = 1 THEN
277
    IF InStr("normal away vacation work", sParams[0]) THEN
278
      TRY Main.ChangeHouseMode(sParams[0])
279
      IF ERROR THEN
280
        Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when setting House mode!"))
281
        hXMLRPC.SetReply(FALSE)
282
      ELSE
283
        hXMLRPC.SetReply(TRUE)
284
      END IF
285
    END IF
286
  ELSE
287
    hXMLRPC.SetReply(FALSE)
288
  END IF
289
290
END
291
292
PRIVATE SUB SetAlarmMode(sParams AS Variant[])
293
294
  IF sParams.Count = 1 THEN
295
    IF InStr("0311 0301", sParams[0]) THEN
296
      IF Main.hDSC THEN TRY Main.hDSC.TX(sParams[0])
297
      IF ERROR THEN
298
        Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when setting Alarm mode!"))
299
        hXMLRPC.SetReply(FALSE)
300
      ELSE
301
        hXMLRPC.SetReply(TRUE)
302
      END IF
303
    END IF
304
  ELSE
305
    hXMLRPC.SetReply(FALSE)
306
  END IF
307
308
END
309
310
PRIVATE SUB SetAlarmPin(sParams AS Variant[])
311
312
  IF sParams.Count = 1 THEN
313
    IF Main.hDSC THEN TRY Main.hDSC.TX("0401" & sParams[0])
314
    IF ERROR THEN
315
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when setting Alarm pin!"))
316
      hXMLRPC.SetReply(FALSE)
317
    ELSE
318
      hXMLRPC.SetReply(TRUE)
319
    END IF
320
  ELSE
321
    hXMLRPC.SetReply(FALSE)
322
  END IF
323
324
END
325
326
PRIVATE SUB SetMuteMode(sParams AS Variant[])
327
328
  IF sParams.Count = 1 THEN
329
    TRY Main.ChangeMuteMode(sParams[0])
330
    IF ERROR THEN
331
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when setting Mute mode!"))
332
      hXMLRPC.SetReply(FALSE)
333
    ELSE
334
      hXMLRPC.SetReply(TRUE)
335
    END IF
336
  ELSE
337
    hXMLRPC.SetReply(FALSE)
338
  END IF
339
340
END
341
342
PRIVATE SUB DeviceSetDevice(sParams AS Variant[])
343
344
  IF sParams.Count = 2 THEN
345
    TRY Devices.SetDevice(sParams[0], sParams[1])
346
    IF ERROR THEN
347
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when setting device value!"))
348
      hXMLRPC.SetReply(FALSE)
349
    ELSE
350
      hXMLRPC.SetReply(TRUE)
351
    END IF
352
  ELSE
353
    hXMLRPC.SetReply(FALSE)
354
  END IF
355
356
END
357
358
PRIVATE SUB ReturnDeviceList()
359
360
  DIM rResult, rResult3 AS Result
361
  DIM sString AS NEW Collection
362
  DIM sList AS NEW RpcStruct
363
  DIM iCnt AS Integer
364
  DIM sStatusIcon, sLastseen, sValue, sValue2, sValue3, sValue4 AS String
365
366
  rResult = Main.hDB.Exec("SELECT * FROM devices WHERE enabled is TRUE")
367
368
  IF NOT rResult.Available THEN
369
    Main.WriteLog(("Error: table 'devices' not found!"))
370
    RETURN
371
  END IF
372
373
  FOR iCnt = 0 TO rResult.Count - 1
374
    IF NOT rResult!hide THEN
375
      ' status icon
376
      IF rResult!onicon OR rResult!officon THEN
377
        IF UCase$(rResult!value) = "ON" OR UCase$(rResult!value) = "OPEN" OR UCase$(rResult!value) = "MOTION" THEN
378
          sStatusIcon = rResult!onicon
379
        ELSE
380
          sStatusIcon = rResult!officon
381
        END IF
382
      ELSE
383
        sStatusIcon = ""
384
      END IF
385
      ' location
386
      TRY rResult3 = Main.hDB.Exec("SELECT * FROM locations WHERE id = &1", rResult!location)
387
      ' last seen
388
      IF rResult!lastseen THEN
389
        sLastSeen = Replace$(Str$(Format(rResult!lastseen, "yyyy-mm-dd hh:nn:ss")), Format(Date(), "yyyy-mm-dd") & " ", "")
390
      ELSE
391
        sLastSeen = "Never"
392
      END IF
393
394
      sValue = rResult!value
395
      TRY sValue = (sValue / rResult!divider) + rResult!calibration
396
      sValue2 = rResult!value2
397
      TRY sValue2 = (sValue2 / rResult!divider2) + rResult!calibration2
398
      sValue3 = rResult!value3
399
      TRY sValue3 = (sValue3 / rResult!divider3) + rResult!calibration3
400
      sValue4 = rResult!value4
401
      TRY sValue4 = (sValue4 / rResult!divider4) + rResult!calibration4
402
403
      sString[iCnt] = rResult!id & ";;" & sStatusIcon & ";;" & rResult!name & ";;" & rResult3!name & ";;" & sValue & ";;" & rResult!label & ";;" & sValue2 & ";;" & rResult!label2 & ";;" & sValue3 & ";;" & rResult!label3 & ";;" & sValue4 & ";;" & rResult!label4 & ";;" & sLastSeen
404
      sList.Add(rResult!name, sString[iCnt], XmlRpc.xString)
405
    END IF
406
    rResult.MoveNext
407
  NEXT
408
409
  hXMLRPC.SetReply(sList)
410
411
END
412
413
PRIVATE SUB PlaySound(sParams AS Variant[])
414
415
  IF sParams.Count > 1 AND IF sParams.Count < 3 THEN
416
    TRY Sounds.PlaySnd(sParams[0], sParams[1])
417
    IF ERROR THEN
418
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when playing sound!"))
419
      hXMLRPC.SetReply(FALSE)
420
    ELSE
421
      hXMLRPC.SetReply(TRUE)
422
    END IF
423
  ELSE
424
    hXMLRPC.SetReply(FALSE)
425
  END IF
426
427
END
428
429
PRIVATE SUB VoiceTextSpeak(sParams AS Variant[])
430
431
  IF sParams.Count > 1 AND IF sParams.Count < 3 THEN
432
    TRY VoiceText.Speak(sParams[0], sParams[1])
433
    IF ERROR THEN
434
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when speaking voicetext!"))
435
      hXMLRPC.SetReply(FALSE)
436
    ELSE
437
      hXMLRPC.SetReply(TRUE)
438
    END IF
439
  ELSE
440
    hXMLRPC.SetReply(FALSE)
441
  END IF
442
443
END
444
445
PRIVATE SUB RRDToolListGraphs(sParams AS Variant[])
446
447
  IF sParams.Count = 1 THEN
448
    TRY RRDTool.Graphs(sParams[0])
449
    IF ERROR THEN
450
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when listing rrdtool graphs!"))
451
      hXMLRPC.SetReply(FALSE)
452
    ELSE
453
      hXMLRPC.SetReply(TRUE)
454
    END IF
455
  ELSE
456
    hXMLRPC.SetReply(FALSE)
457
  END IF
458
459
END
460
461
PRIVATE SUB RRDToolUpdateGraphs(sParams AS Variant[])
462
463
  IF sParams.Count = 2 THEN
464
    TRY RRDTool.CreateGraphs(sParams[0], sParams[1])
465
    TRY RRDTool.CreateExtGraphs(sParams[0], sParams[1])
466
    IF ERROR THEN
467
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when creating rrdtool graphs!"))
468
      hXMLRPC.SetReply(FALSE)
469
    ELSE
470
      hXMLRPC.SetReply(TRUE)
471
    END IF
472
  ELSE
473
    hXMLRPC.SetReply(FALSE)
474
  END IF
475
476
END
477
478
PRIVATE SUB RRDToolCreateRRDs(sParams AS Variant[])
479
480
  IF sParams.Count = 1 THEN
481
    TRY RRDTool.CreateRRDs(sParams[0])
482
    IF ERROR THEN
483
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when creating rrdtool database!"))
484
      hXMLRPC.SetReply(FALSE)
485
    ELSE
486
      hXMLRPC.SetReply(TRUE)
487
    END IF
488
  ELSE
489
    hXMLRPC.SetReply(FALSE)
490
  END IF
491
492
END
493
494
PRIVATE SUB DisplayLEDMessage(sParams AS Variant[])
495
496
  IF sParams.Count = 2 THEN
497
    TRY Main.hLEDMatrix.DisplayMessage(sParams[0], sParams[1])
498
    IF ERROR THEN
499
      Main.WriteDebugLog(("XMLRPC Error: '" & ERROR.Text & "' at '" & Error.Where & "' when displaying a message!"))
500
      hXMLRPC.SetReply(FALSE)
501
    ELSE
502
      hXMLRPC.SetReply(TRUE)
503
    END IF
504
  ELSE
505
    hXMLRPC.SetReply(FALSE)
506
  END IF
507
508
END
509
510
PRIVATE SUB SetAVControl(sParams AS Variant[])
511
512
  IF sParams.Count = 4 THEN
513
    TRY AVControl.Set(sParams[0], sParams[1], sParams[2], sParams[3])
514
    IF ERROR THEN
515
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when setting audio/video control!"))
516
      hXMLRPC.SetReply(FALSE)
517
    ELSE
518
      hXMLRPC.SetReply(TRUE)
519
    END IF
520
  ELSE
521
    hXMLRPC.SetReply(FALSE)
522
  END IF
523
524
END
525
526
PRIVATE SUB GetAVControl(sParams AS Variant[])
527
528
  IF sParams.Count = 2 THEN
529
    TRY AVControl.Get(sParams[0], sParams[1], sParams[2])
530
    IF ERROR THEN
531
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when getting audio/video control!"))
532
      hXMLRPC.SetReply(FALSE)
533
    ELSE
534
      hXMLRPC.SetReply(TRUE)
535
    END IF
536
  ELSE
537
    hXMLRPC.SetReply(FALSE)
538
  END IF
539
540
END
541
542
PRIVATE SUB GetGlobalVars()
543
544
  DIM vValue AS Variant
545
  DIM aArray AS NEW RpcArray
546
547
  FOR EACH vValue IN Main.GlobalVar
548
    aArray.Add(Main.GlobalVar.Key, XmlRpc.xString)
549
    aArray.Add(vValue, XmlRpc.xString)
550
  NEXT
551
  hXMLRPC.SetReply(aArray)
552
553
END
554
555
PRIVATE SUB SetGlobalVar(sParams AS Variant[])
556
557
  IF sParams.Count = 2 THEN
558
    TRY Main.SetGlobalVar(sParams[0], sParams[1])
559
    IF ERROR THEN
560
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' when setting globalvar!"))
561
      hXMLRPC.SetReply(FALSE)
562
    ELSE
563
      hXMLRPC.SetReply(TRUE)
564
    ENDIF
565
  ELSE
566
    hXMLRPC.SetReply(FALSE)
567
  ENDIF
568
569
END
570
571
PRIVATE SUB SaveGlobalVars()
572
573
  TRY Main.SaveGlobalVars()
574
  IF ERROR THEN
575
    Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' when saving globalvars!"))
576
    hXMLRPC.SetReply(FALSE)
577
  ELSE
578
    hXMLRPC.SetReply(TRUE)
579
  ENDIF
580
581
END
582
583
PRIVATE SUB ZWaveRemoveNodes(sParams AS Variant[])
584
585
  TRY Main.hZWave.RemoveNodes()
586
  IF ERROR THEN
587
    Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when removing zwave nodes"))
588
    hXMLRPC.SetReply(FALSE)
589
  ELSE
590
    hXMLRPC.SetReply(TRUE)
591
  END IF
592
593
END
594
595
PRIVATE SUB ZWaveCreateNode(sParams AS Variant[])
596
597
  IF sParams.Count = 7 THEN
598
    TRY Main.hZWave.CreateNode(sParams[0], sParams[1], sParams[2], sParams[3], sParams[4], sParams[5], sParams[6])
599
    IF ERROR THEN
600
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when creating a zwave node!"))
601
      hXMLRPC.SetReply(FALSE)
602
    ELSE
603
      hXMLRPC.SetReply(TRUE)
604
    END IF
605
  ELSE
606
    hXMLRPC.SetReply(FALSE)
607
  END IF
608
609
END
610
611
PRIVATE SUB ZWaveSetIds(sParams AS Variant[])
612
613
  IF sParams.Count = 2 THEN
614
    TRY Main.hZWave.OZW_SetIds(sParams[0], sParams[1])
615
    IF ERROR THEN
616
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when setting zwave ids!"))
617
      hXMLRPC.SetReply(FALSE)
618
    ELSE
619
      hXMLRPC.SetReply(TRUE)
620
    END IF
621
  ELSE
622
    hXMLRPC.SetReply(FALSE)
623
  END IF
624
625
END
626
627
PRIVATE SUB ZWaveBasicReport(sParams AS Variant[])
628
629
  IF sParams.Count = 3 THEN
630
    TRY Main.hZWave.OZW_BasicReport(sParams[0], sParams[1], sParams[2])
631
    IF ERROR THEN
632
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when handling zwave basic report!"))
633
      hXMLRPC.SetReply(FALSE)
634
    ELSE
635
      hXMLRPC.SetReply(TRUE)
636
    END IF
637
  ELSE
638
    hXMLRPC.SetReply(FALSE)
639
  END IF
640
641
END
642
643
PRIVATE SUB CULSimulate(sParams AS Variant[])
644
645
  IF sParams.Count = 1 THEN
646
    IF Main.hCUL THEN TRY Main.hCUL.Simulate(sParams[0])
647
    IF ERROR THEN
648
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when injecting CUL packet!"))
649
      hXMLRPC.SetReply(FALSE)
650
    ELSE
651
      hXMLRPC.SetReply(TRUE)
652
    END IF
653
  ELSE
654
    hXMLRPC.SetReply(FALSE)
655
  END IF
656
657
END
658
659
PRIVATE SUB CULqueuecommand(sParams AS Variant[])
660
661
  IF sParams.Count = 1 THEN
662
    IF Main.hCUL THEN TRY Main.hCUL.QueueCommand(sParams[0])
663
    IF ERROR THEN
664
      Main.WriteDebugLog(("XMLRPC Error: '" & Error.Text & "' at '" & Error.Where & "' when queueing CUL command!"))
665
      hXMLRPC.SetReply(FALSE)
666
    ELSE
667
      hXMLRPC.SetReply(TRUE)
668
    END IF
669
  ELSE
670
    hXMLRPC.SetReply(FALSE)
671
  END IF
672
673
END
674
675
PUBLIC SUB hXMLRPC_RemoteCall(sName AS String, sData AS Variant[])
676
677
  DIM vValue AS Variant
678
  DIM aArray AS NEW RpcArray
679
  DIM sParam AS String
680
  DIM iParam AS Integer
681
682
  IF bXMLRPCDebug THEN
683
    Main.WriteDebugLog(("[XMLRPC] Got a RemoteCall for method '" & sName & "'"))
684
    FOR EACH sParam IN sData
685
      Main.WriteDebugLog(("[XMLRPC] Param[" & iParam & "] = '" & sParam & "'"))
686
      INC iParam
687
    NEXT
688
  ENDIF
689
690
  SELECT CASE sName
691
    CASE "system.program_uptime"
692
      hXMLRPC.SetReply(Main.GlobalVar["Program_Uptime"])
693
    CASE "system.program_version"
694
      hXMLRPC.SetReply(Main.sProgramVersion)
695
    CASE "system.pid"
696
      hXMLRPC.SetReply(Application.Id)
697
    CASE "system.hostname"
698
      hXMLRPC.SetReply(System.Host)
699
    CASE "api.version"
700
      hXMLRPC.SetReply(APIVersion)
701
    CASE "mode.get_housemode"
702
      hXMLRPC.SetReply(Main.GlobalVar["House_Mode"])
703
    CASE "mode.get_mutemode"
704
      hXMLRPC.SetReply(Main.GlobalVar["Mute"])
705
    CASE "globalvar.list"
706
      FOR EACH vValue IN Main.GlobalVar
707
        aArray.Add(Main.GlobalVar.Key, XmlRpc.xString)
708
      NEXT
709
      hXMLRPC.SetReply(aArray)
710
    CASE "globalvar.get"
711
      GetGlobalVars()
712
    CASE "set.globalvar"
713
      SetGlobalVar(sData)
714
    CASE "globalvar.save"
715
      SaveGlobalVars()
716
    CASE "data.sunmoon"
717
      aArray.Add(Main.GlobalVar["Sunrise"], XmlRpc.xString)
718
      aArray.Add(Main.GlobalVar["Sunset"], XmlRpc.xString)
719
      hXMLRPC.SetReply(aArray)
720
    CASE "data.newmessages"
721
      aArray.Add(Main.iNewMails, XmlRpc.xString)
722
      aArray.Add(Main.iNewCalls, XmlRpc.xString)
723
      aArray.Add(Main.iNewVoicemails, XmlRpc.xString)
724
      hXMLRPC.SetReply(aArray)
725
    CASE "device.list"
726
      ReturnDeviceList()
727
    CASE "device.listswitch"
728
      ReturnDeviceListDimSwitch("switchable")
729
    CASE "device.listdim"
730
      ReturnDeviceListDimSwitch("dimable")
731
    CASE "module.restart"
732
      ModuleRestart(sData)
733
    CASE "send.email"
734
      SendEmail(sData)
735
    CASE "send.tweet"
736
      SendTweet(sData)
737
    CASE "send.sms"
738
      SendSMS(sData)
739
    CASE "set.housemode"
740
      SetHouseMode(sData)
741
    CASE "set.mutemode"
742
      SetMuteMode(sData)
743
    CASE "set.alarmpin"
744
      SetAlarmPin(sData)
745
    CASE "set.alarmmode"
746
      SetAlarmMode(sData)
747
    CASE "device.setdevice"
748
      DeviceSetDevice(sData)
749
    CASE "play.sound"
750
      PlaySound(sData)
751
    CASE "voicetext.speak"
752
      VoiceTextSpeak(sData)
753
    CASE "pachube.list"
754
      hXMLRPC.SetReply(Pachube.CreatePachubeData())
755
    CASE "rrdtool.listgraphs"
756
      RRDToolListGraphs(sData)
757
    CASE "rrdtool.updategraphs"
758
      RRDToolUpdateGraphs(sData)
759
    CASE "rrdtool.createrrds"
760
      RRDToolCreateRRDs(sData)
761
    CASE "display.ledmessage"
762
      DisplayLEDMessage(sData)
763
    CASE "av.setcontrol"
764
      SetAVControl(sData)
765
    CASE "av.getcontrol"
766
      GetAVControl(sData)
767
    CASE "zwave.removenodes"
768
      ZWaveRemoveNodes(sData)
769
    CASE "zwave.createnode"
770
      ZWaveCreateNode(sData)
771
    CASE "zwave.setids"
772
      ZWaveSetIds(sData)
773
    CASE "zwave.basicreport"
774
      ZWaveBasicReport(sData)
775
    CASE "zwave.allqueried"
776
      Main.hZWave.OZW_AllQueried()
777
      hXMLRPC.SetReply(TRUE)
778
    CASE "cmdr.culsimulate"
779
      CULSimulate(sData)
780
    CASE "cmdr.culqueuecommand"
781
      CULqueuecommand(sData)
782
    DEFAULT
783
      RETURN
784
  END SELECT
785
786
END
787
788
PRIVATE FUNCTION HTTPPort_Read() AS Integer
789
790
  RETURN iHTTPPort
791
792
END
793
794
PRIVATE SUB HTTPPort_Write(Value AS Integer)
795
796
  iHTTPPort = Value
797
798
END
799
800
PRIVATE FUNCTION MaxConn_Read() AS Integer
801
802
  RETURN iMaxConn
803
804
END
805
806
PRIVATE SUB MaxConn_Write(Value AS Integer)
807
808
  iMaxConn = Value
809
810
END
811
812
PRIVATE FUNCTION XMLRPCDebug_Read() AS Boolean
813
814
  RETURN bXMLRPCDebug
815
816
END
817
818
PRIVATE SUB XMLRPCDebug_Write(Value AS Boolean)
819
820
  bXMLRPCDebug = Value
821
822
END