Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 KB | None | 0 0
  1. const moment = require('moment');
  2. const models = require('../models');
  3. const { Room } = models;
  4.  
  5. const Utils = {
  6. processElasticSearchData: async (results, checkGetStatus0 = false) => {
  7. let rooms = await Room.findAll({
  8. attributes: ['room_id', 'person_sensor']
  9. });
  10.  
  11. let responseData = {};
  12. let lastData = {};
  13.  
  14. if (results.length) {
  15. // group data from elastic search by sensor id
  16. let group = {};
  17. results.forEach(function (item) {
  18. if (typeof group[item._source.sensor_id] == "undefined") {
  19. group[item._source.sensor_id] = [
  20. {
  21. timestamp: item._source.timestamp,
  22. status: item._source.status
  23. }
  24. ];
  25. } else {
  26. let oldData = group[item._source.sensor_id];
  27. oldData.push({
  28. timestamp: item._source.timestamp,
  29. status: item._source.status
  30. });
  31. group[item._source.sensor_id] = oldData;
  32. }
  33. });
  34.  
  35. // calculate time range with status for sensor id
  36. for(const sensorId in group) {
  37. let sensorData = group[sensorId];
  38. let sensorDataLength = sensorData.length;
  39. let data = [];
  40. let status = '';
  41.  
  42. for(let j=0; j < sensorDataLength; j++) {
  43. const item = sensorData[j];
  44. if (status !== item.status) {
  45. let startTime = item.timestamp;
  46. if (data.length > 0 && typeof data[data.length-1].endTime == "undefined") {
  47. data[data.length-1].endTime = startTime;
  48. }
  49. data.push({startTime, status: item.status});
  50. }
  51. status = item.status;
  52. if (j + 1 < sensorDataLength && item.timestamp.substr(0,10) !== sensorData[j + 1].timestamp.substr(0,10)) {
  53. data[data.length -1].endTime = sensorData[j].timestamp;
  54. status = '';
  55. }
  56. }
  57. if (data.length > 0){
  58. data[data.length -1].endTime = sensorData[sensorDataLength-1].timestamp;
  59. }
  60.  
  61. responseData[sensorId.toUpperCase()] = data;
  62. }
  63. }
  64.  
  65. // map data sensor id for room
  66. let objectRoom = {};
  67. rooms.forEach(function (room) {
  68. let values = responseData[room.person_sensor.toUpperCase()];
  69. if (typeof values != "undefined") {
  70. let roomId = room.room_id;
  71.  
  72. if (typeof objectRoom[roomId] == "undefined") {
  73. objectRoom[roomId] = values;
  74. } else {
  75. objectRoom[roomId] = [...objectRoom[roomId], ...values];
  76. }
  77. }
  78. });
  79.  
  80. for(const roomId in objectRoom) {
  81. let values = objectRoom[roomId];
  82. let result = [], last;
  83. let min = values[0].startTime;
  84. let max = values[0].startTime;
  85.  
  86. // sort time range in ascending order
  87. values.sort(function(a, b) {
  88. if (a.startTime > b.startTime) return 1;
  89. if (a.startTime < b.startTime) return -1;
  90. return 0;
  91. });
  92.  
  93. // calculate time range has status 1
  94. values.forEach(function (r) {
  95. if (values.length == 1 && r.status == 0) {
  96. result.push(r);
  97. return;
  98. }
  99.  
  100. if (r.endTime > max) {
  101. max = r.endTime;
  102. }
  103.  
  104. if (r.status === 0 ) {
  105. return;
  106. } else {
  107. if (!last || r.startTime > last.endTime) {
  108. result.push(last = r);
  109. } else if (r.endTime > last.endTime) {
  110. last.endTime = r.endTime;
  111.  
  112. }
  113. }
  114. });
  115.  
  116. if(checkGetStatus0) {
  117. //handle min max status 0
  118. let minMaxStatus = [
  119. {
  120. startTime: min,
  121. status: 0,
  122. endTime: result[0].startTime
  123. },
  124. {
  125. startTime: result[result.length - 1].endTime,
  126. status: 0,
  127. endTime: max
  128. }
  129. ];
  130.  
  131. let addObject = [];
  132. for (let i = 1; i < result.length; i++) {
  133. let startTime = result[i - 1].endTime;
  134. let endTime = result[i].startTime;
  135. let status = 0;
  136.  
  137. addObject.push({startTime: startTime, status: status, endTime: endTime});
  138. }
  139. result = [...result, ...minMaxStatus, ...addObject];
  140. }
  141.  
  142. result = result.map(function (r) {
  143. r.minute = moment(r.endTime).diff(moment(r.startTime), 'minutes');
  144. return r;
  145. });
  146. lastData[roomId] = result;
  147. }
  148.  
  149. return lastData;
  150. },
  151. handleParamElasticSearch: (date) => {
  152. const timeFrom = moment(date).hours(process.env.FROM_HOUR).format('YYYY-MM-DDTHH:mm:ss+0900');
  153. const timeTo = moment(date).hours(process.env.TO_HOUR).format('YYYY-MM-DDTHH:59:59+0900');
  154. const prefix = 'fluentd-iot-enocean-*';
  155.  
  156. return {'timeFrom':timeFrom, 'timeTo': timeTo, 'prefix': prefix };
  157. },
  158. };
  159.  
  160. module.exports = Utils;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement