[WIP] fix graph bugs

This commit is contained in:
Sina Blattmann 2023-06-29 08:40:28 +02:00
parent f0e8553c24
commit 4ee1709386
11 changed files with 196 additions and 727 deletions

Binary file not shown.

View File

@ -9,10 +9,12 @@
<TargetFramework>net6.0</TargetFramework>
<InvariantGlobalization>true</InvariantGlobalization>
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
<RootNamespace>$([System.Text.RegularExpressions.Regex]::Match($(MSBuildProjectExtensionsPath), "[/\\]csharp[/\\].*[/\\]obj").ToString().Replace("/",".").Replace("\\",".").Replace(".csharp", $(Company)).Replace(".obj", ""))</RootNamespace>
<RootNamespace>Please.reload.the.project.Rider.is.stupid</RootNamespace>
<Authors>$(Company) Team</Authors>
<!-- <ProjectPath>$([System.Text.RegularExpressions.Regex]::Match($(MSBuildProjectExtensionsPath), "[/\\]csharp[/\\].*[/\\]obj").ToString().Replace("/",".").Replace("\\",".").Replace(".csharp", $(Company)).Replace(".obj", ""))</ProjectPath>-->
</PropertyGroup>
<PropertyGroup Condition="'$(SolutionDir)' != ''">
<RootNamespace>$(Company).$(MSBuildProjectDirectory.Replace($(SolutionDir), "").Replace("/",".").Replace("\","."))</RootNamespace>
</PropertyGroup>
</Project>

View File

@ -42,7 +42,6 @@
"react-plotly.js": "^2.6.0",
"react-router-dom": "^6.8.0",
"react-scripts": "5.0.1",
"react-window": "^1.8.9",
"reactflow": "^11.5.6",
"rxjs": "^7.8.0",
"sass": "^1.58.3",
@ -17199,11 +17198,6 @@
"node": ">= 4.0.0"
}
},
"node_modules/memoize-one": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@ -20585,22 +20579,6 @@
"react-dom": ">=16.13"
}
},
"node_modules/react-window": {
"version": "1.8.9",
"resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz",
"integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==",
"dependencies": {
"@babel/runtime": "^7.0.0",
"memoize-one": ">=3.1.1 <6"
},
"engines": {
"node": ">8.0.0"
},
"peerDependencies": {
"react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/reactflow": {
"version": "11.5.6",
"resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.5.6.tgz",
@ -38023,11 +38001,6 @@
"fs-monkey": "^1.0.3"
}
},
"memoize-one": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@ -40347,15 +40320,6 @@
"debounce": "^1.2.1"
}
},
"react-window": {
"version": "1.8.9",
"resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz",
"integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==",
"requires": {
"@babel/runtime": "^7.0.0",
"memoize-one": ">=3.1.1 <6"
}
},
"reactflow": {
"version": "11.5.6",
"resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.5.6.tgz",

View File

@ -37,7 +37,6 @@
"react-plotly.js": "^2.6.0",
"react-router-dom": "^6.8.0",
"react-scripts": "5.0.1",
"react-window": "^1.8.9",
"reactflow": "^11.5.6",
"rxjs": "^7.8.0",
"sass": "^1.58.3",

View File

@ -1,33 +1,48 @@
import { createContext, ReactNode, SetStateAction, useState } from "react";
import { TreeElement, ToggleElement } from "../Installations/Log/CheckboxTree";
import { createContext, ReactNode, useState } from "react";
import { TreeElement } from "../Installations/Log/CheckboxTree";
import React from "react";
interface LogContextProviderProps {
toggles: TreeElement[] | null;
setToggles: (value: TreeElement[]) => void;
checkedToggles: ToggleElement | null;
setCheckedToggles: React.Dispatch<SetStateAction<ToggleElement | null>>;
checkedToggles: string[];
setChecked: (newValue: string) => void;
removeChecked: (value: string) => void;
}
export const LogContext = createContext<LogContextProviderProps>({
toggles: [],
setToggles: () => {},
checkedToggles: {},
setCheckedToggles: () => {},
checkedToggles: [],
setChecked: () => {},
removeChecked: () => {},
});
const LogContextProvider = ({ children }: { children: ReactNode }) => {
const [toggles, setToggles] = useState<TreeElement[] | null>(null);
const [checkedToggles, setCheckedToggles] = useState<ToggleElement | null>(
null
);
const [checkedToggles, setCheckedToggles] = useState<string[]>([]);
const setChecked = (newValue: string) => {
if (checkedToggles.length === 5) {
const removedChecked = checkedToggles.slice(1);
setCheckedToggles([...removedChecked, newValue]);
} else {
setCheckedToggles([...checkedToggles, newValue]);
}
};
const removeChecked = (value: string) => {
setCheckedToggles(checkedToggles.filter((toggle) => toggle !== value));
};
return (
<LogContext.Provider
value={{
toggles,
setToggles,
checkedToggles,
setCheckedToggles,
setChecked,
removeChecked,
}}
>
{children}

View File

@ -20,7 +20,8 @@ export interface TreeElement {
}
const CheckboxTree = () => {
const { toggles, setCheckedToggles, checkedToggles } = useContext(LogContext);
const { toggles, setChecked, checkedToggles, removeChecked } =
useContext(LogContext);
const routeMatch = useRouteMatch([
routes.installations + routes.list + routes.log + ":id",
]);
@ -29,29 +30,17 @@ const CheckboxTree = () => {
return element.children.length > 0 ? renderTree(element.children) : null;
};
const handleCheckChildren = (children: TreeElement[], checked?: boolean) => {
if (children.length > 0) {
children.forEach((child) => {
setCheckedToggles((prevState) => {
return {
...prevState,
[child.id]: !checked,
};
});
if (child.children.length > 0) {
handleCheckChildren(child.children, checked);
}
});
}
};
const handleClick = (
event: React.MouseEvent<HTMLButtonElement, MouseEvent>,
element: TreeElement,
checked?: boolean
checked?: string
) => {
if (checked) {
removeChecked(element.id);
} else {
event.stopPropagation();
handleCheckChildren([element], checked);
setChecked(element.id);
}
};
const handleExpandClick = (
@ -62,7 +51,7 @@ const CheckboxTree = () => {
const renderTree = (data: TreeElement[]): ReactNode => {
return data.map((element) => {
const checked = checkedToggles?.[element.id];
const checked = checkedToggles.find((toggle) => element.id === toggle);
const splitName = element.name.split("/");
return (
<TreeItem
@ -72,15 +61,17 @@ const CheckboxTree = () => {
onClick={handleExpandClick}
label={
<>
{element.children.length === 0 && (
<Checkbox
checked={checked}
checked={!!checked}
onClick={(e) => handleClick(e, element, checked)}
/>
)}
{splitName[splitName.length - 1]}
</>
}
sx={{
".MuiTreeItem-content": { paddingY: "5px" },
".MuiTreeItem-content": { paddingY: "5px", minHeight: "52px" },
}}
>
{getNodes(element)}

View File

@ -3,7 +3,6 @@ import { DataRecord, RecordSeries } from "../../../dataCache/data";
import {
GraphData,
createTimes,
flattenToggles,
getTreeElements,
isNumeric,
parseCsv,
@ -11,21 +10,13 @@ import {
transformToBarGraphData,
} from "../../../util/graph.util";
import { TimeRange, TimeSpan, UnixTime } from "../../../dataCache/time";
import {
memo,
useCallback,
useContext,
useEffect,
useMemo,
useState,
} from "react";
import { useCallback, useContext, useEffect, useMemo, useState } from "react";
import { BehaviorSubject, startWith, throttleTime, withLatestFrom } from "rxjs";
import { S3Access } from "../../../dataCache/S3/S3Access";
import DataCache, { FetchResult } from "../../../dataCache/dataCache";
import { LogContext } from "../../Context/LogContextProvider";
import { isDefined } from "../../../dataCache/utils/maybe";
import { Data, Layout, PlotRelayoutEvent } from "plotly.js";
import { VariableSizeList as List, areEqual } from "react-window";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
import { FormattedMessage } from "react-intl";
import DateRangePicker from "./DateRangePicker";
@ -34,462 +25,6 @@ import { Alert } from "@mui/material";
const NUMBER_OF_NODES = 100;
export const testData = `/AcDc/SystemControl/Alarms;;
/AcDc/SystemControl/CommunicationTimeout;00:00:10;
/AcDc/SystemControl/SystemConfig;AcDcAndDcDc;
/AcDc/SystemControl/ResetAlarmsAndWarnings;False;
/AcDc/SystemControl/TargetSlave;0;
/AcDc/SystemControl/UseSlaveIdForAddressing;False;
/AcDc/SystemControl/ReferenceFrame;Producer;
/AcDc/SystemControl/SlaveErrorHandling;Relaxed;
/AcDc/SystemControl/SubSlaveErrorHandling;Strict;
/AcDc/SystemControl/PowerSetPointActivation;Immediate;
/AcDc/SystemControl/PowerSetPointTrigger;Wait;
/AcDc/SystemControl/DeviceState;Operation;
/AcDc/SystemControl/NumberOfConnectedSlaves;2;
/AcDc/SystemControl/NumberOfConnectedSubSlaves;0;
/AcDc/SystemControl/Warnings;;
/AcDc/Devices/1/Status/Ac/L1/Voltage;0;V
/AcDc/Devices/1/Status/Ac/L1/Current;0;A
/AcDc/Devices/1/Status/Ac/L1/Power/Apparent;0;VA
/AcDc/Devices/1/Status/Ac/L1/Power/Active;0;W
/AcDc/Devices/1/Status/Ac/L1/Power/Reactive;0;var
/AcDc/Devices/1/Status/Ac/L1/Power/Phi;0;rad
/AcDc/Devices/1/Status/Ac/L1/Power/CosPhi;1;
/AcDc/Devices/1/Status/Ac/L2/Voltage;0;V
/AcDc/Devices/1/Status/Ac/L2/Current;0;A
/AcDc/Devices/1/Status/Ac/L2/Power/Apparent;0;VA
/AcDc/Devices/1/Status/Ac/L2/Power/Active;0;W
/AcDc/Devices/1/Status/Ac/L2/Power/Reactive;0;var
/AcDc/Devices/1/Status/Ac/L2/Power/Phi;0;rad
/AcDc/Devices/1/Status/Ac/L2/Power/CosPhi;1;
/AcDc/Devices/1/Status/Ac/L3/Voltage;0;V
/AcDc/Devices/1/Status/Ac/L3/Current;0;A
/AcDc/Devices/1/Status/Ac/L3/Power/Apparent;0;VA
/AcDc/Devices/1/Status/Ac/L3/Power/Active;0;W
/AcDc/Devices/1/Status/Ac/L3/Power/Reactive;0;var
/AcDc/Devices/1/Status/Ac/L3/Power/Phi;0;rad
/AcDc/Devices/1/Status/Ac/L3/Power/CosPhi;1;
/AcDc/Devices/1/Status/Ac/Power/Apparent;0;VA
/AcDc/Devices/1/Status/Ac/Power/Active;0;W
/AcDc/Devices/1/Status/Ac/Power/Reactive;0;var
/AcDc/Devices/1/Status/Ac/Power/Phi;0;rad
/AcDc/Devices/1/Status/Ac/Power/CosPhi;1;
/AcDc/Devices/1/Status/Ac/Frequency;0;Hz
/AcDc/Devices/1/Status/Dc/Voltage;0;V
/AcDc/Devices/1/Status/Dc/Current;0;A
/AcDc/Devices/1/Status/Dc/Power;0;W
/AcDc/Devices/1/Status/PowerLimitedBy;Nothing;
/AcDc/Devices/1/Status/InverterState/Current;Idle;
/AcDc/Devices/1/Status/InverterState/OnLastAlarm;Idle;
/AcDc/Devices/1/Status/ActiveGridType;GridTied400V50Hz;
/AcDc/Devices/1/Status/Voltage/Intern/DcUpperHalf;0;V
/AcDc/Devices/1/Status/Voltage/Intern/DcLowerHalf;0;V
/AcDc/Devices/1/Status/Voltage/Intern/NToPe;0;V
/AcDc/Devices/1/Status/Voltage/Extern/DcUpperHalf;0;V
/AcDc/Devices/1/Status/Voltage/Extern/DcLowerHalf;0;V
/AcDc/Devices/1/Status/Voltage/Extern/NToPe;0;V
/AcDc/Devices/1/Status/Temperature/InletAir;0;°C
/AcDc/Devices/1/Status/Temperature/IgbtL1;0;°C
/AcDc/Devices/1/Status/Temperature/IgbtL2;0;°C
/AcDc/Devices/1/Status/Temperature/IgbtL3;0;°C
/AcDc/Devices/1/Status/Temperature/IgbtBalancer;0;°C
/AcDc/Devices/1/Status/OverloadCapacity/L1;0;%
/AcDc/Devices/1/Status/OverloadCapacity/L2;0;%
/AcDc/Devices/1/Status/OverloadCapacity/L3;0;%
/AcDc/Devices/1/Status/Nominal/AcFrequency;50;Hz
/AcDc/Devices/1/Status/Nominal/AcVoltage;400;V
/AcDc/Devices/1/Status/Nominal/Power;25000;W
/AcDc/Devices/1/Status/Alarms;;
/AcDc/Devices/1/Status/Warnings;;
/AcDc/Devices/1/Control/Ac/PhaseControl;Symmetric;
/AcDc/Devices/1/Control/Ac/GridType;GridTied400V50Hz;
/AcDc/Devices/1/Control/Ac/IslandMode/FrequencyOffset;0;Hz
/AcDc/Devices/1/Control/Ac/IslandMode/VoltageAdjustmentFactor;100;%
/AcDc/Devices/1/Control/Dc/ReferenceVoltage;750;V
/AcDc/Devices/1/Control/Dc/MinVoltage;730;V
/AcDc/Devices/1/Control/Dc/MaxVoltage;770;V
/AcDc/Devices/1/Control/Dc/PrechargeConfig;PrechargeDcWithSystemCtl;
/AcDc/Devices/1/Control/PowerStageEnable;True;
/AcDc/Devices/1/Control/ResetAlarmsAndWarnings;False;
/AcDc/Devices/2/Status/Ac/L1/Voltage;0;V
/AcDc/Devices/2/Status/Ac/L1/Current;0;A
/AcDc/Devices/2/Status/Ac/L1/Power/Apparent;0;VA
/AcDc/Devices/2/Status/Ac/L1/Power/Active;0;W
/AcDc/Devices/2/Status/Ac/L1/Power/Reactive;0;var
/AcDc/Devices/2/Status/Ac/L1/Power/Phi;0;rad
/AcDc/Devices/2/Status/Ac/L1/Power/CosPhi;1;
/AcDc/Devices/2/Status/Ac/L2/Voltage;0;V
/AcDc/Devices/2/Status/Ac/L2/Current;0;A
/AcDc/Devices/2/Status/Ac/L2/Power/Apparent;0;VA
/AcDc/Devices/2/Status/Ac/L2/Power/Active;0;W
/AcDc/Devices/2/Status/Ac/L2/Power/Reactive;0;var
/AcDc/Devices/2/Status/Ac/L2/Power/Phi;0;rad
/AcDc/Devices/2/Status/Ac/L2/Power/CosPhi;1;
/AcDc/Devices/2/Status/Ac/L3/Voltage;0;V
/AcDc/Devices/2/Status/Ac/L3/Current;0;A
/AcDc/Devices/2/Status/Ac/L3/Power/Apparent;0;VA
/AcDc/Devices/2/Status/Ac/L3/Power/Active;0;W
/AcDc/Devices/2/Status/Ac/L3/Power/Reactive;0;var
/AcDc/Devices/2/Status/Ac/L3/Power/Phi;0;rad
/AcDc/Devices/2/Status/Ac/L3/Power/CosPhi;1;
/AcDc/Devices/2/Status/Ac/Power/Apparent;0;VA
/AcDc/Devices/2/Status/Ac/Power/Active;0;W
/AcDc/Devices/2/Status/Ac/Power/Reactive;0;var
/AcDc/Devices/2/Status/Ac/Power/Phi;0;rad
/AcDc/Devices/2/Status/Ac/Power/CosPhi;1;
/AcDc/Devices/2/Status/Ac/Frequency;0;Hz
/AcDc/Devices/2/Status/Dc/Voltage;0;V
/AcDc/Devices/2/Status/Dc/Current;0;A
/AcDc/Devices/2/Status/Dc/Power;0;W
/AcDc/Devices/2/Status/PowerLimitedBy;Nothing;
/AcDc/Devices/2/Status/InverterState/Current;Idle;
/AcDc/Devices/2/Status/InverterState/OnLastAlarm;Idle;
/AcDc/Devices/2/Status/ActiveGridType;GridTied400V50Hz;
/AcDc/Devices/2/Status/Voltage/Intern/DcUpperHalf;0;V
/AcDc/Devices/2/Status/Voltage/Intern/DcLowerHalf;0;V
/AcDc/Devices/2/Status/Voltage/Intern/NToPe;0;V
/AcDc/Devices/2/Status/Voltage/Extern/DcUpperHalf;0;V
/AcDc/Devices/2/Status/Voltage/Extern/DcLowerHalf;0;V
/AcDc/Devices/2/Status/Voltage/Extern/NToPe;0;V
/AcDc/Devices/2/Status/Temperature/InletAir;0;°C
/AcDc/Devices/2/Status/Temperature/IgbtL1;0;°C
/AcDc/Devices/2/Status/Temperature/IgbtL2;0;°C
/AcDc/Devices/2/Status/Temperature/IgbtL3;0;°C
/AcDc/Devices/2/Status/Temperature/IgbtBalancer;0;°C
/AcDc/Devices/2/Status/OverloadCapacity/L1;0;%
/AcDc/Devices/2/Status/OverloadCapacity/L2;0;%
/AcDc/Devices/2/Status/OverloadCapacity/L3;0;%
/AcDc/Devices/2/Status/Nominal/AcFrequency;50;Hz
/AcDc/Devices/2/Status/Nominal/AcVoltage;400;V
/AcDc/Devices/2/Status/Nominal/Power;25000;W
/AcDc/Devices/2/Status/Alarms;;
/AcDc/Devices/2/Status/Warnings;;
/AcDc/Devices/2/Control/Ac/PhaseControl;Symmetric;
/AcDc/Devices/2/Control/Ac/GridType;GridTied400V50Hz;
/AcDc/Devices/2/Control/Ac/IslandMode/FrequencyOffset;0;Hz
/AcDc/Devices/2/Control/Ac/IslandMode/VoltageAdjustmentFactor;100;%
/AcDc/Devices/2/Control/Dc/ReferenceVoltage;750;V
/AcDc/Devices/2/Control/Dc/MinVoltage;730;V
/AcDc/Devices/2/Control/Dc/MaxVoltage;770;V
/AcDc/Devices/2/Control/Dc/PrechargeConfig;PrechargeDcWithSystemCtl;
/AcDc/Devices/2/Control/PowerStageEnable;True;
/AcDc/Devices/2/Control/ResetAlarmsAndWarnings;False;
/AcDc/Alarms;;
/AcDc/Warnings;;
/AcDc/Ac/L1/Voltage;0;V
/AcDc/Ac/L1/Current;0;A
/AcDc/Ac/L1/Power/Apparent;0;VA
/AcDc/Ac/L1/Power/Active;0;W
/AcDc/Ac/L1/Power/Reactive;0;var
/AcDc/Ac/L1/Power/Phi;0;rad
/AcDc/Ac/L1/Power/CosPhi;1;
/AcDc/Ac/L2/Voltage;0;V
/AcDc/Ac/L2/Current;0;A
/AcDc/Ac/L2/Power/Apparent;0;VA
/AcDc/Ac/L2/Power/Active;0;W
/AcDc/Ac/L2/Power/Reactive;0;var
/AcDc/Ac/L2/Power/Phi;0;rad
/AcDc/Ac/L2/Power/CosPhi;1;
/AcDc/Ac/L3/Voltage;0;V
/AcDc/Ac/L3/Current;0;A
/AcDc/Ac/L3/Power/Apparent;0;VA
/AcDc/Ac/L3/Power/Active;0;W
/AcDc/Ac/L3/Power/Reactive;0;var
/AcDc/Ac/L3/Power/Phi;0;rad
/AcDc/Ac/L3/Power/CosPhi;1;
/AcDc/Ac/Power/Apparent;0;VA
/AcDc/Ac/Power/Active;0;W
/AcDc/Ac/Power/Reactive;0;var
/AcDc/Ac/Power/Phi;0;rad
/AcDc/Ac/Power/CosPhi;1;
/AcDc/Ac/Frequency;0;Hz
/AcDc/Dc/Voltage;0;V
/AcDc/Dc/Current;0;A
/AcDc/Dc/Power;0;W
/DcDc/Dc/Link/Voltage;0;V
/DcDc/Dc/Link/Current;0;A
/DcDc/Dc/Link/Power;0;W
/DcDc/Dc/Battery/Voltage;0;V
/DcDc/Dc/Battery/Current;0;A
/DcDc/Dc/Battery/Power;0;W
/DcDc/SystemControl/Alarms;;
/DcDc/SystemControl/CommunicationTimeout;00:00:10;
/DcDc/SystemControl/SystemConfig;DcDcOnly;
/DcDc/SystemControl/ResetAlarmsAndWarnings;False;
/DcDc/SystemControl/TargetSlave;0;
/DcDc/SystemControl/UseSlaveIdForAddressing;False;
/DcDc/SystemControl/ReferenceFrame;Producer;
/DcDc/SystemControl/SlaveErrorHandling;Relaxed;
/DcDc/SystemControl/SubSlaveErrorHandling;Strict;
/DcDc/SystemControl/PowerSetPointActivation;Immediate;
/DcDc/SystemControl/PowerSetPointTrigger;Wait;
/DcDc/SystemControl/DeviceState;Operation;
/DcDc/SystemControl/NumberOfConnectedSlaves;2;
/DcDc/SystemControl/NumberOfConnectedSubSlaves;0;
/DcDc/SystemControl/Warnings;;
/DcDc/Devices/1/Status/Dc/Link/Voltage;0;V
/DcDc/Devices/1/Status/Dc/Link/Current;0;A
/DcDc/Devices/1/Status/Dc/Link/Power;0;W
/DcDc/Devices/1/Status/Dc/Battery/Voltage;0;V
/DcDc/Devices/1/Status/Dc/Battery/Current;0;A
/DcDc/Devices/1/Status/Dc/Battery/Power;0;W
/DcDc/Devices/1/Status/OverloadCapacity;0;%
/DcDc/Devices/1/Status/Temperature/InletAir;0;°C
/DcDc/Devices/1/Status/Temperature/HighVoltageModule;0;°C
/DcDc/Devices/1/Status/Temperature/LowVoltageModule;0;°C
/DcDc/Devices/1/Status/PowerLimitedBy;;
/DcDc/Devices/1/Status/Alarms;;
/DcDc/Devices/1/Status/Warnings;;
/DcDc/Devices/1/Control/Vcc/EndPointCurrent;50;A
/DcDc/Devices/1/Control/Vcc/EndPointVoltage;50;V
/DcDc/Devices/1/Control/Vcc/StartPointCurrent;5;A
/DcDc/Devices/1/Control/VoltageLimits/MinBatteryVoltageAlarm;0;V
/DcDc/Devices/1/Control/VoltageLimits/MaxBatteryVoltageAlarm;60;V
/DcDc/Devices/1/Control/VoltageLimits/MinBatteryVoltage;42;V
/DcDc/Devices/1/Control/VoltageLimits/MaxBatteryVoltage;57;V
/DcDc/Devices/1/Control/DroopControl/ReferenceVoltage;750;V
/DcDc/Devices/1/Control/DroopControl/LowerVoltage;55;V
/DcDc/Devices/1/Control/DroopControl/UpperVoltage;55;V
/DcDc/Devices/1/Control/DroopControl/VoltageDeadband;0;V
/DcDc/Devices/1/Control/CurrentControl/CurrentSetpoint;0;A
/DcDc/Devices/1/Control/CurrentControl/MaxCurrentChangePerMs;100;A
/DcDc/Devices/1/Control/MaxDcPower;5;W
/DcDc/Devices/1/Control/ControlMode;VoltageDroop;
/DcDc/Devices/1/Control/ResetAlarmsAndWarnings;False;
/DcDc/Devices/1/Control/PowerStageEnable;True;
/DcDc/Devices/2/Status/Dc/Link/Voltage;0;V
/DcDc/Devices/2/Status/Dc/Link/Current;0;A
/DcDc/Devices/2/Status/Dc/Link/Power;0;W
/DcDc/Devices/2/Status/Dc/Battery/Voltage;0;V
/DcDc/Devices/2/Status/Dc/Battery/Current;0;A
/DcDc/Devices/2/Status/Dc/Battery/Power;0;W
/DcDc/Devices/2/Status/OverloadCapacity;0;%
/DcDc/Devices/2/Status/Temperature/InletAir;0;°C
/DcDc/Devices/2/Status/Temperature/HighVoltageModule;0;°C
/DcDc/Devices/2/Status/Temperature/LowVoltageModule;0;°C
/DcDc/Devices/2/Status/PowerLimitedBy;;
/DcDc/Devices/2/Status/Alarms;;
/DcDc/Devices/2/Status/Warnings;;
/DcDc/Devices/2/Control/Vcc/EndPointCurrent;50;A
/DcDc/Devices/2/Control/Vcc/EndPointVoltage;50;V
/DcDc/Devices/2/Control/Vcc/StartPointCurrent;5;A
/DcDc/Devices/2/Control/VoltageLimits/MinBatteryVoltageAlarm;0;V
/DcDc/Devices/2/Control/VoltageLimits/MaxBatteryVoltageAlarm;60;V
/DcDc/Devices/2/Control/VoltageLimits/MinBatteryVoltage;42;V
/DcDc/Devices/2/Control/VoltageLimits/MaxBatteryVoltage;57;V
/DcDc/Devices/2/Control/DroopControl/ReferenceVoltage;750;V
/DcDc/Devices/2/Control/DroopControl/LowerVoltage;55;V
/DcDc/Devices/2/Control/DroopControl/UpperVoltage;55;V
/DcDc/Devices/2/Control/DroopControl/VoltageDeadband;0;V
/DcDc/Devices/2/Control/CurrentControl/CurrentSetpoint;0;A
/DcDc/Devices/2/Control/CurrentControl/MaxCurrentChangePerMs;100;A
/DcDc/Devices/2/Control/MaxDcPower;5;W
/DcDc/Devices/2/Control/ControlMode;VoltageDroop;
/DcDc/Devices/2/Control/ResetAlarmsAndWarnings;False;
/DcDc/Devices/2/Control/PowerStageEnable;True;
/DcDc/Alarms;;
/DcDc/Warnings;;
/Battery/Dc/Voltage;51.898;V
/Battery/Dc/Current;0.21000000000000002;A
/Battery/Dc/Power;10.898580000000003;W
/Battery/Eoc;True;
/Battery/Warnings;;
/Battery/Alarms;;
/Battery/Soc;99.9;%
/Battery/Devices/1/Dc/Voltage;51.69;V
/Battery/Devices/1/Dc/Current;0.05;A
/Battery/Devices/1/Dc/Power;2.5845000000000002;W
/Battery/Devices/1/Leds/Blue;Off;
/Battery/Devices/1/Leds/Red;Off;
/Battery/Devices/1/Leds/Green;On;
/Battery/Devices/1/Leds/Amber;Off;
/Battery/Devices/1/Temperatures/Heating;True;
/Battery/Devices/1/Temperatures/Board;46.5;°C
/Battery/Devices/1/Temperatures/Cells/Center;249.9;°C
/Battery/Devices/1/Temperatures/Cells/Left;249.5;°C
/Battery/Devices/1/Temperatures/Cells/Right;249.5;°C
/Battery/Devices/1/Temperatures/State;Operation;
/Battery/Devices/1/ConnectedToDcBus;True;
/Battery/Devices/1/Eoc;True;
/Battery/Devices/1/Warnings;;
/Battery/Devices/1/Alarms;;
/Battery/Devices/1/Soc;100;%
/Battery/Devices/1/MaxChargePower;5418.875;W
/Battery/Devices/1/MaxDischargePower;-4668.75;W
/Battery/Devices/2/Dc/Voltage;51.49;V
/Battery/Devices/2/Dc/Current;0.02;A
/Battery/Devices/2/Dc/Power;1.0298;W
/Battery/Devices/2/Leds/Blue;Off;
/Battery/Devices/2/Leds/Red;Off;
/Battery/Devices/2/Leds/Green;On;
/Battery/Devices/2/Leds/Amber;Off;
/Battery/Devices/2/Temperatures/Heating;True;
/Battery/Devices/2/Temperatures/Board;55;°C
/Battery/Devices/2/Temperatures/Cells/Center;251.4;°C
/Battery/Devices/2/Temperatures/Cells/Left;249.8;°C
/Battery/Devices/2/Temperatures/Cells/Right;254.2;°C
/Battery/Devices/2/Temperatures/State;Operation;
/Battery/Devices/2/ConnectedToDcBus;True;
/Battery/Devices/2/Eoc;True;
/Battery/Devices/2/Warnings;;
/Battery/Devices/2/Alarms;;
/Battery/Devices/2/Soc;100;%
/Battery/Devices/2/MaxChargePower;5398.95;W
/Battery/Devices/2/MaxDischargePower;-4648.900000000001;W
/Battery/Devices/3/Dc/Voltage;52.2;V
/Battery/Devices/3/Dc/Current;0.02;A
/Battery/Devices/3/Dc/Power;1.044;W
/Battery/Devices/3/Leds/Blue;Off;
/Battery/Devices/3/Leds/Red;Off;
/Battery/Devices/3/Leds/Green;On;
/Battery/Devices/3/Leds/Amber;Off;
/Battery/Devices/3/Temperatures/Heating;True;
/Battery/Devices/3/Temperatures/Board;47.5;°C
/Battery/Devices/3/Temperatures/Cells/Center;250.5;°C
/Battery/Devices/3/Temperatures/Cells/Left;249.8;°C
/Battery/Devices/3/Temperatures/Cells/Right;251.4;°C
/Battery/Devices/3/Temperatures/State;Operation;
/Battery/Devices/3/ConnectedToDcBus;True;
/Battery/Devices/3/Eoc;True;
/Battery/Devices/3/Warnings;;
/Battery/Devices/3/Alarms;;
/Battery/Devices/3/Soc;100;%
/Battery/Devices/3/MaxChargePower;5469.95;W
/Battery/Devices/3/MaxDischargePower;-4719.900000000001;W
/Battery/Devices/4/Dc/Voltage;51.94;V
/Battery/Devices/4/Dc/Current;0.03;A
/Battery/Devices/4/Dc/Power;1.5581999999999998;W
/Battery/Devices/4/Leds/Blue;Off;
/Battery/Devices/4/Leds/Red;Off;
/Battery/Devices/4/Leds/Green;On;
/Battery/Devices/4/Leds/Amber;Off;
/Battery/Devices/4/Temperatures/Heating;True;
/Battery/Devices/4/Temperatures/Board;47;°C
/Battery/Devices/4/Temperatures/Cells/Center;250;°C
/Battery/Devices/4/Temperatures/Cells/Left;249.8;°C
/Battery/Devices/4/Temperatures/Cells/Right;252.1;°C
/Battery/Devices/4/Temperatures/State;Operation;
/Battery/Devices/4/ConnectedToDcBus;False;
/Battery/Devices/4/Eoc;True;
/Battery/Devices/4/Warnings;;
/Battery/Devices/4/Alarms;;
/Battery/Devices/4/Soc;99.9;%
/Battery/Devices/4/MaxChargePower;5443.925;W
/Battery/Devices/4/MaxDischargePower;-4693.849999999999;W
/Battery/Devices/5/Dc/Voltage;52.17;V
/Battery/Devices/5/Dc/Current;0.09;A
/Battery/Devices/5/Dc/Power;4.6953;W
/Battery/Devices/5/Leds/Blue;Off;
/Battery/Devices/5/Leds/Red;Off;
/Battery/Devices/5/Leds/Green;On;
/Battery/Devices/5/Leds/Amber;Off;
/Battery/Devices/5/Temperatures/Heating;True;
/Battery/Devices/5/Temperatures/Board;48.5;°C
/Battery/Devices/5/Temperatures/Cells/Center;250.6;°C
/Battery/Devices/5/Temperatures/Cells/Left;249.8;°C
/Battery/Devices/5/Temperatures/Cells/Right;250.8;°C
/Battery/Devices/5/Temperatures/State;Operation;
/Battery/Devices/5/ConnectedToDcBus;True;
/Battery/Devices/5/Eoc;True;
/Battery/Devices/5/Warnings;;
/Battery/Devices/5/Alarms;;
/Battery/Devices/5/Soc;100;%
/Battery/Devices/5/MaxChargePower;5466.775;W
/Battery/Devices/5/MaxDischargePower;-4716.55;W
/GridMeter/Ac/L1/Voltage;243;V
/GridMeter/Ac/L1/Current;-12.360750198364258;A
/GridMeter/Ac/L1/Power/Apparent;3009.25;VA
/GridMeter/Ac/L1/Power/Active;-2969;W
/GridMeter/Ac/L1/Power/Reactive;502;var
/GridMeter/Ac/L1/Power/Phi;2.974096306323614;rad
/GridMeter/Ac/L1/Power/CosPhi;-0.9860052513602484;
/GridMeter/Ac/L2/Voltage;243.60000610351562;V
/GridMeter/Ac/L2/Current;-12.548500061035156;A
/GridMeter/Ac/L2/Power/Apparent;3043;VA
/GridMeter/Ac/L2/Power/Active;-3033;W
/GridMeter/Ac/L2/Power/Reactive;351;var
/GridMeter/Ac/L2/Power/Phi;3.026378172298827;rad
/GridMeter/Ac/L2/Power/CosPhi;-0.9933701504473591;
/GridMeter/Ac/L3/Voltage;244.39999389648438;V
/GridMeter/Ac/L3/Current;-13.57349967956543;A
/GridMeter/Ac/L3/Power/Apparent;3317;VA
/GridMeter/Ac/L3/Power/Active;-3313;W
/GridMeter/Ac/L3/Power/Reactive;-73.25;var
/GridMeter/Ac/L3/Power/Phi;-3.1194863851016974;rad
/GridMeter/Ac/L3/Power/CosPhi;-0.9997556663972327;
/GridMeter/Ac/Power/Apparent;9347.579101697936;VA
/GridMeter/Ac/Power/Active;-9315;W
/GridMeter/Ac/Power/Reactive;779.75;var
/GridMeter/Ac/Power/Phi;3.058078286561564;rad
/GridMeter/Ac/Power/CosPhi;-0.9965147016844159;
/GridMeter/Ac/Frequency;50;Hz
/CriticalLoad/Ac/L1/Voltage;244;V
/CriticalLoad/Ac/L1/Current;0;A
/CriticalLoad/Ac/L1/Power/Apparent;0;VA
/CriticalLoad/Ac/L1/Power/Active;0;W
/CriticalLoad/Ac/L1/Power/Reactive;0;var
/CriticalLoad/Ac/L1/Power/Phi;0;rad
/CriticalLoad/Ac/L1/Power/CosPhi;1;
/CriticalLoad/Ac/L2/Voltage;243;V
/CriticalLoad/Ac/L2/Current;0;A
/CriticalLoad/Ac/L2/Power/Apparent;0;VA
/CriticalLoad/Ac/L2/Power/Active;0;W
/CriticalLoad/Ac/L2/Power/Reactive;0;var
/CriticalLoad/Ac/L2/Power/Phi;0;rad
/CriticalLoad/Ac/L2/Power/CosPhi;1;
/CriticalLoad/Ac/L3/Voltage;245.6999969482422;V
/CriticalLoad/Ac/L3/Current;0;A
/CriticalLoad/Ac/L3/Power/Apparent;0;VA
/CriticalLoad/Ac/L3/Power/Active;0;W
/CriticalLoad/Ac/L3/Power/Reactive;0;var
/CriticalLoad/Ac/L3/Power/Phi;0;rad
/CriticalLoad/Ac/L3/Power/CosPhi;1;
/CriticalLoad/Ac/Power/Apparent;0;VA
/CriticalLoad/Ac/Power/Active;0;W
/CriticalLoad/Ac/Power/Reactive;0;var
/CriticalLoad/Ac/Power/Phi;0;rad
/CriticalLoad/Ac/Power/CosPhi;1;
/CriticalLoad/Ac/Frequency;50;Hz
/Relays/K1AcInIsConnectedToGrid;True;
/Relays/K2AcInIsConnectedToAcOut;True;
/Relays/K3Inverter1IsConnectedToAcOut;True;
/Relays/K3Inverter2IsConnectedToAcOut;True;
/Relays/K3Inverter3IsConnectedToAcOut;True;
/Relays/K3Inverter4IsConnectedToAcOut;True;
/Relays/FiWarning;False;
/Relays/FiError;False;
/Relays/K2ConnectAcInToAcOut;True;
/Relays/K3InvertersAreConnectedToAcOut;True;
/Mppt/Dc/Voltage;772.454;V
/Mppt/Dc/Current;10.655000000000001;A
/Mppt/Dc/Power;8230.497370000001;W
/Mppt/Strings/1/Voltage;690.09;V
/Mppt/Strings/1/Current;3.221;A
/Mppt/Strings/1/Power;2222.7798900000003;W
/Mppt/Strings/2/Voltage;599.549;V
/Mppt/Strings/2/Current;3.23;A
/Mppt/Strings/2/Power;1936.54327;W
/Mppt/Strings/3/Voltage;695.46;V
/Mppt/Strings/3/Current;3.371;A
/Mppt/Strings/3/Power;2344.39566;W
/Mppt/Strings/4/Voltage;623.849;V
/Mppt/Strings/4/Current;2.868;A
/Mppt/Strings/4/Power;1789.198932;W
/Config/MinSoc;20;
/Config/LastEoc;0;
/Config/PConstant;0.5;
/Config/ForceChargePower;1000000;
/Config/ForceDischargePower;-1000000;
/Config/MaxInverterPower;32000;
/Config/GridSetPoint;0;
/Config/SelfDischargePower;200;
/Config/HoldSocZone;1;
/Config/ControllerPConstant;0.5;
/SystemState/Message;Panic: Unknown State!;
/SystemState/Id;100;
/LoadOnDc/Power;100;`;
const s3Access = new S3Access(
"saliomameiringen",
"sos-ch-dk-2",
@ -510,7 +45,6 @@ export const fetchData = (
return Promise.resolve(FetchResult.notAvailable);
} else if (r.status === 200) {
const text = await r.text();
console.log("csv", parseCsv(text));
return parseCsv(text);
} else {
console.error("unexpected status code");
@ -533,11 +67,9 @@ const ScalarGraph = () => {
timeRange[0].toDate(),
timeRange[timeRange.length - 1].toDate(),
]);
const [uiRevision, setUiRevision] = useState(Math.random());
const [plotTitles, setPlotTitles] = useState<string[]>([]);
const { toggles, setToggles, setCheckedToggles, checkedToggles } =
useContext(LogContext);
const { toggles, setToggles, checkedToggles } = useContext(LogContext);
const times$ = useMemo(() => new BehaviorSubject(timeRange), []);
@ -556,7 +88,6 @@ const ScalarGraph = () => {
if (toggles === null && toggleValues && toggleValues.value) {
const treeElements = getTreeElements(toggleValues.value);
setToggles(treeElements);
setCheckedToggles(flattenToggles(treeElements));
}
});
return () => subscription.unsubscribe();
@ -628,30 +159,43 @@ const ScalarGraph = () => {
const range0 = new Date(xaxisRange0);
const range1 = new Date(xaxisRange1);
setRange([range0, range1]);
setUiRevision(Math.random());
getCacheSeries(range0, range1);
}
},
[getCacheSeries]
);
const Row = memo((props: any) => {
const { data, index, style } = props;
const visibleGraphs = Object.keys(data).filter((path) => {
return checkedToggles ? checkedToggles[path] : false;
});
if (data[visibleGraphs[index]]) {
const isScalar = isNumeric(data[visibleGraphs[index]].y[0]);
const graphData = isScalar
const renderGraphs = () => {
if (checkedToggles.length > 0) {
const coordinateTimeSeries = transformToGraphData(timeSeries);
const visibleGraphs = Object.keys(coordinateTimeSeries).filter((path) => {
console.log('checkedToggles',coordinateTimeSeries, checkedToggles)
return checkedToggles.find((toggle) => toggle === path)
}
);
console.log('visibleGraphs', visibleGraphs)
if (visibleGraphs.length > 0) {
return (
<div style={{ marginTop: "20px" }}>
<LocalizationProvider dateAdapter={AdapterDayjs}>
<DateRangePicker
setRange={setRange}
range={range}
getCacheSeries={getCacheSeries}
/>
</LocalizationProvider>
{visibleGraphs.map((path) => {
const isScalar = isNumeric(coordinateTimeSeries[path].y[0]);
const data = isScalar
? [
{
...data[visibleGraphs[index]],
...coordinateTimeSeries[path],
type: "scatter",
mode: "lines+markers",
mode: "lines",
fill: "tozeroy",
},
]
: transformToBarGraphData(data[visibleGraphs[index]]);
: transformToBarGraphData(coordinateTimeSeries[path]);
const barGraphLayout: Partial<Layout> = !isScalar
? {
bargap: 0,
@ -659,16 +203,15 @@ const ScalarGraph = () => {
barnorm: "percent",
}
: {};
console.log("graphdata", coordinateTimeSeries);
return (
<div style={style}>
<Plot
key={index}
data={graphData as Data[]}
key={path}
data={data as Data[]}
layout={{
width: 1000,
height: 500,
autosize: true,
title: visibleGraphs[index],
title: path,
xaxis: {
autorange: false,
range: range,
@ -689,45 +232,12 @@ const ScalarGraph = () => {
}}
onRelayout={handleRelayout}
/>
);
})}
</div>
);
}
return null;
}, areEqual);
if (
checkedToggles &&
Object.keys(checkedToggles).find((toggle) => {
return checkedToggles[toggle];
})
) {
const coordinateTimeSeries = transformToGraphData(timeSeries);
return (
<div style={{ marginTop: "20px" }}>
<LocalizationProvider dateAdapter={AdapterDayjs}>
<DateRangePicker
setRange={setRange}
range={range}
getCacheSeries={getCacheSeries}
/>
</LocalizationProvider>
<List
height={1000}
itemCount={
Object.keys(checkedToggles).filter(
(toggle) => checkedToggles[toggle]
).length - 1
}
itemSize={() => 500}
width="100%"
itemData={coordinateTimeSeries}
>
{Row}
</List>
</div>
);
}
return (
<Alert sx={{ mt: 2 }} severity="info">
<FormattedMessage
@ -736,5 +246,8 @@ const ScalarGraph = () => {
/>
</Alert>
);
};
return <>{renderGraphs()}</>;
};
export default ScalarGraph;

View File

@ -1,5 +1,5 @@
import { Box } from "@mui/material";
import { getBoxColor } from "../../../util/graph.util";
import {Box} from "@mui/material";
import {getBoxColor} from "../../../util/graph.util";
export type BoxData = {
label: string;
@ -18,8 +18,7 @@ const isInt = (value: number) => {
export const BOX_SIZE = 85;
const TopologyBox = (props: TopologyBoxProps) => {
const { titleColor, boxColor } = getBoxColor(props.title);
if (props.title === "Battery") console.log(props.data?.values, "data");
const {titleColor, boxColor} = getBoxColor(props.title);
return (
<Box
sx={{
@ -58,7 +57,8 @@ const TopologyBox = (props: TopologyBoxProps) => {
{props.data.values.map((value, index) => {
return (
<p
style={{ marginBlockStart: "0", marginBlockEnd: "2px" }}
key={props.title + '-' + index}
style={{marginBlockStart: "0", marginBlockEnd: "2px"}}
// eslint-disable-next-line formatjs/no-literal-string-in-jsx
>{`${
props.data && props.data.values.length === 3

View File

@ -9,7 +9,6 @@ export type TopologyFlowProps = {
hidden?: boolean;
};
const TopologyFlow = (props: TopologyFlowProps) => {
console.log("amount", props.amount, props.data?.values);
const length = Math.abs((props.amount ?? 1) * BOX_SIZE);
const values = props.data?.values;
return (

View File

@ -109,7 +109,6 @@ export default class DataCache<T extends Record<string, CsvEntry>> {
//What about string nodes? like Alarms
for (const k of Object.keys(dataBefore)) {
const beforeData = dataBefore[k].value;
console.log(dataAfter[k]);
const afterData = Number(dataAfter[k].value);
let foo = interpolated[k];
if (foo) {

View File

@ -1,7 +1,6 @@
import { Datum, TypedArray } from "plotly.js";
import {
TreeElement,
ToggleElement,
} from "../components/Installations/Log/CheckboxTree";
import { TimeRange, UnixTime } from "../dataCache/time";
import { DataPoint, DataRecord } from "../dataCache/data";
@ -143,7 +142,6 @@ export const extractTopologyValues = (
const values = topologyPaths[topologyKey as keyof TopologyValues].map(
(topologyPath) => timeSeriesValue[topologyPath]
);
console.log("values", values, topologyKey);
switch (topologyKey as keyof TopologyValues) {
case "gridToAcInConnection":
topologyValues = [
@ -153,7 +151,6 @@ export const extractTopologyValues = (
default:
topologyValues = values.map((element) => element.value);
}
console.log("topologyValues", topologyValues);
return {
...acc,
[topologyKey]: {
@ -200,8 +197,9 @@ export const parseCsv = (text: string): DataRecord => {
});
const x = y
.map((fields) => {
if (isNaN(Number(fields[1]))) {
console.log("fields", fields[1]);
if (fields[0] === "/AcDc/Warnings")
console.log("warnings", fields[1], isNaN(+fields[1]));
if (isNaN(Number(fields[1])) || fields[1] === "") {
return { [fields[0]]: { value: fields[1], unit: fields[2] } };
}
return { [fields[0]]: { value: parseFloat(fields[1]), unit: fields[2] } };
@ -210,17 +208,6 @@ export const parseCsv = (text: string): DataRecord => {
return x;
};
export const flattenToggles = (toggles: TreeElement[]): ToggleElement => {
return toggles.reduce((acc, current) => {
if (current.children.length > 0) {
acc[current.id] = false;
return { ...acc, ...flattenToggles(current.children) };
}
acc[current.id] = false;
return acc;
}, {} as ToggleElement);
};
export const insertTreeElements = (
children: TreeElement[] = [],
[head, ...tail]: string[]
@ -291,7 +278,7 @@ export const transformToBarGraphData = (data: GraphCoordinates) => {
marker: { color: stringToColor(split) },
type: "bar",
name: split,
showlegend: !foundName,
showlegend: split.length > 0 ? !foundName : false,
} as any;
});
}