From fecc44d3d1a304e3490ba060fc3bedee9ccbbe5e Mon Sep 17 00:00:00 2001 From: sandhya Date: Wed, 9 Aug 2023 12:14:23 +0530 Subject: [PATCH 1/3] updated the css for view button --- .../widget/boonlogic-widget/gp-boonlogic.component.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.css b/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.css index d8ac0db..8ec65e8 100644 --- a/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.css +++ b/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.css @@ -41,7 +41,7 @@ color: var(--component-brand-primary, #000); } .editbtn { - color: black !important; + color: #e0000e !important; border-color: var(--component-border, #f2f3f4); } .pagination>li:last-child>a, .pagination>li:last-child>span { From 6267e37feb49db0a3cf7f94e815e407e29e485a1 Mon Sep 17 00:00:00 2001 From: sandhya Date: Fri, 11 Aug 2023 13:55:01 +0530 Subject: [PATCH 2/3] updated the display of measurement list --- .../widget/boonlogic-widget/gp-boonlogic.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.ts b/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.ts index 7a7f433..a7fd28c 100644 --- a/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.ts +++ b/frontend/cumulocity-amber-boonlogic/widget/boonlogic-widget/gp-boonlogic.component.ts @@ -403,7 +403,8 @@ export class GpBoonlogicComponent implements OnInit, DoCheck, OnDestroy { // tslint:disable-next-line: deprecation .subscribe((mes: string | any[]) => { if (mes && mes.length > 0) { - this.measurementTypeList = [...mes]; + this.measurementTypeList=[]; + this.measurementTypeList = [...this.measurementTypeList,...mes]; } }); } From 4f297a511a14e84a83110cd6a9a21d7c4a959cb4 Mon Sep 17 00:00:00 2001 From: Darpankumar Lalani Date: Fri, 11 Aug 2023 15:12:39 +0530 Subject: [PATCH 3/3] updated with code fix --- .../cumulocity-amber-boonlogic/package.json | 2 +- microservices/c8y-amber-ms/pom.xml | 2 +- .../service/DeviceConfigurationService.java | 162 +++++------------- 3 files changed, 48 insertions(+), 118 deletions(-) diff --git a/frontend/cumulocity-amber-boonlogic/package.json b/frontend/cumulocity-amber-boonlogic/package.json index 0671f95..1d50ae6 100644 --- a/frontend/cumulocity-amber-boonlogic/package.json +++ b/frontend/cumulocity-amber-boonlogic/package.json @@ -1,6 +1,6 @@ { "name": "cumulocity-amber-boonlogic", - "version": "2.1.0", + "version": "2.1.1", "description": "This is the Cumulocity module federation plugin which used to configure/reconfigure/delete/start - stop stream any device with Amber and is designed to display device model and streaming status on real time basis.", "scripts": { "start": "c8ycli server", diff --git a/microservices/c8y-amber-ms/pom.xml b/microservices/c8y-amber-ms/pom.xml index 68b5b68..e6ea4b0 100644 --- a/microservices/c8y-amber-ms/pom.xml +++ b/microservices/c8y-amber-ms/pom.xml @@ -6,7 +6,7 @@ com.softwareag.amber amber-integration - 0.0.24 + 0.0.25 amber-integration diff --git a/microservices/c8y-amber-ms/src/main/java/com/softwareag/amber/service/DeviceConfigurationService.java b/microservices/c8y-amber-ms/src/main/java/com/softwareag/amber/service/DeviceConfigurationService.java index 4da8525..19ac78e 100644 --- a/microservices/c8y-amber-ms/src/main/java/com/softwareag/amber/service/DeviceConfigurationService.java +++ b/microservices/c8y-amber-ms/src/main/java/com/softwareag/amber/service/DeviceConfigurationService.java @@ -64,8 +64,6 @@ public class DeviceConfigurationService { private final Map deviceDataVectors = new HashMap<>(); - private BigDecimal[] dataVector ; - private final Map excessDataVector = new HashMap<>(); private Map dataVectorCounter = new HashMap<>(); @@ -230,60 +228,25 @@ public void preparetoRegisterForMeasurementNotifications(final String deviceId) deviceDataVectors.put(deviceId, new BigDecimal[dataPointsAll.length]); dataVectorCounter.put(deviceId,0); excessDataVectorCounter.put(deviceId,0); - excessDataVector.put(deviceId,new BigDecimal[dataPointsAll.length * 5]); - dataVector = deviceDataVectors.get(deviceId); - int counter = 0; + excessDataVector.put(deviceId,new BigDecimal[dataPointsAll.length * 10]); if(childDeviceList != null) { log.info("childDeviceList Length: "+ childDeviceList.length); for (String childDeviceId : childDeviceList) { - counter = 0; - for (CumulocityDataPoint dataPoints2 : dataPointsAll) { - if(dataPoints2.getDeviceId() != null && dataPoints2.getDeviceId().equals(childDeviceId)) { - counter ++; - } - } - CumulocityDataPoint[] dataPoints = new CumulocityDataPoint[counter]; - log.info("Child device dataPoints length: "+ dataPoints.length); - counter = 0; - for (CumulocityDataPoint dataPoints2 : dataPointsAll) { - if(dataPoints2.getDeviceId() != null && dataPoints2.getDeviceId().equals(childDeviceId)){ - dataPoints[counter] = dataPoints2; - counter ++; - } - } log.info("childDevice Id: "+ childDeviceId); - registerForMeasurementNotifications(deviceId, childDeviceId, dataPoints); + registerForMeasurementNotifications(deviceId, childDeviceId); } - int deviceCounter = 0; - for (CumulocityDataPoint dataPoints2 : dataPointsAll) { - if(dataPoints2.getDeviceId() != null && dataPoints2.getDeviceId().equals(deviceId)) { deviceCounter ++; } - } - log.info("main device counter length: "+ deviceCounter); - CumulocityDataPoint[] dataPoints = new CumulocityDataPoint[deviceCounter]; - deviceCounter = 0; - for (CumulocityDataPoint dataPoints2 : dataPointsAll) { - // log.info("dataPoints2.getDeviceId(): "+ dataPoints2.getDeviceId()); - if(dataPoints2.getDeviceId() != null && dataPoints2.getDeviceId().equals(deviceId)) { - dataPoints[deviceCounter] = dataPoints2; - deviceCounter ++; - // log.info("deviceCounter: "+ deviceCounter); - } - } log.info("Device Id: "+ deviceId); - log.info("deviceCounter: "+ deviceCounter); - log.info("main device data points length: "+ dataPoints.length); - registerForMeasurementNotifications(deviceId, deviceId, dataPoints); + registerForMeasurementNotifications(deviceId, deviceId); } else { - log.info("Child Device not found. loading default"); - registerForMeasurementNotifications(deviceId, deviceId, dataPointsAll); + registerForMeasurementNotifications(deviceId, deviceId); } } - private void registerForMeasurementNotifications(final String deviceId, String currentDeviceId, CumulocityDataPoint[] dataPoints) { + private void registerForMeasurementNotifications(final String deviceId, String currentDeviceId) { final AmberSensor sensor = sensors.get(deviceId); - final CumulocityDataPoint[] dataPointsAll = sensor.getDataPoints(); + final CumulocityDataPoint[] dataPoints = sensor.getDataPoints(); // log.info("current device id: "+ currentDeviceId); // log.info("getting datapoint for device: "+ dataPoints.length); @@ -293,8 +256,8 @@ private void registerForMeasurementNotifications(final String deviceId, String @Override public void onNotification(Subscription arg0, MeasurementNotification notification) { contextService.runWithinContext(credentials, () -> { - - final MeasurementRepresentation measurement = jsonParser.parse(MeasurementRepresentation.class, json.forValue(notification.getData())); + BigDecimal[] dataVector = deviceDataVectors.get(deviceId); + final MeasurementRepresentation measurement = jsonParser.parse(MeasurementRepresentation.class, json.forValue(notification.getData())); // TODO filter measurement based on type // boolean isMeasurementRelevant = false; @@ -308,46 +271,42 @@ public void onNotification(Subscription arg0, MeasurementNotification no // return; // } - dataVector = deviceDataVectors.get(deviceId); - dataVector = writeMeasurementToDataVector(measurement, dataPoints, dataVector, deviceId); - deviceDataVectors.put(deviceId, dataVector); - int dataCounter = dataVectorCounter.get(deviceId); - log.info("Post data loading: dataVector Counter: "+ dataCounter); - if (!isDataVectorValid(deviceDataVectors.get(deviceId))) { + dataVector = writeMeasurementToDataVector(measurement, dataPoints, dataVector); + if (!isDataVectorValid(dataVector)) { return; - } - final AmberStreamData amberStreamDataResponse = sendDataVectorToAmber(sensor.getSensorId(), deviceDataVectors.get(deviceId)); - amberStreamDataResponse.setSampleCount(increaseSampleCount(sensorStreamingData.get(deviceId))); - // reset data vector - deviceDataVectors.put(deviceId, new BigDecimal[dataPointsAll.length]); - if(dataCounter >= dataPointsAll.length) { - dataVector = deviceDataVectors.get(deviceId); - dataVectorCounter.put(deviceId,0); - log.info("dataVector Counter after reset: "+ dataVectorCounter); - } - log.info("amber stream data response" + amberStreamDataResponse.getState()); - updateCumulocityDeviceWithAmberStatus(deviceId, amberStreamDataResponse); - final Optional> rootCauseMeasurementFragments = createRootCauseMeasurement(deviceId, + } + final AmberStreamData amberStreamDataResponse = sendDataVectorToAmber(sensor.getSensorId(), dataVector); + amberStreamDataResponse.setSampleCount(increaseSampleCount(sensorStreamingData.get(deviceId))); + // reset data vector + deviceDataVectors.put(deviceId, new BigDecimal[dataPoints.length]); + + updateCumulocityDeviceWithAmberStatus(deviceId, amberStreamDataResponse); + final Optional> rootCauseMeasurementFragments = createRootCauseMeasurement(deviceId, amberStreamDataResponse, sensor); - createAmberStreamDataStatusMeasurement(deviceId, amberStreamDataResponse, rootCauseMeasurementFragments); + createAmberStreamDataStatusMeasurement(deviceId, amberStreamDataResponse, rootCauseMeasurementFragments); - // only create Amber state event if the state has been changed - if (!sensorStreamingData.containsKey(deviceId) + // only create Amber state event if the state has been changed + if (!sensorStreamingData.containsKey(deviceId) || isAmberSensorStateChanged(sensorStreamingData.get(deviceId), amberStreamDataResponse) || isMonitoringEventAndTimeForLastMonitoringEventElapsed(amberStreamDataResponse, sensor)) { createAmberStateEvent(deviceId, amberStreamDataResponse); - // getting first mesurement to configure RCA widget while stage change to learning - if (amberStreamDataResponse != null && StringUtils.hasText(amberStreamDataResponse.getState())) { - if(amberStreamDataResponse.getState().equals("Learning")){ - final int clusterId = amberStreamDataResponse.getID()[0]; - final double[] rootCause = amberService.getRootCause(sensor.getSensorId(), clusterId); - final Optional> emptyRootCauseMeasurementFragments = createRootCauseMeasurementFragments(deviceId, - rootCause, sensor.getDataPoints()); - createAmberStreamDataStatusMeasurement(deviceId, amberStreamDataResponse, emptyRootCauseMeasurementFragments); - } + // getting first mesurement to configure RCA widget while stage change to + // learning + if (amberStreamDataResponse != null + && StringUtils.hasText(amberStreamDataResponse.getState())) { + if (amberStreamDataResponse.getState().equals("Learning")) { + final int clusterId = amberStreamDataResponse.getID()[0]; + final double[] rootCause = amberService.getRootCause(sensor.getSensorId(), clusterId); + final Optional> emptyRootCauseMeasurementFragments = createRootCauseMeasurementFragments( + deviceId, + rootCause, sensor.getDataPoints()); + createAmberStreamDataStatusMeasurement(deviceId, amberStreamDataResponse, + emptyRootCauseMeasurementFragments); + } } - } - sensorStreamingData.put(deviceId, amberStreamDataResponse); + } + + sensorStreamingData.put(deviceId, amberStreamDataResponse); }); } @@ -360,6 +319,7 @@ public void onError(Subscription arg0, Throwable arg1) { measurementSubscriptions.put(currentDeviceId, measurementSubscription); } + private AmberStreamData sendDataVectorToAmber(final String amberSensorId, final BigDecimal[] dataVector) { final String dataVectorPayload = Arrays.toString(dataVector).replace("[", "").replace("]", "").replace(" ", ""); return amberService.streamData(amberSensorId, new ServiceDataStream(dataVectorPayload)); @@ -473,7 +433,7 @@ private void createAmberStreamDataStatusMeasurement(final String deviceId, final Map sampleCountFragment = new HashMap<>(); sampleCountFragment.put("sample_count", new MeasurementValue(new BigDecimal(streamData.getSampleCount()), "")); measurementRepresentation.setProperty("c8y_sample_count", sampleCountFragment); - log.info("Amber response creating measurements" + measurementRepresentation); + //log.info("Amber response creating measurements" + measurementRepresentation); measurementApi.createWithoutResponse(measurementRepresentation); } @@ -525,30 +485,12 @@ private void updateCumulocityDeviceRepresentationAndRemoveConfiguration(final St } private BigDecimal[] writeMeasurementToDataVector(final MeasurementRepresentation measurementRepresentation, final CumulocityDataPoint[] dataPoints, - final BigDecimal[] dataVector, final String deviceId) { + final BigDecimal[] dataVector) { if (dataPoints == null || dataPoints.length == 0) { log.error("No data points defined"); return new BigDecimal[0]; } - BigDecimal[] excessDataVectorObj = excessDataVector.get(deviceId); - log.info("current datapoints length: " + dataPoints.length); - log.info("datavector length: " + dataVector.length); - log.info("reserve datavector length: " + excessDataVectorObj.length); - int dataCounterNum = dataVectorCounter.get(deviceId); - int excessCounter = excessDataVectorCounter.get(deviceId); - log.info("dataVector Counter:" + dataVectorCounter); - log.info("Reserve DataVector Counter:" + excessDataVectorCounter); - if(dataCounterNum < dataVector.length){ - for(int index = 0; index < excessCounter; index++) { - dataVector[dataCounterNum + index] = excessDataVectorObj[index]; - } - dataCounterNum = dataCounterNum + excessCounter; - excessCounter = 0; - excessDataVectorObj = excessDataVector.get(deviceId); - } - log.info("dataVectorCounter after populating from reserve:" + dataVectorCounter); - log.info("Reserve DataVectorCounter (Leftover):" + excessDataVectorCounter); - int dataCounter = 0; + for (int index = 0; index < dataPoints.length; index++) { CumulocityDataPoint dataPoint = dataPoints[index]; if (!measurementRepresentation.hasProperty(dataPoint.getFragment())) { @@ -561,24 +503,13 @@ private BigDecimal[] writeMeasurementToDataVector(final MeasurementRepresentatio } final MeasurementValue measurementValue = jsonParser.parse(MeasurementValue.class, json.forValue(fragment.get(dataPoint.getSeries()))); - if((dataCounterNum + index) >= dataVector.length) { - if((dataCounterNum + index) < excessDataVectorObj.length) { - excessDataVectorObj[excessCounter] =measurementValue.getValue(); - excessCounter ++; - } else { - log.error("Unable to add data in stack for device id: " + deviceId + "Please restart microservice"); - } + dataVector[index] = measurementValue.getValue(); + /* for (BigDecimal entry : dataVector) { + log.info("local datavector data:" + entry); + } */ - - } else { - dataVector[dataCounterNum + index] = measurementValue.getValue(); - dataCounter ++; - } } - dataCounterNum = dataCounterNum + dataCounter; - dataVectorCounter.put(deviceId,dataCounterNum); - excessDataVectorCounter.put(deviceId,excessCounter); - excessDataVector.put(deviceId, excessDataVectorObj); + return dataVector; } @@ -587,7 +518,6 @@ private boolean isDataVectorValid(final BigDecimal[] dataVector) { log.error("Data vector is not available."); return false; } - for (BigDecimal entry : dataVector) { if (entry == null) { return false;