Estoy usando node-red (JS) para tomar datos de un sensor que transmite a través de MQTT. Los datos del sensor se analizan como una matriz de 4 valores [a, b, c, d] relacionados con 4 mediciones diferentes.
Estos datos se almacenan en una matriz global denominada dataArray, que es una matriz bidimensional.
dataArray[0] = [a, b, c, d];de modo que
dataArray[i][0] = Temperature dataArray[i][1] = VibrationX dataArray[i][2] = VibrationY dataArray[i][3] = VibrationZLa forma estándar en que accedería al contenido de esta matriz sería
dataArray[i][j]Sin embargo, aparece el error "No se puede acceder a la propiedad de indefinido" cuando intento leer la matriz para calcular los promedios.
Ok, entonces eliminé la segunda dimensión e intenté acceder a dataArray[0] - Esto devolvió 'array[0]' una matriz vacía.
Luego intenté devolver el dataArray tal como se pasó a la función: es decir
function average(data) { return data; } average(dataArray);esto también devolvió array[0].
Finalmente especifiqué manualmente la matriz dentro de la función.
dataArray = [[a, b, c, d], [a1, b1, c1, d1]];y esto devolvió el resultado esperado.
Creo que tiene algo que ver con la forma en que la matriz se pasa a la definición, o la forma en que el objeto se almacena en global antes del acceso, pero ninguna búsqueda en Google me ha ayudado a resolver esto.
código:
function Average(data) { var temperatureValue = 0; var vibXValue = 0; var vibYValue = 0; var vibZValue = 0; for (var i = 0, n = data.length; i < n; i++) { temperatureValue = data[i][0] + temperatureValue; vibXValue = data[i][1] + vibXValue; vibYValue = data[i][2] + vibYValue; vibZValue = data[i][3] + vibZValue; } //Average values from each array element var msg1 = []; //msg1 = [temperatureValue / n, vibXValue / n, vibYValue / n, vibZValue / n] //DEBUG - Send dataArray straight through, and it's length msg1 = [data, data.length]; return msg1; } var dataArray = global.get("dataArray")||[]; var sensorData = msg.payload; //This is the input from the Cron node. As long as the input to the function isn't "ClearArray" then push new MQTT messages to the dataArray. if (msg.payload != "ClearArray") { dataArray.push(sensorData); } else if (dataArray.length != 0) { msg1 = Average(dataArray); msg2 = Peak(dataArray); msg.payload = [msg1, msg2]; //global.set("dataArray",[]); return msg; }