{"version":3,"sources":["Config.ts","Components/Charts/PlotBase.tsx","helpers/ErrorHelper.ts","Components/Charts/OverviewPlot.tsx","Components/Charts/DetailPlot.tsx","Components/Charts/TimelinePlot.tsx","Components/Details/CurrentStatus.tsx","Components/Details/ErrorTable.tsx","Components/Layout/Footer.tsx","Components/Layout/Loader.tsx","Components/Layout/Device.tsx","Components/Dashboard.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["Config","DeviceApiServerAddress","ApiServerAddress","PlotBase","props","type","key","chart","intervalId","device","toLowerCase","state","data","Array","this","createChart","fetchData","window","setInterval","bind","ReloadTimeout","clearInterval","dispose","prevProps","startDate","endDate","fetchByDateRange","fetchByLatest","series","color","tooltip","getFillFromObject","background","fill","am4core","input","fetch","then","response","json","setState","url","fetchItemData","value","index","array","a","timestamp","b","undefined","Math","floor","Date","getTime","isMobile","filter","filterData","map","x","mapData","reverse","yAxes","values","forEach","axisHook","fontSize","id","style","width","height","React","Component","ErrorHelper","errorRegister","offset","errorFlags","i","pow","push","bits","ErrorRegisterToFlags","GetV3Errors","indexOf","bit","text","sps","OverviewPlot","date","current","errorValue","level","levelCurrent","levelOn","levelOff","levelSetPoint","flow","title","disabled","length","axisWidth","am4charts","legend","cursor","dateAxis","xAxes","renderer","grid","template","location","baseInterval","timeUnit","count","fillLevelAxis","minWidth","currentAxis","opposite","min","max","flowAxis","levelSeries","name","dataFields","dateX","valueY","strokeWidth","tooltipText","yAxis","setTooltipColor","levelSetPointSeries","stroke","strokeDasharray","currentSeries","flowSeries","onSeries","openValueY","strokeOpacity","fillOpacity","hiddenInLegend","offSeries","errorSeries","adapter","add","ErrorTooltipAdapter","target","tooltipDataItem","dataContext","ExplainErrorFlags","join","DetailPlot","rpm","temperature","pressure","vacuumTime","temperatureAxis","rpmAxis","pressureAxis","vacuumTimeSeries","pressureSeries","rpmSeries","temperatureSeries","TimelinePlot","maskBullets","xAxis","category","minGridDistance","inversed","labels","minY","maxY","categoryX","categoryY","bgColor","getFor","columnTemplate","columns","column","dataItem","item","errorCount","error","runningCount","cursorOverStyle","pointer","events","on","ev","handleClick","heatRules","property","colors","getIndex","clickedItem","setStartEndDate","getDataUrl","y","toLocaleDateString","section","getUTCHours","each","setVisibility","CurrentStatus","fetchStatusData","generateStatusAPIUrl","className","role","locale","format","ErrorTable","start","utc","local","end","marginRight","aria-label","Footer","currentYear","getFullYear","Loader","src","alt","maxWidth","maxHeight","Device","Dashboard","devices","innerWidth","addEventListener","updateDimensions","removeEventListener","basename","to","margin","activeClassName","exact","path","render","match","params","App","Boolean","hostname","ReactDOM","document","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","console","message"],"mappings":"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","file":"static/js/main.6bc90875.chunk.js","sourcesContent":["export default class Config {\r\n public static readonly ApiServerAddress: string = \"https://mietpumpen.ch/api/v2\";\r\n public static readonly DeviceApiServerAddress: string = Config.ApiServerAddress + \"/devices\";\r\n}","import React, { ReactNode } from \"react\";\r\nimport * as am4core from \"@amcharts/amcharts4/core\";\r\nimport * as am4charts from \"@amcharts/amcharts4/charts\";\r\nimport Config from \"../../Config\";\r\nimport IPumpData from \"../../interfaces/IPumpData\";\r\nimport IPumpPlotProps from \"../../interfaces/IPumpPlotProps\";\r\n\r\ninterface IPumpPlotState {\r\n data: IPumpData[];\r\n}\r\n\r\n// Using demo as described here\r\n// https://www.amcharts.com/docs/v4/getting-started/integrations/using-react/\r\nexport abstract class PlotBase extends React.Component {\r\n\r\n private static readonly ReloadTimeout: number = 20000;\r\n\r\n protected readonly key: string;\r\n protected chart: am4charts.XYChart | null;\r\n private intervalId: number;\r\n\r\n constructor(props: IPumpPlotProps, type: string) {\r\n super(props);\r\n\r\n this.key = `${type}-${props.device}`.toLowerCase();\r\n this.intervalId = 0;\r\n this.chart = null;\r\n this.state = {\r\n data: new Array()\r\n };\r\n\r\n }\r\n\r\n protected abstract createChart(): void;\r\n\r\n protected abstract mapData(value: IPumpData): TPlotModel;\r\n\r\n protected abstract axisHook(x: am4charts.Axis, isMobile: boolean, data: Array): void;\r\n\r\n componentDidMount(): void {\r\n this.createChart();\r\n this.fetchData();\r\n\r\n // This is not run from NodeJs, so use window function\r\n this.intervalId = window.setInterval(this.fetchData.bind(this), PlotBase.ReloadTimeout);\r\n }\r\n\r\n componentWillUnmount(): void {\r\n\r\n // Stop reloading\r\n window.clearInterval(this.intervalId);\r\n\r\n if (this.chart) {\r\n this.chart.dispose();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: IPumpPlotProps): void {\r\n const { startDate, endDate } = this.props;\r\n if (prevProps.startDate !== startDate || prevProps.endDate !== endDate) {\r\n\r\n // Pause automatic reload\r\n window.clearInterval(this.intervalId);\r\n\r\n if (startDate && endDate) {\r\n this.fetchByDateRange();\r\n } else {\r\n this.fetchByLatest();\r\n }\r\n\r\n // Create new scheduler for reloading all data\r\n this.intervalId = window.setInterval(this.fetchData.bind(this), PlotBase.ReloadTimeout);\r\n }\r\n }\r\n\r\n protected setTooltipColor(series: am4charts.LineSeries, color: string): void {\r\n if (series.tooltip) {\r\n series.tooltip.getFillFromObject = false;\r\n series.tooltip.background.fill = am4core.color(color);\r\n }\r\n }\r\n\r\n private fetchData(): void {\r\n if (this.props.startDate && this.props.endDate) {\r\n this.fetchByDateRange();\r\n } else {\r\n this.fetchByLatest();\r\n }\r\n }\r\n\r\n private fetchItemData(input: RequestInfo): void {\r\n // https://mietpumpen.ch/api/v2/ELMA_004/items\r\n fetch(input)\r\n .then(response => response.json() as Promise)\r\n .then(data => {\r\n this.setState({ data: data });\r\n });\r\n }\r\n\r\n private fetchByLatest(): void {\r\n const url = `${Config.ApiServerAddress}/${this.props.device}/items`;\r\n this.fetchItemData(url);\r\n }\r\n\r\n private fetchByDateRange(): void {\r\n const url = `${Config.ApiServerAddress}/${this.props.device}/between?start=${this.props.startDate}&end=${this.props.endDate}`;\r\n this.fetchItemData(url);\r\n }\r\n\r\n private filterData(value: IPumpData, index: number, array: IPumpData[]): boolean {\r\n if (index <= 0) {\r\n return true;\r\n }\r\n\r\n const a = value.timestamp as Date;\r\n const b = array[0].timestamp as Date;\r\n\r\n if (a !== undefined && b !== undefined) {\r\n\r\n // Calculate diff in days\r\n const deltaDays = Math.floor(((new Date(b)).getTime() - (new Date(a)).getTime()) / (1000 * 60 * 60 * 24));\r\n\r\n // Only show max 10 days back\r\n if (deltaDays > 10) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public render(): ReactNode {\r\n\r\n const { isMobile } = this.props;\r\n\r\n if (this.chart) {\r\n\r\n const { data } = this.state;\r\n\r\n // This is only used till the data can be mapped correctly.\r\n // https://github.com/amcharts/amcharts4/issues/1571 for the zooming issue\r\n this.chart.data = data.filter(this.filterData).map(x => this.mapData(x)).reverse();\r\n this.chart.yAxes.values.forEach(x => this.axisHook(x, isMobile, data));\r\n this.chart.fontSize = isMobile ? '0.8em' : undefined;\r\n }\r\n\r\n return (\r\n
\r\n );\r\n }\r\n}\r\n","import IErrorFlag from \"../interfaces/IErrorFlag\";\r\n\r\nexport default class ErrorHelper {\r\n\r\n public static ErrorRegisterToFlags(errorRegister: number, offset: number): number[] {\r\n\r\n const errorFlags = new Array();\r\n for (let i = 0; i < 32; i++) {\r\n if (errorRegister & Math.pow(2, i)) {\r\n errorFlags.push(i + offset);\r\n }\r\n }\r\n\r\n return errorFlags;\r\n }\r\n\r\n public static ExplainErrorFlags(errorRegister: number): IErrorFlag[] {\r\n\r\n const bits = ErrorHelper.ErrorRegisterToFlags(errorRegister, 0);\r\n return ErrorHelper\r\n .GetV3Errors()\r\n .filter(x => bits.indexOf(x.bit) >= 0);\r\n }\r\n\r\n private static GetV3Errors(): IErrorFlag[] {\r\n return [\r\n {\r\n bit: 0,\r\n text: 'Kein Vakuum möglich',\r\n sps: 'VakuumZiehtNicht'\r\n },\r\n {\r\n bit: 1,\r\n text: 'Sonde oben feucht',\r\n sps: 'AnsaugNiveauOben'\r\n },\r\n {\r\n bit: 2,\r\n text: 'Allgemein 11',\r\n sps: 'Allgemein_11'\r\n },\r\n {\r\n bit: 3,\r\n text: 'Sammelalarm FU',\r\n sps: 'FUSammelalarm'\r\n },\r\n {\r\n bit: 4,\r\n text: 'Maximale Neustarts erreicht',\r\n sps: 'MaxNeustart'\r\n },\r\n {\r\n bit: 5,\r\n text: 'Allgemein 14',\r\n sps: 'Allgemein_14'\r\n },\r\n {\r\n bit: 6,\r\n text: 'Allgemein 15',\r\n sps: 'Allgemein_15'\r\n },\r\n {\r\n bit: 7,\r\n text: 'Allgemein 16',\r\n sps: 'Allgemein_16'\r\n },\r\n {\r\n bit: 8,\r\n text: 'Niveaustand ist hoch',\r\n sps: 'NiveauHoch'\r\n },\r\n {\r\n bit: 9,\r\n text: 'Allgemein 2',\r\n sps: 'Allgemein_2'\r\n },\r\n {\r\n bit: 10,\r\n text: 'Allgemein 3',\r\n sps: 'Allgemein_3'\r\n },\r\n {\r\n bit: 11,\r\n text: 'Allgemein 4',\r\n sps: 'Allgemein_4'\r\n },\r\n {\r\n bit: 12,\r\n text: 'Allgemein 5',\r\n sps: 'Allgemein_5'\r\n },\r\n {\r\n bit: 13,\r\n text: 'Allgemein 6',\r\n sps: 'Allgemein_6'\r\n },\r\n {\r\n bit: 14,\r\n text: 'Allgemein 7',\r\n sps: 'Allgemein_7'\r\n },\r\n {\r\n bit: 15,\r\n text: 'Hochwasser oder Stromausfall',\r\n sps: 'Hochwasser'\r\n },\r\n ];\r\n }\r\n}","import * as am4core from \"@amcharts/amcharts4/core\";\r\nimport * as am4charts from \"@amcharts/amcharts4/charts\";\r\nimport IPumpData from \"../../interfaces/IPumpData\";\r\nimport { PlotBase } from \"..\";\r\nimport IPumpPlotProps from \"../../interfaces/IPumpPlotProps\";\r\nimport ErrorHelper from \"../../helpers/ErrorHelper\";\r\n\r\ninterface IOverviewModel {\r\n date: Date;\r\n current: number;\r\n errorRegister: number;\r\n errorValue: number;\r\n level: number;\r\n levelOn: number;\r\n levelOff: number;\r\n levelSetPoint: number;\r\n flow: number;\r\n}\r\n\r\n// Using demo as described here\r\n// https://www.amcharts.com/docs/v4/getting-started/integrations/using-react/\r\nexport class OverviewPlot extends PlotBase {\r\n\r\n constructor(props: IPumpPlotProps) {\r\n super(props, 'overview-plot');\r\n }\r\n\r\n protected mapData(value: IPumpData): IOverviewModel {\r\n return {\r\n date: new Date(value.timestamp),\r\n current: value.current > 0.05 ? value.current : 0,\r\n\r\n // Making the fill below almost unlimited high results in a bar chart :-)\r\n errorRegister: value.errorRegister,\r\n errorValue: value.errorRegister > 0 ? 30 : 0,\r\n level: value.levelCurrent / 10,\r\n levelOn: value.levelOn / 10,\r\n levelOff: value.levelOff / 10,\r\n levelSetPoint: value.levelSetPoint / 10,\r\n flow: value.flow > 0 ? value.flow / 1000 : 0\r\n };\r\n }\r\n\r\n protected axisHook(x: am4charts.Axis, isMobile: boolean, data: Array): void {\r\n //x.renderer.labels.template.disabled = disabled;\r\n if (x.title.text !== 'Niveaus (cm)' && x.title.text !== 'Strom (A)') {\r\n x.disabled = isMobile;\r\n }\r\n\r\n if (x.title.text === 'Durchfluss (l/s)') {\r\n x.disabled = data.filter(x => x.flow > 0).length <= 0;\r\n }\r\n }\r\n\r\n protected createChart(): void {\r\n // declare chart\r\n const axisWidth = this.props.isMobile ? 0 : 35;\r\n const chart: am4charts.XYChart = am4core.create(\r\n this.key,\r\n am4charts.XYChart\r\n );\r\n\r\n // Adding a legend\r\n chart.legend = new am4charts.Legend();\r\n\r\n // Adding the cursor\r\n chart.cursor = new am4charts.XYCursor();\r\n\r\n // Adding default date axis\r\n const dateAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n dateAxis.renderer.grid.template.location = 0;\r\n dateAxis.baseInterval = { timeUnit: \"minute\", count: 1 };\r\n\r\n // Axis (left)\r\n const fillLevelAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n if (fillLevelAxis.tooltip) {\r\n fillLevelAxis.tooltip.disabled = true;\r\n }\r\n\r\n fillLevelAxis.renderer.minWidth = axisWidth;\r\n fillLevelAxis.title.text = \"Niveaus (cm)\";\r\n\r\n // Axis (right, #2)\r\n const currentAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n if (currentAxis.tooltip) {\r\n currentAxis.tooltip.disabled = true;\r\n }\r\n\r\n currentAxis.renderer.minWidth = axisWidth;\r\n currentAxis.title.text = \"Strom (A)\";\r\n currentAxis.renderer.opposite = true;\r\n currentAxis.min = 0;\r\n currentAxis.max = 30;\r\n\r\n // Axis (right, #4)\r\n const flowAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n flowAxis.renderer.minWidth = axisWidth;\r\n flowAxis.title.text = \"Durchfluss (l/s)\";\r\n flowAxis.renderer.opposite = true;\r\n flowAxis.min = 0;\r\n flowAxis.max = 100;\r\n\r\n // series\r\n const levelSeries = chart.series.push(new am4charts.LineSeries());\r\n levelSeries.name = \"Niveau\";\r\n levelSeries.dataFields.dateX = \"date\";\r\n levelSeries.dataFields.valueY = \"level\";\r\n levelSeries.strokeWidth = 2;\r\n levelSeries.tooltipText = \"Niveau: {valueY} cm\";\r\n levelSeries.yAxis = fillLevelAxis;\r\n this.setTooltipColor(levelSeries, \"blue\");\r\n\r\n const levelSetPointSeries = chart.series.push(new am4charts.LineSeries());\r\n levelSetPointSeries.name = \"Niveau Sollwert\";\r\n levelSetPointSeries.dataFields.dateX = \"date\";\r\n levelSetPointSeries.dataFields.valueY = \"levelSetPoint\";\r\n levelSetPointSeries.strokeWidth = 1.5;\r\n levelSetPointSeries.stroke = am4core.color(\"red\");\r\n levelSetPointSeries.strokeDasharray = \"3,3\"\r\n levelSetPointSeries.tooltipText = \"Sollwert: {valueY} cm\";\r\n levelSetPointSeries.yAxis = fillLevelAxis;\r\n this.setTooltipColor(levelSetPointSeries, \"red\");\r\n\r\n const currentSeries = chart.series.push(new am4charts.LineSeries());\r\n currentSeries.name = \"Strom\";\r\n currentSeries.dataFields.dateX = \"date\";\r\n currentSeries.dataFields.valueY = \"current\";\r\n currentSeries.stroke = am4core.color(\"orange\");\r\n currentSeries.strokeWidth = 2;\r\n currentSeries.tooltipText = \"Strom: {valueY} A\";\r\n currentSeries.yAxis = currentAxis;\r\n this.setTooltipColor(currentSeries, \"orange\");\r\n\r\n const flowSeries = chart.series.push(new am4charts.LineSeries());\r\n flowSeries.name = \"Durchfluss\";\r\n flowSeries.dataFields.dateX = \"date\";\r\n flowSeries.dataFields.valueY = \"flow\";\r\n flowSeries.stroke = am4core.color(\"purple\");\r\n flowSeries.strokeWidth = 2;\r\n flowSeries.tooltipText = \"Durchfluss: {valueY} l/s\";\r\n flowSeries.yAxis = flowAxis;\r\n this.setTooltipColor(flowSeries, \"purple\");\r\n\r\n const onSeries = chart.series.push(new am4charts.LineSeries());\r\n onSeries.name = \"Förderbereich\";\r\n onSeries.dataFields.dateX = \"date\";\r\n onSeries.dataFields.openValueY = \"levelOff\";\r\n onSeries.dataFields.valueY = \"levelOn\";\r\n onSeries.strokeWidth = 2;\r\n onSeries.strokeOpacity = 0.3;\r\n onSeries.tooltipText = \"Einschaltniveau: {valueY} cm\";\r\n onSeries.fillOpacity = 0.3;\r\n onSeries.fill = am4core.color(\"lightblue\");\r\n onSeries.stroke = am4core.color(\"blue\");\r\n onSeries.hiddenInLegend = true;\r\n this.setTooltipColor(onSeries, \"lightblue\");\r\n\r\n const offSeries = chart.series.push(new am4charts.LineSeries());\r\n offSeries.name = \"Ausschaltniveau\";\r\n offSeries.dataFields.dateX = \"date\";\r\n offSeries.dataFields.valueY = \"levelOff\";\r\n offSeries.strokeWidth = 2;\r\n offSeries.strokeOpacity = 0.3;\r\n offSeries.tooltipText = \"Ausschaltniveau: {valueY} cm\";\r\n offSeries.stroke = am4core.color(\"blue\");\r\n offSeries.hiddenInLegend = true;\r\n this.setTooltipColor(offSeries, \"lightblue\");\r\n\r\n\r\n const errorSeries = chart.series.push(new am4charts.StepLineSeries());\r\n errorSeries.name = \"Fehler\";\r\n errorSeries.dataFields.dateX = \"date\";\r\n errorSeries.dataFields.valueY = \"errorValue\";\r\n errorSeries.strokeWidth = 0;\r\n\r\n // Not showing any value here ... could be transformed tough\r\n errorSeries.tooltipText = \"Fehler\";\r\n errorSeries.fillOpacity = 0.2;\r\n errorSeries.fill = am4core.color(\"red\");\r\n errorSeries.yAxis = currentAxis;\r\n errorSeries.adapter.add(\"tooltipText\", OverviewPlot.ErrorTooltipAdapter);\r\n\r\n this.chart = chart;\r\n }\r\n\r\n private static ErrorTooltipAdapter(text: string | undefined, target: am4charts.LineSeries): string | undefined {\r\n\r\n // Doing smooth casting to figure out if the property is already there\r\n const data = target.tooltipDataItem.dataContext as { errorRegister: number };\r\n if (data && data.errorRegister > 0) {\r\n return ErrorHelper.ExplainErrorFlags(data.errorRegister).map(x => x.text).join(', \\n');\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n}\r\n","import * as am4core from \"@amcharts/amcharts4/core\";\r\nimport * as am4charts from \"@amcharts/amcharts4/charts\";\r\nimport IPumpData from \"../../interfaces/IPumpData\";\r\nimport { PlotBase } from \"..\";\r\nimport IPumpPlotProps from \"../../interfaces/IPumpPlotProps\";\r\n\r\ninterface IDetailModel {\r\n date: Date;\r\n level: number;\r\n levelSetPoint: number;\r\n rpm: number;\r\n temperature: number;\r\n pressure: number;\r\n flow: number;\r\n vacuumTime: number;\r\n}\r\n\r\n// Using demo as described here\r\n// https://www.amcharts.com/docs/v4/getting-started/integrations/using-react/\r\nexport class DetailPlot extends PlotBase {\r\n\r\n constructor(props: IPumpPlotProps) {\r\n super(props, 'detail-plot');\r\n }\r\n\r\n protected mapData(value: IPumpData): IDetailModel {\r\n return {\r\n date: new Date(value.timestamp),\r\n level: value.levelCurrent / 10,\r\n levelSetPoint: value.levelSetPoint / 10,\r\n rpm: value.rpm,\r\n temperature: value.temperature / 10,\r\n pressure: value.pressure,\r\n flow: value.flow > 0 ? value.flow / 1000 : 0,\r\n vacuumTime: value.vacuumTime\r\n };\r\n }\r\n\r\n protected axisHook(x: am4charts.Axis, isMobile: boolean): void {\r\n if (x.title.text !== 'Temperatur (°C)' && x.title.text !== 'Drehzahl (min-1)') {\r\n x.disabled = isMobile;\r\n }\r\n\r\n if (x.title.text === 'Temperatur (°C)') {\r\n x.renderer.opposite = !isMobile;\r\n }\r\n }\r\n\r\n protected createChart(): void {\r\n // declare chart\r\n const axisWidth = this.props.isMobile ? 0 : 35;\r\n const chart: am4charts.XYChart = am4core.create(\r\n this.key,\r\n am4charts.XYChart\r\n );\r\n\r\n // Adding a legend\r\n chart.legend = new am4charts.Legend();\r\n\r\n // Adding the cursor\r\n chart.cursor = new am4charts.XYCursor();\r\n\r\n // Adding default date axis\r\n const dateAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n dateAxis.renderer.grid.template.location = 0;\r\n dateAxis.baseInterval = { timeUnit: \"minute\", count: 1 };\r\n\r\n // Axis (left)\r\n const fillLevelAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n if (fillLevelAxis.tooltip) {\r\n fillLevelAxis.tooltip.disabled = true;\r\n }\r\n fillLevelAxis.renderer.minWidth = axisWidth;\r\n fillLevelAxis.title.text = \"Niveaus (cm)\";\r\n\r\n // Axis (right, #1)\r\n const temperatureAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n if (temperatureAxis.tooltip) {\r\n temperatureAxis.tooltip.disabled = true;\r\n }\r\n temperatureAxis.renderer.minWidth = axisWidth;\r\n temperatureAxis.title.text = \"Temperatur (°C)\";\r\n temperatureAxis.renderer.opposite = true;\r\n temperatureAxis.min = 0;\r\n temperatureAxis.max = 50;\r\n\r\n // Axis (right, #2)\r\n const rpmAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n if (rpmAxis.tooltip) {\r\n rpmAxis.tooltip.disabled = true;\r\n }\r\n rpmAxis.renderer.minWidth = axisWidth;\r\n rpmAxis.title.text = \"Drehzahl (min-1)\";\r\n rpmAxis.renderer.opposite = true;\r\n rpmAxis.min = 0;\r\n rpmAxis.max = 1800;\r\n\r\n // Axis (right, #3)\r\n const pressureAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n if (pressureAxis.tooltip) {\r\n pressureAxis.tooltip.disabled = true;\r\n }\r\n pressureAxis.renderer.minWidth = axisWidth;\r\n pressureAxis.title.text = \"Druck (mbar)\";\r\n pressureAxis.renderer.opposite = true;\r\n\r\n const vacuumTimeSeries = chart.series.push(new am4charts.ColumnSeries());\r\n vacuumTimeSeries.name = \"Vakuumzeit\";\r\n vacuumTimeSeries.dataFields.dateX = \"date\";\r\n vacuumTimeSeries.dataFields.valueY = \"vacuumTime\";\r\n vacuumTimeSeries.strokeWidth = 0;\r\n vacuumTimeSeries.fill = am4core.color(\"orange\");\r\n vacuumTimeSeries.fillOpacity = 0.5;\r\n vacuumTimeSeries.tooltipText = \"Zeit: {valueY} s\";\r\n vacuumTimeSeries.yAxis = rpmAxis;\r\n\r\n // series\r\n const levelSeries = chart.series.push(new am4charts.LineSeries());\r\n levelSeries.name = \"Niveau\";\r\n levelSeries.dataFields.dateX = \"date\";\r\n levelSeries.dataFields.valueY = \"level\";\r\n levelSeries.strokeWidth = 2;\r\n levelSeries.tooltipText = \"Niveau: {valueY} cm\";\r\n levelSeries.yAxis = fillLevelAxis;\r\n this.setTooltipColor(levelSeries, \"blue\");\r\n\r\n const levelSetPointSeries = chart.series.push(new am4charts.LineSeries());\r\n levelSetPointSeries.name = \"Niveau Sollwert\";\r\n levelSetPointSeries.dataFields.dateX = \"date\";\r\n levelSetPointSeries.dataFields.valueY = \"levelSetPoint\";\r\n levelSetPointSeries.strokeWidth = 1.5;\r\n levelSetPointSeries.stroke = am4core.color(\"red\");\r\n levelSetPointSeries.strokeDasharray = \"3,3\"\r\n levelSetPointSeries.tooltipText = \"Sollwert: {valueY} cm\";\r\n levelSetPointSeries.yAxis = fillLevelAxis;\r\n this.setTooltipColor(levelSetPointSeries, \"red\");\r\n\r\n const pressureSeries = chart.series.push(new am4charts.LineSeries());\r\n pressureSeries.name = \"Druck\";\r\n pressureSeries.dataFields.dateX = \"date\";\r\n pressureSeries.dataFields.valueY = \"pressure\";\r\n pressureSeries.stroke = am4core.color(\"green\");\r\n pressureSeries.strokeWidth = 2;\r\n pressureSeries.tooltipText = \"Druck: {valueY} mbar\";\r\n pressureSeries.yAxis = pressureAxis;\r\n this.setTooltipColor(pressureSeries, \"green\");\r\n\r\n const rpmSeries = chart.series.push(new am4charts.LineSeries());\r\n rpmSeries.name = \"Drehzahl\";\r\n rpmSeries.dataFields.dateX = \"date\";\r\n rpmSeries.dataFields.valueY = \"rpm\";\r\n rpmSeries.stroke = am4core.color(\"#f54290\");\r\n rpmSeries.strokeWidth = 2;\r\n rpmSeries.tooltipText = \"Umdrehungen: {valueY} min-1\";\r\n rpmSeries.yAxis = rpmAxis;\r\n this.setTooltipColor(rpmSeries, \"#f54290\");\r\n\r\n const temperatureSeries = chart.series.push(new am4charts.LineSeries());\r\n temperatureSeries.name = \"Temperatur\";\r\n temperatureSeries.dataFields.dateX = \"date\";\r\n temperatureSeries.dataFields.valueY = \"temperature\";\r\n temperatureSeries.strokeWidth = 2;\r\n temperatureSeries.tooltipText = \"Temperatur: {valueY} °C\";\r\n temperatureSeries.yAxis = temperatureAxis;\r\n\r\n this.chart = chart;\r\n }\r\n}\r\n","import React, { ReactNode } from \"react\";\r\nimport * as am4core from \"@amcharts/amcharts4/core\";\r\nimport * as am4charts from \"@amcharts/amcharts4/charts\";\r\nimport Config from \"../../Config\";\r\nimport IOverview from \"../../interfaces/IOverview\";\r\nimport IDeviceProp from \"../../interfaces/IDeviceProp\";\r\n\r\ninterface IPlotProps extends IDeviceProp {\r\n setStartEndDate(startDate: Date, endDate: Date): void;\r\n device: string;\r\n}\r\n\r\ninterface IHeatmapOverview extends IOverview {\r\n date: string;\r\n section: number;\r\n}\r\n\r\ninterface IPlotState {\r\n data: IHeatmapOverview[];\r\n}\r\n\r\n\r\nexport class TimelinePlot extends React.Component {\r\n private readonly key: string;\r\n private chart: am4charts.XYChart | null;\r\n\r\n constructor(props: IPlotProps) {\r\n super(props);\r\n\r\n this.key = \"chartTimeline\" + props.device;\r\n this.chart = null;\r\n\r\n this.state = {\r\n data: new Array()\r\n };\r\n }\r\n\r\n componentDidMount(): void {\r\n this.fetchData();\r\n this.chart = this.createChart();\r\n }\r\n\r\n private createChart(): am4charts.XYChart {\r\n\r\n const chart: am4charts.XYChart = am4core.create(\r\n this.key,\r\n am4charts.XYChart\r\n );\r\n\r\n chart.maskBullets = false;\r\n\r\n const xAxis = chart.xAxes.push(new am4charts.CategoryAxis());\r\n const yAxis = chart.yAxes.push(new am4charts.CategoryAxis());\r\n\r\n xAxis.dataFields.category = \"date\";\r\n xAxis.renderer.grid.template.disabled = true;\r\n xAxis.renderer.minGridDistance = 1;\r\n xAxis.renderer.inversed = true;\r\n\r\n yAxis.dataFields.category = \"section\";\r\n yAxis.renderer.grid.template.disabled = true;\r\n yAxis.renderer.labels.template.disabled = true;\r\n yAxis.renderer.minGridDistance = 1;\r\n yAxis.minY = 0;\r\n yAxis.maxY = 24;\r\n\r\n const series = chart.series.push(new am4charts.ColumnSeries());\r\n series.dataFields.categoryX = \"date\";\r\n series.dataFields.categoryY = \"section\";\r\n series.dataFields.value = \"runningCount\";\r\n\r\n const bgColor = new am4core.InterfaceColorSet().getFor(\"background\");\r\n\r\n const columnTemplate = series.columns.template;\r\n columnTemplate.strokeWidth = 1;\r\n columnTemplate.strokeOpacity = 0.2;\r\n columnTemplate.stroke = bgColor;\r\n columnTemplate.width = am4core.percent(100);\r\n columnTemplate.height = am4core.percent(100);\r\n columnTemplate.column.adapter.add(\"fill\", (fill, target) => {\r\n if (target.dataItem && target.dataItem.dataContext) {\r\n const item = target.dataItem.dataContext as IHeatmapOverview;\r\n if (item.errorCount > 0) {\r\n const error = 10 * item.errorCount;\r\n return am4core.color(\"#dc3545\", error / (item.runningCount + error));\r\n }\r\n }\r\n return fill;\r\n });\r\n\r\n columnTemplate.cursorOverStyle = am4core.MouseCursorStyle.pointer;\r\n columnTemplate.events.on('hit', (ev) => {\r\n const dataItem = ev.target.dataItem as am4charts.ColumnSeriesDataItem;\r\n if (dataItem) {\r\n this.handleClick(dataItem);\r\n }\r\n }, this);\r\n\r\n series.heatRules.push({\r\n target: columnTemplate,\r\n property: \"fill\",\r\n\r\n // When using transparent background, use bgColor here too, otherwise define a default color\r\n // min: am4core.color(bgColor),\r\n min: am4core.color('#f8f9fa'),\r\n max: chart.colors.getIndex(0)\r\n });\r\n\r\n return chart;\r\n }\r\n\r\n private handleClick(dataItem: am4charts.ColumnSeriesDataItem): void {\r\n const clickedItem = dataItem.dataContext as IHeatmapOverview;\r\n if (clickedItem) {\r\n this.props.setStartEndDate(clickedItem.startDate, clickedItem.endDate);\r\n }\r\n }\r\n\r\n private fetchData(): void {\r\n fetch(this.getDataUrl())\r\n .then(x => x.json() as Promise)\r\n .then(x => {\r\n x.forEach(y => {\r\n const date = new Date(y.startDate);\r\n\r\n // Adding the properties for the heatmap\r\n y.date = date.toLocaleDateString('de-CH');\r\n y.section = date.getUTCHours();\r\n });\r\n\r\n this.setState({ data: x });\r\n });\r\n }\r\n\r\n private getDataUrl(): string {\r\n return Config.ApiServerAddress + `/${this.props.device}/overview`;\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (this.chart) {\r\n this.chart.dispose();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: IPlotProps): void {\r\n const { device } = prevProps;\r\n if (device !== this.props.device) {\r\n this.fetchData();\r\n }\r\n }\r\n\r\n public render(): ReactNode {\r\n\r\n // Somehow updating the values does not work\r\n if (this.chart && this.chart.data.length <= 0) {\r\n this.chart.data = this.state.data;\r\n }\r\n\r\n if (this.chart) {\r\n this.chart.xAxes.each(x => {\r\n x.setVisibility(!this.props.isMobile);\r\n });\r\n }\r\n\r\n return (\r\n
\r\n );\r\n }\r\n}\r\n","import React, { ReactNode } from \"react\";\r\nimport IPumpData from \"../../interfaces/IPumpData\";\r\nimport Config from \"../../Config\";\r\nimport Moment from \"react-moment\";\r\nimport IDeviceProp from \"../../interfaces/IDeviceProp\";\r\nimport ErrorHelper from \"../../helpers/ErrorHelper\";\r\n\r\ninterface ICurrentStatusState {\r\n data?: IPumpData;\r\n}\r\n\r\nexport class CurrentStatus extends React.Component {\r\n\r\n constructor(props: IDeviceProp) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.fetchStatusData(this.props.device);\r\n }\r\n\r\n public componentDidUpdate(prevProps: IDeviceProp): void {\r\n const { device } = prevProps;\r\n if (device !== this.props.device) {\r\n this.fetchStatusData(this.props.device);\r\n }\r\n }\r\n\r\n private fetchStatusData(device: string): void {\r\n fetch(this.generateStatusAPIUrl(device))\r\n .then(x => x.json() as Promise)\r\n .then(x => {\r\n this.setState({ data: x });\r\n });\r\n }\r\n\r\n private generateStatusAPIUrl(device: string): string {\r\n return Config.ApiServerAddress + `/${device}/status`;\r\n }\r\n\r\n public render(): ReactNode {\r\n const { data } = this.state;\r\n if (!data) {\r\n return <>;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n {data.errorRegister > 0 &&\r\n
\r\n \r\n \r\n
\r\n }\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React, { ReactNode } from \"react\";\r\nimport Config from \"../../Config\";\r\nimport Moment from \"react-moment\";\r\nimport IDeviceProp from \"../../interfaces/IDeviceProp\";\r\nimport IErrorSummary from \"../../interfaces/IErrorSummary\";\r\nimport ErrorHelper from \"../../helpers/ErrorHelper\";\r\n\r\ninterface ICurrentStatusState {\r\n data: IErrorSummary[];\r\n}\r\n\r\nexport class ErrorTable extends React.Component {\r\n constructor(props: IDeviceProp) {\r\n super(props);\r\n this.state = {\r\n data: []\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.fetchStatusData(this.props.device);\r\n }\r\n\r\n public componentDidUpdate(prevProps: IDeviceProp): void {\r\n const { device } = prevProps;\r\n if (device !== this.props.device) {\r\n this.fetchStatusData(this.props.device);\r\n }\r\n }\r\n\r\n private fetchStatusData(device: string): void {\r\n fetch(this.generateStatusAPIUrl(device))\r\n .then(x => x.json() as Promise)\r\n .then(x => {\r\n this.setState({ data: x });\r\n });\r\n }\r\n\r\n private generateStatusAPIUrl(device: string): string {\r\n return Config.ApiServerAddress + `/${device}/errors`;\r\n }\r\n\r\n public render(): ReactNode {\r\n const { data } = this.state;\r\n if (!data || data.length === 0) {\r\n return

Perfekt, es gab keine Fehler in den letzten 5 Tagen 😀.

;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {data.map(x => {\r\n const key: string = this.props.device + x.start;\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
DatumZeitbereichFehler
Uhr - Uhr{ErrorHelper.ExplainErrorFlags(x.errorRegister).map(y => {\r\n return {y.bit + 1}: {y.text}\r\n })}
\r\n );\r\n }\r\n}\r\n","import * as React from \"react\";\r\n\r\nexport class Footer extends React.Component {\r\n public render(): React.ReactNode {\r\n const currentYear = new Date().getFullYear();\r\n return (\r\n
\r\n

© {currentYear} ensigra GmbH

\r\n
\r\n );\r\n }\r\n}\r\n","import React, { ReactNode } from \"react\";\r\n\r\nexport class Loader extends React.Component {\r\n public render(): ReactNode {\r\n return (\r\n
\r\n
\r\n \"ELMA\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Daten werden geladen ...

\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport { TimelinePlot, CurrentStatus, ErrorTable, OverviewPlot, DetailPlot } from \"./../index\";\r\nimport Moment from \"react-moment\";\r\nimport IDeviceProp from \"../../interfaces/IDeviceProp\";\r\n\r\ninterface IDeviceState {\r\n startDate?: Date;\r\n endDate?: Date;\r\n}\r\n\r\nexport class Device extends React.Component {\r\n\r\n public constructor(props: IDeviceProp) {\r\n super(props);\r\n\r\n this.state = {\r\n startDate: undefined,\r\n endDate: undefined,\r\n };\r\n }\r\n\r\n private setStartEndDate(startDate: Date, endDate: Date): void {\r\n this.setState({\r\n startDate, endDate\r\n });\r\n }\r\n\r\n public render(): React.ReactNode {\r\n\r\n const { isMobile, device } = this.props;\r\n const { startDate, endDate } = this.state;\r\n const className = isMobile ? \"text-center elma-plot\" : \"text-center\";\r\n\r\n return (\r\n <>\r\n
\r\n {startDate && endDate && (\r\n

- Uhr

\r\n )\r\n }\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n }\r\n}","import React, { ReactNode } from \"react\";\r\nimport Config from \"../Config\";\r\nimport IDeviceProp from \"../interfaces/IDeviceProp\";\r\nimport { Loader, Device } from \"./index\";\r\nimport { Switch, Route, BrowserRouter, NavLink, Link } from \"react-router-dom\";\r\n\r\ninterface IDashboardState extends IDeviceProp {\r\n devices: string[];\r\n}\r\n\r\nexport default class Dashboard extends React.Component<{}, IDashboardState> {\r\n public constructor(props: {}) {\r\n super(props);\r\n\r\n this.state = {\r\n device: \"\",\r\n devices: [],\r\n isMobile: window.innerWidth < 767\r\n };\r\n }\r\n\r\n private updateDimensions(): void {\r\n this.setState({ isMobile: window.innerWidth < 767 });\r\n };\r\n\r\n componentDidMount(): void {\r\n window.addEventListener(\"resize\", this.updateDimensions.bind(this));\r\n fetch(Config.DeviceApiServerAddress)\r\n .then(response => response.json())\r\n .then(data =>\r\n this.setState({\r\n devices: data,\r\n device: data.length > 1 && data[1]\r\n })\r\n );\r\n }\r\n\r\n componentWillUnmount(): void {\r\n window.removeEventListener(\"resize\", this.updateDimensions.bind(this));\r\n }\r\n\r\n private setSelectedDevice(device: string): void {\r\n this.setState({\r\n device,\r\n });\r\n }\r\n\r\n public render(): ReactNode {\r\n const { devices, isMobile } = this.state;\r\n\r\n if (devices.length <= 0) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \"ELMA\r\n \r\n
\r\n
\r\n {devices.map((device, index) => {\r\n return \r\n {device}\r\n ;\r\n })}\r\n
\r\n\r\n \r\n {\r\n const device = x.match.params.device;\r\n return ;\r\n }} />\r\n \r\n
\r\n

Bitte wählen Sie eine Pumpe aus.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React, { ReactNode } from 'react';\r\nimport Dashboard from './Components/Dashboard';\r\nimport { Footer } from './Components';\r\n\r\nexport default class App extends React.Component {\r\n public render(): ReactNode {\r\n return (\r\n <>\r\n \r\n