Skip to content

Commit

Permalink
optimization of log string generation
Browse files Browse the repository at this point in the history
  • Loading branch information
agav99 committed Nov 15, 2024
1 parent bc757d0 commit fb517e5
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 39 deletions.
72 changes: 44 additions & 28 deletions lib/statescontroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@ class StatesController extends EventEmitter {
if (!this.adapter.zbController || !this.adapter.zbController.connected()) {
return;
}
if (this.debugDevices === undefined) {
this.getDebugDevices();
}
//method checkDebugDevice check the same condition
//if (this.debugDevices === undefined) {
// this.getDebugDevices();
//}
if (state && !state.ack) {
if (id.endsWith('pairingCountdown') || id.endsWith('pairingMessage') || id.endsWith('connection')) {
return;
Expand Down Expand Up @@ -147,7 +148,7 @@ class StatesController extends EventEmitter {
async collectOptions(devId, model, callback) {
const result = {};
// find model states for options and get it values
const devStates = await this.getDevStates('0x' + devId, model);
const devStates = await this.getDevStates('0x' + devId, model, 'collectOptions');
if (devStates == null || devStates == undefined || devStates.states == null || devStates.states == undefined) {
callback(result);
return;
Expand Down Expand Up @@ -182,7 +183,7 @@ class StatesController extends EventEmitter {
}
}

async getDevStates(deviceId, model) {
async getDevStates(deviceId, model, debugInfo) {
try {
let states;
let stateModel;
Expand All @@ -202,6 +203,10 @@ class StatesController extends EventEmitter {
} else {
states = stateModel.states;
}

if (this.checkDebugDevice(deviceId))
this.info(`ELEVATED: getDevStates deviceId="${deviceId}", model="${model}" call by:${debugInfo}`);

if (typeof states === 'function' && !states.prototype) {
const entity = await this.adapter.zbController.resolveEntity(deviceId);
if (entity) {
Expand All @@ -217,13 +222,14 @@ class StatesController extends EventEmitter {
}

async publishFromState(deviceId, model, stateKey, state, options) {
if (this.debugDevices === undefined) this.getDebugDevices();
//method checkDebugDevice check the same condition
//if (this.debugDevices === undefined) this.getDebugDevices();
this.debug(`Change state '${stateKey}' at device ${deviceId} type '${model}'`);
const elevated = this.checkDebugDevice(deviceId);

if (elevated) this.warn(`ELEVATED Change state '${stateKey}' at device ${deviceId} type '${model}'`);

const devStates = await this.getDevStates(deviceId, model);
const devStates = await this.getDevStates(deviceId, model,'publishFromState');
if (!devStates) {
if (elevated) this.error(`ELEVATED no device states for device ${deviceId} type '${model}'`);
return;
Expand Down Expand Up @@ -331,7 +337,7 @@ class StatesController extends EventEmitter {


async deleteOrphanedDeviceStates(ieeeAddr, model, force, callback) {
const devStates = await this.getDevStates(ieeeAddr, model);
const devStates = await this.getDevStates(ieeeAddr, model,'deleteOrphanedDeviceStates');
const commonStates = statesMapping.commonStates;
const devId = ieeeAddr.substr(2);
this.adapter.getStatesOf(devId, (err, states) => {
Expand Down Expand Up @@ -569,7 +575,7 @@ class StatesController extends EventEmitter {
async syncDevStates(dev, model) {
const devId = dev.ieeeAddr.substr(2);
// devId - iobroker device id
const devStates = await this.getDevStates(dev.ieeeAddr, model);
const devStates = await this.getDevStates(dev.ieeeAddr, model,'syncDevStates');
if (!devStates) {
return;
}
Expand Down Expand Up @@ -617,27 +623,37 @@ class StatesController extends EventEmitter {
}

async publishToState(devId, model, payload) {
const devStates = await this.getDevStates(`0x${devId}`, model);
let has_debug = false;
if (this.debugDevices === undefined) this.getDebugDevices();
if (this.checkDebugDevice(devId))
{
if (!payload.hasOwnProperty('msg_from_zigbee')) {
this.warn(`ELEVATED publishToState: message received '${JSON.stringify(payload)}' from device ${devId} type '${model}'`);
has_debug = true;
}

var isMsg_from_zigbee = payload.hasOwnProperty('msg_from_zigbee');
var isCommonState = isMsg_from_zigbee||
payload.hasOwnProperty('linkquality');

let has_debug = ! isMsg_from_zigbee && this.checkDebugDevice(devId);

if (has_debug){
this.warn(`ELEVATED publishToState: message received '${JSON.stringify(payload)}' from device ${devId} type '${model}'`);

Check notice

Code scanning / CodeQL

Semicolon insertion Note

Avoid automated semicolon insertion (96% of all statements in
the enclosing function
have an explicit semicolon).
}

let states = undefined;
if (isCommonState){
states = statesMapping.commonStates;
}
if (!devStates) {
if (has_debug) this.error(`ELEVATED publishToState: no device states for device ${devId} type '${model}'`)
return;
else{
const devStates = await this.getDevStates(`0x${devId}`, model, 'publishToState');

if (!devStates) {
if (has_debug) this.error(`ELEVATED publishToState: no device states for device ${devId} type '${model}'`)
return;
}

states = statesMapping.commonStates.concat(
devStates.states.filter(statedesc => payload.hasOwnProperty(statedesc.prop || statedesc.id))
);
}

// find states for payload
if (devStates.states !== undefined) {
if (states!== undefined) {
try {
const states = statesMapping.commonStates.concat(
devStates.states.filter(statedesc => payload.hasOwnProperty(statedesc.prop || statedesc.id))
);

for (const stateInd in states) {
const statedesc = states[stateInd];
let value;
Expand All @@ -653,8 +669,8 @@ class StatesController extends EventEmitter {

let stateID = statedesc.id;

if (has_debug && statedesc.id !== 'msg_from_zigbee') {
this.warn(`ELEVATED publishToState: value generated '${JSON.stringify(value)}' from device ${devId} for '${statedesc.name}'`);
if (has_debug) {
this.warn(`ELEVATED publishToState: value generated '${JSON.stringify(value)}' from device ${devId} for '${statedesc.name}'`);
}

const common = {
Expand Down
7 changes: 3 additions & 4 deletions lib/zigbeecontroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -697,13 +697,12 @@ class ZigbeeController extends EventEmitter {
}

async handleMessage(data) {
this.debug(`handleMessage`, data);
//this.debug(`handleMessage`, data);
const entity = await this.resolveEntity(data.device || data.ieeeAddr);
const name = (entity && entity._modelID) ? entity._modelID : data.device.ieeeAddr;
this.debug(
`Received Zigbee message from '${name}', type '${data.type}', cluster '${data.cluster}'` +
`, data '${JSON.stringify(data.data)}' from endpoint ${data.endpoint.ID}` +
(data.hasOwnProperty('groupID') ? ` with groupID ${data.groupID}` : ``)
`HandleMessage. Received Zigbee message from '${name}', type '${data.type}', cluster '${data.cluster}', from endpoint ${data.endpoint.ID}` +
(data.hasOwnProperty('groupID') ? ` with groupID ${data.groupID}` : ``) + ` data:`,data.data
);
this.event(data.type, entity, data);

Expand Down
36 changes: 29 additions & 7 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,8 @@ class Zigbee extends utils.Adapter {
}

async onZigbeeEvent(type, entity, message) {
this.log.debug(`Type ${type} device ${safeJsonStringify(entity)} incoming event: ${safeJsonStringify(message)}`);
//Optimization: Use checkDebugDevice as entity and message objects can be very large (ie PTVO 8chanels relay safeJsonStringify(entity) -> 90 kb size)
//this.log.debug(`Type ${type} device ${safeJsonStringify(entity)} incoming event: ${safeJsonStringify(message)}`);

const device = entity.device;
const mappedModel = entity.mapped;
Expand All @@ -468,15 +469,24 @@ class Zigbee extends utils.Adapter {
const meta = {device};

if (this.stController.checkDebugDevice(devId)) {

//Full log:
//this.log.debug(`ELEVATED: Zigbee Event of Type "${type}" from device: ${safeJsonStringify(entity)}`);
//this.log.debug(`ELEVATED: incoming event:${safeJsonStringify(message)}`);

const shortMessage = {};
for(const propertyName in message) {
shortMessage[propertyName] = message[propertyName];
}
shortMessage.device = device.ieeeAddr;
shortMessage.meta = undefined;
shortMessage.endpoint = (message.endpoint.ID ? message.endpoint.ID: -1);
this.log.warn(`ELEVATED: Zigbee Event of Type ${type} from device ${safeJsonStringify(device.ieeeAddr)}, incoming event: ${safeJsonStringify(shortMessage)}`);
}
this.log.warn(`* ELEVATED: Zigbee Event of Type "${type}" from device "${safeJsonStringify(device.ieeeAddr)}" incoming event: ${safeJsonStringify(shortMessage)}`);
}else
{
this.onLog('debug',`* Zigbee Event of Type ${type} from device ${devId}. incoming event:`, message);
};

// this assigment give possibility to use iobroker logger in code of the converters, via meta.logger
meta.logger = this.log;

Expand Down Expand Up @@ -576,7 +586,11 @@ class Zigbee extends utils.Adapter {
async processConverters(converters, devId, model, mappedModel, message, meta) {
for (const converter of converters) {
const publish = (payload) => {
this.log.debug(`Publish ${safeJsonStringify(payload)} to ${safeJsonStringify(devId)}`);

if (this.stController.checkDebugDevice(devId))
this.log.warn(`ELEVATED: ProcessConverters devId:${devId} payload: ${safeJsonStringify(payload)}`);
else this.onLog('debug', `Publish to ${devId}. payload:`, payload);

if (typeof payload === 'object') {
this.publishToState(devId, model, payload);
}
Expand Down Expand Up @@ -625,15 +639,21 @@ class Zigbee extends utils.Adapter {
let isGroup = false;
const has_elevated_debug = this.stController.checkDebugDevice(deviceId)

this.log.debug(`publishFromState : ${deviceId} ${model} ${safeJsonStringify(stateList)}`);

if(has_elevated_debug)
this.log.warn(`ELEVATED: PublishFromState : ${deviceId} ${model} stateList: ${safeJsonStringify(stateList)}`)
else this.onLog('debug',`PublishFromState : ${deviceId} ${model}. stateList:`, stateList);

if (model === 'group') {
isGroup = true;
deviceId = parseInt(deviceId);
}
try {
const entity = await this.zbController.resolveEntity(deviceId);

this.log.debug(`entity: ${deviceId} ${model} ${safeJsonStringify(entity)}`);
if (has_elevated_debug)
this.log.warn(`ELEVATED: PublishFromState. ${deviceId} ${model} entity: ${safeJsonStringify(entity)}`)
else this.onLog('debug',`PublishFromState : ${deviceId} ${model} entity:`, entity);

const mappedModel = entity.mapped;

Expand Down Expand Up @@ -1086,7 +1106,9 @@ class Zigbee extends utils.Adapter {
if (typeof data === 'string') {
logger(`${msg}. ${data}`);
} else {
logger(`${msg}. ${safeJsonStringify(data)}`);
if (this.log.level==level)
logger(`${msg}. ${safeJsonStringify(data)}`)

Check notice

Code scanning / CodeQL

Semicolon insertion Note

Avoid automated semicolon insertion (93% of all statements in
the enclosing function
have an explicit semicolon).
else logger(`${msg}. {DATA unavailable. Check log level}`);
}
} else {
logger(msg);
Expand Down

0 comments on commit fb517e5

Please sign in to comment.