Parcourir la source

Remove unnecessary files

Inte Vleminckx il y a 3 semaines
Parent
commit
e4d8b3fb98

BIN
Calibration/data/calibration.fmu


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1435
Calibration/data/measurement_data.csv


+ 0 - 35
Calibration/main.py

@@ -1,35 +0,0 @@
-from src.calibration_2 import CalibrationSetup, Calibration
-from src.data_extraction import DataExtraction
-
-if __name__ == '__main__':
-    # cal_setup = CalibrationSetup(
-    #     min_leakage_opening=0.0001,
-    #     max_leakage_opening=0.01,
-    #     step_leakage_opening=0.005,
-    #     min_rise_time=2100,
-    #     max_rise_time=2400,
-    #     step_rise_time=50,
-    #     start_motor_position=1,
-    #     start_time=0.0,
-    #     stop_time=1200.0,
-    #     step_size=0.100,
-    #     degree=50
-    # )
-    #
-    # cal = Calibration(cal_setup)
-    # cal.run()
-    cal_setup = CalibrationSetup(
-        A=0,
-        K=1,
-        Q=(5, 100, 5),
-        B=(0.02, 0.01, 0.001),
-        M=(5, 100, 5),
-        v=(0.25, 5, 0.25),
-        start_time=0.0,
-        stop_time=600.0,
-        step_size=0.100,
-        degree=20
-    )
-
-    cal = Calibration(cal_setup)
-    cal.run()

BIN
Calibration/results/calibration_20_degree.png


+ 0 - 211
Calibration/src/calibration.py

@@ -1,211 +0,0 @@
-from dataclasses import dataclass
-
-from matplotlib import pyplot as plt
-
-from src.data_extraction import DataExtraction
-from src.utils import get_model_path, get_results_path
-
-from typing import Dict, Any
-
-from fmpy import extract, read_model_description
-from fmpy.fmi2 import FMU2Slave
-from fmpy.model_description import ModelDescription
-from tqdm import tqdm
-
-@dataclass
-class CalibrationSetup:
-    min_leakage_opening: float
-    max_leakage_opening: float
-    step_leakage_opening: float
-    min_rise_time: float
-    max_rise_time: float
-    step_rise_time: float
-    start_motor_position: float
-    start_time: float
-    stop_time: float
-    step_size: float
-    degree: int
-
-
-class Calibration:
-
-    def __init__(self, cal_setup: CalibrationSetup):
-        self.cal_setup = cal_setup
-        self.model_path = get_model_path("calibration")
-
-        self.current_time = self.cal_setup.start_time
-
-        self._fmu: FMU2Slave = None
-        self._model_desc: ModelDescription = None
-
-        self._input_refs: Dict[str, Dict[str, Any]] = {}
-        self._output_refs: Dict[str, Dict[str, Any]] = {}
-        self._parameter_refs: Dict[str, Dict[str, Any]] = {}
-
-        self.data_handler = DataExtraction()
-
-    def setup(self, rise_time_heating, rise_time_cooling, leakage_opening):
-        self._load_fmu()
-        self._load_input_references()
-        self._load_parameter_references()
-        self._load_output_references()
-        self._fmu.enterInitializationMode()
-        self.set_start_position(1)
-        self.set_rise_time_heating(rise_time_heating)
-        self.set_rise_time_cooling(rise_time_cooling)
-        self.set_leakage_opening(leakage_opening)
-        self._fmu.exitInitializationMode()
-        self.current_time = self.cal_setup.start_time
-
-    def perform_step(self) -> bool:
-        if self.current_time < self.cal_setup.stop_time:
-            self._fmu.doStep(
-                currentCommunicationPoint=self.current_time,
-                communicationStepSize=self.cal_setup.step_size,
-            )
-            self.current_time += self.cal_setup.step_size
-            self.current_time = round(self.current_time, 2)
-            return True
-        return False
-
-    def _load_fmu(self):
-
-        if not self.model_path.exists():
-            raise FileNotFoundError(f"FMU file not found at path: '{self.model_path}'")
-
-        extract_dir = extract(self.model_path)
-        self._model_desc = read_model_description(self.model_path)
-
-        self._fmu = FMU2Slave(
-            guid=self._model_desc.guid, unzipDirectory=extract_dir,
-            modelIdentifier=self._model_desc.coSimulation.modelIdentifier
-        )
-        self._fmu.instantiate()
-        self._fmu.setupExperiment(
-            startTime=self.cal_setup.start_time, stopTime=self.cal_setup.stop_time
-        )
-
-    def _load_input_references(self):
-        self._input_refs = {
-            var.name: {"reference": var.valueReference}
-            for var in self._model_desc.modelVariables
-            if var.causality == "input"
-        }
-
-    def _load_parameter_references(self):
-        self._parameter_refs = {
-            var.name: {"reference": var.valueReference}
-            for var in self._model_desc.modelVariables
-            if var.causality == "parameter" and (var.name in ["riseTimeCooling","riseTimeHeating", "leakageOpening"])
-        }
-
-    def _load_output_references(self):
-        self._output_refs = {
-            var.name: {"reference": var.valueReference}
-            for var in self._model_desc.modelVariables
-            if var.causality == "output"
-        }
-
-    def set_start_position(self, value: float):
-        ref = self._input_refs.get("start_position")
-        self._fmu.setReal([ref["reference"]], [value])
-
-    def set_rise_time_heating(self, value: float):
-        ref = self._parameter_refs.get("riseTimeHeating")
-        self._fmu.setReal([ref["reference"]], [value])
-
-    def set_rise_time_cooling(self, value: float):
-        ref = self._parameter_refs.get("riseTimeCooling")
-        self._fmu.setReal([ref["reference"]], [value])
-
-    def set_leakage_opening(self, value: float):
-        ref = self._parameter_refs.get("leakageOpening")
-        self._fmu.setReal([ref["reference"]], [value])
-
-    def set_new_position(self, value: float):
-        ref = self._input_refs.get("u")
-        self._fmu.setReal([ref["reference"]], [value])
-
-    def get_motor_position(self):
-        ref = self._output_refs.get("y")
-        return round(self._fmu.getReal([ref["reference"]])[0], 5)
-
-    def run(self):
-
-        rise_time_cooling = round(self.cal_setup.min_rise_time, 0)
-
-        best_results = {
-            "rsse": float('inf'),
-            "data": None,
-            "rise_time_heating": None,
-            "rise_time_cooling": None,
-            "leakage": None
-        }
-
-        total_iters = (int((self.cal_setup.max_rise_time - self.cal_setup.min_rise_time) / self.cal_setup.step_rise_time) + 1) ** 2
-        p_bar = tqdm(total=total_iters, desc="Calibration Progress")
-
-        while rise_time_cooling <= round(self.cal_setup.max_rise_time, 0):
-            rise_time_heating = round(self.cal_setup.min_rise_time, 0)
-            while rise_time_heating <= round(self.cal_setup.max_rise_time, 0):
-                leakage = round(self.cal_setup.min_leakage_opening, 4)
-                # while leakage <= round(self.cal_setup.max_rise_time, 4):
-
-                self.setup(rise_time_heating, rise_time_cooling, leakage)
-                performed_step = True
-                self.set_new_position(0)
-
-                sim_results = {}
-                while performed_step:
-
-                    sim_results[round(self.current_time, 1)] = self.get_motor_position()
-
-                    if abs(self.current_time - 600) <= 0.0005:
-                        self.set_new_position(1)
-
-                    performed_step = self.perform_step()
-
-                # self.plot(sim_results, rise_time, leakage)
-
-                # leakage += self.cal_setup.step_leakage_opening
-                # leakage = round(leakage, 4)
-
-                rsse, filtered_data = self.data_handler.calculate_rsse(sim_results, self.cal_setup.degree)
-                if rsse < best_results['rsse']:
-                    best_results = {
-                        "rsse": rsse,
-                        "data": filtered_data,
-                        "rise_time_heating": rise_time_heating,
-                        "rise_time_cooling": rise_time_cooling,
-                        "leakage": leakage
-                    }
-
-                rise_time_heating += self.cal_setup.step_rise_time
-                rise_time_heating = round(rise_time_heating, 0)
-                p_bar.update(1)
-
-            rise_time_cooling += self.cal_setup.step_rise_time
-            rise_time_cooling = round(rise_time_cooling, 0)
-
-        self.plot(best_results)
-
-    def plot(self, best_results):
-
-        times = self.data_handler.df['Time'].values
-        sim_data = best_results["data"]
-        measured_data = self.data_handler.get_degree_values(self.cal_setup.degree)
-
-        plt.figure(figsize=(8, 4))
-        plt.plot(times, sim_data, linewidth=2, label="Simulation")
-        plt.plot(times, measured_data, linewidth=2, label="Measured")
-
-        plt.xlabel("Time [s]")
-        plt.ylabel("Actuator Position")
-        plt.title(
-            f"Simulation: riseTimeCooling={best_results['rise_time_cooling']} riseTimeHeating={best_results['rise_time_heating']} "
-            f"leakage={best_results['leakage']} RSSE={best_results['rsse']:.3f} degrees={self.cal_setup.degree}"
-        )
-        plt.grid(True, linestyle="--", alpha=0.7)
-        plt.legend()
-        plt.tight_layout()
-        plt.savefig(get_results_path(f"calibration_{self.cal_setup.degree}_degree"))

+ 0 - 60
Calibration/src/data_extraction.py

@@ -1,60 +0,0 @@
-import numpy as np
-
-from src.utils import get_data_path
-import pandas as pd
-
-
-class DataExtraction:
-
-    def __init__(self):
-        self.data_file = get_data_path("measurement_data")
-        self.df = pd.read_csv(self.data_file)
-
-        self.preprocess()
-
-    def preprocess(self):
-        
-        self.df = self.df[['Unnamed: 1', 'Distance in mm at 0°C', 'Distance in mm at 20°C', 'Distance in mm at 50°C']]
-        self.df = self.df.rename(columns={
-            'Unnamed: 1': 'Time',
-            'Distance in mm at 0°C': 'Value at 0',
-            'Distance in mm at 20°C': 'Value at 20',
-            'Distance in mm at 50°C': 'Value at 50',
-        })
-
-        self.df = self.df.iloc[1:]
-
-        cols = ['Time', 'Value at 0', 'Value at 20', 'Value at 50']
-        self.df[cols] = self.df[cols].astype(float).round(2)
-
-        self.df = self.df[(self.df['Time'] >= 20) & (self.df['Time'] <= 30)] # Change between 20 or 30
-        self.df['Time'] = (self.df['Time'] - 20)
-        self.df['Time'] = (self.df['Time'] * 60).round(1)
-
-
-    def calculate_rsse(self, data, degree):
-        data_pred = np.array([v for k, v in data.items() if k in set(self.df['Time'])])
-        data_true = None
-        match degree:
-            case 0:
-                data_true = self.df['Value at 0'].values
-            case 20:
-                data_true = self.df['Value at 20'].values
-            case 50:
-                data_true = self.df['Value at 50'].values
-            case _:
-                raise Exception(f"Degree '{degree}', isn't a valid degree. Valid degrees are: 0, 20, and 50.")
-
-        return np.sqrt(np.sum((data_true - data_pred)**2)), data_pred
-
-    def get_degree_values(self, degree):
-        match degree:
-            case 0:
-                return self.df['Value at 0'].values
-            case 20:
-                return self.df['Value at 20'].values
-            case 50:
-                return self.df['Value at 50'].values
-            case _:
-                raise Exception(f"Degree '{degree}', isn't a valid degree. Valid degrees are: 0, 20, and 50.")
-

+ 0 - 13
Calibration/src/utils.py

@@ -1,13 +0,0 @@
-from pathlib import Path
-
-def get_model_path(filename):
-    cur_dir = Path(__file__).parent.parent.resolve()
-    return (cur_dir / "data" / f"{filename}.fmu").resolve()
-
-def get_data_path(filename):
-    cur_dir = Path(__file__).parent.parent.resolve()
-    return (cur_dir / "data" / f"{filename}.csv").resolve()
-
-def get_results_path(filename):
-    cur_dir = Path(__file__).parent.parent.resolve()
-    return (cur_dir / "results" / f"{filename}.png").resolve()

+ 0 - 49
cp-only-overview.drawio

@@ -1,49 +0,0 @@
-<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.0.6 Chrome/138.0.7204.100 Electron/37.2.3 Safari/537.36" version="28.0.6">
-  <diagram name="Page-1" id="RACrpZbRbYwWqmwFlNLv">
-    <mxGraphModel dx="815" dy="455" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
-      <root>
-        <mxCell id="0" />
-        <mxCell id="1" parent="0" />
-        <mxCell id="1MKeEKei01TN4UT9uz78-2" value="CB5&lt;div&gt;(Source code control loop)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
-          <mxGeometry x="240" y="280" width="100" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-3" value="FMU&lt;div&gt;(pipe network, &lt;br&gt;pressure pump, &lt;br&gt;valve-actuator,&lt;/div&gt;&lt;div&gt;flow sensor)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
-          <mxGeometry x="520" y="280" width="100" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-4" value="" style="rounded=1;whiteSpace=wrap;html=1;dashed=1;dashPattern=12 12;fillColor=none;" vertex="1" parent="1">
-          <mxGeometry x="370" y="280" width="120" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-5" value="fmilib.h" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
-          <mxGeometry x="395" y="255" width="60" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-6" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="1MKeEKei01TN4UT9uz78-3" target="1MKeEKei01TN4UT9uz78-2">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="530" y="440" as="sourcePoint" />
-            <mxPoint x="530" y="540" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-7" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;entryX=1;entryY=0.75;entryDx=0;entryDy=0;exitX=0;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="1MKeEKei01TN4UT9uz78-3" target="1MKeEKei01TN4UT9uz78-2">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="460" y="540" as="sourcePoint" />
-            <mxPoint x="460" y="440" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-8" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
-          <mxGeometry x="400" y="293" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-9" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator setpoint&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
-          <mxGeometry x="400" y="353" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-10" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator position&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
-          <mxGeometry x="400" y="323" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="1MKeEKei01TN4UT9uz78-11" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="1MKeEKei01TN4UT9uz78-3" target="1MKeEKei01TN4UT9uz78-2">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="493" y="540" as="sourcePoint" />
-            <mxPoint x="493" y="440" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-      </root>
-    </mxGraphModel>
-  </diagram>
-</mxfile>

+ 0 - 143
hil-overview.drawio

@@ -1,143 +0,0 @@
-<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.0.6 Chrome/138.0.7204.100 Electron/37.2.3 Safari/537.36" version="28.0.6">
-  <diagram name="HiL" id="v5OLPukr7oJiwMdLDtEw">
-    <mxGraphModel dx="570" dy="319" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
-      <root>
-        <mxCell id="0" />
-        <mxCell id="1" parent="0" />
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-2" value="FMU&lt;div&gt;(pipe network, &lt;br&gt;pressure pump, &lt;br&gt;valve-actuator,&lt;/div&gt;&lt;div&gt;flow sensor)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="400" y="450" width="100" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-4" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="480" y="350" as="sourcePoint" />
-            <mxPoint x="480" y="450" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-5" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#000000;exitX=0.781;exitY=1.017;exitDx=0;exitDy=0;exitPerimeter=0;endFill=0;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="443.06000000000006" y="351.02" as="sourcePoint" />
-            <mxPoint x="500" y="320" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="443" y="320" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-6" value="" style="rounded=1;whiteSpace=wrap;html=1;dashed=1;dashPattern=12 12;fillColor=none;" parent="1" vertex="1">
-          <mxGeometry x="390" y="370" width="120" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-8" value="PyFMI" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="510" y="385" width="40" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-10" value="" style="rounded=1;whiteSpace=wrap;html=1;dashed=1;dashPattern=12 12;fillColor=none;" parent="1" vertex="1">
-          <mxGeometry x="230" y="370" width="120" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-11" value="Modbus&lt;div&gt;Communication&lt;/div&gt;&lt;div&gt;protocol&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="170" y="385" width="40" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-13" value="CB5&lt;div&gt;(Source code control loop)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="240" y="450" width="100" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-14" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="Tr9sO9ttSDr-DEmgopSH-43" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="260" y="450" as="sourcePoint" />
-            <mxPoint x="260" y="380" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="260" y="300" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-15" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="320" y="350" as="sourcePoint" />
-            <mxPoint x="320" y="450" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-16" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="410" y="450" as="sourcePoint" />
-            <mxPoint x="410" y="350" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-17" value="Modelica Model" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="600" y="480" width="70" height="40" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;curved=1;" parent="1" source="Tr9sO9ttSDr-DEmgopSH-17" target="Tr9sO9ttSDr-DEmgopSH-2" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="400" y="480" as="sourcePoint" />
-            <mxPoint x="450" y="430" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="560" y="470" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="Tr9sO9ttSDr-DEmgopSH-19" target="Tr9sO9ttSDr-DEmgopSH-13" edge="1">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-19" value="FlowSensorBoard / FSB&lt;div&gt;(USB to Rs485, Simulate FSB board)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="580" y="274.5" width="150" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-24" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="420" y="400" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-25" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="505" y="274.5" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-28" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator setpoint&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="380" y="370" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-29" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator position&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="450" y="370" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-30" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="443" y="450" as="sourcePoint" />
-            <mxPoint x="443" y="350" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-31" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" target="Tr9sO9ttSDr-DEmgopSH-19" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="500" y="320" as="sourcePoint" />
-            <mxPoint x="545.17" y="335" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-32" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="480" y="317.5" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-34" value="" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=-180;size=10;" parent="1" vertex="1">
-          <mxGeometry x="410" y="273.5" width="80" height="35.5" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-36" value="UART" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="420" y="276.25" width="60" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-38" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="330" y="276.25" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-39" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator setpoint&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="290" y="370" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-40" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.347;entryY=1.008;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="320" y="349.5" as="sourcePoint" />
-            <mxPoint x="410.4399999999998" y="350.29600000000005" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="320" y="330" />
-              <mxPoint x="410" y="330" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-41" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;flow setpoint&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="230" y="309.75" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-43" value="User /&lt;div&gt;Client system&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="130" y="274.75" width="70" height="50" as="geometry" />
-        </mxCell>
-        <mxCell id="ELujvbtQOhFCPuTLORQn-2" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;dashPattern=8 8;" vertex="1" parent="1">
-          <mxGeometry x="230" y="231.25" width="330" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="ELujvbtQOhFCPuTLORQn-3" value="Raspberry Pi&lt;div&gt;(Orchistrating, python code)&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
-          <mxGeometry x="205" y="201.25" width="380" height="30" as="geometry" />
-        </mxCell>
-      </root>
-    </mxGraphModel>
-  </diagram>
-</mxfile>

+ 0 - 143
sil-overview.drawio

@@ -1,143 +0,0 @@
-<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.0.6 Chrome/138.0.7204.100 Electron/37.2.3 Safari/537.36" version="28.0.6">
-  <diagram name="SiL" id="v5OLPukr7oJiwMdLDtEw">
-    <mxGraphModel dx="679" dy="380" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
-      <root>
-        <mxCell id="0" />
-        <mxCell id="1" parent="0" />
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-37" value="" style="rounded=1;whiteSpace=wrap;html=1;dashed=1;dashPattern=12 12;fillColor=none;" parent="1" vertex="1">
-          <mxGeometry x="230" y="250" width="520" height="99.5" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-2" value="FMU&lt;div&gt;(pipe network, &lt;br&gt;pressure pump, &lt;br&gt;valve-actuator,&lt;/div&gt;&lt;div&gt;flow sensor)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="400" y="450" width="100" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-4" value="" style="endArrow=none;html=1;rounded=0;startArrow=classic;startFill=1;endFill=0;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="480" y="350" as="sourcePoint" />
-            <mxPoint x="480" y="450" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-5" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#fff2cc;strokeColor=#000000;exitX=0.781;exitY=1.017;exitDx=0;exitDy=0;exitPerimeter=0;endFill=0;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="443.06000000000006" y="351.02" as="sourcePoint" />
-            <mxPoint x="500" y="320" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="443" y="320" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-6" value="" style="rounded=1;whiteSpace=wrap;html=1;dashed=1;dashPattern=12 12;fillColor=none;" parent="1" vertex="1">
-          <mxGeometry x="390" y="370" width="120" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-8" value="PyFMI" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="510" y="385" width="40" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-10" value="" style="rounded=1;whiteSpace=wrap;html=1;dashed=1;dashPattern=12 12;fillColor=none;" parent="1" vertex="1">
-          <mxGeometry x="230" y="370" width="120" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-11" value="Modbus&lt;div&gt;Communication&lt;/div&gt;&lt;div&gt;protocol&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="170" y="385" width="40" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-13" value="Executable&lt;div&gt;(controller)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="240" y="450" width="100" height="120" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-14" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="Tr9sO9ttSDr-DEmgopSH-43" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="260" y="450" as="sourcePoint" />
-            <mxPoint x="260" y="380" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="260" y="300" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-15" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="320" y="350" as="sourcePoint" />
-            <mxPoint x="320" y="450" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-16" value="" style="endArrow=none;html=1;rounded=0;endFill=0;startArrow=classic;startFill=1;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="410" y="450" as="sourcePoint" />
-            <mxPoint x="410" y="350" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-17" value="Modelica Model" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="600" y="480" width="70" height="40" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;curved=1;" parent="1" source="Tr9sO9ttSDr-DEmgopSH-17" target="Tr9sO9ttSDr-DEmgopSH-2" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="400" y="480" as="sourcePoint" />
-            <mxPoint x="450" y="430" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="560" y="470" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="Tr9sO9ttSDr-DEmgopSH-19" target="Tr9sO9ttSDr-DEmgopSH-13" edge="1">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-19" value="FlowSensorBoard / FSB&lt;div&gt;(mock Python)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="580" y="274.5" width="150" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-23" value="Orchestrator (Python script)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="405" y="230" width="160" height="20" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-24" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="420" y="400" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-25" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="505" y="274.5" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-28" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator setpoint&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="380" y="370" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-29" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator position&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="450" y="370" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-30" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="443" y="450" as="sourcePoint" />
-            <mxPoint x="443" y="350" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-31" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" target="Tr9sO9ttSDr-DEmgopSH-19" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="500" y="320" as="sourcePoint" />
-            <mxPoint x="545.17" y="335" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-32" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="480" y="317.5" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-34" value="" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=-180;size=10;" parent="1" vertex="1">
-          <mxGeometry x="410" y="273.5" width="80" height="35.5" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-36" value="Mocked UART" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="420" y="276.25" width="60" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-38" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;measured flow&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="330" y="276.25" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-39" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;actuator setpoint&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="290" y="370" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-40" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.347;entryY=1.008;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" target="Tr9sO9ttSDr-DEmgopSH-37" edge="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="320" y="349.5" as="sourcePoint" />
-            <mxPoint x="370" y="299.5" as="targetPoint" />
-            <Array as="points">
-              <mxPoint x="320" y="330" />
-              <mxPoint x="410" y="330" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-41" value="&lt;span style=&quot;font-size: 7px;&quot;&gt;&lt;i&gt;flow setpoint&lt;/i&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="230" y="309.75" width="60" height="15" as="geometry" />
-        </mxCell>
-        <mxCell id="Tr9sO9ttSDr-DEmgopSH-43" value="User /&lt;div&gt;Client system&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="130" y="274.75" width="70" height="50" as="geometry" />
-        </mxCell>
-      </root>
-    </mxGraphModel>
-  </diagram>
-</mxfile>