diff --git a/lib/controller.js b/lib/controller.js index f9cb586c..ea4ece49 100644 --- a/lib/controller.js +++ b/lib/controller.js @@ -50,40 +50,41 @@ class Controller { this.configureDevice(device); }); + // Enable zigbee join. + if (settings.get().permit_join) { + logger.warn('`permit_join` set to `true` in configuration.yaml.'); + logger.warn('Allowing new devices to join.'); + logger.warn('Set `permit_join` to `false` once you joined all devices.'); + this.zigbee.permitJoin(true); + } + + // Start timers. + this.pollTimer(true); + this.softResetTimeout(true); + // Connect to MQTT broker const subscriptions = [ `${settings.get().mqtt.base_topic}/+/set`, `${settings.get().mqtt.base_topic}/+/+/set`, `${settings.get().mqtt.base_topic}/bridge/config/+`, ]; - this.mqtt.connect(this.handleMQTTMessage, subscriptions, () => this.handleStarted()); + + this.mqtt.connect(this.handleMQTTMessage, subscriptions, () => this.handleMQTTConnected()); } }); } - handleStarted() { - // Home Assistant MQTT discovery on startup. + handleMQTTConnected() { + // Home Assistant MQTT discovery on MQTT connected. if (settings.get().homeassistant) { // MQTT discovery of all paired devices on startup. this.zigbee.getAllClients().forEach((device) => { const mappedModel = zigbeeShepherdConverters.findByZigbeeModel(device.modelId); if (mappedModel) { - homeassistant.discover(device.ieeeAddr, mappedModel.model, this.mqtt); + homeassistant.discover(device.ieeeAddr, mappedModel.model, this.mqtt, true); } }); } - - // Enable zigbee join. - if (settings.get().permit_join) { - logger.warn('`permit_join` set to `true` in configuration.yaml.'); - logger.warn('Allowing new devices to join.'); - logger.warn('Set `permit_join` to `false` once you joined all devices.'); - this.zigbee.permitJoin(true); - } - - // Start timers. - this.pollTimer(true); - this.softResetTimeout(true); } softResetTimeout(start) { @@ -238,7 +239,7 @@ class Controller { // Home Assistant MQTT discovery if (settings.get().homeassistant) { - homeassistant.discover(device.ieeeAddr, mappedModel.model, this.mqtt); + homeassistant.discover(device.ieeeAddr, mappedModel.model, this.mqtt, false); } // After this point we cant handle message withoud cid anymore. diff --git a/lib/homeassistant.js b/lib/homeassistant.js index 9c991655..8a3083f7 100644 --- a/lib/homeassistant.js +++ b/lib/homeassistant.js @@ -262,9 +262,10 @@ const mapping = { // A map of all discoverd devices const discovered = {}; -function discover(deviceID, model, mqtt) { +function discover(deviceID, model, mqtt, force) { // Check if already discoverd and check if there are configs. - if (discovered[deviceID] || !mapping[model] || !settings.getDevice(deviceID)) { + const discover = force || !discovered[deviceID]; + if (!discover || !mapping[model] || !settings.getDevice(deviceID)) { return; } @@ -313,6 +314,6 @@ function clear(deviceID, model, mqtt) { module.exports = { mapping: mapping, - discover: (deviceID, model, mqtt) => discover(deviceID, model, mqtt), + discover: (deviceID, model, mqtt, force) => discover(deviceID, model, mqtt, force), clear: (deviceID, model, mqtt) => clear(deviceID, model, mqtt), };