-
-
Notifications
You must be signed in to change notification settings - Fork 280
/
init.js
126 lines (110 loc) · 3.76 KB
/
init.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const logger = require('../../../utils/logger');
const { CONFIGURATION, MQTT_MODE } = require('./constants');
const { generate } = require('../../../utils/password');
const { PlatformNotCompatible } = require('../../../utils/coreErrors');
/**
* @description Prepares service and starts connection with broker if needed.
* @param {boolean} setupMode - In setup mode.
* @returns {Promise} Resolve when init finished.
* @example
* await z2m.init();
*/
async function init(setupMode = false) {
// Reset status
this.usbConfigured = false;
this.mqttExist = false;
this.mqttRunning = false;
this.mqttContainerRunning = false;
this.zigbee2mqttExist = false;
this.zigbee2mqttRunning = false;
this.gladysConnected = false;
this.zigbee2mqttConnected = false;
this.z2mPermitJoin = false;
this.networkModeValid = false;
this.dockerBased = false;
// Load stored configuration
const configuration = await this.getConfiguration();
const { z2mDriverPath, mqttPassword, mqttMode, mqttUrl } = configuration;
try {
const dockerBased = await this.gladys.system.isDocker();
if (!dockerBased) {
throw new PlatformNotCompatible('SYSTEM_NOT_RUNNING_DOCKER');
}
this.dockerBased = true;
this.emitStatusEvent();
const networkMode = await this.gladys.system.getNetworkMode();
if (networkMode !== 'host') {
throw new PlatformNotCompatible('DOCKER_BAD_NETWORK');
}
} catch (e) {
logger.debug(e);
if (mqttMode !== MQTT_MODE.EXTERNAL) {
throw e;
}
}
this.networkModeValid = true;
this.emitStatusEvent();
// Test if dongle is present
this.usbConfigured = false;
if (!z2mDriverPath) {
logger.info(`Zigbee2mqtt USB dongle not attached`);
} else {
const usb = this.gladys.service.getService('usb');
const usbList = await usb.list();
const usbPort = usbList.find((usbDriver) => usbDriver.path === z2mDriverPath);
if (usbPort) {
logger.info(`Zigbee2mqtt USB dongle attached to ${z2mDriverPath}`);
this.usbConfigured = true;
} else {
logger.warn(`Zigbee2mqtt USB dongle detached to ${z2mDriverPath}`);
this.usbConfigured = false;
}
}
this.emitStatusEvent();
if (mqttMode === MQTT_MODE.LOCAL) {
// Check for existing credentials for Gladys
if (!mqttPassword) {
configuration.mqttUsername = CONFIGURATION.GLADYS_MQTT_USERNAME_VALUE;
configuration.mqttPassword = generate(20, {
number: true,
lowercase: true,
uppercase: true,
});
}
// Verify that mqttUrl is present
if (!mqttUrl) {
configuration.mqttUrl = CONFIGURATION.MQTT_URL_VALUE;
}
// Check for existing credentials for Z2M
if (!configuration.z2mMqttPassword) {
configuration.z2mMqttUsername = CONFIGURATION.Z2M_MQTT_USERNAME_VALUE;
configuration.z2mMqttPassword = generate(20, {
number: true,
lowercase: true,
uppercase: true,
});
}
}
if (this.usbConfigured) {
logger.debug('Zibgee2mqtt: installing and starting required docker containers...');
// We force set the mqttMode to local for existing instances
configuration.mqttMode = MQTT_MODE.LOCAL;
await this.checkForContainerUpdates(configuration);
await this.installMqttContainer(configuration);
await this.installZ2mContainer(configuration, setupMode);
if (this.isEnabled()) {
await this.connect(configuration);
// Schedule reccurent job if not already scheduled
if (!this.backupScheduledJob) {
this.backupScheduledJob = this.gladys.scheduler.scheduleJob('0 0 23 * * *', () => this.backup());
}
}
} else if (configuration.mqttMode === MQTT_MODE.EXTERNAL) {
await this.connect(configuration);
}
await this.saveConfiguration(configuration);
return null;
}
module.exports = {
init,
};