@@ -22,7 +22,7 @@ function isOn (callback) {
22
22
23
23
var nodeVersion ;
24
24
function minNodeVersion ( minVersion ) {
25
- var re = / ^ v * ( [ 0 - 9 ] + ) \. ( [ 0 - 9 ] + ) .( [ 0 - 9 ] + ) / ;
25
+ var re = / ^ v * ( [ 0 - 9 ] + ) \. ( [ 0 - 9 ] + ) \ .( [ 0 - 9 ] + ) / ;
26
26
if ( nodeVersion === undefined ) {
27
27
var nv = re . exec ( process . version ) ;
28
28
nodeVersion = nv [ 1 ] * 100 * 100 + nv [ 2 ] * 100 + nv [ 3 ] ;
@@ -32,25 +32,75 @@ function minNodeVersion (minVersion) {
32
32
return nodeVersion >= mv ;
33
33
}
34
34
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
+
35
43
var checkOnOffTimer ;
36
44
function checkPowerOnOff ( ) {
37
45
if ( checkOnOffTimer ) clearTimeout ( checkOnOffTimer ) ;
38
46
var cnt = 0 , lastOn ;
39
47
( function check ( ) {
40
48
isOn ( function ( on ) {
41
49
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
+ }
43
54
adapter . setState ( powerOnOffState , on ? 'on' : 'off' , true ) ;
44
55
lastOn = on ;
45
56
}
46
57
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
+ }
49
65
}
50
66
} ) ;
51
67
} ) ( ) ;
52
68
}
53
69
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
+
54
104
var adapter = utils . adapter ( {
55
105
name : 'samsung' ,
56
106
@@ -74,7 +124,7 @@ var adapter = utils.adapter({
74
124
75
125
if ( state && ! state . ack ) {
76
126
var as = id . split ( '.' ) ;
77
- if ( as [ 0 ] + '.' + as [ 1 ] != adapter . namespace ) return ;
127
+ if ( as [ 0 ] + '.' + as [ 1 ] !== adapter . namespace ) return ;
78
128
switch ( as [ 2 ] ) {
79
129
case 'command' :
80
130
send ( state . val , function callback ( err ) {
@@ -83,15 +133,15 @@ var adapter = utils.adapter({
83
133
}
84
134
} ) ;
85
135
break ;
86
-
136
+
87
137
case 'Power' :
88
138
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 ;
95
145
case 'checkOnOff' :
96
146
case 'checkOn' :
97
147
checkPowerOnOff ( ) ;
@@ -114,7 +164,6 @@ var adapter = utils.adapter({
114
164
}
115
165
} ,
116
166
ready : function ( ) {
117
- //g_devices.init(adapter, main);
118
167
main ( ) ;
119
168
}
120
169
} ) ;
@@ -128,8 +177,8 @@ function send(command, callback) {
128
177
}
129
178
130
179
131
- function createObj ( name , val , type , role ) {
132
-
180
+ function createObj ( name , val , type , role , desc ) {
181
+
133
182
if ( role === undefined ) role = type !== "channel" ? "button" : "" ;
134
183
adapter . setObjectNotExists ( name , {
135
184
type : type ,
@@ -140,16 +189,29 @@ function createObj(name, val, type, role) {
140
189
def : false ,
141
190
read : true ,
142
191
write : true ,
143
- values : [ false , true ]
192
+ values : [ false , true ] ,
193
+ desc : desc
144
194
} ,
145
195
native : { command : val }
146
196
} , "" , function ( err , obj ) {
147
197
if ( type !== "channel" ) adapter . setState ( name , false , true ) ;
148
198
} ) ;
149
199
}
150
200
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 ( ) {
153
215
var commandValues = [ ] ;
154
216
var channel ;
155
217
for ( var key in Keys ) {
@@ -163,20 +225,9 @@ function main() {
163
225
}
164
226
}
165
227
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' ) ;
178
229
179
- adapter . setObjectNotExists ( 'command' , {
230
+ adapter . setObject /*NotExists*/ ( 'command' , {
180
231
type : 'state' ,
181
232
common : {
182
233
name : 'command' ,
@@ -186,7 +237,8 @@ function main() {
186
237
values : commandValues ,
187
238
states : commandValues
188
239
} ,
189
- native : { }
240
+ native : {
241
+ }
190
242
} , "" , function ( err , obj ) {
191
243
adapter . setState ( "command" , "" , true /*{ ack: true }*/ ) ;
192
244
} ) ;
@@ -198,10 +250,49 @@ function main() {
198
250
role : 'state' ,
199
251
desc : "checks if powered or not. Can be set to any value (ack=false). If ack becomes true, val holds the status"
200
252
} ,
201
- native : { }
253
+ native : {
254
+ ts : new Date ( ) . getTime ( )
255
+ }
202
256
} , "" , function ( err , obj ) {
203
257
adapter . setState ( powerOnOffState , "" , true /*{ ack: true }*/ ) ;
204
258
} ) ;
259
+
205
260
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
+
206
297
adapter . subscribeStates ( '*' ) ;
207
298
}
0 commit comments