UNPKG

8.47 kBPlain TextView Raw
1import * as devices from '@domojs/devices';
2import * as akala from '@akala/server';
3import * as api from './api'
4const log = akala.log('domojs:pioneer');
5
6akala.worker.createClient('devices').then(function (c)
7{
8 var deviceCollection: { [name: string]: devices.devices.IDevice } = {};
9 akala.injectWithName(['$worker'], function (worker)
10 {
11 function getMainDevice(name)
12 {
13 var indexOfDot = name.indexOf('.');
14 if (indexOfDot > 0)
15 var mainDevice = name.substr(0, indexOfDot);
16 else
17 var mainDevice = name;
18
19 return deviceCollection[mainDevice];
20 }
21
22 var client = akala.api.jsonrpcws(devices.deviceType).createClient(c, {
23 exec: function (p)
24 {
25 var cmd = p.command;
26 var mainDevice = getMainDevice(p.device);
27 if (p.device != mainDevice.name)
28 {
29 switch (p.device.substring(mainDevice.name.length + 1))
30 {
31 case 'power':
32 if (p.command == 'off')
33 cmd = 'PF'
34 else
35 cmd = 'PO'
36 break;
37 case 'mute':
38 if (p.command == 'off')
39 cmd = 'MF';
40 else
41 cmd = 'MO';
42 break;
43 case 'volume':
44 switch (p.command)
45 {
46 case 'up':
47 cmd = 'VU';
48 break;
49 case 'down':
50 cmd = 'VD';
51 break;
52 case 'set':
53 cmd = 'VL';
54 break;
55 }
56 break;
57 case 'input':
58 switch (p.command)
59 {
60 case 'Game':
61 cmd = '49FN';
62 break;
63 case 'Dvd':
64 cmd = '04FN';
65 break;
66 case 'Sat/Cbl':
67 cmd = '06FN';
68 break;
69 case 'Dvr/Bdr':
70 cmd = '15FN';
71 break;
72 case 'iPod':
73 cmd = '17FN';
74 break;
75 case 'Video':
76 cmd = '10FN';
77 break;
78 case 'BD':
79 cmd = '25FN';
80 break;
81 }
82 break;
83 }
84 }
85 return api.send(cmd, mainDevice['address']).then((result) => undefined);
86 },
87 getStatus: function (device)
88 {
89 var mainDevice = getMainDevice(device.device);
90
91 if (mainDevice.name == device.device)
92 return Promise.resolve(mainDevice.status());
93 else
94 return Promise.resolve(mainDevice.subdevices[device.device.substring(mainDevice.name.length + 1)].status());
95 },
96 save: (p) =>
97 {
98 if (p.device.name.indexOf('.') > -1)
99 return p.device;
100 deviceCollection[p.device.name] = p.device;
101 p.device['address'] = p.body.IP || p.device.name;
102 p.device.statusMethod = 'pull';
103 p.device.subdevices = [
104 {
105 name: "power",
106 type: 'pioneer',
107 category: 'switch',
108 classes: ['power', 'switch'],
109 statusMethod: 'pull',
110 status: function ()
111 {
112 return api.send('?P', p.device.name).then(function (result)
113 {
114 console.log('result:' + result);
115 if (result)
116 result = result.trim();
117 return { state: result == 'PWR0', color: result == 'PWR0' ? 'green' : 'red' };
118 });
119 },
120 commands: ['on', 'off']
121 },
122 {
123 name: "mute",
124 type: 'pioneer',
125 category: 'switch',
126 statusMethod: 'pull',
127 status: function ()
128 {
129 console.log('mute status');
130 return api.send('?M', p.device.name).then((result) =>
131 {
132 console.log(result);
133 return { state: result == 'MUT0', color: result == 'MUT0' ? 'green' : 'red' };
134 });
135 },
136 commands: ['on', 'off']
137 },
138 {
139 name: "volume",
140 type: 'pioneer',
141 category: 'input',
142 statusMethod: 'pull',
143 status: function ()
144 {
145 var status = {};
146 return api.send('?V', p.device.name).then(function (result)
147 {
148 return { state: Number(/\d+/.exec(result)) * 100 / 185 };
149 });
150 },
151 commands: ['up', 'down', 'set']
152 },
153 {
154 name: "input",
155 type: 'pioneer',
156 category: 'values',
157 statusMethod: 'pull',
158 status: function ()
159 {
160 return api.send('?FN', p.device.name).then(function (result)
161 {
162 console.log(result);
163 switch (Number(/[0-9]+/.exec(result)))
164 {
165 case 49:
166 return { state: 'Game' };
167 case 25:
168 return { state: 'BD' };
169 case 4:
170 return { state: 'Dvd' };
171 case 6:
172 return { state: 'Sat/Cbl' };
173 case 15:
174 return { state: 'Dvr/Bdr' };
175 case 17:
176 return { state: 'iPod' };
177 case 10:
178 return { state: 'Video' };
179 default:
180 return null;
181 }
182 });
183 },
184 commands: ['Game', 'Dvd', 'Sat/Cbl', 'Dvr/Bdr', 'iPod', 'Video', 'BD']
185 }
186 ]
187 return p.device;
188 }
189 });
190
191 worker.on('ready', function ()
192 {
193 client.$proxy().register({ commandMode: 'dynamic', name: 'pioneer', view: '/@domojs/pioneer/device.html' });
194 });
195 })();
196});
\No newline at end of file