Skip to content

Commit

Permalink
feat(alarms): integrate alarms into bar charts
Browse files Browse the repository at this point in the history
  • Loading branch information
corteggiano committed Sep 25, 2024
1 parent 068ebd3 commit 0111d39
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 6 deletions.
41 changes: 36 additions & 5 deletions packages/react-components/src/components/bar-chart/barChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@ import {
DEFAULT_VIEWPORT,
ECHARTS_GESTURE,
} from '../../common/constants';
import type {
import { getAlarmQueries, getTimeSeriesQueries } from '../../utils/queries';
import {
AxisSettings,
ChartSize,
ComponentQuery,
} from '../../common/chartTypes';
import { getTimeSeriesQueries } from '../../utils/queries';
import { useAlarms } from '../../hooks/useAlarms';
import { convertAlarmQueryToAlarmRequest } from '../../queries/utils/convertAlarmQueryToAlarmRequest';
import { transformAlarmsToSynchroChartsThreshold } from '../../utils/transformAlarmThresholdToSynchroChartsThreshold';

const HOUR_IN_MS = 1000 * 60 * 60;
const DAY_IN_MS = HOUR_IN_MS * 24;
Expand Down Expand Up @@ -56,9 +59,33 @@ export const BarChart = (props: BarChartProps) => {
...rest
} = props;

const {
viewport: injectedViewport,
setViewport,
group,
lastUpdatedBy,
} = useViewport();
const viewport = passedInViewport || injectedViewport || DEFAULT_VIEWPORT;

const alarmQueries = getAlarmQueries(queries);
const timeSeriesQueries = getTimeSeriesQueries(queries);

const mapAlarmQueriesToRequests = alarmQueries.flatMap((query) =>
convertAlarmQueryToAlarmRequest(query)
);

const convertedAlarms = useAlarms({
iotSiteWiseClient: alarmQueries[0]?.iotSiteWiseClient,
iotEventsClient: alarmQueries[0]?.iotEventsClient,
requests: mapAlarmQueriesToRequests,
viewport,
settings: { fetchThresholds: true },
transform: transformAlarmsToSynchroChartsThreshold,
});

const { dataStreams, thresholds: queryThresholds } = useTimeSeriesData({
viewport: passedInViewport,
queries: getTimeSeriesQueries(queries),
queries: timeSeriesQueries,
settings: {
fetchFromStartToEnd: true,
fetchMostRecentBeforeStart: true,
Expand All @@ -72,8 +99,12 @@ export const BarChart = (props: BarChartProps) => {
},
styles,
});
const { viewport, setViewport, group, lastUpdatedBy } = useViewport();
const allThresholds = [...queryThresholds, ...thresholds];

const allThresholds = [
...queryThresholds,
...thresholds,
...convertedAlarms.filter((alarm) => !!alarm),
];

// if using echarts then echarts gesture overrides passed in viewport
// else explicitly passed in viewport overrides viewport group
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { AlarmDataQuery } from '@iot-app-kit/source-iotsitewise';
import { AlarmCompositeModelRequest } from '../../hooks/useAlarms';

export const convertAlarmQueryToAlarmRequest = (
alarmQuery: AlarmDataQuery
): AlarmCompositeModelRequest[] => {
return (
alarmQuery.query.alarms?.reduce((results, alarm) => {
alarm.alarmComponents.map((component) => {
results.push({
assetId: alarm.assetId,
assetCompositeModelId: component.assetCompositeModelId,
});
});
return results;
}, [] as AlarmCompositeModelRequest[]) ?? []
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { YAnnotation } from '@iot-app-kit/core';
import { AlarmData } from '../hooks/useAlarms';
import { IoTEventsToSynchroChartsComparisonOperator } from '@iot-app-kit/source-iotsitewise';
import { COMPARATOR_MAP, COMPARISON_OPERATOR } from '../common/constants';

export const transformAlarmsToSynchroChartsThreshold = (
alarm: AlarmData
): YAnnotation | undefined => {
const { models, inputProperty, thresholds, status } = alarm;

if (!status.isSuccess) return undefined;

if (models && models.length !== 0 && thresholds && thresholds?.length !== 0) {
const model = models[0];
const thresholdValue =
thresholds[0].value?.doubleValue ?? thresholds[0].value?.integerValue;
const comparisonOperator = model.alarmRule?.simpleRule?.comparisonOperator;

if (thresholdValue && comparisonOperator && inputProperty) {
const scComparisonOperator = IoTEventsToSynchroChartsComparisonOperator[
comparisonOperator
] as COMPARISON_OPERATOR;

return {
color: 'red',
value: thresholdValue,
severity: model.severity,
showValue: true,
label: {
text: `${inputProperty[0].name} ${COMPARATOR_MAP[scComparisonOperator]} ${thresholdValue}`,
show: true,
},
comparisonOperator: scComparisonOperator,
};
}
}

return undefined;
};
5 changes: 4 additions & 1 deletion packages/source-iotsitewise/src/alarms/iotevents/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@ export * from './types';
export * from './siteWiseAlarmModule';
export { parseAlarmData } from './util/parseAlarmData';
export { constructAlarmThresholds } from './util/constructAlarmThresholds';
export { SOURCE } from './constants';
export {
SOURCE,
IoTEventsToSynchroChartsComparisonOperator,
} from './constants';
1 change: 1 addition & 0 deletions packages/source-iotsitewise/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export * from './__mocks__';
export { initialize } from './initialize';
export { BranchReference } from './asset-modules/sitewise-asset-tree/types';
export { toId, fromId } from './time-series-data/util/dataStreamId';
export { IoTEventsToSynchroChartsComparisonOperator } from './alarms/iotevents';
export type {
SiteWiseDataSourceInitInputs,
SiteWiseQuery,
Expand Down

0 comments on commit 0111d39

Please sign in to comment.