Allow to disable Home Assistant via MQTT. #3281 (#4007)

* Initial

* Updates
This commit is contained in:
Koen Kanters authored and GitHub committed 2020-07-29 23:10:03 +02:00
1 parent b9c52ef96e
commit 274109bc85
8 files changed
+132 -11

No files matched your search

+29 -3
View File
@@ -9,6 +9,7 @@ const utils = require('./util/utils');
const fs = require('fs');
const data = require('./util/data');
const path = require('path');
const assert = require('assert');
// Extensions
const ExtensionPublish = require('./extension/publish');
@@ -28,6 +29,13 @@ const ExtensionOnEvent = require('./extension/onEvent');
const ExtensionOTAUpdate = require('./extension/otaUpdate');
const ExtensionExternalConverters = require('./extension/externalConverters');
const AllExtensions = [
ExtensionPublish, ExtensionReceive, ExtensionNetworkMap, ExtensionSoftReset, ExtensionHomeAssistant,
ExtensionConfigure, ExtensionDeviceGroupMembership, ExtensionBridgeLegacy, ExtensionBridge, ExtensionGroups,
ExtensionAvailability, ExtensionBind, ExtensionReport, ExtensionOnEvent, ExtensionOTAUpdate,
ExtensionExternalConverters,
];
class Controller {
constructor() {
this.zigbee = new Zigbee();
@@ -36,6 +44,7 @@ class Controller {
this.state = new State(this.eventBus);
this.publishEntityState = this.publishEntityState.bind(this);
this.enableDisableExtension = this.enableDisableExtension.bind(this);
this.onZigbeeAdapterDisconnected = this.onZigbeeAdapterDisconnected.bind(this);
// Initialize extensions.
@@ -53,7 +62,7 @@ class Controller {
];
if (settings.get().experimental.new_api) {
this.extensions.push(new ExtensionBridge(...args));
this.extensions.push(new ExtensionBridge(...args, this.enableDisableExtension));
}
if (settings.get().advanced.legacy_api) {
@@ -161,6 +170,23 @@ class Controller {
await this.callExtensionMethod('onMQTTConnected', []);
}
async enableDisableExtension(enable, name) {
if (!enable) {
const extension = this.extensions.find((e) => e.constructor.name === name);
if (extension) {
await this.callExtensionMethod('stop', [], [extension]);
this.extensions.splice(this.extensions.indexOf(extension), 1);
}
} else {
const Extension = AllExtensions.find((e) => e.name === name);
assert(Extension, `Extension '${name}' does not exist`);
const extension = new Extension(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus);
this.extensions.push(extension);
this.callExtensionMethod('onZigbeeStarted', [], [extension]);
this.callExtensionMethod('onMQTTConnected', [], [extension]);
}
}
async stop() {
// Call extensions
await this.callExtensionMethod('stop', []);
@@ -343,8 +369,8 @@ class Controller {
}
}
async callExtensionMethod(method, parameters) {
for (const extension of this.extensions) {
async callExtensionMethod(method, parameters, extensions=null) {
for (const extension of extensions || this.extensions) {
if (extension[method]) {
try {
await extension[method](...parameters);