iobroker.iot 1.8.21 → 1.8.25
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/LICENSE +1 -1
- package/README.md +185 -163
- package/admin/asset-manifest.json +10 -10
- package/admin/index_m.html +1 -1
- package/admin/static/css/{2.c04f2d9d.chunk.css → 2.67ef5efb.chunk.css} +1 -1
- package/admin/static/css/{2.c04f2d9d.chunk.css.map → 2.67ef5efb.chunk.css.map} +1 -1
- package/admin/static/js/2.4ed12e11.chunk.js +3 -0
- package/admin/static/js/{2.7960fa52.chunk.js.LICENSE.txt → 2.4ed12e11.chunk.js.LICENSE.txt} +0 -0
- package/admin/static/js/2.4ed12e11.chunk.js.map +1 -0
- package/admin/static/js/main.3c6ad20e.chunk.js +2 -0
- package/admin/static/js/main.3c6ad20e.chunk.js.map +1 -0
- package/img/url_key.png +0 -0
- package/io-package.json +466 -619
- package/lib/alexaSmartHomeV2.js +126 -64
- package/lib/alisa.js +1 -0
- package/lib/googleHome.js +15 -7
- package/main.js +10 -6
- package/package.json +26 -11
- package/admin/static/js/2.7960fa52.chunk.js +0 -3
- package/admin/static/js/2.7960fa52.chunk.js.map +0 -1
- package/admin/static/js/main.b7727019.chunk.js +0 -2
- package/admin/static/js/main.b7727019.chunk.js.map +0 -1
package/lib/alexaSmartHomeV2.js
CHANGED
|
@@ -330,7 +330,7 @@ function AlexaSH2(adapter) {
|
|
|
330
330
|
|
|
331
331
|
// merge actions
|
|
332
332
|
for (let a = 0; a < actions.length; a++) {
|
|
333
|
-
if (groups[friendlyNames[n]].actions.
|
|
333
|
+
if (!groups[friendlyNames[n]].actions.includes(actions[a])) {
|
|
334
334
|
groups[friendlyNames[n]].actions.push(actions[a]);
|
|
335
335
|
}
|
|
336
336
|
}
|
|
@@ -497,7 +497,7 @@ function AlexaSH2(adapter) {
|
|
|
497
497
|
value = 0;
|
|
498
498
|
}
|
|
499
499
|
|
|
500
|
-
adapter.setForeignState(id, value,
|
|
500
|
+
adapter.setForeignState(id, value, err => {
|
|
501
501
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
502
502
|
callback && callback(err);
|
|
503
503
|
});
|
|
@@ -525,7 +525,7 @@ function AlexaSH2(adapter) {
|
|
|
525
525
|
adapter.setState('smart.lastObjectID', id, true);
|
|
526
526
|
}
|
|
527
527
|
|
|
528
|
-
adapter.setForeignState(id, value,
|
|
528
|
+
adapter.setForeignState(id, value, err => {
|
|
529
529
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
530
530
|
callback && callback(err);
|
|
531
531
|
});
|
|
@@ -555,10 +555,18 @@ function AlexaSH2(adapter) {
|
|
|
555
555
|
let max = 100;
|
|
556
556
|
let min = 0;
|
|
557
557
|
|
|
558
|
-
if (typeof obj.common.max !== 'undefined')
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
if (
|
|
558
|
+
if (typeof obj.common.max !== 'undefined') {
|
|
559
|
+
max = parseFloat(obj.common.max);
|
|
560
|
+
}
|
|
561
|
+
if (typeof obj.common.min !== 'undefined') {
|
|
562
|
+
min = parseFloat(obj.common.min);
|
|
563
|
+
}
|
|
564
|
+
if (value < min) {
|
|
565
|
+
value = min;
|
|
566
|
+
} else
|
|
567
|
+
if (value > max) {
|
|
568
|
+
value = max;
|
|
569
|
+
}
|
|
562
570
|
|
|
563
571
|
value = (value / 100) * (max - min) + min;
|
|
564
572
|
|
|
@@ -573,7 +581,7 @@ function AlexaSH2(adapter) {
|
|
|
573
581
|
adapter.setState('smart.lastObjectID', id, true);
|
|
574
582
|
}
|
|
575
583
|
|
|
576
|
-
adapter.setForeignState(id, value,
|
|
584
|
+
adapter.setForeignState(id, value, err => {
|
|
577
585
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
578
586
|
callback && callback();
|
|
579
587
|
});
|
|
@@ -603,7 +611,7 @@ function AlexaSH2(adapter) {
|
|
|
603
611
|
return callback && callback();
|
|
604
612
|
}
|
|
605
613
|
|
|
606
|
-
adapter.log.debug(
|
|
614
|
+
adapter.log.debug(`[ALEXA] Controlling delta ${id}`);
|
|
607
615
|
|
|
608
616
|
adapter.getForeignState(id, function (err, state) {
|
|
609
617
|
let value = state ? (state.val || 0) : 0;
|
|
@@ -632,7 +640,7 @@ function AlexaSH2(adapter) {
|
|
|
632
640
|
adapter.setState('smart.lastObjectID', id, true);
|
|
633
641
|
}
|
|
634
642
|
|
|
635
|
-
adapter.setForeignState(id, value,
|
|
643
|
+
adapter.setForeignState(id, value, err => {
|
|
636
644
|
err && adapter.log.error(`[ALEXA] Cannot set device: ${err}`);
|
|
637
645
|
callback && callback();
|
|
638
646
|
});
|
|
@@ -666,7 +674,7 @@ function AlexaSH2(adapter) {
|
|
|
666
674
|
// }
|
|
667
675
|
//}
|
|
668
676
|
|
|
669
|
-
adapter.getForeignObject(id,
|
|
677
|
+
adapter.getForeignObject(id, (err, obj) => {
|
|
670
678
|
if (!obj || obj.type !== 'state') {
|
|
671
679
|
err && adapter.log.error(`[ALEXA] Cannot control non state: ${id} ${obj ? obj.type : 'no object'}`);
|
|
672
680
|
return callback && callback();
|
|
@@ -699,23 +707,23 @@ function AlexaSH2(adapter) {
|
|
|
699
707
|
value = !!value;
|
|
700
708
|
}
|
|
701
709
|
|
|
702
|
-
adapter.getForeignState(id,
|
|
710
|
+
adapter.getForeignState(id, (err, state) => {
|
|
703
711
|
err && adapter.log.error(`[ALEXA] Cannot read device: ${err}`);
|
|
704
712
|
|
|
705
713
|
if (writeStates) {
|
|
706
714
|
adapter.setState('smart.lastObjectID', id, true);
|
|
707
715
|
}
|
|
708
716
|
|
|
709
|
-
adapter.setForeignState(id, value,
|
|
717
|
+
adapter.setForeignState(id, value, err => {
|
|
710
718
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
711
719
|
let response = {
|
|
712
720
|
payload: {
|
|
713
721
|
targetTemperature: {
|
|
714
722
|
value: value
|
|
715
723
|
},
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
724
|
+
temperatureMode: {
|
|
725
|
+
value: 'AUTO'
|
|
726
|
+
},
|
|
719
727
|
previousState: {
|
|
720
728
|
targetTemperature: {
|
|
721
729
|
value: state ? parseFloat(state.val) || 0 : 0
|
|
@@ -826,7 +834,7 @@ function AlexaSH2(adapter) {
|
|
|
826
834
|
adapter.setState('smart.lastObjectID', id, true);
|
|
827
835
|
}
|
|
828
836
|
|
|
829
|
-
adapter.setForeignState(id, value,
|
|
837
|
+
adapter.setForeignState(id, value, err => {
|
|
830
838
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
831
839
|
let response = {
|
|
832
840
|
payload: {
|
|
@@ -871,7 +879,7 @@ function AlexaSH2(adapter) {
|
|
|
871
879
|
|
|
872
880
|
adapter.setForeignState(id,
|
|
873
881
|
obj.native.CONTROL_VALUE === undefined ? obj.native.LOCK_VALUE : obj.native.CONTROL_VALUE,
|
|
874
|
-
|
|
882
|
+
err => {
|
|
875
883
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
876
884
|
callback && callback();
|
|
877
885
|
});
|
|
@@ -977,7 +985,7 @@ function AlexaSH2(adapter) {
|
|
|
977
985
|
}
|
|
978
986
|
let rgb = hsvToRgb(color.hue/360, color.saturation, color.brightness);
|
|
979
987
|
|
|
980
|
-
adapter.setForeignState(id, rgb,
|
|
988
|
+
adapter.setForeignState(id, rgb, err => {
|
|
981
989
|
err && adapter.log.error(`[ALEXA] Cannot read device: ${err}`);
|
|
982
990
|
|
|
983
991
|
if (writeStates) {
|
|
@@ -1003,7 +1011,7 @@ function AlexaSH2(adapter) {
|
|
|
1003
1011
|
if (obj.common && obj.common.min !== undefined && obj.common.max !== undefined) {
|
|
1004
1012
|
color.hue = Math.round((obj.common.max - obj.common.min) * (color.hue / 360) + obj.common.min);
|
|
1005
1013
|
}
|
|
1006
|
-
adapter.setForeignState(idh, color.hue,
|
|
1014
|
+
adapter.setForeignState(idh, color.hue, err => {
|
|
1007
1015
|
err && adapter.log.error(`[ALEXA] Cannot read device: ${err}`);
|
|
1008
1016
|
|
|
1009
1017
|
if (writeStates) {
|
|
@@ -1020,7 +1028,7 @@ function AlexaSH2(adapter) {
|
|
|
1020
1028
|
color.saturation *= 100;
|
|
1021
1029
|
}
|
|
1022
1030
|
|
|
1023
|
-
adapter.setForeignState(ids, color.saturation,
|
|
1031
|
+
adapter.setForeignState(ids, color.saturation, err => {
|
|
1024
1032
|
err && adapter.log.error('[ALEXA] Cannot read device: ' + err);
|
|
1025
1033
|
|
|
1026
1034
|
if (!idb){
|
|
@@ -1038,7 +1046,7 @@ function AlexaSH2(adapter) {
|
|
|
1038
1046
|
color.brightness *= 100;
|
|
1039
1047
|
}
|
|
1040
1048
|
|
|
1041
|
-
adapter.setForeignState(idb, color.brightness,
|
|
1049
|
+
adapter.setForeignState(idb, color.brightness, err => {
|
|
1042
1050
|
err && adapter.log.error(`[ALEXA] Cannot read device: ${err}`);
|
|
1043
1051
|
callback && callback(err);
|
|
1044
1052
|
});
|
|
@@ -1111,7 +1119,7 @@ function AlexaSH2(adapter) {
|
|
|
1111
1119
|
|
|
1112
1120
|
adapter.log.debug(`[ALEXA] Controlling: ${id} setting to ${value}`);
|
|
1113
1121
|
|
|
1114
|
-
adapter.setForeignState(id, value,
|
|
1122
|
+
adapter.setForeignState(id, value, err => {
|
|
1115
1123
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
1116
1124
|
callback && callback();
|
|
1117
1125
|
});
|
|
@@ -1177,7 +1185,7 @@ function AlexaSH2(adapter) {
|
|
|
1177
1185
|
|
|
1178
1186
|
adapter.log.debug(`[ALEXA] Controlling: ${id} setting to ${value}`);
|
|
1179
1187
|
|
|
1180
|
-
adapter.setForeignState(id, value,
|
|
1188
|
+
adapter.setForeignState(id, value, err => {
|
|
1181
1189
|
err && adapter.log.error(`[ALEXA] Cannot switch device: ${err}`);
|
|
1182
1190
|
if (callback) {
|
|
1183
1191
|
// convert value back to Kelvin for reporting
|
|
@@ -1255,7 +1263,11 @@ function AlexaSH2(adapter) {
|
|
|
1255
1263
|
details = smartDevices[i].additionalApplianceDetails;
|
|
1256
1264
|
}
|
|
1257
1265
|
}
|
|
1258
|
-
|
|
1266
|
+
|
|
1267
|
+
if (adapter.common.loglevel === 'debug') {
|
|
1268
|
+
adapter.log.debug('[ALEXA] Found following devices to control: ' + JSON.stringify(details));
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1259
1271
|
if (details) {
|
|
1260
1272
|
if (details.group) {
|
|
1261
1273
|
channels = details.channels;
|
|
@@ -1408,20 +1420,25 @@ function AlexaSH2(adapter) {
|
|
|
1408
1420
|
adapter.log.debug(`[ALEXA] ALEXA ON: ${request.payload.appliance.applianceId}`);
|
|
1409
1421
|
|
|
1410
1422
|
for (let channel in channels) {
|
|
1411
|
-
if (!channels.hasOwnProperty(channel))
|
|
1423
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1424
|
+
continue;
|
|
1425
|
+
}
|
|
1412
1426
|
let toggle = findRoleInChannel(channels[channel], 'level.dimmer');
|
|
1413
1427
|
if (toggle) {
|
|
1414
1428
|
let byon = (device.additionalApplianceDetails.group) ?
|
|
1415
1429
|
device.additionalApplianceDetails.byONs[toggle] :
|
|
1416
1430
|
device.additionalApplianceDetails.byON;
|
|
1417
|
-
if (!byon || byon === '-')
|
|
1431
|
+
if (!byon || byon === '-') {
|
|
1432
|
+
toggle = null;
|
|
1433
|
+
}
|
|
1418
1434
|
}
|
|
1419
|
-
|
|
1435
|
+
|
|
1436
|
+
toggle = toggle || findRoleInChannel(channels[channel], 'switch');
|
|
1420
1437
|
|
|
1421
1438
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1422
1439
|
let id = channels[channel][i].id;
|
|
1423
1440
|
adapter.log.debug('[ALEXA] Controlling: ' + id);
|
|
1424
|
-
controlOnOff(toggle, id, true, Object.keys(channels).length === 1,
|
|
1441
|
+
controlOnOff(toggle, id, true, Object.keys(channels).length === 1, err => {
|
|
1425
1442
|
err && adapter.log.error(`[ALEXA] Cannot controlOnOff: ${err}`);
|
|
1426
1443
|
if (!--count) {
|
|
1427
1444
|
request.header.name = 'TurnOnConfirmation';
|
|
@@ -1430,6 +1447,7 @@ function AlexaSH2(adapter) {
|
|
|
1430
1447
|
header: request.header,
|
|
1431
1448
|
payload: {}
|
|
1432
1449
|
});
|
|
1450
|
+
|
|
1433
1451
|
request = null;
|
|
1434
1452
|
}
|
|
1435
1453
|
});
|
|
@@ -1459,20 +1477,26 @@ function AlexaSH2(adapter) {
|
|
|
1459
1477
|
adapter.log.debug('[ALEXA] ALEXA OFF: ' + request.payload.appliance.applianceId);
|
|
1460
1478
|
|
|
1461
1479
|
for (let channel in channels) {
|
|
1462
|
-
if (!channels.hasOwnProperty(channel))
|
|
1480
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1481
|
+
continue;
|
|
1482
|
+
}
|
|
1463
1483
|
let toggle = findRoleInChannel(channels[channel], 'level.dimmer');
|
|
1464
1484
|
if (toggle) {
|
|
1465
1485
|
let byon = (device.additionalApplianceDetails.group) ?
|
|
1466
1486
|
device.additionalApplianceDetails.byONs[toggle] :
|
|
1467
1487
|
device.additionalApplianceDetails.byON;
|
|
1468
|
-
if (!byon || byon === '-')
|
|
1488
|
+
if (!byon || byon === '-') {
|
|
1489
|
+
toggle = null;
|
|
1490
|
+
}
|
|
1469
1491
|
}
|
|
1470
|
-
|
|
1492
|
+
|
|
1493
|
+
toggle = toggle || findRoleInChannel(channels[channel], 'switch');
|
|
1494
|
+
|
|
1471
1495
|
adapter.log.debug(toggle);
|
|
1472
1496
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1473
1497
|
let id = channels[channel][i].id;
|
|
1474
1498
|
adapter.log.debug('[ALEXA] Controlling off: ' + id);
|
|
1475
|
-
controlOnOff(toggle, id, false, Object.keys(channels).length === 1,
|
|
1499
|
+
controlOnOff(toggle, id, false, Object.keys(channels).length === 1, err => {
|
|
1476
1500
|
err && adapter.log.error(`[ALEXA] Cannot controlOnOff: ${err}`);
|
|
1477
1501
|
if (!--count) {
|
|
1478
1502
|
request.header.name = 'TurnOffConfirmation';
|
|
@@ -1508,11 +1532,13 @@ function AlexaSH2(adapter) {
|
|
|
1508
1532
|
// }
|
|
1509
1533
|
adapter.log.debug('[ALEXA] ALEXA LOCK: ' + request.payload.appliance.applianceId);
|
|
1510
1534
|
for (let channel in channels) {
|
|
1511
|
-
if (!channels.hasOwnProperty(channel))
|
|
1535
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1536
|
+
continue;
|
|
1537
|
+
}
|
|
1512
1538
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1513
1539
|
let id = channels[channel][i].id;
|
|
1514
1540
|
adapter.log.debug('[ALEXA] Controlling lock: ' + id);
|
|
1515
|
-
controlLock(id, Object.keys(channels).length === 1,
|
|
1541
|
+
controlLock(id, Object.keys(channels).length === 1, err => {
|
|
1516
1542
|
err && adapter.log.error(`[ALEXA] Cannot controlLock: ${err}`);
|
|
1517
1543
|
if (!--count) {
|
|
1518
1544
|
request.header.name = 'SetLockStateConfirmation';
|
|
@@ -1562,11 +1588,13 @@ function AlexaSH2(adapter) {
|
|
|
1562
1588
|
adapter.log.debug('[ALEXA] ALEXA GetLOCK: ' + request.payload.appliance.applianceId);
|
|
1563
1589
|
let result = null;
|
|
1564
1590
|
for (let channel in channels) {
|
|
1565
|
-
if (!channels.hasOwnProperty(channel))
|
|
1591
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1592
|
+
continue;
|
|
1593
|
+
}
|
|
1566
1594
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1567
1595
|
let id = channels[channel][i].id;
|
|
1568
1596
|
adapter.log.debug(`[ALEXA] Controlling lock: ${id}`);
|
|
1569
|
-
getLock(id, Object.keys(channels).length === 1,
|
|
1597
|
+
getLock(id, Object.keys(channels).length === 1, (err, value, ts) => {
|
|
1570
1598
|
err && adapter.log.error(`[ALEXA] Cannot getLock: ${err}`);
|
|
1571
1599
|
if (result === null || value === false) {
|
|
1572
1600
|
adapter.log.debug(`[ALEXA] Settings result: ${value}`);
|
|
@@ -1604,14 +1632,16 @@ function AlexaSH2(adapter) {
|
|
|
1604
1632
|
case 'SetPercentageRequest': {
|
|
1605
1633
|
adapter.log.debug(`[ALEXA] ALEXA Percent: ${request.payload.appliance.applianceId} ${request.payload.percentageState.value}%`);
|
|
1606
1634
|
for (let channel in channels) {
|
|
1607
|
-
if (!channels.hasOwnProperty(channel))
|
|
1635
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1636
|
+
continue;
|
|
1637
|
+
}
|
|
1608
1638
|
let dimmer = findRoleInChannel(channels[channel], 'level.dimmer');
|
|
1609
1639
|
adapter.log.debug('[ALEXA] DATA: ' + JSON.stringify(channels[channel]));
|
|
1610
1640
|
adapter.log.debug(dimmer);
|
|
1611
1641
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1612
1642
|
let id = channels[channel][i].id;
|
|
1613
1643
|
adapter.log.debug('[ALEXA] Controlling percentage: ' + id);
|
|
1614
|
-
controlPercent(dimmer, id, request.payload.percentageState.value, Object.keys(channels).length === 1,
|
|
1644
|
+
controlPercent(dimmer, id, request.payload.percentageState.value, Object.keys(channels).length === 1, err => {
|
|
1615
1645
|
err && adapter.log.error(`[ALEXA] Cannot controlPercent: ${err}`);
|
|
1616
1646
|
if (!--count) {
|
|
1617
1647
|
request.header.name = 'SetPercentageConfirmation';
|
|
@@ -1642,8 +1672,8 @@ function AlexaSH2(adapter) {
|
|
|
1642
1672
|
|
|
1643
1673
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1644
1674
|
let id = channels[channel][i].id;
|
|
1645
|
-
adapter.log.debug('[ALEXA] Controlling percentage: ' + id);
|
|
1646
|
-
controlDelta(dimmer, id, request.payload.percentageState.value, Object.keys(channels).length === 1,
|
|
1675
|
+
adapter.log.debug('[ALEXA] Controlling increment percentage: ' + id);
|
|
1676
|
+
controlDelta(dimmer, id, request.payload.percentageState.value, Object.keys(channels).length === 1, err => {
|
|
1647
1677
|
err && adapter.log.error(`[ALEXA] Cannot controlDelta: ${err}`);
|
|
1648
1678
|
if (!--count) {
|
|
1649
1679
|
request.header.name = 'IncrementPercentageConfirmation';
|
|
@@ -1664,7 +1694,9 @@ function AlexaSH2(adapter) {
|
|
|
1664
1694
|
case 'DecrementPercentageRequest': {
|
|
1665
1695
|
adapter.log.debug(`[ALEXA] ALEXA decrement: ${request.payload.appliance.applianceId} ${request.payload.deltaPercentage.value}%`);
|
|
1666
1696
|
for (let channel in channels) {
|
|
1667
|
-
if (!channels.hasOwnProperty(channel))
|
|
1697
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1698
|
+
continue;
|
|
1699
|
+
}
|
|
1668
1700
|
let dimmer = findRoleInChannel(channels[channel], 'level.dimmer');
|
|
1669
1701
|
|
|
1670
1702
|
adapter.log.debug('[ALEXA] DATA: ' + JSON.stringify(channels[channel]));
|
|
@@ -1672,8 +1704,8 @@ function AlexaSH2(adapter) {
|
|
|
1672
1704
|
|
|
1673
1705
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1674
1706
|
let id = channels[channel][i].id;
|
|
1675
|
-
adapter.log.debug(`[ALEXA] Controlling percentage: ${id}`);
|
|
1676
|
-
controlDelta(dimmer, id, request.payload.percentageState.value * (-1), Object.keys(channels).length === 1,
|
|
1707
|
+
adapter.log.debug(`[ALEXA] Controlling decrement percentage: ${id}`);
|
|
1708
|
+
controlDelta(dimmer, id, request.payload.percentageState.value * (-1), Object.keys(channels).length === 1, err => {
|
|
1677
1709
|
err && adapter.log.error(`[ALEXA] Cannot controlDelta: ${err}`);
|
|
1678
1710
|
if (!--count) {
|
|
1679
1711
|
request.header.name = 'DecrementPercentageConfirmation';
|
|
@@ -1694,14 +1726,23 @@ function AlexaSH2(adapter) {
|
|
|
1694
1726
|
case 'SetTargetTemperatureRequest': {
|
|
1695
1727
|
adapter.log.debug(`[ALEXA] ALEXA temperature Percent: ${request.payload.appliance.applianceId} ${request.payload.targetTemperature.value} grad`);
|
|
1696
1728
|
for (let channel in channels) {
|
|
1697
|
-
if (!channels.hasOwnProperty(channel))
|
|
1729
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1730
|
+
continue;
|
|
1731
|
+
}
|
|
1732
|
+
let response;
|
|
1733
|
+
|
|
1698
1734
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1699
1735
|
let id = channels[channel][i].id;
|
|
1700
1736
|
|
|
1701
|
-
adapter.log.debug(`[ALEXA] Controlling
|
|
1737
|
+
adapter.log.debug(`[ALEXA] Controlling temperature: ${id}`);
|
|
1702
1738
|
|
|
1703
|
-
controlTemperature(id, request.payload.targetTemperature.value, Object.keys(channels).length === 1,
|
|
1739
|
+
controlTemperature(id, request.payload.targetTemperature.value, Object.keys(channels).length === 1, (err, _response) => {
|
|
1704
1740
|
err && adapter.log.error(`[ALEXA] Cannot controlTemperature: ${err}`);
|
|
1741
|
+
|
|
1742
|
+
if (_response && !response) {
|
|
1743
|
+
response = _response;
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1705
1746
|
if (!--count) {
|
|
1706
1747
|
if (err || !response) {
|
|
1707
1748
|
response = {
|
|
@@ -1709,9 +1750,9 @@ function AlexaSH2(adapter) {
|
|
|
1709
1750
|
targetTemperature: {
|
|
1710
1751
|
value: 0
|
|
1711
1752
|
},
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1753
|
+
temperatureMode: {
|
|
1754
|
+
value: 'AUTO'
|
|
1755
|
+
},
|
|
1715
1756
|
previousState: {
|
|
1716
1757
|
targetTemperature: {
|
|
1717
1758
|
value: 0
|
|
@@ -1737,13 +1778,22 @@ function AlexaSH2(adapter) {
|
|
|
1737
1778
|
case 'IncrementTargetTemperatureRequest': {
|
|
1738
1779
|
request.payload.deltaTemperature.value = request.payload.deltaTemperature.value || 1;
|
|
1739
1780
|
adapter.log.debug(`[ALEXA] ALEXA temperature Increment: ${request.payload.appliance.applianceId} ${request.payload.deltaTemperature.value} grad`);
|
|
1781
|
+
let response;
|
|
1782
|
+
|
|
1740
1783
|
for (let channel in channels) {
|
|
1741
|
-
if (!channels.hasOwnProperty(channel))
|
|
1784
|
+
if (!channels.hasOwnProperty(channel)) {
|
|
1785
|
+
continue;
|
|
1786
|
+
}
|
|
1742
1787
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1743
1788
|
let id = channels[channel][i].id;
|
|
1744
|
-
adapter.log.debug('[ALEXA] Controlling
|
|
1745
|
-
controlTemperatureDelta(id, request.payload.deltaTemperature.value, Object.keys(channels).length === 1,
|
|
1789
|
+
adapter.log.debug('[ALEXA] Controlling increment temperature: ' + id);
|
|
1790
|
+
controlTemperatureDelta(id, request.payload.deltaTemperature.value, Object.keys(channels).length === 1, (err, _response) => {
|
|
1746
1791
|
err && adapter.log.error(`[ALEXA] Cannot controlTemperatureDelta: ${err}`);
|
|
1792
|
+
|
|
1793
|
+
if (_response && !response) {
|
|
1794
|
+
response = _response;
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1747
1797
|
if (!--count) {
|
|
1748
1798
|
if (err || !response) {
|
|
1749
1799
|
response = {
|
|
@@ -1779,6 +1829,8 @@ function AlexaSH2(adapter) {
|
|
|
1779
1829
|
case 'DecrementTargetTemperatureRequest': {
|
|
1780
1830
|
request.payload.deltaTemperature.value = request.payload.deltaTemperature.value || 1;
|
|
1781
1831
|
adapter.log.debug(`[ALEXA] ALEXA temperature decrement: ${request.payload.appliance.applianceId} ${request.payload.deltaTemperature.value} grad`);
|
|
1832
|
+
let response;
|
|
1833
|
+
|
|
1782
1834
|
for (let channel in channels) {
|
|
1783
1835
|
if (!channels.hasOwnProperty(channel)) {
|
|
1784
1836
|
continue;
|
|
@@ -1787,10 +1839,15 @@ function AlexaSH2(adapter) {
|
|
|
1787
1839
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1788
1840
|
let id = channels[channel][i].id;
|
|
1789
1841
|
|
|
1790
|
-
adapter.log.debug(`[ALEXA] Controlling
|
|
1842
|
+
adapter.log.debug(`[ALEXA] Controlling decrement temperature: ${id}`);
|
|
1791
1843
|
|
|
1792
|
-
controlTemperatureDelta(id, request.payload.deltaTemperature.value * (-1), Object.keys(channels).length === 1,
|
|
1844
|
+
controlTemperatureDelta(id, request.payload.deltaTemperature.value * (-1), Object.keys(channels).length === 1, (err, _response) => {
|
|
1793
1845
|
err && adapter.log.error(`[ALEXA] Cannot controlTemperatureDelta: ${err}`);
|
|
1846
|
+
|
|
1847
|
+
if (_response && !response) {
|
|
1848
|
+
response = _response;
|
|
1849
|
+
}
|
|
1850
|
+
|
|
1794
1851
|
if (!--count) {
|
|
1795
1852
|
if (err || !response) {
|
|
1796
1853
|
response = {
|
|
@@ -1834,8 +1891,8 @@ function AlexaSH2(adapter) {
|
|
|
1834
1891
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1835
1892
|
let id = channels[channel][i].id;
|
|
1836
1893
|
|
|
1837
|
-
adapter.log.debug(`[ALEXA]
|
|
1838
|
-
getTemperature(id, Object.keys(channels).length === 1,
|
|
1894
|
+
adapter.log.debug(`[ALEXA] Get temperature: ${id}`);
|
|
1895
|
+
getTemperature(id, Object.keys(channels).length === 1, (err, value, ts) => {
|
|
1839
1896
|
err && adapter.log.error(`[ALEXA] Cannot getTemperature: ${err}`);
|
|
1840
1897
|
if (value){
|
|
1841
1898
|
num++;
|
|
@@ -1884,9 +1941,9 @@ function AlexaSH2(adapter) {
|
|
|
1884
1941
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
1885
1942
|
let id = channels[channel][i].id;
|
|
1886
1943
|
|
|
1887
|
-
adapter.log.debug(`[ALEXA] Getting: ${id}`);
|
|
1944
|
+
adapter.log.debug(`[ALEXA] Getting target temperature: ${id}`);
|
|
1888
1945
|
|
|
1889
|
-
getTargetTemperature(id, Object.keys(channels).length === 1,
|
|
1946
|
+
getTargetTemperature(id, Object.keys(channels).length === 1, (err, value, ts) => {
|
|
1890
1947
|
err && adapter.log.error(`[ALEXA] Cannot getTargetTemperature: ${err}`);
|
|
1891
1948
|
if (!result && value) result = value;
|
|
1892
1949
|
if (!--count) {
|
|
@@ -1916,8 +1973,8 @@ function AlexaSH2(adapter) {
|
|
|
1916
1973
|
break;
|
|
1917
1974
|
|
|
1918
1975
|
case 'SetColorRequest': {
|
|
1919
|
-
adapter.log.debug(
|
|
1920
|
-
let doneCallback =
|
|
1976
|
+
adapter.log.debug(`[ALEXA] ALEXA Color: ${request.payload.appliance.applianceId} ${JSON.stringify(request.payload.color)}`);
|
|
1977
|
+
let doneCallback = err => {
|
|
1921
1978
|
err && adapter.log.error(`[ALEXA] Cannot SetColorRequest: ${err}`);
|
|
1922
1979
|
adapter.log.debug(`[ALEXA] Hue Count: ${count}`);
|
|
1923
1980
|
|
|
@@ -1978,7 +2035,7 @@ function AlexaSH2(adapter) {
|
|
|
1978
2035
|
let id = channels[channel][i].id;
|
|
1979
2036
|
adapter.log.debug(`[ALEXA] Controlling temperature kelvin: ${id}`);
|
|
1980
2037
|
|
|
1981
|
-
controlColorTemperature(temperature, id, request.payload.colorTemperature.value, Object.keys(channels).length === 1,
|
|
2038
|
+
controlColorTemperature(temperature, id, request.payload.colorTemperature.value, Object.keys(channels).length === 1, err => {
|
|
1982
2039
|
err && adapter.log.error(`[ALEXA] Cannot controlColorTemperature: ${err}`);
|
|
1983
2040
|
if (!--count) {
|
|
1984
2041
|
request.header.name = 'SetColorTemperatureConfirmation';
|
|
@@ -2009,7 +2066,7 @@ function AlexaSH2(adapter) {
|
|
|
2009
2066
|
for (let i = 0; i < channels[channel].length; i++) {
|
|
2010
2067
|
let id = channels[channel][i].id;
|
|
2011
2068
|
adapter.log.debug('[ALEXA] Controlling temperature kelvin: ' + id);
|
|
2012
|
-
controlColorTemperatureDelta(temperature, id, -1, Object.keys(channels).length === 1,
|
|
2069
|
+
controlColorTemperatureDelta(temperature, id, -1, Object.keys(channels).length === 1, (err, res) => {
|
|
2013
2070
|
err && adapter.log.error(`[ALEXA] Cannot controlColorTemperatureDelta: ${err}`);
|
|
2014
2071
|
adapter.log.debug(`[ALEXA] Count: ${count}`);
|
|
2015
2072
|
if (!--count) {
|
|
@@ -2042,7 +2099,7 @@ function AlexaSH2(adapter) {
|
|
|
2042
2099
|
let id = channels[channel][i].id;
|
|
2043
2100
|
adapter.log.debug(`[ALEXA] Controlling temperature kelvin: ${id}`);
|
|
2044
2101
|
|
|
2045
|
-
controlColorTemperatureDelta(temperature, id, 1, Object.keys(channels).length === 1,
|
|
2102
|
+
controlColorTemperatureDelta(temperature, id, 1, Object.keys(channels).length === 1, (err, res) => {
|
|
2046
2103
|
err && adapter.log.error(`[ALEXA] Cannot controlColorTemperatureDelta: ${err}`);
|
|
2047
2104
|
adapter.log.debug(`[ALEXA] Count: ${count}`);
|
|
2048
2105
|
|
|
@@ -2318,6 +2375,11 @@ function AlexaSH2(adapter) {
|
|
|
2318
2375
|
adapter.log.debug(`[ALEXA] Created ALEXA device: ${fn} ${JSON.stringify(result[k].actions)}`);
|
|
2319
2376
|
}
|
|
2320
2377
|
}
|
|
2378
|
+
|
|
2379
|
+
if (result.length > 300) {
|
|
2380
|
+
adapter.log.error(`[ALEXA] too many devices ${result.length}. Max supported number is 300`);
|
|
2381
|
+
}
|
|
2382
|
+
|
|
2321
2383
|
callback(err, result, analyseAddedId);
|
|
2322
2384
|
});
|
|
2323
2385
|
});
|
package/lib/alisa.js
CHANGED
|
@@ -60,6 +60,7 @@ class YandexAliceConverter {
|
|
|
60
60
|
[Types.blind]: this._processBlinds.bind(this),
|
|
61
61
|
[Types.lock]: this._processLock.bind(this),
|
|
62
62
|
[Types.vacuumCleaner]: this._processVacuumCleaner.bind(this),
|
|
63
|
+
[Types.gate]: this._processLock.bind(this),
|
|
63
64
|
// sensors
|
|
64
65
|
[Types.motion]: this._processMotion.bind(this),
|
|
65
66
|
[Types.door]: this._processContact.bind(this),
|
package/lib/googleHome.js
CHANGED
|
@@ -463,13 +463,16 @@ class GoogleHome {
|
|
|
463
463
|
};
|
|
464
464
|
}
|
|
465
465
|
|
|
466
|
-
checkUrlKey(
|
|
466
|
+
checkUrlKey() {
|
|
467
467
|
const now = Date.now();
|
|
468
468
|
if (!this.keyPromise || now - this.keyPromiseTime > 900000) {
|
|
469
469
|
/* 15 Minutes */
|
|
470
470
|
this.keyPromiseTime = now;
|
|
471
471
|
this.keyPromise = new Promise((resolve, reject) => {
|
|
472
472
|
const url = `${URL_STATUS}?user=${encodeURIComponent(this.adapter.config.login)}&urlKey=${encodeURIComponent(this.urlKey.key)}&p=${PROTOCOL_VERSION}&v=${version}`;
|
|
473
|
+
|
|
474
|
+
this.adapter.log.debug(url);
|
|
475
|
+
|
|
473
476
|
request.get({
|
|
474
477
|
method: 'GET',
|
|
475
478
|
url
|
|
@@ -2123,12 +2126,17 @@ class GoogleHome {
|
|
|
2123
2126
|
if (_attr === 'on') {
|
|
2124
2127
|
val = state.val === 1 || state.val === '1' || state.val === 'true' || state.val === 'ON' || state.val === 'on' || state.val === true || (typeof state.val === 'number' && state.val > 0);
|
|
2125
2128
|
} else if (_attr === 'color_R' || _attr === 'color_G' || _attr === 'color_B') {
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2129
|
+
if (!json[devId]['color_R']) {
|
|
2130
|
+
this.adapter.log.warn(`[GHOME] Invalid structure for "${devId}": ${JSON.stringify(json[devId])}`)
|
|
2131
|
+
val = this.reportedStates[devId][_attr].val;
|
|
2132
|
+
} else {
|
|
2133
|
+
const r = await this.adapter.getForeignStateAsync(json[devId]['color_R'].id);
|
|
2134
|
+
const g = await this.adapter.getForeignStateAsync(json[devId]['color_G'].id);
|
|
2135
|
+
const b = await this.adapter.getForeignStateAsync(json[devId]['color_B'].id);
|
|
2136
|
+
const spectrumRgb = (r.val << 16) + (g.val << 8) + (b.val);
|
|
2130
2137
|
|
|
2131
|
-
|
|
2138
|
+
val = Math.floor(spectrumRgb);
|
|
2139
|
+
}
|
|
2132
2140
|
} else if (_attr === 'color_hue') {
|
|
2133
2141
|
json[devId].color = json[devId].color ? json[devId].color : {};
|
|
2134
2142
|
const hue = await this.adapter.getForeignStateAsync(json[devId]['color_hue'].id);
|
|
@@ -2221,7 +2229,7 @@ class GoogleHome {
|
|
|
2221
2229
|
this.reportedStates[devId][_attr].val = val;
|
|
2222
2230
|
this.reportedStates[devId][_attr].ts = now;
|
|
2223
2231
|
json[devId] = json[devId] || {};
|
|
2224
|
-
if (_attr.
|
|
2232
|
+
if (_attr.includes('color_')) {
|
|
2225
2233
|
json[devId].color = json[devId].color ? json[devId].color : {};
|
|
2226
2234
|
if (_attr === 'color_temperature') {
|
|
2227
2235
|
json[devId].color.temperatureK = Math.floor(val);
|
package/main.js
CHANGED
|
@@ -618,7 +618,7 @@ function processMessage(type, request, callback) {
|
|
|
618
618
|
}
|
|
619
619
|
}
|
|
620
620
|
|
|
621
|
-
adapter.log.debug(Date.now()
|
|
621
|
+
adapter.log.debug(`${Date.now()} ALEXA: ${JSON.stringify(request)}`);
|
|
622
622
|
|
|
623
623
|
if (request && request.directive) {
|
|
624
624
|
if (alexaSH3) {
|
|
@@ -686,7 +686,7 @@ function processMessage(type, request, callback) {
|
|
|
686
686
|
}
|
|
687
687
|
}
|
|
688
688
|
|
|
689
|
-
adapter.log.debug(Date.now()
|
|
689
|
+
adapter.log.debug(`${Date.now()} ALISA: ${JSON.stringify(request)}`);
|
|
690
690
|
if (yandexAlisa) {
|
|
691
691
|
yandexAlisa.process(request, adapter.config.yandexAlisa, response => callback(response));
|
|
692
692
|
} else {
|
|
@@ -709,7 +709,7 @@ function processMessage(type, request, callback) {
|
|
|
709
709
|
|
|
710
710
|
if (type.startsWith('text2command')) {
|
|
711
711
|
if (adapter.config.text2command !== undefined && adapter.config.text2command !== '') {
|
|
712
|
-
adapter.setForeignState(
|
|
712
|
+
adapter.setForeignState(`text2command.${adapter.config.text2command}.text`, request,
|
|
713
713
|
err => callback({result: err || 'Ok'}));
|
|
714
714
|
} else {
|
|
715
715
|
adapter.log.warn('Received service text2command, but instance is not defined');
|
|
@@ -721,7 +721,7 @@ function processMessage(type, request, callback) {
|
|
|
721
721
|
adapter.getObject('services.custom_' + _type, (err, obj) => {
|
|
722
722
|
if (!obj) {
|
|
723
723
|
adapter.setObjectNotExists('services.custom_' + _type, {
|
|
724
|
-
_id: adapter.namespace
|
|
724
|
+
_id: `${adapter.namespace}.services.custom_${_type}`,
|
|
725
725
|
type: 'state',
|
|
726
726
|
common: {
|
|
727
727
|
name: 'Service for ' + _type,
|
|
@@ -838,8 +838,12 @@ function startDevice(clientId, login, password, retry) {
|
|
|
838
838
|
if (topic.startsWith(`command/${clientId}/`)) {
|
|
839
839
|
let type = topic.substring(clientId.length + 9);
|
|
840
840
|
|
|
841
|
-
processMessage(type, request, response =>
|
|
842
|
-
|
|
841
|
+
processMessage(type, request, response => {
|
|
842
|
+
if (adapter.common.loglevel === 'debug') {
|
|
843
|
+
adapter.log.debug('Response: ' + JSON.stringify(response));
|
|
844
|
+
}
|
|
845
|
+
device && device.publish(`response/${clientId}/${type}`, JSON.stringify(response))
|
|
846
|
+
});
|
|
843
847
|
}
|
|
844
848
|
});
|
|
845
849
|
}).catch(e => {
|