From 5403b90369083db1687896b74c52b07eef63f156 Mon Sep 17 00:00:00 2001 From: lorenzo Date: Tue, 13 Jan 2026 16:03:32 +0100 Subject: [PATCH] changes --- src/specificClass.js | 112 ++++++++++--------------------------------- 1 file changed, 24 insertions(+), 88 deletions(-) diff --git a/src/specificClass.js b/src/specificClass.js index b80f66b..b350e85 100644 --- a/src/specificClass.js +++ b/src/specificClass.js @@ -85,10 +85,6 @@ class Machine { //perform init for certain values this._init(); - // used for holding the source and sink unit operations or other object with setInfluent / getEffluent method for e.g. recirculation. - this.upstreamSource = null; - this.downstreamSink = null; - this.child = {}; // object to hold child information so we know on what to subscribe this.childRegistrationUtils = new childRegistrationUtils(this); // Child registration utility @@ -117,31 +113,15 @@ class Machine { /*------------------- Register child events -------------------*/ registerChild(child, softwareType) { - if(!child) { - this.logger.error(`Invalid ${softwareType} child provided.`); - return; - } + this.logger.debug('Setting up child event for softwaretype ' + softwareType); - switch (softwareType) { - case "measurement": - this.logger.debug(`Registering measurement child...`); - this._connectMeasurement(child); - break; - case "reactor": - this.logger.debug(`Registering reactor child...`); - this._connectReactor(child); - break; - default: - this.logger.error(`Unrecognized softwareType: ${softwareType}`); - } - } - - _connectMeasurement(measurementChild) { - const position = measurementChild.config.functionality.positionVsParent; - const distance = measurementChild.config.functionality.distanceVsParent || 0; - const measurementType = measurementChild.config.asset.type; - //rebuild to measurementype.variant no position and then switch based on values not strings or names. - const eventName = `${measurementType}.measured.${position}`; + if(softwareType === "measurement"){ + const position = child.config.functionality.positionVsParent; + const distance = child.config.functionality.distanceVsParent || 0; + const measurementType = child.config.asset.type; + const key = `${measurementType}_${position}`; + //rebuild to measurementype.variant no position and then switch based on values not strings or names. + const eventName = `${measurementType}.measured.${position}`; this.logger.debug(`Setting up listener for ${eventName} from child ${child.config.general.name}`); // Register event listener for measurement updates @@ -185,57 +165,24 @@ _callMeasurementHandler(measurementType, value, position, context) { break; } } - this.logger.debug(`Setting up listener for ${eventName} from child ${measurementChild.config.general.name}`); - // Register event listener for measurement updates - measurementChild.measurements.emitter.on(eventName, (eventData) => { - this.logger.debug(`🔄 ${position} ${measurementType} from ${eventData.childName}: ${eventData.value} ${eventData.unit}`); - // Store directly in parent's measurement container - this.measurements - .type(measurementType) - .variant("measured") - .position(position) - .value(eventData.value, eventData.timestamp, eventData.unit); +//---------------- END child stuff -------------// + + // Method to assess drift using errorMetrics + assessDrift(measurement, processMin, processMax) { + this.logger.debug(`Assessing drift for measurement: ${measurement} processMin: ${processMin} processMax: ${processMax}`); + const predictedMeasurement = this.measurements.type(measurement).variant("predicted").position("downstream").getAllValues().values; + const measuredMeasurement = this.measurements.type(measurement).variant("measured").position("downstream").getAllValues().values; + + if (!predictedMeasurement || !measuredMeasurement) return null; - // Call the appropriate handler - switch (measurementType) { - case 'pressure': - this.updateMeasuredPressure(eventData.value, position, eventData); - break; - - case 'flow': - this.updateMeasuredFlow(eventData.value, position, eventData); - break; - - default: - this.logger.warn(`No handler for measurement type: ${measurementType}`); - // Generic handler - just update position - this.updatePosition(); - } - }); - } - - _connectReactor(reactorChild) { - this.downstreamSink = reactorChild; // downstream from the pumps perpective - } - - //---------------- END child stuff -------------// - - // Method to assess drift using errorMetrics - assessDrift(measurement, processMin, processMax) { - this.logger.debug(`Assessing drift for measurement: ${measurement} processMin: ${processMin} processMax: ${processMax}`); - const predictedMeasurement = this.measurements.type(measurement).variant("predicted").position("downstream").getAllValues().values; - const measuredMeasurement = this.measurements.type(measurement).variant("measured").position("downstream").getAllValues().values; - - if (!predictedMeasurement || !measuredMeasurement) return null; - - return this.errorMetrics.assessDrift( - predictedMeasurement, - measuredMeasurement, - processMin, - processMax - ); - } + return this.errorMetrics.assessDrift( + predictedMeasurement, + measuredMeasurement, + processMin, + processMax + ); + } reverseCurve(curve) { const reversedCurve = {}; @@ -612,17 +559,12 @@ _callMeasurementHandler(measurementType, value, position, context) { // NEW: Flow handler updateMeasuredFlow(value, position, context = {}) { - if (!this._isOperationalState()) { this.logger.warn(`Machine not operational, skipping flow update from ${context.childName || 'unknown'}`); return; } this.logger.debug(`Flow update: ${value} at ${position} from ${context.childName || 'child'}`); - - if (this.upstreamSource && this.downstreamSink) { - this.updateSourceSink(); - } // Store in parent's measurement container this.measurements.type("flow").variant("measured").position(position).value(value, context.timestamp, context.unit); @@ -634,12 +576,6 @@ _callMeasurementHandler(measurementType, value, position, context) { } } - updateSourceSink() { - // Handles flow according to the configured "flow number" - this.logger.debug(`Updating source-sink pair: ${this.upstreamSource.config.functionality.softwareType} - ${this.downstreamSink.config.functionality.softwareType}`); - this.downstreamSink.setInfluent = this.upstreamSource.getEffluent[this.config.flowNumber]; - } - // Helper method for operational state check _isOperationalState() { const state = this.state.getCurrentState();