node-red-contrib-loewe-tv 0.2.0

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.
package/lib/loewe.html ADDED
@@ -0,0 +1,31 @@
1
+ <script type="text/javascript">
2
+ RED.nodes.registerType('LOEWE-TV',{
3
+ category: 'function',
4
+ color: '#a6bbcf',
5
+ defaults: {
6
+ name: {value:""},
7
+ ip: {value:""}
8
+ },
9
+ inputs:1,
10
+ outputs:1,
11
+ icon: "file.png",
12
+ label: function() {
13
+ return this.name||"LOEWE-TV";
14
+ }
15
+ });
16
+ </script>
17
+
18
+ <script type="text/x-red" data-template-name="LOEWE-TV">
19
+ <div class="form-row">
20
+ <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
21
+ <input type="text" id="node-input-name" placeholder="LoeweTV">
22
+ </div>
23
+ <div class="form-row">
24
+ <label for="node-input-ip"><i class="icon-tag"></i> TV-IP</label>
25
+ <input type="text" id="node-input-ip" placeholder="192.168.0.180">
26
+ </div>
27
+ </script>
28
+
29
+ <script type="text/x-red" data-help-name="LOEWE-TV">
30
+ <p>Interface to Loewe TV for Node-Red</p>
31
+ </script>
package/lib/loewe.js ADDED
@@ -0,0 +1,433 @@
1
+ module.exports = function(RED) {
2
+
3
+ function LoeweTvNode(config) {
4
+ var node = this;
5
+ const Loewe = require('loewetv');
6
+
7
+ RED.nodes.createNode(node, config);
8
+
9
+ var LoeweTV = new Loewe(config.ip);
10
+ LoeweTV.name = node.name;
11
+
12
+ console.log('[', node.name, ']');
13
+ console.log(LoeweTV);
14
+
15
+ node.status({fill:"red",shape:"ring",text:"disconnected"});
16
+
17
+ LoeweTV.onAction = function(action, data) {
18
+
19
+ console.log('[' + node.name + '] ' + action);
20
+ switch ( action ) {
21
+ case "RequestAccess":
22
+ break;
23
+
24
+ case "Subscribe":
25
+ console.log(data);
26
+ break;
27
+
28
+ case "GetChannelList":
29
+ console.log(data);
30
+ break;
31
+
32
+ case "GetListOfChannelLists":
33
+ console.log(data);
34
+ break;
35
+
36
+ case "GetMediaItem":
37
+ console.log(data);
38
+ break;
39
+
40
+ case "GetMediaEvent":
41
+ console.log(data);
42
+ break;
43
+
44
+ case "GetCurrentEvent":
45
+ console.log(data);
46
+ break;
47
+
48
+ case "GetNextEvent":
49
+ console.log(data);
50
+ break;
51
+
52
+ case "GetFeature":
53
+ console.log(data);
54
+ break;
55
+
56
+ case "GetDeviceData":
57
+ console.log(data);
58
+ break;
59
+
60
+ case "GetChannelInfo":
61
+ console.log(data);
62
+ break;
63
+
64
+ case "GetCurrentPlayback":
65
+ console.log(data);
66
+ break;
67
+
68
+ case "GetVolume":
69
+ console.log(data);
70
+ break;
71
+
72
+ case "GetMute":
73
+ console.log(data);
74
+ break;
75
+
76
+ case "SetActionField":
77
+ console.log(data);
78
+ break;
79
+
80
+ case "SetVolume":
81
+ console.log(data);
82
+ break;
83
+
84
+ case "SetMute":
85
+ console.log(data);
86
+ break;
87
+
88
+ case "InjectRCKey":
89
+ console.log(data);
90
+ break;
91
+
92
+ case "Standby":
93
+ console.log(data);
94
+ break;
95
+
96
+ case "ActivateFeaturePackage":
97
+ console.log(data);
98
+ break;
99
+
100
+ case "CreateIterator":
101
+ console.log(data);
102
+ break;
103
+
104
+ default:
105
+ break;
106
+ }
107
+
108
+ };
109
+
110
+ node.on('input', function(msg) {
111
+ var action = msg.topic;
112
+ switch ( action ) {
113
+ case "RequestAccess":
114
+ LoeweTV.onEvent('alive');
115
+ break;
116
+ case "Subscribe":
117
+ LoeweTV.subscribe(LoeweTV.onAction);
118
+ break;
119
+ case "GetChannelList":
120
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
121
+ // LoeweTV.getChannelList(msg.payload, function(){});
122
+ break;
123
+
124
+ case "GetCurrentEvent":
125
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
126
+ // LoeweTV.getCurrentEvent(function(){});
127
+ break;
128
+
129
+ case "GetNextEvent":
130
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
131
+ // LoeweTV.getNextEvent(function(){});
132
+ break;
133
+
134
+ case "GetMediaItem":
135
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
136
+ // LoeweTV.getMediaItem(msg.payload, function(){});
137
+ break;
138
+
139
+ case "GetMediaEvent":
140
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
141
+ // LoeweTV.getMediaEvent(function(){});
142
+ break;
143
+
144
+ case "PlayerPrepare":
145
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
146
+ break;
147
+
148
+ case "PlayerReleasePrepared":
149
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
150
+ break;
151
+
152
+ case "PlayerPlay":
153
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
154
+ break;
155
+
156
+ case "PlayerPause":
157
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
158
+ break;
159
+
160
+ case "PlayerResume":
161
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
162
+ break;
163
+
164
+ case "PlayerStop":
165
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
166
+ break;
167
+
168
+ case "PlayerSetSpeed":
169
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
170
+ break;
171
+
172
+ case "PlayerSeekTo":
173
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
174
+ break;
175
+
176
+ case "GetVolume":
177
+ LoeweTV.getVolume(LoeweTV.onAction);
178
+ break;
179
+
180
+ case "SetVolume":
181
+ LoeweTV.setVolume(msg.payload, LoeweTV.onAction);
182
+ break;
183
+
184
+ case "GetMute":
185
+ LoeweTV.getMute(LoeweTV.onAction);
186
+ break;
187
+
188
+ case "SetMute":
189
+ LoeweTV.setMute(msg.payload, LoeweTV.onAction);
190
+ break;
191
+
192
+ case "Standby":
193
+ // LoeweTV.standby(msg.payload, LoeweTV.onAction);
194
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
195
+ break;
196
+
197
+ case "ProgramTimer":
198
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
199
+ break;
200
+
201
+ case "GetDeviceData":
202
+ LoeweTV.getDeviceData(LoeweTV.onAction);
203
+ break;
204
+
205
+ case "GetValueFromBrowserJS":
206
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
207
+ break;
208
+
209
+ case "GetBrowserJSChangeList":
210
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
211
+ break;
212
+
213
+ case "SetValueToBrowserJS":
214
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
215
+ break;
216
+
217
+ case "GetCurrentPlayback":
218
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
219
+ break;
220
+
221
+ case "GetCurrentStatus":
222
+ LoeweTV.getCurrentStatus(LoeweTV.onAction);
223
+ break;
224
+
225
+ case "ZapToApplication":
226
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
227
+ break;
228
+
229
+ case "ZapToMedia":
230
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
231
+ break;
232
+
233
+ case "InjectRCKey":
234
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
235
+ break;
236
+
237
+ case "InjectRCKey":
238
+ LoeweTV.injectRCKey(msg.payload, LoeweTV.onAction);
239
+ break;
240
+
241
+ case "InjectKeyboardKey":
242
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
243
+ break;
244
+
245
+ case "SetActionField":
246
+ LoeweTV.setActionField(msg.payload, LoeweTV.onAction);
247
+ break;
248
+
249
+ case "GetActionField":
250
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
251
+ break;
252
+
253
+ case "GetFeature":
254
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
255
+ // LoeweTV.getFeature(function(){});
256
+ break;
257
+
258
+ case "ActivateFeaturePackage":
259
+ LoeweTV.activateFeaturePackage(msg.payload, LoeweTV.onAction);
260
+ break;
261
+
262
+ case "DectivateFeaturePackage":
263
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
264
+ break;
265
+
266
+ case "GetUpgradeInfo":
267
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
268
+ break;
269
+
270
+ case "GetListOfChannelLists":
271
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
272
+ // LoeweTV.getListOfChannelLists(function(){});
273
+ break;
274
+
275
+ case "AddFavoriteList":
276
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
277
+ break;
278
+
279
+ case "RemoveFavoriteList":
280
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
281
+ break;
282
+ case "RenameFavoriteList":
283
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
284
+ break;
285
+
286
+ case "AddServicesFavoriteList":
287
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
288
+ break;
289
+
290
+ case "RemoveServicesFavoriteList":
291
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
292
+ break;
293
+
294
+ case "MoveServicesFavoriteList":
295
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
296
+ break;
297
+
298
+ case "AddFavoriteListFromVirtual":
299
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
300
+ break;
301
+
302
+ case "GetListOfVirtualLists":
303
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
304
+ break;
305
+
306
+ case "ImportServiceLists":
307
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
308
+ break;
309
+
310
+ case "ExportServiceLists":
311
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
312
+ break;
313
+
314
+ case "GetDRPlusArchive":
315
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
316
+ break;
317
+
318
+ case "GetVolumes":
319
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
320
+ break;
321
+
322
+ case "PlayMultiroom":
323
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
324
+ break;
325
+
326
+ case "GetSettings":
327
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
328
+ break;
329
+
330
+ case "SetSetting":
331
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
332
+ break;
333
+
334
+ case "ParentalLock":
335
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
336
+ break;
337
+
338
+ case "GetParentalLock":
339
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
340
+ break;
341
+
342
+ case "GetTimerList":
343
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
344
+ break;
345
+
346
+ case "CreateIterator":
347
+ LoeweTV.createIterator(LoeweTV.onAction);
348
+ break;
349
+
350
+ case "CloseIterator":
351
+ LoeweTV.execAction(action, '', LoeweTV.onAction);
352
+ break;
353
+ default:
354
+ break;
355
+ }
356
+ });
357
+
358
+ LoeweTV.updateNodeStatus = function() {
359
+ var statusFill ='';
360
+ console.log('[' + node.name + '] updateNodeStatus');
361
+
362
+ switch (LoeweTV.Status.Power) {
363
+ case "idle":
364
+ statusFill = "blue";
365
+ break;
366
+ case "standby":
367
+ statusFill = "yellow";
368
+ break;
369
+ case "switch_on":
370
+ case "tv":
371
+ statusFill = "green";
372
+ break;
373
+ default:
374
+ statusFill = "grey";
375
+ break;
376
+ }
377
+ node.status({fill:statusFill,shape:"ring",text:"ClientId: " + LoeweTV.ClientId});
378
+ var newmsg = { payload:LoeweTV.name, ClientId:LoeweTV.ClientId, Status:LoeweTV.Status.Power, topic:'Status' };
379
+ node.send(newmsg);
380
+ };
381
+
382
+ LoeweTV.onEvent = function(event) {
383
+ var self = this;
384
+ node.debug('[' + node.name + '] received Event:' + event);
385
+
386
+ if (event === 'alive') {
387
+ node.debug('[' + node.name + '] handle Event:' + event);
388
+ // if (LoeweTV.ClientId === '') {
389
+ if (LoeweTV.Status.Power === 'idle' || LoeweTV.Status.Power !== 'idle') {
390
+ LoeweTV.RequestAccess(function() {
391
+ console.log('[', node.name, '] Registriere ClientId: ', LoeweTV.ClientId);
392
+ console.log('[', node.name, '] SDDP uuid: ', LoeweTV.uuid);
393
+ // LoeweTV.subscribe(function(){
394
+ LoeweTV.getSettings(function(){
395
+ LoeweTV.activateFeaturePackage('72413U80', function(){
396
+ LoeweTV.getDeviceData(function(){
397
+ LoeweTV.createIterator(function(){
398
+ LoeweTV.getVolume(function(){
399
+ LoeweTV.getMute(function(){
400
+ LoeweTV.getCurrentStatus(function(){
401
+ LoeweTV.updateNodeStatus();
402
+ });
403
+ });
404
+ });
405
+ });
406
+ });
407
+ });
408
+ });
409
+
410
+ // });
411
+ });
412
+ }
413
+ node.debug('[' + node.name + '] handle Event:' + event + 'ok');
414
+ }
415
+ else if (event === 'byebye') {
416
+ node.debug('[' + node.name + '] handle Event:' + event);
417
+ if (LoeweTV.Status.Power === 'tv') {
418
+ console.log('[', node.name, '] schaltet ab');
419
+ LoeweTV.getCurrentStatus(LoeweTV.updateNodeStatus);
420
+ // LoeweTV.ClientId = '';
421
+ }
422
+ node.debug('[' + node.name + '] handle Event:' + event + 'ok');
423
+ }
424
+ else {
425
+ node.warn('[' + node.name + '] received unhandeld Event');
426
+ }
427
+ node.debug('[' + node.name + '] received Event OK');
428
+ };
429
+
430
+ LoeweTV.onEvent('alive');
431
+ }
432
+ RED.nodes.registerType("LOEWE-TV", LoeweTvNode);
433
+ };
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "node-red-contrib-loewe-tv",
3
+ "version": "0.2.0",
4
+ "description": "Node-red node to control Loewe TV",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "author": {
9
+ "name": "Carsten Tenbrink",
10
+ "email": "tenner@ctlab.de",
11
+ "url": "https://gitlab.catlab.de/tenner/node-red-contrib-loewe-tv.git"
12
+ },
13
+ "dependencies": {
14
+ "loewetv": "^0.2.1"
15
+ },
16
+ "license": "MIT",
17
+ "keywords": [
18
+ "node-red",
19
+ "tv",
20
+ "loewe",
21
+ "bild",
22
+ "control"
23
+ ],
24
+ "homepage": "https://gitlab.catlab.de/tenner/node-red-contrib-loewe-tv.git",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://gitlab.catlab.de/tenner/node-red-contrib-loewe-tv.git"
28
+ },
29
+ "node-red": {
30
+ "nodes": {
31
+ "LOEWE-TV": "lib/loewe.js"
32
+ }
33
+ }
34
+ }
package/test/alive.py ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env python2
2
+ import socket
3
+ import sys
4
+
5
+ dst = "239.255.255.250"
6
+ if len(sys.argv) > 1:
7
+ dst = sys.argv[1]
8
+ st = "upnp:rootdevice"
9
+ if len(sys.argv) > 2:
10
+ st = sys.argv[2]
11
+
12
+ msg = [
13
+ 'NOTIFY * HTTP/1.1',
14
+ 'CONFIGID.UPNP.ORG: 1545',
15
+ 'SEARCHPORT.UPNP.ORG: 62944',
16
+ 'BOOTID.UPNP.ORG: 1818059600',
17
+ 'MAXVERSION.UPNP.ORG: 1',
18
+ 'LOCATION: http://10.10.30.190:1545/happy',
19
+ 'HOST: 239.255.255.250:1900',
20
+ 'SERVER: UPnP/1.0 AwoX/1.1',
21
+ 'NTS: ssdp:alive',
22
+ 'USN: uuid:25ccc874-1dd2-11b2-9cab-0009821cf741::upnp:rootdevice',
23
+ 'CACHE-CONTROL: max-age=1800',
24
+ 'NT: upnp:rootdevice',
25
+ '']
26
+
27
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
28
+ s.settimeout(10)
29
+ s.sendto('\r\n'.join(msg), (dst, 1900) )
30
+
package/test/byebye.py ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env python2
2
+ import socket
3
+ import sys
4
+
5
+ dst = "239.255.255.250"
6
+ if len(sys.argv) > 1:
7
+ dst = sys.argv[1]
8
+ st = "upnp:rootdevice"
9
+ if len(sys.argv) > 2:
10
+ st = sys.argv[2]
11
+
12
+ msg = [
13
+ 'CONFIGID.UPNP.ORG: 1543',
14
+ 'BOOTID.UPNP.ORG: 1',
15
+ 'MAXVERSION.UPNP.ORG: 1',
16
+ 'HOST: 239.255.255.250:1900',
17
+ 'NTS: ssdp:byebye',
18
+ 'USN: uuid:25ccc874-1dd2-11b2-9cab-0009821cf741',
19
+ 'NT: uuid:25ccc874-1dd2-11b2-9cab-0009821cf741',
20
+ '']
21
+
22
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
23
+ s.settimeout(1)
24
+ s.sendto('\r\n'.join(msg), (dst, 1900) )