dev-Rene #1
@@ -219,15 +219,14 @@ class pumpingStation {
|
|||||||
this._updateVolumePrediction("in"); // check for changes in incomming flow
|
this._updateVolumePrediction("in"); // check for changes in incomming flow
|
||||||
|
|
||||||
//calc the most important values back to determine state and net up or downstream flow
|
//calc the most important values back to determine state and net up or downstream flow
|
||||||
this._calcNetFlow();
|
//this._calcNetFlow();
|
||||||
const {time:timeleft, source:variant} = this._calcTimeRemaining();
|
const {time:timeleft, source:variant} = this._calcTimeRemaining();
|
||||||
|
|
||||||
|
this.logger.debug(`Remaining time ${Math.round(timeleft/60/60*100)/100} h, based on variant ${variant} `);
|
||||||
this.logger.debug(`Remaining time ${timeleft}, based on variant ${variant} `);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_calcTimeRemaining(){
|
_calcTimeRemaining(){
|
||||||
//init timeRemaining
|
//init timeRemaining
|
||||||
const winningTime = {time:0,source:""};
|
const winningTime = {time:0,source:""};
|
||||||
|
|
||||||
//calculate time left prioritise flow based variant
|
//calculate time left prioritise flow based variant
|
||||||
@@ -377,7 +376,7 @@ class pumpingStation {
|
|||||||
let netFlow = null;
|
let netFlow = null;
|
||||||
|
|
||||||
const netFlow_FlowSensor = Math.abs(this.measurements.type("flow").variant("measured").difference({ from: "downstream", to: "upstream", unit: "m3/s" }));
|
const netFlow_FlowSensor = Math.abs(this.measurements.type("flow").variant("measured").difference({ from: "downstream", to: "upstream", unit: "m3/s" }));
|
||||||
const netFlow_LevelSensor = this._calcNetFlowFromLevelDiff();
|
const netFlow_LevelSensor = this._calcNetFlowFromLevelDiff("measured");
|
||||||
const netFlow_PredictedFlow = Math.abs(this.measurements.type('flow').variant('predicted').difference({ from: "in", to: "out", unit: "m3/s" }));
|
const netFlow_PredictedFlow = Math.abs(this.measurements.type('flow').variant('predicted').difference({ from: "in", to: "out", unit: "m3/s" }));
|
||||||
|
|
||||||
switch (true){
|
switch (true){
|
||||||
@@ -442,36 +441,39 @@ class pumpingStation {
|
|||||||
//@params : variant : example "predicted","measured"
|
//@params : variant : example "predicted","measured"
|
||||||
_calcRemainingTimeBasedOnLevel(variant){
|
_calcRemainingTimeBasedOnLevel(variant){
|
||||||
|
|
||||||
|
const {heightOverflow,heightOutlet} = this.basin;
|
||||||
const levelObj = this.measurements.type("level").variant(variant).position("atEquipment");
|
const levelObj = this.measurements.type("level").variant(variant).position("atEquipment");
|
||||||
const level = levelObj.getCurrentValue("m");
|
const level = levelObj.getCurrentValue("m");
|
||||||
const prevLevel = levelObj.getLaggedValue(2, "m"); // { value, timestamp, unit }
|
const prevLevelSample = levelObj.getLaggedSample(2, "m"); // { value, timestamp, unit }
|
||||||
const measurement = levelObj.get();
|
const measurement = levelObj.get();
|
||||||
const latestTimestamp = measurement?.getLatestTimestamp();
|
const latestTimestamp = measurement?.getLatestTimestamp();
|
||||||
|
|
||||||
if (level === null || !prevLevel || latestTimestamp == null) {
|
if (level === null || prevLevelSample == null || latestTimestamp == null) {
|
||||||
this.logger.warn(`no flowdiff ${level}, previous level ${prevLevel}, latestTimestamp ${latestTimestamp} found escaping`);
|
this.logger.warn(`no flowdiff ${level}, previous level ${prevLevelSample}, latestTimestamp ${latestTimestamp} found escaping`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const deltaSeconds = (latestTimestamp - prevLevel.timestamp) / 1000;
|
const deltaSeconds = (latestTimestamp - prevLevelSample.timestamp) / 1000;
|
||||||
if (deltaSeconds <= 0) {
|
if (deltaSeconds <= 0) {
|
||||||
this.logger.warn(`Level fallback: invalid Δt=${deltaSeconds} , LatestTimestamp : ${latestTimestamp}, PrevTimestamp : ${prevLevel.timestamp}`);
|
this.logger.warn(`Level fallback: invalid Δt=${deltaSeconds} , LatestTimestamp : ${latestTimestamp}, PrevTimestamp : ${prevLevelSample.value}`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const lvlDiff = level - prevLevel.value;
|
const lvlDiff = level - prevLevelSample.value;
|
||||||
const lvlRate = Math.abs(lvlDiff / deltaSeconds); // m/s
|
const lvlRate = lvlDiff / deltaSeconds; // m/s
|
||||||
|
let secondsRemaining = 0;
|
||||||
|
let remainingHeight = 0;
|
||||||
|
|
||||||
switch(true){
|
switch(true){
|
||||||
|
|
||||||
case(lvlRate>0):
|
case(lvlRate>0):
|
||||||
remainingHeight = Math.max(heightOverflow - level, 0);
|
remainingHeight = Math.max(heightOverflow - level, 0);
|
||||||
secondsRemaining = remainingHeight / lvlRate; // seconds
|
secondsRemaining = remainingHeight / Math.abs(lvlRate); // seconds
|
||||||
return secondsRemaining;
|
return secondsRemaining;
|
||||||
|
|
||||||
case(lvlRate<0):
|
case(lvlRate<0):
|
||||||
remainingHeight = Math.max(level - heightOutlet, 0);
|
remainingHeight = Math.max(level - heightOutlet, 0);
|
||||||
secondsRemaining = remainingHeight / lvlRate;
|
secondsRemaining = remainingHeight / Math.abs(lvlRate);
|
||||||
return secondsRemaining;
|
return secondsRemaining;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -511,22 +513,22 @@ class pumpingStation {
|
|||||||
const { surfaceArea } = this.basin;
|
const { surfaceArea } = this.basin;
|
||||||
const levelObj = this.measurements.type("level").variant(variant).position("atEquipment");
|
const levelObj = this.measurements.type("level").variant(variant).position("atEquipment");
|
||||||
const level = levelObj.getCurrentValue("m");
|
const level = levelObj.getCurrentValue("m");
|
||||||
const prevLevel = levelObj.getLaggedValue(2, "m"); // { value, timestamp, unit }
|
const prevLevelSample = levelObj.getLaggedSample(2, "m"); // { value, timestamp, unit }
|
||||||
const measurement = levelObj.get();
|
const measurement = levelObj.get();
|
||||||
const latestTimestamp = measurement?.getLatestTimestamp();
|
const latestTimestamp = measurement?.getLatestTimestamp();
|
||||||
|
|
||||||
if (level === null || !prevLevel || latestTimestamp == null) {
|
if (level === null || prevLevelSample == null || latestTimestamp == null) {
|
||||||
this.logger.warn(`no flowdiff ${level}, previous level ${prevLevel}, latestTimestamp ${latestTimestamp} found escaping`);
|
this.logger.warn(`no flowdiff ${level}, previous level ${prevLevelSample}, latestTimestamp ${latestTimestamp} found escaping`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const deltaSeconds = (latestTimestamp - prevLevel.timestamp) / 1000;
|
const deltaSeconds = (latestTimestamp - prevLevelSample.timestamp) / 1000;
|
||||||
if (deltaSeconds <= 0) {
|
if (deltaSeconds <= 0) {
|
||||||
this.logger.warn(`Level fallback: invalid Δt=${deltaSeconds} , LatestTimestamp : ${latestTimestamp}, PrevTimestamp : ${prevLevel.timestamp}`);
|
this.logger.warn(`Level fallback: invalid Δt=${deltaSeconds} , LatestTimestamp : ${latestTimestamp}, PrevTimestamp : ${prevLevelSample.timestamp}`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const lvlDiff = level - prevLevel.value;
|
const lvlDiff = level - prevLevelSample.value;
|
||||||
const lvlRate = lvlDiff / deltaSeconds; // m/s
|
const lvlRate = lvlDiff / deltaSeconds; // m/s
|
||||||
const netFlowRate = lvlRate * surfaceArea; // m³/s inferred from level trend
|
const netFlowRate = lvlRate * surfaceArea; // m³/s inferred from level trend
|
||||||
|
|
||||||
@@ -562,6 +564,7 @@ class pumpingStation {
|
|||||||
|
|
||||||
//init predicted min volume to min vol in order to have a starting point
|
//init predicted min volume to min vol in order to have a starting point
|
||||||
this.measurements.type("volume").variant("predicted").position("atEquipment").value(minVol).unit('m3');
|
this.measurements.type("volume").variant("predicted").position("atEquipment").value(minVol).unit('m3');
|
||||||
|
this.measurements.type("volume").variant("predicted").position("atEquipment").value(maxVol).unit('m3');
|
||||||
|
|
||||||
this.logger.debug(`
|
this.logger.debug(`
|
||||||
Basin initialized | area=${surfaceArea.toFixed(2)} m²,
|
Basin initialized | area=${surfaceArea.toFixed(2)} m²,
|
||||||
|
|||||||
Reference in New Issue
Block a user