From 868012d02bb6f5e30961420b5f464f16cd7a2e89 Mon Sep 17 00:00:00 2001 From: Kazeem Oladipupo <67549739+Kaz040@users.noreply.github.com> Date: Fri, 20 Sep 2024 08:44:50 +0200 Subject: [PATCH] add machine generation tool src in the repo for docker deployment --- .../InterfaceSetup.cpython-311.pyc | Bin 16526 -> 0 bytes README.md | 4 +- {BackendFlask => backend-flask}/Dockerfile | 0 .../InterfaceSetup.py | 0 {BackendFlask => backend-flask}/Models.py | 0 .../InterfaceSetup.cpython-311.pyc | Bin 0 -> 14375 bytes .../InterfaceSetup.cpython-312.pyc | Bin .../__pycache__/Models.cpython-311.pyc | Bin 0 -> 8751 bytes .../__pycache__/modelbuilder.cpython-311.pyc | Bin .../requirements.txt | Bin {BackendFlask => backend-flask}/server.py | 23 +- data-source-app/Dockerfile | 22 +- data-source-app/README.md | 3 + data-source-app/app.py | 42 --- .../__pycache__/generatorV2.cpython-311.pyc | Bin 0 -> 10351 bytes .../poc_data_source.cpython-311.pyc | Bin 0 -> 4840 bytes data-source-app/app/generatorV2.py | 252 ++++++++++++++++++ data-source-app/app/poc_data_source.py | 77 ++++++ data-source-app/req.txt | 6 + data-source-app/requirements.txt | 1 - docker-compose.yml | 4 +- react-front-end/package.json | 2 +- react-front-end/src/components/home/Home.jsx | 2 +- 23 files changed, 367 insertions(+), 71 deletions(-) delete mode 100644 BackendFlask/__pycache__/InterfaceSetup.cpython-311.pyc rename {BackendFlask => backend-flask}/Dockerfile (100%) rename {BackendFlask => backend-flask}/InterfaceSetup.py (100%) rename {BackendFlask => backend-flask}/Models.py (100%) create mode 100644 backend-flask/__pycache__/InterfaceSetup.cpython-311.pyc rename {BackendFlask => backend-flask}/__pycache__/InterfaceSetup.cpython-312.pyc (100%) create mode 100644 backend-flask/__pycache__/Models.cpython-311.pyc rename {BackendFlask => backend-flask}/__pycache__/modelbuilder.cpython-311.pyc (100%) rename {BackendFlask => backend-flask}/requirements.txt (100%) rename {BackendFlask => backend-flask}/server.py (81%) create mode 100644 data-source-app/README.md delete mode 100644 data-source-app/app.py create mode 100644 data-source-app/app/__pycache__/generatorV2.cpython-311.pyc create mode 100644 data-source-app/app/__pycache__/poc_data_source.cpython-311.pyc create mode 100644 data-source-app/app/generatorV2.py create mode 100644 data-source-app/app/poc_data_source.py create mode 100644 data-source-app/req.txt delete mode 100644 data-source-app/requirements.txt diff --git a/BackendFlask/__pycache__/InterfaceSetup.cpython-311.pyc b/BackendFlask/__pycache__/InterfaceSetup.cpython-311.pyc deleted file mode 100644 index 5f3a903ac822d2535355e8d961387ba7b38cd81a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16526 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 diff --git a/README.md b/README.md index cd30560..9a6f2ed 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,10 @@ >[!NOTE] This repository is still work in progress and not intended for **production purpose**. It is developed as part of the components for **TP 2.4 PoC**. -### Acronyms -AAS --> Asset Administration # fx-ccm-dataspace-poc-mapping -AAS Mapper is a **python (back-end)** and **react (front-end)** based implementation to integrate shopfloor data into AAS. +Asset Administration Shell(AAS) Mapper is a **python (back-end)** and **react (front-end)** based implementation to integrate shopfloor data into AAS. The react front-end is a simple UI that help facilitate the inputation of endpoints that AAS mapper is interfacing with and also datapoints of the shopfloor asset. diff --git a/BackendFlask/Dockerfile b/backend-flask/Dockerfile similarity index 100% rename from BackendFlask/Dockerfile rename to backend-flask/Dockerfile diff --git a/BackendFlask/InterfaceSetup.py b/backend-flask/InterfaceSetup.py similarity index 100% rename from BackendFlask/InterfaceSetup.py rename to backend-flask/InterfaceSetup.py diff --git a/BackendFlask/Models.py b/backend-flask/Models.py similarity index 100% rename from BackendFlask/Models.py rename to backend-flask/Models.py diff --git a/backend-flask/__pycache__/InterfaceSetup.cpython-311.pyc b/backend-flask/__pycache__/InterfaceSetup.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52297aec3dc687981db7654b29d035bbc02b6e61 GIT binary patch literal 14375 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 Nr6>Qf$8+f&{uc)Ri75a8 literal 0 HcmV?d00001 diff --git a/BackendFlask/__pycache__/InterfaceSetup.cpython-312.pyc b/backend-flask/__pycache__/InterfaceSetup.cpython-312.pyc similarity index 100% rename from BackendFlask/__pycache__/InterfaceSetup.cpython-312.pyc rename to backend-flask/__pycache__/InterfaceSetup.cpython-312.pyc diff --git a/backend-flask/__pycache__/Models.cpython-311.pyc b/backend-flask/__pycache__/Models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecc701b77e9f4db6aa1c437db3e8105e46e029e4 GIT binary patch literal 8751 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 XJP)0n8skCs`Sd?*{J&LZnTr1bGLn_Z literal 0 HcmV?d00001 diff --git a/BackendFlask/__pycache__/modelbuilder.cpython-311.pyc b/backend-flask/__pycache__/modelbuilder.cpython-311.pyc similarity index 100% rename from BackendFlask/__pycache__/modelbuilder.cpython-311.pyc rename to backend-flask/__pycache__/modelbuilder.cpython-311.pyc diff --git a/BackendFlask/requirements.txt b/backend-flask/requirements.txt similarity index 100% rename from BackendFlask/requirements.txt rename to backend-flask/requirements.txt diff --git a/BackendFlask/server.py b/backend-flask/server.py similarity index 81% rename from BackendFlask/server.py rename to backend-flask/server.py index 9b3a160..a2f6ee8 100644 --- a/BackendFlask/server.py +++ b/backend-flask/server.py @@ -8,12 +8,13 @@ # current module (__name__) as argument. app = Flask(__name__) -#Interface object +# Interface object aasmapper = InterfaceSetup.AasMapper() ui_origin_localhost = "http://localhost:3000" ui_origin_docker = "http://client:3000" + # The route() function of the Flask class is a decorator, # which tells the application which URL should call # the associated function. @@ -23,16 +24,17 @@ def hello_world(): return "Hello World" -@app.route("/adddatapoint/", methods=["POST"]) -@cross_origin(origins=[ui_origin_localhost]) -#/add-datapoint is bound with addDatapoint() function to add new datapoint +@app.route("/adddatapoint", methods=["POST"]) +@cross_origin(origins=[ui_origin_docker]) +# /add-datapoint is bound with addDatapoint() function to add new datapoint def addDatapoint(): data = json.loads(request.data) assets = aasmapper.add_datapoint(data) - return {"assets":assets} + return {"assets": assets} + @app.route("/getdatapoints", methods=["GET"]) -@cross_origin(origins=[ui_origin_localhost]) +@cross_origin(origins=[ui_origin_docker]) # ‘/’ URL is bound with getDatapoint() function. def getDatapoints(): @@ -41,21 +43,20 @@ def getDatapoints(): return {"assets": datapoints, "endpoints": endpoints} -@app.route("/readdatapoint/", methods=["GET"]) -@cross_origin(origins=[ui_origin_localhost]) +@app.route("/readdatapoint", methods=["GET"]) +@cross_origin(origins=[ui_origin_docker]) # ‘/’ URL is bound with readDatapoint() function. def readDatapoint(): id = request.args.get("id") assetId = request.args.get("assetId") - + payload = aasmapper.read_datapoint_from_source(assetId=assetId, id=id) - return payload @app.route("/configinfo", methods=["POST"]) -@cross_origin(origins=[ui_origin_localhost]) +@cross_origin(origins=[ui_origin_docker]) # ‘/’ URL is bound with submitConfigInfo() function. def submitConfigInfo(): data = json.loads(request.data) diff --git a/data-source-app/Dockerfile b/data-source-app/Dockerfile index f8367ff..ea046ae 100644 --- a/data-source-app/Dockerfile +++ b/data-source-app/Dockerfile @@ -1,13 +1,15 @@ -FROM python:3 +# simple BASE-Image +FROM python:3.10.11 -WORKDIR /assetapp +# working directory for te container +WORKDIR /fx_data_source -ENV FLASK_APP=app.py +# Install requirements +COPY ./req.txt /fx_data_source/req.txt +RUN pip install --no-cache-dir --upgrade -r /fx_data_source/req.txt -COPY . . - -RUN pip install -r requirements.txt - -EXPOSE 8500 - -CMD ["python", "app.py"] \ No newline at end of file +# Run "API-APP" +COPY ./app /fx_data_source/app +CMD ["uvicorn", "app.poc_data_source:app", "--host", "0.0.0.0", "--port", "80"] +# NOTE: we might want to change the port-cfg depending on the deployment +# on the individual k8s-clusters (Arno's cluster, Catena cluster, SFH ...) \ No newline at end of file diff --git a/data-source-app/README.md b/data-source-app/README.md new file mode 100644 index 0000000..7278438 --- /dev/null +++ b/data-source-app/README.md @@ -0,0 +1,3 @@ +# fx-ccm-dataspace-poc-business-int-logic + +docker pull fraunhoferiosb/fx-ccm-dataspace-poc-business-int-logic:latest diff --git a/data-source-app/app.py b/data-source-app/app.py deleted file mode 100644 index 76d129b..0000000 --- a/data-source-app/app.py +++ /dev/null @@ -1,42 +0,0 @@ -# Importing flask module in the project is mandatory -# An object of Flask class is our WSGI application. -from flask import Flask -import random - - -# Flask constructor takes the name of -# current module (__name__) as argument. -app = Flask(__name__) - - - - -@app.route("/counter/properties/count1", methods=["GET"]) -# ‘/’ URL is bound with countState() function. -def countState1(): - payload = str(round((random.random() * 100), 2)) - return payload - -@app.route("/counter/properties/count2", methods=["GET"]) -# ‘/’ URL is bound with countState2() function. -def countState2(): - payload = str(round((random.random() * 100), 2)) - return payload - - -@app.route("/counter/properties/objectPayload", methods=["GET"]) -# ‘/’ URL is bound with hello_world() function. -def objectPayload(): - payload = { - "foo": round((random.random() * 100), 2), - "bar": round((random.random() * 100), 2), - } - return payload - - -# main driver function -if __name__ == "__main__": - - # run() method of Flask class runs the application - # on the local development server. - app.run(port=8500, debug=True, host='0.0.0.0') diff --git a/data-source-app/app/__pycache__/generatorV2.cpython-311.pyc b/data-source-app/app/__pycache__/generatorV2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c01b524f7a1f8990c4333894be55ef41c3df02a GIT binary patch literal 10351 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 JRt4%D{x1q>kqiI; literal 0 HcmV?d00001 diff --git a/data-source-app/app/__pycache__/poc_data_source.cpython-311.pyc b/data-source-app/app/__pycache__/poc_data_source.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0244373e7d82f4594e18d31e8559b7b0092f64a GIT binary patch literal 4840 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 BsD1zd literal 0 HcmV?d00001 diff --git a/data-source-app/app/generatorV2.py b/data-source-app/app/generatorV2.py new file mode 100644 index 0000000..045c9ca --- /dev/null +++ b/data-source-app/app/generatorV2.py @@ -0,0 +1,252 @@ +import pandas as pd +import numpy as np + +# for the time stamps +from datetime import datetime + +# -------------------------------------------------------------- +# ToDos: add 3rd Sensor Dataset from a third partner (optional) + +# --- define constants --- +fs = 8000 # 8kHz +T_ab = 1/fs + + +recording_time = 10 # in seconds [s], given +len_signal = int(recording_time * fs) # signal length +time_ticks = np.arange(len_signal)*T_ab # normal recording + +# for the DQ-Signals (also "Sensors") +rot_amp = 1000 +s1 = 0.37 # in seconds [s]: accel starts +s2 = 6.7 # in seconds [s]: decel starts +s3 = 7.7 # in seconds [s]: second decel starts + +switch_duration = 0.15 # in seconds [s] +n_switch_samples = int(switch_duration/T_ab) + +# general: +error_signal_probability = 1/3 +peA = 1/3 # probability that component A is broken, Partner A +peB = 1/3 # probability that component B is broken, Partner B +peCB = 1/3 # probability that something is broken with the integration + +# - helper functions - +# create ramp: +def sigmoid(n_points): + return 1/(1 + np.exp(-np.linspace(-10, 10, n_points))) +# NOTE: other "ramp"-ups possible + +# create "step": +def add_step(signal_, t_step, fs, amp, n_switch_samples=n_switch_samples): + signal_[int(t_step*fs):int(t_step*fs)+n_switch_samples] += amp * sigmoid(n_switch_samples) # just add the ramp + signal_[int(t_step*fs)+n_switch_samples:] += amp # continue with reached value till end + +# add some local variance +def add_var(signal_, t_start, fs, amp, n_switch_samples=n_switch_samples): + signal_[int(t_start*fs):int(t_start*fs)+n_switch_samples] *= amp # simple variance increase + +# add a "jump?" in Sensor B instead +def add_jump(signal_, t_start, fs, amp, n_switch_samples=n_switch_samples): + signal_[int(t_start*fs):int(t_start*fs)+n_switch_samples] += amp*np.sin(np.linspace(0, np.pi, n_switch_samples)) + + +# --- Signal Generators --- + +# generate DQ Signal: +def generate_DQ(s2_overwrite=None): + # create placeholder for the ramps: + motion_c_signal = np.zeros(len_signal) + + # add all "steps" + add_step(motion_c_signal, s1, fs, rot_amp) + if s2_overwrite is not None: + add_step(motion_c_signal, s2_overwrite, fs, -rot_amp) + add_step(motion_c_signal, s2_overwrite+1, fs, -rot_amp) + else: + add_step(motion_c_signal, s2, fs, -rot_amp) + add_step(motion_c_signal, s3, fs, -rot_amp) + + return motion_c_signal + + + +# generate Sensor Signal A: +def generate_Sensor_A(ac=None, f_idx=None, s2_overwrite=None): + # sensor specific parameters + freqs = np.array([500, 700, 1000]) + amp_means = np.array([0.008, 0.006, 0.0045]) + amp_var_percent = 0.14 # how much % around the mean the amplitude is allowed to vary + # could be a parameter + + # generate the harmonic components: + signal_gen = np.zeros(len_signal) # generated signal, placeholder + for idx_f, f_a in enumerate(zip(freqs, amp_means)): + f = f_a[0] + a_mean = f_a[1] + + # sample amplitude + amp_variation = a_mean * amp_var_percent + a = a_mean + np.random.uniform(low=-amp_variation, high=amp_variation) + + # overwrite this amplitude? + if ac is not None and f_idx is not None: + if f_idx == idx_f: + a = ac + # NOTE: extend this to raise an ERROR if only one is given + + signal_gen = signal_gen + a*np.sin(2*np.pi*f*time_ticks) + # break + + # add some gaussian noise: + noise_parameter = 0.3 # percentage of the half signal difference + noise_amp = (np.max(signal_gen) - np.min(signal_gen))/2*noise_parameter + signal_gen = signal_gen + np.random.randn(len_signal)*noise_amp + + + add_var(signal_gen, s1, fs, 8) + + if s2_overwrite is not None: + add_var(signal_gen, s2_overwrite, fs, np.random.choice([6, 7, 8])) + add_var(signal_gen, s2_overwrite+1, fs, 8) + else: + add_var(signal_gen, s2, fs, np.random.choice([6, 7, 8])) + add_var(signal_gen, s3, fs, 8) + + return signal_gen + + + +def generate_Sensor_B(ac=None, f_idx=None, s2_overwrite=None): + # note: since the s2 overwrite isn't implemented here it results in a break deliberate break of the causal chain + # it's not clear if we want this here or not + + # sensor specific parameters + freqs = np.array([500, 700, 1000, 2500]) + amp_means = np.array([0.004, 0.008, 0.006, 0.0045]) + amp_var_percent = 0.14 # how much % around the mean the amplitude is allowed to vary + # could be a parameter + + # generate the harmonic components: + signal_gen = np.zeros(len_signal) # generated signal, placeholder + for idx_f, f_a in enumerate(zip(freqs, amp_means)): + f = f_a[0] + a_mean = f_a[1] + + # sample amplitude + amp_variation = a_mean * amp_var_percent + a = a_mean + np.random.uniform(low=-amp_variation, high=amp_variation) + + # overwrite this amplitude? + if ac is not None and f_idx is not None: + if f_idx == idx_f: + a = ac + # NOTE: extend this to raise an ERROR if only one is given + + signal_gen = signal_gen + a*np.sin(2*np.pi*f*time_ticks) + # break + + # add some gaussian noise: + noise_parameter = 0.3 # percentage of the half signal difference + noise_amp = (np.max(signal_gen) - np.min(signal_gen))/2*noise_parameter + signal_gen = signal_gen + np.random.randn(len_signal)*noise_amp + + + + add_jump(signal_gen, s1, fs, -1.3, n_switch_samples=n_switch_samples//2) + + if s2_overwrite is not None: + add_jump(signal_gen, s2_overwrite, fs, 1.3, n_switch_samples=n_switch_samples//2) + add_jump(signal_gen, s2_overwrite+1, fs, 1.3, n_switch_samples=n_switch_samples//2) + else: + add_jump(signal_gen, s2, fs, 1.3, n_switch_samples=n_switch_samples//2) + add_jump(signal_gen, s3, fs, 1.3, n_switch_samples=n_switch_samples//2) + + return signal_gen + + + +# --- create dataframe --- +def create_df(signal_sensor1, signal_sensor2, motion_c_signal): + # create new file: + df_gen = pd.DataFrame() # columns=['Time', 'Sensor1', 'Sensor2', 'DQ1', 'DQ2'] + # note: DQ are also "sensors" + + + # meta-data: + units = ['s'] + ['g']*2 + ['rpm']*2 + conv_factors = [1] + [0.00390625]*2 + [0.001]*2 + + + # add the individual data: + df_gen['Time'] = datetime.now().timestamp() + time_ticks # time starts 'now' and lasts 10s + df_gen['Sensor1'] = signal_sensor1 #* (1/conv_factors[0]) + df_gen['Sensor2'] = signal_sensor2 #* (1/conv_factors[1]) + df_gen['DQ1'] = motion_c_signal #* (1/conv_factors[2]) + df_gen['DQ2'] = -motion_c_signal #* (1/conv_factors[3]) + + # add meta-data: + df_gen_meta = pd.DataFrame(columns=df_gen.columns) + df_gen_meta.loc[df_gen_meta.shape[0], :] = units + # df_gen_meta.loc[df_gen_meta.shape[0], :] = conv_factors + + # merge: + df_gen = pd.concat([df_gen_meta, df_gen], ignore_index=True) + + + ds_name = "FullDS_" + str(datetime.fromtimestamp(df_gen['Time'].values[2])).replace(':', '-').replace(' ', '-').replace('.', '-') + return ds_name, df_gen + + + +def generate_error_type(error_type=None): + # create normal signal + motion_c_signal = generate_DQ() + signal_sensor1 = generate_Sensor_A() + signal_sensor2 = generate_Sensor_B() + + if error_type == 0: # Component A + signal_sensor1 = generate_Sensor_A(ac=0.013, f_idx=0, s2_overwrite=None) + signal_sensor2 = generate_Sensor_B(ac=0.008, f_idx=0, s2_overwrite=None) + if error_type == 1: # Component B + signal_sensor1 = generate_Sensor_A(ac=0.001, f_idx=1, s2_overwrite=None) + signal_sensor2 = generate_Sensor_B(ac=0.001, f_idx=1, s2_overwrite=None) + if error_type == 2: # Integration + # overwrite motion signal + motion_c_signal = generate_DQ(s2_overwrite=4.2) + # else: # return normal signal: + + return signal_sensor1, signal_sensor2, motion_c_signal + + + + +def generate_df(ac=None, f_idx=None, s2_overwrite=None, c_break=None, error_type=None, store_file=False): + # check if a specific dataset is to be generated: + if ac is not None or f_idx is not None or s2_overwrite is not None or c_break is not None: + motion_c_signal = generate_DQ(s2_overwrite=s2_overwrite) + if c_break: + signal_sensor1 = generate_Sensor_A(ac=ac, f_idx=f_idx, s2_overwrite=None) + signal_sensor2 = generate_Sensor_B(ac=ac, f_idx=f_idx, s2_overwrite=None) + else: + signal_sensor1 = generate_Sensor_A(ac=ac, f_idx=f_idx, s2_overwrite=s2_overwrite) + signal_sensor2 = generate_Sensor_B(ac=ac, f_idx=f_idx, s2_overwrite=s2_overwrite) + else: + # decide if a normal or anomalous dataset is to be generated + if error_type is not None: + signal_sensor1, signal_sensor2, motion_c_signal = generate_error_type(error_type) + else: + if np.random.uniform() < error_signal_probability: + # choose type of error: + error_type = int(np.random.choice([0,1,2], p=[peA, peB, peCB])) + signal_sensor1, signal_sensor2, motion_c_signal = generate_error_type(error_type) + + + + # combine signals to dataframe: + ds_name, df_gen = create_df(signal_sensor1, signal_sensor2, motion_c_signal) + + if store_file: + df_gen.to_csv(ds_name + ".csv") + + return ds_name, df_gen, error_type diff --git a/data-source-app/app/poc_data_source.py b/data-source-app/app/poc_data_source.py new file mode 100644 index 0000000..0447b59 --- /dev/null +++ b/data-source-app/app/poc_data_source.py @@ -0,0 +1,77 @@ +from typing import Union, Annotated +from pydantic import BaseModel +from fastapi import FastAPI, Query, Response + +# data generation functions, aka 'logic' +from app.generatorV2 import generate_DQ, generate_Sensor_A, generate_Sensor_B, create_df, generate_df + +app = FastAPI() + + +class myItem(BaseModel): + name: str + rnd: int + +@app.get("/fx/") +def read_root(): + return {"Data Generator for the TP2.04 & TP4.1 POC"} + +# quick check of the Query-validation +@app.get("/fx/gen/querydemo") +async def gen_demo(ac: Annotated[float | None, Query(ge=0., le=2)] = None, + f_idx: Annotated[int | None, Query(ge=0, le=4)] = None, + s2: Annotated[float | None, Query(ge=4.2, le=8.5)] = None, + error_t: Annotated[int | None, Query(ge=-1, le=3)] = None): + + """ + Parameters: + ac - Optional, value with with to overwrite the amplitude for frequency at f_idx + f_idx - Optional, identifier for the frequency which will be overwritten + note: if only ac or f_idx are given, it will be the same as having both of them set to None. + s2 - Optional, shift a change in one signal + error_t - Optional, 0,1,2 for predefined Error-Types + """ + # just return the query parameters + return {"new_amp": ac, "f_idx": f_idx, "signal_switch_2": s2, "error_type": error_t} + + + +@app.get("/fx/gen/units") +def get_gen_units(): + """ Access the units of the dataset directly. """ + return {"Time": "s", "Sensor1": "g", "Sensor2": "g", "DQ1": "rpm", "DQ2": "rpm"} + + + + +# generate measurement and receive it as a json: +@app.get("/fx/gen/json") +async def gen_signal_json(ac: Annotated[float | None, Query(ge=0., le=2)] = None, + f_idx: Annotated[int | None, Query(ge=0, le=4)] = None, + s2: Annotated[float | None, Query(ge=4.2, le=8.5)] = None, + error_t: Annotated[int | None, Query(ge=-1, le=3)] = None): + + # generate all the data: + ds_name, df_gen, error_type = generate_df(ac=ac, f_idx=f_idx, s2_overwrite=s2, error_type=error_t) + return {"ds_name": ds_name, "new_amp": ac, "f_idx": f_idx, "signal_switch_2": s2, "error_type": error_type, "data": df_gen} + + +# serve the generated dtaframe as a file +@app.get("/fx/gen/file") +async def gen_signal_file(ac: Annotated[float | None, Query(ge=0., le=2)] = None, + f_idx: Annotated[int | None, Query(ge=0, le=4)] = None, + s2: Annotated[float | None, Query(ge=4.2, le=8.5)] = None, + error_t: Annotated[int | None, Query(ge=-1, le=3)] = None): + + # generate all the data: + ds_name, df_gen, error_type = generate_df(ac=ac, f_idx=f_idx, s2_overwrite=s2, error_type=error_t) + + # store + df_gen.to_csv(ds_name + ".csv") + + # load: + with open(ds_name + ".csv", "rb") as file: + df_bin = file.read() + + # return file as body: + return Response(content=df_bin, media_type="application/octet-stream") \ No newline at end of file diff --git a/data-source-app/req.txt b/data-source-app/req.txt new file mode 100644 index 0000000..b2bc425 --- /dev/null +++ b/data-source-app/req.txt @@ -0,0 +1,6 @@ +fastapi==0.112.1 +numpy==2.1.0 +pandas==2.2.2 +pydantic==2.8.2 +uvicorn==0.30.6 +scipy==1.14.0 \ No newline at end of file diff --git a/data-source-app/requirements.txt b/data-source-app/requirements.txt deleted file mode 100644 index 100caba..0000000 --- a/data-source-app/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -Flask==3.0.2 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 34e8f1c..b175836 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,11 +8,11 @@ services: - ./data-source-app:/assetapp server: - build: ./BackendFlask + build: ./backend-flask ports: - "5000:5000" volumes: - - ./BackendFlask:/serverapp + - ./backend-flask:/serverapp environment: - FLASK_ENV=development depends_on: diff --git a/react-front-end/package.json b/react-front-end/package.json index 6a09c3c..ff4c4cd 100644 --- a/react-front-end/package.json +++ b/react-front-end/package.json @@ -2,7 +2,7 @@ "name": "react-front-end", "version": "0.1.0", "private": true, - "proxy": "http://localhost:5000", + "proxy": "http://server:5000", "dependencies": { "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", diff --git a/react-front-end/src/components/home/Home.jsx b/react-front-end/src/components/home/Home.jsx index 8d3e203..3d35749 100644 --- a/react-front-end/src/components/home/Home.jsx +++ b/react-front-end/src/components/home/Home.jsx @@ -81,7 +81,7 @@ const Home = () => { async function readDatapoint(id, assetId) { setdatapointId(id) setAssetId(assetId) - const responseData = await fetch('/readdatapoint/?id='+id+'&assetId='+assetId); + const responseData = await fetch('/readdatapoint?id='+id+'&assetId='+assetId); for(let i = 0; i < assetDatapoints.length; i++){ if(assetDatapoints[i]['assetId'] === assetId){ let datapoints = assetDatapoints[i]['datapoints']