homebridge-tasmota-control 1.7.10-beta.0 → 1.7.10-beta.2
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/index.js +16 -9
- package/package.json +2 -2
- package/src/fans.js +2 -14
- package/src/impulsegenerator.js +18 -30
- package/src/lights.js +4 -6
- package/src/mielhvac.js +26 -72
- package/src/sensors.js +2 -14
- package/src/switches.js +2 -14
package/index.js
CHANGED
|
@@ -48,7 +48,9 @@ class tasmotaPlatform {
|
|
|
48
48
|
const user = device.user || '';
|
|
49
49
|
const passwd = device.passwd || '';
|
|
50
50
|
const loadNameFromDevice = device.loadNameFromDevice || false;
|
|
51
|
-
const
|
|
51
|
+
const remoteTemperatureSensorEnable = device.miElHvac?.remoteTemperatureSensor?.enable;
|
|
52
|
+
const remoteTemperatureSensorRefreshInterval = (device.miElHvac?.remoteTemperatureSensor?.refreshInterval ?? 5) * 1000;
|
|
53
|
+
const refreshInterval = (device.refreshInterval ?? 5) * 1000;
|
|
52
54
|
|
|
53
55
|
//log
|
|
54
56
|
const logLevel = {
|
|
@@ -115,19 +117,19 @@ class tasmotaPlatform {
|
|
|
115
117
|
let deviceType;
|
|
116
118
|
switch (type) {
|
|
117
119
|
case 0: //mielhvac
|
|
118
|
-
deviceType = new MiElHvac(api, device, info, serialNumber
|
|
120
|
+
deviceType = new MiElHvac(api, device, info, serialNumber);
|
|
119
121
|
break;
|
|
120
122
|
case 1: //switches
|
|
121
|
-
deviceType = new Switches(api, device, info, serialNumber
|
|
123
|
+
deviceType = new Switches(api, device, info, serialNumber);
|
|
122
124
|
break;
|
|
123
125
|
case 2: //lights
|
|
124
|
-
deviceType = new Lights(api, device, info, serialNumber
|
|
126
|
+
deviceType = new Lights(api, device, info, serialNumber);
|
|
125
127
|
break;
|
|
126
128
|
case 3: //fans
|
|
127
|
-
deviceType = new Fans(api, device, info, serialNumber
|
|
129
|
+
deviceType = new Fans(api, device, info, serialNumber);
|
|
128
130
|
break;
|
|
129
131
|
case 4: //sensors
|
|
130
|
-
deviceType = new Sensors(api, device, info, serialNumber
|
|
132
|
+
deviceType = new Sensors(api, device, info, serialNumber);
|
|
131
133
|
break;
|
|
132
134
|
default:
|
|
133
135
|
if (logLevel.warn) log.warn(`Device: ${host} ${deviceName}, unknown device: ${info.deviceTypes}.`);
|
|
@@ -146,8 +148,13 @@ class tasmotaPlatform {
|
|
|
146
148
|
api.publishExternalAccessories(PluginName, [accessory]);
|
|
147
149
|
if (logLevel.success) log.success(`Device: ${host} ${deviceName}, Published as external accessory.`);
|
|
148
150
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
+
//start impulse generator
|
|
152
|
+
const timers = [{ name: 'checkState', sampling: refreshInterval }];
|
|
153
|
+
if (remoteTemperatureSensorEnable) timers.push({ name: 'updateRemoteTemp', sampling: remoteTemperatureSensorRefreshInterval });
|
|
154
|
+
await deviceType.impulseGenerator(true, timers);
|
|
155
|
+
|
|
156
|
+
//stop impulse generator
|
|
157
|
+
await impulseGenerator.state(false);
|
|
151
158
|
}
|
|
152
159
|
|
|
153
160
|
i++;
|
|
@@ -160,7 +167,7 @@ class tasmotaPlatform {
|
|
|
160
167
|
});
|
|
161
168
|
|
|
162
169
|
//start impulse generator
|
|
163
|
-
await impulseGenerator.
|
|
170
|
+
await impulseGenerator.state(true, [{ name: 'start', sampling: 120000 }]);
|
|
164
171
|
} catch (error) {
|
|
165
172
|
if (logLevel.error) log.error(`Device: ${host} ${deviceName}, Did finish launching error: ${error.message ?? error}.`);
|
|
166
173
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "Tasmota Control",
|
|
3
3
|
"name": "homebridge-tasmota-control",
|
|
4
|
-
"version": "1.7.10-beta.
|
|
4
|
+
"version": "1.7.10-beta.2",
|
|
5
5
|
"description": "Homebridge plugin to control Tasmota flashed devices.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"node": "^20 || ^22 || ^24 || ^25"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"axios": "^1.13.
|
|
37
|
+
"axios": "^1.13.2"
|
|
38
38
|
},
|
|
39
39
|
"keywords": [
|
|
40
40
|
"homebridge",
|
package/src/fans.js
CHANGED
|
@@ -6,7 +6,7 @@ import { ApiCommands } from './constants.js';
|
|
|
6
6
|
let Accessory, Characteristic, Service, Categories, AccessoryUUID;
|
|
7
7
|
|
|
8
8
|
class Fans extends EventEmitter {
|
|
9
|
-
constructor(api, config, info, serialNumber
|
|
9
|
+
constructor(api, config, info, serialNumber) {
|
|
10
10
|
super();
|
|
11
11
|
|
|
12
12
|
Accessory = api.platformAccessory;
|
|
@@ -26,7 +26,6 @@ class Fans extends EventEmitter {
|
|
|
26
26
|
this.enableDebugMode = config.enableDebugMode || false;
|
|
27
27
|
this.disableLogInfo = config.disableLogInfo || false;
|
|
28
28
|
this.disableLogDeviceInfo = config.disableLogDeviceInfo || false;
|
|
29
|
-
this.refreshInterval = refreshInterval;
|
|
30
29
|
this.functions = new Functions();
|
|
31
30
|
|
|
32
31
|
//axios instance
|
|
@@ -50,7 +49,7 @@ class Fans extends EventEmitter {
|
|
|
50
49
|
await this.checkState();
|
|
51
50
|
}))
|
|
52
51
|
.on('state', (state) => {
|
|
53
|
-
this.emit('success', `Impulse generator ${state ? 'started' : 'stopped'}
|
|
52
|
+
this.emit(state ? 'success' : 'warn', `Impulse generator ${state ? 'started' : 'stopped'}`);
|
|
54
53
|
});
|
|
55
54
|
}
|
|
56
55
|
|
|
@@ -156,17 +155,6 @@ class Fans extends EventEmitter {
|
|
|
156
155
|
}
|
|
157
156
|
}
|
|
158
157
|
|
|
159
|
-
async startImpulseGenerator() {
|
|
160
|
-
try {
|
|
161
|
-
//start impulse generator
|
|
162
|
-
const timers = [{ name: 'checkState', sampling: this.refreshInterval }];
|
|
163
|
-
await this.impulseGenerator.start(timers);
|
|
164
|
-
return true;
|
|
165
|
-
} catch (error) {
|
|
166
|
-
throw new Error(`Impulse generator start error: ${error}`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
158
|
async deviceInfo() {
|
|
171
159
|
this.emit('devInfo', `----- ${this.info.deviceName} -----`);
|
|
172
160
|
this.emit('devInfo', `Manufacturer: Tasmota`);
|
package/src/impulsegenerator.js
CHANGED
|
@@ -7,46 +7,34 @@ class ImpulseGenerator extends EventEmitter {
|
|
|
7
7
|
this.timers = [];
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
async
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
async state(state, timers = []) {
|
|
11
|
+
// Stop current timers before new start
|
|
12
|
+
if (this.timersState && state) {
|
|
13
|
+
await this.state(false);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
for (const timer of timers) {
|
|
19
|
-
this.emit(timer.name);
|
|
20
|
-
|
|
21
|
-
const interval = setInterval(() => {
|
|
22
|
-
this.emit(timer.name);
|
|
23
|
-
}, timer.sampling);
|
|
16
|
+
if (state) {
|
|
17
|
+
if (!Array.isArray(timers)) throw new Error('Timers must be an array');
|
|
24
18
|
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
for (const { name, sampling } of timers) {
|
|
20
|
+
if (!name || !sampling) continue;
|
|
27
21
|
|
|
28
|
-
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
22
|
+
this.emit(name);
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
24
|
+
const interval = setInterval(() => {
|
|
25
|
+
this.emit(name);
|
|
26
|
+
}, sampling);
|
|
37
27
|
|
|
38
|
-
|
|
39
|
-
|
|
28
|
+
this.timers.push(interval);
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
this.timers.forEach(clearInterval);
|
|
32
|
+
this.timers = [];
|
|
40
33
|
}
|
|
41
34
|
|
|
42
|
-
this.timers = [];
|
|
43
|
-
this.state(false);
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
state(state) {
|
|
48
35
|
this.timersState = state;
|
|
49
36
|
this.emit('state', state);
|
|
37
|
+
return true;
|
|
50
38
|
}
|
|
51
39
|
}
|
|
52
40
|
|
package/src/lights.js
CHANGED
|
@@ -6,7 +6,7 @@ import { ApiCommands } from './constants.js';
|
|
|
6
6
|
let Accessory, Characteristic, Service, Categories, AccessoryUUID;
|
|
7
7
|
|
|
8
8
|
class Lights extends EventEmitter {
|
|
9
|
-
constructor(api, config, info, serialNumber
|
|
9
|
+
constructor(api, config, info, serialNumber) {
|
|
10
10
|
super();
|
|
11
11
|
|
|
12
12
|
Accessory = api.platformAccessory;
|
|
@@ -25,7 +25,6 @@ class Lights extends EventEmitter {
|
|
|
25
25
|
this.enableDebugMode = config.enableDebugMode || false;
|
|
26
26
|
this.disableLogInfo = config.disableLogInfo || false;
|
|
27
27
|
this.disableLogDeviceInfo = config.disableLogDeviceInfo || false;
|
|
28
|
-
this.refreshInterval = refreshInterval;
|
|
29
28
|
this.functions = new Functions();
|
|
30
29
|
|
|
31
30
|
//axios instance
|
|
@@ -47,7 +46,7 @@ class Lights extends EventEmitter {
|
|
|
47
46
|
await this.checkState();
|
|
48
47
|
}))
|
|
49
48
|
.on('state', (state) => {
|
|
50
|
-
this.emit('success', `Impulse generator ${state ? 'started' : 'stopped'}
|
|
49
|
+
this.emit(state ? 'success' : 'warn', `Impulse generator ${state ? 'started' : 'stopped'}`);
|
|
51
50
|
});
|
|
52
51
|
}
|
|
53
52
|
|
|
@@ -153,11 +152,10 @@ class Lights extends EventEmitter {
|
|
|
153
152
|
}
|
|
154
153
|
}
|
|
155
154
|
|
|
156
|
-
async
|
|
155
|
+
async startStopImpulseGenerator(state, timers = []) {
|
|
157
156
|
try {
|
|
158
157
|
//start impulse generator
|
|
159
|
-
|
|
160
|
-
await this.impulseGenerator.start(timers);
|
|
158
|
+
await this.melCloudAta.impulseGenerator.state(state, timers)
|
|
161
159
|
return true;
|
|
162
160
|
} catch (error) {
|
|
163
161
|
throw new Error(`Impulse generator start error: ${error}`);
|
package/src/mielhvac.js
CHANGED
|
@@ -6,7 +6,7 @@ import { ApiCommands, MiElHVAC, TemperatureDisplayUnits } from './constants.js';
|
|
|
6
6
|
let Accessory, Characteristic, Service, Categories, AccessoryUUID;
|
|
7
7
|
|
|
8
8
|
class MiElHvac extends EventEmitter {
|
|
9
|
-
constructor(api, config, info, serialNumber
|
|
9
|
+
constructor(api, config, info, serialNumber) {
|
|
10
10
|
super();
|
|
11
11
|
|
|
12
12
|
Accessory = api.platformAccessory;
|
|
@@ -29,72 +29,40 @@ class MiElHvac extends EventEmitter {
|
|
|
29
29
|
const remoteTemperatureSensor = miElHvac.remoteTemperatureSensor ?? {};
|
|
30
30
|
const remoteTemperatureSensorEnable = remoteTemperatureSensor.enable || false;
|
|
31
31
|
const remoteTemperatureSensorPath = remoteTemperatureSensor.path;
|
|
32
|
-
const remoteTemperatureSensorRefreshInterval = remoteTemperatureSensor.refreshInterval * 1000 || 5000;
|
|
33
32
|
const remoteTemperatureSensorAuth = remoteTemperatureSensor.auth || false;
|
|
34
33
|
const remoteTemperatureSensorUser = remoteTemperatureSensor.user;
|
|
35
34
|
const remoteTemperatureSensorPasswd = remoteTemperatureSensor.passwd;
|
|
36
35
|
this.remoteTemperatureSensorEnable = remoteTemperatureSensorEnable;
|
|
37
|
-
this.remoteTemperatureSensorRefreshInterval = remoteTemperatureSensorRefreshInterval;
|
|
38
36
|
|
|
39
37
|
//presets
|
|
40
|
-
|
|
41
|
-
this.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (!displayType) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const presetyServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][displayType];
|
|
49
|
-
const presetCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][displayType];
|
|
50
|
-
preset.serviceType = presetyServiceType;
|
|
51
|
-
preset.characteristicType = presetCharacteristicType;
|
|
38
|
+
this.presets = (miElHvac.presets || []).filter(preset => (preset.displayType ?? 0) > 0);
|
|
39
|
+
for (const preset of this.presets) {
|
|
40
|
+
preset.serviceType = [null, Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][preset.displayType];
|
|
41
|
+
preset.characteristicType = [null, Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][preset.displayType];
|
|
52
42
|
preset.name = preset.name || 'Preset';
|
|
53
43
|
preset.state = false;
|
|
54
44
|
preset.previousSettings = {};
|
|
55
|
-
this.presetsConfigured.push(preset);
|
|
56
45
|
}
|
|
57
|
-
this.presetsConfiguredCount = this.presetsConfigured.length || 0;
|
|
58
46
|
|
|
59
47
|
//buttons
|
|
60
|
-
|
|
61
|
-
this.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (!displayType) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const buttonServiceType = ['', Service.Outlet, Service.Switch][displayType];
|
|
69
|
-
const buttonCharacteristicType = ['', Characteristic.On, Characteristic.On][displayType];
|
|
70
|
-
button.serviceType = buttonServiceType;
|
|
71
|
-
button.characteristicType = buttonCharacteristicType;
|
|
48
|
+
this.buttons = (miElHvac.buttons || []).filter(button => (button.displayType ?? 0) > 0);
|
|
49
|
+
for (const button of this.buttons) {
|
|
50
|
+
button.serviceType = [null, Service.Outlet, Service.Switch][button.displayType];
|
|
51
|
+
button.characteristicType = [null, Characteristic.On, Characteristic.On][button.displayType];
|
|
72
52
|
button.name = button.name || 'Button';
|
|
73
53
|
button.state = false;
|
|
74
54
|
button.previousValue = null;
|
|
75
|
-
this.buttonsConfigured.push(button);
|
|
76
55
|
}
|
|
77
|
-
this.buttonsConfiguredCount = this.buttonsConfigured.length || 0;
|
|
78
56
|
|
|
79
57
|
//sensors
|
|
80
|
-
|
|
81
|
-
this.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (!displayType) {
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const sensorServiceType = ['', Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][displayType];
|
|
89
|
-
const sensorCharacteristicType = ['', Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][displayType];
|
|
90
|
-
sensor.serviceType = sensorServiceType;
|
|
91
|
-
sensor.characteristicType = sensorCharacteristicType;
|
|
58
|
+
this.sensors = (miElHvac.sensors || []).filter(sensor => (sensor.displayType ?? 0) > 0);
|
|
59
|
+
for (const sensor of this.sensors) {
|
|
60
|
+
sensor.serviceType = [null, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][sensor.displayType];
|
|
61
|
+
sensor.characteristicType = [null, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][sensor.displayType];
|
|
92
62
|
sensor.name = sensor.name || 'Sensor';
|
|
93
63
|
sensor.state = false;
|
|
94
64
|
sensor.previousValue = null;
|
|
95
|
-
this.sensorsConfigured.push(sensor);
|
|
96
65
|
}
|
|
97
|
-
this.sensorsConfiguredCount = this.sensorsConfigured.length || 0;
|
|
98
66
|
|
|
99
67
|
//frost protect
|
|
100
68
|
const frostProtect = miElHvac.frostProtect ?? {};
|
|
@@ -112,7 +80,6 @@ class MiElHvac extends EventEmitter {
|
|
|
112
80
|
this.enableDebugMode = config.enableDebugMode || false;
|
|
113
81
|
this.disableLogInfo = config.disableLogInfo || false;
|
|
114
82
|
this.disableLogDeviceInfo = config.disableLogDeviceInfo || false;
|
|
115
|
-
this.refreshInterval = refreshInterval;
|
|
116
83
|
|
|
117
84
|
//mielhvac
|
|
118
85
|
this.mielHvac = {};
|
|
@@ -158,7 +125,7 @@ class MiElHvac extends EventEmitter {
|
|
|
158
125
|
await this.checkState();
|
|
159
126
|
}))
|
|
160
127
|
.on('state', (state) => {
|
|
161
|
-
this.emit('success', `Impulse generator ${state ? 'started' : 'stopped'}
|
|
128
|
+
this.emit(state ? 'success' : 'warn', `Impulse generator ${state ? 'started' : 'stopped'}`);
|
|
162
129
|
});
|
|
163
130
|
}
|
|
164
131
|
|
|
@@ -434,8 +401,8 @@ class MiElHvac extends EventEmitter {
|
|
|
434
401
|
}
|
|
435
402
|
|
|
436
403
|
// Update presets state
|
|
437
|
-
if (this.
|
|
438
|
-
this.
|
|
404
|
+
if (this.presets.length > 0) {
|
|
405
|
+
this.presets.forEach((preset, index) => {
|
|
439
406
|
let iseeMode = operationMode;
|
|
440
407
|
if (iseeMode === 'heat_isee') iseeMode = 'heat';
|
|
441
408
|
else if (iseeMode === 'dry_isee') iseeMode = 'dry';
|
|
@@ -452,7 +419,7 @@ class MiElHvac extends EventEmitter {
|
|
|
452
419
|
});
|
|
453
420
|
}
|
|
454
421
|
|
|
455
|
-
if (this.
|
|
422
|
+
if (this.buttons.length > 0) {
|
|
456
423
|
const modeMap = {
|
|
457
424
|
0: () => power === 1,
|
|
458
425
|
1: () => power && ['heat', 'heat_isee'].includes(operationMode),
|
|
@@ -521,7 +488,7 @@ class MiElHvac extends EventEmitter {
|
|
|
521
488
|
63: 'on', //nightmode
|
|
522
489
|
};
|
|
523
490
|
|
|
524
|
-
this.
|
|
491
|
+
this.buttons.forEach((button, index) => {
|
|
525
492
|
const mode = button.mode;
|
|
526
493
|
let state = false;
|
|
527
494
|
|
|
@@ -550,14 +517,14 @@ class MiElHvac extends EventEmitter {
|
|
|
550
517
|
});
|
|
551
518
|
}
|
|
552
519
|
|
|
553
|
-
if (this.
|
|
520
|
+
if (this.sensors.length > 0) {
|
|
554
521
|
const powerOn = power === 1;
|
|
555
522
|
|
|
556
523
|
// Helper: match by value with power check
|
|
557
524
|
const is = (val, match) => powerOn && val === match;
|
|
558
525
|
const isOneOf = (val, matches) => powerOn && matches.includes(val);
|
|
559
526
|
|
|
560
|
-
this.
|
|
527
|
+
this.sensors.forEach((sensor, index) => {
|
|
561
528
|
const mode = sensor.mode;
|
|
562
529
|
|
|
563
530
|
const sensorStates = {
|
|
@@ -691,18 +658,6 @@ class MiElHvac extends EventEmitter {
|
|
|
691
658
|
}
|
|
692
659
|
}
|
|
693
660
|
|
|
694
|
-
async startImpulseGenerator() {
|
|
695
|
-
try {
|
|
696
|
-
//start impulse generator
|
|
697
|
-
const timers = [{ name: 'checkState', sampling: this.refreshInterval }];
|
|
698
|
-
if (this.remoteTemperatureSensorEnable) timers.push({ name: 'updateRemoteTemp', sampling: this.remoteTemperatureSensorRefreshInterval });
|
|
699
|
-
await this.impulseGenerator.start(timers);
|
|
700
|
-
return true;
|
|
701
|
-
} catch (error) {
|
|
702
|
-
throw new Error(`Impulse generator start error: ${error}`);
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
|
|
706
661
|
async deviceInfo() {
|
|
707
662
|
this.emit('devInfo', `----- ${this.info.deviceName} -----`);
|
|
708
663
|
this.emit('devInfo', `Manufacturer: Tasmota`);
|
|
@@ -952,11 +907,11 @@ class MiElHvac extends EventEmitter {
|
|
|
952
907
|
accessory.addService(this.miElHvacService);
|
|
953
908
|
|
|
954
909
|
//presets services
|
|
955
|
-
if (this.
|
|
910
|
+
if (this.presets.length > 0) {
|
|
956
911
|
if (this.enableDebugMode) this.emit('debug', 'Prepare presets services');
|
|
957
912
|
this.presetsServices = [];
|
|
958
913
|
|
|
959
|
-
this.
|
|
914
|
+
this.presets.forEach((preset, index) => {
|
|
960
915
|
const { name: presetName, namePrefix, serviceType, characteristicType, mode, setTemp, fanSpeed, swingV, swingH } = preset;
|
|
961
916
|
const serviceName = namePrefix ? `${accessoryName} ${presetName}` : presetName;
|
|
962
917
|
|
|
@@ -1004,11 +959,11 @@ class MiElHvac extends EventEmitter {
|
|
|
1004
959
|
}
|
|
1005
960
|
|
|
1006
961
|
|
|
1007
|
-
if (this.
|
|
962
|
+
if (this.buttons.length > 0) {
|
|
1008
963
|
if (this.enableDebugMode) this.emit('debug', 'Prepare buttons services');
|
|
1009
964
|
this.buttonsServices = [];
|
|
1010
965
|
|
|
1011
|
-
this.
|
|
966
|
+
this.buttons.forEach((button, index) => {
|
|
1012
967
|
const { mode, name: buttonName, namePrefix, serviceType, characteristicType } = button;
|
|
1013
968
|
const serviceName = namePrefix ? `${accessoryName} ${buttonName}` : buttonName;
|
|
1014
969
|
|
|
@@ -1127,13 +1082,12 @@ class MiElHvac extends EventEmitter {
|
|
|
1127
1082
|
});
|
|
1128
1083
|
}
|
|
1129
1084
|
|
|
1130
|
-
|
|
1131
1085
|
//sensors services
|
|
1132
|
-
if (this.
|
|
1086
|
+
if (this.sensors.length > 0) {
|
|
1133
1087
|
if (this.enableDebugMode) this.emit('debug', `Prepare sensors services`);
|
|
1134
1088
|
this.sensorsServices = [];
|
|
1135
1089
|
|
|
1136
|
-
this.
|
|
1090
|
+
this.sensors.forEach((sensor, index) => {
|
|
1137
1091
|
//get sensor name
|
|
1138
1092
|
const sensorName = sensor.name;
|
|
1139
1093
|
|
package/src/sensors.js
CHANGED
|
@@ -6,7 +6,7 @@ import { ApiCommands, SensorKeys } from './constants.js';
|
|
|
6
6
|
let Accessory, Characteristic, Service, Categories, AccessoryUUID;
|
|
7
7
|
|
|
8
8
|
class Sensors extends EventEmitter {
|
|
9
|
-
constructor(api, config, info, serialNumber
|
|
9
|
+
constructor(api, config, info, serialNumber) {
|
|
10
10
|
super();
|
|
11
11
|
|
|
12
12
|
Accessory = api.platformAccessory;
|
|
@@ -24,7 +24,6 @@ class Sensors extends EventEmitter {
|
|
|
24
24
|
this.enableDebugMode = config.enableDebugMode || false;
|
|
25
25
|
this.disableLogInfo = config.disableLogInfo || false;
|
|
26
26
|
this.disableLogDeviceInfo = config.disableLogDeviceInfo || false;
|
|
27
|
-
this.refreshInterval = refreshInterval;
|
|
28
27
|
this.functions = new Functions();
|
|
29
28
|
|
|
30
29
|
//sensors
|
|
@@ -49,7 +48,7 @@ class Sensors extends EventEmitter {
|
|
|
49
48
|
await this.checkState();
|
|
50
49
|
}))
|
|
51
50
|
.on('state', (state) => {
|
|
52
|
-
this.emit('success', `Impulse generator ${state ? 'started' : 'stopped'}
|
|
51
|
+
this.emit(state ? 'success' : 'warn', `Impulse generator ${state ? 'started' : 'stopped'}`);
|
|
53
52
|
});
|
|
54
53
|
}
|
|
55
54
|
|
|
@@ -192,17 +191,6 @@ class Sensors extends EventEmitter {
|
|
|
192
191
|
}
|
|
193
192
|
}
|
|
194
193
|
|
|
195
|
-
async startImpulseGenerator() {
|
|
196
|
-
try {
|
|
197
|
-
//start impulse generator
|
|
198
|
-
const timers = [{ name: 'checkState', sampling: this.refreshInterval }];
|
|
199
|
-
await this.impulseGenerator.start(timers);
|
|
200
|
-
return true;
|
|
201
|
-
} catch (error) {
|
|
202
|
-
throw new Error(`Impulse generator start error: ${error}`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
194
|
async deviceInfo() {
|
|
207
195
|
this.emit('devInfo', `----- ${this.info.deviceName} -----`);
|
|
208
196
|
this.emit('devInfo', `Manufacturer: Tasmota`);
|
package/src/switches.js
CHANGED
|
@@ -6,7 +6,7 @@ import { ApiCommands } from './constants.js';
|
|
|
6
6
|
let Accessory, Characteristic, Service, Categories, AccessoryUUID;
|
|
7
7
|
|
|
8
8
|
class Switches extends EventEmitter {
|
|
9
|
-
constructor(api, config, info, serialNumber
|
|
9
|
+
constructor(api, config, info, serialNumber) {
|
|
10
10
|
super();
|
|
11
11
|
|
|
12
12
|
Accessory = api.platformAccessory;
|
|
@@ -26,7 +26,6 @@ class Switches extends EventEmitter {
|
|
|
26
26
|
this.enableDebugMode = config.enableDebugMode || false;
|
|
27
27
|
this.disableLogInfo = config.disableLogInfo || false;
|
|
28
28
|
this.disableLogDeviceInfo = config.disableLogDeviceInfo || false;
|
|
29
|
-
this.refreshInterval = refreshInterval;
|
|
30
29
|
this.functions = new Functions();
|
|
31
30
|
|
|
32
31
|
//axios instance
|
|
@@ -48,7 +47,7 @@ class Switches extends EventEmitter {
|
|
|
48
47
|
await this.checkState();
|
|
49
48
|
}))
|
|
50
49
|
.on('state', (state) => {
|
|
51
|
-
this.emit('success', `Impulse generator ${state ? 'started' : 'stopped'}
|
|
50
|
+
this.emit(state ? 'success' : 'warn', `Impulse generator ${state ? 'started' : 'stopped'}`);
|
|
52
51
|
});
|
|
53
52
|
}
|
|
54
53
|
|
|
@@ -108,17 +107,6 @@ class Switches extends EventEmitter {
|
|
|
108
107
|
}
|
|
109
108
|
}
|
|
110
109
|
|
|
111
|
-
async startImpulseGenerator() {
|
|
112
|
-
try {
|
|
113
|
-
//start impulse generator
|
|
114
|
-
const timers = [{ name: 'checkState', sampling: this.refreshInterval }];
|
|
115
|
-
await this.impulseGenerator.start(timers);
|
|
116
|
-
return true;
|
|
117
|
-
} catch (error) {
|
|
118
|
-
throw new Error(`Impulse generator start error: ${error}`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
110
|
async deviceInfo() {
|
|
123
111
|
this.emit('devInfo', `----- ${this.info.deviceName} -----`);
|
|
124
112
|
this.emit('devInfo', `Manufacturer: Tasmota`);
|