diff --git a/lib/extension/extensionTemplate.js b/lib/extension/baseExtension.js similarity index 76% rename from lib/extension/extensionTemplate.js rename to lib/extension/baseExtension.js index 5eb16445..5891eed3 100644 --- a/lib/extension/extensionTemplate.js +++ b/lib/extension/baseExtension.js @@ -1,10 +1,4 @@ -/* istanbul ignore file */ - -/** - * This extensions is for documentation purposes only. - * It describes all methods that are called by the controller. - */ -class ExtensionTemplate { +class BaseExtension { /** * Besides intializing variables, the constructor should do nothing! * @@ -23,12 +17,12 @@ class ExtensionTemplate { /** * This method is called by the controller once Zigbee has been started. */ - onZigbeeStarted() {} + // onZigbeeStarted() {} /** * This method is called by the controller once connected to the MQTT server. */ - onMQTTConnected() {} + // onMQTTConnected() {} /** * Is called when a Zigbee message from a device is received. @@ -36,7 +30,7 @@ class ExtensionTemplate { * @param {Object?} device The device of the message (can be null) * @param {Object?} mappedDevice The mapped device (can be null) */ - onZigbeeMessage(message, device, mappedDevice) {} + // onZigbeeMessage(message, device, mappedDevice) {} /** * Is called when a MQTT message is received @@ -44,14 +38,12 @@ class ExtensionTemplate { * @param {Object} message The received message * @return {boolean} if the message was handled */ - onMQTTMessage(topic, message) { - return false; - } + // onMQTTMessage(topic, message) {} /** * Is called once the extension has to stop */ - stop() {} + // stop() {} } -module.exports = ExtensionTemplate; +module.exports = BaseExtension; diff --git a/lib/extension/bridgeConfig.js b/lib/extension/bridgeConfig.js index acaec623..08794f97 100644 --- a/lib/extension/bridgeConfig.js +++ b/lib/extension/bridgeConfig.js @@ -3,16 +3,14 @@ const logger = require('../util/logger'); const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters'); const utils = require('../util/utils'); const assert = require('assert'); +const BaseExtension = require('./baseExtension'); const configRegex = new RegExp(`${settings.get().mqtt.base_topic}/bridge/config/((?:\\w+/get)|(?:\\w+))`); const allowedLogLevels = ['error', 'warn', 'info', 'debug']; -class BridgeConfig { +class BridgeConfig extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; - this.publishEntityState = publishEntityState; + super(zigbee, mqtt, state, publishEntityState); // Bind functions this.permitJoin = this.permitJoin.bind(this); diff --git a/lib/extension/deviceAvailability.js b/lib/extension/deviceAvailability.js index 462e9940..298a6306 100644 --- a/lib/extension/deviceAvailability.js +++ b/lib/extension/deviceAvailability.js @@ -2,6 +2,7 @@ const logger = require('../util/logger'); const settings = require('../util/settings'); const utils = require('../util/utils'); const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters'); +const BaseExtension = require('./baseExtension'); // Some EndDevices should be pinged // e.g. E11-G13 https://github.com/Koenkk/zigbee2mqtt/issues/775#issuecomment-453683846 @@ -14,10 +15,10 @@ const toZigbeeCandidates = ['state', 'brightness', 'color', 'color_temp']; /** * This extensions pings devices to check if they are online. */ -class DeviceAvailability { +class DeviceAvailability extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; + super(zigbee, mqtt, state, publishEntityState); + this.availability_timeout = settings.get().advanced.availability_timeout; this.timers = {}; this.state = {}; diff --git a/lib/extension/deviceBind.js b/lib/extension/deviceBind.js index dc112710..ca2e35c5 100644 --- a/lib/extension/deviceBind.js +++ b/lib/extension/deviceBind.js @@ -2,17 +2,11 @@ const settings = require('../util/settings'); const logger = require('../util/logger'); const assert = require('assert'); const topicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/(bind|unbind)/.+$`); +const BaseExtension = require('./baseExtension'); const clusters = ['genScenes', 'genOnOff', 'genLevelCtrl', 'lightingColorCtrl']; -class DeviceBind { - constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; - this.publishEntityState = publishEntityState; - } - +class DeviceBind extends BaseExtension { onMQTTConnected() { this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/bind/+`); this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/bind/+/+`); diff --git a/lib/extension/deviceConfigure.js b/lib/extension/deviceConfigure.js index fd7241d7..9be90ceb 100644 --- a/lib/extension/deviceConfigure.js +++ b/lib/extension/deviceConfigure.js @@ -1,10 +1,12 @@ const settings = require('../util/settings'); const logger = require('../util/logger'); const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters'); +const BaseExtension = require('./baseExtension'); -class DeviceConfigure { +class DeviceConfigure extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; + super(zigbee, mqtt, state, publishEntityState); + this.configuring = new Set(); this.attempts = {}; } diff --git a/lib/extension/deviceGroupMembership.js b/lib/extension/deviceGroupMembership.js index 951e6edd..2dbbd3f3 100644 --- a/lib/extension/deviceGroupMembership.js +++ b/lib/extension/deviceGroupMembership.js @@ -1,16 +1,11 @@ /* istanbul ignore file */ const settings = require('../util/settings'); const logger = require('../util/logger'); +const BaseExtension = require('./baseExtension'); const topicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/device/(.+)/get_group_membership$`); -class DeviceGroupMembership { - constructor(zigbee, mqtt, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.publishEntityState = publishEntityState; - } - +class DeviceGroupMembership extends BaseExtension { onMQTTConnected() { this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/device/+/get_group_membership`); } diff --git a/lib/extension/deviceReceive.js b/lib/extension/deviceReceive.js index 364a022a..43beba78 100644 --- a/lib/extension/deviceReceive.js +++ b/lib/extension/deviceReceive.js @@ -2,13 +2,11 @@ const settings = require('../util/settings'); const logger = require('../util/logger'); const utils = require('../util/utils'); const debounce = require('debounce'); +const BaseExtension = require('./baseExtension'); -class DeviceReceive { +class DeviceReceive extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; - this.publishEntityState = publishEntityState; + super(zigbee, mqtt, state, publishEntityState); this.coordinator = null; this.elapsed = {}; this.debouncers = {}; diff --git a/lib/extension/deviceReport.js b/lib/extension/deviceReport.js index cb6e02dd..0ff5b598 100644 --- a/lib/extension/deviceReport.js +++ b/lib/extension/deviceReport.js @@ -2,6 +2,7 @@ const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters'); const logger = require('../util/logger'); const CC2530Router = zigbeeHerdsmanConverters.devices.find((d) => d.model === 'CC2530.ROUTER'); const utils = require('../util/utils'); +const BaseExtension = require('./baseExtension'); const defaultConfiguration = { minimumReportInterval: 3, maximumReportInterval: 300, reportableChange: 0, @@ -27,12 +28,9 @@ const clusters = { ], }; -class DeviceReport { +class DeviceReport extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; - this.publishEntityState = publishEntityState; + super(zigbee, mqtt, state, publishEntityState); this.configuring = new Set(); } diff --git a/lib/extension/entityPublish.js b/lib/extension/entityPublish.js index 93dbfe74..be1a4181 100644 --- a/lib/extension/entityPublish.js +++ b/lib/extension/entityPublish.js @@ -4,6 +4,7 @@ const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters'); const logger = require('../util/logger'); const utils = require('../util/utils'); const assert = require('assert'); +const BaseExtension = require('./baseExtension'); const postfixes = utils.getPostfixes(); const topicRegex = new RegExp(`^(.+?)(?:/(${postfixes.join('|')}))?/(get|set)(?:/(.+))?`); @@ -16,14 +17,7 @@ const groupConverters = [ zigbeeHerdsmanConverters.toZigbeeConverters.ignore_transition, ]; -class EntityPublish { - constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; - this.publishEntityState = publishEntityState; - } - +class EntityPublish extends BaseExtension { onMQTTConnected() { // Subscribe to topics. const baseTopic = settings.get().mqtt.base_topic; diff --git a/lib/extension/groups.js b/lib/extension/groups.js index d39fc734..46295ca2 100644 --- a/lib/extension/groups.js +++ b/lib/extension/groups.js @@ -1,15 +1,14 @@ const settings = require('../util/settings'); const logger = require('../util/logger'); +const BaseExtension = require('./baseExtension'); const topicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/group/(.+)/(remove|add|remove_all)$`); const topicRegexRemoveAll = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/group/remove_all$`); -class Groups { +class Groups extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; - this.publishEntityState = publishEntityState; + super(zigbee, mqtt, state, publishEntityState); + this.onStateChange = this.onStateChange.bind(this); } onMQTTConnected() { diff --git a/lib/extension/homeassistant.js b/lib/extension/homeassistant.js index ac30ea72..dffec5a4 100644 --- a/lib/extension/homeassistant.js +++ b/lib/extension/homeassistant.js @@ -2,6 +2,7 @@ const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters'); const settings = require('../util/settings'); const logger = require('../util/logger'); const zigbee2mqttVersion = require('../../package.json').version; +const BaseExtension = require('./baseExtension'); const configurations = { // Binary sensor @@ -907,12 +908,9 @@ Object.keys(mapping).forEach((key) => { /** * This extensions handles integration with HomeAssistant */ -class HomeAssistant { +class HomeAssistant extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; - this.publishEntityState = publishEntityState; + super(zigbee, mqtt, state, publishEntityState); // A map of all discoverd devices this.discovered = {}; diff --git a/lib/extension/livolo.js b/lib/extension/livolo.js index f927bb78..e5328506 100644 --- a/lib/extension/livolo.js +++ b/lib/extension/livolo.js @@ -3,15 +3,16 @@ const utils = require('../util/utils'); const interval = utils.secondsToMilliseconds(1); const logger = require('../util/logger'); +const BaseExtension = require('./baseExtension'); const foundationCfg = {manufSpec: 0, disDefaultRsp: 0}; /** * Extension required for Livolo device support. */ -class Livolo { +class Livolo extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; + super(zigbee, mqtt, state, publishEntityState); this.timer = null; this.configured = {}; } diff --git a/lib/extension/networkMap.js b/lib/extension/networkMap.js index 47dc6144..5b9602ba 100644 --- a/lib/extension/networkMap.js +++ b/lib/extension/networkMap.js @@ -2,12 +2,11 @@ const settings = require('../util/settings'); const utils = require('../util/utils'); const zigbeeHerdsmanConverters = require('zigbee-herdsman-converters'); const logger = require('../util/logger'); +const BaseExtension = require('./baseExtension'); -class NetworkMap { +class NetworkMap extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; - this.mqtt = mqtt; - this.state = state; + super(zigbee, mqtt, state, publishEntityState); // Subscribe to topic. this.topic = `${settings.get().mqtt.base_topic}/bridge/networkmap`; diff --git a/lib/extension/softReset.js b/lib/extension/softReset.js index d2ef03ca..dee3f515 100644 --- a/lib/extension/softReset.js +++ b/lib/extension/softReset.js @@ -1,15 +1,16 @@ /* istanbul ignore file */ -// deprecated +// DEPRECATED const settings = require('../util/settings'); const logger = require('../util/logger'); const utils = require('../util/utils'); +const BaseExtension = require('./baseExtension'); /** * This extensions soft resets the ZNP after a certain timeout. */ -class SoftReset { +class SoftReset extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState) { - this.zigbee = zigbee; + super(zigbee, mqtt, state, publishEntityState); this.timer = null; this.timeout = utils.secondsToMilliseconds(settings.get().advanced.soft_reset_timeout); }