Skip to content

Commit 369fb58

Browse files
committed
heckbox for model 2016 added
- KEY_POWEROFF for model >= 2016 changed to KEY_POWER - CheckBox for model >= 2016 will be set automaticly on the first start. - off state added. Power command will be send only if TV is running.
1 parent fed5db0 commit 369fb58

File tree

4 files changed

+132
-37
lines changed

4 files changed

+132
-37
lines changed

io-package.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
{
22
"common": {
33
"name": "samsung",
4-
"version": "0.2.4",
4+
"version": "0.2.5",
55
"news": {
6+
"0.2.5": {
7+
"en": "Checkbox for model 2016 added",
8+
"de": "Checkbox für Modelle ab 2016 hinzugefügt"
9+
},
610
"0.2.4": {
711
"en": "Support for 2016 devices removed for Node version lower 4.0.0",
812
"de": "Unterstützung für 2016er Geräte entfernt wenn Node version kleiner 4.0.0."

keys.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ var Keys = {
2222
'KEY_CH_LIST': 'Channel List',
2323
'KEY_PRECH': 'Previous Channel',
2424
'KEY_PICTURE_SIZE': 'Picture Size',
25-
25+
2626
'Input': null,
2727
'KEY_TV': 'TV',
2828
'KEY_HDMI': 'HDMI',

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "iobroker.samsung",
3-
"version": "0.2.4",
3+
"version": "0.2.5",
44
"description": "Samsung Adapter",
55
"author": {
66
"name": "soef",
@@ -28,7 +28,7 @@
2828
},
2929
"dependencies": {
3030
"samsung-remote": "^1.2.5",
31-
"ws": "^2.3.1"
31+
"ws": "^2.3.1"
3232
},
3333
"devDependencies": {
3434
"grunt": "^0.4.5",

samsung.js

+124-33
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function isOn (callback) {
2222

2323
var nodeVersion;
2424
function minNodeVersion (minVersion) {
25-
var re = /^v*([0-9]+)\.([0-9]+).([0-9]+)/;
25+
var re = /^v*([0-9]+)\.([0-9]+)\.([0-9]+)/;
2626
if (nodeVersion === undefined) {
2727
var nv = re.exec (process.version);
2828
nodeVersion = nv[1]*100*100 + nv[2] * 100 + nv[3];
@@ -32,25 +32,75 @@ function minNodeVersion (minVersion) {
3232
return nodeVersion >= mv;
3333
}
3434

35+
function setStateNe(id, val, ack) {
36+
adapter.getState(id, function (err, obj) {
37+
if (obj && (obj.val !== val || obj.ack !== !!ack)) {
38+
adapter.setState(id, val, true);
39+
}
40+
});
41+
}
42+
3543
var checkOnOffTimer;
3644
function checkPowerOnOff () {
3745
if (checkOnOffTimer) clearTimeout(checkOnOffTimer);
3846
var cnt = 0, lastOn;
3947
(function check() {
4048
isOn (function (on) {
4149
if (lastOn !== on) {
42-
if (on) adapter.setState (powerOnOffState, 'ON', true); // uppercase indicates final on state.
50+
if (on) {
51+
adapter.setState (powerOnOffState, 'ON', true); // uppercase indicates final on state.
52+
setStateNe ('Power.on', true, true);
53+
}
4354
adapter.setState (powerOnOffState, on ? 'on' : 'off', true);
4455
lastOn = on;
4556
}
4657
if (!on) {
47-
if (cnt < 10) checkOnOffTimer = setTimeout (check, 1000);
48-
else adapter.setState (powerOnOffState, 'OFF', true); // uppercase indicates final off state.
58+
if (cnt < 20) {
59+
checkOnOffTimer = setTimeout (check, 1000);
60+
}
61+
else {
62+
adapter.setState (powerOnOffState, 'OFF', true); // uppercase indicates final off state.
63+
setStateNe ('Power.on', false, true);
64+
}
4965
}
5066
});
5167
})();
5268
}
5369

70+
71+
var onOffTimer;
72+
function onOn(val) {
73+
var timeout = 0, self = this;
74+
val = !!val;
75+
76+
isOn (function (running) {
77+
if (running === val) {
78+
adapter.setState ('Power.on', val, true);
79+
return;
80+
}
81+
send(remote.powerKey);
82+
if (onOffTimer) clearTimeout(onOffTimer);
83+
var cnt = 0;
84+
85+
function doIt () {
86+
onOffTimer = null;
87+
if (cnt++ >= 20) {
88+
adapter.setState ('Power.on', running, true);
89+
return;
90+
}
91+
isOn (function (running) {
92+
if (running === val) {
93+
adapter.setState ('Power.on', val, true);
94+
return;
95+
}
96+
//if (cnt === 1 && val) adapter.setState ('Power.on', running, true);
97+
onOffTimer = setTimeout(doIt, 1000);
98+
});
99+
}
100+
doIt ();
101+
});
102+
}
103+
54104
var adapter = utils.adapter({
55105
name: 'samsung',
56106

@@ -74,7 +124,7 @@ var adapter = utils.adapter({
74124

75125
if (state && !state.ack) {
76126
var as = id.split('.');
77-
if (as[0] + '.' + as[1] != adapter.namespace) return;
127+
if (as[0] + '.' + as[1] !== adapter.namespace) return;
78128
switch (as[2]) {
79129
case 'command':
80130
send (state.val, function callback (err) {
@@ -83,15 +133,15 @@ var adapter = utils.adapter({
83133
}
84134
});
85135
break;
86-
136+
87137
case 'Power':
88138
switch (as[3]) {
89-
// case 'powerOn':
90-
// send('KEY_POWERON');
91-
// return;
92-
// case 'powerOff':
93-
// send('KEY_POWEROFF');
94-
// return;
139+
//case 'on':
140+
// onOn(state.val);
141+
// break;
142+
case 'off':
143+
onOn(false);
144+
break;
95145
case 'checkOnOff':
96146
case 'checkOn':
97147
checkPowerOnOff();
@@ -114,7 +164,6 @@ var adapter = utils.adapter({
114164
}
115165
},
116166
ready: function () {
117-
//g_devices.init(adapter, main);
118167
main();
119168
}
120169
});
@@ -128,8 +177,8 @@ function send(command, callback) {
128177
}
129178

130179

131-
function createObj(name, val, type, role) {
132-
180+
function createObj(name, val, type, role, desc) {
181+
133182
if (role === undefined) role = type !== "channel" ? "button" : "";
134183
adapter.setObjectNotExists(name, {
135184
type: type,
@@ -140,16 +189,29 @@ function createObj(name, val, type, role) {
140189
def: false,
141190
read: true,
142191
write: true,
143-
values: [false, true]
192+
values: [false, true],
193+
desc: desc
144194
},
145195
native: { command: val }
146196
}, "", function (err, obj) {
147197
if (type !== "channel") adapter.setState(name, false, true);
148198
});
149199
}
150200

151-
function main() {
152-
201+
202+
function saveModel2016(val, callback) {
203+
adapter.getForeignObject("system.adapter." + adapter.namespace, function (err, obj) {
204+
if (!err && obj && !obj.native) obj['native'] = {};
205+
if (obj.native.model2016 === val) return callback && callback();
206+
obj.native.model2016 = val;
207+
adapter.config.model2016 = val;
208+
adapter.setForeignObject(obj._id, obj, {}, function (err, s_obj) {
209+
callback && callback('changed');
210+
});
211+
});
212+
}
213+
214+
function createObjectsAndStates() {
153215
var commandValues = [];
154216
var channel;
155217
for (var key in Keys) {
@@ -163,20 +225,9 @@ function main() {
163225
}
164226
}
165227
createObj ('Power.checkOn', '', 'state', 'state');
166-
remote = new SamsungRemote ({ip: adapter.config.ip});
167-
168-
if (nodeVersion4) {
169-
remote2016 = new Samsung2016 ({ip: adapter.config.ip, timeout: 2000});
170-
remote2016.onError = function (error) {
171-
}.bind (remote2016);
172-
remote2016.send (undefined, function (err, data) {
173-
if (err === 'success') {
174-
remote = remote2016;
175-
}
176-
});
177-
}
228+
createObj ('Power.off', false, 'state', 'state', 'Only if TV is on the power command will be send');
178229

179-
adapter.setObjectNotExists('command', {
230+
adapter.setObject /*NotExists*/('command', {
180231
type: 'state',
181232
common: {
182233
name: 'command',
@@ -186,7 +237,8 @@ function main() {
186237
values: commandValues,
187238
states: commandValues
188239
},
189-
native: {}
240+
native: {
241+
}
190242
}, "", function (err, obj) {
191243
adapter.setState("command", "", true/*{ ack: true }*/);
192244
});
@@ -198,10 +250,49 @@ function main() {
198250
role: 'state',
199251
desc: "checks if powered or not. Can be set to any value (ack=false). If ack becomes true, val holds the status"
200252
},
201-
native: {}
253+
native: {
254+
ts: new Date().getTime()
255+
}
202256
}, "", function (err, obj) {
203257
adapter.setState(powerOnOffState, "", true/*{ ack: true }*/);
204258
});
259+
205260
checkPowerOnOff();
261+
}
262+
263+
264+
265+
function main() {
266+
267+
if (adapter.config.model2016 === true && !nodeVersion4) {
268+
adapter.log.error('Model >= 2016 requires node version 4 or above!');
269+
return;
270+
}
271+
272+
if (adapter.config.model2016 !== true) {
273+
remote = new SamsungRemote ({ip: adapter.config.ip});
274+
remote.powerKey = 'KEY_POWEROFF';
275+
if (adapter.config.model2016 === false) createObjectsAndStates();
276+
}
277+
278+
if (nodeVersion4 && adapter.config.model2016 !== false) {
279+
remote2016 = new Samsung2016 ({ip: adapter.config.ip, timeout: 2000});
280+
remote2016.onError = function (error) {
281+
}.bind (remote2016);
282+
remote2016.send (undefined, function (err, data) {
283+
if (adapter.config.model2016 === undefined) saveModel2016(err === 'success');
284+
if (err === 'success' || adapter.config.model2016 === true) {
285+
remote = remote2016;
286+
remote.powerKey = 'KEY_POWER';
287+
Keys.KEY_POWER = Keys.KEY_POWEROFF;
288+
delete Keys.KEY_POWEROFF;
289+
createObjectsAndStates();
290+
}
291+
});
292+
}
293+
setTimeout(function() {
294+
if (adapter.config.model2016 === undefined) createObjectsAndStates();
295+
}, 3000);
296+
206297
adapter.subscribeStates('*');
207298
}

0 commit comments

Comments
 (0)