1 | import * as devices from '@domojs/devices';
|
2 | import * as akala from '@akala/server';
|
3 | import * as api from './api'
|
4 | const log = akala.log('domojs:pioneer');
|
5 |
|
6 | akala.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 |