This commit is contained in:
Koen Kanters committed 2020-07-13 23:00:33 +02:00
1 parent 57a2d435a9
commit 8415adc514
5 files changed
+115 -96

No files matched your search

+30 -23
View File
@@ -19,11 +19,11 @@ class Bridge extends Extension {
'group/options': this.groupOptions.bind(this),
'group/remove': this.groupRemove.bind(this),
'group/rename': this.groupRename.bind(this),
'permitjoin': this.permitJoin.bind(this),
'config/lastseen': this.configLastSeen.bind(this),
'permit_join': this.permitJoin.bind(this),
'config/last_seen': this.configLastSeen.bind(this),
'config/elapsed': this.configElapsed.bind(this),
'config/loglevel': this.configLogLevel.bind(this),
'touchlink/factoryreset': this.touchlinkFactoryReset.bind(this),
'config/log_level': this.configLogLevel.bind(this),
'touchlink/factory_reset': this.touchlinkFactoryReset.bind(this),
};
}
@@ -62,9 +62,12 @@ class Bridge extends Extension {
if (['deviceJoined', 'deviceLeave', 'deviceInterview'].includes(type)) {
let payload;
const ieeeAddress = data.device ? data.device.ieeeAddr : data.ieeeAddr;
if (type === 'deviceJoined') payload = {friendlyName: resolvedEntity.settings.friendlyName, ieeeAddress};
else if (type === 'deviceInterview') {
payload = {friendlyName: resolvedEntity.settings.friendlyName, status: data.status, ieeeAddress};
if (type === 'deviceJoined') {
payload = {friendly_name: resolvedEntity.settings.friendlyName, ieee_address: ieeeAddress};
} else if (type === 'deviceInterview') {
payload = {
friendly_name: resolvedEntity.settings.friendlyName, status: data.status, ieee_address: ieeeAddress,
};
if (data.status === 'successful') {
payload.supported = !!resolvedEntity.definition;
payload.definition = resolvedEntity.definition ? {
@@ -74,9 +77,13 @@ class Bridge extends Extension {
supports: resolvedEntity.definition.supports,
} : null;
}
} else payload = {ieeeAddress}; // deviceLeave
} else payload = {ieee_address: ieeeAddress}; // deviceLeave
await this.mqtt.publish('bridge/event', JSON.stringify({type, data: payload}), {retain: false, qos: 0});
await this.mqtt.publish(
'bridge/event',
JSON.stringify({type: utils.toSnakeCase(type), data: payload}),
{retain: false, qos: 0},
);
}
if ('deviceLeave' === type || ('deviceInterview' === type && data.status !== 'started')) {
@@ -105,16 +112,16 @@ class Bridge extends Extension {
}
async groupAdd(message) {
if (typeof message === 'object' && !message.hasOwnProperty('friendlyName')) {
if (typeof message === 'object' && !message.hasOwnProperty('friendly_name')) {
throw new Error(`Invalid payload`);
}
const friendlyName = typeof message === 'object' ? message.friendlyName : message;
const friendlyName = typeof message === 'object' ? message.friendly_name : message;
const ID = typeof message === 'object' && message.hasOwnProperty('ID') ? message.ID : null;
const group = settings.addGroup(friendlyName, ID);
this.zigbee.createGroup(group.ID);
this.publishGroups();
return utils.getResponse(message, {friendlyName: group.friendlyName, ID: group.ID}, null);
return utils.getResponse(message, {friendly_name: group.friendlyName, ID: group.ID}, null);
}
async deviceRename(message) {
@@ -320,8 +327,8 @@ class Bridge extends Extension {
version: this.zigbee2mqttVersion.version,
commit: this.zigbee2mqttVersion.commitHash,
coordinator: this.coordinatorVersion,
logLevel: logger.getLevel(),
permitJoin: await this.zigbee.getPermitJoin(),
log_level: logger.getLevel(),
permit_join: await this.zigbee.getPermitJoin(),
};
await this.mqtt.publish('bridge/info', JSON.stringify(payload), {retain: true, qos: 0});
@@ -339,17 +346,17 @@ class Bridge extends Extension {
} : null;
return {
ieeeAddress: device.ieeeAddr,
ieee_address: device.ieeeAddr,
type: device.type,
networkAddress: device.networkAddress,
network_address: device.networkAddress,
supported: !!definition,
friendlyName: resolved.name,
friendly_name: resolved.name,
definition: definitionPayload,
powerSource: device.powerSource,
softwareBuildID: device.softwareBuildID,
dateCode: device.dateCode,
power_source: device.powerSource,
software_build_ID: device.softwareBuildID,
date_code: device.dateCode,
interviewing: device.interviewing,
interviewCompleted: device.interviewCompleted,
interview_completed: device.interviewCompleted,
};
});
@@ -361,10 +368,10 @@ class Bridge extends Extension {
const resolved = this.zigbee.resolveEntity(group);
return {
ID: group.groupID,
friendlyName: resolved.name,
friendly_name: resolved.name,
members: group.members.map((m) => {
return {
ieeeAddress: m.deviceIeeeAddress,
ieee_address: m.deviceIeeeAddress,
endpoint: m.ID,
};
}),
+7 -8
View File
@@ -2,7 +2,8 @@ const settings = require('../util/settings');
const logger = require('../util/logger');
const utils = require('../util/utils');
const legacyTopicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/ota_update/.+$`);
const topicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/request/device/otaUpdate/(update|check)`, 'i');
const topicRegex =
new RegExp(`^${settings.get().mqtt.base_topic}/bridge/request/device/ota_update/(update|check)`, 'i');
const Extension = require('./extension');
const MINUTES_10 = 1000 * 60 * 10;
@@ -24,10 +25,8 @@ class OTAUpdate extends Extension {
/* istanbul ignore else */
if (settings.get().experimental.new_api) {
this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/request/device/otaUpdate/check`);
this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/request/device/otaUpdate/update`);
this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/request/device/otaupdate/check`);
this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/request/device/otaupdate/update`);
this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/request/device/ota_update/check`);
this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/request/device/ota_update/update`);
}
}
@@ -200,8 +199,8 @@ class OTAUpdate extends Extension {
(to ? `, from '${fromS}' to '${toS}'` : ``);
logger.info(msg);
this.publishEntityState(resolvedEntity.device.ieeeAddr, {update_available: false});
responseData.from = from_;
responseData.to = to;
responseData.from = from_ ? utils.toSnakeCase(from_) : null;
responseData.to = to ? utils.toSnakeCase(to) : null;
/* istanbul ignore else */
if (settings.get().advanced.legacy_api) {
@@ -225,7 +224,7 @@ class OTAUpdate extends Extension {
const triggeredViaLegacyApi = topic.match(legacyTopicRegex);
if (!triggeredViaLegacyApi) {
const response = utils.getResponse(message, responseData, error);
await this.mqtt.publish(`bridge/response/device/otaUpdate/${type}`, JSON.stringify(response));
await this.mqtt.publish(`bridge/response/device/ota_update/${type}`, JSON.stringify(response));
}
if (error) {
+13
View File
@@ -172,11 +172,24 @@ function* getExternalConvertersDefinitions(settings) {
}
}
function toSnakeCase(value) {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
value[toSnakeCase(key)] = value[key];
delete value[key];
}
return value;
} else {
return value.replace(/\.?([A-Z])/g, (x, y) => '_' + y.toLowerCase()).replace(/^_/, '').replace('_i_d', '_ID');
}
}
module.exports = {
millisecondsToSeconds: (milliseconds) => milliseconds / 1000,
secondsToMilliseconds: (seconds) => seconds * 1000,
getZigbee2mqttVersion,
objectHasProperties,
toSnakeCase,
getObjectsProperty,
getEndpointNames: () => endpointNames,
isXiaomiDevice: (device) => {