From ce642c1d5d3f0253b34b27200d237e82e3cf397f Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 25 Mar 2025 13:07:02 +0100 Subject: [PATCH 01/76] =?UTF-8?q?F=C3=BCge=20experimentelle=20=C3=84nderun?= =?UTF-8?q?gen=20f=C3=BCr=20Registry=20und=20Discovery=20hinzu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Discovery Server/Dockerfile | 45 +++ Discovery Server/README.md | 97 +++++ Discovery Server/app/main.py | 46 +++ Discovery Server/compose.yml | 7 + Discovery Server/entrypoint.sh | 71 ++++ Discovery Server/stop-supervisor.sh | 8 + Discovery Server/supervisord.ini | 27 ++ Discovery Server/uwsgi.ini | 9 + Registry Server/Dockerfile | 45 +++ Registry Server/README.md | 97 +++++ Registry Server/app/main.py | 46 +++ Registry Server/compose.yml | 7 + Registry Server/entrypoint.sh | 71 ++++ Registry Server/stop-supervisor.sh | 8 + Registry Server/supervisord.ini | 27 ++ Registry Server/uwsgi.ini | 9 + sdk/basyx/aas/adapter/http.py | 46 ++- .../aas/adapter/json/json_deserialization.py | 147 ++++++- .../aas/adapter/json/json_serialization.py | 114 ++++++ sdk/basyx/aas/adapter/registry.py | 367 ++++++++++++++++++ sdk/basyx/aas/adapter/resolver.py | 253 ++++++++++++ .../aas/adapter/xml/xml_deserialization.py | 58 +++ sdk/basyx/aas/model/__init__.py | 6 +- sdk/basyx/aas/model/aas.py | 11 + sdk/basyx/aas/model/aas_descriptor.py | 67 ++++ sdk/basyx/aas/model/descriptor.py | 133 +++++++ sdk/basyx/aas/model/submodel_descriptor.py | 29 ++ test.py | 67 ++++ 28 files changed, 1913 insertions(+), 5 deletions(-) create mode 100644 Discovery Server/Dockerfile create mode 100644 Discovery Server/README.md create mode 100644 Discovery Server/app/main.py create mode 100644 Discovery Server/compose.yml create mode 100644 Discovery Server/entrypoint.sh create mode 100644 Discovery Server/stop-supervisor.sh create mode 100644 Discovery Server/supervisord.ini create mode 100644 Discovery Server/uwsgi.ini create mode 100644 Registry Server/Dockerfile create mode 100644 Registry Server/README.md create mode 100644 Registry Server/app/main.py create mode 100644 Registry Server/compose.yml create mode 100644 Registry Server/entrypoint.sh create mode 100644 Registry Server/stop-supervisor.sh create mode 100644 Registry Server/supervisord.ini create mode 100644 Registry Server/uwsgi.ini create mode 100644 sdk/basyx/aas/adapter/registry.py create mode 100644 sdk/basyx/aas/adapter/resolver.py create mode 100644 sdk/basyx/aas/model/aas_descriptor.py create mode 100644 sdk/basyx/aas/model/descriptor.py create mode 100644 sdk/basyx/aas/model/submodel_descriptor.py create mode 100644 test.py diff --git a/Discovery Server/Dockerfile b/Discovery Server/Dockerfile new file mode 100644 index 000000000..6dc3c4cac --- /dev/null +++ b/Discovery Server/Dockerfile @@ -0,0 +1,45 @@ +FROM python:3.11-alpine + +LABEL org.label-schema.name="Eclipse BaSyx" \ + org.label-schema.version="1.0" \ + org.label-schema.description="Docker image for the basyx-python-sdk server application" \ + org.label-schema.maintainer="Eclipse BaSyx" + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# If we have more dependencies for the server it would make sense +# to refactor uswgi to the pyproject.toml +RUN apk update && \ + apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ + pip install uwsgi && \ + pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ + apk del git bash + + +COPY uwsgi.ini /etc/uwsgi/ +COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +RUN chmod +x /etc/supervisor/stop-supervisor.sh + +# Makes it possible to use a different configuration +ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini +# object stores aren't thread-safe yet +# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 +ENV UWSGI_CHEAPER=0 +ENV UWSGI_PROCESSES=1 +ENV NGINX_MAX_UPLOAD=1M +ENV NGINX_WORKER_PROCESSES=1 +ENV LISTEN_PORT=80 +ENV CLIENT_BODY_BUFFER_SIZE=1M + +# Copy the entrypoint that will generate Nginx additional configs +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +COPY ./app /app +WORKDIR /app + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Discovery Server/README.md b/Discovery Server/README.md new file mode 100644 index 000000000..339226c53 --- /dev/null +++ b/Discovery Server/README.md @@ -0,0 +1,97 @@ +# Eclipse BaSyx Python SDK - HTTP Server + +This package contains a Dockerfile to spin up an exemplary HTTP/REST server following the [Specification of the AAS Part 2 API][6] with ease. +The server currently implements the following interfaces: + +- [Asset Administration Shell Repository Service][4] +- [Submodel Repository Service][5] + +It uses the [HTTP API][1] and the [AASX][7], [JSON][8], and [XML][9] Adapters of the [BaSyx Python SDK][3], to serve regarding files from a given directory. +The files are only read, changes won't persist. + +Alternatively, the container can also be told to use the [Local-File Backend][2] instead, which stores AAS and Submodels as individual JSON files and allows for persistent changes (except supplementary files, i.e. files referenced by `File` submodel elements). +See [below](#options) on how to configure this. + +## Building +The container image can be built via: +``` +$ docker buildx build -t basyx-python-sdk-http-server . +``` + +## Running + +### Storage +The container needs to be provided with the directory `/storage` to store AAS and Submodel files: AASX, JSON, XML or JSON files of Local-File Backend. + +This directory can be mapped via the `-v` option from another image or a local directory. +To map the directory `storage` inside the container, `-v ./storage:/storage` can be used. +The directory `storage` will be created in the current working directory, if it doesn't already exist. + +### Port +The HTTP server inside the container listens on port 80 by default. +To expose it on the host on port 8080, use the option `-p 8080:80` when running it. + +### Options +The container can be configured via environment variables: +- `API_BASE_PATH` determines the base path under which all other API paths are made available. + Default: `/api/v3.0` +- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: + - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve AASX, JSON, XML files from the storage directory. + The files are not modified, all changes done via the API are only stored in memory. + - When instead set to `LOCAL_FILE`, the server makes use of the [LocalFileBackend][2], where AAS and Submodels are persistently stored as JSON files. + Supplementary files, i.e. files referenced by `File` submodel elements, are not stored in this case. +- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. + +### Running Examples + +Putting it all together, the container can be started via the following command: +``` +$ docker run -p 8080:80 -v ./storage:/storage basyx-python-sdk-http-server +``` + +Since Windows uses backslashes instead of forward slashes in paths, you'll have to adjust the path to the storage directory there: +``` +> docker run -p 8080:80 -v .\storage:/storage basyx-python-sdk-http-server +``` + +Per default, the server will use the `LOCAL_FILE_READ_ONLY` storage type and serve the API under `/api/v3.0` and read files from `/storage`. If you want to change this, you can do so like this: +``` +$ docker run -p 8080:80 -v ./storage2:/storage2 -e API_BASE_PATH=/api/v3.1 -e STORAGE_TYPE=LOCAL_FILE_BACKEND -e STORAGE_PATH=/storage2 basyx-python-sdk-http-server +``` + +## Building and running the image with docker-compose + +The container image can also be built and run via: +``` +$ docker compose up +``` + +This is the exemplary `docker-compose` file for the server: +````yaml +services: + app: + build: . + ports: + - "8080:80" + volumes: + - ./storage:/storage + +```` + +Here files are read from `/storage` and the server can be accessed at http://localhost:8080/api/v3.0/ from your host system. +To get a different setup this compose.yaml file can be adapted and expanded. + +## Acknowledgments + +This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. + +[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 +[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html +[3]: https://github.com/eclipse-basyx/basyx-python-sdk +[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 +[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 +[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces +[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx +[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html +[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html +[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/Discovery Server/app/main.py b/Discovery Server/app/main.py new file mode 100644 index 000000000..f3eed03ec --- /dev/null +++ b/Discovery Server/app/main.py @@ -0,0 +1,46 @@ +import os +import pathlib +import sys + +from basyx.aas import model, adapter +from basyx.aas.adapter import aasx + +from basyx.aas.backend.local_file import LocalFileObjectStore +from basyx.aas.adapter.registry import RegistryAPI + +storage_path = os.getenv("STORAGE_PATH", "/storage") +storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") +base_path = os.getenv("API_BASE_PATH") + +wsgi_optparams = {} + +if base_path is not None: + wsgi_optparams["base_path"] = base_path + +if storage_type == "LOCAL_FILE_BACKEND": + application = RegistryAPI(LocalFileObjectStore(storage_path), aasx.DictSupplementaryFileContainer(), **wsgi_optparams) + +elif storage_type in "LOCAL_FILE_READ_ONLY": + object_store: model.DictObjectStore = model.DictObjectStore() + file_store: aasx.DictSupplementaryFileContainer = aasx.DictSupplementaryFileContainer() + + for file in pathlib.Path(storage_path).iterdir(): + if not file.is_file(): + continue + print(f"Loading {file}") + + if file.suffix.lower() == ".json": + with open(file) as f: + adapter.json.read_aas_json_file_into(object_store, f) + elif file.suffix.lower() == ".xml": + with open(file) as f: + adapter.xml.read_aas_xml_file_into(object_store, file) + elif file.suffix.lower() == ".aasx": + with aasx.AASXReader(file) as reader: + reader.read_into(object_store=object_store, file_store=file_store) + + application = RegistryAPI(object_store, file_store, **wsgi_optparams) + +else: + print(f"STORAGE_TYPE must be either LOCAL_FILE or LOCAL_FILE_READ_ONLY! Current value: {storage_type}", + file=sys.stderr) diff --git a/Discovery Server/compose.yml b/Discovery Server/compose.yml new file mode 100644 index 000000000..90840a09b --- /dev/null +++ b/Discovery Server/compose.yml @@ -0,0 +1,7 @@ +services: + app: + build: . + ports: + - "8084:80" + volumes: + - ./storage:/storage diff --git a/Discovery Server/entrypoint.sh b/Discovery Server/entrypoint.sh new file mode 100644 index 000000000..722394409 --- /dev/null +++ b/Discovery Server/entrypoint.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env sh +set -e + +# Get the maximum upload file size for Nginx, default to 0: unlimited +USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} + +# Get the number of workers for Nginx, default to 1 +USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} + +# Set the max number of connections per worker for Nginx, if requested +# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below +NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} + +# Get the listen port for Nginx, default to 80 +USE_LISTEN_PORT=${LISTEN_PORT:-80} + +# Get the client_body_buffer_size for Nginx, default to 1M +USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} + +# Create the conf.d directory if it doesn't exist +if [ ! -d /etc/nginx/conf.d ]; then + mkdir -p /etc/nginx/conf.d +fi + +if [ -f /app/nginx.conf ]; then + cp /app/nginx.conf /etc/nginx/nginx.conf +else + content='user nginx;\n' + # Set the number of worker processes in Nginx + content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" + content=$content'error_log /var/log/nginx/error.log warn;\n' + content=$content'pid /var/run/nginx.pid;\n' + content=$content'events {\n' + content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" + content=$content'}\n' + content=$content'http {\n' + content=$content' include /etc/nginx/mime.types;\n' + content=$content' default_type application/octet-stream;\n' + content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" + content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" + content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" + content=$content' access_log /var/log/nginx/access.log main;\n' + content=$content' sendfile on;\n' + content=$content' keepalive_timeout 65;\n' + content=$content' include /etc/nginx/conf.d/*.conf;\n' + content=$content'}\n' + content=$content'daemon off;\n' + # Set the max number of open file descriptors for Nginx workers, if requested + if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then + content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" + fi + # Save generated /etc/nginx/nginx.conf + printf "$content" > /etc/nginx/nginx.conf + + content_server='server {\n' + content_server=$content_server" listen ${USE_LISTEN_PORT};\n" + content_server=$content_server' location / {\n' + content_server=$content_server' include uwsgi_params;\n' + content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' + content_server=$content_server' }\n' + content_server=$content_server'}\n' + # Save generated server /etc/nginx/conf.d/nginx.conf + printf "$content_server" > /etc/nginx/conf.d/nginx.conf + + # # Generate additional configuration + printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf + printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf + printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf +fi + +exec "$@" diff --git a/Discovery Server/stop-supervisor.sh b/Discovery Server/stop-supervisor.sh new file mode 100644 index 000000000..9a953c94b --- /dev/null +++ b/Discovery Server/stop-supervisor.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +printf "READY\n" + +while read line; do + echo "Processing Event: $line" >&2 + kill $PPID +done < /dev/stdin diff --git a/Discovery Server/supervisord.ini b/Discovery Server/supervisord.ini new file mode 100644 index 000000000..d73d98014 --- /dev/null +++ b/Discovery Server/supervisord.ini @@ -0,0 +1,27 @@ +[supervisord] +nodaemon=true + +[program:uwsgi] +command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[program:nginx] +command=/usr/sbin/nginx +stdout_logfile=/var/log/nginx.out.log +stdout_logfile_maxbytes=0 +stderr_logfile=/var/log/nginx.err.log +stderr_logfile_maxbytes=0 +stopsignal=QUIT +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[eventlistener:quit_on_failure] +events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL +command=/etc/supervisor/stop-supervisor.sh diff --git a/Discovery Server/uwsgi.ini b/Discovery Server/uwsgi.ini new file mode 100644 index 000000000..9c54ae1cc --- /dev/null +++ b/Discovery Server/uwsgi.ini @@ -0,0 +1,9 @@ +[uwsgi] +wsgi-file = /app/main.py +socket = /tmp/uwsgi.sock +chown-socket = nginx:nginx +chmod-socket = 664 +hook-master-start = unix_signal:15 gracefully_kill_them_all +need-app = true +die-on-term = true +show-config = false diff --git a/Registry Server/Dockerfile b/Registry Server/Dockerfile new file mode 100644 index 000000000..6dc3c4cac --- /dev/null +++ b/Registry Server/Dockerfile @@ -0,0 +1,45 @@ +FROM python:3.11-alpine + +LABEL org.label-schema.name="Eclipse BaSyx" \ + org.label-schema.version="1.0" \ + org.label-schema.description="Docker image for the basyx-python-sdk server application" \ + org.label-schema.maintainer="Eclipse BaSyx" + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# If we have more dependencies for the server it would make sense +# to refactor uswgi to the pyproject.toml +RUN apk update && \ + apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ + pip install uwsgi && \ + pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ + apk del git bash + + +COPY uwsgi.ini /etc/uwsgi/ +COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +RUN chmod +x /etc/supervisor/stop-supervisor.sh + +# Makes it possible to use a different configuration +ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini +# object stores aren't thread-safe yet +# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 +ENV UWSGI_CHEAPER=0 +ENV UWSGI_PROCESSES=1 +ENV NGINX_MAX_UPLOAD=1M +ENV NGINX_WORKER_PROCESSES=1 +ENV LISTEN_PORT=80 +ENV CLIENT_BODY_BUFFER_SIZE=1M + +# Copy the entrypoint that will generate Nginx additional configs +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +COPY ./app /app +WORKDIR /app + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Registry Server/README.md b/Registry Server/README.md new file mode 100644 index 000000000..339226c53 --- /dev/null +++ b/Registry Server/README.md @@ -0,0 +1,97 @@ +# Eclipse BaSyx Python SDK - HTTP Server + +This package contains a Dockerfile to spin up an exemplary HTTP/REST server following the [Specification of the AAS Part 2 API][6] with ease. +The server currently implements the following interfaces: + +- [Asset Administration Shell Repository Service][4] +- [Submodel Repository Service][5] + +It uses the [HTTP API][1] and the [AASX][7], [JSON][8], and [XML][9] Adapters of the [BaSyx Python SDK][3], to serve regarding files from a given directory. +The files are only read, changes won't persist. + +Alternatively, the container can also be told to use the [Local-File Backend][2] instead, which stores AAS and Submodels as individual JSON files and allows for persistent changes (except supplementary files, i.e. files referenced by `File` submodel elements). +See [below](#options) on how to configure this. + +## Building +The container image can be built via: +``` +$ docker buildx build -t basyx-python-sdk-http-server . +``` + +## Running + +### Storage +The container needs to be provided with the directory `/storage` to store AAS and Submodel files: AASX, JSON, XML or JSON files of Local-File Backend. + +This directory can be mapped via the `-v` option from another image or a local directory. +To map the directory `storage` inside the container, `-v ./storage:/storage` can be used. +The directory `storage` will be created in the current working directory, if it doesn't already exist. + +### Port +The HTTP server inside the container listens on port 80 by default. +To expose it on the host on port 8080, use the option `-p 8080:80` when running it. + +### Options +The container can be configured via environment variables: +- `API_BASE_PATH` determines the base path under which all other API paths are made available. + Default: `/api/v3.0` +- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: + - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve AASX, JSON, XML files from the storage directory. + The files are not modified, all changes done via the API are only stored in memory. + - When instead set to `LOCAL_FILE`, the server makes use of the [LocalFileBackend][2], where AAS and Submodels are persistently stored as JSON files. + Supplementary files, i.e. files referenced by `File` submodel elements, are not stored in this case. +- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. + +### Running Examples + +Putting it all together, the container can be started via the following command: +``` +$ docker run -p 8080:80 -v ./storage:/storage basyx-python-sdk-http-server +``` + +Since Windows uses backslashes instead of forward slashes in paths, you'll have to adjust the path to the storage directory there: +``` +> docker run -p 8080:80 -v .\storage:/storage basyx-python-sdk-http-server +``` + +Per default, the server will use the `LOCAL_FILE_READ_ONLY` storage type and serve the API under `/api/v3.0` and read files from `/storage`. If you want to change this, you can do so like this: +``` +$ docker run -p 8080:80 -v ./storage2:/storage2 -e API_BASE_PATH=/api/v3.1 -e STORAGE_TYPE=LOCAL_FILE_BACKEND -e STORAGE_PATH=/storage2 basyx-python-sdk-http-server +``` + +## Building and running the image with docker-compose + +The container image can also be built and run via: +``` +$ docker compose up +``` + +This is the exemplary `docker-compose` file for the server: +````yaml +services: + app: + build: . + ports: + - "8080:80" + volumes: + - ./storage:/storage + +```` + +Here files are read from `/storage` and the server can be accessed at http://localhost:8080/api/v3.0/ from your host system. +To get a different setup this compose.yaml file can be adapted and expanded. + +## Acknowledgments + +This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. + +[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 +[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html +[3]: https://github.com/eclipse-basyx/basyx-python-sdk +[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 +[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 +[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces +[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx +[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html +[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html +[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/Registry Server/app/main.py b/Registry Server/app/main.py new file mode 100644 index 000000000..f3eed03ec --- /dev/null +++ b/Registry Server/app/main.py @@ -0,0 +1,46 @@ +import os +import pathlib +import sys + +from basyx.aas import model, adapter +from basyx.aas.adapter import aasx + +from basyx.aas.backend.local_file import LocalFileObjectStore +from basyx.aas.adapter.registry import RegistryAPI + +storage_path = os.getenv("STORAGE_PATH", "/storage") +storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") +base_path = os.getenv("API_BASE_PATH") + +wsgi_optparams = {} + +if base_path is not None: + wsgi_optparams["base_path"] = base_path + +if storage_type == "LOCAL_FILE_BACKEND": + application = RegistryAPI(LocalFileObjectStore(storage_path), aasx.DictSupplementaryFileContainer(), **wsgi_optparams) + +elif storage_type in "LOCAL_FILE_READ_ONLY": + object_store: model.DictObjectStore = model.DictObjectStore() + file_store: aasx.DictSupplementaryFileContainer = aasx.DictSupplementaryFileContainer() + + for file in pathlib.Path(storage_path).iterdir(): + if not file.is_file(): + continue + print(f"Loading {file}") + + if file.suffix.lower() == ".json": + with open(file) as f: + adapter.json.read_aas_json_file_into(object_store, f) + elif file.suffix.lower() == ".xml": + with open(file) as f: + adapter.xml.read_aas_xml_file_into(object_store, file) + elif file.suffix.lower() == ".aasx": + with aasx.AASXReader(file) as reader: + reader.read_into(object_store=object_store, file_store=file_store) + + application = RegistryAPI(object_store, file_store, **wsgi_optparams) + +else: + print(f"STORAGE_TYPE must be either LOCAL_FILE or LOCAL_FILE_READ_ONLY! Current value: {storage_type}", + file=sys.stderr) diff --git a/Registry Server/compose.yml b/Registry Server/compose.yml new file mode 100644 index 000000000..932422dbc --- /dev/null +++ b/Registry Server/compose.yml @@ -0,0 +1,7 @@ +services: + app: + build: . + ports: + - "8083:80" + volumes: + - ./storage:/storage diff --git a/Registry Server/entrypoint.sh b/Registry Server/entrypoint.sh new file mode 100644 index 000000000..722394409 --- /dev/null +++ b/Registry Server/entrypoint.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env sh +set -e + +# Get the maximum upload file size for Nginx, default to 0: unlimited +USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} + +# Get the number of workers for Nginx, default to 1 +USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} + +# Set the max number of connections per worker for Nginx, if requested +# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below +NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} + +# Get the listen port for Nginx, default to 80 +USE_LISTEN_PORT=${LISTEN_PORT:-80} + +# Get the client_body_buffer_size for Nginx, default to 1M +USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} + +# Create the conf.d directory if it doesn't exist +if [ ! -d /etc/nginx/conf.d ]; then + mkdir -p /etc/nginx/conf.d +fi + +if [ -f /app/nginx.conf ]; then + cp /app/nginx.conf /etc/nginx/nginx.conf +else + content='user nginx;\n' + # Set the number of worker processes in Nginx + content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" + content=$content'error_log /var/log/nginx/error.log warn;\n' + content=$content'pid /var/run/nginx.pid;\n' + content=$content'events {\n' + content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" + content=$content'}\n' + content=$content'http {\n' + content=$content' include /etc/nginx/mime.types;\n' + content=$content' default_type application/octet-stream;\n' + content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" + content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" + content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" + content=$content' access_log /var/log/nginx/access.log main;\n' + content=$content' sendfile on;\n' + content=$content' keepalive_timeout 65;\n' + content=$content' include /etc/nginx/conf.d/*.conf;\n' + content=$content'}\n' + content=$content'daemon off;\n' + # Set the max number of open file descriptors for Nginx workers, if requested + if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then + content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" + fi + # Save generated /etc/nginx/nginx.conf + printf "$content" > /etc/nginx/nginx.conf + + content_server='server {\n' + content_server=$content_server" listen ${USE_LISTEN_PORT};\n" + content_server=$content_server' location / {\n' + content_server=$content_server' include uwsgi_params;\n' + content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' + content_server=$content_server' }\n' + content_server=$content_server'}\n' + # Save generated server /etc/nginx/conf.d/nginx.conf + printf "$content_server" > /etc/nginx/conf.d/nginx.conf + + # # Generate additional configuration + printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf + printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf + printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf +fi + +exec "$@" diff --git a/Registry Server/stop-supervisor.sh b/Registry Server/stop-supervisor.sh new file mode 100644 index 000000000..9a953c94b --- /dev/null +++ b/Registry Server/stop-supervisor.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +printf "READY\n" + +while read line; do + echo "Processing Event: $line" >&2 + kill $PPID +done < /dev/stdin diff --git a/Registry Server/supervisord.ini b/Registry Server/supervisord.ini new file mode 100644 index 000000000..d73d98014 --- /dev/null +++ b/Registry Server/supervisord.ini @@ -0,0 +1,27 @@ +[supervisord] +nodaemon=true + +[program:uwsgi] +command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[program:nginx] +command=/usr/sbin/nginx +stdout_logfile=/var/log/nginx.out.log +stdout_logfile_maxbytes=0 +stderr_logfile=/var/log/nginx.err.log +stderr_logfile_maxbytes=0 +stopsignal=QUIT +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[eventlistener:quit_on_failure] +events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL +command=/etc/supervisor/stop-supervisor.sh diff --git a/Registry Server/uwsgi.ini b/Registry Server/uwsgi.ini new file mode 100644 index 000000000..9c54ae1cc --- /dev/null +++ b/Registry Server/uwsgi.ini @@ -0,0 +1,9 @@ +[uwsgi] +wsgi-file = /app/main.py +socket = /tmp/uwsgi.sock +chown-socket = nginx:nginx +chmod-socket = 664 +hook-master-start = unix_signal:15 gracefully_kill_them_all +need-app = true +die-on-term = true +show-config = false diff --git a/sdk/basyx/aas/adapter/http.py b/sdk/basyx/aas/adapter/http.py index a4d7ab289..30e26e419 100644 --- a/sdk/basyx/aas/adapter/http.py +++ b/sdk/basyx/aas/adapter/http.py @@ -289,7 +289,10 @@ class HTTPApiDecoder: model.Qualifier: XMLConstructables.QUALIFIER, model.Submodel: XMLConstructables.SUBMODEL, model.SubmodelElement: XMLConstructables.SUBMODEL_ELEMENT, - model.Reference: XMLConstructables.REFERENCE + model.Reference: XMLConstructables.REFERENCE, + model.AssetAdministrationShellDescriptor: XMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR, + model.SubmodelDescriptor: XMLConstructables.SUBMODEL_DESCRIPTOR, + model.AssetLink: XMLConstructables.ASSET_LINK, } @classmethod @@ -333,6 +336,12 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool constructor = decoder._construct_reference # type: ignore[assignment] elif expect_type is model.Qualifier: constructor = decoder._construct_qualifier # type: ignore[assignment] + elif expect_type is model.AssetAdministrationShellDescriptor: + constructor = decoder._construct_asset_administration_shell_descriptor + elif expect_type is model.SubmodelDescriptor: + constructor = decoder._construct_submodel_descriptor + elif expect_type is model.AssetLink: + constructor = decoder._construct_asset_link if constructor is not None: # construct elements that aren't self-identified @@ -394,7 +403,42 @@ def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> if request.mimetype == "application/json": return cls.json(request.get_data(), expect_type, stripped) return cls.xml(request.get_data(), expect_type, stripped) + @classmethod + def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: + """ + Deserializes the request body to an instance (or list of instances) + of the expected type. + """ + valid_content_types = ("application/json", "application/xml", "text/xml") + + if request.mimetype not in valid_content_types: + raise werkzeug.exceptions.UnsupportedMediaType( + f"Invalid content-type: {request.mimetype}! Supported types: " + ", ".join(valid_content_types) + ) + if request.mimetype == "application/json": + raw_data = request.get_data() + try: + parsed = json.loads(raw_data) + except Exception as e: + raise werkzeug.exceptions.BadRequest(f"Invalid JSON: {e}") + # Prüfe, ob parsed ein Array ist: + if isinstance(parsed, list): + # Für jedes Element wird die Konvertierung angewandt. + return [cls._convert_single_json_item(item, expect_type, stripped) for item in parsed] # type: ignore + else: + return cls._convert_single_json_item(parsed, expect_type, stripped) + else: + return cls.xml(request.get_data(), expect_type, stripped) + + @classmethod + def _convert_single_json_item(cls, data: any, expect_type: Type[T], stripped: bool) -> T: + """ + Konvertiert ein einzelnes JSON-Objekt (als Python-Dict) in ein Objekt vom Typ expect_type. + Hierbei wird das Dictionary zuerst wieder in einen JSON-String serialisiert und als Bytes übergeben. + """ + json_bytes = json.dumps(data).encode("utf-8") + return cls.json(json_bytes, expect_type, stripped) class Base64URLConverter(werkzeug.routing.UnicodeConverter): diff --git a/sdk/basyx/aas/adapter/json/json_deserialization.py b/sdk/basyx/aas/adapter/json/json_deserialization.py index c1ce35fef..3a50975a9 100644 --- a/sdk/basyx/aas/adapter/json/json_deserialization.py +++ b/sdk/basyx/aas/adapter/json/json_deserialization.py @@ -34,6 +34,7 @@ import json import logging import pprint +from abc import abstractmethod from typing import Dict, Callable, ContextManager, TypeVar, Type, List, IO, Optional, Set, get_args from basyx.aas import model @@ -188,6 +189,9 @@ def object_hook(cls, dct: Dict[str, object]) -> object: 'Range': cls._construct_range, 'ReferenceElement': cls._construct_reference_element, 'DataSpecificationIec61360': cls._construct_data_specification_iec61360, + 'AssetAdministrationShellDescriptor': cls._construct_asset_administration_shell_descriptor, + 'SubmodelDescriptor': cls._construct_submodel_descriptor, + 'AssetLink': cls._construct_asset_link, } # Get modelType and constructor function @@ -275,7 +279,16 @@ def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None if 'extensions' in dct: for extension in _get_ts(dct, 'extensions', list): obj.extension.add(cls._construct_extension(extension)) - + if isinstance(obj, model.Descriptor): + if 'description' in dct: + obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), + model.MultiLanguageTextType) + if 'displayName' in dct: + obj.display_name = cls._construct_lang_string_set(_get_ts(dct, 'displayName', list), + model.MultiLanguageNameType) + if 'extensions' in dct: + for extension in _get_ts(dct, 'extensions', list): + obj.extension.add(cls._construct_extension(extension)) @classmethod def _get_kind(cls, dct: Dict[str, object]) -> model.ModellingKind: """ @@ -747,6 +760,134 @@ def _construct_reference_element( ret.value = cls._construct_reference(_get_ts(dct, 'value', dict)) return ret + @classmethod + def _construct_asset_administration_shell_descriptor( + cls, dct: Dict[str, object], object_class=model.AssetAdministrationShellDescriptor) -> model.AssetAdministrationShellDescriptor: + ret = object_class(id_=_get_ts(dct, 'id', str)) + cls._amend_abstract_attributes(ret, dct) + if 'administration' in dct: + ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) + if 'assetkind' in dct: + asset_kind=ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] + if 'assetType' in dct: + ret.asset_type = _get_ts(dct, 'assetType', str) + global_asset_id = None + if 'globalAssetId' in dct: + global_asset_id = _get_ts(dct, 'globalAssetId', str) + specific_asset_id = set() + if 'specificAssetIds' in dct: + for desc_data in _get_ts(dct, "specificAssetIds", list): + specific_asset_id.add(cls._construct_specific_asset_id(desc_data, model.SpecificAssetId)) + if 'endpoints' in dct: + for endpoint_dct in _get_ts(dct, 'endpoints', list): + if 'protocolInformation' in endpoint_dct: + ret.endpoints.append( + cls._construct_endpoint(endpoint_dct, + model.Endpoint)) + elif 'href' in endpoint_dct: + protocol_info = model.ProtocolInformation( + href=_get_ts(endpoint_dct['href'], 'href', str), + endpoint_protocol=_get_ts(endpoint_dct['href'], + 'endpointProtocol', + str) if 'endpointProtocol' in + endpoint_dct[ + 'href'] else None, + endpoint_protocol_version=_get_ts( + endpoint_dct['href'], + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in + endpoint_dct['href'] else None + ) + ret.endpoints.append(model.Endpoint( + protocol_information=protocol_info, + interface=_get_ts(endpoint_dct, 'interface', + str))) + if 'idShort' in dct: + ret.id_short = _get_ts(dct, 'idShort', str) + if 'submodelDescriptors' in dct: + ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), model.SubmodelDescriptor) + return ret + + @classmethod + def _construct_protocol_information(cls, dct: Dict[str, object], + object_class=model.ProtocolInformation) -> model.ProtocolInformation: + ret = object_class( + href=_get_ts(dct, 'href', str), + endpoint_protocol=_get_ts(dct, 'endpointProtocol', + str) if 'endpointProtocol' in dct else None, + endpoint_protocol_version=_get_ts(dct, + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in dct else None, + subprotocol=_get_ts(dct, 'subprotocol', + str) if 'subprotocol' in dct else None, + subprotocol_body=_get_ts(dct, 'subprotocolBody', + str) if 'subprotocolBody' in dct else None, + subprotocol_body_encoding=_get_ts(dct, + 'subprotocolBodyEncoding', + str) if 'subprotocolBodyEncoding' in dct else None + ) + return ret + + @classmethod + def _construct_endpoint(cls, dct: Dict[str, object], + object_class=model.Endpoint) -> model.Endpoint: + ret = object_class( + protocol_information=cls._construct_protocol_information( + _get_ts(dct, 'protocolInformation', dict), + model.ProtocolInformation + ), + interface=_get_ts(dct, 'interface', + str) + ) + cls._amend_abstract_attributes(ret, dct) + return ret + + @classmethod + def _construct_submodel_descriptor( + cls, dct: Dict[str, object], object_class=model.SubmodelDescriptor) -> model.SubmodelDescriptor: + ret = object_class(id_=_get_ts(dct, 'id', str), + endpoints=[]) + cls._amend_abstract_attributes(ret, dct) + for endpoint_dct in _get_ts(dct, 'endpoints', list): + if 'protocolInformation' in endpoint_dct: + ret.endpoints.append( + cls._construct_endpoint(endpoint_dct, + model.Endpoint)) + elif 'href' in endpoint_dct: + protocol_info = model.ProtocolInformation( + href=_get_ts(endpoint_dct['href'], 'href', str), + endpoint_protocol=_get_ts(endpoint_dct['href'], + 'endpointProtocol', + str) if 'endpointProtocol' in + endpoint_dct[ + 'href'] else None, + endpoint_protocol_version=_get_ts( + endpoint_dct['href'], + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in + endpoint_dct['href'] else None + ) + ret.endpoints.append(model.Endpoint( + protocol_information=protocol_info, + interface=_get_ts(endpoint_dct, 'interface', + str))) + if 'administration' in dct: + ret.administration = cls._construct_administrative_information( + _get_ts(dct, 'administration', dict)) + if 'idShort' in dct: + ret.id_short = _get_ts(dct, 'idShort', str) + if 'semanticId' in dct: + ret.semantic_id = cls._construct_reference(_get_ts(dct, 'semanticId', dict)) + if 'supplementalSemanticIds' in dct: + for ref in _get_ts(dct, 'supplementalSemanticIds', list): + ret.supplemental_semantic_id.append(cls._construct_reference(ref)) + return ret + @classmethod + def _construct_asset_link ( + cls, dct: Dict[str, object], object_class=model.AssetLink) -> model.AssetLink: + ret = object_class(name=_get_ts(dct, 'name', str), + value=_get_ts(dct, 'value', str)) + return ret class StrictAASFromJsonDecoder(AASFromJsonDecoder): """ @@ -845,7 +986,9 @@ def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathO for name, expected_type in (('assetAdministrationShells', model.AssetAdministrationShell), ('submodels', model.Submodel), - ('conceptDescriptions', model.ConceptDescription)): + ('conceptDescriptions', model.ConceptDescription), + ('assetAdministrationShellDescriptors', model.AssetAdministrationShellDescriptor), + ('submodelDescriptors', model.SubmodelDescriptor)): try: lst = _get_ts(data, name, list) except (KeyError, TypeError): diff --git a/sdk/basyx/aas/adapter/json/json_serialization.py b/sdk/basyx/aas/adapter/json/json_serialization.py index 8c6a671f1..29d614fa8 100644 --- a/sdk/basyx/aas/adapter/json/json_serialization.py +++ b/sdk/basyx/aas/adapter/json/json_serialization.py @@ -93,6 +93,11 @@ def default(self, obj: object) -> object: model.SubmodelElementCollection: self._submodel_element_collection_to_json, model.SubmodelElementList: self._submodel_element_list_to_json, model.ValueReferencePair: self._value_reference_pair_to_json, + model.AssetAdministrationShellDescriptor: self._asset_administration_shell_descriptor_to_json, + model.SubmodelDescriptor: self._submodel_descriptor_to_json, + model.Endpoint: self._endpoint_to_json, + model.ProtocolInformation: self._protocol_information_to_json, + model.AssetLink: self._asset_link_to_json } for typ in mapping: if isinstance(obj, typ): @@ -150,6 +155,14 @@ def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: if isinstance(obj, model.Qualifiable) and not cls.stripped: if obj.qualifier: data['qualifiers'] = list(obj.qualifier) + if isinstance(obj, model.Descriptor): + if obj.description: + data['description'] = obj.description + if obj.display_name: + data['displayName'] = obj.display_name + if obj.extension: + data['extensions'] = list(obj.extension) + return data # ############################################################# @@ -670,6 +683,92 @@ def _basic_event_element_to_json(cls, obj: model.BasicEventElement) -> Dict[str, data['maxInterval'] = model.datatypes.xsd_repr(obj.max_interval) return data + @classmethod + def _asset_administration_shell_descriptor_to_json(cls, obj: model.AssetAdministrationShellDescriptor) -> Dict[str, object]: + """ + serialization of an object from class AssetAdministrationShell to json + + :param obj: object of class AssetAdministrationShell + :return: dict with the serialized attributes of this object + """ + data = cls._abstract_classes_to_json(obj) + data.update(cls._namespace_to_json(obj)) + data['id'] = obj.id + if obj.administration: + data['administration'] = obj.administration + if obj.asset_kind: + data['assetKind'] = _generic.ASSET_KIND[obj.asset_kind] + if obj.asset_type: + data['assetType'] = obj.asset_type + if obj.global_asset_id: + data['globalAssetId'] = obj.global_asset_id + if obj.specific_asset_id: + data['specificAssetIds'] = list(obj.specific_asset_id) + if obj.endpoints: + data['endpoints'] = list(obj.endpoints) + if obj.id_short: + data['idShort'] = obj.id_short + if obj.submodel_descriptors: + data['submodelDescriptors'] = list(obj.submodel_descriptors) + return data + + @classmethod + def _protocol_information_to_json(cls, + obj: model.ProtocolInformation) -> \ + Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + + data['href'] = obj.href + if obj.endpoint_protocol: + data['endpointProtocol'] = obj.endpoint_protocol + if obj.endpoint_protocol_version: + data['endpointProtocolVersion'] = obj.endpoint_protocol_version + if obj.subprotocol: + data['subprotocol'] = obj.subprotocol + if obj.subprotocol_body: + data['subprotocolBody'] = obj.subprotocol_body + if obj.subprotocol_body_encoding: + data['subprotocolBodyEncoding'] = obj.subprotocol_body_encoding + + return data + + + @classmethod + def _endpoint_to_json(cls, obj: model.Endpoint) -> Dict[ + str, object]: + data = cls._abstract_classes_to_json(obj) + data['protocolInformation'] = cls._protocol_information_to_json( + obj.protocol_information) + data['interface'] = obj.interface + return data + + @classmethod + def _submodel_descriptor_to_json(cls, obj: model.SubmodelDescriptor) -> Dict[str, object]: + """ + serialization of an object from class Submodel to json + + :param obj: object of class Submodel + :return: dict with the serialized attributes of this object + """ + data = cls._abstract_classes_to_json(obj) + data['id'] = obj.id + data['endpoints'] = [cls._endpoint_to_json(ep) for ep in + obj.endpoints] + if obj.id_short: + data['idShort'] = obj.id_short + if obj.administration: + data['administration'] = obj.administration + if obj.semantic_id: + data['semanticId'] = obj.semantic_id + if obj.supplemental_semantic_id: + data['supplementalSemanticIds'] = list(obj.supplemental_semantic_id) + return data + @classmethod + def _asset_link_to_json(cls, obj: model.AssetLink) -> Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + data['name'] = obj.name + data['value'] = obj.value + return data class StrippedAASToJsonEncoder(AASToJsonEncoder): """ @@ -698,6 +797,9 @@ def _create_dict(data: model.AbstractObjectStore) -> dict: asset_administration_shells: List[model.AssetAdministrationShell] = [] submodels: List[model.Submodel] = [] concept_descriptions: List[model.ConceptDescription] = [] + asset_administration_shell_descriptors: List[model.AssetAdministrationShellDescriptor] = [] + submodel_descriptors: List[model.SubmodelDescriptor] = [] + assets_links: List[model.AssetLink] = [] for obj in data: if isinstance(obj, model.AssetAdministrationShell): asset_administration_shells.append(obj) @@ -705,6 +807,12 @@ def _create_dict(data: model.AbstractObjectStore) -> dict: submodels.append(obj) elif isinstance(obj, model.ConceptDescription): concept_descriptions.append(obj) + elif isinstance(obj, model.AssetAdministrationShellDescriptor): + asset_administration_shell_descriptors.append(obj) + elif isinstance(obj, model.SubmodelDescriptor): + submodel_descriptors.append(obj) + elif isinstance(obj, model.AssetLink): + assets_links.append(obj) dict_: Dict[str, List] = {} if asset_administration_shells: dict_['assetAdministrationShells'] = asset_administration_shells @@ -712,6 +820,12 @@ def _create_dict(data: model.AbstractObjectStore) -> dict: dict_['submodels'] = submodels if concept_descriptions: dict_['conceptDescriptions'] = concept_descriptions + if asset_administration_shell_descriptors: + dict_['assetAdministrationShellDescriptors'] = asset_administration_shell_descriptors + if submodel_descriptors: + dict_['submodelDescriptors'] = submodel_descriptors + if assets_links: + dict_['assetLinks'] = assets_links return dict_ diff --git a/sdk/basyx/aas/adapter/registry.py b/sdk/basyx/aas/adapter/registry.py new file mode 100644 index 000000000..c3871c612 --- /dev/null +++ b/sdk/basyx/aas/adapter/registry.py @@ -0,0 +1,367 @@ +# Copyright (c) 2024 the Eclipse BaSyx Authors +# +# This program and the accompanying materials are made available under the terms of the MIT License, available in +# the LICENSE file of this project. +# +# SPDX-License-Identifier: MIT +""" +This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". +""" + +import abc +import base64 +import binascii +import datetime +import enum +import io +import json +import itertools + +from lxml import etree +import werkzeug.exceptions +import werkzeug.routing +import werkzeug.urls +import werkzeug.utils +from werkzeug.exceptions import BadRequest, Conflict, NotFound, UnprocessableEntity +from werkzeug.routing import MapAdapter, Rule, Submount +from werkzeug.wrappers import Request, Response +from werkzeug.datastructures import FileStorage + +from basyx.aas import model +from ._generic import XML_NS_MAP +from .xml import XMLConstructables, read_aas_xml_element, xml_serialization, object_to_xml_element +from .json import AASToJsonEncoder, StrictAASFromJsonDecoder, StrictStrippedAASFromJsonDecoder +from . import aasx +from .http import APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder +from .http import Base64URLConverter + +from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple + +def get_response_type(request: Request) -> Type[APIResponse]: + response_types: Dict[str, Type[APIResponse]] = { + "application/json": JsonResponse, + "application/xml": XmlResponse, + "text/xml": XmlResponseAlt + } + if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): + return JsonResponse + mime_type = request.accept_mimetypes.best_match(response_types) + if mime_type is None: + raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " + + ", ".join(response_types.keys())) + return response_types[mime_type] + +def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ + -> APIResponse: + headers = exception.get_headers() + location = exception.get_response().location + if location is not None: + headers.append(("Location", location)) + if exception.code and exception.code >= 400: + message = Message(type(exception).__name__, exception.description if exception.description is not None else "", + MessageType.ERROR) + result = Result(False, [message]) + else: + result = Result(False) + return response_type(result, status=exception.code, headers=headers) + +def is_stripped_request(request: Request) -> bool: + return request.args.get("level") == "core" + +T = TypeVar("T") + +BASE64URL_ENCODING = "utf-8" +class RegistryAPI: + def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.0"): + self.object_store: model.AbstractObjectStore = object_store + self.url_map = werkzeug.routing.Map([ + Submount(base_path, [ + Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_aas_descriptors_all), + Rule("/shell-descriptors", methods=["POST"], endpoint=self.post_aas_descriptor), + Submount("/shell-descriptors", [ + Rule("/", methods=["GET"], endpoint=self.get_aas_descriptor), + Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor), + Rule("/", methods=["DELETE"], endpoint=self.delete_aas_descriptor), + Submount("/", [ + Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors_through_superpath), + Rule("/submodel-descriptors", methods=["POST"], endpoint=self.post_submodel_descriptor_through_superpath), + Submount("/submodel-descriptors", [ + Rule("/", methods=["GET"], endpoint=self.get_submodel_descriptor_by_id_through_superpath), + Rule("/", methods=["PUT"], endpoint=self.put_submodel_descriptor_by_id_through_superpath), + Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_descriptor_by_id_through_superpath), + ]) + ]) + ]), + Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors), + Rule("/submodel-descriptors", methods=["POST"], endpoint=self.post_submodel_descriptor), + Submount("/submodel-descriptors", [ + Rule("/", methods=["GET"], endpoint=self.get_submodel_descriptor_by_id), + Rule("/", methods=["PUT"], endpoint=self.put_submodel_descriptor_by_id), + Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_descriptor_by_id), + ]) + ]) + ], converters={ + "base64url": Base64URLConverter + }, strict_slashes=False) + + def __call__(self, environ, start_response) -> Iterable[bytes]: + response: Response = self.handle_request(Request(environ)) + return response(environ, start_response) + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) -> model.provider._IT: + identifiable = self.object_store.get(identifier) + if not isinstance(identifiable, type_): + raise NotFound(f"No {type_.__name__} with {identifier} found!") + identifiable.update() + return identifiable + + def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: + for obj in self.object_store: + if isinstance(obj, type_): + obj.update() + yield obj + @classmethod + def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: + limit_str = request.args.get('limit', default="10") + cursor_str = request.args.get('cursor', default="0") + try: + limit, cursor = int(limit_str), int(cursor_str) + if limit < 0 or cursor < 0: + raise ValueError + except ValueError: + raise BadRequest("Cursor and limit must be positive integers!") + start_index = cursor + end_index = cursor + limit + paginated_slice = itertools.islice(iterator, start_index, end_index) + return paginated_slice, end_index + + def _get_descriptors(self, request: "Request") -> Tuple[Iterator[model.AssetAdministrationShellDescriptor], int]: + """ + Returns all Asset Administration Shell Descriptors + """ + descriptors: Iterator[model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( + model.AssetAdministrationShellDescriptor + ) + + id_short = request.args.get("idShort") + if id_short is not None: + descriptors = filter(lambda desc: desc.id_short == id_short, descriptors) + + asset_ids = request.args.getlist("assetIds") + if asset_ids: + # Decode und Instanziierung der SpecificAssetIds + specific_asset_ids: List[model.SpecificAssetId] = list( + map(lambda asset_id: HTTPApiDecoder.base64urljson(asset_id, model.SpecificAssetId, False), asset_ids) + ) + # Filtere anhand der übergebenen SpecificAssetIds + descriptors = filter( + lambda desc: all(specific_asset_id in desc.asset_information.specific_asset_id + for specific_asset_id in specific_asset_ids), + descriptors + ) + + paginated_descriptors, end_index = self._get_slice(request, descriptors) + return paginated_descriptors, end_index + + def _get_descriptor(self, url_args: Dict) -> model.AssetAdministrationShellDescriptor: + return self._get_obj_ts(url_args["aas_id"], model.AssetAdministrationShellDescriptor) + + def _get_submodel_descriptors(self, request: Request) -> Tuple[Iterator[model.SubmodelDescriptor], int]: + submodel_descriptors: Iterator[model.Submodel] = self._get_all_obj_of_type(model.SubmodelDescriptor) + id_short = request.args.get("idShort") + if id_short is not None: + submodel_descriptors= filter(lambda sm: sm.id_short == id_short, submodels) + semantic_id = request.args.get("semanticId") + if semantic_id is not None: + spec_semantic_id = HTTPApiDecoder.base64urljson( + semantic_id, model.Reference, False) # type: ignore[type-abstract] + submodel_descriptors = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodel_descriptors) + paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) + return paginated_submodel_descriptors, end_index + + def _get_submodel_descriptor(self, url_args: Dict) -> model.SubmodelDescriptor: + return self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor) + + def handle_request(self, request: Request): + map_adapter: MapAdapter = self.url_map.bind_to_environ(request.environ) + try: + response_t = get_response_type(request) + except werkzeug.exceptions.NotAcceptable as e: + return e + + try: + endpoint, values = map_adapter.match() + return endpoint(request, values, response_t=response_t, map_adapter=map_adapter) + + # any raised error that leaves this function will cause a 500 internal server error + # so catch raised http exceptions and return them + except werkzeug.exceptions.HTTPException as e: + return http_exception_to_response(e, response_t) + + # ------ AAS REGISTRY ROUTES ------- + def get_aas_descriptors_all(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + aasdescriptors, cursor = self._get_descriptors(request) + return response_t(list(aasdescriptors), cursor=cursor) + + def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + map_adapter: MapAdapter) -> Response: + descriptor = HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, False) + try: + self.object_store.add(descriptor) + except KeyError as e: + raise Conflict(f"AssetAdministrationShellDescriptor with Identifier {descriptor.id} already exists!") from e + descriptor.commit() + created_resource_url = map_adapter.build(self.get_aas_descriptor, { + "aas_id": descriptor.id + }, force_external=True) + return response_t(descriptor, status=201, headers={"Location": created_resource_url}) + + def get_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + descriptor = self._get_descriptor(url_args) + return response_t(descriptor) + + def put_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + descriptor = self._get_descriptor(url_args) + descriptor.update_from(HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, + is_stripped_request(request))) + descriptor.commit() + return response_t() + + def delete_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + descriptor = self._get_descriptor(url_args) + self.object_store.remove(descriptor) + return response_t() + + def get_all_submodel_descriptors_through_superpath(self, + request: Request, + url_args: Dict, + response_t: Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_descriptor(url_args) + submodel_descriptors, cursor = self._get_slice(request, + aas_descriptor.submodel_descriptors) + return response_t(list(submodel_descriptors), cursor=cursor) + + def get_submodel_descriptor_by_id_through_superpath(self, + request: Request, + url_args: Dict, + response_t: + Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_descriptor(url_args) + submodel_id = url_args["submodel_id"] + submodel_descriptor = next( + (sd for sd in aas_descriptor.submodel_descriptors if + sd.id == submodel_id), None) + if submodel_descriptor is None: + raise NotFound( + f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + return response_t(submodel_descriptor) + + def post_submodel_descriptor_through_superpath(self, + request: Request, + url_args: Dict, + response_t: Type[ + APIResponse], + map_adapter: MapAdapter) -> Response: + aas_descriptor = self._get_descriptor(url_args) + submodel_descriptor = HTTPApiDecoder.request_body(request, + model.SubmodelDescriptor, + is_stripped_request( + request)) + if any(sd.id == submodel_descriptor.id for sd in + aas_descriptor.submodel_descriptors): + raise Conflict( + f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") + aas_descriptor.submodel_descriptors.append(submodel_descriptor) + aas_descriptor.commit() + created_resource_url = map_adapter.build( + self.get_submodel_descriptor_by_id_through_superpath, { + "aas_id": aas_descriptor.id, + "submodel_id": submodel_descriptor.id + }, force_external=True) + return response_t(submodel_descriptor, status=201, + headers={"Location": created_resource_url}) + + def put_submodel_descriptor_by_id_through_superpath(self, + request: Request, + url_args: Dict, + response_t: + Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_descriptor(url_args) + submodel_id = url_args["submodel_id"] + submodel_descriptor = next( + (sd for sd in aas_descriptor.submodel_descriptors if + sd.id == submodel_id), None) + if submodel_descriptor is None: + raise NotFound( + f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + submodel_descriptor.update_from( + HTTPApiDecoder.request_body(request, + model.SubmodelDescriptor, + is_stripped_request(request))) + aas_descriptor.commit() + return response_t() + + def delete_submodel_descriptor_by_id_through_superpath(self, + request: Request, + url_args: Dict, + response_t: + Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_descriptor(url_args) + submodel_id = url_args["submodel_id"] + submodel_descriptor = next( + (sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) + if submodel_descriptor is None: + raise NotFound(f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + aas_descriptor.submodel_descriptors.remove(submodel_descriptor) + aas_descriptor.commit() + return response_t() + + # ------ Submodel REGISTRY ROUTES ------- + def get_all_submodel_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + submodel_descriptors, cursor = self._get_submodel_descriptors(request) + return response_t(list(submodel_descriptors), cursor=cursor, stripped=is_stripped_request(request)) + + + def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + submodel_descriptor = self._get_submodel_descriptor(url_args) + return response_t(submodel_descriptor, stripped=is_stripped_request(request)) + + + def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + map_adapter: MapAdapter) -> Response: + submodel_descriptor = HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, is_stripped_request(request)) + try: + self.object_store.add(submodel_descriptor) + except KeyError as e: + raise Conflict(f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") from e + submodel_descriptor.commit() + created_resource_url = map_adapter.build(self.get_submodel_descriptor_by_id, { + "submodel_id": submodel_descriptor.id + }, force_external=True) + return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) + + + def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + submodel_descriptor = self._get_submodel_descriptor(url_args) + submodel_descriptor.update_from(HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, is_stripped_request(request))) + submodel_descriptor.commit() + return response_t() + + def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor)) + return response_t() + + +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8083, RegistryAPI(create_full_example()), + use_debugger=True, use_reloader=True) diff --git a/sdk/basyx/aas/adapter/resolver.py b/sdk/basyx/aas/adapter/resolver.py new file mode 100644 index 000000000..6e3261c74 --- /dev/null +++ b/sdk/basyx/aas/adapter/resolver.py @@ -0,0 +1,253 @@ +# Copyright (c) 2024 the Eclipse BaSyx Authors +# +# This program and the accompanying materials are made available under the terms of the MIT License, available in +# the LICENSE file of this project. +# +# SPDX-License-Identifier: MIT +""" +This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". +""" + +import abc +import base64 +import binascii +import datetime +import enum +import io +import json +import itertools + +from lxml import etree +import werkzeug.exceptions +import werkzeug.routing +import werkzeug.urls +import werkzeug.utils +from werkzeug.exceptions import BadRequest, Conflict, NotFound, UnprocessableEntity +from werkzeug.routing import MapAdapter, Rule, Submount +from werkzeug.wrappers import Request, Response +from werkzeug.datastructures import FileStorage + +from basyx.aas import model +from ._generic import XML_NS_MAP +from .xml import XMLConstructables, read_aas_xml_element, xml_serialization, object_to_xml_element +from .json import AASToJsonEncoder, StrictAASFromJsonDecoder, StrictStrippedAASFromJsonDecoder +from . import aasx +from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder + +from .http import get_response_type, http_exception_to_response, is_stripped_request + +from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple + + +T = TypeVar("T") + +BASE64URL_ENCODING = "utf-8" + +# Klasse, die das externe Mapping verwaltet + + +class ResolverAPI: + def __init__(self, object_store: model.AbstractObjectStore, + base_path: str = "/api/v3.0"): + self.object_store: model.AbstractObjectStore = object_store + self.url_map = werkzeug.routing.Map([ + Submount(base_path, [ + Rule("/lookup/shellsByAssetLink", methods=["POST"], + endpoint=self.search_all_aas_ids_by_asset_link), + Submount("/lookup/shells", [ + Rule("/", methods=["GET"], + endpoint=self.get_all_asset_links_by_id), + Rule("/", methods=["POST"], + endpoint=self.post_all_asset_links_by_id), + Rule("/", methods=["DELETE"], + endpoint=self.delete_all_asset_links_by_id), + ]), + ]) + ], converters={ + "base64url": Base64URLConverter + }, strict_slashes=False) + + def __call__(self, environ, start_response) -> Iterable[bytes]: + response: Response = self.handle_request(Request(environ)) + return response(environ, start_response) + + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[ + model.provider._IT]) -> model.provider._IT: + identifiable = self.object_store.get(identifier) + if not isinstance(identifiable, type_): + raise NotFound( + f"No {type_.__name__} with {identifier} found!") + identifiable.update() + return identifiable + + def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> \ + Iterator[model.provider._IT]: + for obj in self.object_store: + if isinstance(obj, type_): + obj.update() + yield obj + + @classmethod + def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: + limit_str = request.args.get('limit', default="10") + cursor_str = request.args.get('cursor', default="0") + try: + limit, cursor = int(limit_str), int(cursor_str) + if limit < 0 or cursor < 0: + raise ValueError + except ValueError: + raise BadRequest("Cursor and limit must be positive integers!") + start_index = cursor + end_index = cursor + limit + paginated_slice = itertools.islice(iterator, start_index, end_index) + return paginated_slice, end_index + + def _get_assets(self, request: Request) -> Tuple[ + Iterator[model.SpecificAssetId], int]: + specific_asset_ids: Iterator[ + model.SpecificAssetId] = self._get_all_obj_of_type( + model.SpecificAssetId) + + asset_name = request.args.get("name") + if asset_name is not None: + specific_asset_ids = filter( + lambda asset: asset.name == asset_name, + specific_asset_ids) + + paginated_assets, end_index = self._get_slice(request, + specific_asset_ids) + return paginated_assets, end_index + + def handle_request(self, request: Request): + map_adapter: MapAdapter = self.url_map.bind_to_environ( + request.environ) + try: + response_t = get_response_type(request) + except werkzeug.exceptions.NotAcceptable as e: + return e + try: + endpoint, values = map_adapter.match() + return endpoint(request, values, response_t=response_t, + map_adapter=map_adapter) + + # any raised error that leaves this function will cause a 500 internal server error + # so catch raised http exceptions and return them + except werkzeug.exceptions.HTTPException as e: + return http_exception_to_response(e, response_t) + + # ------ Discovery ROUTES ------- + def search_all_aas_ids_by_asset_link(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + """ + Returns a list of Asset Administration Shell IDs linked to specific asset identifiers or the global asset ID + """ + asset_links = HTTPApiDecoder.request_body_list(request, model.AssetLink, + True) + + matching_aas_ids = [] + for asset_link in asset_links: + if asset_link.name == "globalAssetId": + for aas in self._get_all_obj_of_type( + model.AssetAdministrationShell): + if aas.asset_information.global_asset_id == asset_link.value: + matching_aas_ids.append(aas.id_) + else: + for aas in self._get_all_obj_of_type( + model.AssetAdministrationShell): + for specific_asset_id in aas.asset_information.specific_asset_id: + if specific_asset_id.name == asset_link.name and specific_asset_id.value == asset_link.value: + matching_aas_ids.append(aas.id) + + paginated_ids, end_index = self._get_slice(request, iter( + matching_aas_ids)) + return response_t(matching_aas_ids, cursor=end_index) + + def get_all_asset_links_by_id(self, request: Request, + url_args: Dict, + response_t: Type[APIResponse], + **_kwargs) -> Response: + """ + Returns a list of specific asset identifiers based on an Asset Administration Shell ID to edit discoverable content. + The global asset ID is returned as specific asset ID with "name" equal to "globalAssetId" (see Constraint AASd-116). + """ + aas_identifier = url_args.get("aas_id") + try: + aas = self._get_obj_ts(aas_identifier, + model.AssetAdministrationShell) + except NotFound: + raise NotFound( + f"Asset Administration Shell with ID '{aas_identifier}' not found.") + + specific_asset_ids = list(aas.asset_information.specific_asset_id) + + if aas.asset_information.global_asset_id: + specific_asset_ids.append(model.SpecificAssetId( + name="globalAssetId", + value=aas.asset_information.global_asset_id + )) + + return response_t(specific_asset_ids) + + def post_all_asset_links_by_id(self, request: Request, + url_args: Dict, + response_t: Type[APIResponse], + **_kwargs) -> Response: + """ + Creates specific asset identifiers linked to an Asset Administration Shell to edit discoverable content. + """ + aas_identifier = url_args.get("aas_id") + + # Try to retrieve the Asset Administration Shell by its identifier + try: + aas = self._get_obj_ts(aas_identifier, + model.AssetAdministrationShell) + except NotFound: + raise NotFound( + f"Asset Administration Shell with ID '{aas_identifier}' not found.") + + # Decode the request body to retrieve specific asset identifiers + specific_asset_ids = HTTPApiDecoder.request_body_list( + request, model.SpecificAssetId, False) + + # Check for conflicts with existing specific asset identifiers + existing_ids = {id.value for id in + aas.asset_information.specific_asset_id} + for specific_asset_id in specific_asset_ids: + if specific_asset_id.value in existing_ids: + raise Conflict( + f"Specific asset identifier with value '{specific_asset_id.value}' already exists.") + else: + aas.asset_information.specific_asset_id.add(specific_asset_id) + + return response_t(specific_asset_ids) + + def delete_all_asset_links_by_id(self, request: Request, + url_args: Dict, + response_t: Type[APIResponse], + **_kwargs) -> Response: + """ + Deletes all specific asset identifiers linked to an Asset Administration Shell to edit discoverable content. + """ + aas_identifier = url_args.get("aas_id") + + # Try to retrieve the Asset Administration Shell by its identifier + try: + aas = self._get_obj_ts(aas_identifier, + model.AssetAdministrationShell) + except NotFound: + raise NotFound( + f"Asset Administration Shell with ID '{aas_identifier}' not found.") + + # Clear all specific asset identifiers from the AAS + aas.asset_information.specific_asset_id.clear() + + # Return 204 No Content response + return Response(status=204) + + +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8084, ResolverAPI(create_full_example()), + use_debugger=True, use_reloader=True) diff --git a/sdk/basyx/aas/adapter/xml/xml_deserialization.py b/sdk/basyx/aas/adapter/xml/xml_deserialization.py index ab78d3c2e..591d82107 100644 --- a/sdk/basyx/aas/adapter/xml/xml_deserialization.py +++ b/sdk/basyx/aas/adapter/xml/xml_deserialization.py @@ -1181,7 +1181,58 @@ def construct_data_specification_iec61360(cls, element: etree._Element, ds_iec.level_types.add(IEC61360_LEVEL_TYPES_INVERSE[tag]) cls._amend_abstract_attributes(ds_iec, element) return ds_iec + @classmethod + def construct_asset_administration_shell_descriptor(cls, element: etree._Element, object_class=model.AssetAdministrationShellDescriptor, + **_kwargs: Any) -> model.AssetAdministrationShellDescriptor: + id_value = _child_text_mandatory(element, NS_AAS + "id") + id_short = _child_text_mandatory(element, NS_AAS + "idShort") + endpoints_elem = element.find(NS_AAS + "endpoints") + endpoints: List[str] = [] + if endpoints_elem is not None: + endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] + + asset_kind = _child_text_mandatory(element, NS_AAS + "assetKind") + + specific_asset_ids_elem = element.find(NS_AAS + "specificAssetIds") + specific_asset_ids: List[Dict[str, Any]] = [] + if specific_asset_ids_elem is not None: + for sid_elem in specific_asset_ids_elem.findall(NS_AAS + "specificAssetId"): + name = sid_elem.findtext(NS_AAS + "name") + value = sid_elem.findtext(NS_AAS + "value") + if name is not None and value is not None: + specific_asset_ids.append({"name": name.strip(), "value": value.strip()}) + + descriptor = object_class( + id=id_value, + id_short=id_short, + endpoints=endpoints, + asset_kind=asset_kind, + specific_asset_ids=specific_asset_ids + ) + + cls._amend_abstract_attributes(descriptor, element) + return descriptor + @classmethod + def construct_submodel_descriptor(cls, element: etree._Element, object_class=model.SubmodelDescriptor, + **_kwargs: Any) -> model.SubmodelDescriptor: + submodel_id = _child_text_mandatory(element, NS_AAS + "id") + id_short = _child_text_mandatory(element, NS_AAS + "idShort") + + endpoints_elem = element.find(NS_AAS + "endpoints") + endpoints: List[str] = [] + if endpoints_elem is not None: + endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] + + # Hier können weitere optionale Felder verarbeitet werden, z.B. semanticId, etc. + + submodel_descriptor = object_class( + id=submodel_id, + id_short=id_short, + endpoints=endpoints + ) + cls._amend_abstract_attributes(submodel_descriptor, element) + return submodel_descriptor class StrictAASFromXmlDecoder(AASFromXmlDecoder): """ @@ -1307,6 +1358,9 @@ class XMLConstructables(enum.Enum): EMBEDDED_DATA_SPECIFICATION = enum.auto() DATA_SPECIFICATION_CONTENT = enum.auto() DATA_SPECIFICATION_IEC61360 = enum.auto() + ASSET_ADMINISTRATION_SHELL_DESCRIPTOR = enum.auto() + SUBMODEL_DESCRIPTOR = enum.auto() + ASSET_LINK = enum.auto() def read_aas_xml_element(file: PathOrIO, construct: XMLConstructables, failsafe: bool = True, stripped: bool = False, @@ -1414,6 +1468,10 @@ def read_aas_xml_element(file: PathOrIO, construct: XMLConstructables, failsafe: # type aliases elif construct == XMLConstructables.VALUE_LIST: constructor = decoder_.construct_value_list + elif construct == XMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR: + constructor = decoder_.construct_asset_administration_shell_descriptor + elif construct == XMLConstructables.SUBMODEL_DESCRIPTOR: + constructor = decoder_.construct_submodel_descriptor else: raise ValueError(f"{construct.name} cannot be constructed!") diff --git a/sdk/basyx/aas/model/__init__.py b/sdk/basyx/aas/model/__init__.py index e541968b5..1dcc29966 100644 --- a/sdk/basyx/aas/model/__init__.py +++ b/sdk/basyx/aas/model/__init__.py @@ -7,14 +7,16 @@ from basyx.aas.model import AssetAdministrationShell, Submodel, Property """ - +from __future__ import absolute_import from .aas import * from .base import * from .submodel import * from .provider import * from .concept import ConceptDescription from . import datatypes - +from .aas_descriptor import AssetAdministrationShellDescriptor +from .descriptor import * +from .submodel_descriptor import SubmodelDescriptor # A mapping of BaSyx Python SDK implementation classes to the corresponding `KeyTypes` enum members for all classes # that are covered by this enum. KEY_TYPES_CLASSES: Dict[Type[Referable], KeyTypes] = { diff --git a/sdk/basyx/aas/model/aas.py b/sdk/basyx/aas/model/aas.py index 684a1ff06..dd3a12c23 100644 --- a/sdk/basyx/aas/model/aas.py +++ b/sdk/basyx/aas/model/aas.py @@ -172,3 +172,14 @@ def __init__(self, self.submodel: Set[base.ModelReference[Submodel]] = set() if submodel is None else submodel self.embedded_data_specifications: List[base.EmbeddedDataSpecification] = list(embedded_data_specifications) self.extension = base.NamespaceSet(self, [("name", True)], extension) + +class AssetLink: + + def __init__(self, name: base.LabelType, value: base.Identifier): + if not name: + raise ValueError("AssetLink 'name' must be a non-empty string.") + if not value: + raise ValueError("AssetLink 'value' must be a non-empty string.") + self.name = name + self.value = value + \ No newline at end of file diff --git a/sdk/basyx/aas/model/aas_descriptor.py b/sdk/basyx/aas/model/aas_descriptor.py new file mode 100644 index 000000000..a4051abaf --- /dev/null +++ b/sdk/basyx/aas/model/aas_descriptor.py @@ -0,0 +1,67 @@ +# coding: utf-8 + +from __future__ import absolute_import +from datetime import date, datetime + +from typing import List, Dict, Optional,Iterable, Set + +from . import base, _string_constraints, aas +from . import descriptor +from .submodel_descriptor import SubmodelDescriptor +import re + +class AssetAdministrationShellDescriptor(descriptor.Descriptor): + + def __init__(self, + id_: base.Identifier, + administration: Optional[base.AdministrativeInformation] = None, + asset_kind: Optional[base.AssetKind] = None, + asset_type: Optional[base.Identifier] = None, + endpoints: Optional[List[descriptor.Endpoint]] = None, + global_asset_id: Optional[base.Identifier] = None, + id_short: Optional[base.NameType] = None, + specific_asset_id: Iterable[base.SpecificAssetId] = (), + submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, + description: Optional[base.MultiLanguageTextType] = None, + display_name: Optional[base.MultiLanguageNameType] = None, + extension: Iterable[base.Extension] = ()): + """AssetAdministrationShellDescriptor - + + Nur das 'id'-Feld (id_) ist zwingend erforderlich. Alle anderen Felder erhalten Defaultwerte. + """ + super().__init__() + self.administration: Optional[base.AdministrativeInformation] = administration + self.asset_kind: Optional[base.AssetKind] = asset_kind + self.asset_type: Optional[base.Identifier] = asset_type + self.endpoints: Optional[List[descriptor.Endpoint]] = endpoints if endpoints is not None else [] # leere Liste, falls nicht gesetzt + self.global_asset_id: Optional[base.Identifier] = global_asset_id + self.id_short: Optional[base.NameType] = id_short + self.id: base.Identifier = id_ + self._specific_asset_id: base.ConstrainedList[base.SpecificAssetId] = base.ConstrainedList( + specific_asset_id, + item_set_hook=self._check_constraint_set_spec_asset_id, + item_del_hook=self._check_constraint_del_spec_asset_id + ) + self.submodel_descriptors = submodel_descriptors if submodel_descriptors is not None else [] + self.description: Optional[base.MultiLanguageTextType] = description + self.display_name: Optional[base.MultiLanguageNameType] = display_name + self.extension = base.NamespaceSet(self, [("name", True)], extension) + + @property + def specific_asset_id(self) -> base.ConstrainedList[base.SpecificAssetId]: + return self._specific_asset_id + + @specific_asset_id.setter + def specific_asset_id(self, specific_asset_id: Iterable[base.SpecificAssetId]) -> None: + # constraints are checked via _check_constraint_set_spec_asset_id() in this case + self._specific_asset_id[:] = specific_asset_id + + def _check_constraint_set_spec_asset_id(self, items_to_replace: List[base.SpecificAssetId], + new_items: List[base.SpecificAssetId], + old_list: List[base.SpecificAssetId]) -> None: + self._validate_aasd_131(self.global_asset_id, + len(old_list) - len(items_to_replace) + len(new_items) > 0) + + def _check_constraint_del_spec_asset_id(self, _item_to_del: base.SpecificAssetId, + old_list: List[base.SpecificAssetId]) -> None: + self._validate_aasd_131(self.global_asset_id, len(old_list) > 1) diff --git a/sdk/basyx/aas/model/descriptor.py b/sdk/basyx/aas/model/descriptor.py new file mode 100644 index 000000000..d9071fc84 --- /dev/null +++ b/sdk/basyx/aas/model/descriptor.py @@ -0,0 +1,133 @@ +# coding: utf-8 + +from __future__ import absolute_import + +import abc +from datetime import date, datetime # noqa: F401 + +from typing import List, Dict, Optional,Iterable, Set + +from enum import Enum +import re + +from . import base, _string_constraints + +class Descriptor(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __init__(self, description: Optional[base.MultiLanguageTextType] = None, display_name: Optional[base.MultiLanguageNameType] = None, extension: Iterable[base.Extension] = ()): + + super().__init__() + self.namespace_element_sets: List[NamespaceSet] = [] + self.description: Optional[base.MultiLanguageTextType] = description + self.display_name: Optional[base.MultiLanguageNameType] = display_name + self.extension = base.NamespaceSet(self, [("name", True)], extension) + + @property + def description(self) -> Optional[base.MultiLanguageTextType]: + return self._description + + @description.setter + def description(self, value: Optional[base.MultiLanguageTextType]): + self._description = value + + @property + def display_name(self) -> Optional[base.MultiLanguageNameType]: + return self._display_name + + @display_name.setter + def display_name(self, value: Optional[base.MultiLanguageNameType]): + self._display_name = value + + def commit(self): + pass + def update(self): + pass + def update_from(self, other: "Referable", update_source: bool = False): + pass + +class SecurityTypeEnum(Enum): + NONE = "NONE" + RFC_TLSA = "RFC_TLSA" + W3C_DID = "W3C_DID" + +class SecurityAttributeObject: + def __init__(self, type_: SecurityTypeEnum, key: str, value: str): + + if not isinstance(type_, SecurityTypeEnum): + raise ValueError(f"Invalid security type: {type_}. Must be one of {list(SecurityTypeEnum)}") + if not key or not isinstance(key, str): + raise ValueError("Key must be a non-empty string.") + if not value or not isinstance(value, str): + raise ValueError("Value must be a non-empty string.") + self.type = type_ + self.key = key + self.value = value + + +class ProtocolInformation: + + def __init__( + self, + href: str, + endpoint_protocol: Optional[str] = None, + endpoint_protocol_version: Optional[List[str]] = None, + subprotocol: Optional[str] = None, + subprotocol_body: Optional[str] = None, + subprotocol_body_encoding: Optional[str] = None, + security_attributes: Optional[List[SecurityAttributeObject]] = None + ): + if not href or not isinstance(href, str): + raise ValueError("href must be a non-empty string representing a valid URL.") + + self.href = href + self.endpoint_protocol = endpoint_protocol + self.endpoint_protocol_version = endpoint_protocol_version or [] + self.subprotocol = subprotocol + self.subprotocol_body = subprotocol_body + self.subprotocol_body_encoding = subprotocol_body_encoding + self.security_attributes = security_attributes or [] +class Endpoint: + + INTERFACE_SHORTNAMES = { + "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", + "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", + "CD-REPOSITORY", "AAS-DISCOVERY" + } + VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") + + def __init__(self, interface: base.NameType, protocol_information: ProtocolInformation): # noqa: E501 + + self.interface = interface + self.protocol_information = protocol_information + + @property + def interface(self) -> str: + return self._interface + + @interface.setter + def interface(self, interface: base.NameType): + if interface is None: + raise ValueError("Invalid value for `interface`, must not be `None`") + if not self.is_valid_interface(interface): + raise ValueError(f"Invalid interface format: {interface}. Expected format: '-', ") + + self._interface = interface + + @classmethod + def is_valid_interface(cls, interface: base.NameType) -> bool: + parts = interface.split("-", 1) + if len(parts) != 2: + return False + short_name, version = parts + return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) + + @property + def protocol_information(self) -> ProtocolInformation: + return self._protocol_information + + @protocol_information.setter + def protocol_information(self, protocol_information: ProtocolInformation): + if protocol_information is None: + raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 + + self._protocol_information = protocol_information \ No newline at end of file diff --git a/sdk/basyx/aas/model/submodel_descriptor.py b/sdk/basyx/aas/model/submodel_descriptor.py new file mode 100644 index 000000000..62081d6a6 --- /dev/null +++ b/sdk/basyx/aas/model/submodel_descriptor.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from __future__ import absolute_import +from datetime import date, datetime + +from typing import List, Dict, Optional,Iterable, Set + +from .base import AdministrativeInformation +from . import descriptor +from . import base +from .base import Reference +import re + + +class SubmodelDescriptor(descriptor.Descriptor): + + def __init__(self, id_: base.Identifier, endpoints: List[descriptor.Endpoint], + administration: Optional[base.AdministrativeInformation] = None, + id_short: Optional[base.NameType]=None, semantic_id: Optional[base.Reference]=None, + supplemental_semantic_id: Iterable[base.Reference] = ()): + + super().__init__() + self.id: base.Identifier = id_ + self.endpoints: List[descriptor.Endpoint] = endpoints + self.administration: Optional[base.AdministrativeInformation] = administration + self.id_short: Optional[base.NameType] = id_short + self.semantic_id: Optional[base.Reference] = semantic_id + self.supplemental_semantic_id: base.ConstrainedList[base.Reference] = \ + base.ConstrainedList(supplemental_semantic_id) diff --git a/test.py b/test.py new file mode 100644 index 000000000..02fa48042 --- /dev/null +++ b/test.py @@ -0,0 +1,67 @@ +""" +from basyx.aas.adapter.resolver import * +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8084, ResolverAPI(create_full_example()), + use_debugger=True, use_reloader=True) + +from basyx.aas.adapter.registry import * +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8083, RegistryAPI(create_full_example()), + use_debugger=True, use_reloader=True) + + +from basyx.aas.adapter.http import * +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), + use_debugger=True, use_reloader=True) +""" + +import multiprocessing +from werkzeug.serving import run_simple +from basyx.aas.examples.data.example_aas import create_full_example +from basyx.aas.adapter.resolver import ResolverAPI +from basyx.aas.adapter.registry import RegistryAPI +from basyx.aas.adapter.http import * +import basyx.aas.adapter.aasx as aasx + +def run_resolver_api(): + run_simple("localhost", 8084, ResolverAPI(create_full_example()), + use_debugger=True, + use_reloader=False) + +def run_server_api(): + run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), + use_debugger=True, + use_reloader=False) + +def run_registry_api(): + run_simple("localhost", 8083, RegistryAPI(create_full_example()), + use_debugger=True, + use_reloader=False) + +if __name__ == "__main__": + resolver_process = multiprocessing.Process(target=run_resolver_api) + registry_process = multiprocessing.Process(target=run_registry_api) + server_process = multiprocessing.Process(target=run_server_api) + + # Starten der Prozesse + resolver_process.start() + registry_process.start() + server_process.start() + + # Warten auf Prozesse + resolver_process.join() + registry_process.join() + server_process.join() + + + From 7204ae281b1e6f02f21385e7c2e7cb69b99cc015 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Mon, 31 Mar 2025 12:31:17 +0200 Subject: [PATCH 02/76] Remove test.py from repository and add it to .gitignore --- Discovery Server/app/main.py | 46 ------------------------- Registry Server/app/main.py | 46 ------------------------- test.py | 67 ------------------------------------ 3 files changed, 159 deletions(-) delete mode 100644 Discovery Server/app/main.py delete mode 100644 Registry Server/app/main.py delete mode 100644 test.py diff --git a/Discovery Server/app/main.py b/Discovery Server/app/main.py deleted file mode 100644 index f3eed03ec..000000000 --- a/Discovery Server/app/main.py +++ /dev/null @@ -1,46 +0,0 @@ -import os -import pathlib -import sys - -from basyx.aas import model, adapter -from basyx.aas.adapter import aasx - -from basyx.aas.backend.local_file import LocalFileObjectStore -from basyx.aas.adapter.registry import RegistryAPI - -storage_path = os.getenv("STORAGE_PATH", "/storage") -storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") -base_path = os.getenv("API_BASE_PATH") - -wsgi_optparams = {} - -if base_path is not None: - wsgi_optparams["base_path"] = base_path - -if storage_type == "LOCAL_FILE_BACKEND": - application = RegistryAPI(LocalFileObjectStore(storage_path), aasx.DictSupplementaryFileContainer(), **wsgi_optparams) - -elif storage_type in "LOCAL_FILE_READ_ONLY": - object_store: model.DictObjectStore = model.DictObjectStore() - file_store: aasx.DictSupplementaryFileContainer = aasx.DictSupplementaryFileContainer() - - for file in pathlib.Path(storage_path).iterdir(): - if not file.is_file(): - continue - print(f"Loading {file}") - - if file.suffix.lower() == ".json": - with open(file) as f: - adapter.json.read_aas_json_file_into(object_store, f) - elif file.suffix.lower() == ".xml": - with open(file) as f: - adapter.xml.read_aas_xml_file_into(object_store, file) - elif file.suffix.lower() == ".aasx": - with aasx.AASXReader(file) as reader: - reader.read_into(object_store=object_store, file_store=file_store) - - application = RegistryAPI(object_store, file_store, **wsgi_optparams) - -else: - print(f"STORAGE_TYPE must be either LOCAL_FILE or LOCAL_FILE_READ_ONLY! Current value: {storage_type}", - file=sys.stderr) diff --git a/Registry Server/app/main.py b/Registry Server/app/main.py deleted file mode 100644 index f3eed03ec..000000000 --- a/Registry Server/app/main.py +++ /dev/null @@ -1,46 +0,0 @@ -import os -import pathlib -import sys - -from basyx.aas import model, adapter -from basyx.aas.adapter import aasx - -from basyx.aas.backend.local_file import LocalFileObjectStore -from basyx.aas.adapter.registry import RegistryAPI - -storage_path = os.getenv("STORAGE_PATH", "/storage") -storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") -base_path = os.getenv("API_BASE_PATH") - -wsgi_optparams = {} - -if base_path is not None: - wsgi_optparams["base_path"] = base_path - -if storage_type == "LOCAL_FILE_BACKEND": - application = RegistryAPI(LocalFileObjectStore(storage_path), aasx.DictSupplementaryFileContainer(), **wsgi_optparams) - -elif storage_type in "LOCAL_FILE_READ_ONLY": - object_store: model.DictObjectStore = model.DictObjectStore() - file_store: aasx.DictSupplementaryFileContainer = aasx.DictSupplementaryFileContainer() - - for file in pathlib.Path(storage_path).iterdir(): - if not file.is_file(): - continue - print(f"Loading {file}") - - if file.suffix.lower() == ".json": - with open(file) as f: - adapter.json.read_aas_json_file_into(object_store, f) - elif file.suffix.lower() == ".xml": - with open(file) as f: - adapter.xml.read_aas_xml_file_into(object_store, file) - elif file.suffix.lower() == ".aasx": - with aasx.AASXReader(file) as reader: - reader.read_into(object_store=object_store, file_store=file_store) - - application = RegistryAPI(object_store, file_store, **wsgi_optparams) - -else: - print(f"STORAGE_TYPE must be either LOCAL_FILE or LOCAL_FILE_READ_ONLY! Current value: {storage_type}", - file=sys.stderr) diff --git a/test.py b/test.py deleted file mode 100644 index 02fa48042..000000000 --- a/test.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -from basyx.aas.adapter.resolver import * -if __name__ == "__main__": - from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - - run_simple("localhost", 8084, ResolverAPI(create_full_example()), - use_debugger=True, use_reloader=True) - -from basyx.aas.adapter.registry import * -if __name__ == "__main__": - from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - - run_simple("localhost", 8083, RegistryAPI(create_full_example()), - use_debugger=True, use_reloader=True) - - -from basyx.aas.adapter.http import * -if __name__ == "__main__": - from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - - run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), - use_debugger=True, use_reloader=True) -""" - -import multiprocessing -from werkzeug.serving import run_simple -from basyx.aas.examples.data.example_aas import create_full_example -from basyx.aas.adapter.resolver import ResolverAPI -from basyx.aas.adapter.registry import RegistryAPI -from basyx.aas.adapter.http import * -import basyx.aas.adapter.aasx as aasx - -def run_resolver_api(): - run_simple("localhost", 8084, ResolverAPI(create_full_example()), - use_debugger=True, - use_reloader=False) - -def run_server_api(): - run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), - use_debugger=True, - use_reloader=False) - -def run_registry_api(): - run_simple("localhost", 8083, RegistryAPI(create_full_example()), - use_debugger=True, - use_reloader=False) - -if __name__ == "__main__": - resolver_process = multiprocessing.Process(target=run_resolver_api) - registry_process = multiprocessing.Process(target=run_registry_api) - server_process = multiprocessing.Process(target=run_server_api) - - # Starten der Prozesse - resolver_process.start() - registry_process.start() - server_process.start() - - # Warten auf Prozesse - resolver_process.join() - registry_process.join() - server_process.join() - - - From 25cf2821ab6b6497ed19a7e5b0d83bec78fe5963 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 1 Apr 2025 17:26:35 +0200 Subject: [PATCH 03/76] correct discovery server implementation --- .gitignore | 3 + Discovery Server/Dockerfile | 2 +- Registry Server/Dockerfile | 2 +- sdk/basyx/aas/adapter/resolver.py | 119 ++++++++++++------------------ 4 files changed, 54 insertions(+), 72 deletions(-) diff --git a/.gitignore b/.gitignore index dc7eddbb6..289d593f5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ sdk/basyx/version.py # ignore the content of the server storage server/storage/ + +# local testing file, do not commit +test.py diff --git a/Discovery Server/Dockerfile b/Discovery Server/Dockerfile index 6dc3c4cac..3d52a15ab 100644 --- a/Discovery Server/Dockerfile +++ b/Discovery Server/Dockerfile @@ -39,7 +39,7 @@ RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] -COPY ./app /app +COPY ../server/app /app WORKDIR /app CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Registry Server/Dockerfile b/Registry Server/Dockerfile index 6dc3c4cac..3d52a15ab 100644 --- a/Registry Server/Dockerfile +++ b/Registry Server/Dockerfile @@ -39,7 +39,7 @@ RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] -COPY ./app /app +COPY ../server/app /app WORKDIR /app CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/sdk/basyx/aas/adapter/resolver.py b/sdk/basyx/aas/adapter/resolver.py index 6e3261c74..4d2231a00 100644 --- a/sdk/basyx/aas/adapter/resolver.py +++ b/sdk/basyx/aas/adapter/resolver.py @@ -36,7 +36,7 @@ from .http import get_response_type, http_exception_to_response, is_stripped_request -from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple +from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set T = TypeVar("T") @@ -44,12 +44,14 @@ BASE64URL_ENCODING = "utf-8" # Klasse, die das externe Mapping verwaltet - +from basyx.aas import model class ResolverAPI: def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.0"): self.object_store: model.AbstractObjectStore = object_store + self.aas_to_assets: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} + self.asset_to_aas: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} self.url_map = werkzeug.routing.Map([ Submount(base_path, [ Rule("/lookup/shellsByAssetLink", methods=["POST"], @@ -129,7 +131,6 @@ def handle_request(self, request: Request): endpoint, values = map_adapter.match() return endpoint(request, values, response_t=response_t, map_adapter=map_adapter) - # any raised error that leaves this function will cause a 500 internal server error # so catch raised http exceptions and return them except werkzeug.exceptions.HTTPException as e: @@ -142,25 +143,14 @@ def search_all_aas_ids_by_asset_link(self, request: Request, url_args: Dict, res Returns a list of Asset Administration Shell IDs linked to specific asset identifiers or the global asset ID """ asset_links = HTTPApiDecoder.request_body_list(request, model.AssetLink, - True) - - matching_aas_ids = [] + False) + matching_aas_ids = set() for asset_link in asset_links: - if asset_link.name == "globalAssetId": - for aas in self._get_all_obj_of_type( - model.AssetAdministrationShell): - if aas.asset_information.global_asset_id == asset_link.value: - matching_aas_ids.append(aas.id_) - else: - for aas in self._get_all_obj_of_type( - model.AssetAdministrationShell): - for specific_asset_id in aas.asset_information.specific_asset_id: - if specific_asset_id.name == asset_link.name and specific_asset_id.value == asset_link.value: - matching_aas_ids.append(aas.id) - - paginated_ids, end_index = self._get_slice(request, iter( - matching_aas_ids)) - return response_t(matching_aas_ids, cursor=end_index) + for asset_id, aas_ids in self.asset_to_aas.items(): + if asset_link.name==asset_id.name and asset_link.value==asset_id.value: + matching_aas_ids=aas_ids + matching_aas_ids = list(matching_aas_ids) + return response_t(matching_aas_ids) def get_all_asset_links_by_id(self, request: Request, url_args: Dict, @@ -171,22 +161,12 @@ def get_all_asset_links_by_id(self, request: Request, The global asset ID is returned as specific asset ID with "name" equal to "globalAssetId" (see Constraint AASd-116). """ aas_identifier = url_args.get("aas_id") - try: - aas = self._get_obj_ts(aas_identifier, - model.AssetAdministrationShell) - except NotFound: - raise NotFound( - f"Asset Administration Shell with ID '{aas_identifier}' not found.") - - specific_asset_ids = list(aas.asset_information.specific_asset_id) - - if aas.asset_information.global_asset_id: - specific_asset_ids.append(model.SpecificAssetId( - name="globalAssetId", - value=aas.asset_information.global_asset_id - )) - - return response_t(specific_asset_ids) + matching_asset_ids = set() + for ass_id, asset_ids in self.aas_to_assets.items(): + if ass_id==aas_identifier: + matching_asset_ids=asset_ids + matching_asset_ids = list(matching_asset_ids) + return response_t(matching_asset_ids) def post_all_asset_links_by_id(self, request: Request, url_args: Dict, @@ -196,30 +176,29 @@ def post_all_asset_links_by_id(self, request: Request, Creates specific asset identifiers linked to an Asset Administration Shell to edit discoverable content. """ aas_identifier = url_args.get("aas_id") - - # Try to retrieve the Asset Administration Shell by its identifier - try: - aas = self._get_obj_ts(aas_identifier, - model.AssetAdministrationShell) - except NotFound: - raise NotFound( - f"Asset Administration Shell with ID '{aas_identifier}' not found.") - # Decode the request body to retrieve specific asset identifiers specific_asset_ids = HTTPApiDecoder.request_body_list( - request, model.SpecificAssetId, False) + request, model.SpecificAssetId, False) + + # Ensure the aas_identifier exists in the dictionary + if aas_identifier not in self.aas_to_assets: + self.aas_to_assets[aas_identifier] = set() - # Check for conflicts with existing specific asset identifiers - existing_ids = {id.value for id in - aas.asset_information.specific_asset_id} + # Add specific asset IDs to the aas_to_assets dictionary + asset_ids = self.aas_to_assets[aas_identifier] for specific_asset_id in specific_asset_ids: - if specific_asset_id.value in existing_ids: - raise Conflict( - f"Specific asset identifier with value '{specific_asset_id.value}' already exists.") - else: - aas.asset_information.specific_asset_id.add(specific_asset_id) + asset_ids.add(specific_asset_id) + + # Update asset_to_aas dictionary + for specific_asset_id in specific_asset_ids: + if specific_asset_id not in self.asset_to_aas: + self.asset_to_aas[specific_asset_id] = set() + self.asset_to_aas[specific_asset_id].add(aas_identifier) + + # Convert sets to lists for JSON serialization + serializable_aas_to_assets = {key: list(value) for key, value in self.aas_to_assets.items()} - return response_t(specific_asset_ids) + return response_t(serializable_aas_to_assets) def delete_all_asset_links_by_id(self, request: Request, url_args: Dict, @@ -229,20 +208,20 @@ def delete_all_asset_links_by_id(self, request: Request, Deletes all specific asset identifiers linked to an Asset Administration Shell to edit discoverable content. """ aas_identifier = url_args.get("aas_id") - - # Try to retrieve the Asset Administration Shell by its identifier - try: - aas = self._get_obj_ts(aas_identifier, - model.AssetAdministrationShell) - except NotFound: - raise NotFound( - f"Asset Administration Shell with ID '{aas_identifier}' not found.") - - # Clear all specific asset identifiers from the AAS - aas.asset_information.specific_asset_id.clear() - - # Return 204 No Content response - return Response(status=204) + # Ensure the aas_identifier exists in the dictionary + if aas_identifier in self.aas_to_assets: + # Remove the links from aas_to_asset dictionary + del self.aas_to_assets[aas_identifier] + + # Remove the aas_identifier from asset_to_aas dictionary + for asset_id, aas_ids in list(self.asset_to_aas.items()): + if aas_identifier in aas_ids: + aas_ids.discard(aas_identifier) + # Clean up empty sets + if not aas_ids: + del self.asset_to_aas[asset_id] + + return response_t() if __name__ == "__main__": From b68efaa08bed1473f8728cfc1cc0b30b148da902 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 2 Apr 2025 11:40:36 +0200 Subject: [PATCH 04/76] remove unused code --- sdk/basyx/aas/adapter/resolver.py | 52 +++---------------------------- 1 file changed, 4 insertions(+), 48 deletions(-) diff --git a/sdk/basyx/aas/adapter/resolver.py b/sdk/basyx/aas/adapter/resolver.py index 4d2231a00..c720d29cc 100644 --- a/sdk/basyx/aas/adapter/resolver.py +++ b/sdk/basyx/aas/adapter/resolver.py @@ -8,33 +8,20 @@ This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". """ -import abc import base64 -import binascii import datetime -import enum import io import json import itertools -from lxml import etree import werkzeug.exceptions import werkzeug.routing -import werkzeug.urls -import werkzeug.utils from werkzeug.exceptions import BadRequest, Conflict, NotFound, UnprocessableEntity from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response -from werkzeug.datastructures import FileStorage from basyx.aas import model -from ._generic import XML_NS_MAP -from .xml import XMLConstructables, read_aas_xml_element, xml_serialization, object_to_xml_element -from .json import AASToJsonEncoder, StrictAASFromJsonDecoder, StrictStrippedAASFromJsonDecoder -from . import aasx -from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder - -from .http import get_response_type, http_exception_to_response, is_stripped_request +from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set @@ -73,22 +60,6 @@ def __call__(self, environ, start_response) -> Iterable[bytes]: response: Response = self.handle_request(Request(environ)) return response(environ, start_response) - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[ - model.provider._IT]) -> model.provider._IT: - identifiable = self.object_store.get(identifier) - if not isinstance(identifiable, type_): - raise NotFound( - f"No {type_.__name__} with {identifier} found!") - identifiable.update() - return identifiable - - def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> \ - Iterator[model.provider._IT]: - for obj in self.object_store: - if isinstance(obj, type_): - obj.update() - yield obj - @classmethod def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: limit_str = request.args.get('limit', default="10") @@ -104,22 +75,6 @@ def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T paginated_slice = itertools.islice(iterator, start_index, end_index) return paginated_slice, end_index - def _get_assets(self, request: Request) -> Tuple[ - Iterator[model.SpecificAssetId], int]: - specific_asset_ids: Iterator[ - model.SpecificAssetId] = self._get_all_obj_of_type( - model.SpecificAssetId) - - asset_name = request.args.get("name") - if asset_name is not None: - specific_asset_ids = filter( - lambda asset: asset.name == asset_name, - specific_asset_ids) - - paginated_assets, end_index = self._get_slice(request, - specific_asset_ids) - return paginated_assets, end_index - def handle_request(self, request: Request): map_adapter: MapAdapter = self.url_map.bind_to_environ( request.environ) @@ -150,7 +105,9 @@ def search_all_aas_ids_by_asset_link(self, request: Request, url_args: Dict, res if asset_link.name==asset_id.name and asset_link.value==asset_id.value: matching_aas_ids=aas_ids matching_aas_ids = list(matching_aas_ids) - return response_t(matching_aas_ids) + paginated_slice, cursor= self._get_slice(request, matching_aas_ids) + + return response_t(list(paginated_slice), cursor=cursor) def get_all_asset_links_by_id(self, request: Request, url_args: Dict, @@ -223,7 +180,6 @@ def delete_all_asset_links_by_id(self, request: Request, return response_t() - if __name__ == "__main__": from werkzeug.serving import run_simple from basyx.aas.examples.data.example_aas import create_full_example From b590e1ce613dbd7036aa1062b6bc2843b4a8c436 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Mon, 14 Apr 2025 11:13:31 +0200 Subject: [PATCH 05/76] add in-memory storage and adapt README --- Discovery Server/Dockerfile | 2 +- Discovery Server/README.md | 130 +++++++---------- Discovery Server/app/main.py | 17 +++ Discovery Server/compose.yml | 2 - sdk/basyx/aas/adapter/discovery.py | 224 +++++++++++++++++++++++++++++ sdk/basyx/aas/adapter/resolver.py | 188 ------------------------ 6 files changed, 290 insertions(+), 273 deletions(-) create mode 100644 Discovery Server/app/main.py create mode 100644 sdk/basyx/aas/adapter/discovery.py delete mode 100644 sdk/basyx/aas/adapter/resolver.py diff --git a/Discovery Server/Dockerfile b/Discovery Server/Dockerfile index 3d52a15ab..6dc3c4cac 100644 --- a/Discovery Server/Dockerfile +++ b/Discovery Server/Dockerfile @@ -39,7 +39,7 @@ RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] -COPY ../server/app /app +COPY ./app /app WORKDIR /app CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Discovery Server/README.md b/Discovery Server/README.md index 339226c53..fe66542ce 100644 --- a/Discovery Server/README.md +++ b/Discovery Server/README.md @@ -1,85 +1,51 @@ -# Eclipse BaSyx Python SDK - HTTP Server - -This package contains a Dockerfile to spin up an exemplary HTTP/REST server following the [Specification of the AAS Part 2 API][6] with ease. -The server currently implements the following interfaces: - -- [Asset Administration Shell Repository Service][4] -- [Submodel Repository Service][5] - -It uses the [HTTP API][1] and the [AASX][7], [JSON][8], and [XML][9] Adapters of the [BaSyx Python SDK][3], to serve regarding files from a given directory. -The files are only read, changes won't persist. - -Alternatively, the container can also be told to use the [Local-File Backend][2] instead, which stores AAS and Submodels as individual JSON files and allows for persistent changes (except supplementary files, i.e. files referenced by `File` submodel elements). -See [below](#options) on how to configure this. - -## Building -The container image can be built via: -``` -$ docker buildx build -t basyx-python-sdk-http-server . -``` - -## Running - -### Storage -The container needs to be provided with the directory `/storage` to store AAS and Submodel files: AASX, JSON, XML or JSON files of Local-File Backend. - -This directory can be mapped via the `-v` option from another image or a local directory. -To map the directory `storage` inside the container, `-v ./storage:/storage` can be used. -The directory `storage` will be created in the current working directory, if it doesn't already exist. - -### Port -The HTTP server inside the container listens on port 80 by default. -To expose it on the host on port 8080, use the option `-p 8080:80` when running it. - -### Options -The container can be configured via environment variables: -- `API_BASE_PATH` determines the base path under which all other API paths are made available. - Default: `/api/v3.0` -- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: - - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve AASX, JSON, XML files from the storage directory. - The files are not modified, all changes done via the API are only stored in memory. - - When instead set to `LOCAL_FILE`, the server makes use of the [LocalFileBackend][2], where AAS and Submodels are persistently stored as JSON files. - Supplementary files, i.e. files referenced by `File` submodel elements, are not stored in this case. -- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. - -### Running Examples - -Putting it all together, the container can be started via the following command: -``` -$ docker run -p 8080:80 -v ./storage:/storage basyx-python-sdk-http-server -``` - -Since Windows uses backslashes instead of forward slashes in paths, you'll have to adjust the path to the storage directory there: -``` -> docker run -p 8080:80 -v .\storage:/storage basyx-python-sdk-http-server -``` - -Per default, the server will use the `LOCAL_FILE_READ_ONLY` storage type and serve the API under `/api/v3.0` and read files from `/storage`. If you want to change this, you can do so like this: -``` -$ docker run -p 8080:80 -v ./storage2:/storage2 -e API_BASE_PATH=/api/v3.1 -e STORAGE_TYPE=LOCAL_FILE_BACKEND -e STORAGE_PATH=/storage2 basyx-python-sdk-http-server -``` - -## Building and running the image with docker-compose - -The container image can also be built and run via: -``` -$ docker compose up -``` - -This is the exemplary `docker-compose` file for the server: -````yaml -services: - app: - build: . - ports: - - "8080:80" - volumes: - - ./storage:/storage - -```` - -Here files are read from `/storage` and the server can be accessed at http://localhost:8080/api/v3.0/ from your host system. -To get a different setup this compose.yaml file can be adapted and expanded. +# Eclipse BaSyx Python SDK - Dicovery Service + +This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Discovery Service**. +It provides basic discovery functionality for AAS IDs and their corresponding assets, as specified in the official [Discovery Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/DiscoveryServiceSpecification/V3.1.0_SSP-001). + +## Overview + +The Discovery Service is a core component in the Asset Administration Shell ecosystem. Its main responsibility is to store and retrieve relations between AAS identifiers and asset identifiers. It acts as a lookup service for resolving asset-related queries to corresponding AAS. + +This implementation supports: + +- Adding links between AAS and assets +- Querying AAS by asset links +- Querying asset links by AAS ID +- Removing AAS-related asset links +- Configurable in-memory or MongoDB-based persistent storage + +## Features + +| Feature | Description | +|---------------------------------------------|-----------------------------------------------------------------------------| +| `add_asset_links` | Register specific asset identifiers linked to an AAS | +| `get_asset_links_by_aas` | Retrieve asset links associated with an AAS | +| `search_aas_by_asset_link` | Find AAS identifiers by providing asset link values | +| `remove_asset_links_for_aas` | Delete all asset links associated with a specific AAS | + +## Specification Compliance + +- Complies with: **Discovery Service Specification v3.1.0_SSP-001** + +## Configuration + +The service can be configured to use either: + +- **In-memory storage** (default): Temporary data storage that resets on service restart. +- **MongoDB storage**: Persistent backend storage using MongoDB. + +### Configuration via Environment Variables + +| Variable | Description | Default | +|----------------|--------------------------------------------|-------------------------| +| `STORAGE_TYPE` | `inmemory` or `mongodb` | `inmemory` | +| `MONGODB_URI` | MongoDB connection URI | `mongodb://localhost:27017` | +| `MONGODB_DBNAME` | Name of the MongoDB database | `basyx_registry` | + +## Deployment via Docker + +A `Dockerfile` and `docker-compose.yml` are provided for simple deployment. ## Acknowledgments diff --git a/Discovery Server/app/main.py b/Discovery Server/app/main.py new file mode 100644 index 000000000..8ee4d1cb6 --- /dev/null +++ b/Discovery Server/app/main.py @@ -0,0 +1,17 @@ +import os +from basyx.aas.adapter.discovery import DiscoveryAPI, MongoDiscoveryStore,InMemoryDiscoveryStore + +def get_discovery_store(): + storage_type = os.getenv("STORAGE_TYPE", "inmemory").lower() + if storage_type == "mongodb": + uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") + dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") + return MongoDiscoveryStore(uri=uri, db_name=dbname) + else: + return InMemoryDiscoveryStore() + + +if __name__ == "__main__": + persistent_store = get_discovery_store() + run_simple("localhost", 8084, DiscoveryAPI(persistent_store=persistent_store), + use_debugger=True, use_reloader=True) \ No newline at end of file diff --git a/Discovery Server/compose.yml b/Discovery Server/compose.yml index 90840a09b..08db6be2d 100644 --- a/Discovery Server/compose.yml +++ b/Discovery Server/compose.yml @@ -3,5 +3,3 @@ services: build: . ports: - "8084:80" - volumes: - - ./storage:/storage diff --git a/sdk/basyx/aas/adapter/discovery.py b/sdk/basyx/aas/adapter/discovery.py new file mode 100644 index 000000000..3c5beab12 --- /dev/null +++ b/sdk/basyx/aas/adapter/discovery.py @@ -0,0 +1,224 @@ +import itertools +import werkzeug.exceptions +from werkzeug.wrappers import Request, Response +from basyx.aas import model +from .http import APIResponse, http_exception_to_response, get_response_type, HTTPApiDecoder +from werkzeug.routing import MapAdapter, Rule, Submount +from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request +from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set + +import copy +from pymongo import MongoClient +from pymongo.collection import Collection + +import json +from basyx.aas.adapter.json import AASToJsonEncoder + +def specific_asset_to_json_obj(asset_id: model.SpecificAssetId) -> dict: + # Encode the asset to a JSON string and then decode to a dict. + json_str = AASToJsonEncoder().encode(asset_id) + return json.loads(json_str) + +class InMemoryDiscoveryStore: + def __init__(self): + self.aas_to_assets: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} + self.asset_to_aas: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} + + def get_asset_links_by_aas(self, aas_identifier: model.Identifier) -> List[dict]: + key = aas_identifier + return list(self.aas_to_assets.get(key, set())) + + def add_asset_links(self, aas_identifier: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: + key = aas_identifier + serialized_assets = [specific_asset_to_json_obj(aid) for aid in asset_ids] + if key in self.aas_to_assets: + for asset in serialized_assets: + if asset not in self.aas_to_assets[key]: + self.aas_to_assets[key].append(asset) + else: + self.aas_to_assets[key] = serialized_assets[:] + + def delete_asset_links_by_aas(self, aas_identifier: model.Identifier) -> None: + key = aas_identifier + if key in self.aas_to_assets: + del self.aas_to_assets[key] + + def search_aas_by_asset_link(self, asset_link: model.AssetLink) -> List[str]: + result = [] + for asset_key, aas_ids in self.asset_to_aas.items(): + expected_key = f"{asset_link.name}:{asset_link.value}" + if asset_key == expected_key: + result.extend(list(aas_ids)) + return result + + def add_aas_for_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + asset_key = f"{asset_id.name}:{asset_id.value}" + aas_key = aas_identifier + if asset_key in self.asset_to_aas: + self.asset_to_aas[asset_key].add(aas_key) + else: + self.asset_to_aas[asset_key] = {aas_key} + + def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + asset_key = f"{asset_id.name}:{asset_id.value}" + aas_key = aas_identifier + if asset_key in self.asset_to_aas: + self.asset_to_aas[asset_key].discard(aas_key) + +class MongoDiscoveryStore: + def __init__(self, + uri: str = "mongodb://localhost:27017", + db_name: str = "basyx", + coll_aas_to_assets: str = "aas_to_assets", + coll_asset_to_aas: str = "asset_to_aas"): + self.client = MongoClient(uri) + self.db = self.client[db_name] + self.coll_aas_to_assets: Collection = self.db[coll_aas_to_assets] + self.coll_asset_to_aas: Collection = self.db[coll_asset_to_aas] + # Create an index for fast asset reverse lookups. + self.coll_asset_to_aas.create_index("_id") + + def get_asset_links_by_aas(self, aas_identifier: model.Identifier) -> List[dict]: + key = aas_identifier + doc = self.coll_aas_to_assets.find_one({"_id": key}) + return doc["asset_ids"] if doc and "asset_ids" in doc else [] + + def add_asset_links(self, aas_identifier: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: + key = aas_identifier + # Convert each SpecificAssetId using the serialization helper. + serializable_assets = [specific_asset_to_json_obj(aid) for aid in asset_ids] + self.coll_aas_to_assets.update_one( + {"_id": key}, + {"$addToSet": {"asset_ids": {"$each": serializable_assets}}}, + upsert=True + ) + + def delete_asset_links_by_aas(self, aas_identifier: model.Identifier) -> None: + key = aas_identifier + self.coll_aas_to_assets.delete_one({"_id": key}) + + def search_aas_by_asset_link(self, asset_link: model.AssetLink) -> List[str]: + # Query MongoDB for specificAssetIds where 'name' and 'value' match + doc = self.coll_asset_to_aas.find_one({ + "name": asset_link.name, + "value": asset_link.value + }) + return doc["aas_ids"] if doc and "aas_ids" in doc else [] + + def add_aas_for_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + asset_key = str(specific_asset_to_json_obj(asset_id)) + aas_key = aas_identifier + self.coll_asset_to_aas.update_one( + {"_id": asset_key}, + {"$addToSet": {"aas_ids": aas_key}}, + upsert=True + ) + + def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + asset_key = str(specific_asset_to_json_obj(asset_id)) + aas_key = aas_identifier + self.coll_asset_to_aas.update_one( + {"_id": asset_key}, + {"$pull": {"aas_ids": aas_key}} + ) + + + +T = TypeVar("T") + +BASE64URL_ENCODING = "utf-8" + +class DiscoveryAPI: + def __init__(self, + base_path: str = "/api/v3.0", + persistent_store: MongoDiscoveryStore = None): + self.persistent_store = persistent_store or InMemoryDiscoveryStore() + self.url_map = werkzeug.routing.Map([ + Submount(base_path, [ + Rule("/lookup/shellsByAssetLink", methods=["POST"], + endpoint=self.search_all_aas_ids_by_asset_link), + Submount("/lookup/shells", [ + Rule("/", methods=["GET"], + endpoint=self.get_all_asset_links_by_id), + Rule("/", methods=["POST"], + endpoint=self.post_all_asset_links_by_id), + Rule("/", methods=["DELETE"], + endpoint=self.delete_all_asset_links_by_id), + ]), + ]) + ], converters={ + "base64url": Base64URLConverter + }, strict_slashes=False) + + def __call__(self, environ, start_response) -> Iterable[bytes]: + response: Response = self.handle_request(Request(environ)) + return response(environ, start_response) + + def _get_slice(self, request: Request, iterator): + limit_str = request.args.get('limit', default="10") + cursor_str = request.args.get('cursor', default="0") + try: + limit, cursor = int(limit_str), int(cursor_str) + if limit < 0 or cursor < 0: + raise ValueError + except ValueError: + raise werkzeug.exceptions.BadRequest("Cursor and limit must be positive integers!") + paginated_slice = itertools.islice(iterator, cursor, cursor + limit) + return paginated_slice, cursor + limit + + + def handle_request(self, request: Request): + map_adapter: MapAdapter = self.url_map.bind_to_environ( + request.environ) + try: + response_t = get_response_type(request) + except werkzeug.exceptions.NotAcceptable as e: + return e + try: + endpoint, values = map_adapter.match() + return endpoint(request, values, response_t=response_t, + map_adapter=map_adapter) + # any raised error that leaves this function will cause a 500 internal server error + # so catch raised http exceptions and return them + except werkzeug.exceptions.HTTPException as e: + return http_exception_to_response(e, response_t) + + def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + asset_links = HTTPApiDecoder.request_body_list(request, model.AssetLink, False) + matching_aas_keys = set() + for asset_link in asset_links: + aas_keys = self.persistent_store.search_aas_by_asset_link(asset_link) + matching_aas_keys.update(aas_keys) + matching_aas_keys = list(matching_aas_keys) + paginated_slice, cursor = self._get_slice(request, matching_aas_keys) + return response_t(list(paginated_slice), cursor=cursor) + + def get_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + aas_identifier = url_args.get("aas_id") + asset_ids = self.persistent_store.get_asset_links_by_aas(aas_identifier) + return response_t(asset_ids) + + def post_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + aas_identifier = url_args.get("aas_id") + specific_asset_ids = HTTPApiDecoder.request_body_list(request, model.SpecificAssetId, False) + self.persistent_store.add_asset_links(aas_identifier, specific_asset_ids) + for asset_id in specific_asset_ids: + self.persistent_store.add_aas_for_asset_link(asset_id, aas_identifier) + updated = {aas_identifier: self.persistent_store.get_asset_links_by_aas(aas_identifier)} + return response_t(updated) + + def delete_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + aas_identifier = url_args.get("aas_id") + self.persistent_store.delete_asset_links_by_aas(aas_identifier) + for key in list(self.persistent_store.asset_to_aas.keys()): + self.persistent_store.asset_to_aas[key].discard(aas_identifier) + return response_t() +""""" +if __name__ == "__main__": + from werkzeug.serving import run_simple + persistent_store = MongoDiscoveryStore(uri="mongodb://localhost:27017", db_name="basyx_registry") + # run_simple("localhost", 8084, ResolverAPI(), + # use_debugger=True, use_reloader=True) + run_simple("localhost", 8084, ResolverAPI(persistent_store=persistent_store), + use_debugger=True, use_reloader=True) +""" \ No newline at end of file diff --git a/sdk/basyx/aas/adapter/resolver.py b/sdk/basyx/aas/adapter/resolver.py deleted file mode 100644 index c720d29cc..000000000 --- a/sdk/basyx/aas/adapter/resolver.py +++ /dev/null @@ -1,188 +0,0 @@ -# Copyright (c) 2024 the Eclipse BaSyx Authors -# -# This program and the accompanying materials are made available under the terms of the MIT License, available in -# the LICENSE file of this project. -# -# SPDX-License-Identifier: MIT -""" -This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". -""" - -import base64 -import datetime -import io -import json -import itertools - -import werkzeug.exceptions -import werkzeug.routing -from werkzeug.exceptions import BadRequest, Conflict, NotFound, UnprocessableEntity -from werkzeug.routing import MapAdapter, Rule, Submount -from werkzeug.wrappers import Request, Response - -from basyx.aas import model -from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request - -from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set - - -T = TypeVar("T") - -BASE64URL_ENCODING = "utf-8" - -# Klasse, die das externe Mapping verwaltet -from basyx.aas import model - -class ResolverAPI: - def __init__(self, object_store: model.AbstractObjectStore, - base_path: str = "/api/v3.0"): - self.object_store: model.AbstractObjectStore = object_store - self.aas_to_assets: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} - self.asset_to_aas: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} - self.url_map = werkzeug.routing.Map([ - Submount(base_path, [ - Rule("/lookup/shellsByAssetLink", methods=["POST"], - endpoint=self.search_all_aas_ids_by_asset_link), - Submount("/lookup/shells", [ - Rule("/", methods=["GET"], - endpoint=self.get_all_asset_links_by_id), - Rule("/", methods=["POST"], - endpoint=self.post_all_asset_links_by_id), - Rule("/", methods=["DELETE"], - endpoint=self.delete_all_asset_links_by_id), - ]), - ]) - ], converters={ - "base64url": Base64URLConverter - }, strict_slashes=False) - - def __call__(self, environ, start_response) -> Iterable[bytes]: - response: Response = self.handle_request(Request(environ)) - return response(environ, start_response) - - @classmethod - def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: - limit_str = request.args.get('limit', default="10") - cursor_str = request.args.get('cursor', default="0") - try: - limit, cursor = int(limit_str), int(cursor_str) - if limit < 0 or cursor < 0: - raise ValueError - except ValueError: - raise BadRequest("Cursor and limit must be positive integers!") - start_index = cursor - end_index = cursor + limit - paginated_slice = itertools.islice(iterator, start_index, end_index) - return paginated_slice, end_index - - def handle_request(self, request: Request): - map_adapter: MapAdapter = self.url_map.bind_to_environ( - request.environ) - try: - response_t = get_response_type(request) - except werkzeug.exceptions.NotAcceptable as e: - return e - try: - endpoint, values = map_adapter.match() - return endpoint(request, values, response_t=response_t, - map_adapter=map_adapter) - # any raised error that leaves this function will cause a 500 internal server error - # so catch raised http exceptions and return them - except werkzeug.exceptions.HTTPException as e: - return http_exception_to_response(e, response_t) - - # ------ Discovery ROUTES ------- - def search_all_aas_ids_by_asset_link(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - """ - Returns a list of Asset Administration Shell IDs linked to specific asset identifiers or the global asset ID - """ - asset_links = HTTPApiDecoder.request_body_list(request, model.AssetLink, - False) - matching_aas_ids = set() - for asset_link in asset_links: - for asset_id, aas_ids in self.asset_to_aas.items(): - if asset_link.name==asset_id.name and asset_link.value==asset_id.value: - matching_aas_ids=aas_ids - matching_aas_ids = list(matching_aas_ids) - paginated_slice, cursor= self._get_slice(request, matching_aas_ids) - - return response_t(list(paginated_slice), cursor=cursor) - - def get_all_asset_links_by_id(self, request: Request, - url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: - """ - Returns a list of specific asset identifiers based on an Asset Administration Shell ID to edit discoverable content. - The global asset ID is returned as specific asset ID with "name" equal to "globalAssetId" (see Constraint AASd-116). - """ - aas_identifier = url_args.get("aas_id") - matching_asset_ids = set() - for ass_id, asset_ids in self.aas_to_assets.items(): - if ass_id==aas_identifier: - matching_asset_ids=asset_ids - matching_asset_ids = list(matching_asset_ids) - return response_t(matching_asset_ids) - - def post_all_asset_links_by_id(self, request: Request, - url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: - """ - Creates specific asset identifiers linked to an Asset Administration Shell to edit discoverable content. - """ - aas_identifier = url_args.get("aas_id") - # Decode the request body to retrieve specific asset identifiers - specific_asset_ids = HTTPApiDecoder.request_body_list( - request, model.SpecificAssetId, False) - - # Ensure the aas_identifier exists in the dictionary - if aas_identifier not in self.aas_to_assets: - self.aas_to_assets[aas_identifier] = set() - - # Add specific asset IDs to the aas_to_assets dictionary - asset_ids = self.aas_to_assets[aas_identifier] - for specific_asset_id in specific_asset_ids: - asset_ids.add(specific_asset_id) - - # Update asset_to_aas dictionary - for specific_asset_id in specific_asset_ids: - if specific_asset_id not in self.asset_to_aas: - self.asset_to_aas[specific_asset_id] = set() - self.asset_to_aas[specific_asset_id].add(aas_identifier) - - # Convert sets to lists for JSON serialization - serializable_aas_to_assets = {key: list(value) for key, value in self.aas_to_assets.items()} - - return response_t(serializable_aas_to_assets) - - def delete_all_asset_links_by_id(self, request: Request, - url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: - """ - Deletes all specific asset identifiers linked to an Asset Administration Shell to edit discoverable content. - """ - aas_identifier = url_args.get("aas_id") - # Ensure the aas_identifier exists in the dictionary - if aas_identifier in self.aas_to_assets: - # Remove the links from aas_to_asset dictionary - del self.aas_to_assets[aas_identifier] - - # Remove the aas_identifier from asset_to_aas dictionary - for asset_id, aas_ids in list(self.asset_to_aas.items()): - if aas_identifier in aas_ids: - aas_ids.discard(aas_identifier) - # Clean up empty sets - if not aas_ids: - del self.asset_to_aas[asset_id] - - return response_t() - -if __name__ == "__main__": - from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - - run_simple("localhost", 8084, ResolverAPI(create_full_example()), - use_debugger=True, use_reloader=True) From 1b676e7ea91d764f92a9f8ea9267dba69e1293c1 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Mon, 14 Apr 2025 18:45:39 +0200 Subject: [PATCH 06/76] change main.py and disccovery.py --- Discovery Server/app/main.py | 32 +++++++++++++++++++----------- Discovery Server/compose.yml | 2 ++ sdk/basyx/aas/adapter/discovery.py | 24 ++++++++++++---------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/Discovery Server/app/main.py b/Discovery Server/app/main.py index 8ee4d1cb6..19c97b416 100644 --- a/Discovery Server/app/main.py +++ b/Discovery Server/app/main.py @@ -1,17 +1,25 @@ import os +import sys from basyx.aas.adapter.discovery import DiscoveryAPI, MongoDiscoveryStore,InMemoryDiscoveryStore -def get_discovery_store(): - storage_type = os.getenv("STORAGE_TYPE", "inmemory").lower() - if storage_type == "mongodb": - uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") - dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") - return MongoDiscoveryStore(uri=uri, db_name=dbname) - else: - return InMemoryDiscoveryStore() +storage_type = os.getenv("STORAGE_TYPE", "inmemory") +base_path = os.getenv("API_BASE_PATH") +wsgi_optparams = {} + +if base_path is not None: + wsgi_optparams["base_path"] = base_path + +if storage_type == "inmemory": + application = DiscoveryAPI(InMemoryDiscoveryStore(), **wsgi_optparams) + +elif storage_type in "mongodb": + uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") + dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") + + application = DiscoveryAPI(MongoDiscoveryStore(uri,dbname), **wsgi_optparams) + +else: + print(f"STORAGE_TYPE must be either inmemory or mongodb! Current value: {storage_type}", + file=sys.stderr) -if __name__ == "__main__": - persistent_store = get_discovery_store() - run_simple("localhost", 8084, DiscoveryAPI(persistent_store=persistent_store), - use_debugger=True, use_reloader=True) \ No newline at end of file diff --git a/Discovery Server/compose.yml b/Discovery Server/compose.yml index 08db6be2d..6e1d65404 100644 --- a/Discovery Server/compose.yml +++ b/Discovery Server/compose.yml @@ -3,3 +3,5 @@ services: build: . ports: - "8084:80" + environment: + STORAGE_TYPE: inmemory diff --git a/sdk/basyx/aas/adapter/discovery.py b/sdk/basyx/aas/adapter/discovery.py index 3c5beab12..e6e68cc67 100644 --- a/sdk/basyx/aas/adapter/discovery.py +++ b/sdk/basyx/aas/adapter/discovery.py @@ -7,6 +7,8 @@ from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set +import abc + import copy from pymongo import MongoClient from pymongo.collection import Collection @@ -19,7 +21,12 @@ def specific_asset_to_json_obj(asset_id: model.SpecificAssetId) -> dict: json_str = AASToJsonEncoder().encode(asset_id) return json.loads(json_str) -class InMemoryDiscoveryStore: +class AbstractDiscoveryStore(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __init__(self): + pass + +class InMemoryDiscoveryStore(AbstractDiscoveryStore): def __init__(self): self.aas_to_assets: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} self.asset_to_aas: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} @@ -65,7 +72,7 @@ def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identi if asset_key in self.asset_to_aas: self.asset_to_aas[asset_key].discard(aas_key) -class MongoDiscoveryStore: +class MongoDiscoveryStore(AbstractDiscoveryStore): def __init__(self, uri: str = "mongodb://localhost:27017", db_name: str = "basyx", @@ -130,9 +137,8 @@ def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identi class DiscoveryAPI: def __init__(self, - base_path: str = "/api/v3.0", - persistent_store: MongoDiscoveryStore = None): - self.persistent_store = persistent_store or InMemoryDiscoveryStore() + persistent_store: AbstractDiscoveryStore, base_path: str = "/api/v3.0"): + self.persistent_store: AbstractDiscoveryStore = persistent_store self.url_map = werkzeug.routing.Map([ Submount(base_path, [ Rule("/lookup/shellsByAssetLink", methods=["POST"], @@ -213,12 +219,8 @@ def delete_all_asset_links_by_id(self, request: Request, url_args: dict, respons for key in list(self.persistent_store.asset_to_aas.keys()): self.persistent_store.asset_to_aas[key].discard(aas_identifier) return response_t() -""""" + if __name__ == "__main__": from werkzeug.serving import run_simple - persistent_store = MongoDiscoveryStore(uri="mongodb://localhost:27017", db_name="basyx_registry") - # run_simple("localhost", 8084, ResolverAPI(), - # use_debugger=True, use_reloader=True) - run_simple("localhost", 8084, ResolverAPI(persistent_store=persistent_store), + run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), use_debugger=True, use_reloader=True) -""" \ No newline at end of file From 7cff8cfdc5c1f778f7fbb26903f38bbc687c53f2 Mon Sep 17 00:00:00 2001 From: zrgt Date: Tue, 15 Apr 2025 17:17:41 +0200 Subject: [PATCH 07/76] Extract server-related components into server app This refactoring separates server functionalities (Discovery, Registries, Repositories) from the core SDK to improve modularity and maintainability. Changes: - Server is now a separate app - Added an initial pyproject.toml for the server app - Moved all server-related classes and functions from sdk to server - Consolidated descriptor.py, submodel_descriptor.py, and aas_descriptor.py into a single server_model.py file --- .../aas/adapter/json/json_deserialization.py | 147 +---- .../aas/adapter/json/json_serialization.py | 114 ---- .../aas/adapter/xml/xml_deserialization.py | 58 -- sdk/basyx/aas/model/__init__.py | 6 +- sdk/basyx/aas/model/aas.py | 11 - sdk/basyx/aas/model/aas_descriptor.py | 67 --- sdk/basyx/aas/model/descriptor.py | 133 ----- sdk/basyx/aas/model/submodel_descriptor.py | 29 - sdk/pyproject.toml | 6 +- server/app/__init__.py | 0 server/app/adapter/__init__.py | 0 server/app/adapter/jsonization.py | 544 ++++++++++++++++++ server/app/adapter/xmlization.py | 162 ++++++ .../aas/adapter => server/app}/discovery.py | 13 +- {sdk/basyx/aas/adapter => server/app}/http.py | 35 +- server/app/main.py | 2 +- server/app/py.typed | 0 .../aas/adapter => server/app}/registry.py | 57 +- server/app/server_model.py | 220 +++++++ server/pyproject.toml | 63 ++ 20 files changed, 1047 insertions(+), 620 deletions(-) delete mode 100644 sdk/basyx/aas/model/aas_descriptor.py delete mode 100644 sdk/basyx/aas/model/descriptor.py delete mode 100644 sdk/basyx/aas/model/submodel_descriptor.py create mode 100644 server/app/__init__.py create mode 100644 server/app/adapter/__init__.py create mode 100644 server/app/adapter/jsonization.py create mode 100644 server/app/adapter/xmlization.py rename {sdk/basyx/aas/adapter => server/app}/discovery.py (96%) rename {sdk/basyx/aas/adapter => server/app}/http.py (98%) create mode 100644 server/app/py.typed rename {sdk/basyx/aas/adapter => server/app}/registry.py (90%) create mode 100644 server/app/server_model.py create mode 100644 server/pyproject.toml diff --git a/sdk/basyx/aas/adapter/json/json_deserialization.py b/sdk/basyx/aas/adapter/json/json_deserialization.py index 3a50975a9..c1ce35fef 100644 --- a/sdk/basyx/aas/adapter/json/json_deserialization.py +++ b/sdk/basyx/aas/adapter/json/json_deserialization.py @@ -34,7 +34,6 @@ import json import logging import pprint -from abc import abstractmethod from typing import Dict, Callable, ContextManager, TypeVar, Type, List, IO, Optional, Set, get_args from basyx.aas import model @@ -189,9 +188,6 @@ def object_hook(cls, dct: Dict[str, object]) -> object: 'Range': cls._construct_range, 'ReferenceElement': cls._construct_reference_element, 'DataSpecificationIec61360': cls._construct_data_specification_iec61360, - 'AssetAdministrationShellDescriptor': cls._construct_asset_administration_shell_descriptor, - 'SubmodelDescriptor': cls._construct_submodel_descriptor, - 'AssetLink': cls._construct_asset_link, } # Get modelType and constructor function @@ -279,16 +275,7 @@ def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None if 'extensions' in dct: for extension in _get_ts(dct, 'extensions', list): obj.extension.add(cls._construct_extension(extension)) - if isinstance(obj, model.Descriptor): - if 'description' in dct: - obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), - model.MultiLanguageTextType) - if 'displayName' in dct: - obj.display_name = cls._construct_lang_string_set(_get_ts(dct, 'displayName', list), - model.MultiLanguageNameType) - if 'extensions' in dct: - for extension in _get_ts(dct, 'extensions', list): - obj.extension.add(cls._construct_extension(extension)) + @classmethod def _get_kind(cls, dct: Dict[str, object]) -> model.ModellingKind: """ @@ -760,134 +747,6 @@ def _construct_reference_element( ret.value = cls._construct_reference(_get_ts(dct, 'value', dict)) return ret - @classmethod - def _construct_asset_administration_shell_descriptor( - cls, dct: Dict[str, object], object_class=model.AssetAdministrationShellDescriptor) -> model.AssetAdministrationShellDescriptor: - ret = object_class(id_=_get_ts(dct, 'id', str)) - cls._amend_abstract_attributes(ret, dct) - if 'administration' in dct: - ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) - if 'assetkind' in dct: - asset_kind=ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] - if 'assetType' in dct: - ret.asset_type = _get_ts(dct, 'assetType', str) - global_asset_id = None - if 'globalAssetId' in dct: - global_asset_id = _get_ts(dct, 'globalAssetId', str) - specific_asset_id = set() - if 'specificAssetIds' in dct: - for desc_data in _get_ts(dct, "specificAssetIds", list): - specific_asset_id.add(cls._construct_specific_asset_id(desc_data, model.SpecificAssetId)) - if 'endpoints' in dct: - for endpoint_dct in _get_ts(dct, 'endpoints', list): - if 'protocolInformation' in endpoint_dct: - ret.endpoints.append( - cls._construct_endpoint(endpoint_dct, - model.Endpoint)) - elif 'href' in endpoint_dct: - protocol_info = model.ProtocolInformation( - href=_get_ts(endpoint_dct['href'], 'href', str), - endpoint_protocol=_get_ts(endpoint_dct['href'], - 'endpointProtocol', - str) if 'endpointProtocol' in - endpoint_dct[ - 'href'] else None, - endpoint_protocol_version=_get_ts( - endpoint_dct['href'], - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in - endpoint_dct['href'] else None - ) - ret.endpoints.append(model.Endpoint( - protocol_information=protocol_info, - interface=_get_ts(endpoint_dct, 'interface', - str))) - if 'idShort' in dct: - ret.id_short = _get_ts(dct, 'idShort', str) - if 'submodelDescriptors' in dct: - ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), model.SubmodelDescriptor) - return ret - - @classmethod - def _construct_protocol_information(cls, dct: Dict[str, object], - object_class=model.ProtocolInformation) -> model.ProtocolInformation: - ret = object_class( - href=_get_ts(dct, 'href', str), - endpoint_protocol=_get_ts(dct, 'endpointProtocol', - str) if 'endpointProtocol' in dct else None, - endpoint_protocol_version=_get_ts(dct, - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in dct else None, - subprotocol=_get_ts(dct, 'subprotocol', - str) if 'subprotocol' in dct else None, - subprotocol_body=_get_ts(dct, 'subprotocolBody', - str) if 'subprotocolBody' in dct else None, - subprotocol_body_encoding=_get_ts(dct, - 'subprotocolBodyEncoding', - str) if 'subprotocolBodyEncoding' in dct else None - ) - return ret - - @classmethod - def _construct_endpoint(cls, dct: Dict[str, object], - object_class=model.Endpoint) -> model.Endpoint: - ret = object_class( - protocol_information=cls._construct_protocol_information( - _get_ts(dct, 'protocolInformation', dict), - model.ProtocolInformation - ), - interface=_get_ts(dct, 'interface', - str) - ) - cls._amend_abstract_attributes(ret, dct) - return ret - - @classmethod - def _construct_submodel_descriptor( - cls, dct: Dict[str, object], object_class=model.SubmodelDescriptor) -> model.SubmodelDescriptor: - ret = object_class(id_=_get_ts(dct, 'id', str), - endpoints=[]) - cls._amend_abstract_attributes(ret, dct) - for endpoint_dct in _get_ts(dct, 'endpoints', list): - if 'protocolInformation' in endpoint_dct: - ret.endpoints.append( - cls._construct_endpoint(endpoint_dct, - model.Endpoint)) - elif 'href' in endpoint_dct: - protocol_info = model.ProtocolInformation( - href=_get_ts(endpoint_dct['href'], 'href', str), - endpoint_protocol=_get_ts(endpoint_dct['href'], - 'endpointProtocol', - str) if 'endpointProtocol' in - endpoint_dct[ - 'href'] else None, - endpoint_protocol_version=_get_ts( - endpoint_dct['href'], - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in - endpoint_dct['href'] else None - ) - ret.endpoints.append(model.Endpoint( - protocol_information=protocol_info, - interface=_get_ts(endpoint_dct, 'interface', - str))) - if 'administration' in dct: - ret.administration = cls._construct_administrative_information( - _get_ts(dct, 'administration', dict)) - if 'idShort' in dct: - ret.id_short = _get_ts(dct, 'idShort', str) - if 'semanticId' in dct: - ret.semantic_id = cls._construct_reference(_get_ts(dct, 'semanticId', dict)) - if 'supplementalSemanticIds' in dct: - for ref in _get_ts(dct, 'supplementalSemanticIds', list): - ret.supplemental_semantic_id.append(cls._construct_reference(ref)) - return ret - @classmethod - def _construct_asset_link ( - cls, dct: Dict[str, object], object_class=model.AssetLink) -> model.AssetLink: - ret = object_class(name=_get_ts(dct, 'name', str), - value=_get_ts(dct, 'value', str)) - return ret class StrictAASFromJsonDecoder(AASFromJsonDecoder): """ @@ -986,9 +845,7 @@ def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathO for name, expected_type in (('assetAdministrationShells', model.AssetAdministrationShell), ('submodels', model.Submodel), - ('conceptDescriptions', model.ConceptDescription), - ('assetAdministrationShellDescriptors', model.AssetAdministrationShellDescriptor), - ('submodelDescriptors', model.SubmodelDescriptor)): + ('conceptDescriptions', model.ConceptDescription)): try: lst = _get_ts(data, name, list) except (KeyError, TypeError): diff --git a/sdk/basyx/aas/adapter/json/json_serialization.py b/sdk/basyx/aas/adapter/json/json_serialization.py index 29d614fa8..8c6a671f1 100644 --- a/sdk/basyx/aas/adapter/json/json_serialization.py +++ b/sdk/basyx/aas/adapter/json/json_serialization.py @@ -93,11 +93,6 @@ def default(self, obj: object) -> object: model.SubmodelElementCollection: self._submodel_element_collection_to_json, model.SubmodelElementList: self._submodel_element_list_to_json, model.ValueReferencePair: self._value_reference_pair_to_json, - model.AssetAdministrationShellDescriptor: self._asset_administration_shell_descriptor_to_json, - model.SubmodelDescriptor: self._submodel_descriptor_to_json, - model.Endpoint: self._endpoint_to_json, - model.ProtocolInformation: self._protocol_information_to_json, - model.AssetLink: self._asset_link_to_json } for typ in mapping: if isinstance(obj, typ): @@ -155,14 +150,6 @@ def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: if isinstance(obj, model.Qualifiable) and not cls.stripped: if obj.qualifier: data['qualifiers'] = list(obj.qualifier) - if isinstance(obj, model.Descriptor): - if obj.description: - data['description'] = obj.description - if obj.display_name: - data['displayName'] = obj.display_name - if obj.extension: - data['extensions'] = list(obj.extension) - return data # ############################################################# @@ -683,92 +670,6 @@ def _basic_event_element_to_json(cls, obj: model.BasicEventElement) -> Dict[str, data['maxInterval'] = model.datatypes.xsd_repr(obj.max_interval) return data - @classmethod - def _asset_administration_shell_descriptor_to_json(cls, obj: model.AssetAdministrationShellDescriptor) -> Dict[str, object]: - """ - serialization of an object from class AssetAdministrationShell to json - - :param obj: object of class AssetAdministrationShell - :return: dict with the serialized attributes of this object - """ - data = cls._abstract_classes_to_json(obj) - data.update(cls._namespace_to_json(obj)) - data['id'] = obj.id - if obj.administration: - data['administration'] = obj.administration - if obj.asset_kind: - data['assetKind'] = _generic.ASSET_KIND[obj.asset_kind] - if obj.asset_type: - data['assetType'] = obj.asset_type - if obj.global_asset_id: - data['globalAssetId'] = obj.global_asset_id - if obj.specific_asset_id: - data['specificAssetIds'] = list(obj.specific_asset_id) - if obj.endpoints: - data['endpoints'] = list(obj.endpoints) - if obj.id_short: - data['idShort'] = obj.id_short - if obj.submodel_descriptors: - data['submodelDescriptors'] = list(obj.submodel_descriptors) - return data - - @classmethod - def _protocol_information_to_json(cls, - obj: model.ProtocolInformation) -> \ - Dict[str, object]: - data = cls._abstract_classes_to_json(obj) - - data['href'] = obj.href - if obj.endpoint_protocol: - data['endpointProtocol'] = obj.endpoint_protocol - if obj.endpoint_protocol_version: - data['endpointProtocolVersion'] = obj.endpoint_protocol_version - if obj.subprotocol: - data['subprotocol'] = obj.subprotocol - if obj.subprotocol_body: - data['subprotocolBody'] = obj.subprotocol_body - if obj.subprotocol_body_encoding: - data['subprotocolBodyEncoding'] = obj.subprotocol_body_encoding - - return data - - - @classmethod - def _endpoint_to_json(cls, obj: model.Endpoint) -> Dict[ - str, object]: - data = cls._abstract_classes_to_json(obj) - data['protocolInformation'] = cls._protocol_information_to_json( - obj.protocol_information) - data['interface'] = obj.interface - return data - - @classmethod - def _submodel_descriptor_to_json(cls, obj: model.SubmodelDescriptor) -> Dict[str, object]: - """ - serialization of an object from class Submodel to json - - :param obj: object of class Submodel - :return: dict with the serialized attributes of this object - """ - data = cls._abstract_classes_to_json(obj) - data['id'] = obj.id - data['endpoints'] = [cls._endpoint_to_json(ep) for ep in - obj.endpoints] - if obj.id_short: - data['idShort'] = obj.id_short - if obj.administration: - data['administration'] = obj.administration - if obj.semantic_id: - data['semanticId'] = obj.semantic_id - if obj.supplemental_semantic_id: - data['supplementalSemanticIds'] = list(obj.supplemental_semantic_id) - return data - @classmethod - def _asset_link_to_json(cls, obj: model.AssetLink) -> Dict[str, object]: - data = cls._abstract_classes_to_json(obj) - data['name'] = obj.name - data['value'] = obj.value - return data class StrippedAASToJsonEncoder(AASToJsonEncoder): """ @@ -797,9 +698,6 @@ def _create_dict(data: model.AbstractObjectStore) -> dict: asset_administration_shells: List[model.AssetAdministrationShell] = [] submodels: List[model.Submodel] = [] concept_descriptions: List[model.ConceptDescription] = [] - asset_administration_shell_descriptors: List[model.AssetAdministrationShellDescriptor] = [] - submodel_descriptors: List[model.SubmodelDescriptor] = [] - assets_links: List[model.AssetLink] = [] for obj in data: if isinstance(obj, model.AssetAdministrationShell): asset_administration_shells.append(obj) @@ -807,12 +705,6 @@ def _create_dict(data: model.AbstractObjectStore) -> dict: submodels.append(obj) elif isinstance(obj, model.ConceptDescription): concept_descriptions.append(obj) - elif isinstance(obj, model.AssetAdministrationShellDescriptor): - asset_administration_shell_descriptors.append(obj) - elif isinstance(obj, model.SubmodelDescriptor): - submodel_descriptors.append(obj) - elif isinstance(obj, model.AssetLink): - assets_links.append(obj) dict_: Dict[str, List] = {} if asset_administration_shells: dict_['assetAdministrationShells'] = asset_administration_shells @@ -820,12 +712,6 @@ def _create_dict(data: model.AbstractObjectStore) -> dict: dict_['submodels'] = submodels if concept_descriptions: dict_['conceptDescriptions'] = concept_descriptions - if asset_administration_shell_descriptors: - dict_['assetAdministrationShellDescriptors'] = asset_administration_shell_descriptors - if submodel_descriptors: - dict_['submodelDescriptors'] = submodel_descriptors - if assets_links: - dict_['assetLinks'] = assets_links return dict_ diff --git a/sdk/basyx/aas/adapter/xml/xml_deserialization.py b/sdk/basyx/aas/adapter/xml/xml_deserialization.py index 591d82107..ab78d3c2e 100644 --- a/sdk/basyx/aas/adapter/xml/xml_deserialization.py +++ b/sdk/basyx/aas/adapter/xml/xml_deserialization.py @@ -1181,58 +1181,7 @@ def construct_data_specification_iec61360(cls, element: etree._Element, ds_iec.level_types.add(IEC61360_LEVEL_TYPES_INVERSE[tag]) cls._amend_abstract_attributes(ds_iec, element) return ds_iec - @classmethod - def construct_asset_administration_shell_descriptor(cls, element: etree._Element, object_class=model.AssetAdministrationShellDescriptor, - **_kwargs: Any) -> model.AssetAdministrationShellDescriptor: - id_value = _child_text_mandatory(element, NS_AAS + "id") - id_short = _child_text_mandatory(element, NS_AAS + "idShort") - endpoints_elem = element.find(NS_AAS + "endpoints") - endpoints: List[str] = [] - if endpoints_elem is not None: - endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] - - asset_kind = _child_text_mandatory(element, NS_AAS + "assetKind") - - specific_asset_ids_elem = element.find(NS_AAS + "specificAssetIds") - specific_asset_ids: List[Dict[str, Any]] = [] - if specific_asset_ids_elem is not None: - for sid_elem in specific_asset_ids_elem.findall(NS_AAS + "specificAssetId"): - name = sid_elem.findtext(NS_AAS + "name") - value = sid_elem.findtext(NS_AAS + "value") - if name is not None and value is not None: - specific_asset_ids.append({"name": name.strip(), "value": value.strip()}) - - descriptor = object_class( - id=id_value, - id_short=id_short, - endpoints=endpoints, - asset_kind=asset_kind, - specific_asset_ids=specific_asset_ids - ) - - cls._amend_abstract_attributes(descriptor, element) - return descriptor - @classmethod - def construct_submodel_descriptor(cls, element: etree._Element, object_class=model.SubmodelDescriptor, - **_kwargs: Any) -> model.SubmodelDescriptor: - submodel_id = _child_text_mandatory(element, NS_AAS + "id") - id_short = _child_text_mandatory(element, NS_AAS + "idShort") - - endpoints_elem = element.find(NS_AAS + "endpoints") - endpoints: List[str] = [] - if endpoints_elem is not None: - endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] - - # Hier können weitere optionale Felder verarbeitet werden, z.B. semanticId, etc. - - submodel_descriptor = object_class( - id=submodel_id, - id_short=id_short, - endpoints=endpoints - ) - cls._amend_abstract_attributes(submodel_descriptor, element) - return submodel_descriptor class StrictAASFromXmlDecoder(AASFromXmlDecoder): """ @@ -1358,9 +1307,6 @@ class XMLConstructables(enum.Enum): EMBEDDED_DATA_SPECIFICATION = enum.auto() DATA_SPECIFICATION_CONTENT = enum.auto() DATA_SPECIFICATION_IEC61360 = enum.auto() - ASSET_ADMINISTRATION_SHELL_DESCRIPTOR = enum.auto() - SUBMODEL_DESCRIPTOR = enum.auto() - ASSET_LINK = enum.auto() def read_aas_xml_element(file: PathOrIO, construct: XMLConstructables, failsafe: bool = True, stripped: bool = False, @@ -1468,10 +1414,6 @@ def read_aas_xml_element(file: PathOrIO, construct: XMLConstructables, failsafe: # type aliases elif construct == XMLConstructables.VALUE_LIST: constructor = decoder_.construct_value_list - elif construct == XMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR: - constructor = decoder_.construct_asset_administration_shell_descriptor - elif construct == XMLConstructables.SUBMODEL_DESCRIPTOR: - constructor = decoder_.construct_submodel_descriptor else: raise ValueError(f"{construct.name} cannot be constructed!") diff --git a/sdk/basyx/aas/model/__init__.py b/sdk/basyx/aas/model/__init__.py index 1dcc29966..e541968b5 100644 --- a/sdk/basyx/aas/model/__init__.py +++ b/sdk/basyx/aas/model/__init__.py @@ -7,16 +7,14 @@ from basyx.aas.model import AssetAdministrationShell, Submodel, Property """ -from __future__ import absolute_import + from .aas import * from .base import * from .submodel import * from .provider import * from .concept import ConceptDescription from . import datatypes -from .aas_descriptor import AssetAdministrationShellDescriptor -from .descriptor import * -from .submodel_descriptor import SubmodelDescriptor + # A mapping of BaSyx Python SDK implementation classes to the corresponding `KeyTypes` enum members for all classes # that are covered by this enum. KEY_TYPES_CLASSES: Dict[Type[Referable], KeyTypes] = { diff --git a/sdk/basyx/aas/model/aas.py b/sdk/basyx/aas/model/aas.py index dd3a12c23..684a1ff06 100644 --- a/sdk/basyx/aas/model/aas.py +++ b/sdk/basyx/aas/model/aas.py @@ -172,14 +172,3 @@ def __init__(self, self.submodel: Set[base.ModelReference[Submodel]] = set() if submodel is None else submodel self.embedded_data_specifications: List[base.EmbeddedDataSpecification] = list(embedded_data_specifications) self.extension = base.NamespaceSet(self, [("name", True)], extension) - -class AssetLink: - - def __init__(self, name: base.LabelType, value: base.Identifier): - if not name: - raise ValueError("AssetLink 'name' must be a non-empty string.") - if not value: - raise ValueError("AssetLink 'value' must be a non-empty string.") - self.name = name - self.value = value - \ No newline at end of file diff --git a/sdk/basyx/aas/model/aas_descriptor.py b/sdk/basyx/aas/model/aas_descriptor.py deleted file mode 100644 index a4051abaf..000000000 --- a/sdk/basyx/aas/model/aas_descriptor.py +++ /dev/null @@ -1,67 +0,0 @@ -# coding: utf-8 - -from __future__ import absolute_import -from datetime import date, datetime - -from typing import List, Dict, Optional,Iterable, Set - -from . import base, _string_constraints, aas -from . import descriptor -from .submodel_descriptor import SubmodelDescriptor -import re - -class AssetAdministrationShellDescriptor(descriptor.Descriptor): - - def __init__(self, - id_: base.Identifier, - administration: Optional[base.AdministrativeInformation] = None, - asset_kind: Optional[base.AssetKind] = None, - asset_type: Optional[base.Identifier] = None, - endpoints: Optional[List[descriptor.Endpoint]] = None, - global_asset_id: Optional[base.Identifier] = None, - id_short: Optional[base.NameType] = None, - specific_asset_id: Iterable[base.SpecificAssetId] = (), - submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, - description: Optional[base.MultiLanguageTextType] = None, - display_name: Optional[base.MultiLanguageNameType] = None, - extension: Iterable[base.Extension] = ()): - """AssetAdministrationShellDescriptor - - - Nur das 'id'-Feld (id_) ist zwingend erforderlich. Alle anderen Felder erhalten Defaultwerte. - """ - super().__init__() - self.administration: Optional[base.AdministrativeInformation] = administration - self.asset_kind: Optional[base.AssetKind] = asset_kind - self.asset_type: Optional[base.Identifier] = asset_type - self.endpoints: Optional[List[descriptor.Endpoint]] = endpoints if endpoints is not None else [] # leere Liste, falls nicht gesetzt - self.global_asset_id: Optional[base.Identifier] = global_asset_id - self.id_short: Optional[base.NameType] = id_short - self.id: base.Identifier = id_ - self._specific_asset_id: base.ConstrainedList[base.SpecificAssetId] = base.ConstrainedList( - specific_asset_id, - item_set_hook=self._check_constraint_set_spec_asset_id, - item_del_hook=self._check_constraint_del_spec_asset_id - ) - self.submodel_descriptors = submodel_descriptors if submodel_descriptors is not None else [] - self.description: Optional[base.MultiLanguageTextType] = description - self.display_name: Optional[base.MultiLanguageNameType] = display_name - self.extension = base.NamespaceSet(self, [("name", True)], extension) - - @property - def specific_asset_id(self) -> base.ConstrainedList[base.SpecificAssetId]: - return self._specific_asset_id - - @specific_asset_id.setter - def specific_asset_id(self, specific_asset_id: Iterable[base.SpecificAssetId]) -> None: - # constraints are checked via _check_constraint_set_spec_asset_id() in this case - self._specific_asset_id[:] = specific_asset_id - - def _check_constraint_set_spec_asset_id(self, items_to_replace: List[base.SpecificAssetId], - new_items: List[base.SpecificAssetId], - old_list: List[base.SpecificAssetId]) -> None: - self._validate_aasd_131(self.global_asset_id, - len(old_list) - len(items_to_replace) + len(new_items) > 0) - - def _check_constraint_del_spec_asset_id(self, _item_to_del: base.SpecificAssetId, - old_list: List[base.SpecificAssetId]) -> None: - self._validate_aasd_131(self.global_asset_id, len(old_list) > 1) diff --git a/sdk/basyx/aas/model/descriptor.py b/sdk/basyx/aas/model/descriptor.py deleted file mode 100644 index d9071fc84..000000000 --- a/sdk/basyx/aas/model/descriptor.py +++ /dev/null @@ -1,133 +0,0 @@ -# coding: utf-8 - -from __future__ import absolute_import - -import abc -from datetime import date, datetime # noqa: F401 - -from typing import List, Dict, Optional,Iterable, Set - -from enum import Enum -import re - -from . import base, _string_constraints - -class Descriptor(metaclass=abc.ABCMeta): - @abc.abstractmethod - def __init__(self, description: Optional[base.MultiLanguageTextType] = None, display_name: Optional[base.MultiLanguageNameType] = None, extension: Iterable[base.Extension] = ()): - - super().__init__() - self.namespace_element_sets: List[NamespaceSet] = [] - self.description: Optional[base.MultiLanguageTextType] = description - self.display_name: Optional[base.MultiLanguageNameType] = display_name - self.extension = base.NamespaceSet(self, [("name", True)], extension) - - @property - def description(self) -> Optional[base.MultiLanguageTextType]: - return self._description - - @description.setter - def description(self, value: Optional[base.MultiLanguageTextType]): - self._description = value - - @property - def display_name(self) -> Optional[base.MultiLanguageNameType]: - return self._display_name - - @display_name.setter - def display_name(self, value: Optional[base.MultiLanguageNameType]): - self._display_name = value - - def commit(self): - pass - def update(self): - pass - def update_from(self, other: "Referable", update_source: bool = False): - pass - -class SecurityTypeEnum(Enum): - NONE = "NONE" - RFC_TLSA = "RFC_TLSA" - W3C_DID = "W3C_DID" - -class SecurityAttributeObject: - def __init__(self, type_: SecurityTypeEnum, key: str, value: str): - - if not isinstance(type_, SecurityTypeEnum): - raise ValueError(f"Invalid security type: {type_}. Must be one of {list(SecurityTypeEnum)}") - if not key or not isinstance(key, str): - raise ValueError("Key must be a non-empty string.") - if not value or not isinstance(value, str): - raise ValueError("Value must be a non-empty string.") - self.type = type_ - self.key = key - self.value = value - - -class ProtocolInformation: - - def __init__( - self, - href: str, - endpoint_protocol: Optional[str] = None, - endpoint_protocol_version: Optional[List[str]] = None, - subprotocol: Optional[str] = None, - subprotocol_body: Optional[str] = None, - subprotocol_body_encoding: Optional[str] = None, - security_attributes: Optional[List[SecurityAttributeObject]] = None - ): - if not href or not isinstance(href, str): - raise ValueError("href must be a non-empty string representing a valid URL.") - - self.href = href - self.endpoint_protocol = endpoint_protocol - self.endpoint_protocol_version = endpoint_protocol_version or [] - self.subprotocol = subprotocol - self.subprotocol_body = subprotocol_body - self.subprotocol_body_encoding = subprotocol_body_encoding - self.security_attributes = security_attributes or [] -class Endpoint: - - INTERFACE_SHORTNAMES = { - "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", - "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", - "CD-REPOSITORY", "AAS-DISCOVERY" - } - VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") - - def __init__(self, interface: base.NameType, protocol_information: ProtocolInformation): # noqa: E501 - - self.interface = interface - self.protocol_information = protocol_information - - @property - def interface(self) -> str: - return self._interface - - @interface.setter - def interface(self, interface: base.NameType): - if interface is None: - raise ValueError("Invalid value for `interface`, must not be `None`") - if not self.is_valid_interface(interface): - raise ValueError(f"Invalid interface format: {interface}. Expected format: '-', ") - - self._interface = interface - - @classmethod - def is_valid_interface(cls, interface: base.NameType) -> bool: - parts = interface.split("-", 1) - if len(parts) != 2: - return False - short_name, version = parts - return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) - - @property - def protocol_information(self) -> ProtocolInformation: - return self._protocol_information - - @protocol_information.setter - def protocol_information(self, protocol_information: ProtocolInformation): - if protocol_information is None: - raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 - - self._protocol_information = protocol_information \ No newline at end of file diff --git a/sdk/basyx/aas/model/submodel_descriptor.py b/sdk/basyx/aas/model/submodel_descriptor.py deleted file mode 100644 index 62081d6a6..000000000 --- a/sdk/basyx/aas/model/submodel_descriptor.py +++ /dev/null @@ -1,29 +0,0 @@ -# coding: utf-8 - -from __future__ import absolute_import -from datetime import date, datetime - -from typing import List, Dict, Optional,Iterable, Set - -from .base import AdministrativeInformation -from . import descriptor -from . import base -from .base import Reference -import re - - -class SubmodelDescriptor(descriptor.Descriptor): - - def __init__(self, id_: base.Identifier, endpoints: List[descriptor.Endpoint], - administration: Optional[base.AdministrativeInformation] = None, - id_short: Optional[base.NameType]=None, semantic_id: Optional[base.Reference]=None, - supplemental_semantic_id: Iterable[base.Reference] = ()): - - super().__init__() - self.id: base.Identifier = id_ - self.endpoints: List[descriptor.Endpoint] = endpoints - self.administration: Optional[base.AdministrativeInformation] = administration - self.id_short: Optional[base.NameType] = id_short - self.semantic_id: Optional[base.Reference] = semantic_id - self.supplemental_semantic_id: base.ConstrainedList[base.Reference] = \ - base.ConstrainedList(supplemental_semantic_id) diff --git a/sdk/pyproject.toml b/sdk/pyproject.toml index baaf6ff05..70308891b 100644 --- a/sdk/pyproject.toml +++ b/sdk/pyproject.toml @@ -20,7 +20,7 @@ root = ".." # Defines the path to the root of the repository version_file = "basyx/version.py" [project] -name = "basyx-python-sdk" + name = "basyx-python-sdk" dynamic = ["version"] description = "The Eclipse BaSyx Python SDK, an implementation of the Asset Administration Shell for Industry 4.0 systems" authors = [ @@ -38,9 +38,7 @@ requires-python = ">=3.9" dependencies = [ "lxml>=4.2,<5", "python-dateutil>=2.8,<3", - "pyecma376-2>=1.0.1", - "urllib3>=1.26,<3", - "Werkzeug>=3.0.3,<4", + "pyecma376-2>=1.0.1" ] [project.optional-dependencies] diff --git a/server/app/__init__.py b/server/app/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/app/adapter/__init__.py b/server/app/adapter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py new file mode 100644 index 000000000..251127339 --- /dev/null +++ b/server/app/adapter/jsonization.py @@ -0,0 +1,544 @@ +from typing import Dict, Set, ContextManager, IO, get_args, Optional, Type, List + +import server.app.server_model as server_model +from basyx.aas import model +from basyx.aas.adapter import _generic +from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, Path, PathOrIO +from basyx.aas.adapter.json import AASToJsonEncoder +from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, _select_decoder + +import json +import logging +import pprint +from typing import Callable + +import contextlib + + +logger = logging.getLogger(__name__) + + +class ServerAASFromJsonDecoder(AASFromJsonDecoder): + @classmethod + def object_hook(cls, dct: Dict[str, object]) -> object: + # Check if JSON object seems to be a deserializable AAS object (i.e. it has a modelType). Otherwise, the JSON + # object is returned as is, so it's possible to mix AAS objects with other data within a JSON structure. + if 'modelType' not in dct: + return dct + + # The following dict specifies a constructor method for all AAS classes that may be identified using the + # ``modelType`` attribute in their JSON representation. Each of those constructor functions takes the JSON + # representation of an object and tries to construct a Python object from it. Embedded objects that have a + # modelType themselves are expected to be converted to the correct PythonType already. Additionally, each + # function takes a bool parameter ``failsafe``, which indicates weather to log errors and skip defective objects + # instead of raising an Exception. + AAS_CLASS_PARSERS: Dict[str, Callable[[Dict[str, object]], object]] = { + 'AssetAdministrationShell': cls._construct_asset_administration_shell, + 'AssetInformation': cls._construct_asset_information, + 'SpecificAssetId': cls._construct_specific_asset_id, + 'ConceptDescription': cls._construct_concept_description, + 'Extension': cls._construct_extension, + 'Submodel': cls._construct_submodel, + 'Capability': cls._construct_capability, + 'Entity': cls._construct_entity, + 'BasicEventElement': cls._construct_basic_event_element, + 'Operation': cls._construct_operation, + 'RelationshipElement': cls._construct_relationship_element, + 'AnnotatedRelationshipElement': cls._construct_annotated_relationship_element, + 'SubmodelElementCollection': cls._construct_submodel_element_collection, + 'SubmodelElementList': cls._construct_submodel_element_list, + 'Blob': cls._construct_blob, + 'File': cls._construct_file, + 'MultiLanguageProperty': cls._construct_multi_language_property, + 'Property': cls._construct_property, + 'Range': cls._construct_range, + 'ReferenceElement': cls._construct_reference_element, + 'DataSpecificationIec61360': cls._construct_data_specification_iec61360, + 'AssetAdministrationShellDescriptor': cls._construct_asset_administration_shell_descriptor, + 'SubmodelDescriptor': cls._construct_submodel_descriptor, + 'AssetLink': cls._construct_asset_link, + } + + # Get modelType and constructor function + if not isinstance(dct['modelType'], str): + logger.warning("JSON object has unexpected format of modelType: %s", dct['modelType']) + # Even in strict mode, we consider 'modelType' attributes of wrong type as non-AAS objects instead of + # raising an exception. However, the object's type will probably checked later by read_json_aas_file() or + # _expect_type() + return dct + model_type = dct['modelType'] + if model_type not in AAS_CLASS_PARSERS: + if not cls.failsafe: + raise TypeError("Found JSON object with modelType=\"%s\", which is not a known AAS class" % model_type) + logger.error("Found JSON object with modelType=\"%s\", which is not a known AAS class", model_type) + return dct + + # Use constructor function to transform JSON representation into BaSyx Python SDK model object + try: + return AAS_CLASS_PARSERS[model_type](dct) + except (KeyError, TypeError, model.AASConstraintViolation) as e: + error_message = "Error while trying to convert JSON object into {}: {} >>> {}".format( + model_type, e, pprint.pformat(dct, depth=2, width=2 ** 14, compact=True)) + if cls.failsafe: + logger.error(error_message, exc_info=e) + # In failsafe mode, we return the raw JSON object dict, if there were errors while parsing an object, so + # a client application is able to handle this data. The read_json_aas_file() function and all + # constructors for complex objects will skip those items by using _expect_type(). + return dct + else: + raise (type(e) if isinstance(e, (KeyError, TypeError)) else TypeError)(error_message) from e + + # ################################################################################################## + # Utility Methods used in constructor methods to add general attributes (from abstract base classes) + # ################################################################################################## + + @classmethod + def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None: + super()._amend_abstract_attributes(obj, dct) + + if isinstance(obj, server_model.Descriptor): + if 'description' in dct: + obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), + model.MultiLanguageTextType) + if 'displayName' in dct: + obj.display_name = cls._construct_lang_string_set(_get_ts(dct, 'displayName', list), + model.MultiLanguageNameType) + if 'extensions' in dct: + for extension in _get_ts(dct, 'extensions', list): + obj.extension.add(cls._construct_extension(extension)) + + @classmethod + def _construct_asset_administration_shell_descriptor( + cls, dct: Dict[str, object], + object_class=server_model.AssetAdministrationShellDescriptor) -> server_model.AssetAdministrationShellDescriptor: + ret = object_class(id_=_get_ts(dct, 'id', str)) + cls._amend_abstract_attributes(ret, dct) + if 'administration' in dct: + ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) + if 'assetkind' in dct: + # FIXME + asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] + if 'assetType' in dct: + ret.asset_type = _get_ts(dct, 'assetType', str) + global_asset_id = None + if 'globalAssetId' in dct: + # FIXME + global_asset_id = _get_ts(dct, 'globalAssetId', str) + specific_asset_id = set() + if 'specificAssetIds' in dct: + for desc_data in _get_ts(dct, "specificAssetIds", list): + specific_asset_id.add(cls._construct_specific_asset_id(desc_data, model.SpecificAssetId)) + if 'endpoints' in dct: + for endpoint_dct in _get_ts(dct, 'endpoints', list): + if 'protocolInformation' in endpoint_dct: + ret.endpoints.append( + cls._construct_endpoint(endpoint_dct, + server_model.Endpoint)) + elif 'href' in endpoint_dct: + protocol_info = server_model.ProtocolInformation( + href=_get_ts(endpoint_dct['href'], 'href', str), + endpoint_protocol=_get_ts(endpoint_dct['href'], + 'endpointProtocol', + str) if 'endpointProtocol' in + endpoint_dct[ + 'href'] else None, + endpoint_protocol_version=_get_ts( + endpoint_dct['href'], + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in + endpoint_dct['href'] else None + ) + ret.endpoints.append(server_model.Endpoint( + protocol_information=protocol_info, + interface=_get_ts(endpoint_dct, 'interface', + str))) + if 'idShort' in dct: + ret.id_short = _get_ts(dct, 'idShort', str) + if 'submodelDescriptors' in dct: + ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), + server_model.SubmodelDescriptor) + return ret + + @classmethod + def _construct_protocol_information(cls, dct: Dict[str, object], + object_class=server_model.ProtocolInformation) -> server_model.ProtocolInformation: + ret = object_class( + href=_get_ts(dct, 'href', str), + endpoint_protocol=_get_ts(dct, 'endpointProtocol', + str) if 'endpointProtocol' in dct else None, + endpoint_protocol_version=_get_ts(dct, + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in dct else None, + subprotocol=_get_ts(dct, 'subprotocol', + str) if 'subprotocol' in dct else None, + subprotocol_body=_get_ts(dct, 'subprotocolBody', + str) if 'subprotocolBody' in dct else None, + subprotocol_body_encoding=_get_ts(dct, + 'subprotocolBodyEncoding', + str) if 'subprotocolBodyEncoding' in dct else None + ) + return ret + + @classmethod + def _construct_endpoint(cls, dct: Dict[str, object], + object_class=server_model.Endpoint) -> server_model.Endpoint: + ret = object_class( + protocol_information=cls._construct_protocol_information( + _get_ts(dct, 'protocolInformation', dict), + server_model.ProtocolInformation + ), + interface=_get_ts(dct, 'interface', + str) + ) + cls._amend_abstract_attributes(ret, dct) + return ret + + @classmethod + def _construct_submodel_descriptor( + cls, dct: Dict[str, object], object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: + ret = object_class(id_=_get_ts(dct, 'id', str), + endpoints=[]) + cls._amend_abstract_attributes(ret, dct) + for endpoint_dct in _get_ts(dct, 'endpoints', list): + if 'protocolInformation' in endpoint_dct: + ret.endpoints.append( + cls._construct_endpoint(endpoint_dct, + server_model.Endpoint)) + elif 'href' in endpoint_dct: + protocol_info = server_model.ProtocolInformation( + href=_get_ts(endpoint_dct['href'], 'href', str), + endpoint_protocol=_get_ts(endpoint_dct['href'], + 'endpointProtocol', + str) if 'endpointProtocol' in + endpoint_dct[ + 'href'] else None, + endpoint_protocol_version=_get_ts( + endpoint_dct['href'], + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in + endpoint_dct['href'] else None + ) + ret.endpoints.append(server_model.Endpoint( + protocol_information=protocol_info, + interface=_get_ts(endpoint_dct, 'interface', + str))) + if 'administration' in dct: + ret.administration = cls._construct_administrative_information( + _get_ts(dct, 'administration', dict)) + if 'idShort' in dct: + ret.id_short = _get_ts(dct, 'idShort', str) + if 'semanticId' in dct: + ret.semantic_id = cls._construct_reference(_get_ts(dct, 'semanticId', dict)) + if 'supplementalSemanticIds' in dct: + for ref in _get_ts(dct, 'supplementalSemanticIds', list): + ret.supplemental_semantic_id.append(cls._construct_reference(ref)) + return ret + + @classmethod + def _construct_asset_link( + cls, dct: Dict[str, object], object_class=server_model.AssetLink) -> server_model.AssetLink: + ret = object_class(name=_get_ts(dct, 'name', str), + value=_get_ts(dct, 'value', str)) + return ret + + +class ServerStrictAASFromJsonDecoder(ServerAASFromJsonDecoder): + """ + A strict version of the AASFromJsonDecoder class for deserializing Asset Administration Shell data from the + official JSON format + + This version has set ``failsafe = False``, which will lead to Exceptions raised for every missing attribute or wrong + object type. + """ + failsafe = False + + +class ServerStrippedAASFromJsonDecoder(ServerAASFromJsonDecoder): + """ + Decoder for stripped JSON objects. Used in the HTTP adapter. + """ + stripped = True + + +class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, ServerStrippedAASFromJsonDecoder): + """ + Non-failsafe decoder for stripped JSON objects. + """ + pass + + +def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, + ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, + decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: + """ + Read an Asset Administration Shell JSON file according to 'Details of the Asset Administration Shell', chapter 5.5 + into a given object store. + + :param object_store: The :class:`ObjectStore ` in which the + identifiable objects should be stored + :param file: A filename or file-like object to read the JSON-serialized data from + :param replace_existing: Whether to replace existing objects with the same identifier in the object store or not + :param ignore_existing: Whether to ignore existing objects (e.g. log a message) or raise an error. + This parameter is ignored if replace_existing is ``True``. + :param failsafe: If ``True``, the document is parsed in a failsafe way: Missing attributes and elements are logged + instead of causing exceptions. Defect objects are skipped. + This parameter is ignored if a decoder class is specified. + :param stripped: If ``True``, stripped JSON objects are parsed. + See https://git.rwth-aachen.de/acplt/pyi40aas/-/issues/91 + This parameter is ignored if a decoder class is specified. + :param decoder: The decoder class used to decode the JSON objects + :raises KeyError: **Non-failsafe**: Encountered a duplicate identifier + :raises KeyError: Encountered an identifier that already exists in the given ``object_store`` with both + ``replace_existing`` and ``ignore_existing`` set to ``False`` + :raises (~basyx.aas.model.base.AASConstraintViolation, KeyError, ValueError, TypeError): **Non-failsafe**: + Errors during construction of the objects + :raises TypeError: **Non-failsafe**: Encountered an element in the wrong list + (e.g. an AssetAdministrationShell in ``submodels``) + :return: A set of :class:`Identifiers ` that were added to object_store + """ + ret: Set[model.Identifier] = set() + decoder_ = _select_decoder(failsafe, stripped, decoder) + + # json.load() accepts TextIO and BinaryIO + cm: ContextManager[IO] + if isinstance(file, get_args(Path)): + # 'file' is a path, needs to be opened first + cm = open(file, "r", encoding="utf-8-sig") + else: + # 'file' is not a path, thus it must already be IO + # mypy seems to have issues narrowing the type due to get_args() + cm = contextlib.nullcontext(file) # type: ignore[arg-type] + + # read, parse and convert JSON file + with cm as fp: + data = json.load(fp, cls=decoder_) + + for name, expected_type in (('assetAdministrationShells', model.AssetAdministrationShell), + ('submodels', model.Submodel), + ('conceptDescriptions', model.ConceptDescription), + ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), + ('submodelDescriptors', server_model.SubmodelDescriptor)): + try: + lst = _get_ts(data, name, list) + except (KeyError, TypeError): + continue + + for item in lst: + error_message = "Expected a {} in list '{}', but found {}".format( + expected_type.__name__, name, repr(item)) + if isinstance(item, model.Identifiable): + if not isinstance(item, expected_type): + if decoder_.failsafe: + logger.warning("{} was in wrong list '{}'; nevertheless, we'll use it".format(item, name)) + else: + raise TypeError(error_message) + if item.id in ret: + error_message = f"{item} has a duplicate identifier already parsed in the document!" + if not decoder_.failsafe: + raise KeyError(error_message) + logger.error(error_message + " skipping it...") + continue + existing_element = object_store.get(item.id) + if existing_element is not None: + if not replace_existing: + error_message = f"object with identifier {item.id} already exists " \ + f"in the object store: {existing_element}!" + if not ignore_existing: + raise KeyError(error_message + f" failed to insert {item}!") + logger.info(error_message + f" skipping insertion of {item}...") + continue + object_store.discard(existing_element) + object_store.add(item) + ret.add(item.id) + elif decoder_.failsafe: + logger.error(error_message) + else: + raise TypeError(error_message) + return ret + + +class ServerAASToJsonEncoder(AASToJsonEncoder): + + def default(self, obj: object) -> object: + """ + The overwritten ``default`` method for :class:`json.JSONEncoder` + + :param obj: The object to serialize to json + :return: The serialized object + """ + mapping: Dict[Type, Callable] = { + model.AdministrativeInformation: self._administrative_information_to_json, + model.AnnotatedRelationshipElement: self._annotated_relationship_element_to_json, + model.AssetAdministrationShell: self._asset_administration_shell_to_json, + model.AssetInformation: self._asset_information_to_json, + model.BasicEventElement: self._basic_event_element_to_json, + model.Blob: self._blob_to_json, + model.Capability: self._capability_to_json, + model.ConceptDescription: self._concept_description_to_json, + model.DataSpecificationIEC61360: self._data_specification_iec61360_to_json, + model.Entity: self._entity_to_json, + model.Extension: self._extension_to_json, + model.File: self._file_to_json, + model.Key: self._key_to_json, + model.LangStringSet: self._lang_string_set_to_json, + model.MultiLanguageProperty: self._multi_language_property_to_json, + model.Operation: self._operation_to_json, + model.Property: self._property_to_json, + model.Qualifier: self._qualifier_to_json, + model.Range: self._range_to_json, + model.Reference: self._reference_to_json, + model.ReferenceElement: self._reference_element_to_json, + model.RelationshipElement: self._relationship_element_to_json, + model.Resource: self._resource_to_json, + model.SpecificAssetId: self._specific_asset_id_to_json, + model.Submodel: self._submodel_to_json, + model.SubmodelElementCollection: self._submodel_element_collection_to_json, + model.SubmodelElementList: self._submodel_element_list_to_json, + model.ValueReferencePair: self._value_reference_pair_to_json, + server_model.AssetAdministrationShellDescriptor: self._asset_administration_shell_descriptor_to_json, + server_model.SubmodelDescriptor: self._submodel_descriptor_to_json, + server_model.Endpoint: self._endpoint_to_json, + server_model.ProtocolInformation: self._protocol_information_to_json, + server_model.AssetLink: self._asset_link_to_json + } + for typ in mapping: + if isinstance(obj, typ): + mapping_method = mapping[typ] + return mapping_method(obj) + return super().default(obj) + + @classmethod + def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: + data: Dict[str, object] = super()._abstract_classes_to_json(obj) + if isinstance(obj, server_model.Descriptor): + if obj.description: + data['description'] = obj.description + if obj.display_name: + data['displayName'] = obj.display_name + if obj.extension: + data['extensions'] = list(obj.extension) + + return data + + + @classmethod + def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> Dict[str, object]: + """ + serialization of an object from class AssetAdministrationShell to json + + :param obj: object of class AssetAdministrationShell + :return: dict with the serialized attributes of this object + """ + data = cls._abstract_classes_to_json(obj) + data.update(cls._namespace_to_json(obj)) + data['id'] = obj.id + if obj.administration: + data['administration'] = obj.administration + if obj.asset_kind: + data['assetKind'] = _generic.ASSET_KIND[obj.asset_kind] + if obj.asset_type: + data['assetType'] = obj.asset_type + if obj.global_asset_id: + data['globalAssetId'] = obj.global_asset_id + if obj.specific_asset_id: + data['specificAssetIds'] = list(obj.specific_asset_id) + if obj.endpoints: + data['endpoints'] = list(obj.endpoints) + if obj.id_short: + data['idShort'] = obj.id_short + if obj.submodel_descriptors: + data['submodelDescriptors'] = list(obj.submodel_descriptors) + return data + + @classmethod + def _protocol_information_to_json(cls, + obj: server_model.ProtocolInformation) -> \ + Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + + data['href'] = obj.href + if obj.endpoint_protocol: + data['endpointProtocol'] = obj.endpoint_protocol + if obj.endpoint_protocol_version: + data['endpointProtocolVersion'] = obj.endpoint_protocol_version + if obj.subprotocol: + data['subprotocol'] = obj.subprotocol + if obj.subprotocol_body: + data['subprotocolBody'] = obj.subprotocol_body + if obj.subprotocol_body_encoding: + data['subprotocolBodyEncoding'] = obj.subprotocol_body_encoding + return data + + @classmethod + def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + data['protocolInformation'] = cls._protocol_information_to_json( + obj.protocol_information) + data['interface'] = obj.interface + return data + + @classmethod + def _submodel_descriptor_to_json(cls, obj: server_model.SubmodelDescriptor) -> Dict[str, object]: + """ + serialization of an object from class Submodel to json + + :param obj: object of class Submodel + :return: dict with the serialized attributes of this object + """ + data = cls._abstract_classes_to_json(obj) + data['id'] = obj.id + data['endpoints'] = [cls._endpoint_to_json(ep) for ep in + obj.endpoints] + if obj.id_short: + data['idShort'] = obj.id_short + if obj.administration: + data['administration'] = obj.administration + if obj.semantic_id: + data['semanticId'] = obj.semantic_id + if obj.supplemental_semantic_id: + data['supplementalSemanticIds'] = list(obj.supplemental_semantic_id) + return data + + @classmethod + def _asset_link_to_json(cls, obj: server_model.AssetLink) -> Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + data['name'] = obj.name + data['value'] = obj.value + return data + + +def _create_dict(data: model.AbstractObjectStore) -> dict: + # separate different kind of objects + asset_administration_shells: List[model.AssetAdministrationShell] = [] + submodels: List[model.Submodel] = [] + concept_descriptions: List[model.ConceptDescription] = [] + asset_administration_shell_descriptors: List[server_model.AssetAdministrationShellDescriptor] = [] + submodel_descriptors: List[server_model.SubmodelDescriptor] = [] + assets_links: List[server_model.AssetLink] = [] + for obj in data: + if isinstance(obj, model.AssetAdministrationShell): + asset_administration_shells.append(obj) + elif isinstance(obj, model.Submodel): + submodels.append(obj) + elif isinstance(obj, model.ConceptDescription): + concept_descriptions.append(obj) + elif isinstance(obj, server_model.AssetAdministrationShellDescriptor): + asset_administration_shell_descriptors.append(obj) + elif isinstance(obj, server_model.SubmodelDescriptor): + submodel_descriptors.append(obj) + elif isinstance(obj, server_model.AssetLink): + assets_links.append(obj) + dict_: Dict[str, List] = {} + if asset_administration_shells: + dict_['assetAdministrationShells'] = asset_administration_shells + if submodels: + dict_['submodels'] = submodels + if concept_descriptions: + dict_['conceptDescriptions'] = concept_descriptions + if asset_administration_shell_descriptors: + dict_['assetAdministrationShellDescriptors'] = asset_administration_shell_descriptors + if submodel_descriptors: + dict_['submodelDescriptors'] = submodel_descriptors + if assets_links: + dict_['assetLinks'] = assets_links + return dict_ diff --git a/server/app/adapter/xmlization.py b/server/app/adapter/xmlization.py new file mode 100644 index 000000000..e13a5ebed --- /dev/null +++ b/server/app/adapter/xmlization.py @@ -0,0 +1,162 @@ +import enum +from typing import Optional, Type, Callable, Any, List, Dict +from lxml import etree + +from basyx.aas.adapter._generic import PathOrIO +from basyx.aas.adapter.xml import XMLConstructables, AASFromXmlDecoder +from basyx.aas.adapter.xml.xml_deserialization import _parse_xml_document, _failsafe_construct, \ + _child_text_mandatory, NS_AAS, read_aas_xml_element +import server.app.server_model as server_model + + +class ServerAASFromXmlDecoder(AASFromXmlDecoder): + + @classmethod + def construct_asset_administration_shell_descriptor(cls, element: etree._Element, + object_class=server_model.AssetAdministrationShellDescriptor, + **_kwargs: Any) -> server_model.AssetAdministrationShellDescriptor: + id_value = _child_text_mandatory(element, NS_AAS + "id") + id_short = _child_text_mandatory(element, NS_AAS + "idShort") + endpoints_elem = element.find(NS_AAS + "endpoints") + endpoints: List[str] = [] + if endpoints_elem is not None: + endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] + + asset_kind = _child_text_mandatory(element, NS_AAS + "assetKind") + + specific_asset_ids_elem = element.find(NS_AAS + "specificAssetIds") + specific_asset_ids: List[Dict[str, Any]] = [] + if specific_asset_ids_elem is not None: + for sid_elem in specific_asset_ids_elem.findall(NS_AAS + "specificAssetId"): + name = sid_elem.findtext(NS_AAS + "name") + value = sid_elem.findtext(NS_AAS + "value") + if name is not None and value is not None: + specific_asset_ids.append({"name": name.strip(), "value": value.strip()}) + + descriptor = object_class( + id=id_value, + id_short=id_short, + endpoints=endpoints, + asset_kind=asset_kind, + specific_asset_ids=specific_asset_ids + ) + + cls._amend_abstract_attributes(descriptor, element) + return descriptor + + @classmethod + def construct_submodel_descriptor(cls, element: etree._Element, object_class=server_model.SubmodelDescriptor, + **_kwargs: Any) -> server_model.SubmodelDescriptor: + submodel_id = _child_text_mandatory(element, NS_AAS + "id") + id_short = _child_text_mandatory(element, NS_AAS + "idShort") + + endpoints_elem = element.find(NS_AAS + "endpoints") + endpoints: List[str] = [] + if endpoints_elem is not None: + endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] + + # Hier können weitere optionale Felder verarbeitet werden, z.B. semanticId, etc. + + submodel_descriptor = object_class( + id=submodel_id, + id_short=id_short, + endpoints=endpoints + ) + + cls._amend_abstract_attributes(submodel_descriptor, element) + return submodel_descriptor + + +class ServerStrictAASFromXmlDecoder(ServerAASFromXmlDecoder): + """ + Non-failsafe XML decoder. Encountered errors won't be caught and abort parsing. + """ + failsafe = False + + +class ServerStrippedAASFromXmlDecoder(ServerAASFromXmlDecoder): + """ + Decoder for stripped XML elements. Used in the HTTP adapter. + """ + stripped = True + + +class ServerStrictStrippedAASFromXmlDecoder(ServerStrictAASFromXmlDecoder, ServerStrippedAASFromXmlDecoder): + """ + Non-failsafe decoder for stripped XML elements. + """ + pass + + +@enum.unique +class ServerXMLConstructables(enum.Enum): + ASSET_ADMINISTRATION_SHELL_DESCRIPTOR = enum.auto() + SUBMODEL_DESCRIPTOR = enum.auto() + ASSET_LINK = enum.auto() + + +def _select_server_decoder(failsafe: bool, stripped: bool, decoder: Optional[Type[ServerAASFromXmlDecoder]]) \ + -> Type[ServerAASFromXmlDecoder]: + """ + Returns the correct decoder based on the parameters failsafe and stripped. If a decoder class is given, failsafe + and stripped are ignored. + + :param failsafe: If true, a failsafe decoder is selected. Ignored if a decoder class is specified. + :param stripped: If true, a decoder for parsing stripped XML elements is selected. Ignored if a decoder class is + specified. + :param decoder: Is returned, if specified. + :return: A AASFromXmlDecoder (sub)class. + """ + if decoder is not None: + return decoder + if failsafe: + if stripped: + return ServerStrippedAASFromXmlDecoder + return ServerAASFromXmlDecoder + else: + if stripped: + return ServerStrictStrippedAASFromXmlDecoder + return ServerStrictAASFromXmlDecoder + + +def read_server_aas_xml_element(file: PathOrIO, construct: XMLConstructables, failsafe: bool = True, + stripped: bool = False, + decoder: Optional[Type[AASFromXmlDecoder]] = None, **constructor_kwargs) -> Optional[ + object]: + """ + Construct a single object from an XML string. The namespaces have to be declared on the object itself, since there + is no surrounding environment element. + + :param file: A filename or file-like object to read the XML-serialized data from + :param construct: A member of the enum :class:`~.XMLConstructables`, specifying which type to construct. + :param failsafe: If true, the document is parsed in a failsafe way: missing attributes and elements are logged + instead of causing exceptions. Defect objects are skipped. + This parameter is ignored if a decoder class is specified. + :param stripped: If true, stripped XML elements are parsed. + See https://git.rwth-aachen.de/acplt/pyi40aas/-/issues/91 + This parameter is ignored if a decoder class is specified. + :param decoder: The decoder class used to decode the XML elements + :param constructor_kwargs: Keyword arguments passed to the constructor function + :raises ~lxml.etree.XMLSyntaxError: **Non-failsafe**: If the given file(-handle) has invalid XML + :raises KeyError: **Non-failsafe**: If a required namespace has not been declared on the XML document + :raises (~basyx.aas.model.base.AASConstraintViolation, KeyError, ValueError): **Non-failsafe**: Errors during + construction of the objects + :return: The constructed object or None, if an error occurred in failsafe mode. + """ + + try: + return read_aas_xml_element(file, construct, failsafe=failsafe, stripped=stripped, decoder=decoder, + **constructor_kwargs) + except ValueError: + decoder_ = _select_server_decoder(failsafe, stripped, decoder) + constructor: Callable[..., object] + + if construct == ServerXMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR: + constructor = decoder_.construct_asset_administration_shell_descriptor + elif construct == ServerXMLConstructables.SUBMODEL_DESCRIPTOR: + constructor = decoder_.construct_submodel_descriptor + else: + raise ValueError(f"{construct.name} cannot be constructed!") + + element = _parse_xml_document(file, failsafe=decoder_.failsafe) + return _failsafe_construct(element, constructor, decoder_.failsafe, **constructor_kwargs) diff --git a/sdk/basyx/aas/adapter/discovery.py b/server/app/discovery.py similarity index 96% rename from sdk/basyx/aas/adapter/discovery.py rename to server/app/discovery.py index e6e68cc67..f5f0a215f 100644 --- a/sdk/basyx/aas/adapter/discovery.py +++ b/server/app/discovery.py @@ -1,7 +1,11 @@ import itertools import werkzeug.exceptions from werkzeug.wrappers import Request, Response + +import server.app.server_model from basyx.aas import model +from server.app import server_model +from server.app.adapter.jsonization import ServerAASToJsonEncoder from .http import APIResponse, http_exception_to_response, get_response_type, HTTPApiDecoder from werkzeug.routing import MapAdapter, Rule, Submount from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request @@ -14,11 +18,10 @@ from pymongo.collection import Collection import json -from basyx.aas.adapter.json import AASToJsonEncoder def specific_asset_to_json_obj(asset_id: model.SpecificAssetId) -> dict: # Encode the asset to a JSON string and then decode to a dict. - json_str = AASToJsonEncoder().encode(asset_id) + json_str = ServerAASToJsonEncoder().encode(asset_id) return json.loads(json_str) class AbstractDiscoveryStore(metaclass=abc.ABCMeta): @@ -50,7 +53,7 @@ def delete_asset_links_by_aas(self, aas_identifier: model.Identifier) -> None: if key in self.aas_to_assets: del self.aas_to_assets[key] - def search_aas_by_asset_link(self, asset_link: model.AssetLink) -> List[str]: + def search_aas_by_asset_link(self, asset_link: server_model.AssetLink) -> List[str]: result = [] for asset_key, aas_ids in self.asset_to_aas.items(): expected_key = f"{asset_link.name}:{asset_link.value}" @@ -104,7 +107,7 @@ def delete_asset_links_by_aas(self, aas_identifier: model.Identifier) -> None: key = aas_identifier self.coll_aas_to_assets.delete_one({"_id": key}) - def search_aas_by_asset_link(self, asset_link: model.AssetLink) -> List[str]: + def search_aas_by_asset_link(self, asset_link: server_model.AssetLink) -> List[str]: # Query MongoDB for specificAssetIds where 'name' and 'value' match doc = self.coll_asset_to_aas.find_one({ "name": asset_link.name, @@ -190,7 +193,7 @@ def handle_request(self, request: Request): return http_exception_to_response(e, response_t) def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: - asset_links = HTTPApiDecoder.request_body_list(request, model.AssetLink, False) + asset_links = HTTPApiDecoder.request_body_list(request, server_model.AssetLink, False) matching_aas_keys = set() for asset_link in asset_links: aas_keys = self.persistent_store.search_aas_by_asset_link(asset_link) diff --git a/sdk/basyx/aas/adapter/http.py b/server/app/http.py similarity index 98% rename from sdk/basyx/aas/adapter/http.py rename to server/app/http.py index 30e26e419..554fb3211 100644 --- a/sdk/basyx/aas/adapter/http.py +++ b/server/app/http.py @@ -53,11 +53,16 @@ from werkzeug.wrappers import Request, Response from werkzeug.datastructures import FileStorage +import server.app.server_model as server_model from basyx.aas import model -from ._generic import XML_NS_MAP -from .xml import XMLConstructables, read_aas_xml_element, xml_serialization, object_to_xml_element -from .json import AASToJsonEncoder, StrictAASFromJsonDecoder, StrictStrippedAASFromJsonDecoder -from . import aasx +from basyx.aas.adapter._generic import XML_NS_MAP + +from basyx.aas.adapter import aasx + +from basyx.aas.adapter.xml import xml_serialization, XMLConstructables + +from server.app.adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element +from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple @@ -92,7 +97,7 @@ def __init__(self, success: bool, messages: Optional[List[Message]] = None): self.messages: List[Message] = messages -class ResultToJsonEncoder(AASToJsonEncoder): +class ResultToJsonEncoder(ServerAASToJsonEncoder): @classmethod def _result_to_json(cls, result: Result) -> Dict[str, object]: return { @@ -174,10 +179,10 @@ def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> root_elem.append(child) elif isinstance(obj, list): for item in obj: - item_elem = object_to_xml_element(item) + item_elem = xml_serialization.object_to_xml_element(item) root_elem.append(item_elem) else: - obj_elem = object_to_xml_element(obj) + obj_elem = xml_serialization.object_to_xml_element(obj) for child in obj_elem: root_elem.append(child) etree.cleanup_namespaces(root_elem) @@ -290,9 +295,9 @@ class HTTPApiDecoder: model.Submodel: XMLConstructables.SUBMODEL, model.SubmodelElement: XMLConstructables.SUBMODEL_ELEMENT, model.Reference: XMLConstructables.REFERENCE, - model.AssetAdministrationShellDescriptor: XMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR, - model.SubmodelDescriptor: XMLConstructables.SUBMODEL_DESCRIPTOR, - model.AssetLink: XMLConstructables.ASSET_LINK, + server_model.AssetAdministrationShellDescriptor: ServerXMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR, + server_model.SubmodelDescriptor: ServerXMLConstructables.SUBMODEL_DESCRIPTOR, + server_model.AssetLink: ServerXMLConstructables.ASSET_LINK, } @classmethod @@ -309,8 +314,8 @@ def assert_type(cls, obj: object, type_: Type[T]) -> T: @classmethod def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: cls.check_type_supportance(expect_type) - decoder: Type[StrictAASFromJsonDecoder] = StrictStrippedAASFromJsonDecoder if stripped \ - else StrictAASFromJsonDecoder + decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ + else ServerStrictAASFromJsonDecoder try: parsed = json.loads(data, cls=decoder) if not isinstance(parsed, list): @@ -340,7 +345,7 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool constructor = decoder._construct_asset_administration_shell_descriptor elif expect_type is model.SubmodelDescriptor: constructor = decoder._construct_submodel_descriptor - elif expect_type is model.AssetLink: + elif expect_type is server_model.AssetLink: constructor = decoder._construct_asset_link if constructor is not None: @@ -371,8 +376,8 @@ def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: cls.check_type_supportance(expect_type) try: xml_data = io.BytesIO(data) - rv = read_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], - stripped=stripped, failsafe=False) + rv = read_server_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], + stripped=stripped, failsafe=False) except (KeyError, ValueError) as e: # xml deserialization creates an error chain. since we only return one error, return the root cause f: BaseException = e diff --git a/server/app/main.py b/server/app/main.py index c502bfbe0..816bf621a 100644 --- a/server/app/main.py +++ b/server/app/main.py @@ -6,7 +6,7 @@ from basyx.aas.adapter import aasx from basyx.aas.backend.local_file import LocalFileObjectStore -from basyx.aas.adapter.http import WSGIApp +from server.app.http import WSGIApp storage_path = os.getenv("STORAGE_PATH", "/storage") storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") diff --git a/server/app/py.typed b/server/app/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/sdk/basyx/aas/adapter/registry.py b/server/app/registry.py similarity index 90% rename from sdk/basyx/aas/adapter/registry.py rename to server/app/registry.py index c3871c612..58e578c90 100644 --- a/sdk/basyx/aas/adapter/registry.py +++ b/server/app/registry.py @@ -8,34 +8,23 @@ This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". """ -import abc -import base64 -import binascii -import datetime -import enum -import io -import json import itertools -from lxml import etree import werkzeug.exceptions import werkzeug.routing import werkzeug.urls import werkzeug.utils -from werkzeug.exceptions import BadRequest, Conflict, NotFound, UnprocessableEntity +from werkzeug.exceptions import BadRequest, Conflict, NotFound from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response -from werkzeug.datastructures import FileStorage from basyx.aas import model -from ._generic import XML_NS_MAP -from .xml import XMLConstructables, read_aas_xml_element, xml_serialization, object_to_xml_element -from .json import AASToJsonEncoder, StrictAASFromJsonDecoder, StrictStrippedAASFromJsonDecoder -from . import aasx +import server.app.server_model as server_model + from .http import APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder from .http import Base64URLConverter -from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple +from typing import Dict, Iterable, Iterator, List, Type, TypeVar, Tuple def get_response_type(request: Request) -> Type[APIResponse]: response_types: Dict[str, Type[APIResponse]] = { @@ -134,12 +123,12 @@ def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T paginated_slice = itertools.islice(iterator, start_index, end_index) return paginated_slice, end_index - def _get_descriptors(self, request: "Request") -> Tuple[Iterator[model.AssetAdministrationShellDescriptor], int]: + def _get_descriptors(self, request: "Request") -> Tuple[Iterator[server_model.AssetAdministrationShellDescriptor], int]: """ Returns all Asset Administration Shell Descriptors """ - descriptors: Iterator[model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( - model.AssetAdministrationShellDescriptor + descriptors: Iterator[server_model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( + server_model.AssetAdministrationShellDescriptor ) id_short = request.args.get("idShort") @@ -162,14 +151,14 @@ def _get_descriptors(self, request: "Request") -> Tuple[Iterator[model.AssetAdmi paginated_descriptors, end_index = self._get_slice(request, descriptors) return paginated_descriptors, end_index - def _get_descriptor(self, url_args: Dict) -> model.AssetAdministrationShellDescriptor: - return self._get_obj_ts(url_args["aas_id"], model.AssetAdministrationShellDescriptor) + def _get_descriptor(self, url_args: Dict) -> server_model.AssetAdministrationShellDescriptor: + return self._get_obj_ts(url_args["aas_id"], server_model.AssetAdministrationShellDescriptor) - def _get_submodel_descriptors(self, request: Request) -> Tuple[Iterator[model.SubmodelDescriptor], int]: - submodel_descriptors: Iterator[model.Submodel] = self._get_all_obj_of_type(model.SubmodelDescriptor) + def _get_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: + submodel_descriptors: Iterator[model.Submodel] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) id_short = request.args.get("idShort") if id_short is not None: - submodel_descriptors= filter(lambda sm: sm.id_short == id_short, submodels) + submodel_descriptors = filter(lambda sm: sm.id_short == id_short, submodel_descriptors) semantic_id = request.args.get("semanticId") if semantic_id is not None: spec_semantic_id = HTTPApiDecoder.base64urljson( @@ -178,8 +167,8 @@ def _get_submodel_descriptors(self, request: Request) -> Tuple[Iterator[model.Su paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) return paginated_submodel_descriptors, end_index - def _get_submodel_descriptor(self, url_args: Dict) -> model.SubmodelDescriptor: - return self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor) + def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescriptor: + return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) def handle_request(self, request: Request): map_adapter: MapAdapter = self.url_map.bind_to_environ(request.environ) @@ -199,12 +188,12 @@ def handle_request(self, request: Request): # ------ AAS REGISTRY ROUTES ------- def get_aas_descriptors_all(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: - aasdescriptors, cursor = self._get_descriptors(request) - return response_t(list(aasdescriptors), cursor=cursor) + aas_descriptors, cursor = self._get_descriptors(request) + return response_t(list(aas_descriptors), cursor=cursor) def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter) -> Response: - descriptor = HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, False) + descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) try: self.object_store.add(descriptor) except KeyError as e: @@ -221,7 +210,7 @@ def get_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[ def put_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: descriptor = self._get_descriptor(url_args) - descriptor.update_from(HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, + descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, is_stripped_request(request))) descriptor.commit() return response_t() @@ -267,7 +256,7 @@ def post_submodel_descriptor_through_superpath(self, map_adapter: MapAdapter) -> Response: aas_descriptor = self._get_descriptor(url_args) submodel_descriptor = HTTPApiDecoder.request_body(request, - model.SubmodelDescriptor, + server_model.SubmodelDescriptor, is_stripped_request( request)) if any(sd.id == submodel_descriptor.id for sd in @@ -301,7 +290,7 @@ def put_submodel_descriptor_by_id_through_superpath(self, f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") submodel_descriptor.update_from( HTTPApiDecoder.request_body(request, - model.SubmodelDescriptor, + server_model.SubmodelDescriptor, is_stripped_request(request))) aas_descriptor.commit() return response_t() @@ -336,7 +325,7 @@ def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, respon def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter) -> Response: - submodel_descriptor = HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, is_stripped_request(request)) + submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request)) try: self.object_store.add(submodel_descriptor) except KeyError as e: @@ -350,12 +339,12 @@ def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: submodel_descriptor = self._get_submodel_descriptor(url_args) - submodel_descriptor.update_from(HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, is_stripped_request(request))) + submodel_descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) submodel_descriptor.commit() return response_t() def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: - self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor)) + self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor)) return response_t() diff --git a/server/app/server_model.py b/server/app/server_model.py new file mode 100644 index 000000000..bf6d50bee --- /dev/null +++ b/server/app/server_model.py @@ -0,0 +1,220 @@ +from __future__ import absolute_import + +import abc +import re +from enum import Enum + +from typing import Optional, List, Iterable + +import server.app +from basyx.aas.model import base, NamespaceSet + + +class AssetLink: + def __init__(self, name: base.LabelType, value: base.Identifier): + if not name: + raise ValueError("AssetLink 'name' must be a non-empty string.") + if not value: + raise ValueError("AssetLink 'value' must be a non-empty string.") + self.name = name + self.value = value + + +class SecurityTypeEnum(Enum): + NONE = "NONE" + RFC_TLSA = "RFC_TLSA" + W3C_DID = "W3C_DID" + + +class SecurityAttributeObject: + def __init__(self, type_: SecurityTypeEnum, key: str, value: str): + + if not isinstance(type_, SecurityTypeEnum): + raise ValueError(f"Invalid security type: {type_}. Must be one of {list(SecurityTypeEnum)}") + if not key or not isinstance(key, str): + raise ValueError("Key must be a non-empty string.") + if not value or not isinstance(value, str): + raise ValueError("Value must be a non-empty string.") + self.type = type_ + self.key = key + self.value = value + + +class ProtocolInformation: + + def __init__( + self, + href: str, + endpoint_protocol: Optional[str] = None, + endpoint_protocol_version: Optional[List[str]] = None, + subprotocol: Optional[str] = None, + subprotocol_body: Optional[str] = None, + subprotocol_body_encoding: Optional[str] = None, + security_attributes: Optional[List[SecurityAttributeObject]] = None + ): + if not href or not isinstance(href, str): + raise ValueError("href must be a non-empty string representing a valid URL.") + + self.href = href + self.endpoint_protocol = endpoint_protocol + self.endpoint_protocol_version = endpoint_protocol_version or [] + self.subprotocol = subprotocol + self.subprotocol_body = subprotocol_body + self.subprotocol_body_encoding = subprotocol_body_encoding + self.security_attributes = security_attributes or [] + + +class Endpoint: + INTERFACE_SHORTNAMES = { + "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", + "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", + "CD-REPOSITORY", "AAS-DISCOVERY" + } + VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") + + def __init__(self, interface: base.NameType, protocol_information: ProtocolInformation): # noqa: E501 + + self.interface = interface + self.protocol_information = protocol_information + + @property + def interface(self) -> str: + return self._interface + + @interface.setter + def interface(self, interface: base.NameType): + if interface is None: + raise ValueError("Invalid value for `interface`, must not be `None`") + if not self.is_valid_interface(interface): + raise ValueError(f"Invalid interface format: {interface}. Expected format: '-', ") + + self._interface = interface + + @classmethod + def is_valid_interface(cls, interface: base.NameType) -> bool: + parts = interface.split("-", 1) + if len(parts) != 2: + return False + short_name, version = parts + return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) + + @property + def protocol_information(self) -> ProtocolInformation: + return self._protocol_information + + @protocol_information.setter + def protocol_information(self, protocol_information: ProtocolInformation): + if protocol_information is None: + raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 + + self._protocol_information = protocol_information + + +class Descriptor(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __init__(self, description: Optional[base.MultiLanguageTextType] = None, + display_name: Optional[base.MultiLanguageNameType] = None, extension: Iterable[base.Extension] = ()): + super().__init__() + self.namespace_element_sets: List[NamespaceSet] = [] + self.description: Optional[base.MultiLanguageTextType] = description + self.display_name: Optional[base.MultiLanguageNameType] = display_name + self.extension = base.NamespaceSet(self, [("name", True)], extension) + + @property + def description(self) -> Optional[base.MultiLanguageTextType]: + return self._description + + @description.setter + def description(self, value: Optional[base.MultiLanguageTextType]): + self._description = value + + @property + def display_name(self) -> Optional[base.MultiLanguageNameType]: + return self._display_name + + @display_name.setter + def display_name(self, value: Optional[base.MultiLanguageNameType]): + self._display_name = value + + def commit(self): + pass + + def update(self): + pass + + def update_from(self, other: "Referable", update_source: bool = False): + pass + + +class SubmodelDescriptor(Descriptor): + + def __init__(self, id_: base.Identifier, endpoints: List[Endpoint], + administration: Optional[base.AdministrativeInformation] = None, + id_short: Optional[base.NameType] = None, semantic_id: Optional[base.Reference] = None, + supplemental_semantic_id: Iterable[base.Reference] = ()): + super().__init__() + self.id: base.Identifier = id_ + self.endpoints: List[Endpoint] = endpoints + self.administration: Optional[base.AdministrativeInformation] = administration + self.id_short: Optional[base.NameType] = id_short + self.semantic_id: Optional[base.Reference] = semantic_id + self.supplemental_semantic_id: base.ConstrainedList[base.Reference] = \ + base.ConstrainedList(supplemental_semantic_id) + + +class AssetAdministrationShellDescriptor(Descriptor): + + def __init__(self, + id_: base.Identifier, + administration: Optional[base.AdministrativeInformation] = None, + asset_kind: Optional[base.AssetKind] = None, + asset_type: Optional[base.Identifier] = None, + endpoints: Optional[List[Endpoint]] = None, + global_asset_id: Optional[base.Identifier] = None, + id_short: Optional[base.NameType] = None, + specific_asset_id: Iterable[base.SpecificAssetId] = (), + submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, + description: Optional[base.MultiLanguageTextType] = None, + display_name: Optional[base.MultiLanguageNameType] = None, + extension: Iterable[base.Extension] = ()): + """AssetAdministrationShellDescriptor - + + Nur das 'id'-Feld (id_) ist zwingend erforderlich. Alle anderen Felder erhalten Defaultwerte. + """ + super().__init__() + self.administration: Optional[base.AdministrativeInformation] = administration + self.asset_kind: Optional[base.AssetKind] = asset_kind + self.asset_type: Optional[base.Identifier] = asset_type + self.endpoints: Optional[ + List[Endpoint]] = endpoints if endpoints is not None else [] # leere Liste, falls nicht gesetzt + self.global_asset_id: Optional[base.Identifier] = global_asset_id + self.id_short: Optional[base.NameType] = id_short + self.id: base.Identifier = id_ + self._specific_asset_id: base.ConstrainedList[base.SpecificAssetId] = base.ConstrainedList( + specific_asset_id, + item_set_hook=self._check_constraint_set_spec_asset_id, + item_del_hook=self._check_constraint_del_spec_asset_id + ) + self.submodel_descriptors = submodel_descriptors if submodel_descriptors is not None else [] + self.description: Optional[base.MultiLanguageTextType] = description + self.display_name: Optional[base.MultiLanguageNameType] = display_name + self.extension = base.NamespaceSet(self, [("name", True)], extension) + + @property + def specific_asset_id(self) -> base.ConstrainedList[base.SpecificAssetId]: + return self._specific_asset_id + + @specific_asset_id.setter + def specific_asset_id(self, specific_asset_id: Iterable[base.SpecificAssetId]) -> None: + # constraints are checked via _check_constraint_set_spec_asset_id() in this case + self._specific_asset_id[:] = specific_asset_id + + def _check_constraint_set_spec_asset_id(self, items_to_replace: List[base.SpecificAssetId], + new_items: List[base.SpecificAssetId], + old_list: List[base.SpecificAssetId]) -> None: + self._validate_aasd_131(self.global_asset_id, + len(old_list) - len(items_to_replace) + len(new_items) > 0) + + def _check_constraint_del_spec_asset_id(self, _item_to_del: base.SpecificAssetId, + old_list: List[base.SpecificAssetId]) -> None: + self._validate_aasd_131(self.global_asset_id, len(old_list) > 1) diff --git a/server/pyproject.toml b/server/pyproject.toml new file mode 100644 index 000000000..7a6af3106 --- /dev/null +++ b/server/pyproject.toml @@ -0,0 +1,63 @@ +[build-system] +requires = [ + "setuptools>=45", + "wheel", + "setuptools_scm[toml]>=6.2" +] +build-backend = "setuptools.build_meta" + +[tool.setuptools_scm] +# Configure setuptools_scm for version management: +# - Automatically infers the version number from the most recent git tag +# - Generates a version.py file in the package directory +# - Allows for automatic versioning between releases (e.g., 1.0.1.dev4+g12345) +# If you want to use the version anywhere in the code, use +# ``` +# from basyx.version import version +# print(f"Project version: {version}") +# ``` +root = ".." # Defines the path to the root of the repository +version_file = "app/version.py" + +[project] +name = "basyx-python-server" +dynamic = ["version"] +description = "The Eclipse BaSyx Python Server, an implementation of the BaSyx AAS Server" #FIXME +authors = [ + { name = "The Eclipse BaSyx Authors", email = "admins@iat.rwth-aachen.de" } +] +readme = "README.md" +license = { file = "LICENSE" } +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Development Status :: 5 - Production/Stable" +] +requires-python = ">=3.9" +dependencies = [ + "basyx-python-sdk", #TODO: Think about the version + "urllib3>=1.26,<3", + "Werkzeug>=3.0.3,<4", +] + +[project.optional-dependencies] +dev = [ + "mypy", + "pycodestyle", + "codeblocks", + "coverage", + "schemathesis~=3.7", + "jsonschema~=4.7", + "hypothesis~=6.13", + "types-python-dateutil", +] + +[project.urls] +"Homepage" = "https://github.com/eclipse-basyx/basyx-python-sdk" + +[tool.setuptools] +packages = { find = { include = ["basyx*"], exclude = ["test*"] } } + +[tool.setuptools.package-data] +app = ["py.typed"] From a6577beb642f449f2af7fbddf5b3b82b36f64cb0 Mon Sep 17 00:00:00 2001 From: zrgt Date: Tue, 15 Apr 2025 17:46:49 +0200 Subject: [PATCH 08/76] Refactor `_get_aas_class_parsers` Create a static method for the `aas_class_parsers` so that we can overload this method in `ServerAASFromJsonDecoder` and avoid code duplication by copy/paste `object_hook()` --- .../aas/adapter/json/json_deserialization.py | 35 +++++---- server/app/adapter/jsonization.py | 72 ++----------------- 2 files changed, 30 insertions(+), 77 deletions(-) diff --git a/sdk/basyx/aas/adapter/json/json_deserialization.py b/sdk/basyx/aas/adapter/json/json_deserialization.py index c1ce35fef..c1765eb95 100644 --- a/sdk/basyx/aas/adapter/json/json_deserialization.py +++ b/sdk/basyx/aas/adapter/json/json_deserialization.py @@ -154,19 +154,20 @@ def __init__(self, *args, **kwargs): json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs) @classmethod - def object_hook(cls, dct: Dict[str, object]) -> object: - # Check if JSON object seems to be a deserializable AAS object (i.e. it has a modelType). Otherwise, the JSON - # object is returned as is, so it's possible to mix AAS objects with other data within a JSON structure. - if 'modelType' not in dct: - return dct + def _get_aas_class_parsers(cls) -> Dict[str, Callable[[Dict[str, object]], object]]: + """ + Returns the dictionary of AAS class parsers. - # The following dict specifies a constructor method for all AAS classes that may be identified using the - # ``modelType`` attribute in their JSON representation. Each of those constructor functions takes the JSON - # representation of an object and tries to construct a Python object from it. Embedded objects that have a - # modelType themselves are expected to be converted to the correct PythonType already. Additionally, each - # function takes a bool parameter ``failsafe``, which indicates weather to log errors and skip defective objects - # instead of raising an Exception. - AAS_CLASS_PARSERS: Dict[str, Callable[[Dict[str, object]], object]] = { + The following dict specifies a constructor method for all AAS classes that may be identified using the + ``modelType`` attribute in their JSON representation. Each of those constructor functions takes the JSON + representation of an object and tries to construct a Python object from it. Embedded objects that have a + modelType themselves are expected to be converted to the correct PythonType already. Additionally, each + function takes a bool parameter ``failsafe``, which indicates weather to log errors and skip defective objects + instead of raising an Exception. + + :return: The dictionary of AAS class parsers + """ + aas_class_parsers: Dict[str, Callable[[Dict[str, object]], object]] = { 'AssetAdministrationShell': cls._construct_asset_administration_shell, 'AssetInformation': cls._construct_asset_information, 'SpecificAssetId': cls._construct_specific_asset_id, @@ -189,6 +190,16 @@ def object_hook(cls, dct: Dict[str, object]) -> object: 'ReferenceElement': cls._construct_reference_element, 'DataSpecificationIec61360': cls._construct_data_specification_iec61360, } + return aas_class_parsers + + @classmethod + def object_hook(cls, dct: Dict[str, object]) -> object: + # Check if JSON object seems to be a deserializable AAS object (i.e. it has a modelType). Otherwise, the JSON + # object is returned as is, so it's possible to mix AAS objects with other data within a JSON structure. + if 'modelType' not in dct: + return dct + + AAS_CLASS_PARSERS = cls._get_aas_class_parsers() # Get modelType and constructor function if not isinstance(dct['modelType'], str): diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 251127339..b0dcdfa04 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -9,7 +9,6 @@ import json import logging -import pprint from typing import Callable import contextlib @@ -20,73 +19,16 @@ class ServerAASFromJsonDecoder(AASFromJsonDecoder): @classmethod - def object_hook(cls, dct: Dict[str, object]) -> object: - # Check if JSON object seems to be a deserializable AAS object (i.e. it has a modelType). Otherwise, the JSON - # object is returned as is, so it's possible to mix AAS objects with other data within a JSON structure. - if 'modelType' not in dct: - return dct - - # The following dict specifies a constructor method for all AAS classes that may be identified using the - # ``modelType`` attribute in their JSON representation. Each of those constructor functions takes the JSON - # representation of an object and tries to construct a Python object from it. Embedded objects that have a - # modelType themselves are expected to be converted to the correct PythonType already. Additionally, each - # function takes a bool parameter ``failsafe``, which indicates weather to log errors and skip defective objects - # instead of raising an Exception. - AAS_CLASS_PARSERS: Dict[str, Callable[[Dict[str, object]], object]] = { - 'AssetAdministrationShell': cls._construct_asset_administration_shell, - 'AssetInformation': cls._construct_asset_information, - 'SpecificAssetId': cls._construct_specific_asset_id, - 'ConceptDescription': cls._construct_concept_description, - 'Extension': cls._construct_extension, - 'Submodel': cls._construct_submodel, - 'Capability': cls._construct_capability, - 'Entity': cls._construct_entity, - 'BasicEventElement': cls._construct_basic_event_element, - 'Operation': cls._construct_operation, - 'RelationshipElement': cls._construct_relationship_element, - 'AnnotatedRelationshipElement': cls._construct_annotated_relationship_element, - 'SubmodelElementCollection': cls._construct_submodel_element_collection, - 'SubmodelElementList': cls._construct_submodel_element_list, - 'Blob': cls._construct_blob, - 'File': cls._construct_file, - 'MultiLanguageProperty': cls._construct_multi_language_property, - 'Property': cls._construct_property, - 'Range': cls._construct_range, - 'ReferenceElement': cls._construct_reference_element, - 'DataSpecificationIec61360': cls._construct_data_specification_iec61360, + def _get_aas_class_parsers(cls) -> Dict[str, Callable[[Dict[str, object]], object]]: + aas_class_parsers = super()._get_aas_class_parsers() + aas_class_parsers.update({ 'AssetAdministrationShellDescriptor': cls._construct_asset_administration_shell_descriptor, 'SubmodelDescriptor': cls._construct_submodel_descriptor, 'AssetLink': cls._construct_asset_link, - } - - # Get modelType and constructor function - if not isinstance(dct['modelType'], str): - logger.warning("JSON object has unexpected format of modelType: %s", dct['modelType']) - # Even in strict mode, we consider 'modelType' attributes of wrong type as non-AAS objects instead of - # raising an exception. However, the object's type will probably checked later by read_json_aas_file() or - # _expect_type() - return dct - model_type = dct['modelType'] - if model_type not in AAS_CLASS_PARSERS: - if not cls.failsafe: - raise TypeError("Found JSON object with modelType=\"%s\", which is not a known AAS class" % model_type) - logger.error("Found JSON object with modelType=\"%s\", which is not a known AAS class", model_type) - return dct - - # Use constructor function to transform JSON representation into BaSyx Python SDK model object - try: - return AAS_CLASS_PARSERS[model_type](dct) - except (KeyError, TypeError, model.AASConstraintViolation) as e: - error_message = "Error while trying to convert JSON object into {}: {} >>> {}".format( - model_type, e, pprint.pformat(dct, depth=2, width=2 ** 14, compact=True)) - if cls.failsafe: - logger.error(error_message, exc_info=e) - # In failsafe mode, we return the raw JSON object dict, if there were errors while parsing an object, so - # a client application is able to handle this data. The read_json_aas_file() function and all - # constructors for complex objects will skip those items by using _expect_type(). - return dct - else: - raise (type(e) if isinstance(e, (KeyError, TypeError)) else TypeError)(error_message) from e + 'ProtocolInformation': cls._construct_protocol_information, + 'Endpoint': cls._construct_endpoint + }) + return aas_class_parsers # ################################################################################################## # Utility Methods used in constructor methods to add general attributes (from abstract base classes) From 11c59bc0287086bfadcdc076e0c621b730a42f4e Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 15 Apr 2025 20:53:01 +0200 Subject: [PATCH 09/76] fix aas_descriptor construct method --- server/app/adapter/jsonization.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index b0dcdfa04..ebfe06895 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -58,14 +58,12 @@ def _construct_asset_administration_shell_descriptor( if 'administration' in dct: ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) if 'assetkind' in dct: - # FIXME - asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] + ret.asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] if 'assetType' in dct: ret.asset_type = _get_ts(dct, 'assetType', str) global_asset_id = None if 'globalAssetId' in dct: - # FIXME - global_asset_id = _get_ts(dct, 'globalAssetId', str) + ret.global_asset_id = _get_ts(dct, 'globalAssetId', str) specific_asset_id = set() if 'specificAssetIds' in dct: for desc_data in _get_ts(dct, "specificAssetIds", list): From 6d4aab1aa8b3478641a57a02b9caf2b8375493d6 Mon Sep 17 00:00:00 2001 From: zrgt Date: Tue, 15 Apr 2025 20:59:54 +0200 Subject: [PATCH 10/76] Refactor `read_aas_json_file_into` Create a KEYS_TO_TYPE tuple with top-level JSON keys and the corresponding SDK types. By providing this tuple as a param for `read_aas_json_file_into` we can reuse the method in `read_server_aas_json_file_into` and avoid code duplication --- .../aas/adapter/json/json_deserialization.py | 70 ++++++------ server/app/adapter/jsonization.py | 105 +++--------------- 2 files changed, 49 insertions(+), 126 deletions(-) diff --git a/sdk/basyx/aas/adapter/json/json_deserialization.py b/sdk/basyx/aas/adapter/json/json_deserialization.py index c1765eb95..83616f5b2 100644 --- a/sdk/basyx/aas/adapter/json/json_deserialization.py +++ b/sdk/basyx/aas/adapter/json/json_deserialization.py @@ -34,7 +34,7 @@ import json import logging import pprint -from typing import Dict, Callable, ContextManager, TypeVar, Type, List, IO, Optional, Set, get_args +from typing import Dict, Callable, ContextManager, TypeVar, Type, List, IO, Optional, Set, get_args, Tuple, Iterable from basyx.aas import model from .._generic import MODELLING_KIND_INVERSE, ASSET_KIND_INVERSE, KEY_TYPES_INVERSE, ENTITY_TYPES_INVERSE, \ @@ -808,9 +808,17 @@ def _select_decoder(failsafe: bool, stripped: bool, decoder: Optional[Type[AASFr return StrictAASFromJsonDecoder +KEYS_TO_TYPES = ( + ('assetAdministrationShells', model.AssetAdministrationShell), + ('submodels', model.Submodel), + ('conceptDescriptions', model.ConceptDescription) +) + + def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, - decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: + decoder: Optional[Type[AASFromJsonDecoder]] = None, + keys_to_types: Iterable[Tuple[str, any]] = KEYS_TO_TYPES) -> Set[model.Identifier]: """ Read an Asset Administration Shell JSON file according to 'Details of the Asset Administration Shell', chapter 5.5 into a given object store. @@ -828,6 +836,7 @@ def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathO See https://git.rwth-aachen.de/acplt/pyi40aas/-/issues/91 This parameter is ignored if a decoder class is specified. :param decoder: The decoder class used to decode the JSON objects + :param keys_to_types: A dictionary of JSON keys to expected types. This is used to check the type of the objects :raises KeyError: **Non-failsafe**: Encountered a duplicate identifier :raises KeyError: Encountered an identifier that already exists in the given ``object_store`` with both ``replace_existing`` and ``ignore_existing`` set to ``False`` @@ -854,45 +863,38 @@ def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathO with cm as fp: data = json.load(fp, cls=decoder_) - for name, expected_type in (('assetAdministrationShells', model.AssetAdministrationShell), - ('submodels', model.Submodel), - ('conceptDescriptions', model.ConceptDescription)): + for name, expected_type in keys_to_types: try: lst = _get_ts(data, name, list) except (KeyError, TypeError): continue for item in lst: - error_message = "Expected a {} in list '{}', but found {}".format( - expected_type.__name__, name, repr(item)) - if isinstance(item, model.Identifiable): - if not isinstance(item, expected_type): - if decoder_.failsafe: - logger.warning("{} was in wrong list '{}'; nevertheless, we'll use it".format(item, name)) - else: - raise TypeError(error_message) - if item.id in ret: - error_message = f"{item} has a duplicate identifier already parsed in the document!" - if not decoder_.failsafe: - raise KeyError(error_message) - logger.error(error_message + " skipping it...") + if not isinstance(item, expected_type): + if not decoder_.failsafe: + raise TypeError(f"{item} was in the wrong list '{name}'") + logger.warning(f"{item} was in the wrong list '{name}'; nevertheless, we'll use it") + + if item.id in ret: + error_msg = f"{item} has a duplicate identifier already parsed in the document!" + if not decoder_.failsafe: + raise KeyError(error_msg) + logger.error(f"{error_msg} skipping it...") + continue + + existing_element = object_store.get(item.id) + if existing_element is not None: + if not replace_existing: + error_msg = f"Object with id '{item.id}' already exists in store: {existing_element}!" + if not ignore_existing: + raise KeyError(f"{error_msg} Failed to insert {item}!") + logger.info(f"{error_msg}; Skipping {item}...") continue - existing_element = object_store.get(item.id) - if existing_element is not None: - if not replace_existing: - error_message = f"object with identifier {item.id} already exists " \ - f"in the object store: {existing_element}!" - if not ignore_existing: - raise KeyError(error_message + f" failed to insert {item}!") - logger.info(error_message + f" skipping insertion of {item}...") - continue - object_store.discard(existing_element) - object_store.add(item) - ret.add(item.id) - elif decoder_.failsafe: - logger.error(error_message) - else: - raise TypeError(error_message) + object_store.discard(existing_element) + + object_store.add(item) + ret.add(item.id) + return ret diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index b0dcdfa04..6fdea97d9 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -1,18 +1,16 @@ -from typing import Dict, Set, ContextManager, IO, get_args, Optional, Type, List +from typing import Dict, Set, Optional, Type, List import server.app.server_model as server_model from basyx.aas import model from basyx.aas.adapter import _generic -from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, Path, PathOrIO +from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO from basyx.aas.adapter.json import AASToJsonEncoder -from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, _select_decoder +from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, KEYS_TO_TYPES, \ + read_aas_json_file_into -import json import logging from typing import Callable -import contextlib - logger = logging.getLogger(__name__) @@ -209,94 +207,17 @@ class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, Ser pass -def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, +def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: - """ - Read an Asset Administration Shell JSON file according to 'Details of the Asset Administration Shell', chapter 5.5 - into a given object store. - - :param object_store: The :class:`ObjectStore ` in which the - identifiable objects should be stored - :param file: A filename or file-like object to read the JSON-serialized data from - :param replace_existing: Whether to replace existing objects with the same identifier in the object store or not - :param ignore_existing: Whether to ignore existing objects (e.g. log a message) or raise an error. - This parameter is ignored if replace_existing is ``True``. - :param failsafe: If ``True``, the document is parsed in a failsafe way: Missing attributes and elements are logged - instead of causing exceptions. Defect objects are skipped. - This parameter is ignored if a decoder class is specified. - :param stripped: If ``True``, stripped JSON objects are parsed. - See https://git.rwth-aachen.de/acplt/pyi40aas/-/issues/91 - This parameter is ignored if a decoder class is specified. - :param decoder: The decoder class used to decode the JSON objects - :raises KeyError: **Non-failsafe**: Encountered a duplicate identifier - :raises KeyError: Encountered an identifier that already exists in the given ``object_store`` with both - ``replace_existing`` and ``ignore_existing`` set to ``False`` - :raises (~basyx.aas.model.base.AASConstraintViolation, KeyError, ValueError, TypeError): **Non-failsafe**: - Errors during construction of the objects - :raises TypeError: **Non-failsafe**: Encountered an element in the wrong list - (e.g. an AssetAdministrationShell in ``submodels``) - :return: A set of :class:`Identifiers ` that were added to object_store - """ - ret: Set[model.Identifier] = set() - decoder_ = _select_decoder(failsafe, stripped, decoder) - - # json.load() accepts TextIO and BinaryIO - cm: ContextManager[IO] - if isinstance(file, get_args(Path)): - # 'file' is a path, needs to be opened first - cm = open(file, "r", encoding="utf-8-sig") - else: - # 'file' is not a path, thus it must already be IO - # mypy seems to have issues narrowing the type due to get_args() - cm = contextlib.nullcontext(file) # type: ignore[arg-type] - - # read, parse and convert JSON file - with cm as fp: - data = json.load(fp, cls=decoder_) - - for name, expected_type in (('assetAdministrationShells', model.AssetAdministrationShell), - ('submodels', model.Submodel), - ('conceptDescriptions', model.ConceptDescription), - ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), - ('submodelDescriptors', server_model.SubmodelDescriptor)): - try: - lst = _get_ts(data, name, list) - except (KeyError, TypeError): - continue - - for item in lst: - error_message = "Expected a {} in list '{}', but found {}".format( - expected_type.__name__, name, repr(item)) - if isinstance(item, model.Identifiable): - if not isinstance(item, expected_type): - if decoder_.failsafe: - logger.warning("{} was in wrong list '{}'; nevertheless, we'll use it".format(item, name)) - else: - raise TypeError(error_message) - if item.id in ret: - error_message = f"{item} has a duplicate identifier already parsed in the document!" - if not decoder_.failsafe: - raise KeyError(error_message) - logger.error(error_message + " skipping it...") - continue - existing_element = object_store.get(item.id) - if existing_element is not None: - if not replace_existing: - error_message = f"object with identifier {item.id} already exists " \ - f"in the object store: {existing_element}!" - if not ignore_existing: - raise KeyError(error_message + f" failed to insert {item}!") - logger.info(error_message + f" skipping insertion of {item}...") - continue - object_store.discard(existing_element) - object_store.add(item) - ret.add(item.id) - elif decoder_.failsafe: - logger.error(error_message) - else: - raise TypeError(error_message) - return ret + keys_to_types = list(KEYS_TO_TYPES) + keys_to_types.extend([ + ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), + ('submodelDescriptors', server_model.SubmodelDescriptor) + ]) + return read_aas_json_file_into(object_store=object_store, file=file, replace_existing=replace_existing, + ignore_existing=ignore_existing, failsafe=failsafe, stripped=stripped, + decoder=decoder, keys_to_types=keys_to_types) class ServerAASToJsonEncoder(AASToJsonEncoder): From a34230f166bd4a56a2479735a3683617b2bed8d3 Mon Sep 17 00:00:00 2001 From: zrgt Date: Tue, 15 Apr 2025 21:11:24 +0200 Subject: [PATCH 11/76] Refactor `default()` Create a class method `_get_aas_class_serializers` for the mapping in `default()` so that we can overload `_get_aas_class_serializers` in `ServerAASToJsonEncoder` and avoid code duplication by copy/paste `default()` --- .../aas/adapter/json/json_serialization.py | 65 ++++++++++--------- server/app/adapter/jsonization.py | 58 ++++------------- 2 files changed, 46 insertions(+), 77 deletions(-) diff --git a/sdk/basyx/aas/adapter/json/json_serialization.py b/sdk/basyx/aas/adapter/json/json_serialization.py index 8c6a671f1..1cdfe12d9 100644 --- a/sdk/basyx/aas/adapter/json/json_serialization.py +++ b/sdk/basyx/aas/adapter/json/json_serialization.py @@ -57,6 +57,40 @@ class AASToJsonEncoder(json.JSONEncoder): """ stripped = False + @classmethod + def _get_aas_class_serializers(cls) -> Dict[Type, Callable]: + mapping: Dict[Type, Callable] = { + model.AdministrativeInformation: cls._administrative_information_to_json, + model.AnnotatedRelationshipElement: cls._annotated_relationship_element_to_json, + model.AssetAdministrationShell: cls._asset_administration_shell_to_json, + model.AssetInformation: cls._asset_information_to_json, + model.BasicEventElement: cls._basic_event_element_to_json, + model.Blob: cls._blob_to_json, + model.Capability: cls._capability_to_json, + model.ConceptDescription: cls._concept_description_to_json, + model.DataSpecificationIEC61360: cls._data_specification_iec61360_to_json, + model.Entity: cls._entity_to_json, + model.Extension: cls._extension_to_json, + model.File: cls._file_to_json, + model.Key: cls._key_to_json, + model.LangStringSet: cls._lang_string_set_to_json, + model.MultiLanguageProperty: cls._multi_language_property_to_json, + model.Operation: cls._operation_to_json, + model.Property: cls._property_to_json, + model.Qualifier: cls._qualifier_to_json, + model.Range: cls._range_to_json, + model.Reference: cls._reference_to_json, + model.ReferenceElement: cls._reference_element_to_json, + model.RelationshipElement: cls._relationship_element_to_json, + model.Resource: cls._resource_to_json, + model.SpecificAssetId: cls._specific_asset_id_to_json, + model.Submodel: cls._submodel_to_json, + model.SubmodelElementCollection: cls._submodel_element_collection_to_json, + model.SubmodelElementList: cls._submodel_element_list_to_json, + model.ValueReferencePair: cls._value_reference_pair_to_json, + } + return mapping + def default(self, obj: object) -> object: """ The overwritten ``default`` method for :class:`json.JSONEncoder` @@ -64,36 +98,7 @@ def default(self, obj: object) -> object: :param obj: The object to serialize to json :return: The serialized object """ - mapping: Dict[Type, Callable] = { - model.AdministrativeInformation: self._administrative_information_to_json, - model.AnnotatedRelationshipElement: self._annotated_relationship_element_to_json, - model.AssetAdministrationShell: self._asset_administration_shell_to_json, - model.AssetInformation: self._asset_information_to_json, - model.BasicEventElement: self._basic_event_element_to_json, - model.Blob: self._blob_to_json, - model.Capability: self._capability_to_json, - model.ConceptDescription: self._concept_description_to_json, - model.DataSpecificationIEC61360: self._data_specification_iec61360_to_json, - model.Entity: self._entity_to_json, - model.Extension: self._extension_to_json, - model.File: self._file_to_json, - model.Key: self._key_to_json, - model.LangStringSet: self._lang_string_set_to_json, - model.MultiLanguageProperty: self._multi_language_property_to_json, - model.Operation: self._operation_to_json, - model.Property: self._property_to_json, - model.Qualifier: self._qualifier_to_json, - model.Range: self._range_to_json, - model.Reference: self._reference_to_json, - model.ReferenceElement: self._reference_element_to_json, - model.RelationshipElement: self._relationship_element_to_json, - model.Resource: self._resource_to_json, - model.SpecificAssetId: self._specific_asset_id_to_json, - model.Submodel: self._submodel_to_json, - model.SubmodelElementCollection: self._submodel_element_collection_to_json, - model.SubmodelElementList: self._submodel_element_list_to_json, - model.ValueReferencePair: self._value_reference_pair_to_json, - } + mapping = self._get_aas_class_serializers() for typ in mapping: if isinstance(obj, typ): mapping_method = mapping[typ] diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 6fdea97d9..58c9ec6f0 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -222,53 +222,17 @@ def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file class ServerAASToJsonEncoder(AASToJsonEncoder): - def default(self, obj: object) -> object: - """ - The overwritten ``default`` method for :class:`json.JSONEncoder` - - :param obj: The object to serialize to json - :return: The serialized object - """ - mapping: Dict[Type, Callable] = { - model.AdministrativeInformation: self._administrative_information_to_json, - model.AnnotatedRelationshipElement: self._annotated_relationship_element_to_json, - model.AssetAdministrationShell: self._asset_administration_shell_to_json, - model.AssetInformation: self._asset_information_to_json, - model.BasicEventElement: self._basic_event_element_to_json, - model.Blob: self._blob_to_json, - model.Capability: self._capability_to_json, - model.ConceptDescription: self._concept_description_to_json, - model.DataSpecificationIEC61360: self._data_specification_iec61360_to_json, - model.Entity: self._entity_to_json, - model.Extension: self._extension_to_json, - model.File: self._file_to_json, - model.Key: self._key_to_json, - model.LangStringSet: self._lang_string_set_to_json, - model.MultiLanguageProperty: self._multi_language_property_to_json, - model.Operation: self._operation_to_json, - model.Property: self._property_to_json, - model.Qualifier: self._qualifier_to_json, - model.Range: self._range_to_json, - model.Reference: self._reference_to_json, - model.ReferenceElement: self._reference_element_to_json, - model.RelationshipElement: self._relationship_element_to_json, - model.Resource: self._resource_to_json, - model.SpecificAssetId: self._specific_asset_id_to_json, - model.Submodel: self._submodel_to_json, - model.SubmodelElementCollection: self._submodel_element_collection_to_json, - model.SubmodelElementList: self._submodel_element_list_to_json, - model.ValueReferencePair: self._value_reference_pair_to_json, - server_model.AssetAdministrationShellDescriptor: self._asset_administration_shell_descriptor_to_json, - server_model.SubmodelDescriptor: self._submodel_descriptor_to_json, - server_model.Endpoint: self._endpoint_to_json, - server_model.ProtocolInformation: self._protocol_information_to_json, - server_model.AssetLink: self._asset_link_to_json - } - for typ in mapping: - if isinstance(obj, typ): - mapping_method = mapping[typ] - return mapping_method(obj) - return super().default(obj) + @classmethod + def _get_aas_class_serializers(cls) -> Dict[Type, Callable]: + serializers = super()._get_aas_class_serializers() + serializers.update({ + server_model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, + server_model.SubmodelDescriptor: cls._submodel_descriptor_to_json, + server_model.Endpoint: cls._endpoint_to_json, + server_model.ProtocolInformation: cls._protocol_information_to_json, + server_model.AssetLink: cls._asset_link_to_json + }) + return serializers @classmethod def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: From 9079d82c2542e8d54129811a868f53f2e67e4eea Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 15 Apr 2025 22:19:14 +0200 Subject: [PATCH 12/76] fix method update_from --- server/app/server_model.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/server/app/server_model.py b/server/app/server_model.py index bf6d50bee..65fde1161 100644 --- a/server/app/server_model.py +++ b/server/app/server_model.py @@ -142,8 +142,17 @@ def commit(self): def update(self): pass - def update_from(self, other: "Referable", update_source: bool = False): - pass + def update_from(self, other: "Descriptor", update_source: bool = False): + """ + Updates the descriptor's attributes from another descriptor. + + :param other: The descriptor to update from. + :param update_source: Placeholder for compatibility; not used in this context. + """ + for attr in vars(other): + if attr == "id": + continue # Skip updating the unique identifier of the AAS + setattr(self, attr, getattr(other, attr)) class SubmodelDescriptor(Descriptor): From a366538a0175f815b22a20fc80c697f0c81267a1 Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 01:05:20 +0200 Subject: [PATCH 13/76] Refactor `_create_dict()` - Refactor `_create_dict()` - Add `JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES` in `_generic` and use it for `_create_dict()` Create a class method `_get_aas_class_serializers` for the mapping in `default()` and in `read_aas_json_file_into()` - Use extended `JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES` in `read_server_aas_json_file_into` --- sdk/basyx/aas/adapter/_generic.py | 7 +++ .../aas/adapter/json/json_deserialization.py | 11 +---- .../aas/adapter/json/json_serialization.py | 48 +++++++++++-------- server/app/adapter/jsonization.py | 16 +++---- 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/sdk/basyx/aas/adapter/_generic.py b/sdk/basyx/aas/adapter/_generic.py index 6a37c7412..00d78caff 100644 --- a/sdk/basyx/aas/adapter/_generic.py +++ b/sdk/basyx/aas/adapter/_generic.py @@ -19,6 +19,13 @@ PathOrBinaryIO = Union[Path, BinaryIO] PathOrIO = Union[Path, IO] # IO is TextIO or BinaryIO +# JSON top-level keys and their corresponding model classes +JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES = ( + ('assetAdministrationShells', model.AssetAdministrationShell), + ('submodels', model.Submodel), + ('conceptDescriptions', model.ConceptDescription), +) + # XML Namespace definition XML_NS_MAP = {"aas": "https://admin-shell.io/aas/3/0"} XML_NS_AAS = "{" + XML_NS_MAP["aas"] + "}" diff --git a/sdk/basyx/aas/adapter/json/json_deserialization.py b/sdk/basyx/aas/adapter/json/json_deserialization.py index 83616f5b2..3e3f960a6 100644 --- a/sdk/basyx/aas/adapter/json/json_deserialization.py +++ b/sdk/basyx/aas/adapter/json/json_deserialization.py @@ -39,7 +39,7 @@ from basyx.aas import model from .._generic import MODELLING_KIND_INVERSE, ASSET_KIND_INVERSE, KEY_TYPES_INVERSE, ENTITY_TYPES_INVERSE, \ IEC61360_DATA_TYPES_INVERSE, IEC61360_LEVEL_TYPES_INVERSE, KEY_TYPES_CLASSES_INVERSE, REFERENCE_TYPES_INVERSE, \ - DIRECTION_INVERSE, STATE_OF_EVENT_INVERSE, QUALIFIER_KIND_INVERSE, PathOrIO, Path + DIRECTION_INVERSE, STATE_OF_EVENT_INVERSE, QUALIFIER_KIND_INVERSE, PathOrIO, Path, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES logger = logging.getLogger(__name__) @@ -808,17 +808,10 @@ def _select_decoder(failsafe: bool, stripped: bool, decoder: Optional[Type[AASFr return StrictAASFromJsonDecoder -KEYS_TO_TYPES = ( - ('assetAdministrationShells', model.AssetAdministrationShell), - ('submodels', model.Submodel), - ('conceptDescriptions', model.ConceptDescription) -) - - def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, decoder: Optional[Type[AASFromJsonDecoder]] = None, - keys_to_types: Iterable[Tuple[str, any]] = KEYS_TO_TYPES) -> Set[model.Identifier]: + keys_to_types: Iterable[Tuple[str, any]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) -> Set[model.Identifier]: """ Read an Asset Administration Shell JSON file according to 'Details of the Asset Administration Shell', chapter 5.5 into a given object store. diff --git a/sdk/basyx/aas/adapter/json/json_serialization.py b/sdk/basyx/aas/adapter/json/json_serialization.py index 1cdfe12d9..07820b7fe 100644 --- a/sdk/basyx/aas/adapter/json/json_serialization.py +++ b/sdk/basyx/aas/adapter/json/json_serialization.py @@ -30,11 +30,12 @@ import contextlib import inspect import io -from typing import ContextManager, List, Dict, Optional, TextIO, Type, Callable, get_args +from typing import ContextManager, List, Dict, Optional, TextIO, Type, Callable, get_args, Iterable, Tuple import json from basyx.aas import model from .. import _generic +from .._generic import JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES class AASToJsonEncoder(json.JSONEncoder): @@ -698,26 +699,33 @@ def _select_encoder(stripped: bool, encoder: Optional[Type[AASToJsonEncoder]] = return AASToJsonEncoder if not stripped else StrippedAASToJsonEncoder -def _create_dict(data: model.AbstractObjectStore) -> dict: - # separate different kind of objects - asset_administration_shells: List[model.AssetAdministrationShell] = [] - submodels: List[model.Submodel] = [] - concept_descriptions: List[model.ConceptDescription] = [] +def _create_dict(data: model.AbstractObjectStore, + keys_to_types: Iterable[Tuple[str, Type]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) -> Dict[str, List[object]]: + """ + Categorizes objects from an AbstractObjectStore into a dictionary based on their types. + + This function iterates over the objects in the provided AbstractObjectStore and groups them into lists + based on their types, as defined in the `keys_to_types` mapping. The resulting dictionary contains + keys corresponding to the names in `keys_to_types` and values as lists of objects of the respective types. + + :param data: An AbstractObjectStore containing objects to be categorized. + :param keys_to_types: An iterable of tuples where each tuple contains: + - A string key representing the category name. + - A type to match objects against. + :return: A dictionary where keys are category names and values are lists of objects of the corresponding types. + """ + objects = {} + for obj in data: - if isinstance(obj, model.AssetAdministrationShell): - asset_administration_shells.append(obj) - elif isinstance(obj, model.Submodel): - submodels.append(obj) - elif isinstance(obj, model.ConceptDescription): - concept_descriptions.append(obj) - dict_: Dict[str, List] = {} - if asset_administration_shells: - dict_['assetAdministrationShells'] = asset_administration_shells - if submodels: - dict_['submodels'] = submodels - if concept_descriptions: - dict_['conceptDescriptions'] = concept_descriptions - return dict_ + # Iterate through the mapping of category names to expected types + for name, expected_type in keys_to_types: + # Check if the object matches the expected type + if isinstance(obj, expected_type): + # Add the object to the appropriate category in the dictionary + objects.setdefault(name, []) + objects[name].append(obj) + break # Exit the inner loop once a match is found + return objects def object_store_to_json(data: model.AbstractObjectStore, stripped: bool = False, diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 73f5220a1..86ffe6050 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -5,7 +5,7 @@ from basyx.aas.adapter import _generic from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO from basyx.aas.adapter.json import AASToJsonEncoder -from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, KEYS_TO_TYPES, \ +from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES, \ read_aas_json_file_into import logging @@ -14,6 +14,11 @@ logger = logging.getLogger(__name__) +JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES + ( + ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), + ('submodelDescriptors', server_model.SubmodelDescriptor) +) + class ServerAASFromJsonDecoder(AASFromJsonDecoder): @classmethod @@ -208,14 +213,9 @@ class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, Ser def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: - keys_to_types = list(KEYS_TO_TYPES) - keys_to_types.extend([ - ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), - ('submodelDescriptors', server_model.SubmodelDescriptor) - ]) return read_aas_json_file_into(object_store=object_store, file=file, replace_existing=replace_existing, ignore_existing=ignore_existing, failsafe=failsafe, stripped=stripped, - decoder=decoder, keys_to_types=keys_to_types) + decoder=decoder, keys_to_types=JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES) class ServerAASToJsonEncoder(AASToJsonEncoder): @@ -242,10 +242,8 @@ def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: data['displayName'] = obj.display_name if obj.extension: data['extensions'] = list(obj.extension) - return data - @classmethod def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> Dict[str, object]: """ From 72297f460ab445d8b06a2ae647bd9377f0e61842 Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 01:05:31 +0200 Subject: [PATCH 14/76] Remove `jsonization._create_dict` as not used --- server/app/adapter/jsonization.py | 37 ------------------------------- 1 file changed, 37 deletions(-) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 86ffe6050..b6ae1635c 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -328,40 +328,3 @@ def _asset_link_to_json(cls, obj: server_model.AssetLink) -> Dict[str, object]: data['name'] = obj.name data['value'] = obj.value return data - - -def _create_dict(data: model.AbstractObjectStore) -> dict: - # separate different kind of objects - asset_administration_shells: List[model.AssetAdministrationShell] = [] - submodels: List[model.Submodel] = [] - concept_descriptions: List[model.ConceptDescription] = [] - asset_administration_shell_descriptors: List[server_model.AssetAdministrationShellDescriptor] = [] - submodel_descriptors: List[server_model.SubmodelDescriptor] = [] - assets_links: List[server_model.AssetLink] = [] - for obj in data: - if isinstance(obj, model.AssetAdministrationShell): - asset_administration_shells.append(obj) - elif isinstance(obj, model.Submodel): - submodels.append(obj) - elif isinstance(obj, model.ConceptDescription): - concept_descriptions.append(obj) - elif isinstance(obj, server_model.AssetAdministrationShellDescriptor): - asset_administration_shell_descriptors.append(obj) - elif isinstance(obj, server_model.SubmodelDescriptor): - submodel_descriptors.append(obj) - elif isinstance(obj, server_model.AssetLink): - assets_links.append(obj) - dict_: Dict[str, List] = {} - if asset_administration_shells: - dict_['assetAdministrationShells'] = asset_administration_shells - if submodels: - dict_['submodels'] = submodels - if concept_descriptions: - dict_['conceptDescriptions'] = concept_descriptions - if asset_administration_shell_descriptors: - dict_['assetAdministrationShellDescriptors'] = asset_administration_shell_descriptors - if submodel_descriptors: - dict_['submodelDescriptors'] = submodel_descriptors - if assets_links: - dict_['assetLinks'] = assets_links - return dict_ From bd48dec3e01b13f99ffc3e5f1a2dd1454354f93c Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 01:49:22 +0200 Subject: [PATCH 15/76] Split `http.py` into `repository` and `http_api_helpers` In 'repository' we keep only AAS/Submodel/CD Repository App, in `http_api_helpers` we keep all classes/funcs which will be used across discovery/repository/registry apps --- server/app/discovery.py | 4 +- server/app/http_api_helpers.py | 433 +++++++++++++++++++++ server/app/main.py | 2 +- server/app/registry.py | 4 +- server/app/{http.py => repository.py} | 526 ++------------------------ 5 files changed, 473 insertions(+), 496 deletions(-) create mode 100644 server/app/http_api_helpers.py rename server/app/{http.py => repository.py} (67%) diff --git a/server/app/discovery.py b/server/app/discovery.py index f5f0a215f..524b3c123 100644 --- a/server/app/discovery.py +++ b/server/app/discovery.py @@ -6,9 +6,9 @@ from basyx.aas import model from server.app import server_model from server.app.adapter.jsonization import ServerAASToJsonEncoder -from .http import APIResponse, http_exception_to_response, get_response_type, HTTPApiDecoder +from .http_api_helpers import APIResponse, http_exception_to_response, get_response_type, HTTPApiDecoder from werkzeug.routing import MapAdapter, Rule, Submount -from .http import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request +from .http_api_helpers import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set import abc diff --git a/server/app/http_api_helpers.py b/server/app/http_api_helpers.py new file mode 100644 index 000000000..1f6f96770 --- /dev/null +++ b/server/app/http_api_helpers.py @@ -0,0 +1,433 @@ +# Copyright (c) 2024 the Eclipse BaSyx Authors +# +# This program and the accompanying materials are made available under the terms of the MIT License, available in +# the LICENSE file of this project. +# +# SPDX-License-Identifier: MIT +import abc +import base64 +import binascii +import datetime +import enum +import io +import json + +from lxml import etree +import werkzeug.exceptions +import werkzeug.routing +import werkzeug.urls +import werkzeug.utils +from werkzeug.exceptions import BadRequest, UnprocessableEntity +from werkzeug.wrappers import Request, Response + +import server.app.server_model as server_model +from basyx.aas import model +from basyx.aas.adapter._generic import XML_NS_MAP + +from basyx.aas.adapter.xml import xml_serialization, XMLConstructables + +from server.app.adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element +from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder + +from typing import Callable, Dict, List, Optional, Type, TypeVar, Union + +@enum.unique +class MessageType(enum.Enum): + UNDEFINED = enum.auto() + INFO = enum.auto() + WARNING = enum.auto() + ERROR = enum.auto() + EXCEPTION = enum.auto() + + def __str__(self): + return self.name.capitalize() + + +class Message: + def __init__(self, code: str, text: str, message_type: MessageType = MessageType.UNDEFINED, + timestamp: Optional[datetime.datetime] = None): + self.code: str = code + self.text: str = text + self.message_type: MessageType = message_type + self.timestamp: datetime.datetime = timestamp if timestamp is not None \ + else datetime.datetime.now(datetime.timezone.utc) + + +class Result: + def __init__(self, success: bool, messages: Optional[List[Message]] = None): + if messages is None: + messages = [] + self.success: bool = success + self.messages: List[Message] = messages + + +class ResultToJsonEncoder(ServerAASToJsonEncoder): + @classmethod + def _result_to_json(cls, result: Result) -> Dict[str, object]: + return { + "success": result.success, + "messages": result.messages + } + + @classmethod + def _message_to_json(cls, message: Message) -> Dict[str, object]: + return { + "messageType": message.message_type, + "text": message.text, + "code": message.code, + "timestamp": message.timestamp.isoformat() + } + + def default(self, obj: object) -> object: + if isinstance(obj, Result): + return self._result_to_json(obj) + if isinstance(obj, Message): + return self._message_to_json(obj) + if isinstance(obj, MessageType): + return str(obj) + return super().default(obj) + + +class StrippedResultToJsonEncoder(ResultToJsonEncoder): + stripped = True + + +ResponseData = Union[Result, object, List[object]] + + +class APIResponse(abc.ABC, Response): + @abc.abstractmethod + def __init__(self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, + stripped: bool = False, *args, **kwargs): + super().__init__(*args, **kwargs) + if obj is None: + self.status_code = 204 + else: + self.data = self.serialize(obj, cursor, stripped) + + @abc.abstractmethod + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + pass + + +class JsonResponse(APIResponse): + def __init__(self, *args, content_type="application/json", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + if cursor is None: + data = obj + else: + data = { + "paging_metadata": {"cursor": str(cursor)}, + "result": obj + } + return json.dumps( + data, + cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, + separators=(",", ":") + ) + + +class XmlResponse(APIResponse): + def __init__(self, *args, content_type="application/xml", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + root_elem = etree.Element("response", nsmap=XML_NS_MAP) + if cursor is not None: + root_elem.set("cursor", str(cursor)) + if isinstance(obj, Result): + result_elem = result_to_xml(obj, **XML_NS_MAP) + for child in result_elem: + root_elem.append(child) + elif isinstance(obj, list): + for item in obj: + item_elem = xml_serialization.object_to_xml_element(item) + root_elem.append(item_elem) + else: + obj_elem = xml_serialization.object_to_xml_element(obj) + for child in obj_elem: + root_elem.append(child) + etree.cleanup_namespaces(root_elem) + xml_str = etree.tostring(root_elem, xml_declaration=True, encoding="utf-8") + return xml_str # type: ignore[return-value] + + +class XmlResponseAlt(XmlResponse): + def __init__(self, *args, content_type="text/xml", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + +def result_to_xml(result: Result, **kwargs) -> etree._Element: + result_elem = etree.Element("result", **kwargs) + success_elem = etree.Element("success") + success_elem.text = xml_serialization.boolean_to_xml(result.success) + messages_elem = etree.Element("messages") + for message in result.messages: + messages_elem.append(message_to_xml(message)) + + result_elem.append(success_elem) + result_elem.append(messages_elem) + return result_elem + + +def message_to_xml(message: Message) -> etree._Element: + message_elem = etree.Element("message") + message_type_elem = etree.Element("messageType") + message_type_elem.text = str(message.message_type) + text_elem = etree.Element("text") + text_elem.text = message.text + code_elem = etree.Element("code") + code_elem.text = message.code + timestamp_elem = etree.Element("timestamp") + timestamp_elem.text = message.timestamp.isoformat() + + message_elem.append(message_type_elem) + message_elem.append(text_elem) + message_elem.append(code_elem) + message_elem.append(timestamp_elem) + return message_elem + + +def get_response_type(request: Request) -> Type[APIResponse]: + response_types: Dict[str, Type[APIResponse]] = { + "application/json": JsonResponse, + "application/xml": XmlResponse, + "text/xml": XmlResponseAlt + } + if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): + return JsonResponse + mime_type = request.accept_mimetypes.best_match(response_types) + if mime_type is None: + raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " + + ", ".join(response_types.keys())) + return response_types[mime_type] + + +def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ + -> APIResponse: + headers = exception.get_headers() + location = exception.get_response().location + if location is not None: + headers.append(("Location", location)) + if exception.code and exception.code >= 400: + message = Message(type(exception).__name__, exception.description if exception.description is not None else "", + MessageType.ERROR) + result = Result(False, [message]) + else: + result = Result(False) + return response_type(result, status=exception.code, headers=headers) + + +def is_stripped_request(request: Request) -> bool: + return request.args.get("level") == "core" + + +T = TypeVar("T") + +BASE64URL_ENCODING = "utf-8" + + +def base64url_decode(data: str) -> str: + try: + # If the requester omits the base64 padding, an exception will be raised. + # However, Python doesn't complain about too much padding, + # thus we simply always append two padding characters (==). + # See also: https://stackoverflow.com/a/49459036/4780052 + decoded = base64.urlsafe_b64decode(data + "==").decode(BASE64URL_ENCODING) + except binascii.Error: + raise BadRequest(f"Encoded data {data} is invalid base64url!") + except UnicodeDecodeError: + raise BadRequest(f"Encoded base64url value is not a valid {BASE64URL_ENCODING} string!") + return decoded + + +def base64url_encode(data: str) -> str: + encoded = base64.urlsafe_b64encode(data.encode(BASE64URL_ENCODING)).decode("ascii") + return encoded + + +class HTTPApiDecoder: + # these are the types we can construct (well, only the ones we need) + type_constructables_map = { + model.AssetAdministrationShell: XMLConstructables.ASSET_ADMINISTRATION_SHELL, + model.AssetInformation: XMLConstructables.ASSET_INFORMATION, + model.ModelReference: XMLConstructables.MODEL_REFERENCE, + model.SpecificAssetId: XMLConstructables.SPECIFIC_ASSET_ID, + model.Qualifier: XMLConstructables.QUALIFIER, + model.Submodel: XMLConstructables.SUBMODEL, + model.SubmodelElement: XMLConstructables.SUBMODEL_ELEMENT, + model.Reference: XMLConstructables.REFERENCE, + + server_model.AssetAdministrationShellDescriptor: ServerXMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR, + server_model.SubmodelDescriptor: ServerXMLConstructables.SUBMODEL_DESCRIPTOR, + server_model.AssetLink: ServerXMLConstructables.ASSET_LINK, + } + + @classmethod + def check_type_supportance(cls, type_: type): + if type_ not in cls.type_constructables_map: + raise TypeError(f"Parsing {type_} is not supported!") + + @classmethod + def assert_type(cls, obj: object, type_: Type[T]) -> T: + if not isinstance(obj, type_): + raise UnprocessableEntity(f"Object {obj!r} is not of type {type_.__name__}!") + return obj + + @classmethod + def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: + cls.check_type_supportance(expect_type) + decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ + else ServerStrictAASFromJsonDecoder + try: + parsed = json.loads(data, cls=decoder) + if isinstance(parsed, list) and expect_single: + raise UnprocessableEntity(f"Expected a single object of type {expect_type.__name__}, got {parsed!r}!") + if not isinstance(parsed, list) and not expect_single: + raise UnprocessableEntity(f"Expected List[{expect_type.__name__}], got {parsed!r}!") + parsed = [parsed] if not isinstance(parsed, list) else parsed + + # TODO: the following is ugly, but necessary because references aren't self-identified objects + # in the json schema + # TODO: json deserialization will always create an ModelReference[Submodel], xml deserialization determines + # that automatically + mapping = { + model.ModelReference: decoder._construct_model_reference, # type: ignore[assignment] + model.AssetInformation: decoder._construct_asset_information, # type: ignore[assignment] + model.SpecificAssetId: decoder._construct_specific_asset_id, # type: ignore[assignment] + model.Reference: decoder._construct_reference, # type: ignore[assignment] + model.Qualifier: decoder._construct_qualifier, # type: ignore[assignment] + server_model.AssetAdministrationShellDescriptor: decoder._construct_asset_administration_shell_descriptor, # type: ignore[assignment] + server_model.SubmodelDescriptor: decoder._construct_submodel_descriptor, # type: ignore[assignment] + server_model.AssetLink: decoder._construct_asset_link, # type: ignore[assignment] + } + + constructor: Optional[Callable[..., T]] = mapping.get(expect_type) + args = [] + if expect_type is model.ModelReference: + args.append(model.Submodel) + + if constructor is not None: + # construct elements that aren't self-identified + return [constructor(obj, *args) for obj in parsed] + + except (KeyError, ValueError, TypeError, json.JSONDecodeError, model.AASConstraintViolation) as e: + raise UnprocessableEntity(str(e)) from e + + return [cls.assert_type(obj, expect_type) for obj in parsed] + + @classmethod + def base64urljson_list(cls, data: str, expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: + data = base64url_decode(data) + return cls.json_list(data, expect_type, stripped, expect_single) + + @classmethod + def json(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool) -> T: + return cls.json_list(data, expect_type, stripped, True)[0] + + @classmethod + def base64urljson(cls, data: str, expect_type: Type[T], stripped: bool) -> T: + data = base64url_decode(data) + return cls.json_list(data, expect_type, stripped, True)[0] + + @classmethod + def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: + cls.check_type_supportance(expect_type) + try: + xml_data = io.BytesIO(data) + rv = read_server_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], + stripped=stripped, failsafe=False) + except (KeyError, ValueError) as e: + # xml deserialization creates an error chain. since we only return one error, return the root cause + f: BaseException = e + while f.__cause__ is not None: + f = f.__cause__ + raise UnprocessableEntity(str(f)) from e + except (etree.XMLSyntaxError, model.AASConstraintViolation) as e: + raise UnprocessableEntity(str(e)) from e + return cls.assert_type(rv, expect_type) + + @classmethod + def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: + """ + TODO: werkzeug documentation recommends checking the content length before retrieving the body to prevent + running out of memory. but it doesn't state how to check the content length + also: what would be a reasonable maximum content length? the request body isn't limited by the xml/json + schema + In the meeting (25.11.2020) we discussed, this may refer to a reverse proxy in front of this WSGI app, + which should limit the maximum content length. + """ + valid_content_types = ("application/json", "application/xml", "text/xml") + + if request.mimetype not in valid_content_types: + raise werkzeug.exceptions.UnsupportedMediaType( + f"Invalid content-type: {request.mimetype}! Supported types: " + + ", ".join(valid_content_types)) + + if request.mimetype == "application/json": + return cls.json(request.get_data(), expect_type, stripped) + return cls.xml(request.get_data(), expect_type, stripped) + @classmethod + def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: + """ + Deserializes the request body to an instance (or list of instances) + of the expected type. + """ + valid_content_types = ("application/json", "application/xml", "text/xml") + + if request.mimetype not in valid_content_types: + raise werkzeug.exceptions.UnsupportedMediaType( + f"Invalid content-type: {request.mimetype}! Supported types: " + ", ".join(valid_content_types) + ) + + if request.mimetype == "application/json": + raw_data = request.get_data() + try: + parsed = json.loads(raw_data) + except Exception as e: + raise werkzeug.exceptions.BadRequest(f"Invalid JSON: {e}") + # Prüfe, ob parsed ein Array ist: + if isinstance(parsed, list): + # Für jedes Element wird die Konvertierung angewandt. + return [cls._convert_single_json_item(item, expect_type, stripped) for item in parsed] # type: ignore + else: + return cls._convert_single_json_item(parsed, expect_type, stripped) + else: + return cls.xml(request.get_data(), expect_type, stripped) + + @classmethod + def _convert_single_json_item(cls, data: any, expect_type: Type[T], stripped: bool) -> T: + """ + Konvertiert ein einzelnes JSON-Objekt (als Python-Dict) in ein Objekt vom Typ expect_type. + Hierbei wird das Dictionary zuerst wieder in einen JSON-String serialisiert und als Bytes übergeben. + """ + json_bytes = json.dumps(data).encode("utf-8") + return cls.json(json_bytes, expect_type, stripped) + +class Base64URLConverter(werkzeug.routing.UnicodeConverter): + + def to_url(self, value: model.Identifier) -> str: + return super().to_url(base64url_encode(value)) + + def to_python(self, value: str) -> model.Identifier: + value = super().to_python(value) + decoded = base64url_decode(super().to_python(value)) + return decoded + + +class IdShortPathConverter(werkzeug.routing.UnicodeConverter): + id_short_sep = "." + + def to_url(self, value: List[str]) -> str: + return super().to_url(self.id_short_sep.join(value)) + + def to_python(self, value: str) -> List[str]: + id_shorts = super().to_python(value).split(self.id_short_sep) + for id_short in id_shorts: + try: + model.Referable.validate_id_short(id_short) + except (ValueError, model.AASConstraintViolation): + raise BadRequest(f"{id_short} is not a valid id_short!") + return id_shorts diff --git a/server/app/main.py b/server/app/main.py index 816bf621a..fd24f0bfd 100644 --- a/server/app/main.py +++ b/server/app/main.py @@ -6,7 +6,7 @@ from basyx.aas.adapter import aasx from basyx.aas.backend.local_file import LocalFileObjectStore -from server.app.http import WSGIApp +from server.app.repository import WSGIApp storage_path = os.getenv("STORAGE_PATH", "/storage") storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") diff --git a/server/app/registry.py b/server/app/registry.py index 58e578c90..e2b47bc3d 100644 --- a/server/app/registry.py +++ b/server/app/registry.py @@ -21,8 +21,8 @@ from basyx.aas import model import server.app.server_model as server_model -from .http import APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder -from .http import Base64URLConverter +from .http_api_helpers import APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder +from .http_api_helpers import Base64URLConverter from typing import Dict, Iterable, Iterator, List, Type, TypeVar, Tuple diff --git a/server/app/http.py b/server/app/repository.py similarity index 67% rename from server/app/http.py rename to server/app/repository.py index 554fb3211..4ba8797d9 100644 --- a/server/app/http.py +++ b/server/app/repository.py @@ -1,9 +1,3 @@ -# Copyright (c) 2024 the Eclipse BaSyx Authors -# -# This program and the accompanying materials are made available under the terms of the MIT License, available in -# the LICENSE file of this project. -# -# SPDX-License-Identifier: MIT """ This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". However, several features and routes are currently not supported: @@ -34,442 +28,22 @@ - `GET /submodels/{submodelIdentifier}/submodel-elements/{idShortPath}/operation-results/{handleId}/$value` """ -import abc -import base64 -import binascii -import datetime -import enum import io -import json import itertools +from typing import Iterable, Type, Iterator, List, Dict, Union, Callable, Tuple, Optional -from lxml import etree import werkzeug.exceptions import werkzeug.routing -import werkzeug.urls import werkzeug.utils -from werkzeug.exceptions import BadRequest, Conflict, NotFound, UnprocessableEntity -from werkzeug.routing import MapAdapter, Rule, Submount -from werkzeug.wrappers import Request, Response +from werkzeug import Response, Request from werkzeug.datastructures import FileStorage +from werkzeug.exceptions import NotFound, BadRequest, Conflict +from werkzeug.routing import Submount, Rule, MapAdapter -import server.app.server_model as server_model from basyx.aas import model -from basyx.aas.adapter._generic import XML_NS_MAP - from basyx.aas.adapter import aasx - -from basyx.aas.adapter.xml import xml_serialization, XMLConstructables - -from server.app.adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element -from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder - -from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple - - -@enum.unique -class MessageType(enum.Enum): - UNDEFINED = enum.auto() - INFO = enum.auto() - WARNING = enum.auto() - ERROR = enum.auto() - EXCEPTION = enum.auto() - - def __str__(self): - return self.name.capitalize() - - -class Message: - def __init__(self, code: str, text: str, message_type: MessageType = MessageType.UNDEFINED, - timestamp: Optional[datetime.datetime] = None): - self.code: str = code - self.text: str = text - self.message_type: MessageType = message_type - self.timestamp: datetime.datetime = timestamp if timestamp is not None \ - else datetime.datetime.now(datetime.timezone.utc) - - -class Result: - def __init__(self, success: bool, messages: Optional[List[Message]] = None): - if messages is None: - messages = [] - self.success: bool = success - self.messages: List[Message] = messages - - -class ResultToJsonEncoder(ServerAASToJsonEncoder): - @classmethod - def _result_to_json(cls, result: Result) -> Dict[str, object]: - return { - "success": result.success, - "messages": result.messages - } - - @classmethod - def _message_to_json(cls, message: Message) -> Dict[str, object]: - return { - "messageType": message.message_type, - "text": message.text, - "code": message.code, - "timestamp": message.timestamp.isoformat() - } - - def default(self, obj: object) -> object: - if isinstance(obj, Result): - return self._result_to_json(obj) - if isinstance(obj, Message): - return self._message_to_json(obj) - if isinstance(obj, MessageType): - return str(obj) - return super().default(obj) - - -class StrippedResultToJsonEncoder(ResultToJsonEncoder): - stripped = True - - -ResponseData = Union[Result, object, List[object]] - - -class APIResponse(abc.ABC, Response): - @abc.abstractmethod - def __init__(self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, - stripped: bool = False, *args, **kwargs): - super().__init__(*args, **kwargs) - if obj is None: - self.status_code = 204 - else: - self.data = self.serialize(obj, cursor, stripped) - - @abc.abstractmethod - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - pass - - -class JsonResponse(APIResponse): - def __init__(self, *args, content_type="application/json", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - if cursor is None: - data = obj - else: - data = { - "paging_metadata": {"cursor": str(cursor)}, - "result": obj - } - return json.dumps( - data, - cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, - separators=(",", ":") - ) - - -class XmlResponse(APIResponse): - def __init__(self, *args, content_type="application/xml", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - root_elem = etree.Element("response", nsmap=XML_NS_MAP) - if cursor is not None: - root_elem.set("cursor", str(cursor)) - if isinstance(obj, Result): - result_elem = result_to_xml(obj, **XML_NS_MAP) - for child in result_elem: - root_elem.append(child) - elif isinstance(obj, list): - for item in obj: - item_elem = xml_serialization.object_to_xml_element(item) - root_elem.append(item_elem) - else: - obj_elem = xml_serialization.object_to_xml_element(obj) - for child in obj_elem: - root_elem.append(child) - etree.cleanup_namespaces(root_elem) - xml_str = etree.tostring(root_elem, xml_declaration=True, encoding="utf-8") - return xml_str # type: ignore[return-value] - - -class XmlResponseAlt(XmlResponse): - def __init__(self, *args, content_type="text/xml", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - -def result_to_xml(result: Result, **kwargs) -> etree._Element: - result_elem = etree.Element("result", **kwargs) - success_elem = etree.Element("success") - success_elem.text = xml_serialization.boolean_to_xml(result.success) - messages_elem = etree.Element("messages") - for message in result.messages: - messages_elem.append(message_to_xml(message)) - - result_elem.append(success_elem) - result_elem.append(messages_elem) - return result_elem - - -def message_to_xml(message: Message) -> etree._Element: - message_elem = etree.Element("message") - message_type_elem = etree.Element("messageType") - message_type_elem.text = str(message.message_type) - text_elem = etree.Element("text") - text_elem.text = message.text - code_elem = etree.Element("code") - code_elem.text = message.code - timestamp_elem = etree.Element("timestamp") - timestamp_elem.text = message.timestamp.isoformat() - - message_elem.append(message_type_elem) - message_elem.append(text_elem) - message_elem.append(code_elem) - message_elem.append(timestamp_elem) - return message_elem - - -def get_response_type(request: Request) -> Type[APIResponse]: - response_types: Dict[str, Type[APIResponse]] = { - "application/json": JsonResponse, - "application/xml": XmlResponse, - "text/xml": XmlResponseAlt - } - if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): - return JsonResponse - mime_type = request.accept_mimetypes.best_match(response_types) - if mime_type is None: - raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " - + ", ".join(response_types.keys())) - return response_types[mime_type] - - -def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ - -> APIResponse: - headers = exception.get_headers() - location = exception.get_response().location - if location is not None: - headers.append(("Location", location)) - if exception.code and exception.code >= 400: - message = Message(type(exception).__name__, exception.description if exception.description is not None else "", - MessageType.ERROR) - result = Result(False, [message]) - else: - result = Result(False) - return response_type(result, status=exception.code, headers=headers) - - -def is_stripped_request(request: Request) -> bool: - return request.args.get("level") == "core" - - -T = TypeVar("T") - -BASE64URL_ENCODING = "utf-8" - - -def base64url_decode(data: str) -> str: - try: - # If the requester omits the base64 padding, an exception will be raised. - # However, Python doesn't complain about too much padding, - # thus we simply always append two padding characters (==). - # See also: https://stackoverflow.com/a/49459036/4780052 - decoded = base64.urlsafe_b64decode(data + "==").decode(BASE64URL_ENCODING) - except binascii.Error: - raise BadRequest(f"Encoded data {data} is invalid base64url!") - except UnicodeDecodeError: - raise BadRequest(f"Encoded base64url value is not a valid {BASE64URL_ENCODING} string!") - return decoded - - -def base64url_encode(data: str) -> str: - encoded = base64.urlsafe_b64encode(data.encode(BASE64URL_ENCODING)).decode("ascii") - return encoded - - -class HTTPApiDecoder: - # these are the types we can construct (well, only the ones we need) - type_constructables_map = { - model.AssetAdministrationShell: XMLConstructables.ASSET_ADMINISTRATION_SHELL, - model.AssetInformation: XMLConstructables.ASSET_INFORMATION, - model.ModelReference: XMLConstructables.MODEL_REFERENCE, - model.SpecificAssetId: XMLConstructables.SPECIFIC_ASSET_ID, - model.Qualifier: XMLConstructables.QUALIFIER, - model.Submodel: XMLConstructables.SUBMODEL, - model.SubmodelElement: XMLConstructables.SUBMODEL_ELEMENT, - model.Reference: XMLConstructables.REFERENCE, - server_model.AssetAdministrationShellDescriptor: ServerXMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR, - server_model.SubmodelDescriptor: ServerXMLConstructables.SUBMODEL_DESCRIPTOR, - server_model.AssetLink: ServerXMLConstructables.ASSET_LINK, - } - - @classmethod - def check_type_supportance(cls, type_: type): - if type_ not in cls.type_constructables_map: - raise TypeError(f"Parsing {type_} is not supported!") - - @classmethod - def assert_type(cls, obj: object, type_: Type[T]) -> T: - if not isinstance(obj, type_): - raise UnprocessableEntity(f"Object {obj!r} is not of type {type_.__name__}!") - return obj - - @classmethod - def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: - cls.check_type_supportance(expect_type) - decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ - else ServerStrictAASFromJsonDecoder - try: - parsed = json.loads(data, cls=decoder) - if not isinstance(parsed, list): - if not expect_single: - raise UnprocessableEntity(f"Expected List[{expect_type.__name__}], got {parsed!r}!") - parsed = [parsed] - elif expect_single: - raise UnprocessableEntity(f"Expected a single object of type {expect_type.__name__}, got {parsed!r}!") - # TODO: the following is ugly, but necessary because references aren't self-identified objects - # in the json schema - # TODO: json deserialization will always create an ModelReference[Submodel], xml deserialization determines - # that automatically - constructor: Optional[Callable[..., T]] = None - args = [] - if expect_type is model.ModelReference: - constructor = decoder._construct_model_reference # type: ignore[assignment] - args.append(model.Submodel) - elif expect_type is model.AssetInformation: - constructor = decoder._construct_asset_information # type: ignore[assignment] - elif expect_type is model.SpecificAssetId: - constructor = decoder._construct_specific_asset_id # type: ignore[assignment] - elif expect_type is model.Reference: - constructor = decoder._construct_reference # type: ignore[assignment] - elif expect_type is model.Qualifier: - constructor = decoder._construct_qualifier # type: ignore[assignment] - elif expect_type is model.AssetAdministrationShellDescriptor: - constructor = decoder._construct_asset_administration_shell_descriptor - elif expect_type is model.SubmodelDescriptor: - constructor = decoder._construct_submodel_descriptor - elif expect_type is server_model.AssetLink: - constructor = decoder._construct_asset_link - - if constructor is not None: - # construct elements that aren't self-identified - return [constructor(obj, *args) for obj in parsed] - - except (KeyError, ValueError, TypeError, json.JSONDecodeError, model.AASConstraintViolation) as e: - raise UnprocessableEntity(str(e)) from e - - return [cls.assert_type(obj, expect_type) for obj in parsed] - - @classmethod - def base64urljson_list(cls, data: str, expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: - data = base64url_decode(data) - return cls.json_list(data, expect_type, stripped, expect_single) - - @classmethod - def json(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool) -> T: - return cls.json_list(data, expect_type, stripped, True)[0] - - @classmethod - def base64urljson(cls, data: str, expect_type: Type[T], stripped: bool) -> T: - data = base64url_decode(data) - return cls.json_list(data, expect_type, stripped, True)[0] - - @classmethod - def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: - cls.check_type_supportance(expect_type) - try: - xml_data = io.BytesIO(data) - rv = read_server_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], - stripped=stripped, failsafe=False) - except (KeyError, ValueError) as e: - # xml deserialization creates an error chain. since we only return one error, return the root cause - f: BaseException = e - while f.__cause__ is not None: - f = f.__cause__ - raise UnprocessableEntity(str(f)) from e - except (etree.XMLSyntaxError, model.AASConstraintViolation) as e: - raise UnprocessableEntity(str(e)) from e - return cls.assert_type(rv, expect_type) - - @classmethod - def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: - """ - TODO: werkzeug documentation recommends checking the content length before retrieving the body to prevent - running out of memory. but it doesn't state how to check the content length - also: what would be a reasonable maximum content length? the request body isn't limited by the xml/json - schema - In the meeting (25.11.2020) we discussed, this may refer to a reverse proxy in front of this WSGI app, - which should limit the maximum content length. - """ - valid_content_types = ("application/json", "application/xml", "text/xml") - - if request.mimetype not in valid_content_types: - raise werkzeug.exceptions.UnsupportedMediaType( - f"Invalid content-type: {request.mimetype}! Supported types: " - + ", ".join(valid_content_types)) - - if request.mimetype == "application/json": - return cls.json(request.get_data(), expect_type, stripped) - return cls.xml(request.get_data(), expect_type, stripped) - @classmethod - def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: - """ - Deserializes the request body to an instance (or list of instances) - of the expected type. - """ - valid_content_types = ("application/json", "application/xml", "text/xml") - - if request.mimetype not in valid_content_types: - raise werkzeug.exceptions.UnsupportedMediaType( - f"Invalid content-type: {request.mimetype}! Supported types: " + ", ".join(valid_content_types) - ) - - if request.mimetype == "application/json": - raw_data = request.get_data() - try: - parsed = json.loads(raw_data) - except Exception as e: - raise werkzeug.exceptions.BadRequest(f"Invalid JSON: {e}") - # Prüfe, ob parsed ein Array ist: - if isinstance(parsed, list): - # Für jedes Element wird die Konvertierung angewandt. - return [cls._convert_single_json_item(item, expect_type, stripped) for item in parsed] # type: ignore - else: - return cls._convert_single_json_item(parsed, expect_type, stripped) - else: - return cls.xml(request.get_data(), expect_type, stripped) - - @classmethod - def _convert_single_json_item(cls, data: any, expect_type: Type[T], stripped: bool) -> T: - """ - Konvertiert ein einzelnes JSON-Objekt (als Python-Dict) in ein Objekt vom Typ expect_type. - Hierbei wird das Dictionary zuerst wieder in einen JSON-String serialisiert und als Bytes übergeben. - """ - json_bytes = json.dumps(data).encode("utf-8") - return cls.json(json_bytes, expect_type, stripped) - -class Base64URLConverter(werkzeug.routing.UnicodeConverter): - - def to_url(self, value: model.Identifier) -> str: - return super().to_url(base64url_encode(value)) - - def to_python(self, value: str) -> model.Identifier: - value = super().to_python(value) - decoded = base64url_decode(super().to_python(value)) - return decoded - - -class IdShortPathConverter(werkzeug.routing.UnicodeConverter): - id_short_sep = "." - - def to_url(self, value: List[str]) -> str: - return super().to_url(self.id_short_sep.join(value)) - - def to_python(self, value: str) -> List[str]: - id_shorts = super().to_python(value).split(self.id_short_sep) - for id_short in id_shorts: - try: - model.Referable.validate_id_short(id_short) - except (ValueError, model.AASConstraintViolation): - raise BadRequest(f"{id_short} is not a valid id_short!") - return id_shorts +from server.app.http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, get_response_type, \ + http_exception_to_response, APIResponse, is_stripped_request class WSGIApp: @@ -492,17 +66,13 @@ def __init__(self, object_store: model.AbstractObjectStore, file_store: aasx.Abs Rule("/$reference", methods=["GET"], endpoint=self.get_aas_reference), Rule("/asset-information", methods=["GET"], endpoint=self.get_aas_asset_information), Rule("/asset-information", methods=["PUT"], endpoint=self.put_aas_asset_information), - Rule("/asset-information/thumbnail", methods=["GET", "PUT", "DELETE"], - endpoint=self.not_implemented), + Rule("/asset-information/thumbnail", methods=["GET", "PUT", "DELETE"], endpoint=self.not_implemented), Rule("/submodel-refs", methods=["GET"], endpoint=self.get_aas_submodel_refs), Rule("/submodel-refs", methods=["POST"], endpoint=self.post_aas_submodel_refs), - Rule("/submodel-refs/", methods=["DELETE"], - endpoint=self.delete_aas_submodel_refs_specific), + Rule("/submodel-refs/", methods=["DELETE"], endpoint=self.delete_aas_submodel_refs_specific), Submount("/submodels", [ - Rule("/", methods=["PUT"], - endpoint=self.put_aas_submodel_refs_submodel), - Rule("/", methods=["DELETE"], - endpoint=self.delete_aas_submodel_refs_submodel), + Rule("/", methods=["PUT"], endpoint=self.put_aas_submodel_refs_submodel), + Rule("/", methods=["DELETE"], endpoint=self.delete_aas_submodel_refs_submodel), Rule("/", endpoint=self.aas_submodel_refs_redirect), Rule("//", endpoint=self.aas_submodel_refs_redirect) ]) @@ -527,76 +97,51 @@ def __init__(self, object_store: model.AbstractObjectStore, file_store: aasx.Abs Rule("/$reference", methods=["GET"], endpoint=self.get_submodels_reference), Rule("/$path", methods=["GET"], endpoint=self.not_implemented), Rule("/submodel-elements", methods=["GET"], endpoint=self.get_submodel_submodel_elements), - Rule("/submodel-elements", methods=["POST"], - endpoint=self.post_submodel_submodel_elements_id_short_path), + Rule("/submodel-elements", methods=["POST"], endpoint=self.post_submodel_submodel_elements_id_short_path), Submount("/submodel-elements", [ - Rule("/$metadata", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_metadata), - Rule("/$reference", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_reference), + Rule("/$metadata", methods=["GET"], endpoint=self.get_submodel_submodel_elements_metadata), + Rule("/$reference", methods=["GET"], endpoint=self.get_submodel_submodel_elements_reference), Rule("/$value", methods=["GET"], endpoint=self.not_implemented), Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_id_short_path), - Rule("/", methods=["POST"], - endpoint=self.post_submodel_submodel_elements_id_short_path), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_submodel_elements_id_short_path), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_elements_id_short_path), + Rule("/", methods=["GET"], endpoint=self.get_submodel_submodel_elements_id_short_path), + Rule("/", methods=["POST"], endpoint=self.post_submodel_submodel_elements_id_short_path), + Rule("/", methods=["PUT"], endpoint=self.put_submodel_submodel_elements_id_short_path), + Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_submodel_elements_id_short_path), Rule("/", methods=["PATCH"], endpoint=self.not_implemented), Submount("/", [ - Rule("/$metadata", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_id_short_path_metadata), + Rule("/$metadata", methods=["GET"], endpoint=self.get_submodel_submodel_elements_id_short_path_metadata), Rule("/$metadata", methods=["PATCH"], endpoint=self.not_implemented), - Rule("/$reference", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_id_short_path_reference), + Rule("/$reference", methods=["GET"], endpoint=self.get_submodel_submodel_elements_id_short_path_reference), Rule("/$value", methods=["GET"], endpoint=self.not_implemented), Rule("/$value", methods=["PATCH"], endpoint=self.not_implemented), Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/attachment", methods=["GET"], - endpoint=self.get_submodel_submodel_element_attachment), - Rule("/attachment", methods=["PUT"], - endpoint=self.put_submodel_submodel_element_attachment), - Rule("/attachment", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_element_attachment), + Rule("/attachment", methods=["GET"], endpoint=self.get_submodel_submodel_element_attachment), + Rule("/attachment", methods=["PUT"], endpoint=self.put_submodel_submodel_element_attachment), + Rule("/attachment", methods=["DELETE"], endpoint=self.delete_submodel_submodel_element_attachment), Rule("/invoke", methods=["POST"], endpoint=self.not_implemented), Rule("/invoke/$value", methods=["POST"], endpoint=self.not_implemented), Rule("/invoke-async", methods=["POST"], endpoint=self.not_implemented), Rule("/invoke-async/$value", methods=["POST"], endpoint=self.not_implemented), - Rule("/operation-status/", methods=["GET"], - endpoint=self.not_implemented), + Rule("/operation-status/", methods=["GET"], endpoint=self.not_implemented), Submount("/operation-results", [ - Rule("/", methods=["GET"], - endpoint=self.not_implemented), - Rule("//$value", methods=["GET"], - endpoint=self.not_implemented) + Rule("/", methods=["GET"], endpoint=self.not_implemented), + Rule("//$value", methods=["GET"], endpoint=self.not_implemented) ]), - Rule("/qualifiers", methods=["GET"], - endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/qualifiers", methods=["POST"], - endpoint=self.post_submodel_submodel_element_qualifiers), + Rule("/qualifiers", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), + Rule("/qualifiers", methods=["POST"], endpoint=self.post_submodel_submodel_element_qualifiers), Submount("/qualifiers", [ - Rule("/", methods=["GET"], - endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_submodel_element_qualifiers), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_element_qualifiers) + Rule("/", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), + Rule("/", methods=["PUT"], endpoint=self.put_submodel_submodel_element_qualifiers), + Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_submodel_element_qualifiers) ]) ]) ]), - Rule("/qualifiers", methods=["GET"], - endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/qualifiers", methods=["POST"], - endpoint=self.post_submodel_submodel_element_qualifiers), + Rule("/qualifiers", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), + Rule("/qualifiers", methods=["POST"], endpoint=self.post_submodel_submodel_element_qualifiers), Submount("/qualifiers", [ - Rule("/", methods=["GET"], - endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_submodel_element_qualifiers), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_element_qualifiers) + Rule("/", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), + Rule("/", methods=["PUT"], endpoint=self.put_submodel_submodel_element_qualifiers), + Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_submodel_element_qualifiers) ]) ]) ]), @@ -1210,7 +755,6 @@ def delete_concept_description(self, request: Request, url_args: Dict, response_ self.object_store.remove(self._get_concept_description(url_args)) return response_t() - if __name__ == "__main__": from werkzeug.serving import run_simple from basyx.aas.examples.data.example_aas import create_full_example From 6fd1612f8509c0a33fe7edf1f48a50d85e47145b Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 10:51:58 +0200 Subject: [PATCH 16/76] Refactor server_model and move create interfaces folder --- server/app/http_api_helpers.py | 6 +- server/app/{ => interfaces}/discovery.py | 11 +- server/app/{ => interfaces}/registry.py | 4 +- server/app/{ => interfaces}/repository.py | 2 +- server/app/server_model/__init__.py | 2 + .../descriptor.py} | 107 +---------------- server/app/server_model/endpoint.py | 110 ++++++++++++++++++ 7 files changed, 126 insertions(+), 116 deletions(-) rename server/app/{ => interfaces}/discovery.py (95%) rename server/app/{ => interfaces}/registry.py (99%) rename server/app/{ => interfaces}/repository.py (99%) create mode 100644 server/app/server_model/__init__.py rename server/app/{server_model.py => server_model/descriptor.py} (60%) create mode 100644 server/app/server_model/endpoint.py diff --git a/server/app/http_api_helpers.py b/server/app/http_api_helpers.py index 1f6f96770..5d7f882b8 100644 --- a/server/app/http_api_helpers.py +++ b/server/app/http_api_helpers.py @@ -20,14 +20,14 @@ from werkzeug.exceptions import BadRequest, UnprocessableEntity from werkzeug.wrappers import Request, Response -import server.app.server_model as server_model from basyx.aas import model from basyx.aas.adapter._generic import XML_NS_MAP from basyx.aas.adapter.xml import xml_serialization, XMLConstructables -from server.app.adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element -from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder +import server_model +from .adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element +from .adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder from typing import Callable, Dict, List, Optional, Type, TypeVar, Union diff --git a/server/app/discovery.py b/server/app/interfaces/discovery.py similarity index 95% rename from server/app/discovery.py rename to server/app/interfaces/discovery.py index 524b3c123..e05c5d3d5 100644 --- a/server/app/discovery.py +++ b/server/app/interfaces/discovery.py @@ -2,13 +2,14 @@ import werkzeug.exceptions from werkzeug.wrappers import Request, Response -import server.app.server_model from basyx.aas import model -from server.app import server_model -from server.app.adapter.jsonization import ServerAASToJsonEncoder -from .http_api_helpers import APIResponse, http_exception_to_response, get_response_type, HTTPApiDecoder + +from .. import server_model +from ..adapter.jsonization import ServerAASToJsonEncoder +from ..http_api_helpers import APIResponse, http_exception_to_response, get_response_type, HTTPApiDecoder + from werkzeug.routing import MapAdapter, Rule, Submount -from .http_api_helpers import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request +from ..http_api_helpers import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set import abc diff --git a/server/app/registry.py b/server/app/interfaces/registry.py similarity index 99% rename from server/app/registry.py rename to server/app/interfaces/registry.py index e2b47bc3d..1202798c2 100644 --- a/server/app/registry.py +++ b/server/app/interfaces/registry.py @@ -21,8 +21,8 @@ from basyx.aas import model import server.app.server_model as server_model -from .http_api_helpers import APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder -from .http_api_helpers import Base64URLConverter +from ..http_api_helpers import APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder +from ..http_api_helpers import Base64URLConverter from typing import Dict, Iterable, Iterator, List, Type, TypeVar, Tuple diff --git a/server/app/repository.py b/server/app/interfaces/repository.py similarity index 99% rename from server/app/repository.py rename to server/app/interfaces/repository.py index 4ba8797d9..aec462301 100644 --- a/server/app/repository.py +++ b/server/app/interfaces/repository.py @@ -42,7 +42,7 @@ from basyx.aas import model from basyx.aas.adapter import aasx -from server.app.http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, get_response_type, \ +from ..http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, get_response_type, \ http_exception_to_response, APIResponse, is_stripped_request diff --git a/server/app/server_model/__init__.py b/server/app/server_model/__init__.py new file mode 100644 index 000000000..5712f4a27 --- /dev/null +++ b/server/app/server_model/__init__.py @@ -0,0 +1,2 @@ +from .endpoint import * +from .descriptor import * diff --git a/server/app/server_model.py b/server/app/server_model/descriptor.py similarity index 60% rename from server/app/server_model.py rename to server/app/server_model/descriptor.py index 65fde1161..40d2d59d7 100644 --- a/server/app/server_model.py +++ b/server/app/server_model/descriptor.py @@ -1,113 +1,10 @@ from __future__ import absolute_import import abc -import re -from enum import Enum +from typing import Optional, Iterable, List -from typing import Optional, List, Iterable - -import server.app from basyx.aas.model import base, NamespaceSet - - -class AssetLink: - def __init__(self, name: base.LabelType, value: base.Identifier): - if not name: - raise ValueError("AssetLink 'name' must be a non-empty string.") - if not value: - raise ValueError("AssetLink 'value' must be a non-empty string.") - self.name = name - self.value = value - - -class SecurityTypeEnum(Enum): - NONE = "NONE" - RFC_TLSA = "RFC_TLSA" - W3C_DID = "W3C_DID" - - -class SecurityAttributeObject: - def __init__(self, type_: SecurityTypeEnum, key: str, value: str): - - if not isinstance(type_, SecurityTypeEnum): - raise ValueError(f"Invalid security type: {type_}. Must be one of {list(SecurityTypeEnum)}") - if not key or not isinstance(key, str): - raise ValueError("Key must be a non-empty string.") - if not value or not isinstance(value, str): - raise ValueError("Value must be a non-empty string.") - self.type = type_ - self.key = key - self.value = value - - -class ProtocolInformation: - - def __init__( - self, - href: str, - endpoint_protocol: Optional[str] = None, - endpoint_protocol_version: Optional[List[str]] = None, - subprotocol: Optional[str] = None, - subprotocol_body: Optional[str] = None, - subprotocol_body_encoding: Optional[str] = None, - security_attributes: Optional[List[SecurityAttributeObject]] = None - ): - if not href or not isinstance(href, str): - raise ValueError("href must be a non-empty string representing a valid URL.") - - self.href = href - self.endpoint_protocol = endpoint_protocol - self.endpoint_protocol_version = endpoint_protocol_version or [] - self.subprotocol = subprotocol - self.subprotocol_body = subprotocol_body - self.subprotocol_body_encoding = subprotocol_body_encoding - self.security_attributes = security_attributes or [] - - -class Endpoint: - INTERFACE_SHORTNAMES = { - "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", - "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", - "CD-REPOSITORY", "AAS-DISCOVERY" - } - VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") - - def __init__(self, interface: base.NameType, protocol_information: ProtocolInformation): # noqa: E501 - - self.interface = interface - self.protocol_information = protocol_information - - @property - def interface(self) -> str: - return self._interface - - @interface.setter - def interface(self, interface: base.NameType): - if interface is None: - raise ValueError("Invalid value for `interface`, must not be `None`") - if not self.is_valid_interface(interface): - raise ValueError(f"Invalid interface format: {interface}. Expected format: '-', ") - - self._interface = interface - - @classmethod - def is_valid_interface(cls, interface: base.NameType) -> bool: - parts = interface.split("-", 1) - if len(parts) != 2: - return False - short_name, version = parts - return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) - - @property - def protocol_information(self) -> ProtocolInformation: - return self._protocol_information - - @protocol_information.setter - def protocol_information(self, protocol_information: ProtocolInformation): - if protocol_information is None: - raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 - - self._protocol_information = protocol_information +from . import Endpoint class Descriptor(metaclass=abc.ABCMeta): diff --git a/server/app/server_model/endpoint.py b/server/app/server_model/endpoint.py new file mode 100644 index 000000000..578e298c6 --- /dev/null +++ b/server/app/server_model/endpoint.py @@ -0,0 +1,110 @@ +from __future__ import absolute_import + +import re +from enum import Enum + +from typing import Optional, List + +from basyx.aas.model import base + + +class AssetLink: + def __init__(self, name: base.LabelType, value: base.Identifier): + if not name: + raise ValueError("AssetLink 'name' must be a non-empty string.") + if not value: + raise ValueError("AssetLink 'value' must be a non-empty string.") + self.name = name + self.value = value + + +class SecurityTypeEnum(Enum): + NONE = "NONE" + RFC_TLSA = "RFC_TLSA" + W3C_DID = "W3C_DID" + + +class SecurityAttributeObject: + def __init__(self, type_: SecurityTypeEnum, key: str, value: str): + + if not isinstance(type_, SecurityTypeEnum): + raise ValueError(f"Invalid security type: {type_}. Must be one of {list(SecurityTypeEnum)}") + if not key or not isinstance(key, str): + raise ValueError("Key must be a non-empty string.") + if not value or not isinstance(value, str): + raise ValueError("Value must be a non-empty string.") + self.type = type_ + self.key = key + self.value = value + + +class ProtocolInformation: + + def __init__( + self, + href: str, + endpoint_protocol: Optional[str] = None, + endpoint_protocol_version: Optional[List[str]] = None, + subprotocol: Optional[str] = None, + subprotocol_body: Optional[str] = None, + subprotocol_body_encoding: Optional[str] = None, + security_attributes: Optional[List[SecurityAttributeObject]] = None + ): + if not href or not isinstance(href, str): + raise ValueError("href must be a non-empty string representing a valid URL.") + + self.href = href + self.endpoint_protocol = endpoint_protocol + self.endpoint_protocol_version = endpoint_protocol_version or [] + self.subprotocol = subprotocol + self.subprotocol_body = subprotocol_body + self.subprotocol_body_encoding = subprotocol_body_encoding + self.security_attributes = security_attributes or [] + + +class Endpoint: + INTERFACE_SHORTNAMES = { + "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", + "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", + "CD-REPOSITORY", "AAS-DISCOVERY" + } + VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") + + def __init__(self, interface: base.NameType, protocol_information: ProtocolInformation): # noqa: E501 + + self.interface = interface + self.protocol_information = protocol_information + + @property + def interface(self) -> str: + return self._interface + + @interface.setter + def interface(self, interface: base.NameType): + if interface is None: + raise ValueError("Invalid value for `interface`, must not be `None`") + if not self.is_valid_interface(interface): + raise ValueError(f"Invalid interface format: {interface}. Expected format: '-', ") + + self._interface = interface + + @classmethod + def is_valid_interface(cls, interface: base.NameType) -> bool: + parts = interface.split("-", 1) + if len(parts) != 2: + return False + short_name, version = parts + return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) + + @property + def protocol_information(self) -> ProtocolInformation: + return self._protocol_information + + @protocol_information.setter + def protocol_information(self, protocol_information: ProtocolInformation): + if protocol_information is None: + raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 + + self._protocol_information = protocol_information + + From eba1d89600fd8b268d1b65c69b97556c10f98d5f Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 11:02:25 +0200 Subject: [PATCH 17/76] Refactor `result_to_xml` and `message_to_xml` --- server/app/http_api_helpers.py | 64 +++++++++++++++++----------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/server/app/http_api_helpers.py b/server/app/http_api_helpers.py index 5d7f882b8..847a6fb63 100644 --- a/server/app/http_api_helpers.py +++ b/server/app/http_api_helpers.py @@ -138,7 +138,7 @@ def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> if cursor is not None: root_elem.set("cursor", str(cursor)) if isinstance(obj, Result): - result_elem = result_to_xml(obj, **XML_NS_MAP) + result_elem = self.result_to_xml(obj, **XML_NS_MAP) for child in result_elem: root_elem.append(child) elif isinstance(obj, list): @@ -153,43 +153,43 @@ def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> xml_str = etree.tostring(root_elem, xml_declaration=True, encoding="utf-8") return xml_str # type: ignore[return-value] + @classmethod + def result_to_xml(cls, result: Result, **kwargs) -> etree._Element: + result_elem = etree.Element("result", **kwargs) + success_elem = etree.Element("success") + success_elem.text = xml_serialization.boolean_to_xml(result.success) + messages_elem = etree.Element("messages") + for message in result.messages: + messages_elem.append(cls.message_to_xml(message)) + + result_elem.append(success_elem) + result_elem.append(messages_elem) + return result_elem + + @classmethod + def message_to_xml(cls, message: Message) -> etree._Element: + message_elem = etree.Element("message") + message_type_elem = etree.Element("messageType") + message_type_elem.text = str(message.message_type) + text_elem = etree.Element("text") + text_elem.text = message.text + code_elem = etree.Element("code") + code_elem.text = message.code + timestamp_elem = etree.Element("timestamp") + timestamp_elem.text = message.timestamp.isoformat() + + message_elem.append(message_type_elem) + message_elem.append(text_elem) + message_elem.append(code_elem) + message_elem.append(timestamp_elem) + return message_elem + class XmlResponseAlt(XmlResponse): def __init__(self, *args, content_type="text/xml", **kwargs): super().__init__(*args, **kwargs, content_type=content_type) -def result_to_xml(result: Result, **kwargs) -> etree._Element: - result_elem = etree.Element("result", **kwargs) - success_elem = etree.Element("success") - success_elem.text = xml_serialization.boolean_to_xml(result.success) - messages_elem = etree.Element("messages") - for message in result.messages: - messages_elem.append(message_to_xml(message)) - - result_elem.append(success_elem) - result_elem.append(messages_elem) - return result_elem - - -def message_to_xml(message: Message) -> etree._Element: - message_elem = etree.Element("message") - message_type_elem = etree.Element("messageType") - message_type_elem.text = str(message.message_type) - text_elem = etree.Element("text") - text_elem.text = message.text - code_elem = etree.Element("code") - code_elem.text = message.code - timestamp_elem = etree.Element("timestamp") - timestamp_elem.text = message.timestamp.isoformat() - - message_elem.append(message_type_elem) - message_elem.append(text_elem) - message_elem.append(code_elem) - message_elem.append(timestamp_elem) - return message_elem - - def get_response_type(request: Request) -> Type[APIResponse]: response_types: Dict[str, Type[APIResponse]] = { "application/json": JsonResponse, From 4acab0d36ed655276c1ce9debe7af1fd3a63d205 Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 11:17:24 +0200 Subject: [PATCH 18/76] Move all response related to `response.py` All response related from http_api_helpers.py was moved to `response.py` --- server/app/http_api_helpers.py | 201 +--------------------------- server/app/interfaces/discovery.py | 7 +- server/app/interfaces/registry.py | 4 +- server/app/interfaces/repository.py | 4 +- server/app/response.py | 201 ++++++++++++++++++++++++++++ 5 files changed, 213 insertions(+), 204 deletions(-) create mode 100644 server/app/response.py diff --git a/server/app/http_api_helpers.py b/server/app/http_api_helpers.py index 847a6fb63..e15ba632a 100644 --- a/server/app/http_api_helpers.py +++ b/server/app/http_api_helpers.py @@ -4,11 +4,8 @@ # the LICENSE file of this project. # # SPDX-License-Identifier: MIT -import abc import base64 import binascii -import datetime -import enum import io import json @@ -18,206 +15,17 @@ import werkzeug.urls import werkzeug.utils from werkzeug.exceptions import BadRequest, UnprocessableEntity -from werkzeug.wrappers import Request, Response +from werkzeug.wrappers import Request from basyx.aas import model -from basyx.aas.adapter._generic import XML_NS_MAP -from basyx.aas.adapter.xml import xml_serialization, XMLConstructables +from basyx.aas.adapter.xml import XMLConstructables import server_model from .adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element -from .adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder +from .adapter.jsonization import ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder -from typing import Callable, Dict, List, Optional, Type, TypeVar, Union - -@enum.unique -class MessageType(enum.Enum): - UNDEFINED = enum.auto() - INFO = enum.auto() - WARNING = enum.auto() - ERROR = enum.auto() - EXCEPTION = enum.auto() - - def __str__(self): - return self.name.capitalize() - - -class Message: - def __init__(self, code: str, text: str, message_type: MessageType = MessageType.UNDEFINED, - timestamp: Optional[datetime.datetime] = None): - self.code: str = code - self.text: str = text - self.message_type: MessageType = message_type - self.timestamp: datetime.datetime = timestamp if timestamp is not None \ - else datetime.datetime.now(datetime.timezone.utc) - - -class Result: - def __init__(self, success: bool, messages: Optional[List[Message]] = None): - if messages is None: - messages = [] - self.success: bool = success - self.messages: List[Message] = messages - - -class ResultToJsonEncoder(ServerAASToJsonEncoder): - @classmethod - def _result_to_json(cls, result: Result) -> Dict[str, object]: - return { - "success": result.success, - "messages": result.messages - } - - @classmethod - def _message_to_json(cls, message: Message) -> Dict[str, object]: - return { - "messageType": message.message_type, - "text": message.text, - "code": message.code, - "timestamp": message.timestamp.isoformat() - } - - def default(self, obj: object) -> object: - if isinstance(obj, Result): - return self._result_to_json(obj) - if isinstance(obj, Message): - return self._message_to_json(obj) - if isinstance(obj, MessageType): - return str(obj) - return super().default(obj) - - -class StrippedResultToJsonEncoder(ResultToJsonEncoder): - stripped = True - - -ResponseData = Union[Result, object, List[object]] - - -class APIResponse(abc.ABC, Response): - @abc.abstractmethod - def __init__(self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, - stripped: bool = False, *args, **kwargs): - super().__init__(*args, **kwargs) - if obj is None: - self.status_code = 204 - else: - self.data = self.serialize(obj, cursor, stripped) - - @abc.abstractmethod - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - pass - - -class JsonResponse(APIResponse): - def __init__(self, *args, content_type="application/json", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - if cursor is None: - data = obj - else: - data = { - "paging_metadata": {"cursor": str(cursor)}, - "result": obj - } - return json.dumps( - data, - cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, - separators=(",", ":") - ) - - -class XmlResponse(APIResponse): - def __init__(self, *args, content_type="application/xml", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - root_elem = etree.Element("response", nsmap=XML_NS_MAP) - if cursor is not None: - root_elem.set("cursor", str(cursor)) - if isinstance(obj, Result): - result_elem = self.result_to_xml(obj, **XML_NS_MAP) - for child in result_elem: - root_elem.append(child) - elif isinstance(obj, list): - for item in obj: - item_elem = xml_serialization.object_to_xml_element(item) - root_elem.append(item_elem) - else: - obj_elem = xml_serialization.object_to_xml_element(obj) - for child in obj_elem: - root_elem.append(child) - etree.cleanup_namespaces(root_elem) - xml_str = etree.tostring(root_elem, xml_declaration=True, encoding="utf-8") - return xml_str # type: ignore[return-value] - - @classmethod - def result_to_xml(cls, result: Result, **kwargs) -> etree._Element: - result_elem = etree.Element("result", **kwargs) - success_elem = etree.Element("success") - success_elem.text = xml_serialization.boolean_to_xml(result.success) - messages_elem = etree.Element("messages") - for message in result.messages: - messages_elem.append(cls.message_to_xml(message)) - - result_elem.append(success_elem) - result_elem.append(messages_elem) - return result_elem - - @classmethod - def message_to_xml(cls, message: Message) -> etree._Element: - message_elem = etree.Element("message") - message_type_elem = etree.Element("messageType") - message_type_elem.text = str(message.message_type) - text_elem = etree.Element("text") - text_elem.text = message.text - code_elem = etree.Element("code") - code_elem.text = message.code - timestamp_elem = etree.Element("timestamp") - timestamp_elem.text = message.timestamp.isoformat() - - message_elem.append(message_type_elem) - message_elem.append(text_elem) - message_elem.append(code_elem) - message_elem.append(timestamp_elem) - return message_elem - - -class XmlResponseAlt(XmlResponse): - def __init__(self, *args, content_type="text/xml", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - -def get_response_type(request: Request) -> Type[APIResponse]: - response_types: Dict[str, Type[APIResponse]] = { - "application/json": JsonResponse, - "application/xml": XmlResponse, - "text/xml": XmlResponseAlt - } - if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): - return JsonResponse - mime_type = request.accept_mimetypes.best_match(response_types) - if mime_type is None: - raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " - + ", ".join(response_types.keys())) - return response_types[mime_type] - - -def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ - -> APIResponse: - headers = exception.get_headers() - location = exception.get_response().location - if location is not None: - headers.append(("Location", location)) - if exception.code and exception.code >= 400: - message = Message(type(exception).__name__, exception.description if exception.description is not None else "", - MessageType.ERROR) - result = Result(False, [message]) - else: - result = Result(False) - return response_type(result, status=exception.code, headers=headers) +from typing import Callable, List, Optional, Type, TypeVar, Union def is_stripped_request(request: Request) -> bool: @@ -406,6 +214,7 @@ def _convert_single_json_item(cls, data: any, expect_type: Type[T], stripped: bo json_bytes = json.dumps(data).encode("utf-8") return cls.json(json_bytes, expect_type, stripped) + class Base64URLConverter(werkzeug.routing.UnicodeConverter): def to_url(self, value: model.Identifier) -> str: diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index e05c5d3d5..d1ee6197b 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -6,15 +6,14 @@ from .. import server_model from ..adapter.jsonization import ServerAASToJsonEncoder -from ..http_api_helpers import APIResponse, http_exception_to_response, get_response_type, HTTPApiDecoder from werkzeug.routing import MapAdapter, Rule, Submount -from ..http_api_helpers import Base64URLConverter, APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder, get_response_type, http_exception_to_response, is_stripped_request -from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type, TypeVar, Union, Tuple, Set +from ..http_api_helpers import Base64URLConverter, HTTPApiDecoder +from ..response import get_response_type, http_exception_to_response +from typing import Dict, Iterable, List, TypeVar, Set import abc -import copy from pymongo import MongoClient from pymongo.collection import Collection diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 1202798c2..0181faa1b 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -21,8 +21,8 @@ from basyx.aas import model import server.app.server_model as server_model -from ..http_api_helpers import APIResponse, XmlResponse, JsonResponse, XmlResponseAlt, Message, MessageType, Result, HTTPApiDecoder -from ..http_api_helpers import Base64URLConverter +from ..http_api_helpers import HTTPApiDecoder, Base64URLConverter +from server.app.response import APIResponse, JsonResponse, XmlResponse, XmlResponseAlt, Result, MessageType, Message from typing import Dict, Iterable, Iterator, List, Type, TypeVar, Tuple diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index aec462301..5042bc96e 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -42,8 +42,8 @@ from basyx.aas import model from basyx.aas.adapter import aasx -from ..http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, get_response_type, \ - http_exception_to_response, APIResponse, is_stripped_request +from ..http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, is_stripped_request +from server.app.response import APIResponse, get_response_type, http_exception_to_response class WSGIApp: diff --git a/server/app/response.py b/server/app/response.py new file mode 100644 index 000000000..2d8115827 --- /dev/null +++ b/server/app/response.py @@ -0,0 +1,201 @@ +import abc +import datetime +import enum +import json +from typing import Union, List, Optional, Type, Dict + +import werkzeug.exceptions +from lxml import etree +from werkzeug import Response, Request + +from basyx.aas.adapter._generic import XML_NS_MAP +from basyx.aas.adapter.xml import xml_serialization +from server.app.adapter.jsonization import ServerAASToJsonEncoder + + +@enum.unique +class MessageType(enum.Enum): + UNDEFINED = enum.auto() + INFO = enum.auto() + WARNING = enum.auto() + ERROR = enum.auto() + EXCEPTION = enum.auto() + + def __str__(self): + return self.name.capitalize() + + +class Message: + def __init__(self, code: str, text: str, message_type: MessageType = MessageType.UNDEFINED, + timestamp: Optional[datetime.datetime] = None): + self.code: str = code + self.text: str = text + self.message_type: MessageType = message_type + self.timestamp: datetime.datetime = timestamp if timestamp is not None \ + else datetime.datetime.now(datetime.timezone.utc) + + +class Result: + def __init__(self, success: bool, messages: Optional[List[Message]] = None): + if messages is None: + messages = [] + self.success: bool = success + self.messages: List[Message] = messages + + +ResponseData = Union[Result, object, List[object]] + + +class APIResponse(abc.ABC, Response): + @abc.abstractmethod + def __init__(self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, + stripped: bool = False, *args, **kwargs): + super().__init__(*args, **kwargs) + if obj is None: + self.status_code = 204 + else: + self.data = self.serialize(obj, cursor, stripped) + + @abc.abstractmethod + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + pass + + +class JsonResponse(APIResponse): + def __init__(self, *args, content_type="application/json", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + if cursor is None: + data = obj + else: + data = { + "paging_metadata": {"cursor": str(cursor)}, + "result": obj + } + return json.dumps( + data, + cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, + separators=(",", ":") + ) + + +class XmlResponse(APIResponse): + def __init__(self, *args, content_type="application/xml", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + root_elem = etree.Element("response", nsmap=XML_NS_MAP) + if cursor is not None: + root_elem.set("cursor", str(cursor)) + if isinstance(obj, Result): + result_elem = self.result_to_xml(obj, **XML_NS_MAP) + for child in result_elem: + root_elem.append(child) + elif isinstance(obj, list): + for item in obj: + item_elem = xml_serialization.object_to_xml_element(item) + root_elem.append(item_elem) + else: + obj_elem = xml_serialization.object_to_xml_element(obj) + for child in obj_elem: + root_elem.append(child) + etree.cleanup_namespaces(root_elem) + xml_str = etree.tostring(root_elem, xml_declaration=True, encoding="utf-8") + return xml_str # type: ignore[return-value] + + @classmethod + def result_to_xml(cls, result: Result, **kwargs) -> etree._Element: + result_elem = etree.Element("result", **kwargs) + success_elem = etree.Element("success") + success_elem.text = xml_serialization.boolean_to_xml(result.success) + messages_elem = etree.Element("messages") + for message in result.messages: + messages_elem.append(cls.message_to_xml(message)) + + result_elem.append(success_elem) + result_elem.append(messages_elem) + return result_elem + + @classmethod + def message_to_xml(cls, message: Message) -> etree._Element: + message_elem = etree.Element("message") + message_type_elem = etree.Element("messageType") + message_type_elem.text = str(message.message_type) + text_elem = etree.Element("text") + text_elem.text = message.text + code_elem = etree.Element("code") + code_elem.text = message.code + timestamp_elem = etree.Element("timestamp") + timestamp_elem.text = message.timestamp.isoformat() + + message_elem.append(message_type_elem) + message_elem.append(text_elem) + message_elem.append(code_elem) + message_elem.append(timestamp_elem) + return message_elem + + +class XmlResponseAlt(XmlResponse): + def __init__(self, *args, content_type="text/xml", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + +class ResultToJsonEncoder(ServerAASToJsonEncoder): + @classmethod + def _result_to_json(cls, result: Result) -> Dict[str, object]: + return { + "success": result.success, + "messages": result.messages + } + @classmethod + def _message_to_json(cls, message: Message) -> Dict[str, object]: + return { + "messageType": message.message_type, + "text": message.text, + "code": message.code, + "timestamp": message.timestamp.isoformat() + } + + def default(self, obj: object) -> object: + if isinstance(obj, Result): + return self._result_to_json(obj) + if isinstance(obj, Message): + return self._message_to_json(obj) + if isinstance(obj, MessageType): + return str(obj) + return super().default(obj) + + +class StrippedResultToJsonEncoder(ResultToJsonEncoder): + stripped = True + + +def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ + -> APIResponse: + headers = exception.get_headers() + location = exception.get_response().location + if location is not None: + headers.append(("Location", location)) + if exception.code and exception.code >= 400: + message = Message(type(exception).__name__, exception.description if exception.description is not None else "", + MessageType.ERROR) + result = Result(False, [message]) + else: + result = Result(False) + return response_type(result, status=exception.code, headers=headers) + + +def get_response_type(request: Request) -> Type[APIResponse]: + response_types: Dict[str, Type[APIResponse]] = { + "application/json": JsonResponse, + "application/xml": XmlResponse, + "text/xml": XmlResponseAlt + } + if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): + return JsonResponse + mime_type = request.accept_mimetypes.best_match(response_types) + if mime_type is None: + raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " + + ", ".join(response_types.keys())) + return response_types[mime_type] From 567b5f1fae4f7ea8751a64f23c1e22a5bb819f4b Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 14:59:30 +0200 Subject: [PATCH 19/76] Create base classes for WSGI apps We created parent classes `BaseWSGIApp` and `ObjectStoreWSGIApp` for discovery/registry/repository app classes. Now we can reuse methods defined in parent classes and avoid code duplication. --- server/app/http_api_helpers.py | 5 +- server/app/interfaces/base.py | 71 +++++++++++++++++++++ server/app/interfaces/discovery.py | 47 ++------------ server/app/interfaces/registry.py | 98 +++-------------------------- server/app/interfaces/repository.py | 54 +--------------- 5 files changed, 90 insertions(+), 185 deletions(-) create mode 100644 server/app/interfaces/base.py diff --git a/server/app/http_api_helpers.py b/server/app/http_api_helpers.py index e15ba632a..61ee1fabf 100644 --- a/server/app/http_api_helpers.py +++ b/server/app/http_api_helpers.py @@ -7,6 +7,7 @@ import base64 import binascii import io +import itertools import json from lxml import etree @@ -21,11 +22,11 @@ from basyx.aas.adapter.xml import XMLConstructables -import server_model +from . import server_model from .adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element from .adapter.jsonization import ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder -from typing import Callable, List, Optional, Type, TypeVar, Union +from typing import Callable, List, Optional, Type, TypeVar, Union, Iterable, Tuple, Iterator def is_stripped_request(request: Request) -> bool: diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py new file mode 100644 index 000000000..4198b3f92 --- /dev/null +++ b/server/app/interfaces/base.py @@ -0,0 +1,71 @@ +import itertools +from typing import Iterable, Type, Iterator, Tuple + +import werkzeug.exceptions +import werkzeug.routing +import werkzeug.utils +from werkzeug import Response, Request +from werkzeug.exceptions import NotFound, BadRequest +from werkzeug.routing import MapAdapter + +from basyx.aas import model +from basyx.aas.model import AbstractObjectStore +from ..http_api_helpers import T +from server.app.response import get_response_type, http_exception_to_response + + +class BaseWSGIApp: + url_map: werkzeug.routing.Map + + # TODO: the parameters can be typed via builtin wsgiref with Python 3.11+ + def __call__(self, environ, start_response) -> Iterable[bytes]: + response: Response = self.handle_request(Request(environ)) + return response(environ, start_response) + + @classmethod + def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: + limit_str = request.args.get('limit', default="10") + cursor_str = request.args.get('cursor', default="0") + try: + limit, cursor = int(limit_str), int(cursor_str) + if limit < 0 or cursor < 0: + raise ValueError + except ValueError: + raise BadRequest("Cursor and limit must be positive integers!") + start_index = cursor + end_index = cursor + limit + paginated_slice = itertools.islice(iterator, start_index, end_index) + return paginated_slice, end_index + + def handle_request(self, request: Request): + map_adapter: MapAdapter = self.url_map.bind_to_environ(request.environ) + try: + response_t = get_response_type(request) + except werkzeug.exceptions.NotAcceptable as e: + return e + + try: + endpoint, values = map_adapter.match() + return endpoint(request, values, response_t=response_t, map_adapter=map_adapter) + + # any raised error that leaves this function will cause a 500 internal server error + # so catch raised http exceptions and return them + except werkzeug.exceptions.HTTPException as e: + return http_exception_to_response(e, response_t) + + +class ObjectStoreWSGIApp(BaseWSGIApp): + object_store: AbstractObjectStore + + def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: + for obj in self.object_store: + if isinstance(obj, type_): + obj.update() + yield obj + + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) -> model.provider._IT: + identifiable = self.object_store.get(identifier) + if not isinstance(identifiable, type_): + raise NotFound(f"No {type_.__name__} with {identifier} found!") + identifiable.update() + return identifiable diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index d1ee6197b..345532511 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -1,16 +1,15 @@ -import itertools import werkzeug.exceptions from werkzeug.wrappers import Request, Response from basyx.aas import model +from server.app.interfaces.base import BaseWSGIApp from .. import server_model from ..adapter.jsonization import ServerAASToJsonEncoder -from werkzeug.routing import MapAdapter, Rule, Submount +from werkzeug.routing import Rule, Submount from ..http_api_helpers import Base64URLConverter, HTTPApiDecoder -from ..response import get_response_type, http_exception_to_response -from typing import Dict, Iterable, List, TypeVar, Set +from typing import Dict, List, Set import abc @@ -133,12 +132,7 @@ def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identi ) - -T = TypeVar("T") - -BASE64URL_ENCODING = "utf-8" - -class DiscoveryAPI: +class DiscoveryAPI(BaseWSGIApp): def __init__(self, persistent_store: AbstractDiscoveryStore, base_path: str = "/api/v3.0"): self.persistent_store: AbstractDiscoveryStore = persistent_store @@ -159,39 +153,6 @@ def __init__(self, "base64url": Base64URLConverter }, strict_slashes=False) - def __call__(self, environ, start_response) -> Iterable[bytes]: - response: Response = self.handle_request(Request(environ)) - return response(environ, start_response) - - def _get_slice(self, request: Request, iterator): - limit_str = request.args.get('limit', default="10") - cursor_str = request.args.get('cursor', default="0") - try: - limit, cursor = int(limit_str), int(cursor_str) - if limit < 0 or cursor < 0: - raise ValueError - except ValueError: - raise werkzeug.exceptions.BadRequest("Cursor and limit must be positive integers!") - paginated_slice = itertools.islice(iterator, cursor, cursor + limit) - return paginated_slice, cursor + limit - - - def handle_request(self, request: Request): - map_adapter: MapAdapter = self.url_map.bind_to_environ( - request.environ) - try: - response_t = get_response_type(request) - except werkzeug.exceptions.NotAcceptable as e: - return e - try: - endpoint, values = map_adapter.match() - return endpoint(request, values, response_t=response_t, - map_adapter=map_adapter) - # any raised error that leaves this function will cause a 500 internal server error - # so catch raised http exceptions and return them - except werkzeug.exceptions.HTTPException as e: - return http_exception_to_response(e, response_t) - def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: asset_links = HTTPApiDecoder.request_body_list(request, server_model.AssetLink, False) matching_aas_keys = set() diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 0181faa1b..026a89987 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -8,59 +8,25 @@ This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". """ -import itertools - import werkzeug.exceptions import werkzeug.routing import werkzeug.urls import werkzeug.utils -from werkzeug.exceptions import BadRequest, Conflict, NotFound +from werkzeug.exceptions import Conflict, NotFound from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response from basyx.aas import model import server.app.server_model as server_model +from server.app.interfaces.base import ObjectStoreWSGIApp + +from ..http_api_helpers import HTTPApiDecoder, Base64URLConverter, is_stripped_request +from server.app.response import APIResponse + +from typing import Dict, Iterator, List, Type, Tuple -from ..http_api_helpers import HTTPApiDecoder, Base64URLConverter -from server.app.response import APIResponse, JsonResponse, XmlResponse, XmlResponseAlt, Result, MessageType, Message - -from typing import Dict, Iterable, Iterator, List, Type, TypeVar, Tuple - -def get_response_type(request: Request) -> Type[APIResponse]: - response_types: Dict[str, Type[APIResponse]] = { - "application/json": JsonResponse, - "application/xml": XmlResponse, - "text/xml": XmlResponseAlt - } - if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): - return JsonResponse - mime_type = request.accept_mimetypes.best_match(response_types) - if mime_type is None: - raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " - + ", ".join(response_types.keys())) - return response_types[mime_type] - -def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ - -> APIResponse: - headers = exception.get_headers() - location = exception.get_response().location - if location is not None: - headers.append(("Location", location)) - if exception.code and exception.code >= 400: - message = Message(type(exception).__name__, exception.description if exception.description is not None else "", - MessageType.ERROR) - result = Result(False, [message]) - else: - result = Result(False) - return response_type(result, status=exception.code, headers=headers) - -def is_stripped_request(request: Request) -> bool: - return request.args.get("level") == "core" - -T = TypeVar("T") - -BASE64URL_ENCODING = "utf-8" -class RegistryAPI: + +class RegistryAPI(ObjectStoreWSGIApp): def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.0"): self.object_store: model.AbstractObjectStore = object_store self.url_map = werkzeug.routing.Map([ @@ -93,36 +59,6 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a "base64url": Base64URLConverter }, strict_slashes=False) - def __call__(self, environ, start_response) -> Iterable[bytes]: - response: Response = self.handle_request(Request(environ)) - return response(environ, start_response) - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) -> model.provider._IT: - identifiable = self.object_store.get(identifier) - if not isinstance(identifiable, type_): - raise NotFound(f"No {type_.__name__} with {identifier} found!") - identifiable.update() - return identifiable - - def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: - for obj in self.object_store: - if isinstance(obj, type_): - obj.update() - yield obj - @classmethod - def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: - limit_str = request.args.get('limit', default="10") - cursor_str = request.args.get('cursor', default="0") - try: - limit, cursor = int(limit_str), int(cursor_str) - if limit < 0 or cursor < 0: - raise ValueError - except ValueError: - raise BadRequest("Cursor and limit must be positive integers!") - start_index = cursor - end_index = cursor + limit - paginated_slice = itertools.islice(iterator, start_index, end_index) - return paginated_slice, end_index - def _get_descriptors(self, request: "Request") -> Tuple[Iterator[server_model.AssetAdministrationShellDescriptor], int]: """ Returns all Asset Administration Shell Descriptors @@ -170,22 +106,6 @@ def _get_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_m def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescriptor: return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) - def handle_request(self, request: Request): - map_adapter: MapAdapter = self.url_map.bind_to_environ(request.environ) - try: - response_t = get_response_type(request) - except werkzeug.exceptions.NotAcceptable as e: - return e - - try: - endpoint, values = map_adapter.match() - return endpoint(request, values, response_t=response_t, map_adapter=map_adapter) - - # any raised error that leaves this function will cause a 500 internal server error - # so catch raised http exceptions and return them - except werkzeug.exceptions.HTTPException as e: - return http_exception_to_response(e, response_t) - # ------ AAS REGISTRY ROUTES ------- def get_aas_descriptors_all(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: aas_descriptors, cursor = self._get_descriptors(request) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 5042bc96e..03b072c0b 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -42,11 +42,12 @@ from basyx.aas import model from basyx.aas.adapter import aasx +from .base import ObjectStoreWSGIApp from ..http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, is_stripped_request -from server.app.response import APIResponse, get_response_type, http_exception_to_response +from server.app.response import APIResponse -class WSGIApp: +class WSGIApp(ObjectStoreWSGIApp): def __init__(self, object_store: model.AbstractObjectStore, file_store: aasx.AbstractSupplementaryFileContainer, base_path: str = "/api/v3.0"): self.object_store: model.AbstractObjectStore = object_store @@ -158,24 +159,6 @@ def __init__(self, object_store: model.AbstractObjectStore, file_store: aasx.Abs "id_short_path": IdShortPathConverter }, strict_slashes=False) - # TODO: the parameters can be typed via builtin wsgiref with Python 3.11+ - def __call__(self, environ, start_response) -> Iterable[bytes]: - response: Response = self.handle_request(Request(environ)) - return response(environ, start_response) - - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) -> model.provider._IT: - identifiable = self.object_store.get(identifier) - if not isinstance(identifiable, type_): - raise NotFound(f"No {type_.__name__} with {identifier} found!") - identifiable.update() - return identifiable - - def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: - for obj in self.object_store: - if isinstance(obj, type_): - obj.update() - yield obj - def _resolve_reference(self, reference: model.ModelReference[model.base._RT]) -> model.base._RT: try: return reference.resolve(self.object_store) @@ -238,21 +221,6 @@ def _get_submodel_reference(cls, aas: model.AssetAdministrationShell, submodel_i return ref raise NotFound(f"The AAS {aas!r} doesn't have a submodel reference to {submodel_id!r}!") - @classmethod - def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: - limit_str = request.args.get('limit', default="10") - cursor_str = request.args.get('cursor', default="0") - try: - limit, cursor = int(limit_str), int(cursor_str) - if limit < 0 or cursor < 0: - raise ValueError - except ValueError: - raise BadRequest("Cursor and limit must be positive integers!") - start_index = cursor - end_index = cursor + limit - paginated_slice = itertools.islice(iterator, start_index, end_index) - return paginated_slice, end_index - def _get_shells(self, request: Request) -> Tuple[Iterator[model.AssetAdministrationShell], int]: aas: Iterator[model.AssetAdministrationShell] = self._get_all_obj_of_type(model.AssetAdministrationShell) @@ -307,22 +275,6 @@ def _get_submodel_submodel_elements_id_short_path(self, url_args: Dict) -> model def _get_concept_description(self, url_args): return self._get_obj_ts(url_args["concept_id"], model.ConceptDescription) - def handle_request(self, request: Request): - map_adapter: MapAdapter = self.url_map.bind_to_environ(request.environ) - try: - response_t = get_response_type(request) - except werkzeug.exceptions.NotAcceptable as e: - return e - - try: - endpoint, values = map_adapter.match() - return endpoint(request, values, response_t=response_t, map_adapter=map_adapter) - - # any raised error that leaves this function will cause a 500 internal server error - # so catch raised http exceptions and return them - except werkzeug.exceptions.HTTPException as e: - return http_exception_to_response(e, response_t) - # ------ all not implemented ROUTES ------- def not_implemented(self, request: Request, url_args: Dict, **_kwargs) -> Response: raise werkzeug.exceptions.NotImplemented("This route is not implemented!") From 3d15b516640e13a8fd6e6db4bd189909b569864e Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 15:11:38 +0200 Subject: [PATCH 20/76] Refactor `http_api_helpers.py` and `response.py` --- server/app/api_utils/__init__.py | 0 server/app/{ => api_utils}/http_api_helpers.py | 6 +++--- server/app/{ => api_utils}/response.py | 0 server/app/interfaces/base.py | 4 ++-- server/app/interfaces/discovery.py | 2 +- server/app/interfaces/registry.py | 4 ++-- server/app/interfaces/repository.py | 7 +++---- 7 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 server/app/api_utils/__init__.py rename server/app/{ => api_utils}/http_api_helpers.py (97%) rename server/app/{ => api_utils}/response.py (100%) diff --git a/server/app/api_utils/__init__.py b/server/app/api_utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/app/http_api_helpers.py b/server/app/api_utils/http_api_helpers.py similarity index 97% rename from server/app/http_api_helpers.py rename to server/app/api_utils/http_api_helpers.py index 61ee1fabf..f01d46168 100644 --- a/server/app/http_api_helpers.py +++ b/server/app/api_utils/http_api_helpers.py @@ -22,9 +22,9 @@ from basyx.aas.adapter.xml import XMLConstructables -from . import server_model -from .adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element -from .adapter.jsonization import ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder +from server.app import server_model +from server.app.adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element +from server.app.adapter.jsonization import ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder from typing import Callable, List, Optional, Type, TypeVar, Union, Iterable, Tuple, Iterator diff --git a/server/app/response.py b/server/app/api_utils/response.py similarity index 100% rename from server/app/response.py rename to server/app/api_utils/response.py diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 4198b3f92..88f244664 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -10,8 +10,8 @@ from basyx.aas import model from basyx.aas.model import AbstractObjectStore -from ..http_api_helpers import T -from server.app.response import get_response_type, http_exception_to_response +from server.app.api_utils.http_api_helpers import T +from server.app.api_utils.response import get_response_type, http_exception_to_response class BaseWSGIApp: diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 345532511..7749de5ae 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -8,7 +8,7 @@ from ..adapter.jsonization import ServerAASToJsonEncoder from werkzeug.routing import Rule, Submount -from ..http_api_helpers import Base64URLConverter, HTTPApiDecoder +from server.app.api_utils.http_api_helpers import Base64URLConverter, HTTPApiDecoder from typing import Dict, List, Set import abc diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 026a89987..f3ce6c177 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -20,8 +20,8 @@ import server.app.server_model as server_model from server.app.interfaces.base import ObjectStoreWSGIApp -from ..http_api_helpers import HTTPApiDecoder, Base64URLConverter, is_stripped_request -from server.app.response import APIResponse +from server.app.api_utils.http_api_helpers import HTTPApiDecoder, Base64URLConverter, is_stripped_request +from server.app.api_utils.response import APIResponse from typing import Dict, Iterator, List, Type, Tuple diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 03b072c0b..040e6c859 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -29,8 +29,7 @@ """ import io -import itertools -from typing import Iterable, Type, Iterator, List, Dict, Union, Callable, Tuple, Optional +from typing import Type, Iterator, List, Dict, Union, Callable, Tuple, Optional import werkzeug.exceptions import werkzeug.routing @@ -43,8 +42,8 @@ from basyx.aas import model from basyx.aas.adapter import aasx from .base import ObjectStoreWSGIApp -from ..http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, is_stripped_request -from server.app.response import APIResponse +from server.app.api_utils.http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, is_stripped_request +from server.app.api_utils.response import APIResponse class WSGIApp(ObjectStoreWSGIApp): From cb107ed7ab9a98c72db1965f015cb65e359ba616 Mon Sep 17 00:00:00 2001 From: zrgt Date: Wed, 16 Apr 2025 15:18:21 +0200 Subject: [PATCH 21/76] Reformat code with PyCharm --- server/app/adapter/jsonization.py | 18 +++--- server/app/api_utils/http_api_helpers.py | 7 ++- server/app/api_utils/response.py | 1 + server/app/interfaces/discovery.py | 27 ++++---- server/app/interfaces/registry.py | 67 ++++++++++++-------- server/app/interfaces/repository.py | 78 ++++++++++++++++-------- server/app/server_model/__init__.py | 2 +- server/app/server_model/endpoint.py | 3 - 8 files changed, 123 insertions(+), 80 deletions(-) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index b6ae1635c..6999302ea 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -1,4 +1,4 @@ -from typing import Dict, Set, Optional, Type, List +from typing import Dict, Set, Optional, Type import server.app.server_model as server_model from basyx.aas import model @@ -11,7 +11,6 @@ import logging from typing import Callable - logger = logging.getLogger(__name__) JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES + ( @@ -138,7 +137,8 @@ def _construct_endpoint(cls, dct: Dict[str, object], @classmethod def _construct_submodel_descriptor( - cls, dct: Dict[str, object], object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: + cls, dct: Dict[str, object], + object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: ret = object_class(id_=_get_ts(dct, 'id', str), endpoints=[]) cls._amend_abstract_attributes(ret, dct) @@ -210,9 +210,10 @@ class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, Ser pass -def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, - ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, - decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: +def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, + replace_existing: bool = False, + ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, + decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: return read_aas_json_file_into(object_store=object_store, file=file, replace_existing=replace_existing, ignore_existing=ignore_existing, failsafe=failsafe, stripped=stripped, decoder=decoder, keys_to_types=JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES) @@ -245,7 +246,8 @@ def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: return data @classmethod - def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> Dict[str, object]: + def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> \ + Dict[str, object]: """ serialization of an object from class AssetAdministrationShell to json @@ -296,7 +298,7 @@ def _protocol_information_to_json(cls, def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) data['protocolInformation'] = cls._protocol_information_to_json( - obj.protocol_information) + obj.protocol_information) data['interface'] = obj.interface return data diff --git a/server/app/api_utils/http_api_helpers.py b/server/app/api_utils/http_api_helpers.py index f01d46168..a81f123da 100644 --- a/server/app/api_utils/http_api_helpers.py +++ b/server/app/api_utils/http_api_helpers.py @@ -7,7 +7,6 @@ import base64 import binascii import io -import itertools import json from lxml import etree @@ -26,7 +25,7 @@ from server.app.adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element from server.app.adapter.jsonization import ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder -from typing import Callable, List, Optional, Type, TypeVar, Union, Iterable, Tuple, Iterator +from typing import Callable, List, Optional, Type, TypeVar, Union def is_stripped_request(request: Request) -> bool: @@ -108,7 +107,8 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool model.SpecificAssetId: decoder._construct_specific_asset_id, # type: ignore[assignment] model.Reference: decoder._construct_reference, # type: ignore[assignment] model.Qualifier: decoder._construct_qualifier, # type: ignore[assignment] - server_model.AssetAdministrationShellDescriptor: decoder._construct_asset_administration_shell_descriptor, # type: ignore[assignment] + server_model.AssetAdministrationShellDescriptor: + decoder._construct_asset_administration_shell_descriptor, # type: ignore[assignment] server_model.SubmodelDescriptor: decoder._construct_submodel_descriptor, # type: ignore[assignment] server_model.AssetLink: decoder._construct_asset_link, # type: ignore[assignment] } @@ -178,6 +178,7 @@ def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> if request.mimetype == "application/json": return cls.json(request.get_data(), expect_type, stripped) return cls.xml(request.get_data(), expect_type, stripped) + @classmethod def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: """ diff --git a/server/app/api_utils/response.py b/server/app/api_utils/response.py index 2d8115827..73c16887d 100644 --- a/server/app/api_utils/response.py +++ b/server/app/api_utils/response.py @@ -148,6 +148,7 @@ def _result_to_json(cls, result: Result) -> Dict[str, object]: "success": result.success, "messages": result.messages } + @classmethod def _message_to_json(cls, message: Message) -> Dict[str, object]: return { diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 7749de5ae..d96a224e5 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -1,33 +1,32 @@ +import abc +import json +from typing import Dict, List, Set + import werkzeug.exceptions +from pymongo import MongoClient +from pymongo.collection import Collection +from werkzeug.routing import Rule, Submount from werkzeug.wrappers import Request, Response from basyx.aas import model +from server.app.api_utils.http_api_helpers import Base64URLConverter, HTTPApiDecoder from server.app.interfaces.base import BaseWSGIApp - from .. import server_model from ..adapter.jsonization import ServerAASToJsonEncoder -from werkzeug.routing import Rule, Submount -from server.app.api_utils.http_api_helpers import Base64URLConverter, HTTPApiDecoder -from typing import Dict, List, Set - -import abc - -from pymongo import MongoClient -from pymongo.collection import Collection - -import json def specific_asset_to_json_obj(asset_id: model.SpecificAssetId) -> dict: # Encode the asset to a JSON string and then decode to a dict. json_str = ServerAASToJsonEncoder().encode(asset_id) return json.loads(json_str) + class AbstractDiscoveryStore(metaclass=abc.ABCMeta): @abc.abstractmethod def __init__(self): pass + class InMemoryDiscoveryStore(AbstractDiscoveryStore): def __init__(self): self.aas_to_assets: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} @@ -74,6 +73,7 @@ def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identi if asset_key in self.asset_to_aas: self.asset_to_aas[asset_key].discard(aas_key) + class MongoDiscoveryStore(AbstractDiscoveryStore): def __init__(self, uri: str = "mongodb://localhost:27017", @@ -153,7 +153,8 @@ def __init__(self, "base64url": Base64URLConverter }, strict_slashes=False) - def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, + **_kwargs) -> Response: asset_links = HTTPApiDecoder.request_body_list(request, server_model.AssetLink, False) matching_aas_keys = set() for asset_link in asset_links: @@ -184,7 +185,9 @@ def delete_all_asset_links_by_id(self, request: Request, url_args: dict, respons self.persistent_store.asset_to_aas[key].discard(aas_identifier) return response_t() + if __name__ == "__main__": from werkzeug.serving import run_simple + run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), use_debugger=True, use_reloader=True) diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index f3ce6c177..938b8e3a0 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -8,6 +8,8 @@ This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". """ +from typing import Dict, Iterator, List, Type, Tuple + import werkzeug.exceptions import werkzeug.routing import werkzeug.urls @@ -16,14 +18,11 @@ from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response -from basyx.aas import model import server.app.server_model as server_model -from server.app.interfaces.base import ObjectStoreWSGIApp - +from basyx.aas import model from server.app.api_utils.http_api_helpers import HTTPApiDecoder, Base64URLConverter, is_stripped_request from server.app.api_utils.response import APIResponse - -from typing import Dict, Iterator, List, Type, Tuple +from server.app.interfaces.base import ObjectStoreWSGIApp class RegistryAPI(ObjectStoreWSGIApp): @@ -38,12 +37,17 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor), Rule("/", methods=["DELETE"], endpoint=self.delete_aas_descriptor), Submount("/", [ - Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors_through_superpath), - Rule("/submodel-descriptors", methods=["POST"], endpoint=self.post_submodel_descriptor_through_superpath), + Rule("/submodel-descriptors", methods=["GET"], + endpoint=self.get_all_submodel_descriptors_through_superpath), + Rule("/submodel-descriptors", methods=["POST"], + endpoint=self.post_submodel_descriptor_through_superpath), Submount("/submodel-descriptors", [ - Rule("/", methods=["GET"], endpoint=self.get_submodel_descriptor_by_id_through_superpath), - Rule("/", methods=["PUT"], endpoint=self.put_submodel_descriptor_by_id_through_superpath), - Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_descriptor_by_id_through_superpath), + Rule("/", methods=["GET"], + endpoint=self.get_submodel_descriptor_by_id_through_superpath), + Rule("/", methods=["PUT"], + endpoint=self.put_submodel_descriptor_by_id_through_superpath), + Rule("/", methods=["DELETE"], + endpoint=self.delete_submodel_descriptor_by_id_through_superpath), ]) ]) ]), @@ -52,14 +56,16 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a Submount("/submodel-descriptors", [ Rule("/", methods=["GET"], endpoint=self.get_submodel_descriptor_by_id), Rule("/", methods=["PUT"], endpoint=self.put_submodel_descriptor_by_id), - Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_descriptor_by_id), + Rule("/", methods=["DELETE"], + endpoint=self.delete_submodel_descriptor_by_id), ]) ]) ], converters={ "base64url": Base64URLConverter }, strict_slashes=False) - def _get_descriptors(self, request: "Request") -> Tuple[Iterator[server_model.AssetAdministrationShellDescriptor], int]: + def _get_descriptors(self, request: "Request") -> Tuple[ + Iterator[server_model.AssetAdministrationShellDescriptor], int]: """ Returns all Asset Administration Shell Descriptors """ @@ -107,12 +113,13 @@ def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescr return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) # ------ AAS REGISTRY ROUTES ------- - def get_aas_descriptors_all(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def get_aas_descriptors_all(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: aas_descriptors, cursor = self._get_descriptors(request) return response_t(list(aas_descriptors), cursor=cursor) def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: + map_adapter: MapAdapter) -> Response: descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) try: self.object_store.add(descriptor) @@ -124,18 +131,21 @@ def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type }, force_external=True) return response_t(descriptor, status=201, headers={"Location": created_resource_url}) - def get_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def get_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: descriptor = self._get_descriptor(url_args) return response_t(descriptor) - def put_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def put_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: descriptor = self._get_descriptor(url_args) descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, - is_stripped_request(request))) + is_stripped_request(request))) descriptor.commit() return response_t() - def delete_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def delete_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: descriptor = self._get_descriptor(url_args) self.object_store.remove(descriptor) return response_t() @@ -233,19 +243,20 @@ def delete_submodel_descriptor_by_id_through_superpath(self, return response_t() # ------ Submodel REGISTRY ROUTES ------- - def get_all_submodel_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def get_all_submodel_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: submodel_descriptors, cursor = self._get_submodel_descriptors(request) return response_t(list(submodel_descriptors), cursor=cursor, stripped=is_stripped_request(request)) - - def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: submodel_descriptor = self._get_submodel_descriptor(url_args) return response_t(submodel_descriptor, stripped=is_stripped_request(request)) - def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter) -> Response: - submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request)) + submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, + is_stripped_request(request)) try: self.object_store.add(submodel_descriptor) except KeyError as e: @@ -256,14 +267,16 @@ def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: }, force_external=True) return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) - - def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: submodel_descriptor = self._get_submodel_descriptor(url_args) - submodel_descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) + submodel_descriptor.update_from( + HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) submodel_descriptor.commit() return response_t() - def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: + def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor)) return response_t() diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 040e6c859..6d63c2c01 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -41,9 +41,10 @@ from basyx.aas import model from basyx.aas.adapter import aasx -from .base import ObjectStoreWSGIApp -from server.app.api_utils.http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, is_stripped_request +from server.app.api_utils.http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, \ + is_stripped_request from server.app.api_utils.response import APIResponse +from .base import ObjectStoreWSGIApp class WSGIApp(ObjectStoreWSGIApp): @@ -66,13 +67,17 @@ def __init__(self, object_store: model.AbstractObjectStore, file_store: aasx.Abs Rule("/$reference", methods=["GET"], endpoint=self.get_aas_reference), Rule("/asset-information", methods=["GET"], endpoint=self.get_aas_asset_information), Rule("/asset-information", methods=["PUT"], endpoint=self.put_aas_asset_information), - Rule("/asset-information/thumbnail", methods=["GET", "PUT", "DELETE"], endpoint=self.not_implemented), + Rule("/asset-information/thumbnail", methods=["GET", "PUT", "DELETE"], + endpoint=self.not_implemented), Rule("/submodel-refs", methods=["GET"], endpoint=self.get_aas_submodel_refs), Rule("/submodel-refs", methods=["POST"], endpoint=self.post_aas_submodel_refs), - Rule("/submodel-refs/", methods=["DELETE"], endpoint=self.delete_aas_submodel_refs_specific), + Rule("/submodel-refs/", methods=["DELETE"], + endpoint=self.delete_aas_submodel_refs_specific), Submount("/submodels", [ - Rule("/", methods=["PUT"], endpoint=self.put_aas_submodel_refs_submodel), - Rule("/", methods=["DELETE"], endpoint=self.delete_aas_submodel_refs_submodel), + Rule("/", methods=["PUT"], + endpoint=self.put_aas_submodel_refs_submodel), + Rule("/", methods=["DELETE"], + endpoint=self.delete_aas_submodel_refs_submodel), Rule("/", endpoint=self.aas_submodel_refs_redirect), Rule("//", endpoint=self.aas_submodel_refs_redirect) ]) @@ -97,51 +102,71 @@ def __init__(self, object_store: model.AbstractObjectStore, file_store: aasx.Abs Rule("/$reference", methods=["GET"], endpoint=self.get_submodels_reference), Rule("/$path", methods=["GET"], endpoint=self.not_implemented), Rule("/submodel-elements", methods=["GET"], endpoint=self.get_submodel_submodel_elements), - Rule("/submodel-elements", methods=["POST"], endpoint=self.post_submodel_submodel_elements_id_short_path), + Rule("/submodel-elements", methods=["POST"], + endpoint=self.post_submodel_submodel_elements_id_short_path), Submount("/submodel-elements", [ Rule("/$metadata", methods=["GET"], endpoint=self.get_submodel_submodel_elements_metadata), - Rule("/$reference", methods=["GET"], endpoint=self.get_submodel_submodel_elements_reference), + Rule("/$reference", methods=["GET"], + endpoint=self.get_submodel_submodel_elements_reference), Rule("/$value", methods=["GET"], endpoint=self.not_implemented), Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/", methods=["GET"], endpoint=self.get_submodel_submodel_elements_id_short_path), - Rule("/", methods=["POST"], endpoint=self.post_submodel_submodel_elements_id_short_path), - Rule("/", methods=["PUT"], endpoint=self.put_submodel_submodel_elements_id_short_path), - Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_submodel_elements_id_short_path), + Rule("/", methods=["GET"], + endpoint=self.get_submodel_submodel_elements_id_short_path), + Rule("/", methods=["POST"], + endpoint=self.post_submodel_submodel_elements_id_short_path), + Rule("/", methods=["PUT"], + endpoint=self.put_submodel_submodel_elements_id_short_path), + Rule("/", methods=["DELETE"], + endpoint=self.delete_submodel_submodel_elements_id_short_path), Rule("/", methods=["PATCH"], endpoint=self.not_implemented), Submount("/", [ - Rule("/$metadata", methods=["GET"], endpoint=self.get_submodel_submodel_elements_id_short_path_metadata), + Rule("/$metadata", methods=["GET"], + endpoint=self.get_submodel_submodel_elements_id_short_path_metadata), Rule("/$metadata", methods=["PATCH"], endpoint=self.not_implemented), - Rule("/$reference", methods=["GET"], endpoint=self.get_submodel_submodel_elements_id_short_path_reference), + Rule("/$reference", methods=["GET"], + endpoint=self.get_submodel_submodel_elements_id_short_path_reference), Rule("/$value", methods=["GET"], endpoint=self.not_implemented), Rule("/$value", methods=["PATCH"], endpoint=self.not_implemented), Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/attachment", methods=["GET"], endpoint=self.get_submodel_submodel_element_attachment), - Rule("/attachment", methods=["PUT"], endpoint=self.put_submodel_submodel_element_attachment), - Rule("/attachment", methods=["DELETE"], endpoint=self.delete_submodel_submodel_element_attachment), + Rule("/attachment", methods=["GET"], + endpoint=self.get_submodel_submodel_element_attachment), + Rule("/attachment", methods=["PUT"], + endpoint=self.put_submodel_submodel_element_attachment), + Rule("/attachment", methods=["DELETE"], + endpoint=self.delete_submodel_submodel_element_attachment), Rule("/invoke", methods=["POST"], endpoint=self.not_implemented), Rule("/invoke/$value", methods=["POST"], endpoint=self.not_implemented), Rule("/invoke-async", methods=["POST"], endpoint=self.not_implemented), Rule("/invoke-async/$value", methods=["POST"], endpoint=self.not_implemented), - Rule("/operation-status/", methods=["GET"], endpoint=self.not_implemented), + Rule("/operation-status/", methods=["GET"], + endpoint=self.not_implemented), Submount("/operation-results", [ Rule("/", methods=["GET"], endpoint=self.not_implemented), Rule("//$value", methods=["GET"], endpoint=self.not_implemented) ]), - Rule("/qualifiers", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/qualifiers", methods=["POST"], endpoint=self.post_submodel_submodel_element_qualifiers), + Rule("/qualifiers", methods=["GET"], + endpoint=self.get_submodel_submodel_element_qualifiers), + Rule("/qualifiers", methods=["POST"], + endpoint=self.post_submodel_submodel_element_qualifiers), Submount("/qualifiers", [ - Rule("/", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/", methods=["PUT"], endpoint=self.put_submodel_submodel_element_qualifiers), - Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_submodel_element_qualifiers) + Rule("/", methods=["GET"], + endpoint=self.get_submodel_submodel_element_qualifiers), + Rule("/", methods=["PUT"], + endpoint=self.put_submodel_submodel_element_qualifiers), + Rule("/", methods=["DELETE"], + endpoint=self.delete_submodel_submodel_element_qualifiers) ]) ]) ]), Rule("/qualifiers", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), Rule("/qualifiers", methods=["POST"], endpoint=self.post_submodel_submodel_element_qualifiers), Submount("/qualifiers", [ - Rule("/", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/", methods=["PUT"], endpoint=self.put_submodel_submodel_element_qualifiers), - Rule("/", methods=["DELETE"], endpoint=self.delete_submodel_submodel_element_qualifiers) + Rule("/", methods=["GET"], + endpoint=self.get_submodel_submodel_element_qualifiers), + Rule("/", methods=["PUT"], + endpoint=self.put_submodel_submodel_element_qualifiers), + Rule("/", methods=["DELETE"], + endpoint=self.delete_submodel_submodel_element_qualifiers) ]) ]) ]), @@ -706,6 +731,7 @@ def delete_concept_description(self, request: Request, url_args: Dict, response_ self.object_store.remove(self._get_concept_description(url_args)) return response_t() + if __name__ == "__main__": from werkzeug.serving import run_simple from basyx.aas.examples.data.example_aas import create_full_example diff --git a/server/app/server_model/__init__.py b/server/app/server_model/__init__.py index 5712f4a27..5736b5492 100644 --- a/server/app/server_model/__init__.py +++ b/server/app/server_model/__init__.py @@ -1,2 +1,2 @@ -from .endpoint import * from .descriptor import * +from .endpoint import * diff --git a/server/app/server_model/endpoint.py b/server/app/server_model/endpoint.py index 578e298c6..3be6dc061 100644 --- a/server/app/server_model/endpoint.py +++ b/server/app/server_model/endpoint.py @@ -2,7 +2,6 @@ import re from enum import Enum - from typing import Optional, List from basyx.aas.model import base @@ -106,5 +105,3 @@ def protocol_information(self, protocol_information: ProtocolInformation): raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 self._protocol_information = protocol_information - - From 4e1c64753fbc40bdc42206b2de19e15f493dc999 Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 17 Apr 2025 09:35:35 +0200 Subject: [PATCH 22/76] Small fixes --- server/app/adapter/jsonization.py | 2 +- server/app/adapter/xmlization.py | 6 +++--- server/app/main.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 6999302ea..38601f268 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -59,7 +59,7 @@ def _construct_asset_administration_shell_descriptor( cls._amend_abstract_attributes(ret, dct) if 'administration' in dct: ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) - if 'assetkind' in dct: + if 'assetKind' in dct: ret.asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] if 'assetType' in dct: ret.asset_type = _get_ts(dct, 'assetType', str) diff --git a/server/app/adapter/xmlization.py b/server/app/adapter/xmlization.py index e13a5ebed..76e9b5056 100644 --- a/server/app/adapter/xmlization.py +++ b/server/app/adapter/xmlization.py @@ -34,11 +34,11 @@ def construct_asset_administration_shell_descriptor(cls, element: etree._Element specific_asset_ids.append({"name": name.strip(), "value": value.strip()}) descriptor = object_class( - id=id_value, + id_=id_value, id_short=id_short, endpoints=endpoints, asset_kind=asset_kind, - specific_asset_ids=specific_asset_ids + specific_asset_id=specific_asset_ids ) cls._amend_abstract_attributes(descriptor, element) @@ -58,7 +58,7 @@ def construct_submodel_descriptor(cls, element: etree._Element, object_class=ser # Hier können weitere optionale Felder verarbeitet werden, z.B. semanticId, etc. submodel_descriptor = object_class( - id=submodel_id, + id_=submodel_id, id_short=id_short, endpoints=endpoints ) diff --git a/server/app/main.py b/server/app/main.py index fd24f0bfd..de9eea065 100644 --- a/server/app/main.py +++ b/server/app/main.py @@ -6,7 +6,7 @@ from basyx.aas.adapter import aasx from basyx.aas.backend.local_file import LocalFileObjectStore -from server.app.repository import WSGIApp +from server.app.interfaces.repository import WSGIApp storage_path = os.getenv("STORAGE_PATH", "/storage") storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") From 95b2d5a5f4019967704422e339a4b636dd557a92 Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 17 Apr 2025 09:36:26 +0200 Subject: [PATCH 23/76] Refactor --- server/app/api_utils/http_api_helpers.py | 13 +-- server/app/interfaces/registry.py | 4 +- server/app/interfaces/repository.py | 4 +- server/app/server_model/descriptor.py | 111 ++++++++++------------- 4 files changed, 58 insertions(+), 74 deletions(-) diff --git a/server/app/api_utils/http_api_helpers.py b/server/app/api_utils/http_api_helpers.py index a81f123da..276e49d3d 100644 --- a/server/app/api_utils/http_api_helpers.py +++ b/server/app/api_utils/http_api_helpers.py @@ -74,7 +74,7 @@ class HTTPApiDecoder: } @classmethod - def check_type_supportance(cls, type_: type): + def check_type_support(cls, type_: type): if type_ not in cls.type_constructables_map: raise TypeError(f"Parsing {type_} is not supported!") @@ -86,7 +86,7 @@ def assert_type(cls, obj: object, type_: Type[T]) -> T: @classmethod def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: - cls.check_type_supportance(expect_type) + cls.check_type_support(expect_type) decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ else ServerStrictAASFromJsonDecoder try: @@ -128,7 +128,7 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool return [cls.assert_type(obj, expect_type) for obj in parsed] @classmethod - def base64urljson_list(cls, data: str, expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: + def base64url_json_list(cls, data: str, expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: data = base64url_decode(data) return cls.json_list(data, expect_type, stripped, expect_single) @@ -137,13 +137,13 @@ def json(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool) -> return cls.json_list(data, expect_type, stripped, True)[0] @classmethod - def base64urljson(cls, data: str, expect_type: Type[T], stripped: bool) -> T: + def base64url_json(cls, data: str, expect_type: Type[T], stripped: bool) -> T: data = base64url_decode(data) return cls.json_list(data, expect_type, stripped, True)[0] @classmethod def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: - cls.check_type_supportance(expect_type) + cls.check_type_support(expect_type) try: xml_data = io.BytesIO(data) rv = read_server_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], @@ -180,11 +180,12 @@ def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> return cls.xml(request.get_data(), expect_type, stripped) @classmethod - def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: + def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> List[T]: """ Deserializes the request body to an instance (or list of instances) of the expected type. """ + # TODO: Refactor this method and request_body to avoid code duplication valid_content_types = ("application/json", "application/xml", "text/xml") if request.mimetype not in valid_content_types: diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 938b8e3a0..bd988e465 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -81,7 +81,7 @@ def _get_descriptors(self, request: "Request") -> Tuple[ if asset_ids: # Decode und Instanziierung der SpecificAssetIds specific_asset_ids: List[model.SpecificAssetId] = list( - map(lambda asset_id: HTTPApiDecoder.base64urljson(asset_id, model.SpecificAssetId, False), asset_ids) + map(lambda asset_id: HTTPApiDecoder.base64url_json(asset_id, model.SpecificAssetId, False), asset_ids) ) # Filtere anhand der übergebenen SpecificAssetIds descriptors = filter( @@ -103,7 +103,7 @@ def _get_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_m submodel_descriptors = filter(lambda sm: sm.id_short == id_short, submodel_descriptors) semantic_id = request.args.get("semanticId") if semantic_id is not None: - spec_semantic_id = HTTPApiDecoder.base64urljson( + spec_semantic_id = HTTPApiDecoder.base64url_json( semantic_id, model.Reference, False) # type: ignore[type-abstract] submodel_descriptors = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodel_descriptors) paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 6d63c2c01..49663bbdf 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -257,7 +257,7 @@ def _get_shells(self, request: Request) -> Tuple[Iterator[model.AssetAdministrat # Decode and instantiate SpecificAssetIds # This needs to be a list, otherwise we can only iterate it once. specific_asset_ids: List[model.SpecificAssetId] = list( - map(lambda asset_id: HTTPApiDecoder.base64urljson(asset_id, model.SpecificAssetId, False), asset_ids)) + map(lambda asset_id: HTTPApiDecoder.base64url_json(asset_id, model.SpecificAssetId, False), asset_ids)) # Filter AAS based on these SpecificAssetIds aas = filter(lambda shell: all(specific_asset_id in shell.asset_information.specific_asset_id for specific_asset_id in specific_asset_ids), aas) @@ -275,7 +275,7 @@ def _get_submodels(self, request: Request) -> Tuple[Iterator[model.Submodel], in submodels = filter(lambda sm: sm.id_short == id_short, submodels) semantic_id = request.args.get("semanticId") if semantic_id is not None: - spec_semantic_id = HTTPApiDecoder.base64urljson( + spec_semantic_id = HTTPApiDecoder.base64url_json( semantic_id, model.Reference, False) # type: ignore[type-abstract] submodels = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodels) paginated_submodels, end_index = self._get_slice(request, submodels) diff --git a/server/app/server_model/descriptor.py b/server/app/server_model/descriptor.py index 40d2d59d7..5bbc5996a 100644 --- a/server/app/server_model/descriptor.py +++ b/server/app/server_model/descriptor.py @@ -3,35 +3,18 @@ import abc from typing import Optional, Iterable, List -from basyx.aas.model import base, NamespaceSet +from basyx.aas import model from . import Endpoint -class Descriptor(metaclass=abc.ABCMeta): +class Descriptor(model.HasExtension, metaclass=abc.ABCMeta): @abc.abstractmethod - def __init__(self, description: Optional[base.MultiLanguageTextType] = None, - display_name: Optional[base.MultiLanguageNameType] = None, extension: Iterable[base.Extension] = ()): + def __init__(self, description: Optional[model.MultiLanguageTextType] = None, + display_name: Optional[model.MultiLanguageNameType] = None, extension: Iterable[model.Extension] = ()): super().__init__() - self.namespace_element_sets: List[NamespaceSet] = [] - self.description: Optional[base.MultiLanguageTextType] = description - self.display_name: Optional[base.MultiLanguageNameType] = display_name - self.extension = base.NamespaceSet(self, [("name", True)], extension) - - @property - def description(self) -> Optional[base.MultiLanguageTextType]: - return self._description - - @description.setter - def description(self, value: Optional[base.MultiLanguageTextType]): - self._description = value - - @property - def display_name(self) -> Optional[base.MultiLanguageNameType]: - return self._display_name - - @display_name.setter - def display_name(self, value: Optional[base.MultiLanguageNameType]): - self._display_name = value + self.description: Optional[model.MultiLanguageTextType] = description + self.display_name: Optional[model.MultiLanguageNameType] = display_name + self.extension = model.NamespaceSet(self, [("name", True)], extension) def commit(self): pass @@ -54,73 +37,73 @@ def update_from(self, other: "Descriptor", update_source: bool = False): class SubmodelDescriptor(Descriptor): - def __init__(self, id_: base.Identifier, endpoints: List[Endpoint], - administration: Optional[base.AdministrativeInformation] = None, - id_short: Optional[base.NameType] = None, semantic_id: Optional[base.Reference] = None, - supplemental_semantic_id: Iterable[base.Reference] = ()): + def __init__(self, id_: model.Identifier, endpoints: List[Endpoint], + administration: Optional[model.AdministrativeInformation] = None, + id_short: Optional[model.NameType] = None, semantic_id: Optional[model.Reference] = None, + supplemental_semantic_id: Iterable[model.Reference] = ()): super().__init__() - self.id: base.Identifier = id_ + self.id: model.Identifier = id_ self.endpoints: List[Endpoint] = endpoints - self.administration: Optional[base.AdministrativeInformation] = administration - self.id_short: Optional[base.NameType] = id_short - self.semantic_id: Optional[base.Reference] = semantic_id - self.supplemental_semantic_id: base.ConstrainedList[base.Reference] = \ - base.ConstrainedList(supplemental_semantic_id) + self.administration: Optional[model.AdministrativeInformation] = administration + self.id_short: Optional[model.NameType] = id_short + self.semantic_id: Optional[model.Reference] = semantic_id + self.supplemental_semantic_id: model.ConstrainedList[model.Reference] = \ + model.ConstrainedList(supplemental_semantic_id) class AssetAdministrationShellDescriptor(Descriptor): def __init__(self, - id_: base.Identifier, - administration: Optional[base.AdministrativeInformation] = None, - asset_kind: Optional[base.AssetKind] = None, - asset_type: Optional[base.Identifier] = None, + id_: model.Identifier, + administration: Optional[model.AdministrativeInformation] = None, + asset_kind: Optional[model.AssetKind] = None, + asset_type: Optional[model.Identifier] = None, endpoints: Optional[List[Endpoint]] = None, - global_asset_id: Optional[base.Identifier] = None, - id_short: Optional[base.NameType] = None, - specific_asset_id: Iterable[base.SpecificAssetId] = (), + global_asset_id: Optional[model.Identifier] = None, + id_short: Optional[model.NameType] = None, + specific_asset_id: Iterable[model.SpecificAssetId] = (), submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, - description: Optional[base.MultiLanguageTextType] = None, - display_name: Optional[base.MultiLanguageNameType] = None, - extension: Iterable[base.Extension] = ()): + description: Optional[model.MultiLanguageTextType] = None, + display_name: Optional[model.MultiLanguageNameType] = None, + extension: Iterable[model.Extension] = ()): """AssetAdministrationShellDescriptor - Nur das 'id'-Feld (id_) ist zwingend erforderlich. Alle anderen Felder erhalten Defaultwerte. """ super().__init__() - self.administration: Optional[base.AdministrativeInformation] = administration - self.asset_kind: Optional[base.AssetKind] = asset_kind - self.asset_type: Optional[base.Identifier] = asset_type + self.administration: Optional[model.AdministrativeInformation] = administration + self.asset_kind: Optional[model.AssetKind] = asset_kind + self.asset_type: Optional[model.Identifier] = asset_type self.endpoints: Optional[ List[Endpoint]] = endpoints if endpoints is not None else [] # leere Liste, falls nicht gesetzt - self.global_asset_id: Optional[base.Identifier] = global_asset_id - self.id_short: Optional[base.NameType] = id_short - self.id: base.Identifier = id_ - self._specific_asset_id: base.ConstrainedList[base.SpecificAssetId] = base.ConstrainedList( + self.global_asset_id: Optional[model.Identifier] = global_asset_id + self.id_short: Optional[model.NameType] = id_short + self.id: model.Identifier = id_ + self._specific_asset_id: model.ConstrainedList[model.SpecificAssetId] = model.ConstrainedList( specific_asset_id, item_set_hook=self._check_constraint_set_spec_asset_id, item_del_hook=self._check_constraint_del_spec_asset_id ) self.submodel_descriptors = submodel_descriptors if submodel_descriptors is not None else [] - self.description: Optional[base.MultiLanguageTextType] = description - self.display_name: Optional[base.MultiLanguageNameType] = display_name - self.extension = base.NamespaceSet(self, [("name", True)], extension) + self.description: Optional[model.MultiLanguageTextType] = description + self.display_name: Optional[model.MultiLanguageNameType] = display_name + self.extension = model.NamespaceSet(self, [("name", True)], extension) @property - def specific_asset_id(self) -> base.ConstrainedList[base.SpecificAssetId]: + def specific_asset_id(self) -> model.ConstrainedList[model.SpecificAssetId]: return self._specific_asset_id @specific_asset_id.setter - def specific_asset_id(self, specific_asset_id: Iterable[base.SpecificAssetId]) -> None: + def specific_asset_id(self, specific_asset_id: Iterable[model.SpecificAssetId]) -> None: # constraints are checked via _check_constraint_set_spec_asset_id() in this case self._specific_asset_id[:] = specific_asset_id - def _check_constraint_set_spec_asset_id(self, items_to_replace: List[base.SpecificAssetId], - new_items: List[base.SpecificAssetId], - old_list: List[base.SpecificAssetId]) -> None: - self._validate_aasd_131(self.global_asset_id, - len(old_list) - len(items_to_replace) + len(new_items) > 0) + def _check_constraint_set_spec_asset_id(self, items_to_replace: List[model.SpecificAssetId], + new_items: List[model.SpecificAssetId], + old_list: List[model.SpecificAssetId]) -> None: + model.AssetInformation._validate_aasd_131(self.global_asset_id, + len(old_list) - len(items_to_replace) + len(new_items) > 0) - def _check_constraint_del_spec_asset_id(self, _item_to_del: base.SpecificAssetId, - old_list: List[base.SpecificAssetId]) -> None: - self._validate_aasd_131(self.global_asset_id, len(old_list) > 1) + def _check_constraint_del_spec_asset_id(self, _item_to_del: model.SpecificAssetId, + old_list: List[model.SpecificAssetId]) -> None: + model.AssetInformation._validate_aasd_131(self.global_asset_id, len(old_list) > 1) From b65c420f27f4d791e0a640e8122bef1f2465f09b Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 17 Apr 2025 09:36:52 +0200 Subject: [PATCH 24/76] Refactor --- Discovery Server/README.md | 12 +-- server/app/interfaces/discovery.py | 138 +++++++++++++++++------------ 2 files changed, 85 insertions(+), 65 deletions(-) diff --git a/Discovery Server/README.md b/Discovery Server/README.md index fe66542ce..0b0938167 100644 --- a/Discovery Server/README.md +++ b/Discovery Server/README.md @@ -17,12 +17,12 @@ This implementation supports: ## Features -| Feature | Description | -|---------------------------------------------|-----------------------------------------------------------------------------| -| `add_asset_links` | Register specific asset identifiers linked to an AAS | -| `get_asset_links_by_aas` | Retrieve asset links associated with an AAS | -| `search_aas_by_asset_link` | Find AAS identifiers by providing asset link values | -| `remove_asset_links_for_aas` | Delete all asset links associated with a specific AAS | +| Feature | Description | +|---------------------------------------------|-------------------------------------------------------| +| `add_asset_links` | Register specific asset ids linked to an AAS | +| `get_all_specific_asset_ids_by_aas_id` | Retrieve specific asset ids associated with an AAS | +| `search_aas_by_asset_link` | Find AAS identifiers by providing asset link values | +| `remove_asset_links_for_aas` | Delete all asset links associated with a specific AAS | ## Specification Compliance diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index d96a224e5..da7b0bfb5 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -1,6 +1,6 @@ import abc import json -from typing import Dict, List, Set +from typing import Dict, List, Set, Any import werkzeug.exceptions from pymongo import MongoClient @@ -14,64 +14,85 @@ from .. import server_model from ..adapter.jsonization import ServerAASToJsonEncoder +class AbstractDiscoveryStore(metaclass=abc.ABCMeta): + aas_id_to_asset_ids: Any + asset_id_to_aas_ids: Any -def specific_asset_to_json_obj(asset_id: model.SpecificAssetId) -> dict: - # Encode the asset to a JSON string and then decode to a dict. - json_str = ServerAASToJsonEncoder().encode(asset_id) - return json.loads(json_str) + @abc.abstractmethod + def __init__(self): + pass + @abc.abstractmethod + def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: + pass + + @abc.abstractmethod + def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: + pass + + @abc.abstractmethod + def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: + pass + + @abc.abstractmethod + def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: + pass + + @abc.abstractmethod + def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + pass -class AbstractDiscoveryStore(metaclass=abc.ABCMeta): @abc.abstractmethod - def __init__(self): + def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: pass + class InMemoryDiscoveryStore(AbstractDiscoveryStore): def __init__(self): - self.aas_to_assets: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} - self.asset_to_aas: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} + self.aas_id_to_asset_ids: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} + self.asset_id_to_aas_ids: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} - def get_asset_links_by_aas(self, aas_identifier: model.Identifier) -> List[dict]: - key = aas_identifier - return list(self.aas_to_assets.get(key, set())) + def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: + return list(self.aas_id_to_asset_ids.get(aas_id, set())) - def add_asset_links(self, aas_identifier: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - key = aas_identifier - serialized_assets = [specific_asset_to_json_obj(aid) for aid in asset_ids] - if key in self.aas_to_assets: + def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, + asset_ids: List[model.SpecificAssetId]) -> None: + serialized_assets = [ServerAASToJsonEncoder.default(asset_id) for asset_id in asset_ids] + if aas_id in self.aas_id_to_asset_ids: for asset in serialized_assets: - if asset not in self.aas_to_assets[key]: - self.aas_to_assets[key].append(asset) + if asset not in self.aas_id_to_asset_ids[aas_id]: + self.aas_id_to_asset_ids[aas_id].append(asset) else: - self.aas_to_assets[key] = serialized_assets[:] + self.aas_id_to_asset_ids[aas_id] = serialized_assets[:] - def delete_asset_links_by_aas(self, aas_identifier: model.Identifier) -> None: - key = aas_identifier - if key in self.aas_to_assets: - del self.aas_to_assets[key] + def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: + key = aas_id + if key in self.aas_id_to_asset_ids: + del self.aas_id_to_asset_ids[key] - def search_aas_by_asset_link(self, asset_link: server_model.AssetLink) -> List[str]: + def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: result = [] - for asset_key, aas_ids in self.asset_to_aas.items(): + for asset_key, aas_ids in self.asset_id_to_aas_ids.items(): expected_key = f"{asset_link.name}:{asset_link.value}" if asset_key == expected_key: result.extend(list(aas_ids)) return result - def add_aas_for_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: asset_key = f"{asset_id.name}:{asset_id.value}" - aas_key = aas_identifier - if asset_key in self.asset_to_aas: - self.asset_to_aas[asset_key].add(aas_key) + aas_key = aas_id + # FIXME + if asset_key in self.asset_id_to_aas_ids: + self.asset_id_to_aas_ids[asset_key].add(aas_key) else: - self.asset_to_aas[asset_key] = {aas_key} + self.asset_id_to_aas_ids[asset_key] = {aas_key} - def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: asset_key = f"{asset_id.name}:{asset_id.value}" - aas_key = aas_identifier - if asset_key in self.asset_to_aas: - self.asset_to_aas[asset_key].discard(aas_key) + aas_key = aas_id + if asset_key in self.asset_id_to_aas_ids: + self.asset_id_to_aas_ids[asset_key].discard(aas_key) class MongoDiscoveryStore(AbstractDiscoveryStore): @@ -87,26 +108,26 @@ def __init__(self, # Create an index for fast asset reverse lookups. self.coll_asset_to_aas.create_index("_id") - def get_asset_links_by_aas(self, aas_identifier: model.Identifier) -> List[dict]: - key = aas_identifier + def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: + key = aas_id doc = self.coll_aas_to_assets.find_one({"_id": key}) return doc["asset_ids"] if doc and "asset_ids" in doc else [] - def add_asset_links(self, aas_identifier: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - key = aas_identifier + def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: + key = aas_id # Convert each SpecificAssetId using the serialization helper. - serializable_assets = [specific_asset_to_json_obj(aid) for aid in asset_ids] + serializable_assets = [ServerAASToJsonEncoder.default(asset_id) for asset_id in asset_ids] self.coll_aas_to_assets.update_one( {"_id": key}, {"$addToSet": {"asset_ids": {"$each": serializable_assets}}}, upsert=True ) - def delete_asset_links_by_aas(self, aas_identifier: model.Identifier) -> None: - key = aas_identifier + def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: + key = aas_id self.coll_aas_to_assets.delete_one({"_id": key}) - def search_aas_by_asset_link(self, asset_link: server_model.AssetLink) -> List[str]: + def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: # Query MongoDB for specificAssetIds where 'name' and 'value' match doc = self.coll_asset_to_aas.find_one({ "name": asset_link.name, @@ -114,18 +135,17 @@ def search_aas_by_asset_link(self, asset_link: server_model.AssetLink) -> List[s }) return doc["aas_ids"] if doc and "aas_ids" in doc else [] - def add_aas_for_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: - asset_key = str(specific_asset_to_json_obj(asset_id)) - aas_key = aas_identifier + def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + asset_key = str(ServerAASToJsonEncoder.default(asset_id)) self.coll_asset_to_aas.update_one( {"_id": asset_key}, - {"$addToSet": {"aas_ids": aas_key}}, + {"$addToSet": {"aas_ids": aas_id}}, upsert=True ) - def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: - asset_key = str(specific_asset_to_json_obj(asset_id)) - aas_key = aas_identifier + def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + asset_key = str(ServerAASToJsonEncoder.default(asset_id)) + aas_key = aas_id self.coll_asset_to_aas.update_one( {"_id": asset_key}, {"$pull": {"aas_ids": aas_key}} @@ -142,7 +162,7 @@ def __init__(self, endpoint=self.search_all_aas_ids_by_asset_link), Submount("/lookup/shells", [ Rule("/", methods=["GET"], - endpoint=self.get_all_asset_links_by_id), + endpoint=self.get_all_specific_asset_ids_by_aas_id), Rule("/", methods=["POST"], endpoint=self.post_all_asset_links_by_id), Rule("/", methods=["DELETE"], @@ -158,31 +178,31 @@ def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, res asset_links = HTTPApiDecoder.request_body_list(request, server_model.AssetLink, False) matching_aas_keys = set() for asset_link in asset_links: - aas_keys = self.persistent_store.search_aas_by_asset_link(asset_link) + aas_keys = self.persistent_store.search_aas_ids_by_asset_link(asset_link) matching_aas_keys.update(aas_keys) matching_aas_keys = list(matching_aas_keys) paginated_slice, cursor = self._get_slice(request, matching_aas_keys) return response_t(list(paginated_slice), cursor=cursor) - def get_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + def get_all_specific_asset_ids_by_aas_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: aas_identifier = url_args.get("aas_id") - asset_ids = self.persistent_store.get_asset_links_by_aas(aas_identifier) + asset_ids = self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier) return response_t(asset_ids) def post_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: aas_identifier = url_args.get("aas_id") specific_asset_ids = HTTPApiDecoder.request_body_list(request, model.SpecificAssetId, False) - self.persistent_store.add_asset_links(aas_identifier, specific_asset_ids) + self.persistent_store.add_specific_asset_ids_to_aas(aas_identifier, specific_asset_ids) for asset_id in specific_asset_ids: - self.persistent_store.add_aas_for_asset_link(asset_id, aas_identifier) - updated = {aas_identifier: self.persistent_store.get_asset_links_by_aas(aas_identifier)} + self.persistent_store._add_aas_id_to_specific_asset_id(asset_id, aas_identifier) + updated = {aas_identifier: self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier)} return response_t(updated) def delete_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: aas_identifier = url_args.get("aas_id") - self.persistent_store.delete_asset_links_by_aas(aas_identifier) - for key in list(self.persistent_store.asset_to_aas.keys()): - self.persistent_store.asset_to_aas[key].discard(aas_identifier) + self.persistent_store.delete_specific_asset_ids_by_aas_id(aas_identifier) + for key in list(self.persistent_store.asset_id_to_aas_ids.keys()): + self.persistent_store.asset_id_to_aas_ids[key].discard(aas_identifier) return response_t() From b0f79d698eb66ff3c1b2ba14dc985c9cef329eac Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 17 Apr 2025 12:36:31 +0200 Subject: [PATCH 25/76] Refactor some methods in registry.py and fix some typos --- server/app/interfaces/discovery.py | 4 ++ server/app/interfaces/registry.py | 70 ++++++++++++--------------- server/app/server_model/descriptor.py | 2 +- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index da7b0bfb5..639925175 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -1,3 +1,7 @@ +""" +This module implements the Discovery interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. +""" + import abc import json from typing import Dict, List, Set, Any diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index bd988e465..24fd19cca 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -1,11 +1,5 @@ -# Copyright (c) 2024 the Eclipse BaSyx Authors -# -# This program and the accompanying materials are made available under the terms of the MIT License, available in -# the LICENSE file of this project. -# -# SPDX-License-Identifier: MIT """ -This module implements the "Specification of the Asset Administration Shell Part 2 Application Programming Interfaces". +This module implements the Registry interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. """ from typing import Dict, Iterator, List, Type, Tuple @@ -30,12 +24,12 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a self.object_store: model.AbstractObjectStore = object_store self.url_map = werkzeug.routing.Map([ Submount(base_path, [ - Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_aas_descriptors_all), + Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_all_aas_descriptors), Rule("/shell-descriptors", methods=["POST"], endpoint=self.post_aas_descriptor), Submount("/shell-descriptors", [ - Rule("/", methods=["GET"], endpoint=self.get_aas_descriptor), - Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor), - Rule("/", methods=["DELETE"], endpoint=self.delete_aas_descriptor), + Rule("/", methods=["GET"], endpoint=self.get_aas_descriptor_by_id), + Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor_by_id), + Rule("/", methods=["DELETE"], endpoint=self.delete_aas_descriptor_by_id), Submount("/", [ Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors_through_superpath), @@ -64,11 +58,9 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a "base64url": Base64URLConverter }, strict_slashes=False) - def _get_descriptors(self, request: "Request") -> Tuple[ + def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ Iterator[server_model.AssetAdministrationShellDescriptor], int]: - """ - Returns all Asset Administration Shell Descriptors - """ + descriptors: Iterator[server_model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( server_model.AssetAdministrationShellDescriptor ) @@ -78,14 +70,14 @@ def _get_descriptors(self, request: "Request") -> Tuple[ descriptors = filter(lambda desc: desc.id_short == id_short, descriptors) asset_ids = request.args.getlist("assetIds") - if asset_ids: - # Decode und Instanziierung der SpecificAssetIds + if asset_ids is not None: + # Decode and instantiate SpecificAssetIds specific_asset_ids: List[model.SpecificAssetId] = list( map(lambda asset_id: HTTPApiDecoder.base64url_json(asset_id, model.SpecificAssetId, False), asset_ids) ) - # Filtere anhand der übergebenen SpecificAssetIds + # Filter AAS based on these SpecificAssetIds descriptors = filter( - lambda desc: all(specific_asset_id in desc.asset_information.specific_asset_id + lambda desc: all(specific_asset_id in desc.specific_asset_id for specific_asset_id in specific_asset_ids), descriptors ) @@ -93,10 +85,10 @@ def _get_descriptors(self, request: "Request") -> Tuple[ paginated_descriptors, end_index = self._get_slice(request, descriptors) return paginated_descriptors, end_index - def _get_descriptor(self, url_args: Dict) -> server_model.AssetAdministrationShellDescriptor: + def _get_aas_descriptor(self, url_args: Dict) -> server_model.AssetAdministrationShellDescriptor: return self._get_obj_ts(url_args["aas_id"], server_model.AssetAdministrationShellDescriptor) - def _get_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: + def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: submodel_descriptors: Iterator[model.Submodel] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) id_short = request.args.get("idShort") if id_short is not None: @@ -113,9 +105,9 @@ def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescr return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) # ------ AAS REGISTRY ROUTES ------- - def get_aas_descriptors_all(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: - aas_descriptors, cursor = self._get_descriptors(request) + aas_descriptors, cursor = self._get_all_aas_descriptors(request) return response_t(list(aas_descriptors), cursor=cursor) def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], @@ -126,27 +118,27 @@ def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type except KeyError as e: raise Conflict(f"AssetAdministrationShellDescriptor with Identifier {descriptor.id} already exists!") from e descriptor.commit() - created_resource_url = map_adapter.build(self.get_aas_descriptor, { + created_resource_url = map_adapter.build(self.get_aas_descriptor_by_id, { "aas_id": descriptor.id }, force_external=True) return response_t(descriptor, status=201, headers={"Location": created_resource_url}) - def get_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - descriptor = self._get_descriptor(url_args) + def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + descriptor = self._get_aas_descriptor(url_args) return response_t(descriptor) - def put_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - descriptor = self._get_descriptor(url_args) + def put_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + descriptor = self._get_aas_descriptor(url_args) descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, is_stripped_request(request))) descriptor.commit() return response_t() - def delete_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - descriptor = self._get_descriptor(url_args) + def delete_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + descriptor = self._get_aas_descriptor(url_args) self.object_store.remove(descriptor) return response_t() @@ -156,7 +148,7 @@ def get_all_submodel_descriptors_through_superpath(self, response_t: Type[ APIResponse], **_kwargs) -> Response: - aas_descriptor = self._get_descriptor(url_args) + aas_descriptor = self._get_aas_descriptor(url_args) submodel_descriptors, cursor = self._get_slice(request, aas_descriptor.submodel_descriptors) return response_t(list(submodel_descriptors), cursor=cursor) @@ -168,7 +160,7 @@ def get_submodel_descriptor_by_id_through_superpath(self, Type[ APIResponse], **_kwargs) -> Response: - aas_descriptor = self._get_descriptor(url_args) + aas_descriptor = self._get_aas_descriptor(url_args) submodel_id = url_args["submodel_id"] submodel_descriptor = next( (sd for sd in aas_descriptor.submodel_descriptors if @@ -184,7 +176,7 @@ def post_submodel_descriptor_through_superpath(self, response_t: Type[ APIResponse], map_adapter: MapAdapter) -> Response: - aas_descriptor = self._get_descriptor(url_args) + aas_descriptor = self._get_aas_descriptor(url_args) submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request( @@ -210,7 +202,7 @@ def put_submodel_descriptor_by_id_through_superpath(self, Type[ APIResponse], **_kwargs) -> Response: - aas_descriptor = self._get_descriptor(url_args) + aas_descriptor = self._get_aas_descriptor(url_args) submodel_id = url_args["submodel_id"] submodel_descriptor = next( (sd for sd in aas_descriptor.submodel_descriptors if @@ -232,7 +224,7 @@ def delete_submodel_descriptor_by_id_through_superpath(self, Type[ APIResponse], **_kwargs) -> Response: - aas_descriptor = self._get_descriptor(url_args) + aas_descriptor = self._get_aas_descriptor(url_args) submodel_id = url_args["submodel_id"] submodel_descriptor = next( (sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) @@ -245,7 +237,7 @@ def delete_submodel_descriptor_by_id_through_superpath(self, # ------ Submodel REGISTRY ROUTES ------- def get_all_submodel_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: - submodel_descriptors, cursor = self._get_submodel_descriptors(request) + submodel_descriptors, cursor = self._get_all_submodel_descriptors(request) return response_t(list(submodel_descriptors), cursor=cursor, stripped=is_stripped_request(request)) def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], diff --git a/server/app/server_model/descriptor.py b/server/app/server_model/descriptor.py index 5bbc5996a..6b57bf63f 100644 --- a/server/app/server_model/descriptor.py +++ b/server/app/server_model/descriptor.py @@ -4,7 +4,7 @@ from typing import Optional, Iterable, List from basyx.aas import model -from . import Endpoint +from server.app.server_model.endpoint import Endpoint class Descriptor(model.HasExtension, metaclass=abc.ABCMeta): From 7c8fbe2582e7d5a1177557882bae8685b26ddc55 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 17 Apr 2025 14:26:38 +0200 Subject: [PATCH 26/76] remove xmlization for Registry and Discovery classes --- server/app/adapter/xmlization.py | 162 ------------------------------- 1 file changed, 162 deletions(-) delete mode 100644 server/app/adapter/xmlization.py diff --git a/server/app/adapter/xmlization.py b/server/app/adapter/xmlization.py deleted file mode 100644 index 76e9b5056..000000000 --- a/server/app/adapter/xmlization.py +++ /dev/null @@ -1,162 +0,0 @@ -import enum -from typing import Optional, Type, Callable, Any, List, Dict -from lxml import etree - -from basyx.aas.adapter._generic import PathOrIO -from basyx.aas.adapter.xml import XMLConstructables, AASFromXmlDecoder -from basyx.aas.adapter.xml.xml_deserialization import _parse_xml_document, _failsafe_construct, \ - _child_text_mandatory, NS_AAS, read_aas_xml_element -import server.app.server_model as server_model - - -class ServerAASFromXmlDecoder(AASFromXmlDecoder): - - @classmethod - def construct_asset_administration_shell_descriptor(cls, element: etree._Element, - object_class=server_model.AssetAdministrationShellDescriptor, - **_kwargs: Any) -> server_model.AssetAdministrationShellDescriptor: - id_value = _child_text_mandatory(element, NS_AAS + "id") - id_short = _child_text_mandatory(element, NS_AAS + "idShort") - endpoints_elem = element.find(NS_AAS + "endpoints") - endpoints: List[str] = [] - if endpoints_elem is not None: - endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] - - asset_kind = _child_text_mandatory(element, NS_AAS + "assetKind") - - specific_asset_ids_elem = element.find(NS_AAS + "specificAssetIds") - specific_asset_ids: List[Dict[str, Any]] = [] - if specific_asset_ids_elem is not None: - for sid_elem in specific_asset_ids_elem.findall(NS_AAS + "specificAssetId"): - name = sid_elem.findtext(NS_AAS + "name") - value = sid_elem.findtext(NS_AAS + "value") - if name is not None and value is not None: - specific_asset_ids.append({"name": name.strip(), "value": value.strip()}) - - descriptor = object_class( - id_=id_value, - id_short=id_short, - endpoints=endpoints, - asset_kind=asset_kind, - specific_asset_id=specific_asset_ids - ) - - cls._amend_abstract_attributes(descriptor, element) - return descriptor - - @classmethod - def construct_submodel_descriptor(cls, element: etree._Element, object_class=server_model.SubmodelDescriptor, - **_kwargs: Any) -> server_model.SubmodelDescriptor: - submodel_id = _child_text_mandatory(element, NS_AAS + "id") - id_short = _child_text_mandatory(element, NS_AAS + "idShort") - - endpoints_elem = element.find(NS_AAS + "endpoints") - endpoints: List[str] = [] - if endpoints_elem is not None: - endpoints = [child.text.strip() for child in endpoints_elem.findall(NS_AAS + "endpoint") if child.text] - - # Hier können weitere optionale Felder verarbeitet werden, z.B. semanticId, etc. - - submodel_descriptor = object_class( - id_=submodel_id, - id_short=id_short, - endpoints=endpoints - ) - - cls._amend_abstract_attributes(submodel_descriptor, element) - return submodel_descriptor - - -class ServerStrictAASFromXmlDecoder(ServerAASFromXmlDecoder): - """ - Non-failsafe XML decoder. Encountered errors won't be caught and abort parsing. - """ - failsafe = False - - -class ServerStrippedAASFromXmlDecoder(ServerAASFromXmlDecoder): - """ - Decoder for stripped XML elements. Used in the HTTP adapter. - """ - stripped = True - - -class ServerStrictStrippedAASFromXmlDecoder(ServerStrictAASFromXmlDecoder, ServerStrippedAASFromXmlDecoder): - """ - Non-failsafe decoder for stripped XML elements. - """ - pass - - -@enum.unique -class ServerXMLConstructables(enum.Enum): - ASSET_ADMINISTRATION_SHELL_DESCRIPTOR = enum.auto() - SUBMODEL_DESCRIPTOR = enum.auto() - ASSET_LINK = enum.auto() - - -def _select_server_decoder(failsafe: bool, stripped: bool, decoder: Optional[Type[ServerAASFromXmlDecoder]]) \ - -> Type[ServerAASFromXmlDecoder]: - """ - Returns the correct decoder based on the parameters failsafe and stripped. If a decoder class is given, failsafe - and stripped are ignored. - - :param failsafe: If true, a failsafe decoder is selected. Ignored if a decoder class is specified. - :param stripped: If true, a decoder for parsing stripped XML elements is selected. Ignored if a decoder class is - specified. - :param decoder: Is returned, if specified. - :return: A AASFromXmlDecoder (sub)class. - """ - if decoder is not None: - return decoder - if failsafe: - if stripped: - return ServerStrippedAASFromXmlDecoder - return ServerAASFromXmlDecoder - else: - if stripped: - return ServerStrictStrippedAASFromXmlDecoder - return ServerStrictAASFromXmlDecoder - - -def read_server_aas_xml_element(file: PathOrIO, construct: XMLConstructables, failsafe: bool = True, - stripped: bool = False, - decoder: Optional[Type[AASFromXmlDecoder]] = None, **constructor_kwargs) -> Optional[ - object]: - """ - Construct a single object from an XML string. The namespaces have to be declared on the object itself, since there - is no surrounding environment element. - - :param file: A filename or file-like object to read the XML-serialized data from - :param construct: A member of the enum :class:`~.XMLConstructables`, specifying which type to construct. - :param failsafe: If true, the document is parsed in a failsafe way: missing attributes and elements are logged - instead of causing exceptions. Defect objects are skipped. - This parameter is ignored if a decoder class is specified. - :param stripped: If true, stripped XML elements are parsed. - See https://git.rwth-aachen.de/acplt/pyi40aas/-/issues/91 - This parameter is ignored if a decoder class is specified. - :param decoder: The decoder class used to decode the XML elements - :param constructor_kwargs: Keyword arguments passed to the constructor function - :raises ~lxml.etree.XMLSyntaxError: **Non-failsafe**: If the given file(-handle) has invalid XML - :raises KeyError: **Non-failsafe**: If a required namespace has not been declared on the XML document - :raises (~basyx.aas.model.base.AASConstraintViolation, KeyError, ValueError): **Non-failsafe**: Errors during - construction of the objects - :return: The constructed object or None, if an error occurred in failsafe mode. - """ - - try: - return read_aas_xml_element(file, construct, failsafe=failsafe, stripped=stripped, decoder=decoder, - **constructor_kwargs) - except ValueError: - decoder_ = _select_server_decoder(failsafe, stripped, decoder) - constructor: Callable[..., object] - - if construct == ServerXMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR: - constructor = decoder_.construct_asset_administration_shell_descriptor - elif construct == ServerXMLConstructables.SUBMODEL_DESCRIPTOR: - constructor = decoder_.construct_submodel_descriptor - else: - raise ValueError(f"{construct.name} cannot be constructed!") - - element = _parse_xml_document(file, failsafe=decoder_.failsafe) - return _failsafe_construct(element, constructor, decoder_.failsafe, **constructor_kwargs) From eb44e8a01c8dcd0e1aa6f6cd9125d40f5ab24d15 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 17 Apr 2025 14:31:24 +0200 Subject: [PATCH 27/76] change according to xmlization removal for registry and discovery classes --- server/app/api_utils/http_api_helpers.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/app/api_utils/http_api_helpers.py b/server/app/api_utils/http_api_helpers.py index 276e49d3d..8c65f9c17 100644 --- a/server/app/api_utils/http_api_helpers.py +++ b/server/app/api_utils/http_api_helpers.py @@ -19,10 +19,9 @@ from basyx.aas import model -from basyx.aas.adapter.xml import XMLConstructables +from basyx.aas.adapter.xml import XMLConstructables, read_aas_xml_element from server.app import server_model -from server.app.adapter.xmlization import ServerXMLConstructables, read_server_aas_xml_element from server.app.adapter.jsonization import ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder from typing import Callable, List, Optional, Type, TypeVar, Union @@ -67,15 +66,16 @@ class HTTPApiDecoder: model.Submodel: XMLConstructables.SUBMODEL, model.SubmodelElement: XMLConstructables.SUBMODEL_ELEMENT, model.Reference: XMLConstructables.REFERENCE, - - server_model.AssetAdministrationShellDescriptor: ServerXMLConstructables.ASSET_ADMINISTRATION_SHELL_DESCRIPTOR, - server_model.SubmodelDescriptor: ServerXMLConstructables.SUBMODEL_DESCRIPTOR, - server_model.AssetLink: ServerXMLConstructables.ASSET_LINK, } @classmethod def check_type_support(cls, type_: type): - if type_ not in cls.type_constructables_map: + tolerated_types = ( + server_model.AssetAdministrationShellDescriptor, + server_model.SubmodelDescriptor, + server_model.AssetLink, + ) + if type_ not in cls.type_constructables_map and type_ not in tolerated_types: raise TypeError(f"Parsing {type_} is not supported!") @classmethod @@ -146,7 +146,7 @@ def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: cls.check_type_support(expect_type) try: xml_data = io.BytesIO(data) - rv = read_server_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], + rv = read_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], stripped=stripped, failsafe=False) except (KeyError, ValueError) as e: # xml deserialization creates an error chain. since we only return one error, return the root cause From d608409c7cd70e4e63b29293d0d379b1ae387b42 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 22 Apr 2025 14:58:44 +0200 Subject: [PATCH 28/76] fix error with ServerAASToJSONEncoder --- server/app/interfaces/discovery.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 639925175..9731bc333 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -18,6 +18,8 @@ from .. import server_model from ..adapter.jsonization import ServerAASToJsonEncoder +encoder=ServerAASToJsonEncoder() + class AbstractDiscoveryStore(metaclass=abc.ABCMeta): aas_id_to_asset_ids: Any asset_id_to_aas_ids: Any @@ -47,7 +49,7 @@ def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_ pass @abc.abstractmethod - def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: pass @@ -62,7 +64,7 @@ def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - serialized_assets = [ServerAASToJsonEncoder.default(asset_id) for asset_id in asset_ids] + serialized_assets = [encoder.default(asset_id) for asset_id in asset_ids] if aas_id in self.aas_id_to_asset_ids: for asset in serialized_assets: if asset not in self.aas_id_to_asset_ids[aas_id]: @@ -85,18 +87,15 @@ def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> Li def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: asset_key = f"{asset_id.name}:{asset_id.value}" - aas_key = aas_id - # FIXME if asset_key in self.asset_id_to_aas_ids: - self.asset_id_to_aas_ids[asset_key].add(aas_key) + self.asset_id_to_aas_ids[asset_key].add(aas_id) else: - self.asset_id_to_aas_ids[asset_key] = {aas_key} + self.asset_id_to_aas_ids[asset_key] = {aas_id} - def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: asset_key = f"{asset_id.name}:{asset_id.value}" - aas_key = aas_id if asset_key in self.asset_id_to_aas_ids: - self.asset_id_to_aas_ids[asset_key].discard(aas_key) + self.asset_id_to_aas_ids[asset_key].discard(aas_id) class MongoDiscoveryStore(AbstractDiscoveryStore): @@ -120,7 +119,7 @@ def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: key = aas_id # Convert each SpecificAssetId using the serialization helper. - serializable_assets = [ServerAASToJsonEncoder.default(asset_id) for asset_id in asset_ids] + serializable_assets = [encoder.default(asset_id) for asset_id in asset_ids] self.coll_aas_to_assets.update_one( {"_id": key}, {"$addToSet": {"asset_ids": {"$each": serializable_assets}}}, @@ -140,19 +139,18 @@ def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> Li return doc["aas_ids"] if doc and "aas_ids" in doc else [] def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = str(ServerAASToJsonEncoder.default(asset_id)) + asset_key = str(encoder.default(asset_id)) self.coll_asset_to_aas.update_one( {"_id": asset_key}, {"$addToSet": {"aas_ids": aas_id}}, upsert=True ) - def remove_aas_from_asset_link(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = str(ServerAASToJsonEncoder.default(asset_id)) - aas_key = aas_id + def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + asset_key = str(encoder.default(asset_id)) self.coll_asset_to_aas.update_one( {"_id": asset_key}, - {"$pull": {"aas_ids": aas_key}} + {"$pull": {"aas_ids": aas_id}} ) From dde249976c81d96ed10bf734ab7e43d4f3759bd1 Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 24 Apr 2025 01:09:16 +0200 Subject: [PATCH 29/76] Refactor `response.py` Move all classes from `response.py` to `base.py`. --- server/app/api_utils/response.py | 202 --------------------------- server/app/interfaces/base.py | 205 +++++++++++++++++++++++++++- server/app/interfaces/registry.py | 3 +- server/app/interfaces/repository.py | 3 +- 4 files changed, 203 insertions(+), 210 deletions(-) delete mode 100644 server/app/api_utils/response.py diff --git a/server/app/api_utils/response.py b/server/app/api_utils/response.py deleted file mode 100644 index 73c16887d..000000000 --- a/server/app/api_utils/response.py +++ /dev/null @@ -1,202 +0,0 @@ -import abc -import datetime -import enum -import json -from typing import Union, List, Optional, Type, Dict - -import werkzeug.exceptions -from lxml import etree -from werkzeug import Response, Request - -from basyx.aas.adapter._generic import XML_NS_MAP -from basyx.aas.adapter.xml import xml_serialization -from server.app.adapter.jsonization import ServerAASToJsonEncoder - - -@enum.unique -class MessageType(enum.Enum): - UNDEFINED = enum.auto() - INFO = enum.auto() - WARNING = enum.auto() - ERROR = enum.auto() - EXCEPTION = enum.auto() - - def __str__(self): - return self.name.capitalize() - - -class Message: - def __init__(self, code: str, text: str, message_type: MessageType = MessageType.UNDEFINED, - timestamp: Optional[datetime.datetime] = None): - self.code: str = code - self.text: str = text - self.message_type: MessageType = message_type - self.timestamp: datetime.datetime = timestamp if timestamp is not None \ - else datetime.datetime.now(datetime.timezone.utc) - - -class Result: - def __init__(self, success: bool, messages: Optional[List[Message]] = None): - if messages is None: - messages = [] - self.success: bool = success - self.messages: List[Message] = messages - - -ResponseData = Union[Result, object, List[object]] - - -class APIResponse(abc.ABC, Response): - @abc.abstractmethod - def __init__(self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, - stripped: bool = False, *args, **kwargs): - super().__init__(*args, **kwargs) - if obj is None: - self.status_code = 204 - else: - self.data = self.serialize(obj, cursor, stripped) - - @abc.abstractmethod - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - pass - - -class JsonResponse(APIResponse): - def __init__(self, *args, content_type="application/json", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - if cursor is None: - data = obj - else: - data = { - "paging_metadata": {"cursor": str(cursor)}, - "result": obj - } - return json.dumps( - data, - cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, - separators=(",", ":") - ) - - -class XmlResponse(APIResponse): - def __init__(self, *args, content_type="application/xml", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: - root_elem = etree.Element("response", nsmap=XML_NS_MAP) - if cursor is not None: - root_elem.set("cursor", str(cursor)) - if isinstance(obj, Result): - result_elem = self.result_to_xml(obj, **XML_NS_MAP) - for child in result_elem: - root_elem.append(child) - elif isinstance(obj, list): - for item in obj: - item_elem = xml_serialization.object_to_xml_element(item) - root_elem.append(item_elem) - else: - obj_elem = xml_serialization.object_to_xml_element(obj) - for child in obj_elem: - root_elem.append(child) - etree.cleanup_namespaces(root_elem) - xml_str = etree.tostring(root_elem, xml_declaration=True, encoding="utf-8") - return xml_str # type: ignore[return-value] - - @classmethod - def result_to_xml(cls, result: Result, **kwargs) -> etree._Element: - result_elem = etree.Element("result", **kwargs) - success_elem = etree.Element("success") - success_elem.text = xml_serialization.boolean_to_xml(result.success) - messages_elem = etree.Element("messages") - for message in result.messages: - messages_elem.append(cls.message_to_xml(message)) - - result_elem.append(success_elem) - result_elem.append(messages_elem) - return result_elem - - @classmethod - def message_to_xml(cls, message: Message) -> etree._Element: - message_elem = etree.Element("message") - message_type_elem = etree.Element("messageType") - message_type_elem.text = str(message.message_type) - text_elem = etree.Element("text") - text_elem.text = message.text - code_elem = etree.Element("code") - code_elem.text = message.code - timestamp_elem = etree.Element("timestamp") - timestamp_elem.text = message.timestamp.isoformat() - - message_elem.append(message_type_elem) - message_elem.append(text_elem) - message_elem.append(code_elem) - message_elem.append(timestamp_elem) - return message_elem - - -class XmlResponseAlt(XmlResponse): - def __init__(self, *args, content_type="text/xml", **kwargs): - super().__init__(*args, **kwargs, content_type=content_type) - - -class ResultToJsonEncoder(ServerAASToJsonEncoder): - @classmethod - def _result_to_json(cls, result: Result) -> Dict[str, object]: - return { - "success": result.success, - "messages": result.messages - } - - @classmethod - def _message_to_json(cls, message: Message) -> Dict[str, object]: - return { - "messageType": message.message_type, - "text": message.text, - "code": message.code, - "timestamp": message.timestamp.isoformat() - } - - def default(self, obj: object) -> object: - if isinstance(obj, Result): - return self._result_to_json(obj) - if isinstance(obj, Message): - return self._message_to_json(obj) - if isinstance(obj, MessageType): - return str(obj) - return super().default(obj) - - -class StrippedResultToJsonEncoder(ResultToJsonEncoder): - stripped = True - - -def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ - -> APIResponse: - headers = exception.get_headers() - location = exception.get_response().location - if location is not None: - headers.append(("Location", location)) - if exception.code and exception.code >= 400: - message = Message(type(exception).__name__, exception.description if exception.description is not None else "", - MessageType.ERROR) - result = Result(False, [message]) - else: - result = Result(False) - return response_type(result, status=exception.code, headers=headers) - - -def get_response_type(request: Request) -> Type[APIResponse]: - response_types: Dict[str, Type[APIResponse]] = { - "application/json": JsonResponse, - "application/xml": XmlResponse, - "text/xml": XmlResponseAlt - } - if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): - return JsonResponse - mime_type = request.accept_mimetypes.best_match(response_types) - if mime_type is None: - raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " - + ", ".join(response_types.keys())) - return response_types[mime_type] diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 88f244664..36b77c6d6 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -1,17 +1,183 @@ +import abc +import datetime +import enum import itertools -from typing import Iterable, Type, Iterator, Tuple +import json +from typing import Iterable, Type, Iterator, Tuple, Optional, List, Union, Dict import werkzeug.exceptions import werkzeug.routing import werkzeug.utils +from lxml import etree from werkzeug import Response, Request from werkzeug.exceptions import NotFound, BadRequest from werkzeug.routing import MapAdapter from basyx.aas import model +from basyx.aas.adapter._generic import XML_NS_MAP +from basyx.aas.adapter.xml import xml_serialization from basyx.aas.model import AbstractObjectStore +from server.app.adapter.jsonization import ServerAASToJsonEncoder from server.app.api_utils.http_api_helpers import T -from server.app.api_utils.response import get_response_type, http_exception_to_response + + +@enum.unique +class MessageType(enum.Enum): + UNDEFINED = enum.auto() + INFO = enum.auto() + WARNING = enum.auto() + ERROR = enum.auto() + EXCEPTION = enum.auto() + + def __str__(self): + return self.name.capitalize() + + +class Message: + def __init__(self, code: str, text: str, message_type: MessageType = MessageType.UNDEFINED, + timestamp: Optional[datetime.datetime] = None): + self.code: str = code + self.text: str = text + self.message_type: MessageType = message_type + self.timestamp: datetime.datetime = timestamp if timestamp is not None \ + else datetime.datetime.now(datetime.timezone.utc) + + +class Result: + def __init__(self, success: bool, messages: Optional[List[Message]] = None): + if messages is None: + messages = [] + self.success: bool = success + self.messages: List[Message] = messages + + +ResponseData = Union[Result, object, List[object]] + + +class APIResponse(abc.ABC, Response): + @abc.abstractmethod + def __init__(self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, + stripped: bool = False, *args, **kwargs): + super().__init__(*args, **kwargs) + if obj is None: + self.status_code = 204 + else: + self.data = self.serialize(obj, cursor, stripped) + + @abc.abstractmethod + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + pass + + +class JsonResponse(APIResponse): + def __init__(self, *args, content_type="application/json", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + if cursor is None: + data = obj + else: + data = { + "paging_metadata": {"cursor": str(cursor)}, + "result": obj + } + return json.dumps( + data, + cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, + separators=(",", ":") + ) + + +class XmlResponse(APIResponse): + def __init__(self, *args, content_type="application/xml", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> str: + root_elem = etree.Element("response", nsmap=XML_NS_MAP) + if cursor is not None: + root_elem.set("cursor", str(cursor)) + if isinstance(obj, Result): + result_elem = self.result_to_xml(obj, **XML_NS_MAP) + for child in result_elem: + root_elem.append(child) + elif isinstance(obj, list): + for item in obj: + item_elem = xml_serialization.object_to_xml_element(item) + root_elem.append(item_elem) + else: + obj_elem = xml_serialization.object_to_xml_element(obj) + for child in obj_elem: + root_elem.append(child) + etree.cleanup_namespaces(root_elem) + xml_str = etree.tostring(root_elem, xml_declaration=True, encoding="utf-8") + return xml_str # type: ignore[return-value] + + @classmethod + def result_to_xml(cls, result: Result, **kwargs) -> etree._Element: + result_elem = etree.Element("result", **kwargs) + success_elem = etree.Element("success") + success_elem.text = xml_serialization.boolean_to_xml(result.success) + messages_elem = etree.Element("messages") + for message in result.messages: + messages_elem.append(cls.message_to_xml(message)) + + result_elem.append(success_elem) + result_elem.append(messages_elem) + return result_elem + + @classmethod + def message_to_xml(cls, message: Message) -> etree._Element: + message_elem = etree.Element("message") + message_type_elem = etree.Element("messageType") + message_type_elem.text = str(message.message_type) + text_elem = etree.Element("text") + text_elem.text = message.text + code_elem = etree.Element("code") + code_elem.text = message.code + timestamp_elem = etree.Element("timestamp") + timestamp_elem.text = message.timestamp.isoformat() + + message_elem.append(message_type_elem) + message_elem.append(text_elem) + message_elem.append(code_elem) + message_elem.append(timestamp_elem) + return message_elem + + +class XmlResponseAlt(XmlResponse): + def __init__(self, *args, content_type="text/xml", **kwargs): + super().__init__(*args, **kwargs, content_type=content_type) + + +class ResultToJsonEncoder(ServerAASToJsonEncoder): + @classmethod + def _result_to_json(cls, result: Result) -> Dict[str, object]: + return { + "success": result.success, + "messages": result.messages + } + + @classmethod + def _message_to_json(cls, message: Message) -> Dict[str, object]: + return { + "messageType": message.message_type, + "text": message.text, + "code": message.code, + "timestamp": message.timestamp.isoformat() + } + + def default(self, obj: object) -> object: + if isinstance(obj, Result): + return self._result_to_json(obj) + if isinstance(obj, Message): + return self._message_to_json(obj) + if isinstance(obj, MessageType): + return str(obj) + return super().default(obj) + + +class StrippedResultToJsonEncoder(ResultToJsonEncoder): + stripped = True class BaseWSGIApp: @@ -40,7 +206,7 @@ def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T def handle_request(self, request: Request): map_adapter: MapAdapter = self.url_map.bind_to_environ(request.environ) try: - response_t = get_response_type(request) + response_t = self.get_response_type(request) except werkzeug.exceptions.NotAcceptable as e: return e @@ -51,7 +217,38 @@ def handle_request(self, request: Request): # any raised error that leaves this function will cause a 500 internal server error # so catch raised http exceptions and return them except werkzeug.exceptions.HTTPException as e: - return http_exception_to_response(e, response_t) + return self.http_exception_to_response(e, response_t) + + @staticmethod + def get_response_type(request: Request) -> Type[APIResponse]: + response_types: Dict[str, Type[APIResponse]] = { + "application/json": JsonResponse, + "application/xml": XmlResponse, + "text/xml": XmlResponseAlt + } + if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): + return JsonResponse + mime_type = request.accept_mimetypes.best_match(response_types) + if mime_type is None: + raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " + + ", ".join(response_types.keys())) + return response_types[mime_type] + + @staticmethod + def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ + -> APIResponse: + headers = exception.get_headers() + location = exception.get_response().location + if location is not None: + headers.append(("Location", location)) + if exception.code and exception.code >= 400: + message = Message(type(exception).__name__, + exception.description if exception.description is not None else "", + MessageType.ERROR) + result = Result(False, [message]) + else: + result = Result(False) + return response_type(result, status=exception.code, headers=headers) class ObjectStoreWSGIApp(BaseWSGIApp): diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 24fd19cca..348def865 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -15,8 +15,7 @@ import server.app.server_model as server_model from basyx.aas import model from server.app.api_utils.http_api_helpers import HTTPApiDecoder, Base64URLConverter, is_stripped_request -from server.app.api_utils.response import APIResponse -from server.app.interfaces.base import ObjectStoreWSGIApp +from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse class RegistryAPI(ObjectStoreWSGIApp): diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 49663bbdf..e0310e320 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -43,8 +43,7 @@ from basyx.aas.adapter import aasx from server.app.api_utils.http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, \ is_stripped_request -from server.app.api_utils.response import APIResponse -from .base import ObjectStoreWSGIApp +from .base import ObjectStoreWSGIApp, APIResponse class WSGIApp(ObjectStoreWSGIApp): From df38540815455e959b02679079c6b5a079ac834f Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 24 Apr 2025 01:20:56 +0200 Subject: [PATCH 30/76] Refactor utils --- server/app/api_utils/http_api_helpers.py | 245 --------------------- server/app/interfaces/base.py | 183 ++++++++++++++- server/app/interfaces/discovery.py | 6 +- server/app/interfaces/registry.py | 4 +- server/app/interfaces/repository.py | 5 +- server/app/{api_utils => util}/__init__.py | 0 server/app/util/converters.py | 63 ++++++ 7 files changed, 248 insertions(+), 258 deletions(-) delete mode 100644 server/app/api_utils/http_api_helpers.py rename server/app/{api_utils => util}/__init__.py (100%) create mode 100644 server/app/util/converters.py diff --git a/server/app/api_utils/http_api_helpers.py b/server/app/api_utils/http_api_helpers.py deleted file mode 100644 index 8c65f9c17..000000000 --- a/server/app/api_utils/http_api_helpers.py +++ /dev/null @@ -1,245 +0,0 @@ -# Copyright (c) 2024 the Eclipse BaSyx Authors -# -# This program and the accompanying materials are made available under the terms of the MIT License, available in -# the LICENSE file of this project. -# -# SPDX-License-Identifier: MIT -import base64 -import binascii -import io -import json - -from lxml import etree -import werkzeug.exceptions -import werkzeug.routing -import werkzeug.urls -import werkzeug.utils -from werkzeug.exceptions import BadRequest, UnprocessableEntity -from werkzeug.wrappers import Request - -from basyx.aas import model - -from basyx.aas.adapter.xml import XMLConstructables, read_aas_xml_element - -from server.app import server_model -from server.app.adapter.jsonization import ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder - -from typing import Callable, List, Optional, Type, TypeVar, Union - - -def is_stripped_request(request: Request) -> bool: - return request.args.get("level") == "core" - - -T = TypeVar("T") - -BASE64URL_ENCODING = "utf-8" - - -def base64url_decode(data: str) -> str: - try: - # If the requester omits the base64 padding, an exception will be raised. - # However, Python doesn't complain about too much padding, - # thus we simply always append two padding characters (==). - # See also: https://stackoverflow.com/a/49459036/4780052 - decoded = base64.urlsafe_b64decode(data + "==").decode(BASE64URL_ENCODING) - except binascii.Error: - raise BadRequest(f"Encoded data {data} is invalid base64url!") - except UnicodeDecodeError: - raise BadRequest(f"Encoded base64url value is not a valid {BASE64URL_ENCODING} string!") - return decoded - - -def base64url_encode(data: str) -> str: - encoded = base64.urlsafe_b64encode(data.encode(BASE64URL_ENCODING)).decode("ascii") - return encoded - - -class HTTPApiDecoder: - # these are the types we can construct (well, only the ones we need) - type_constructables_map = { - model.AssetAdministrationShell: XMLConstructables.ASSET_ADMINISTRATION_SHELL, - model.AssetInformation: XMLConstructables.ASSET_INFORMATION, - model.ModelReference: XMLConstructables.MODEL_REFERENCE, - model.SpecificAssetId: XMLConstructables.SPECIFIC_ASSET_ID, - model.Qualifier: XMLConstructables.QUALIFIER, - model.Submodel: XMLConstructables.SUBMODEL, - model.SubmodelElement: XMLConstructables.SUBMODEL_ELEMENT, - model.Reference: XMLConstructables.REFERENCE, - } - - @classmethod - def check_type_support(cls, type_: type): - tolerated_types = ( - server_model.AssetAdministrationShellDescriptor, - server_model.SubmodelDescriptor, - server_model.AssetLink, - ) - if type_ not in cls.type_constructables_map and type_ not in tolerated_types: - raise TypeError(f"Parsing {type_} is not supported!") - - @classmethod - def assert_type(cls, obj: object, type_: Type[T]) -> T: - if not isinstance(obj, type_): - raise UnprocessableEntity(f"Object {obj!r} is not of type {type_.__name__}!") - return obj - - @classmethod - def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: - cls.check_type_support(expect_type) - decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ - else ServerStrictAASFromJsonDecoder - try: - parsed = json.loads(data, cls=decoder) - if isinstance(parsed, list) and expect_single: - raise UnprocessableEntity(f"Expected a single object of type {expect_type.__name__}, got {parsed!r}!") - if not isinstance(parsed, list) and not expect_single: - raise UnprocessableEntity(f"Expected List[{expect_type.__name__}], got {parsed!r}!") - parsed = [parsed] if not isinstance(parsed, list) else parsed - - # TODO: the following is ugly, but necessary because references aren't self-identified objects - # in the json schema - # TODO: json deserialization will always create an ModelReference[Submodel], xml deserialization determines - # that automatically - mapping = { - model.ModelReference: decoder._construct_model_reference, # type: ignore[assignment] - model.AssetInformation: decoder._construct_asset_information, # type: ignore[assignment] - model.SpecificAssetId: decoder._construct_specific_asset_id, # type: ignore[assignment] - model.Reference: decoder._construct_reference, # type: ignore[assignment] - model.Qualifier: decoder._construct_qualifier, # type: ignore[assignment] - server_model.AssetAdministrationShellDescriptor: - decoder._construct_asset_administration_shell_descriptor, # type: ignore[assignment] - server_model.SubmodelDescriptor: decoder._construct_submodel_descriptor, # type: ignore[assignment] - server_model.AssetLink: decoder._construct_asset_link, # type: ignore[assignment] - } - - constructor: Optional[Callable[..., T]] = mapping.get(expect_type) - args = [] - if expect_type is model.ModelReference: - args.append(model.Submodel) - - if constructor is not None: - # construct elements that aren't self-identified - return [constructor(obj, *args) for obj in parsed] - - except (KeyError, ValueError, TypeError, json.JSONDecodeError, model.AASConstraintViolation) as e: - raise UnprocessableEntity(str(e)) from e - - return [cls.assert_type(obj, expect_type) for obj in parsed] - - @classmethod - def base64url_json_list(cls, data: str, expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: - data = base64url_decode(data) - return cls.json_list(data, expect_type, stripped, expect_single) - - @classmethod - def json(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool) -> T: - return cls.json_list(data, expect_type, stripped, True)[0] - - @classmethod - def base64url_json(cls, data: str, expect_type: Type[T], stripped: bool) -> T: - data = base64url_decode(data) - return cls.json_list(data, expect_type, stripped, True)[0] - - @classmethod - def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: - cls.check_type_support(expect_type) - try: - xml_data = io.BytesIO(data) - rv = read_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], - stripped=stripped, failsafe=False) - except (KeyError, ValueError) as e: - # xml deserialization creates an error chain. since we only return one error, return the root cause - f: BaseException = e - while f.__cause__ is not None: - f = f.__cause__ - raise UnprocessableEntity(str(f)) from e - except (etree.XMLSyntaxError, model.AASConstraintViolation) as e: - raise UnprocessableEntity(str(e)) from e - return cls.assert_type(rv, expect_type) - - @classmethod - def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: - """ - TODO: werkzeug documentation recommends checking the content length before retrieving the body to prevent - running out of memory. but it doesn't state how to check the content length - also: what would be a reasonable maximum content length? the request body isn't limited by the xml/json - schema - In the meeting (25.11.2020) we discussed, this may refer to a reverse proxy in front of this WSGI app, - which should limit the maximum content length. - """ - valid_content_types = ("application/json", "application/xml", "text/xml") - - if request.mimetype not in valid_content_types: - raise werkzeug.exceptions.UnsupportedMediaType( - f"Invalid content-type: {request.mimetype}! Supported types: " - + ", ".join(valid_content_types)) - - if request.mimetype == "application/json": - return cls.json(request.get_data(), expect_type, stripped) - return cls.xml(request.get_data(), expect_type, stripped) - - @classmethod - def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> List[T]: - """ - Deserializes the request body to an instance (or list of instances) - of the expected type. - """ - # TODO: Refactor this method and request_body to avoid code duplication - valid_content_types = ("application/json", "application/xml", "text/xml") - - if request.mimetype not in valid_content_types: - raise werkzeug.exceptions.UnsupportedMediaType( - f"Invalid content-type: {request.mimetype}! Supported types: " + ", ".join(valid_content_types) - ) - - if request.mimetype == "application/json": - raw_data = request.get_data() - try: - parsed = json.loads(raw_data) - except Exception as e: - raise werkzeug.exceptions.BadRequest(f"Invalid JSON: {e}") - # Prüfe, ob parsed ein Array ist: - if isinstance(parsed, list): - # Für jedes Element wird die Konvertierung angewandt. - return [cls._convert_single_json_item(item, expect_type, stripped) for item in parsed] # type: ignore - else: - return cls._convert_single_json_item(parsed, expect_type, stripped) - else: - return cls.xml(request.get_data(), expect_type, stripped) - - @classmethod - def _convert_single_json_item(cls, data: any, expect_type: Type[T], stripped: bool) -> T: - """ - Konvertiert ein einzelnes JSON-Objekt (als Python-Dict) in ein Objekt vom Typ expect_type. - Hierbei wird das Dictionary zuerst wieder in einen JSON-String serialisiert und als Bytes übergeben. - """ - json_bytes = json.dumps(data).encode("utf-8") - return cls.json(json_bytes, expect_type, stripped) - - -class Base64URLConverter(werkzeug.routing.UnicodeConverter): - - def to_url(self, value: model.Identifier) -> str: - return super().to_url(base64url_encode(value)) - - def to_python(self, value: str) -> model.Identifier: - value = super().to_python(value) - decoded = base64url_decode(super().to_python(value)) - return decoded - - -class IdShortPathConverter(werkzeug.routing.UnicodeConverter): - id_short_sep = "." - - def to_url(self, value: List[str]) -> str: - return super().to_url(self.id_short_sep.join(value)) - - def to_python(self, value: str) -> List[str]: - id_shorts = super().to_python(value).split(self.id_short_sep) - for id_short in id_shorts: - try: - model.Referable.validate_id_short(id_short) - except (ValueError, model.AASConstraintViolation): - raise BadRequest(f"{id_short} is not a valid id_short!") - return id_shorts diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 36b77c6d6..23d763361 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -1,24 +1,30 @@ import abc import datetime import enum +import io import itertools import json -from typing import Iterable, Type, Iterator, Tuple, Optional, List, Union, Dict +from typing import Iterable, Type, Iterator, Tuple, Optional, List, Union, Dict, Callable, TypeVar import werkzeug.exceptions import werkzeug.routing import werkzeug.utils from lxml import etree from werkzeug import Response, Request -from werkzeug.exceptions import NotFound, BadRequest +from werkzeug.exceptions import NotFound, BadRequest, UnprocessableEntity from werkzeug.routing import MapAdapter from basyx.aas import model from basyx.aas.adapter._generic import XML_NS_MAP -from basyx.aas.adapter.xml import xml_serialization +from basyx.aas.adapter.xml import xml_serialization, XMLConstructables, read_aas_xml_element from basyx.aas.model import AbstractObjectStore -from server.app.adapter.jsonization import ServerAASToJsonEncoder -from server.app.api_utils.http_api_helpers import T +from server.app import server_model +from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, \ + ServerStrictStrippedAASFromJsonDecoder +from server.app.util.converters import base64url_decode + + +T = TypeVar("T") @enum.unique @@ -266,3 +272,170 @@ def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._ raise NotFound(f"No {type_.__name__} with {identifier} found!") identifiable.update() return identifiable + +class HTTPApiDecoder: + # these are the types we can construct (well, only the ones we need) + type_constructables_map = { + model.AssetAdministrationShell: XMLConstructables.ASSET_ADMINISTRATION_SHELL, + model.AssetInformation: XMLConstructables.ASSET_INFORMATION, + model.ModelReference: XMLConstructables.MODEL_REFERENCE, + model.SpecificAssetId: XMLConstructables.SPECIFIC_ASSET_ID, + model.Qualifier: XMLConstructables.QUALIFIER, + model.Submodel: XMLConstructables.SUBMODEL, + model.SubmodelElement: XMLConstructables.SUBMODEL_ELEMENT, + model.Reference: XMLConstructables.REFERENCE, + } + + @classmethod + def check_type_support(cls, type_: type): + tolerated_types = ( + server_model.AssetAdministrationShellDescriptor, + server_model.SubmodelDescriptor, + server_model.AssetLink, + ) + if type_ not in cls.type_constructables_map and type_ not in tolerated_types: + raise TypeError(f"Parsing {type_} is not supported!") + + @classmethod + def assert_type(cls, obj: object, type_: Type[T]) -> T: + if not isinstance(obj, type_): + raise UnprocessableEntity(f"Object {obj!r} is not of type {type_.__name__}!") + return obj + + @classmethod + def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: + cls.check_type_support(expect_type) + decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ + else ServerStrictAASFromJsonDecoder + try: + parsed = json.loads(data, cls=decoder) + if isinstance(parsed, list) and expect_single: + raise UnprocessableEntity(f"Expected a single object of type {expect_type.__name__}, got {parsed!r}!") + if not isinstance(parsed, list) and not expect_single: + raise UnprocessableEntity(f"Expected List[{expect_type.__name__}], got {parsed!r}!") + parsed = [parsed] if not isinstance(parsed, list) else parsed + + # TODO: the following is ugly, but necessary because references aren't self-identified objects + # in the json schema + # TODO: json deserialization will always create an ModelReference[Submodel], xml deserialization determines + # that automatically + mapping = { + model.ModelReference: decoder._construct_model_reference, # type: ignore[assignment] + model.AssetInformation: decoder._construct_asset_information, # type: ignore[assignment] + model.SpecificAssetId: decoder._construct_specific_asset_id, # type: ignore[assignment] + model.Reference: decoder._construct_reference, # type: ignore[assignment] + model.Qualifier: decoder._construct_qualifier, # type: ignore[assignment] + server_model.AssetAdministrationShellDescriptor: + decoder._construct_asset_administration_shell_descriptor, # type: ignore[assignment] + server_model.SubmodelDescriptor: decoder._construct_submodel_descriptor, # type: ignore[assignment] + server_model.AssetLink: decoder._construct_asset_link, # type: ignore[assignment] + } + + constructor: Optional[Callable[..., T]] = mapping.get(expect_type) + args = [] + if expect_type is model.ModelReference: + args.append(model.Submodel) + + if constructor is not None: + # construct elements that aren't self-identified + return [constructor(obj, *args) for obj in parsed] + + except (KeyError, ValueError, TypeError, json.JSONDecodeError, model.AASConstraintViolation) as e: + raise UnprocessableEntity(str(e)) from e + + return [cls.assert_type(obj, expect_type) for obj in parsed] + + @classmethod + def base64url_json_list(cls, data: str, expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: + data = base64url_decode(data) + return cls.json_list(data, expect_type, stripped, expect_single) + + @classmethod + def json(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool) -> T: + return cls.json_list(data, expect_type, stripped, True)[0] + + @classmethod + def base64url_json(cls, data: str, expect_type: Type[T], stripped: bool) -> T: + data = base64url_decode(data) + return cls.json_list(data, expect_type, stripped, True)[0] + + @classmethod + def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: + cls.check_type_support(expect_type) + try: + xml_data = io.BytesIO(data) + rv = read_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], + stripped=stripped, failsafe=False) + except (KeyError, ValueError) as e: + # xml deserialization creates an error chain. since we only return one error, return the root cause + f: BaseException = e + while f.__cause__ is not None: + f = f.__cause__ + raise UnprocessableEntity(str(f)) from e + except (etree.XMLSyntaxError, model.AASConstraintViolation) as e: + raise UnprocessableEntity(str(e)) from e + return cls.assert_type(rv, expect_type) + + @classmethod + def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> T: + """ + TODO: werkzeug documentation recommends checking the content length before retrieving the body to prevent + running out of memory. but it doesn't state how to check the content length + also: what would be a reasonable maximum content length? the request body isn't limited by the xml/json + schema + In the meeting (25.11.2020) we discussed, this may refer to a reverse proxy in front of this WSGI app, + which should limit the maximum content length. + """ + valid_content_types = ("application/json", "application/xml", "text/xml") + + if request.mimetype not in valid_content_types: + raise werkzeug.exceptions.UnsupportedMediaType( + f"Invalid content-type: {request.mimetype}! Supported types: " + + ", ".join(valid_content_types)) + + if request.mimetype == "application/json": + return cls.json(request.get_data(), expect_type, stripped) + return cls.xml(request.get_data(), expect_type, stripped) + + @classmethod + def request_body_list(cls, request: Request, expect_type: Type[T], stripped: bool) -> List[T]: + """ + Deserializes the request body to an instance (or list of instances) + of the expected type. + """ + # TODO: Refactor this method and request_body to avoid code duplication + valid_content_types = ("application/json", "application/xml", "text/xml") + + if request.mimetype not in valid_content_types: + raise werkzeug.exceptions.UnsupportedMediaType( + f"Invalid content-type: {request.mimetype}! Supported types: " + ", ".join(valid_content_types) + ) + + if request.mimetype == "application/json": + raw_data = request.get_data() + try: + parsed = json.loads(raw_data) + except Exception as e: + raise werkzeug.exceptions.BadRequest(f"Invalid JSON: {e}") + # Prüfe, ob parsed ein Array ist: + if isinstance(parsed, list): + # Für jedes Element wird die Konvertierung angewandt. + return [cls._convert_single_json_item(item, expect_type, stripped) for item in parsed] # type: ignore + else: + return cls._convert_single_json_item(parsed, expect_type, stripped) + else: + return cls.xml(request.get_data(), expect_type, stripped) + + @classmethod + def _convert_single_json_item(cls, data: any, expect_type: Type[T], stripped: bool) -> T: + """ + Konvertiert ein einzelnes JSON-Objekt (als Python-Dict) in ein Objekt vom Typ expect_type. + Hierbei wird das Dictionary zuerst wieder in einen JSON-String serialisiert und als Bytes übergeben. + """ + json_bytes = json.dumps(data).encode("utf-8") + return cls.json(json_bytes, expect_type, stripped) + + +def is_stripped_request(request: Request) -> bool: + return request.args.get("level") == "core" + diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 9731bc333..8f5810b10 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -13,9 +13,9 @@ from werkzeug.wrappers import Request, Response from basyx.aas import model -from server.app.api_utils.http_api_helpers import Base64URLConverter, HTTPApiDecoder -from server.app.interfaces.base import BaseWSGIApp -from .. import server_model +from server.app.util.converters import Base64URLConverter +from server.app.interfaces.base import BaseWSGIApp, HTTPApiDecoder +from .. import server_model as server_model from ..adapter.jsonization import ServerAASToJsonEncoder encoder=ServerAASToJsonEncoder() diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 348def865..099d3d093 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -14,8 +14,8 @@ import server.app.server_model as server_model from basyx.aas import model -from server.app.api_utils.http_api_helpers import HTTPApiDecoder, Base64URLConverter, is_stripped_request -from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse +from server.app.util.converters import Base64URLConverter +from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder class RegistryAPI(ObjectStoreWSGIApp): diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index e0310e320..d6abf17e6 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -41,9 +41,8 @@ from basyx.aas import model from basyx.aas.adapter import aasx -from server.app.api_utils.http_api_helpers import Base64URLConverter, IdShortPathConverter, T, HTTPApiDecoder, \ - is_stripped_request -from .base import ObjectStoreWSGIApp, APIResponse +from server.app.util.converters import Base64URLConverter, IdShortPathConverter +from .base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder, T class WSGIApp(ObjectStoreWSGIApp): diff --git a/server/app/api_utils/__init__.py b/server/app/util/__init__.py similarity index 100% rename from server/app/api_utils/__init__.py rename to server/app/util/__init__.py diff --git a/server/app/util/converters.py b/server/app/util/converters.py new file mode 100644 index 000000000..47e1ed645 --- /dev/null +++ b/server/app/util/converters.py @@ -0,0 +1,63 @@ +# Copyright (c) 2024 the Eclipse BaSyx Authors +# +# This program and the accompanying materials are made available under the terms of the MIT License, available in +# the LICENSE file of this project. +# +# SPDX-License-Identifier: MIT +import base64 +import binascii + +import werkzeug.routing +import werkzeug.utils +from werkzeug.exceptions import BadRequest + +from basyx.aas import model + +from typing import List + +BASE64URL_ENCODING = "utf-8" + + +def base64url_decode(data: str) -> str: + try: + # If the requester omits the base64 padding, an exception will be raised. + # However, Python doesn't complain about too much padding, + # thus we simply always append two padding characters (==). + # See also: https://stackoverflow.com/a/49459036/4780052 + decoded = base64.urlsafe_b64decode(data + "==").decode(BASE64URL_ENCODING) + except binascii.Error: + raise BadRequest(f"Encoded data {data} is invalid base64url!") + except UnicodeDecodeError: + raise BadRequest(f"Encoded base64url value is not a valid {BASE64URL_ENCODING} string!") + return decoded + + +def base64url_encode(data: str) -> str: + encoded = base64.urlsafe_b64encode(data.encode(BASE64URL_ENCODING)).decode("ascii") + return encoded + + +class Base64URLConverter(werkzeug.routing.UnicodeConverter): + def to_url(self, value: model.Identifier) -> str: + return super().to_url(base64url_encode(value)) + + def to_python(self, value: str) -> model.Identifier: + value = super().to_python(value) + decoded = base64url_decode(super().to_python(value)) + return decoded + + +class IdShortPathConverter(werkzeug.routing.UnicodeConverter): + id_short_sep = "." + + def to_url(self, value: List[str]) -> str: + return super().to_url(self.id_short_sep.join(value)) + + def to_python(self, value: str) -> List[str]: + id_shorts = super().to_python(value).split(self.id_short_sep) + for id_short in id_shorts: + try: + model.Referable.validate_id_short(id_short) + except (ValueError, model.AASConstraintViolation): + raise BadRequest(f"{id_short} is not a valid id_short!") + return id_shorts From 1da157fb5d0743c2e7fa31bed444ffc4f6e02b70 Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 24 Apr 2025 01:24:41 +0200 Subject: [PATCH 31/76] Rename `server_model` to `model` similiar as in sdk --- server/app/adapter/jsonization.py | 56 +++++++++---------- server/app/interfaces/base.py | 2 +- server/app/interfaces/discovery.py | 2 +- server/app/interfaces/registry.py | 34 +++++------ .../app/{server_model => model}/__init__.py | 0 .../app/{server_model => model}/descriptor.py | 2 +- .../app/{server_model => model}/endpoint.py | 0 7 files changed, 48 insertions(+), 48 deletions(-) rename server/app/{server_model => model}/__init__.py (100%) rename server/app/{server_model => model}/descriptor.py (99%) rename server/app/{server_model => model}/endpoint.py (100%) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 38601f268..276f6c31b 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -1,6 +1,6 @@ from typing import Dict, Set, Optional, Type -import server.app.server_model as server_model +import server.app.model as server_model from basyx.aas import model from basyx.aas.adapter import _generic from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO @@ -14,8 +14,8 @@ logger = logging.getLogger(__name__) JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES + ( - ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), - ('submodelDescriptors', server_model.SubmodelDescriptor) + ('assetAdministrationShellDescriptors', model.AssetAdministrationShellDescriptor), + ('submodelDescriptors', model.SubmodelDescriptor) ) @@ -40,7 +40,7 @@ def _get_aas_class_parsers(cls) -> Dict[str, Callable[[Dict[str, object]], objec def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None: super()._amend_abstract_attributes(obj, dct) - if isinstance(obj, server_model.Descriptor): + if isinstance(obj, model.Descriptor): if 'description' in dct: obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), model.MultiLanguageTextType) @@ -54,7 +54,7 @@ def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None @classmethod def _construct_asset_administration_shell_descriptor( cls, dct: Dict[str, object], - object_class=server_model.AssetAdministrationShellDescriptor) -> server_model.AssetAdministrationShellDescriptor: + object_class=model.AssetAdministrationShellDescriptor) -> model.AssetAdministrationShellDescriptor: ret = object_class(id_=_get_ts(dct, 'id', str)) cls._amend_abstract_attributes(ret, dct) if 'administration' in dct: @@ -75,9 +75,9 @@ def _construct_asset_administration_shell_descriptor( if 'protocolInformation' in endpoint_dct: ret.endpoints.append( cls._construct_endpoint(endpoint_dct, - server_model.Endpoint)) + model.Endpoint)) elif 'href' in endpoint_dct: - protocol_info = server_model.ProtocolInformation( + protocol_info = model.ProtocolInformation( href=_get_ts(endpoint_dct['href'], 'href', str), endpoint_protocol=_get_ts(endpoint_dct['href'], 'endpointProtocol', @@ -90,7 +90,7 @@ def _construct_asset_administration_shell_descriptor( list) if 'endpointProtocolVersion' in endpoint_dct['href'] else None ) - ret.endpoints.append(server_model.Endpoint( + ret.endpoints.append(model.Endpoint( protocol_information=protocol_info, interface=_get_ts(endpoint_dct, 'interface', str))) @@ -98,12 +98,12 @@ def _construct_asset_administration_shell_descriptor( ret.id_short = _get_ts(dct, 'idShort', str) if 'submodelDescriptors' in dct: ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), - server_model.SubmodelDescriptor) + model.SubmodelDescriptor) return ret @classmethod def _construct_protocol_information(cls, dct: Dict[str, object], - object_class=server_model.ProtocolInformation) -> server_model.ProtocolInformation: + object_class=model.ProtocolInformation) -> model.ProtocolInformation: ret = object_class( href=_get_ts(dct, 'href', str), endpoint_protocol=_get_ts(dct, 'endpointProtocol', @@ -123,11 +123,11 @@ def _construct_protocol_information(cls, dct: Dict[str, object], @classmethod def _construct_endpoint(cls, dct: Dict[str, object], - object_class=server_model.Endpoint) -> server_model.Endpoint: + object_class=model.Endpoint) -> model.Endpoint: ret = object_class( protocol_information=cls._construct_protocol_information( _get_ts(dct, 'protocolInformation', dict), - server_model.ProtocolInformation + model.ProtocolInformation ), interface=_get_ts(dct, 'interface', str) @@ -138,7 +138,7 @@ def _construct_endpoint(cls, dct: Dict[str, object], @classmethod def _construct_submodel_descriptor( cls, dct: Dict[str, object], - object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: + object_class=model.SubmodelDescriptor) -> model.SubmodelDescriptor: ret = object_class(id_=_get_ts(dct, 'id', str), endpoints=[]) cls._amend_abstract_attributes(ret, dct) @@ -146,9 +146,9 @@ def _construct_submodel_descriptor( if 'protocolInformation' in endpoint_dct: ret.endpoints.append( cls._construct_endpoint(endpoint_dct, - server_model.Endpoint)) + model.Endpoint)) elif 'href' in endpoint_dct: - protocol_info = server_model.ProtocolInformation( + protocol_info = model.ProtocolInformation( href=_get_ts(endpoint_dct['href'], 'href', str), endpoint_protocol=_get_ts(endpoint_dct['href'], 'endpointProtocol', @@ -161,7 +161,7 @@ def _construct_submodel_descriptor( list) if 'endpointProtocolVersion' in endpoint_dct['href'] else None ) - ret.endpoints.append(server_model.Endpoint( + ret.endpoints.append(model.Endpoint( protocol_information=protocol_info, interface=_get_ts(endpoint_dct, 'interface', str))) @@ -179,7 +179,7 @@ def _construct_submodel_descriptor( @classmethod def _construct_asset_link( - cls, dct: Dict[str, object], object_class=server_model.AssetLink) -> server_model.AssetLink: + cls, dct: Dict[str, object], object_class=model.AssetLink) -> model.AssetLink: ret = object_class(name=_get_ts(dct, 'name', str), value=_get_ts(dct, 'value', str)) return ret @@ -225,18 +225,18 @@ class ServerAASToJsonEncoder(AASToJsonEncoder): def _get_aas_class_serializers(cls) -> Dict[Type, Callable]: serializers = super()._get_aas_class_serializers() serializers.update({ - server_model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, - server_model.SubmodelDescriptor: cls._submodel_descriptor_to_json, - server_model.Endpoint: cls._endpoint_to_json, - server_model.ProtocolInformation: cls._protocol_information_to_json, - server_model.AssetLink: cls._asset_link_to_json + model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, + model.SubmodelDescriptor: cls._submodel_descriptor_to_json, + model.Endpoint: cls._endpoint_to_json, + model.ProtocolInformation: cls._protocol_information_to_json, + model.AssetLink: cls._asset_link_to_json }) return serializers @classmethod def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: data: Dict[str, object] = super()._abstract_classes_to_json(obj) - if isinstance(obj, server_model.Descriptor): + if isinstance(obj, model.Descriptor): if obj.description: data['description'] = obj.description if obj.display_name: @@ -246,7 +246,7 @@ def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: return data @classmethod - def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> \ + def _asset_administration_shell_descriptor_to_json(cls, obj: model.AssetAdministrationShellDescriptor) -> \ Dict[str, object]: """ serialization of an object from class AssetAdministrationShell to json @@ -277,7 +277,7 @@ def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetA @classmethod def _protocol_information_to_json(cls, - obj: server_model.ProtocolInformation) -> \ + obj: model.ProtocolInformation) -> \ Dict[str, object]: data = cls._abstract_classes_to_json(obj) @@ -295,7 +295,7 @@ def _protocol_information_to_json(cls, return data @classmethod - def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: + def _endpoint_to_json(cls, obj: model.Endpoint) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) data['protocolInformation'] = cls._protocol_information_to_json( obj.protocol_information) @@ -303,7 +303,7 @@ def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: return data @classmethod - def _submodel_descriptor_to_json(cls, obj: server_model.SubmodelDescriptor) -> Dict[str, object]: + def _submodel_descriptor_to_json(cls, obj: model.SubmodelDescriptor) -> Dict[str, object]: """ serialization of an object from class Submodel to json @@ -325,7 +325,7 @@ def _submodel_descriptor_to_json(cls, obj: server_model.SubmodelDescriptor) -> D return data @classmethod - def _asset_link_to_json(cls, obj: server_model.AssetLink) -> Dict[str, object]: + def _asset_link_to_json(cls, obj: model.AssetLink) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) data['name'] = obj.name data['value'] = obj.value diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 23d763361..cc2ac9a4a 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -18,7 +18,7 @@ from basyx.aas.adapter._generic import XML_NS_MAP from basyx.aas.adapter.xml import xml_serialization, XMLConstructables, read_aas_xml_element from basyx.aas.model import AbstractObjectStore -from server.app import server_model +from server.app import model as server_model from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, \ ServerStrictStrippedAASFromJsonDecoder from server.app.util.converters import base64url_decode diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 8f5810b10..b08448b06 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -15,7 +15,7 @@ from basyx.aas import model from server.app.util.converters import Base64URLConverter from server.app.interfaces.base import BaseWSGIApp, HTTPApiDecoder -from .. import server_model as server_model +from .. import model as server_model from ..adapter.jsonization import ServerAASToJsonEncoder encoder=ServerAASToJsonEncoder() diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 099d3d093..52301b506 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -12,7 +12,7 @@ from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response -import server.app.server_model as server_model +import server.app.model as server_model from basyx.aas import model from server.app.util.converters import Base64URLConverter from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder @@ -58,10 +58,10 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a }, strict_slashes=False) def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ - Iterator[server_model.AssetAdministrationShellDescriptor], int]: + Iterator[model.AssetAdministrationShellDescriptor], int]: - descriptors: Iterator[server_model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( - server_model.AssetAdministrationShellDescriptor + descriptors: Iterator[model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( + model.AssetAdministrationShellDescriptor ) id_short = request.args.get("idShort") @@ -84,11 +84,11 @@ def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ paginated_descriptors, end_index = self._get_slice(request, descriptors) return paginated_descriptors, end_index - def _get_aas_descriptor(self, url_args: Dict) -> server_model.AssetAdministrationShellDescriptor: - return self._get_obj_ts(url_args["aas_id"], server_model.AssetAdministrationShellDescriptor) + def _get_aas_descriptor(self, url_args: Dict) -> model.AssetAdministrationShellDescriptor: + return self._get_obj_ts(url_args["aas_id"], model.AssetAdministrationShellDescriptor) - def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: - submodel_descriptors: Iterator[model.Submodel] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) + def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[model.SubmodelDescriptor], int]: + submodel_descriptors: Iterator[model.Submodel] = self._get_all_obj_of_type(model.SubmodelDescriptor) id_short = request.args.get("idShort") if id_short is not None: submodel_descriptors = filter(lambda sm: sm.id_short == id_short, submodel_descriptors) @@ -100,8 +100,8 @@ def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[serv paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) return paginated_submodel_descriptors, end_index - def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescriptor: - return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) + def _get_submodel_descriptor(self, url_args: Dict) -> model.SubmodelDescriptor: + return self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor) # ------ AAS REGISTRY ROUTES ------- def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], @@ -111,7 +111,7 @@ def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter) -> Response: - descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) + descriptor = HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, False) try: self.object_store.add(descriptor) except KeyError as e: @@ -130,7 +130,7 @@ def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: def put_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: descriptor = self._get_aas_descriptor(url_args) - descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, + descriptor.update_from(HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, is_stripped_request(request))) descriptor.commit() return response_t() @@ -177,7 +177,7 @@ def post_submodel_descriptor_through_superpath(self, map_adapter: MapAdapter) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) submodel_descriptor = HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, + model.SubmodelDescriptor, is_stripped_request( request)) if any(sd.id == submodel_descriptor.id for sd in @@ -211,7 +211,7 @@ def put_submodel_descriptor_by_id_through_superpath(self, f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") submodel_descriptor.update_from( HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, + model.SubmodelDescriptor, is_stripped_request(request))) aas_descriptor.commit() return response_t() @@ -246,7 +246,7 @@ def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, respon def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter) -> Response: - submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, + submodel_descriptor = HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, is_stripped_request(request)) try: self.object_store.add(submodel_descriptor) @@ -262,13 +262,13 @@ def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, respon **_kwargs) -> Response: submodel_descriptor = self._get_submodel_descriptor(url_args) submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) + HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, is_stripped_request(request))) submodel_descriptor.commit() return response_t() def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: - self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor)) + self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor)) return response_t() diff --git a/server/app/server_model/__init__.py b/server/app/model/__init__.py similarity index 100% rename from server/app/server_model/__init__.py rename to server/app/model/__init__.py diff --git a/server/app/server_model/descriptor.py b/server/app/model/descriptor.py similarity index 99% rename from server/app/server_model/descriptor.py rename to server/app/model/descriptor.py index 6b57bf63f..38276cd2d 100644 --- a/server/app/server_model/descriptor.py +++ b/server/app/model/descriptor.py @@ -4,7 +4,7 @@ from typing import Optional, Iterable, List from basyx.aas import model -from server.app.server_model.endpoint import Endpoint +from server.app.model.endpoint import Endpoint class Descriptor(model.HasExtension, metaclass=abc.ABCMeta): diff --git a/server/app/server_model/endpoint.py b/server/app/model/endpoint.py similarity index 100% rename from server/app/server_model/endpoint.py rename to server/app/model/endpoint.py From a96da478a8be3e7c36b93ceab0f8f60a32a99906 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 24 Apr 2025 07:35:25 +0200 Subject: [PATCH 32/76] correct typos from renaming server_model to model --- server/app/adapter/jsonization.py | 54 +++++++++++++++---------------- server/app/interfaces/registry.py | 32 +++++++++--------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 276f6c31b..cd5f01a76 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -14,8 +14,8 @@ logger = logging.getLogger(__name__) JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES + ( - ('assetAdministrationShellDescriptors', model.AssetAdministrationShellDescriptor), - ('submodelDescriptors', model.SubmodelDescriptor) + ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), + ('submodelDescriptors', server_model.SubmodelDescriptor) ) @@ -40,7 +40,7 @@ def _get_aas_class_parsers(cls) -> Dict[str, Callable[[Dict[str, object]], objec def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None: super()._amend_abstract_attributes(obj, dct) - if isinstance(obj, model.Descriptor): + if isinstance(obj, server_model.Descriptor): if 'description' in dct: obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), model.MultiLanguageTextType) @@ -54,7 +54,7 @@ def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None @classmethod def _construct_asset_administration_shell_descriptor( cls, dct: Dict[str, object], - object_class=model.AssetAdministrationShellDescriptor) -> model.AssetAdministrationShellDescriptor: + object_class=server_model.AssetAdministrationShellDescriptor) -> server_model.AssetAdministrationShellDescriptor: ret = object_class(id_=_get_ts(dct, 'id', str)) cls._amend_abstract_attributes(ret, dct) if 'administration' in dct: @@ -75,9 +75,9 @@ def _construct_asset_administration_shell_descriptor( if 'protocolInformation' in endpoint_dct: ret.endpoints.append( cls._construct_endpoint(endpoint_dct, - model.Endpoint)) + server_model.Endpoint)) elif 'href' in endpoint_dct: - protocol_info = model.ProtocolInformation( + protocol_info = server_model.ProtocolInformation( href=_get_ts(endpoint_dct['href'], 'href', str), endpoint_protocol=_get_ts(endpoint_dct['href'], 'endpointProtocol', @@ -90,7 +90,7 @@ def _construct_asset_administration_shell_descriptor( list) if 'endpointProtocolVersion' in endpoint_dct['href'] else None ) - ret.endpoints.append(model.Endpoint( + ret.endpoints.append(server_model.Endpoint( protocol_information=protocol_info, interface=_get_ts(endpoint_dct, 'interface', str))) @@ -98,12 +98,12 @@ def _construct_asset_administration_shell_descriptor( ret.id_short = _get_ts(dct, 'idShort', str) if 'submodelDescriptors' in dct: ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), - model.SubmodelDescriptor) + server_model.SubmodelDescriptor) return ret @classmethod def _construct_protocol_information(cls, dct: Dict[str, object], - object_class=model.ProtocolInformation) -> model.ProtocolInformation: + object_class=server_model.ProtocolInformation) -> server_model.ProtocolInformation: ret = object_class( href=_get_ts(dct, 'href', str), endpoint_protocol=_get_ts(dct, 'endpointProtocol', @@ -123,11 +123,11 @@ def _construct_protocol_information(cls, dct: Dict[str, object], @classmethod def _construct_endpoint(cls, dct: Dict[str, object], - object_class=model.Endpoint) -> model.Endpoint: + object_class=server_model.Endpoint) -> server_model.Endpoint: ret = object_class( protocol_information=cls._construct_protocol_information( _get_ts(dct, 'protocolInformation', dict), - model.ProtocolInformation + server_model.ProtocolInformation ), interface=_get_ts(dct, 'interface', str) @@ -138,7 +138,7 @@ def _construct_endpoint(cls, dct: Dict[str, object], @classmethod def _construct_submodel_descriptor( cls, dct: Dict[str, object], - object_class=model.SubmodelDescriptor) -> model.SubmodelDescriptor: + object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: ret = object_class(id_=_get_ts(dct, 'id', str), endpoints=[]) cls._amend_abstract_attributes(ret, dct) @@ -146,9 +146,9 @@ def _construct_submodel_descriptor( if 'protocolInformation' in endpoint_dct: ret.endpoints.append( cls._construct_endpoint(endpoint_dct, - model.Endpoint)) + server_model.Endpoint)) elif 'href' in endpoint_dct: - protocol_info = model.ProtocolInformation( + protocol_info = server_model.ProtocolInformation( href=_get_ts(endpoint_dct['href'], 'href', str), endpoint_protocol=_get_ts(endpoint_dct['href'], 'endpointProtocol', @@ -161,7 +161,7 @@ def _construct_submodel_descriptor( list) if 'endpointProtocolVersion' in endpoint_dct['href'] else None ) - ret.endpoints.append(model.Endpoint( + ret.endpoints.append(server_model.Endpoint( protocol_information=protocol_info, interface=_get_ts(endpoint_dct, 'interface', str))) @@ -179,7 +179,7 @@ def _construct_submodel_descriptor( @classmethod def _construct_asset_link( - cls, dct: Dict[str, object], object_class=model.AssetLink) -> model.AssetLink: + cls, dct: Dict[str, object], object_class=server_model.AssetLink) -> server_model.AssetLink: ret = object_class(name=_get_ts(dct, 'name', str), value=_get_ts(dct, 'value', str)) return ret @@ -225,18 +225,18 @@ class ServerAASToJsonEncoder(AASToJsonEncoder): def _get_aas_class_serializers(cls) -> Dict[Type, Callable]: serializers = super()._get_aas_class_serializers() serializers.update({ - model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, - model.SubmodelDescriptor: cls._submodel_descriptor_to_json, - model.Endpoint: cls._endpoint_to_json, - model.ProtocolInformation: cls._protocol_information_to_json, - model.AssetLink: cls._asset_link_to_json + server_model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, + server_model.SubmodelDescriptor: cls._submodel_descriptor_to_json, + server_model.Endpoint: cls._endpoint_to_json, + server_model.ProtocolInformation: cls._protocol_information_to_json, + server_model.AssetLink: cls._asset_link_to_json }) return serializers @classmethod def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: data: Dict[str, object] = super()._abstract_classes_to_json(obj) - if isinstance(obj, model.Descriptor): + if isinstance(obj, server_model.Descriptor): if obj.description: data['description'] = obj.description if obj.display_name: @@ -246,7 +246,7 @@ def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: return data @classmethod - def _asset_administration_shell_descriptor_to_json(cls, obj: model.AssetAdministrationShellDescriptor) -> \ + def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> \ Dict[str, object]: """ serialization of an object from class AssetAdministrationShell to json @@ -277,7 +277,7 @@ def _asset_administration_shell_descriptor_to_json(cls, obj: model.AssetAdminist @classmethod def _protocol_information_to_json(cls, - obj: model.ProtocolInformation) -> \ + obj: server_model.ProtocolInformation) -> \ Dict[str, object]: data = cls._abstract_classes_to_json(obj) @@ -295,7 +295,7 @@ def _protocol_information_to_json(cls, return data @classmethod - def _endpoint_to_json(cls, obj: model.Endpoint) -> Dict[str, object]: + def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) data['protocolInformation'] = cls._protocol_information_to_json( obj.protocol_information) @@ -303,7 +303,7 @@ def _endpoint_to_json(cls, obj: model.Endpoint) -> Dict[str, object]: return data @classmethod - def _submodel_descriptor_to_json(cls, obj: model.SubmodelDescriptor) -> Dict[str, object]: + def _submodel_descriptor_to_json(cls, obj: server_model.SubmodelDescriptor) -> Dict[str, object]: """ serialization of an object from class Submodel to json @@ -325,7 +325,7 @@ def _submodel_descriptor_to_json(cls, obj: model.SubmodelDescriptor) -> Dict[str return data @classmethod - def _asset_link_to_json(cls, obj: model.AssetLink) -> Dict[str, object]: + def _asset_link_to_json(cls, obj: server_model.AssetLink) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) data['name'] = obj.name data['value'] = obj.value diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 52301b506..f33ab1651 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -58,10 +58,10 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a }, strict_slashes=False) def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ - Iterator[model.AssetAdministrationShellDescriptor], int]: + Iterator[server_model.AssetAdministrationShellDescriptor], int]: - descriptors: Iterator[model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( - model.AssetAdministrationShellDescriptor + descriptors: Iterator[server_model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( + server_model.AssetAdministrationShellDescriptor ) id_short = request.args.get("idShort") @@ -84,11 +84,11 @@ def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ paginated_descriptors, end_index = self._get_slice(request, descriptors) return paginated_descriptors, end_index - def _get_aas_descriptor(self, url_args: Dict) -> model.AssetAdministrationShellDescriptor: - return self._get_obj_ts(url_args["aas_id"], model.AssetAdministrationShellDescriptor) + def _get_aas_descriptor(self, url_args: Dict) -> server_model.AssetAdministrationShellDescriptor: + return self._get_obj_ts(url_args["aas_id"], server_model.AssetAdministrationShellDescriptor) - def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[model.SubmodelDescriptor], int]: - submodel_descriptors: Iterator[model.Submodel] = self._get_all_obj_of_type(model.SubmodelDescriptor) + def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: + submodel_descriptors: Iterator[server_model.SubmodelDescriptor] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) id_short = request.args.get("idShort") if id_short is not None: submodel_descriptors = filter(lambda sm: sm.id_short == id_short, submodel_descriptors) @@ -100,8 +100,8 @@ def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[mode paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) return paginated_submodel_descriptors, end_index - def _get_submodel_descriptor(self, url_args: Dict) -> model.SubmodelDescriptor: - return self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor) + def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescriptor: + return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) # ------ AAS REGISTRY ROUTES ------- def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], @@ -111,7 +111,7 @@ def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter) -> Response: - descriptor = HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, False) + descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) try: self.object_store.add(descriptor) except KeyError as e: @@ -130,7 +130,7 @@ def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: def put_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: descriptor = self._get_aas_descriptor(url_args) - descriptor.update_from(HTTPApiDecoder.request_body(request, model.AssetAdministrationShellDescriptor, + descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, is_stripped_request(request))) descriptor.commit() return response_t() @@ -177,7 +177,7 @@ def post_submodel_descriptor_through_superpath(self, map_adapter: MapAdapter) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) submodel_descriptor = HTTPApiDecoder.request_body(request, - model.SubmodelDescriptor, + server_model.SubmodelDescriptor, is_stripped_request( request)) if any(sd.id == submodel_descriptor.id for sd in @@ -211,7 +211,7 @@ def put_submodel_descriptor_by_id_through_superpath(self, f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") submodel_descriptor.update_from( HTTPApiDecoder.request_body(request, - model.SubmodelDescriptor, + server_model.SubmodelDescriptor, is_stripped_request(request))) aas_descriptor.commit() return response_t() @@ -246,7 +246,7 @@ def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, respon def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter) -> Response: - submodel_descriptor = HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, + submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request)) try: self.object_store.add(submodel_descriptor) @@ -262,13 +262,13 @@ def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, respon **_kwargs) -> Response: submodel_descriptor = self._get_submodel_descriptor(url_args) submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, model.SubmodelDescriptor, is_stripped_request(request))) + HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) submodel_descriptor.commit() return response_t() def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: - self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], model.SubmodelDescriptor)) + self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor)) return response_t() From 115db620e3895712509befb378241fca583b5d06 Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 22 May 2025 18:33:17 +0200 Subject: [PATCH 33/76] Remove discovery/registry related code --- Discovery Server/Dockerfile | 45 ---- Discovery Server/README.md | 63 ------ Discovery Server/app/main.py | 25 --- Discovery Server/compose.yml | 7 - Discovery Server/entrypoint.sh | 71 ------ Discovery Server/stop-supervisor.sh | 8 - Discovery Server/supervisord.ini | 27 --- Discovery Server/uwsgi.ini | 9 - Registry Server/Dockerfile | 45 ---- Registry Server/README.md | 97 -------- Registry Server/compose.yml | 7 - Registry Server/entrypoint.sh | 71 ------ Registry Server/stop-supervisor.sh | 8 - Registry Server/supervisord.ini | 27 --- Registry Server/uwsgi.ini | 9 - server/app/adapter/__init__.py | 0 server/app/adapter/jsonization.py | 332 ---------------------------- server/app/interfaces/base.py | 21 +- server/app/interfaces/discovery.py | 215 ------------------ server/app/interfaces/registry.py | 280 ----------------------- server/app/model/__init__.py | 2 - server/app/model/descriptor.py | 109 --------- server/app/model/endpoint.py | 107 --------- 23 files changed, 5 insertions(+), 1580 deletions(-) delete mode 100644 Discovery Server/Dockerfile delete mode 100644 Discovery Server/README.md delete mode 100644 Discovery Server/app/main.py delete mode 100644 Discovery Server/compose.yml delete mode 100644 Discovery Server/entrypoint.sh delete mode 100644 Discovery Server/stop-supervisor.sh delete mode 100644 Discovery Server/supervisord.ini delete mode 100644 Discovery Server/uwsgi.ini delete mode 100644 Registry Server/Dockerfile delete mode 100644 Registry Server/README.md delete mode 100644 Registry Server/compose.yml delete mode 100644 Registry Server/entrypoint.sh delete mode 100644 Registry Server/stop-supervisor.sh delete mode 100644 Registry Server/supervisord.ini delete mode 100644 Registry Server/uwsgi.ini delete mode 100644 server/app/adapter/__init__.py delete mode 100644 server/app/adapter/jsonization.py delete mode 100644 server/app/interfaces/discovery.py delete mode 100644 server/app/interfaces/registry.py delete mode 100644 server/app/model/__init__.py delete mode 100644 server/app/model/descriptor.py delete mode 100644 server/app/model/endpoint.py diff --git a/Discovery Server/Dockerfile b/Discovery Server/Dockerfile deleted file mode 100644 index 6dc3c4cac..000000000 --- a/Discovery Server/Dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -FROM python:3.11-alpine - -LABEL org.label-schema.name="Eclipse BaSyx" \ - org.label-schema.version="1.0" \ - org.label-schema.description="Docker image for the basyx-python-sdk server application" \ - org.label-schema.maintainer="Eclipse BaSyx" - -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 - -# If we have more dependencies for the server it would make sense -# to refactor uswgi to the pyproject.toml -RUN apk update && \ - apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ - pip install uwsgi && \ - pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ - apk del git bash - - -COPY uwsgi.ini /etc/uwsgi/ -COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini -COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh -RUN chmod +x /etc/supervisor/stop-supervisor.sh - -# Makes it possible to use a different configuration -ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini -# object stores aren't thread-safe yet -# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 -ENV UWSGI_CHEAPER=0 -ENV UWSGI_PROCESSES=1 -ENV NGINX_MAX_UPLOAD=1M -ENV NGINX_WORKER_PROCESSES=1 -ENV LISTEN_PORT=80 -ENV CLIENT_BODY_BUFFER_SIZE=1M - -# Copy the entrypoint that will generate Nginx additional configs -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -ENTRYPOINT ["/entrypoint.sh"] - -COPY ./app /app -WORKDIR /app - -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Discovery Server/README.md b/Discovery Server/README.md deleted file mode 100644 index 0b0938167..000000000 --- a/Discovery Server/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Eclipse BaSyx Python SDK - Dicovery Service - -This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Discovery Service**. -It provides basic discovery functionality for AAS IDs and their corresponding assets, as specified in the official [Discovery Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/DiscoveryServiceSpecification/V3.1.0_SSP-001). - -## Overview - -The Discovery Service is a core component in the Asset Administration Shell ecosystem. Its main responsibility is to store and retrieve relations between AAS identifiers and asset identifiers. It acts as a lookup service for resolving asset-related queries to corresponding AAS. - -This implementation supports: - -- Adding links between AAS and assets -- Querying AAS by asset links -- Querying asset links by AAS ID -- Removing AAS-related asset links -- Configurable in-memory or MongoDB-based persistent storage - -## Features - -| Feature | Description | -|---------------------------------------------|-------------------------------------------------------| -| `add_asset_links` | Register specific asset ids linked to an AAS | -| `get_all_specific_asset_ids_by_aas_id` | Retrieve specific asset ids associated with an AAS | -| `search_aas_by_asset_link` | Find AAS identifiers by providing asset link values | -| `remove_asset_links_for_aas` | Delete all asset links associated with a specific AAS | - -## Specification Compliance - -- Complies with: **Discovery Service Specification v3.1.0_SSP-001** - -## Configuration - -The service can be configured to use either: - -- **In-memory storage** (default): Temporary data storage that resets on service restart. -- **MongoDB storage**: Persistent backend storage using MongoDB. - -### Configuration via Environment Variables - -| Variable | Description | Default | -|----------------|--------------------------------------------|-------------------------| -| `STORAGE_TYPE` | `inmemory` or `mongodb` | `inmemory` | -| `MONGODB_URI` | MongoDB connection URI | `mongodb://localhost:27017` | -| `MONGODB_DBNAME` | Name of the MongoDB database | `basyx_registry` | - -## Deployment via Docker - -A `Dockerfile` and `docker-compose.yml` are provided for simple deployment. - -## Acknowledgments - -This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. - -[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 -[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html -[3]: https://github.com/eclipse-basyx/basyx-python-sdk -[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 -[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 -[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces -[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx -[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html -[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html -[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/Discovery Server/app/main.py b/Discovery Server/app/main.py deleted file mode 100644 index 19c97b416..000000000 --- a/Discovery Server/app/main.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -import sys -from basyx.aas.adapter.discovery import DiscoveryAPI, MongoDiscoveryStore,InMemoryDiscoveryStore - -storage_type = os.getenv("STORAGE_TYPE", "inmemory") -base_path = os.getenv("API_BASE_PATH") - -wsgi_optparams = {} - -if base_path is not None: - wsgi_optparams["base_path"] = base_path - -if storage_type == "inmemory": - application = DiscoveryAPI(InMemoryDiscoveryStore(), **wsgi_optparams) - -elif storage_type in "mongodb": - uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") - dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") - - application = DiscoveryAPI(MongoDiscoveryStore(uri,dbname), **wsgi_optparams) - -else: - print(f"STORAGE_TYPE must be either inmemory or mongodb! Current value: {storage_type}", - file=sys.stderr) - diff --git a/Discovery Server/compose.yml b/Discovery Server/compose.yml deleted file mode 100644 index 6e1d65404..000000000 --- a/Discovery Server/compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -services: - app: - build: . - ports: - - "8084:80" - environment: - STORAGE_TYPE: inmemory diff --git a/Discovery Server/entrypoint.sh b/Discovery Server/entrypoint.sh deleted file mode 100644 index 722394409..000000000 --- a/Discovery Server/entrypoint.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env sh -set -e - -# Get the maximum upload file size for Nginx, default to 0: unlimited -USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} - -# Get the number of workers for Nginx, default to 1 -USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} - -# Set the max number of connections per worker for Nginx, if requested -# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below -NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} - -# Get the listen port for Nginx, default to 80 -USE_LISTEN_PORT=${LISTEN_PORT:-80} - -# Get the client_body_buffer_size for Nginx, default to 1M -USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} - -# Create the conf.d directory if it doesn't exist -if [ ! -d /etc/nginx/conf.d ]; then - mkdir -p /etc/nginx/conf.d -fi - -if [ -f /app/nginx.conf ]; then - cp /app/nginx.conf /etc/nginx/nginx.conf -else - content='user nginx;\n' - # Set the number of worker processes in Nginx - content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" - content=$content'error_log /var/log/nginx/error.log warn;\n' - content=$content'pid /var/run/nginx.pid;\n' - content=$content'events {\n' - content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" - content=$content'}\n' - content=$content'http {\n' - content=$content' include /etc/nginx/mime.types;\n' - content=$content' default_type application/octet-stream;\n' - content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" - content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" - content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" - content=$content' access_log /var/log/nginx/access.log main;\n' - content=$content' sendfile on;\n' - content=$content' keepalive_timeout 65;\n' - content=$content' include /etc/nginx/conf.d/*.conf;\n' - content=$content'}\n' - content=$content'daemon off;\n' - # Set the max number of open file descriptors for Nginx workers, if requested - if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then - content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" - fi - # Save generated /etc/nginx/nginx.conf - printf "$content" > /etc/nginx/nginx.conf - - content_server='server {\n' - content_server=$content_server" listen ${USE_LISTEN_PORT};\n" - content_server=$content_server' location / {\n' - content_server=$content_server' include uwsgi_params;\n' - content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' - content_server=$content_server' }\n' - content_server=$content_server'}\n' - # Save generated server /etc/nginx/conf.d/nginx.conf - printf "$content_server" > /etc/nginx/conf.d/nginx.conf - - # # Generate additional configuration - printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf - printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf - printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf -fi - -exec "$@" diff --git a/Discovery Server/stop-supervisor.sh b/Discovery Server/stop-supervisor.sh deleted file mode 100644 index 9a953c94b..000000000 --- a/Discovery Server/stop-supervisor.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -printf "READY\n" - -while read line; do - echo "Processing Event: $line" >&2 - kill $PPID -done < /dev/stdin diff --git a/Discovery Server/supervisord.ini b/Discovery Server/supervisord.ini deleted file mode 100644 index d73d98014..000000000 --- a/Discovery Server/supervisord.ini +++ /dev/null @@ -1,27 +0,0 @@ -[supervisord] -nodaemon=true - -[program:uwsgi] -command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[program:nginx] -command=/usr/sbin/nginx -stdout_logfile=/var/log/nginx.out.log -stdout_logfile_maxbytes=0 -stderr_logfile=/var/log/nginx.err.log -stderr_logfile_maxbytes=0 -stopsignal=QUIT -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[eventlistener:quit_on_failure] -events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL -command=/etc/supervisor/stop-supervisor.sh diff --git a/Discovery Server/uwsgi.ini b/Discovery Server/uwsgi.ini deleted file mode 100644 index 9c54ae1cc..000000000 --- a/Discovery Server/uwsgi.ini +++ /dev/null @@ -1,9 +0,0 @@ -[uwsgi] -wsgi-file = /app/main.py -socket = /tmp/uwsgi.sock -chown-socket = nginx:nginx -chmod-socket = 664 -hook-master-start = unix_signal:15 gracefully_kill_them_all -need-app = true -die-on-term = true -show-config = false diff --git a/Registry Server/Dockerfile b/Registry Server/Dockerfile deleted file mode 100644 index 3d52a15ab..000000000 --- a/Registry Server/Dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -FROM python:3.11-alpine - -LABEL org.label-schema.name="Eclipse BaSyx" \ - org.label-schema.version="1.0" \ - org.label-schema.description="Docker image for the basyx-python-sdk server application" \ - org.label-schema.maintainer="Eclipse BaSyx" - -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 - -# If we have more dependencies for the server it would make sense -# to refactor uswgi to the pyproject.toml -RUN apk update && \ - apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ - pip install uwsgi && \ - pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ - apk del git bash - - -COPY uwsgi.ini /etc/uwsgi/ -COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini -COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh -RUN chmod +x /etc/supervisor/stop-supervisor.sh - -# Makes it possible to use a different configuration -ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini -# object stores aren't thread-safe yet -# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 -ENV UWSGI_CHEAPER=0 -ENV UWSGI_PROCESSES=1 -ENV NGINX_MAX_UPLOAD=1M -ENV NGINX_WORKER_PROCESSES=1 -ENV LISTEN_PORT=80 -ENV CLIENT_BODY_BUFFER_SIZE=1M - -# Copy the entrypoint that will generate Nginx additional configs -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -ENTRYPOINT ["/entrypoint.sh"] - -COPY ../server/app /app -WORKDIR /app - -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Registry Server/README.md b/Registry Server/README.md deleted file mode 100644 index 339226c53..000000000 --- a/Registry Server/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# Eclipse BaSyx Python SDK - HTTP Server - -This package contains a Dockerfile to spin up an exemplary HTTP/REST server following the [Specification of the AAS Part 2 API][6] with ease. -The server currently implements the following interfaces: - -- [Asset Administration Shell Repository Service][4] -- [Submodel Repository Service][5] - -It uses the [HTTP API][1] and the [AASX][7], [JSON][8], and [XML][9] Adapters of the [BaSyx Python SDK][3], to serve regarding files from a given directory. -The files are only read, changes won't persist. - -Alternatively, the container can also be told to use the [Local-File Backend][2] instead, which stores AAS and Submodels as individual JSON files and allows for persistent changes (except supplementary files, i.e. files referenced by `File` submodel elements). -See [below](#options) on how to configure this. - -## Building -The container image can be built via: -``` -$ docker buildx build -t basyx-python-sdk-http-server . -``` - -## Running - -### Storage -The container needs to be provided with the directory `/storage` to store AAS and Submodel files: AASX, JSON, XML or JSON files of Local-File Backend. - -This directory can be mapped via the `-v` option from another image or a local directory. -To map the directory `storage` inside the container, `-v ./storage:/storage` can be used. -The directory `storage` will be created in the current working directory, if it doesn't already exist. - -### Port -The HTTP server inside the container listens on port 80 by default. -To expose it on the host on port 8080, use the option `-p 8080:80` when running it. - -### Options -The container can be configured via environment variables: -- `API_BASE_PATH` determines the base path under which all other API paths are made available. - Default: `/api/v3.0` -- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: - - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve AASX, JSON, XML files from the storage directory. - The files are not modified, all changes done via the API are only stored in memory. - - When instead set to `LOCAL_FILE`, the server makes use of the [LocalFileBackend][2], where AAS and Submodels are persistently stored as JSON files. - Supplementary files, i.e. files referenced by `File` submodel elements, are not stored in this case. -- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. - -### Running Examples - -Putting it all together, the container can be started via the following command: -``` -$ docker run -p 8080:80 -v ./storage:/storage basyx-python-sdk-http-server -``` - -Since Windows uses backslashes instead of forward slashes in paths, you'll have to adjust the path to the storage directory there: -``` -> docker run -p 8080:80 -v .\storage:/storage basyx-python-sdk-http-server -``` - -Per default, the server will use the `LOCAL_FILE_READ_ONLY` storage type and serve the API under `/api/v3.0` and read files from `/storage`. If you want to change this, you can do so like this: -``` -$ docker run -p 8080:80 -v ./storage2:/storage2 -e API_BASE_PATH=/api/v3.1 -e STORAGE_TYPE=LOCAL_FILE_BACKEND -e STORAGE_PATH=/storage2 basyx-python-sdk-http-server -``` - -## Building and running the image with docker-compose - -The container image can also be built and run via: -``` -$ docker compose up -``` - -This is the exemplary `docker-compose` file for the server: -````yaml -services: - app: - build: . - ports: - - "8080:80" - volumes: - - ./storage:/storage - -```` - -Here files are read from `/storage` and the server can be accessed at http://localhost:8080/api/v3.0/ from your host system. -To get a different setup this compose.yaml file can be adapted and expanded. - -## Acknowledgments - -This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. - -[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 -[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html -[3]: https://github.com/eclipse-basyx/basyx-python-sdk -[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 -[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 -[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces -[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx -[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html -[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html -[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/Registry Server/compose.yml b/Registry Server/compose.yml deleted file mode 100644 index 932422dbc..000000000 --- a/Registry Server/compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -services: - app: - build: . - ports: - - "8083:80" - volumes: - - ./storage:/storage diff --git a/Registry Server/entrypoint.sh b/Registry Server/entrypoint.sh deleted file mode 100644 index 722394409..000000000 --- a/Registry Server/entrypoint.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env sh -set -e - -# Get the maximum upload file size for Nginx, default to 0: unlimited -USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} - -# Get the number of workers for Nginx, default to 1 -USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} - -# Set the max number of connections per worker for Nginx, if requested -# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below -NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} - -# Get the listen port for Nginx, default to 80 -USE_LISTEN_PORT=${LISTEN_PORT:-80} - -# Get the client_body_buffer_size for Nginx, default to 1M -USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} - -# Create the conf.d directory if it doesn't exist -if [ ! -d /etc/nginx/conf.d ]; then - mkdir -p /etc/nginx/conf.d -fi - -if [ -f /app/nginx.conf ]; then - cp /app/nginx.conf /etc/nginx/nginx.conf -else - content='user nginx;\n' - # Set the number of worker processes in Nginx - content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" - content=$content'error_log /var/log/nginx/error.log warn;\n' - content=$content'pid /var/run/nginx.pid;\n' - content=$content'events {\n' - content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" - content=$content'}\n' - content=$content'http {\n' - content=$content' include /etc/nginx/mime.types;\n' - content=$content' default_type application/octet-stream;\n' - content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" - content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" - content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" - content=$content' access_log /var/log/nginx/access.log main;\n' - content=$content' sendfile on;\n' - content=$content' keepalive_timeout 65;\n' - content=$content' include /etc/nginx/conf.d/*.conf;\n' - content=$content'}\n' - content=$content'daemon off;\n' - # Set the max number of open file descriptors for Nginx workers, if requested - if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then - content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" - fi - # Save generated /etc/nginx/nginx.conf - printf "$content" > /etc/nginx/nginx.conf - - content_server='server {\n' - content_server=$content_server" listen ${USE_LISTEN_PORT};\n" - content_server=$content_server' location / {\n' - content_server=$content_server' include uwsgi_params;\n' - content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' - content_server=$content_server' }\n' - content_server=$content_server'}\n' - # Save generated server /etc/nginx/conf.d/nginx.conf - printf "$content_server" > /etc/nginx/conf.d/nginx.conf - - # # Generate additional configuration - printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf - printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf - printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf -fi - -exec "$@" diff --git a/Registry Server/stop-supervisor.sh b/Registry Server/stop-supervisor.sh deleted file mode 100644 index 9a953c94b..000000000 --- a/Registry Server/stop-supervisor.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -printf "READY\n" - -while read line; do - echo "Processing Event: $line" >&2 - kill $PPID -done < /dev/stdin diff --git a/Registry Server/supervisord.ini b/Registry Server/supervisord.ini deleted file mode 100644 index d73d98014..000000000 --- a/Registry Server/supervisord.ini +++ /dev/null @@ -1,27 +0,0 @@ -[supervisord] -nodaemon=true - -[program:uwsgi] -command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[program:nginx] -command=/usr/sbin/nginx -stdout_logfile=/var/log/nginx.out.log -stdout_logfile_maxbytes=0 -stderr_logfile=/var/log/nginx.err.log -stderr_logfile_maxbytes=0 -stopsignal=QUIT -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[eventlistener:quit_on_failure] -events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL -command=/etc/supervisor/stop-supervisor.sh diff --git a/Registry Server/uwsgi.ini b/Registry Server/uwsgi.ini deleted file mode 100644 index 9c54ae1cc..000000000 --- a/Registry Server/uwsgi.ini +++ /dev/null @@ -1,9 +0,0 @@ -[uwsgi] -wsgi-file = /app/main.py -socket = /tmp/uwsgi.sock -chown-socket = nginx:nginx -chmod-socket = 664 -hook-master-start = unix_signal:15 gracefully_kill_them_all -need-app = true -die-on-term = true -show-config = false diff --git a/server/app/adapter/__init__.py b/server/app/adapter/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py deleted file mode 100644 index cd5f01a76..000000000 --- a/server/app/adapter/jsonization.py +++ /dev/null @@ -1,332 +0,0 @@ -from typing import Dict, Set, Optional, Type - -import server.app.model as server_model -from basyx.aas import model -from basyx.aas.adapter import _generic -from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO -from basyx.aas.adapter.json import AASToJsonEncoder -from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES, \ - read_aas_json_file_into - -import logging -from typing import Callable - -logger = logging.getLogger(__name__) - -JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES + ( - ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), - ('submodelDescriptors', server_model.SubmodelDescriptor) -) - - -class ServerAASFromJsonDecoder(AASFromJsonDecoder): - @classmethod - def _get_aas_class_parsers(cls) -> Dict[str, Callable[[Dict[str, object]], object]]: - aas_class_parsers = super()._get_aas_class_parsers() - aas_class_parsers.update({ - 'AssetAdministrationShellDescriptor': cls._construct_asset_administration_shell_descriptor, - 'SubmodelDescriptor': cls._construct_submodel_descriptor, - 'AssetLink': cls._construct_asset_link, - 'ProtocolInformation': cls._construct_protocol_information, - 'Endpoint': cls._construct_endpoint - }) - return aas_class_parsers - - # ################################################################################################## - # Utility Methods used in constructor methods to add general attributes (from abstract base classes) - # ################################################################################################## - - @classmethod - def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None: - super()._amend_abstract_attributes(obj, dct) - - if isinstance(obj, server_model.Descriptor): - if 'description' in dct: - obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), - model.MultiLanguageTextType) - if 'displayName' in dct: - obj.display_name = cls._construct_lang_string_set(_get_ts(dct, 'displayName', list), - model.MultiLanguageNameType) - if 'extensions' in dct: - for extension in _get_ts(dct, 'extensions', list): - obj.extension.add(cls._construct_extension(extension)) - - @classmethod - def _construct_asset_administration_shell_descriptor( - cls, dct: Dict[str, object], - object_class=server_model.AssetAdministrationShellDescriptor) -> server_model.AssetAdministrationShellDescriptor: - ret = object_class(id_=_get_ts(dct, 'id', str)) - cls._amend_abstract_attributes(ret, dct) - if 'administration' in dct: - ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) - if 'assetKind' in dct: - ret.asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] - if 'assetType' in dct: - ret.asset_type = _get_ts(dct, 'assetType', str) - global_asset_id = None - if 'globalAssetId' in dct: - ret.global_asset_id = _get_ts(dct, 'globalAssetId', str) - specific_asset_id = set() - if 'specificAssetIds' in dct: - for desc_data in _get_ts(dct, "specificAssetIds", list): - specific_asset_id.add(cls._construct_specific_asset_id(desc_data, model.SpecificAssetId)) - if 'endpoints' in dct: - for endpoint_dct in _get_ts(dct, 'endpoints', list): - if 'protocolInformation' in endpoint_dct: - ret.endpoints.append( - cls._construct_endpoint(endpoint_dct, - server_model.Endpoint)) - elif 'href' in endpoint_dct: - protocol_info = server_model.ProtocolInformation( - href=_get_ts(endpoint_dct['href'], 'href', str), - endpoint_protocol=_get_ts(endpoint_dct['href'], - 'endpointProtocol', - str) if 'endpointProtocol' in - endpoint_dct[ - 'href'] else None, - endpoint_protocol_version=_get_ts( - endpoint_dct['href'], - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in - endpoint_dct['href'] else None - ) - ret.endpoints.append(server_model.Endpoint( - protocol_information=protocol_info, - interface=_get_ts(endpoint_dct, 'interface', - str))) - if 'idShort' in dct: - ret.id_short = _get_ts(dct, 'idShort', str) - if 'submodelDescriptors' in dct: - ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), - server_model.SubmodelDescriptor) - return ret - - @classmethod - def _construct_protocol_information(cls, dct: Dict[str, object], - object_class=server_model.ProtocolInformation) -> server_model.ProtocolInformation: - ret = object_class( - href=_get_ts(dct, 'href', str), - endpoint_protocol=_get_ts(dct, 'endpointProtocol', - str) if 'endpointProtocol' in dct else None, - endpoint_protocol_version=_get_ts(dct, - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in dct else None, - subprotocol=_get_ts(dct, 'subprotocol', - str) if 'subprotocol' in dct else None, - subprotocol_body=_get_ts(dct, 'subprotocolBody', - str) if 'subprotocolBody' in dct else None, - subprotocol_body_encoding=_get_ts(dct, - 'subprotocolBodyEncoding', - str) if 'subprotocolBodyEncoding' in dct else None - ) - return ret - - @classmethod - def _construct_endpoint(cls, dct: Dict[str, object], - object_class=server_model.Endpoint) -> server_model.Endpoint: - ret = object_class( - protocol_information=cls._construct_protocol_information( - _get_ts(dct, 'protocolInformation', dict), - server_model.ProtocolInformation - ), - interface=_get_ts(dct, 'interface', - str) - ) - cls._amend_abstract_attributes(ret, dct) - return ret - - @classmethod - def _construct_submodel_descriptor( - cls, dct: Dict[str, object], - object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: - ret = object_class(id_=_get_ts(dct, 'id', str), - endpoints=[]) - cls._amend_abstract_attributes(ret, dct) - for endpoint_dct in _get_ts(dct, 'endpoints', list): - if 'protocolInformation' in endpoint_dct: - ret.endpoints.append( - cls._construct_endpoint(endpoint_dct, - server_model.Endpoint)) - elif 'href' in endpoint_dct: - protocol_info = server_model.ProtocolInformation( - href=_get_ts(endpoint_dct['href'], 'href', str), - endpoint_protocol=_get_ts(endpoint_dct['href'], - 'endpointProtocol', - str) if 'endpointProtocol' in - endpoint_dct[ - 'href'] else None, - endpoint_protocol_version=_get_ts( - endpoint_dct['href'], - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in - endpoint_dct['href'] else None - ) - ret.endpoints.append(server_model.Endpoint( - protocol_information=protocol_info, - interface=_get_ts(endpoint_dct, 'interface', - str))) - if 'administration' in dct: - ret.administration = cls._construct_administrative_information( - _get_ts(dct, 'administration', dict)) - if 'idShort' in dct: - ret.id_short = _get_ts(dct, 'idShort', str) - if 'semanticId' in dct: - ret.semantic_id = cls._construct_reference(_get_ts(dct, 'semanticId', dict)) - if 'supplementalSemanticIds' in dct: - for ref in _get_ts(dct, 'supplementalSemanticIds', list): - ret.supplemental_semantic_id.append(cls._construct_reference(ref)) - return ret - - @classmethod - def _construct_asset_link( - cls, dct: Dict[str, object], object_class=server_model.AssetLink) -> server_model.AssetLink: - ret = object_class(name=_get_ts(dct, 'name', str), - value=_get_ts(dct, 'value', str)) - return ret - - -class ServerStrictAASFromJsonDecoder(ServerAASFromJsonDecoder): - """ - A strict version of the AASFromJsonDecoder class for deserializing Asset Administration Shell data from the - official JSON format - - This version has set ``failsafe = False``, which will lead to Exceptions raised for every missing attribute or wrong - object type. - """ - failsafe = False - - -class ServerStrippedAASFromJsonDecoder(ServerAASFromJsonDecoder): - """ - Decoder for stripped JSON objects. Used in the HTTP adapter. - """ - stripped = True - - -class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, ServerStrippedAASFromJsonDecoder): - """ - Non-failsafe decoder for stripped JSON objects. - """ - pass - - -def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, - replace_existing: bool = False, - ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, - decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: - return read_aas_json_file_into(object_store=object_store, file=file, replace_existing=replace_existing, - ignore_existing=ignore_existing, failsafe=failsafe, stripped=stripped, - decoder=decoder, keys_to_types=JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES) - - -class ServerAASToJsonEncoder(AASToJsonEncoder): - - @classmethod - def _get_aas_class_serializers(cls) -> Dict[Type, Callable]: - serializers = super()._get_aas_class_serializers() - serializers.update({ - server_model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, - server_model.SubmodelDescriptor: cls._submodel_descriptor_to_json, - server_model.Endpoint: cls._endpoint_to_json, - server_model.ProtocolInformation: cls._protocol_information_to_json, - server_model.AssetLink: cls._asset_link_to_json - }) - return serializers - - @classmethod - def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: - data: Dict[str, object] = super()._abstract_classes_to_json(obj) - if isinstance(obj, server_model.Descriptor): - if obj.description: - data['description'] = obj.description - if obj.display_name: - data['displayName'] = obj.display_name - if obj.extension: - data['extensions'] = list(obj.extension) - return data - - @classmethod - def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> \ - Dict[str, object]: - """ - serialization of an object from class AssetAdministrationShell to json - - :param obj: object of class AssetAdministrationShell - :return: dict with the serialized attributes of this object - """ - data = cls._abstract_classes_to_json(obj) - data.update(cls._namespace_to_json(obj)) - data['id'] = obj.id - if obj.administration: - data['administration'] = obj.administration - if obj.asset_kind: - data['assetKind'] = _generic.ASSET_KIND[obj.asset_kind] - if obj.asset_type: - data['assetType'] = obj.asset_type - if obj.global_asset_id: - data['globalAssetId'] = obj.global_asset_id - if obj.specific_asset_id: - data['specificAssetIds'] = list(obj.specific_asset_id) - if obj.endpoints: - data['endpoints'] = list(obj.endpoints) - if obj.id_short: - data['idShort'] = obj.id_short - if obj.submodel_descriptors: - data['submodelDescriptors'] = list(obj.submodel_descriptors) - return data - - @classmethod - def _protocol_information_to_json(cls, - obj: server_model.ProtocolInformation) -> \ - Dict[str, object]: - data = cls._abstract_classes_to_json(obj) - - data['href'] = obj.href - if obj.endpoint_protocol: - data['endpointProtocol'] = obj.endpoint_protocol - if obj.endpoint_protocol_version: - data['endpointProtocolVersion'] = obj.endpoint_protocol_version - if obj.subprotocol: - data['subprotocol'] = obj.subprotocol - if obj.subprotocol_body: - data['subprotocolBody'] = obj.subprotocol_body - if obj.subprotocol_body_encoding: - data['subprotocolBodyEncoding'] = obj.subprotocol_body_encoding - return data - - @classmethod - def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: - data = cls._abstract_classes_to_json(obj) - data['protocolInformation'] = cls._protocol_information_to_json( - obj.protocol_information) - data['interface'] = obj.interface - return data - - @classmethod - def _submodel_descriptor_to_json(cls, obj: server_model.SubmodelDescriptor) -> Dict[str, object]: - """ - serialization of an object from class Submodel to json - - :param obj: object of class Submodel - :return: dict with the serialized attributes of this object - """ - data = cls._abstract_classes_to_json(obj) - data['id'] = obj.id - data['endpoints'] = [cls._endpoint_to_json(ep) for ep in - obj.endpoints] - if obj.id_short: - data['idShort'] = obj.id_short - if obj.administration: - data['administration'] = obj.administration - if obj.semantic_id: - data['semanticId'] = obj.semantic_id - if obj.supplemental_semantic_id: - data['supplementalSemanticIds'] = list(obj.supplemental_semantic_id) - return data - - @classmethod - def _asset_link_to_json(cls, obj: server_model.AssetLink) -> Dict[str, object]: - data = cls._abstract_classes_to_json(obj) - data['name'] = obj.name - data['value'] = obj.value - return data diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index cc2ac9a4a..caabb4311 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -16,11 +16,9 @@ from basyx.aas import model from basyx.aas.adapter._generic import XML_NS_MAP +from basyx.aas.adapter.json import StrictStrippedAASFromJsonDecoder, StrictAASFromJsonDecoder, AASToJsonEncoder from basyx.aas.adapter.xml import xml_serialization, XMLConstructables, read_aas_xml_element from basyx.aas.model import AbstractObjectStore -from server.app import model as server_model -from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, \ - ServerStrictStrippedAASFromJsonDecoder from server.app.util.converters import base64url_decode @@ -155,7 +153,7 @@ def __init__(self, *args, content_type="text/xml", **kwargs): super().__init__(*args, **kwargs, content_type=content_type) -class ResultToJsonEncoder(ServerAASToJsonEncoder): +class ResultToJsonEncoder(AASToJsonEncoder): @classmethod def _result_to_json(cls, result: Result) -> Dict[str, object]: return { @@ -288,12 +286,7 @@ class HTTPApiDecoder: @classmethod def check_type_support(cls, type_: type): - tolerated_types = ( - server_model.AssetAdministrationShellDescriptor, - server_model.SubmodelDescriptor, - server_model.AssetLink, - ) - if type_ not in cls.type_constructables_map and type_ not in tolerated_types: + if type_ not in cls.type_constructables_map: raise TypeError(f"Parsing {type_} is not supported!") @classmethod @@ -305,8 +298,8 @@ def assert_type(cls, obj: object, type_: Type[T]) -> T: @classmethod def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: cls.check_type_support(expect_type) - decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ - else ServerStrictAASFromJsonDecoder + decoder: Type[StrictAASFromJsonDecoder] = StrictStrippedAASFromJsonDecoder if stripped \ + else StrictAASFromJsonDecoder try: parsed = json.loads(data, cls=decoder) if isinstance(parsed, list) and expect_single: @@ -325,10 +318,6 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool model.SpecificAssetId: decoder._construct_specific_asset_id, # type: ignore[assignment] model.Reference: decoder._construct_reference, # type: ignore[assignment] model.Qualifier: decoder._construct_qualifier, # type: ignore[assignment] - server_model.AssetAdministrationShellDescriptor: - decoder._construct_asset_administration_shell_descriptor, # type: ignore[assignment] - server_model.SubmodelDescriptor: decoder._construct_submodel_descriptor, # type: ignore[assignment] - server_model.AssetLink: decoder._construct_asset_link, # type: ignore[assignment] } constructor: Optional[Callable[..., T]] = mapping.get(expect_type) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py deleted file mode 100644 index b08448b06..000000000 --- a/server/app/interfaces/discovery.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -This module implements the Discovery interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. -""" - -import abc -import json -from typing import Dict, List, Set, Any - -import werkzeug.exceptions -from pymongo import MongoClient -from pymongo.collection import Collection -from werkzeug.routing import Rule, Submount -from werkzeug.wrappers import Request, Response - -from basyx.aas import model -from server.app.util.converters import Base64URLConverter -from server.app.interfaces.base import BaseWSGIApp, HTTPApiDecoder -from .. import model as server_model -from ..adapter.jsonization import ServerAASToJsonEncoder - -encoder=ServerAASToJsonEncoder() - -class AbstractDiscoveryStore(metaclass=abc.ABCMeta): - aas_id_to_asset_ids: Any - asset_id_to_aas_ids: Any - - @abc.abstractmethod - def __init__(self): - pass - - @abc.abstractmethod - def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: - pass - - @abc.abstractmethod - def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - pass - - @abc.abstractmethod - def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: - pass - - @abc.abstractmethod - def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: - pass - - @abc.abstractmethod - def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: - pass - - @abc.abstractmethod - def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - pass - - - -class InMemoryDiscoveryStore(AbstractDiscoveryStore): - def __init__(self): - self.aas_id_to_asset_ids: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} - self.asset_id_to_aas_ids: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} - - def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: - return list(self.aas_id_to_asset_ids.get(aas_id, set())) - - def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, - asset_ids: List[model.SpecificAssetId]) -> None: - serialized_assets = [encoder.default(asset_id) for asset_id in asset_ids] - if aas_id in self.aas_id_to_asset_ids: - for asset in serialized_assets: - if asset not in self.aas_id_to_asset_ids[aas_id]: - self.aas_id_to_asset_ids[aas_id].append(asset) - else: - self.aas_id_to_asset_ids[aas_id] = serialized_assets[:] - - def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: - key = aas_id - if key in self.aas_id_to_asset_ids: - del self.aas_id_to_asset_ids[key] - - def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: - result = [] - for asset_key, aas_ids in self.asset_id_to_aas_ids.items(): - expected_key = f"{asset_link.name}:{asset_link.value}" - if asset_key == expected_key: - result.extend(list(aas_ids)) - return result - - def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = f"{asset_id.name}:{asset_id.value}" - if asset_key in self.asset_id_to_aas_ids: - self.asset_id_to_aas_ids[asset_key].add(aas_id) - else: - self.asset_id_to_aas_ids[asset_key] = {aas_id} - - def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = f"{asset_id.name}:{asset_id.value}" - if asset_key in self.asset_id_to_aas_ids: - self.asset_id_to_aas_ids[asset_key].discard(aas_id) - - -class MongoDiscoveryStore(AbstractDiscoveryStore): - def __init__(self, - uri: str = "mongodb://localhost:27017", - db_name: str = "basyx", - coll_aas_to_assets: str = "aas_to_assets", - coll_asset_to_aas: str = "asset_to_aas"): - self.client = MongoClient(uri) - self.db = self.client[db_name] - self.coll_aas_to_assets: Collection = self.db[coll_aas_to_assets] - self.coll_asset_to_aas: Collection = self.db[coll_asset_to_aas] - # Create an index for fast asset reverse lookups. - self.coll_asset_to_aas.create_index("_id") - - def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: - key = aas_id - doc = self.coll_aas_to_assets.find_one({"_id": key}) - return doc["asset_ids"] if doc and "asset_ids" in doc else [] - - def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - key = aas_id - # Convert each SpecificAssetId using the serialization helper. - serializable_assets = [encoder.default(asset_id) for asset_id in asset_ids] - self.coll_aas_to_assets.update_one( - {"_id": key}, - {"$addToSet": {"asset_ids": {"$each": serializable_assets}}}, - upsert=True - ) - - def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: - key = aas_id - self.coll_aas_to_assets.delete_one({"_id": key}) - - def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: - # Query MongoDB for specificAssetIds where 'name' and 'value' match - doc = self.coll_asset_to_aas.find_one({ - "name": asset_link.name, - "value": asset_link.value - }) - return doc["aas_ids"] if doc and "aas_ids" in doc else [] - - def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = str(encoder.default(asset_id)) - self.coll_asset_to_aas.update_one( - {"_id": asset_key}, - {"$addToSet": {"aas_ids": aas_id}}, - upsert=True - ) - - def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = str(encoder.default(asset_id)) - self.coll_asset_to_aas.update_one( - {"_id": asset_key}, - {"$pull": {"aas_ids": aas_id}} - ) - - -class DiscoveryAPI(BaseWSGIApp): - def __init__(self, - persistent_store: AbstractDiscoveryStore, base_path: str = "/api/v3.0"): - self.persistent_store: AbstractDiscoveryStore = persistent_store - self.url_map = werkzeug.routing.Map([ - Submount(base_path, [ - Rule("/lookup/shellsByAssetLink", methods=["POST"], - endpoint=self.search_all_aas_ids_by_asset_link), - Submount("/lookup/shells", [ - Rule("/", methods=["GET"], - endpoint=self.get_all_specific_asset_ids_by_aas_id), - Rule("/", methods=["POST"], - endpoint=self.post_all_asset_links_by_id), - Rule("/", methods=["DELETE"], - endpoint=self.delete_all_asset_links_by_id), - ]), - ]) - ], converters={ - "base64url": Base64URLConverter - }, strict_slashes=False) - - def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, - **_kwargs) -> Response: - asset_links = HTTPApiDecoder.request_body_list(request, server_model.AssetLink, False) - matching_aas_keys = set() - for asset_link in asset_links: - aas_keys = self.persistent_store.search_aas_ids_by_asset_link(asset_link) - matching_aas_keys.update(aas_keys) - matching_aas_keys = list(matching_aas_keys) - paginated_slice, cursor = self._get_slice(request, matching_aas_keys) - return response_t(list(paginated_slice), cursor=cursor) - - def get_all_specific_asset_ids_by_aas_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: - aas_identifier = url_args.get("aas_id") - asset_ids = self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier) - return response_t(asset_ids) - - def post_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: - aas_identifier = url_args.get("aas_id") - specific_asset_ids = HTTPApiDecoder.request_body_list(request, model.SpecificAssetId, False) - self.persistent_store.add_specific_asset_ids_to_aas(aas_identifier, specific_asset_ids) - for asset_id in specific_asset_ids: - self.persistent_store._add_aas_id_to_specific_asset_id(asset_id, aas_identifier) - updated = {aas_identifier: self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier)} - return response_t(updated) - - def delete_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: - aas_identifier = url_args.get("aas_id") - self.persistent_store.delete_specific_asset_ids_by_aas_id(aas_identifier) - for key in list(self.persistent_store.asset_id_to_aas_ids.keys()): - self.persistent_store.asset_id_to_aas_ids[key].discard(aas_identifier) - return response_t() - - -if __name__ == "__main__": - from werkzeug.serving import run_simple - - run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), - use_debugger=True, use_reloader=True) diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py deleted file mode 100644 index f33ab1651..000000000 --- a/server/app/interfaces/registry.py +++ /dev/null @@ -1,280 +0,0 @@ -""" -This module implements the Registry interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. -""" - -from typing import Dict, Iterator, List, Type, Tuple - -import werkzeug.exceptions -import werkzeug.routing -import werkzeug.urls -import werkzeug.utils -from werkzeug.exceptions import Conflict, NotFound -from werkzeug.routing import MapAdapter, Rule, Submount -from werkzeug.wrappers import Request, Response - -import server.app.model as server_model -from basyx.aas import model -from server.app.util.converters import Base64URLConverter -from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder - - -class RegistryAPI(ObjectStoreWSGIApp): - def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.0"): - self.object_store: model.AbstractObjectStore = object_store - self.url_map = werkzeug.routing.Map([ - Submount(base_path, [ - Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_all_aas_descriptors), - Rule("/shell-descriptors", methods=["POST"], endpoint=self.post_aas_descriptor), - Submount("/shell-descriptors", [ - Rule("/", methods=["GET"], endpoint=self.get_aas_descriptor_by_id), - Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor_by_id), - Rule("/", methods=["DELETE"], endpoint=self.delete_aas_descriptor_by_id), - Submount("/", [ - Rule("/submodel-descriptors", methods=["GET"], - endpoint=self.get_all_submodel_descriptors_through_superpath), - Rule("/submodel-descriptors", methods=["POST"], - endpoint=self.post_submodel_descriptor_through_superpath), - Submount("/submodel-descriptors", [ - Rule("/", methods=["GET"], - endpoint=self.get_submodel_descriptor_by_id_through_superpath), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_descriptor_by_id_through_superpath), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_descriptor_by_id_through_superpath), - ]) - ]) - ]), - Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors), - Rule("/submodel-descriptors", methods=["POST"], endpoint=self.post_submodel_descriptor), - Submount("/submodel-descriptors", [ - Rule("/", methods=["GET"], endpoint=self.get_submodel_descriptor_by_id), - Rule("/", methods=["PUT"], endpoint=self.put_submodel_descriptor_by_id), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_descriptor_by_id), - ]) - ]) - ], converters={ - "base64url": Base64URLConverter - }, strict_slashes=False) - - def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ - Iterator[server_model.AssetAdministrationShellDescriptor], int]: - - descriptors: Iterator[server_model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( - server_model.AssetAdministrationShellDescriptor - ) - - id_short = request.args.get("idShort") - if id_short is not None: - descriptors = filter(lambda desc: desc.id_short == id_short, descriptors) - - asset_ids = request.args.getlist("assetIds") - if asset_ids is not None: - # Decode and instantiate SpecificAssetIds - specific_asset_ids: List[model.SpecificAssetId] = list( - map(lambda asset_id: HTTPApiDecoder.base64url_json(asset_id, model.SpecificAssetId, False), asset_ids) - ) - # Filter AAS based on these SpecificAssetIds - descriptors = filter( - lambda desc: all(specific_asset_id in desc.specific_asset_id - for specific_asset_id in specific_asset_ids), - descriptors - ) - - paginated_descriptors, end_index = self._get_slice(request, descriptors) - return paginated_descriptors, end_index - - def _get_aas_descriptor(self, url_args: Dict) -> server_model.AssetAdministrationShellDescriptor: - return self._get_obj_ts(url_args["aas_id"], server_model.AssetAdministrationShellDescriptor) - - def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: - submodel_descriptors: Iterator[server_model.SubmodelDescriptor] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) - id_short = request.args.get("idShort") - if id_short is not None: - submodel_descriptors = filter(lambda sm: sm.id_short == id_short, submodel_descriptors) - semantic_id = request.args.get("semanticId") - if semantic_id is not None: - spec_semantic_id = HTTPApiDecoder.base64url_json( - semantic_id, model.Reference, False) # type: ignore[type-abstract] - submodel_descriptors = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodel_descriptors) - paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) - return paginated_submodel_descriptors, end_index - - def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescriptor: - return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) - - # ------ AAS REGISTRY ROUTES ------- - def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - aas_descriptors, cursor = self._get_all_aas_descriptors(request) - return response_t(list(aas_descriptors), cursor=cursor) - - def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: - descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) - try: - self.object_store.add(descriptor) - except KeyError as e: - raise Conflict(f"AssetAdministrationShellDescriptor with Identifier {descriptor.id} already exists!") from e - descriptor.commit() - created_resource_url = map_adapter.build(self.get_aas_descriptor_by_id, { - "aas_id": descriptor.id - }, force_external=True) - return response_t(descriptor, status=201, headers={"Location": created_resource_url}) - - def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - descriptor = self._get_aas_descriptor(url_args) - return response_t(descriptor) - - def put_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - descriptor = self._get_aas_descriptor(url_args) - descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, - is_stripped_request(request))) - descriptor.commit() - return response_t() - - def delete_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - descriptor = self._get_aas_descriptor(url_args) - self.object_store.remove(descriptor) - return response_t() - - def get_all_submodel_descriptors_through_superpath(self, - request: Request, - url_args: Dict, - response_t: Type[ - APIResponse], - **_kwargs) -> Response: - aas_descriptor = self._get_aas_descriptor(url_args) - submodel_descriptors, cursor = self._get_slice(request, - aas_descriptor.submodel_descriptors) - return response_t(list(submodel_descriptors), cursor=cursor) - - def get_submodel_descriptor_by_id_through_superpath(self, - request: Request, - url_args: Dict, - response_t: - Type[ - APIResponse], - **_kwargs) -> Response: - aas_descriptor = self._get_aas_descriptor(url_args) - submodel_id = url_args["submodel_id"] - submodel_descriptor = next( - (sd for sd in aas_descriptor.submodel_descriptors if - sd.id == submodel_id), None) - if submodel_descriptor is None: - raise NotFound( - f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") - return response_t(submodel_descriptor) - - def post_submodel_descriptor_through_superpath(self, - request: Request, - url_args: Dict, - response_t: Type[ - APIResponse], - map_adapter: MapAdapter) -> Response: - aas_descriptor = self._get_aas_descriptor(url_args) - submodel_descriptor = HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, - is_stripped_request( - request)) - if any(sd.id == submodel_descriptor.id for sd in - aas_descriptor.submodel_descriptors): - raise Conflict( - f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") - aas_descriptor.submodel_descriptors.append(submodel_descriptor) - aas_descriptor.commit() - created_resource_url = map_adapter.build( - self.get_submodel_descriptor_by_id_through_superpath, { - "aas_id": aas_descriptor.id, - "submodel_id": submodel_descriptor.id - }, force_external=True) - return response_t(submodel_descriptor, status=201, - headers={"Location": created_resource_url}) - - def put_submodel_descriptor_by_id_through_superpath(self, - request: Request, - url_args: Dict, - response_t: - Type[ - APIResponse], - **_kwargs) -> Response: - aas_descriptor = self._get_aas_descriptor(url_args) - submodel_id = url_args["submodel_id"] - submodel_descriptor = next( - (sd for sd in aas_descriptor.submodel_descriptors if - sd.id == submodel_id), None) - if submodel_descriptor is None: - raise NotFound( - f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") - submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, - is_stripped_request(request))) - aas_descriptor.commit() - return response_t() - - def delete_submodel_descriptor_by_id_through_superpath(self, - request: Request, - url_args: Dict, - response_t: - Type[ - APIResponse], - **_kwargs) -> Response: - aas_descriptor = self._get_aas_descriptor(url_args) - submodel_id = url_args["submodel_id"] - submodel_descriptor = next( - (sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) - if submodel_descriptor is None: - raise NotFound(f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") - aas_descriptor.submodel_descriptors.remove(submodel_descriptor) - aas_descriptor.commit() - return response_t() - - # ------ Submodel REGISTRY ROUTES ------- - def get_all_submodel_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - submodel_descriptors, cursor = self._get_all_submodel_descriptors(request) - return response_t(list(submodel_descriptors), cursor=cursor, stripped=is_stripped_request(request)) - - def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - submodel_descriptor = self._get_submodel_descriptor(url_args) - return response_t(submodel_descriptor, stripped=is_stripped_request(request)) - - def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: - submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, - is_stripped_request(request)) - try: - self.object_store.add(submodel_descriptor) - except KeyError as e: - raise Conflict(f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") from e - submodel_descriptor.commit() - created_resource_url = map_adapter.build(self.get_submodel_descriptor_by_id, { - "submodel_id": submodel_descriptor.id - }, force_external=True) - return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) - - def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - submodel_descriptor = self._get_submodel_descriptor(url_args) - submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) - submodel_descriptor.commit() - return response_t() - - def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor)) - return response_t() - - -if __name__ == "__main__": - from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - - run_simple("localhost", 8083, RegistryAPI(create_full_example()), - use_debugger=True, use_reloader=True) diff --git a/server/app/model/__init__.py b/server/app/model/__init__.py deleted file mode 100644 index 5736b5492..000000000 --- a/server/app/model/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .descriptor import * -from .endpoint import * diff --git a/server/app/model/descriptor.py b/server/app/model/descriptor.py deleted file mode 100644 index 38276cd2d..000000000 --- a/server/app/model/descriptor.py +++ /dev/null @@ -1,109 +0,0 @@ -from __future__ import absolute_import - -import abc -from typing import Optional, Iterable, List - -from basyx.aas import model -from server.app.model.endpoint import Endpoint - - -class Descriptor(model.HasExtension, metaclass=abc.ABCMeta): - @abc.abstractmethod - def __init__(self, description: Optional[model.MultiLanguageTextType] = None, - display_name: Optional[model.MultiLanguageNameType] = None, extension: Iterable[model.Extension] = ()): - super().__init__() - self.description: Optional[model.MultiLanguageTextType] = description - self.display_name: Optional[model.MultiLanguageNameType] = display_name - self.extension = model.NamespaceSet(self, [("name", True)], extension) - - def commit(self): - pass - - def update(self): - pass - - def update_from(self, other: "Descriptor", update_source: bool = False): - """ - Updates the descriptor's attributes from another descriptor. - - :param other: The descriptor to update from. - :param update_source: Placeholder for compatibility; not used in this context. - """ - for attr in vars(other): - if attr == "id": - continue # Skip updating the unique identifier of the AAS - setattr(self, attr, getattr(other, attr)) - - -class SubmodelDescriptor(Descriptor): - - def __init__(self, id_: model.Identifier, endpoints: List[Endpoint], - administration: Optional[model.AdministrativeInformation] = None, - id_short: Optional[model.NameType] = None, semantic_id: Optional[model.Reference] = None, - supplemental_semantic_id: Iterable[model.Reference] = ()): - super().__init__() - self.id: model.Identifier = id_ - self.endpoints: List[Endpoint] = endpoints - self.administration: Optional[model.AdministrativeInformation] = administration - self.id_short: Optional[model.NameType] = id_short - self.semantic_id: Optional[model.Reference] = semantic_id - self.supplemental_semantic_id: model.ConstrainedList[model.Reference] = \ - model.ConstrainedList(supplemental_semantic_id) - - -class AssetAdministrationShellDescriptor(Descriptor): - - def __init__(self, - id_: model.Identifier, - administration: Optional[model.AdministrativeInformation] = None, - asset_kind: Optional[model.AssetKind] = None, - asset_type: Optional[model.Identifier] = None, - endpoints: Optional[List[Endpoint]] = None, - global_asset_id: Optional[model.Identifier] = None, - id_short: Optional[model.NameType] = None, - specific_asset_id: Iterable[model.SpecificAssetId] = (), - submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, - description: Optional[model.MultiLanguageTextType] = None, - display_name: Optional[model.MultiLanguageNameType] = None, - extension: Iterable[model.Extension] = ()): - """AssetAdministrationShellDescriptor - - - Nur das 'id'-Feld (id_) ist zwingend erforderlich. Alle anderen Felder erhalten Defaultwerte. - """ - super().__init__() - self.administration: Optional[model.AdministrativeInformation] = administration - self.asset_kind: Optional[model.AssetKind] = asset_kind - self.asset_type: Optional[model.Identifier] = asset_type - self.endpoints: Optional[ - List[Endpoint]] = endpoints if endpoints is not None else [] # leere Liste, falls nicht gesetzt - self.global_asset_id: Optional[model.Identifier] = global_asset_id - self.id_short: Optional[model.NameType] = id_short - self.id: model.Identifier = id_ - self._specific_asset_id: model.ConstrainedList[model.SpecificAssetId] = model.ConstrainedList( - specific_asset_id, - item_set_hook=self._check_constraint_set_spec_asset_id, - item_del_hook=self._check_constraint_del_spec_asset_id - ) - self.submodel_descriptors = submodel_descriptors if submodel_descriptors is not None else [] - self.description: Optional[model.MultiLanguageTextType] = description - self.display_name: Optional[model.MultiLanguageNameType] = display_name - self.extension = model.NamespaceSet(self, [("name", True)], extension) - - @property - def specific_asset_id(self) -> model.ConstrainedList[model.SpecificAssetId]: - return self._specific_asset_id - - @specific_asset_id.setter - def specific_asset_id(self, specific_asset_id: Iterable[model.SpecificAssetId]) -> None: - # constraints are checked via _check_constraint_set_spec_asset_id() in this case - self._specific_asset_id[:] = specific_asset_id - - def _check_constraint_set_spec_asset_id(self, items_to_replace: List[model.SpecificAssetId], - new_items: List[model.SpecificAssetId], - old_list: List[model.SpecificAssetId]) -> None: - model.AssetInformation._validate_aasd_131(self.global_asset_id, - len(old_list) - len(items_to_replace) + len(new_items) > 0) - - def _check_constraint_del_spec_asset_id(self, _item_to_del: model.SpecificAssetId, - old_list: List[model.SpecificAssetId]) -> None: - model.AssetInformation._validate_aasd_131(self.global_asset_id, len(old_list) > 1) diff --git a/server/app/model/endpoint.py b/server/app/model/endpoint.py deleted file mode 100644 index 3be6dc061..000000000 --- a/server/app/model/endpoint.py +++ /dev/null @@ -1,107 +0,0 @@ -from __future__ import absolute_import - -import re -from enum import Enum -from typing import Optional, List - -from basyx.aas.model import base - - -class AssetLink: - def __init__(self, name: base.LabelType, value: base.Identifier): - if not name: - raise ValueError("AssetLink 'name' must be a non-empty string.") - if not value: - raise ValueError("AssetLink 'value' must be a non-empty string.") - self.name = name - self.value = value - - -class SecurityTypeEnum(Enum): - NONE = "NONE" - RFC_TLSA = "RFC_TLSA" - W3C_DID = "W3C_DID" - - -class SecurityAttributeObject: - def __init__(self, type_: SecurityTypeEnum, key: str, value: str): - - if not isinstance(type_, SecurityTypeEnum): - raise ValueError(f"Invalid security type: {type_}. Must be one of {list(SecurityTypeEnum)}") - if not key or not isinstance(key, str): - raise ValueError("Key must be a non-empty string.") - if not value or not isinstance(value, str): - raise ValueError("Value must be a non-empty string.") - self.type = type_ - self.key = key - self.value = value - - -class ProtocolInformation: - - def __init__( - self, - href: str, - endpoint_protocol: Optional[str] = None, - endpoint_protocol_version: Optional[List[str]] = None, - subprotocol: Optional[str] = None, - subprotocol_body: Optional[str] = None, - subprotocol_body_encoding: Optional[str] = None, - security_attributes: Optional[List[SecurityAttributeObject]] = None - ): - if not href or not isinstance(href, str): - raise ValueError("href must be a non-empty string representing a valid URL.") - - self.href = href - self.endpoint_protocol = endpoint_protocol - self.endpoint_protocol_version = endpoint_protocol_version or [] - self.subprotocol = subprotocol - self.subprotocol_body = subprotocol_body - self.subprotocol_body_encoding = subprotocol_body_encoding - self.security_attributes = security_attributes or [] - - -class Endpoint: - INTERFACE_SHORTNAMES = { - "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", - "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", - "CD-REPOSITORY", "AAS-DISCOVERY" - } - VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") - - def __init__(self, interface: base.NameType, protocol_information: ProtocolInformation): # noqa: E501 - - self.interface = interface - self.protocol_information = protocol_information - - @property - def interface(self) -> str: - return self._interface - - @interface.setter - def interface(self, interface: base.NameType): - if interface is None: - raise ValueError("Invalid value for `interface`, must not be `None`") - if not self.is_valid_interface(interface): - raise ValueError(f"Invalid interface format: {interface}. Expected format: '-', ") - - self._interface = interface - - @classmethod - def is_valid_interface(cls, interface: base.NameType) -> bool: - parts = interface.split("-", 1) - if len(parts) != 2: - return False - short_name, version = parts - return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) - - @property - def protocol_information(self) -> ProtocolInformation: - return self._protocol_information - - @protocol_information.setter - def protocol_information(self, protocol_information: ProtocolInformation): - if protocol_information is None: - raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 - - self._protocol_information = protocol_information From 0c36396a73c2dcbeb17cec0280aa9e79667cda8d Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 22 May 2025 23:33:11 +0200 Subject: [PATCH 34/76] Add missing code from PR #362 --- server/app/interfaces/base.py | 29 +++++++++++++++++------------ server/app/interfaces/repository.py | 4 +--- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index caabb4311..be7690fd1 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -11,7 +11,7 @@ import werkzeug.utils from lxml import etree from werkzeug import Response, Request -from werkzeug.exceptions import NotFound, BadRequest, UnprocessableEntity +from werkzeug.exceptions import NotFound, BadRequest from werkzeug.routing import MapAdapter from basyx.aas import model @@ -195,13 +195,13 @@ def __call__(self, environ, start_response) -> Iterable[bytes]: @classmethod def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: limit_str = request.args.get('limit', default="10") - cursor_str = request.args.get('cursor', default="0") + cursor_str = request.args.get('cursor', default="1") try: - limit, cursor = int(limit_str), int(cursor_str) + limit, cursor = int(limit_str), int(cursor_str) - 1 # cursor is 1-indexed if limit < 0 or cursor < 0: raise ValueError except ValueError: - raise BadRequest("Cursor and limit must be positive integers!") + raise BadRequest("Limit can not be negative, cursor must be positive!") start_index = cursor end_index = cursor + limit paginated_slice = itertools.islice(iterator, start_index, end_index) @@ -292,7 +292,7 @@ def check_type_support(cls, type_: type): @classmethod def assert_type(cls, obj: object, type_: Type[T]) -> T: if not isinstance(obj, type_): - raise UnprocessableEntity(f"Object {obj!r} is not of type {type_.__name__}!") + raise BadRequest(f"Object {obj!r} is not of type {type_.__name__}!") return obj @classmethod @@ -303,9 +303,9 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool try: parsed = json.loads(data, cls=decoder) if isinstance(parsed, list) and expect_single: - raise UnprocessableEntity(f"Expected a single object of type {expect_type.__name__}, got {parsed!r}!") + raise BadRequest(f"Expected a single object of type {expect_type.__name__}, got {parsed!r}!") if not isinstance(parsed, list) and not expect_single: - raise UnprocessableEntity(f"Expected List[{expect_type.__name__}], got {parsed!r}!") + raise BadRequest(f"Expected List[{expect_type.__name__}], got {parsed!r}!") parsed = [parsed] if not isinstance(parsed, list) else parsed # TODO: the following is ugly, but necessary because references aren't self-identified objects @@ -330,7 +330,7 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool return [constructor(obj, *args) for obj in parsed] except (KeyError, ValueError, TypeError, json.JSONDecodeError, model.AASConstraintViolation) as e: - raise UnprocessableEntity(str(e)) from e + raise BadRequest(str(e)) from e return [cls.assert_type(obj, expect_type) for obj in parsed] @@ -360,9 +360,9 @@ def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: f: BaseException = e while f.__cause__ is not None: f = f.__cause__ - raise UnprocessableEntity(str(f)) from e + raise BadRequest(str(f)) from e except (etree.XMLSyntaxError, model.AASConstraintViolation) as e: - raise UnprocessableEntity(str(e)) from e + raise BadRequest(str(e)) from e return cls.assert_type(rv, expect_type) @classmethod @@ -426,5 +426,10 @@ def _convert_single_json_item(cls, data: any, expect_type: Type[T], stripped: bo def is_stripped_request(request: Request) -> bool: - return request.args.get("level") == "core" - + level = request.args.get("level") + if level not in {"deep", "core", None}: + raise BadRequest(f"Level {level} is not a valid level!") + extent = request.args.get("extent") + if extent is not None: + raise werkzeug.exceptions.NotImplemented(f"The parameter extent is not yet implemented for this server!") + return level == "core" diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index e35d4e8ed..2e78ded78 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -36,8 +36,6 @@ import io import json -import itertools -import urllib from typing import Type, Iterator, List, Dict, Union, Callable, Tuple, Optional import werkzeug.exceptions @@ -50,7 +48,7 @@ from basyx.aas import model from basyx.aas.adapter import aasx -from server.app.util.converters import Base64URLConverter, IdShortPathConverter +from server.app.util.converters import Base64URLConverter, IdShortPathConverter, base64url_decode from .base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder, T From 6b3c6466e63c9582cdeaea3487f85b24be060f09 Mon Sep 17 00:00:00 2001 From: zrgt Date: Thu, 22 May 2025 23:50:02 +0200 Subject: [PATCH 35/76] Revert changes in .gitignore --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index ad036926e..18b522c3a 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,3 @@ compliance_tool/aas_compliance_tool/version.py # ignore the content of the server storage server/storage/ - -# local testing file, do not commit -test.py From 0a8546eb973477f5c3261fd0f3f2665655058070 Mon Sep 17 00:00:00 2001 From: zrgt Date: Fri, 23 May 2025 00:20:55 +0200 Subject: [PATCH 36/76] Fix copyright --- server/app/interfaces/base.py | 6 ++++++ server/app/util/converters.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index be7690fd1..ae5bb6506 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -1,3 +1,9 @@ +# Copyright (c) 2025 the Eclipse BaSyx Authors +# +# This program and the accompanying materials are made available under the terms of the MIT License, available in +# the LICENSE file of this project. +# +# SPDX-License-Identifier: MIT import abc import datetime import enum diff --git a/server/app/util/converters.py b/server/app/util/converters.py index 47e1ed645..c79ded3c2 100644 --- a/server/app/util/converters.py +++ b/server/app/util/converters.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 the Eclipse BaSyx Authors +# Copyright (c) 2025 the Eclipse BaSyx Authors # # This program and the accompanying materials are made available under the terms of the MIT License, available in # the LICENSE file of this project. From bfd1411a92808c7da8a9511576219c0746f399ab Mon Sep 17 00:00:00 2001 From: zrgt Date: Fri, 23 May 2025 00:32:08 +0200 Subject: [PATCH 37/76] Refactor `test_http.py` to `test_repository.py` --- server/test/__init__.py | 0 server/test/interfaces/__init__.py | 0 .../test_http.py => server/test/interfaces/test_repository.py | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 server/test/__init__.py create mode 100644 server/test/interfaces/__init__.py rename sdk/test/adapter/test_http.py => server/test/interfaces/test_repository.py (99%) diff --git a/server/test/__init__.py b/server/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/test/interfaces/__init__.py b/server/test/interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sdk/test/adapter/test_http.py b/server/test/interfaces/test_repository.py similarity index 99% rename from sdk/test/adapter/test_http.py rename to server/test/interfaces/test_repository.py index 09dadf865..32c6ea444 100644 --- a/sdk/test/adapter/test_http.py +++ b/server/test/interfaces/test_repository.py @@ -34,7 +34,7 @@ from basyx.aas import model from basyx.aas.adapter.aasx import DictSupplementaryFileContainer -from basyx.aas.adapter.http import WSGIApp +from server.app.interfaces.repository import WSGIApp from basyx.aas.examples.data.example_aas import create_full_example from typing import Set From 1fd76de1472b2870de258debafcadd7375b0a67c Mon Sep 17 00:00:00 2001 From: Sercan Sahin Date: Thu, 29 May 2025 13:15:16 +0200 Subject: [PATCH 38/76] fix copyright --- server/test/interfaces/test_repository.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/test/interfaces/test_repository.py b/server/test/interfaces/test_repository.py index 32c6ea444..5177dfacb 100644 --- a/server/test/interfaces/test_repository.py +++ b/server/test/interfaces/test_repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024 the Eclipse BaSyx Authors +# Copyright (c) 2025 the Eclipse BaSyx Authors # # This program and the accompanying materials are made available under the terms of the MIT License, available in # the LICENSE file of this project. From a78306630cf63fa3d36995c06b38305079095579 Mon Sep 17 00:00:00 2001 From: Sercan Sahin Date: Thu, 29 May 2025 16:11:17 +0200 Subject: [PATCH 39/76] fix MyPy errors, some tests --- sdk/basyx/aas/adapter/json/json_deserialization.py | 5 +++-- sdk/basyx/aas/adapter/json/json_serialization.py | 5 +++-- sdk/test/adapter/json/test_json_deserialization.py | 10 ++++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/sdk/basyx/aas/adapter/json/json_deserialization.py b/sdk/basyx/aas/adapter/json/json_deserialization.py index d1c770efc..4d07ec86b 100644 --- a/sdk/basyx/aas/adapter/json/json_deserialization.py +++ b/sdk/basyx/aas/adapter/json/json_deserialization.py @@ -34,7 +34,8 @@ import json import logging import pprint -from typing import Dict, Callable, ContextManager, TypeVar, Type, List, IO, Optional, Set, get_args, Tuple, Iterable +from typing import (Dict, Callable, ContextManager, TypeVar, Type, + List, IO, Optional, Set, get_args, Tuple, Iterable, Any) from basyx.aas import model from .._generic import MODELLING_KIND_INVERSE, ASSET_KIND_INVERSE, KEY_TYPES_INVERSE, ENTITY_TYPES_INVERSE, \ @@ -811,7 +812,7 @@ def _select_decoder(failsafe: bool, stripped: bool, decoder: Optional[Type[AASFr def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, decoder: Optional[Type[AASFromJsonDecoder]] = None, - keys_to_types: Iterable[Tuple[str, any]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) -> Set[model.Identifier]: + keys_to_types: Iterable[Tuple[str, Any]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) -> Set[model.Identifier]: """ Read an Asset Administration Shell JSON file according to 'Details of the Asset Administration Shell', chapter 5.5 into a given object store. diff --git a/sdk/basyx/aas/adapter/json/json_serialization.py b/sdk/basyx/aas/adapter/json/json_serialization.py index 14a1f2e77..024226d97 100644 --- a/sdk/basyx/aas/adapter/json/json_serialization.py +++ b/sdk/basyx/aas/adapter/json/json_serialization.py @@ -700,7 +700,8 @@ def _select_encoder(stripped: bool, encoder: Optional[Type[AASToJsonEncoder]] = def _create_dict(data: model.AbstractObjectStore, - keys_to_types: Iterable[Tuple[str, Type]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) -> Dict[str, List[object]]: + keys_to_types: Iterable[Tuple[str, Type]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) \ + -> Dict[str, List[model.Identifiable]]: """ Categorizes objects from an AbstractObjectStore into a dictionary based on their types. @@ -714,7 +715,7 @@ def _create_dict(data: model.AbstractObjectStore, - A type to match objects against. :return: A dictionary where keys are category names and values are lists of objects of the corresponding types. """ - objects = {} + objects: Dict[str, List[model.Identifiable]] = {} for obj in data: # Iterate through the mapping of category names to expected types diff --git a/sdk/test/adapter/json/test_json_deserialization.py b/sdk/test/adapter/json/test_json_deserialization.py index 9272bdf98..645f2a8ab 100644 --- a/sdk/test/adapter/json/test_json_deserialization.py +++ b/sdk/test/adapter/json/test_json_deserialization.py @@ -37,7 +37,8 @@ def test_file_format_wrong_list(self) -> None: } ] }""" - with self.assertRaisesRegex(TypeError, r"submodels.*AssetAdministrationShell"): + with self.assertRaisesRegex(TypeError, r"AssetAdministrationShell.* was " + r"in the wrong list 'submodels'"): read_aas_json_file(io.StringIO(data), failsafe=False) with self.assertLogs(logging.getLogger(), level=logging.WARNING) as cm: read_aas_json_file(io.StringIO(data), failsafe=True) @@ -54,7 +55,8 @@ def test_file_format_unknown_object(self) -> None: { "x": "foo" } ] }""" - with self.assertRaisesRegex(TypeError, r"submodels.*'foo'"): + with self.assertRaisesRegex(TypeError, r"\{\s?'x':\s?'foo'\s?\} was in" + r" the wrong list 'submodels'"): read_aas_json_file(io.StringIO(data), failsafe=False) with self.assertLogs(logging.getLogger(), level=logging.WARNING) as cm: read_aas_json_file(io.StringIO(data), failsafe=True) @@ -196,7 +198,7 @@ def get_clean_store() -> model.DictObjectStore: with self.assertLogs(logging.getLogger(), level=logging.INFO) as log_ctx: identifiers = read_aas_json_file_into(object_store, string_io, replace_existing=False, ignore_existing=True) self.assertEqual(len(identifiers), 0) - self.assertIn("already exists in the object store", log_ctx.output[0]) # type: ignore + self.assertIn("already exists in store", log_ctx.output[0]) # type: ignore submodel = object_store.pop() self.assertIsInstance(submodel, model.Submodel) self.assertEqual(submodel.id_short, "test123") @@ -204,7 +206,7 @@ def get_clean_store() -> model.DictObjectStore: string_io.seek(0) object_store = get_clean_store() - with self.assertRaisesRegex(KeyError, r"already exists in the object store"): + with self.assertRaisesRegex(KeyError, r"already exists in store"): identifiers = read_aas_json_file_into(object_store, string_io, replace_existing=False, ignore_existing=False) self.assertEqual(len(identifiers), 0) From 66f3320f877faea0277d376a779a7309789c313d Mon Sep 17 00:00:00 2001 From: Sercan Sahin Date: Tue, 3 Jun 2025 15:03:16 +0200 Subject: [PATCH 40/76] fix bugs, reintroduce Identifiable check --- .../aas/adapter/json/json_deserialization.py | 54 ++++++++++--------- sdk/pyproject.toml | 2 +- .../adapter/json/test_json_deserialization.py | 3 +- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/sdk/basyx/aas/adapter/json/json_deserialization.py b/sdk/basyx/aas/adapter/json/json_deserialization.py index 4d07ec86b..cd7ce9fb0 100644 --- a/sdk/basyx/aas/adapter/json/json_deserialization.py +++ b/sdk/basyx/aas/adapter/json/json_deserialization.py @@ -812,7 +812,8 @@ def _select_decoder(failsafe: bool, stripped: bool, decoder: Optional[Type[AASFr def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, replace_existing: bool = False, ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, decoder: Optional[Type[AASFromJsonDecoder]] = None, - keys_to_types: Iterable[Tuple[str, Any]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) -> Set[model.Identifier]: + keys_to_types: Iterable[Tuple[str, Any]] = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES) \ + -> Set[model.Identifier]: """ Read an Asset Administration Shell JSON file according to 'Details of the Asset Administration Shell', chapter 5.5 into a given object store. @@ -864,31 +865,36 @@ def read_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathO continue for item in lst: - if not isinstance(item, expected_type): - if not decoder_.failsafe: - raise TypeError(f"{item} was in the wrong list '{name}'") - logger.warning(f"{item} was in the wrong list '{name}'; nevertheless, we'll use it") - - if item.id in ret: - error_msg = f"{item} has a duplicate identifier already parsed in the document!" - if not decoder_.failsafe: - raise KeyError(error_msg) - logger.error(f"{error_msg} skipping it...") - continue - - existing_element = object_store.get(item.id) - if existing_element is not None: - if not replace_existing: - error_msg = f"Object with id '{item.id}' already exists in store: {existing_element}!" - if not ignore_existing: - raise KeyError(f"{error_msg} Failed to insert {item}!") - logger.info(f"{error_msg}; Skipping {item}...") + error_msg = f"Expected a {expected_type.__name__} in list '{name}', but found {repr(item)}." + if isinstance(item, model.Identifiable): + if not isinstance(item, expected_type): + if not decoder_.failsafe: + raise TypeError(f"{item} was in the wrong list '{name}'") + logger.warning(f"{item} was in the wrong list '{name}'; nevertheless, we'll use it") + + if item.id in ret: + error_msg = f"{item} has a duplicate identifier already parsed in the document!" + if not decoder_.failsafe: + raise KeyError(error_msg) + logger.error(f"{error_msg} Skipping it...") continue - object_store.discard(existing_element) - - object_store.add(item) - ret.add(item.id) + existing_element = object_store.get(item.id) + if existing_element is not None: + if not replace_existing: + error_msg = f"Object with id '{item.id}' already exists in store: {existing_element}!" + if not ignore_existing: + raise KeyError(f"{error_msg} Failed to insert {item}!") + logger.info(f"{error_msg} Skipping {item}...") + continue + object_store.discard(existing_element) + + object_store.add(item) + ret.add(item.id) + elif decoder_.failsafe: + logger.error(f"{error_msg} Skipping it...") + else: + raise TypeError(error_msg) return ret diff --git a/sdk/pyproject.toml b/sdk/pyproject.toml index 70308891b..47dee3488 100644 --- a/sdk/pyproject.toml +++ b/sdk/pyproject.toml @@ -20,7 +20,7 @@ root = ".." # Defines the path to the root of the repository version_file = "basyx/version.py" [project] - name = "basyx-python-sdk" +name = "basyx-python-sdk" dynamic = ["version"] description = "The Eclipse BaSyx Python SDK, an implementation of the Asset Administration Shell for Industry 4.0 systems" authors = [ diff --git a/sdk/test/adapter/json/test_json_deserialization.py b/sdk/test/adapter/json/test_json_deserialization.py index 645f2a8ab..0dba6dbdb 100644 --- a/sdk/test/adapter/json/test_json_deserialization.py +++ b/sdk/test/adapter/json/test_json_deserialization.py @@ -55,8 +55,7 @@ def test_file_format_unknown_object(self) -> None: { "x": "foo" } ] }""" - with self.assertRaisesRegex(TypeError, r"\{\s?'x':\s?'foo'\s?\} was in" - r" the wrong list 'submodels'"): + with self.assertRaisesRegex(TypeError, r"submodels.*'foo'"): read_aas_json_file(io.StringIO(data), failsafe=False) with self.assertLogs(logging.getLogger(), level=logging.WARNING) as cm: read_aas_json_file(io.StringIO(data), failsafe=True) From 322671819c14786d7a4acb5d7a5fbe66aebbe07c Mon Sep 17 00:00:00 2001 From: zrgt Date: Tue, 17 Jun 2025 14:34:19 +0200 Subject: [PATCH 41/76] Revert "Remove discovery/registry related code" This reverts commit 115db620e3895712509befb378241fca583b5d06. --- Discovery Server/Dockerfile | 45 ++++ Discovery Server/README.md | 63 ++++++ Discovery Server/app/main.py | 25 +++ Discovery Server/compose.yml | 7 + Discovery Server/entrypoint.sh | 71 ++++++ Discovery Server/stop-supervisor.sh | 8 + Discovery Server/supervisord.ini | 27 +++ Discovery Server/uwsgi.ini | 9 + Registry Server/Dockerfile | 45 ++++ Registry Server/README.md | 97 ++++++++ Registry Server/compose.yml | 7 + Registry Server/entrypoint.sh | 71 ++++++ Registry Server/stop-supervisor.sh | 8 + Registry Server/supervisord.ini | 27 +++ Registry Server/uwsgi.ini | 9 + server/app/adapter/__init__.py | 0 server/app/adapter/jsonization.py | 332 ++++++++++++++++++++++++++++ server/app/interfaces/base.py | 21 +- server/app/interfaces/discovery.py | 215 ++++++++++++++++++ server/app/interfaces/registry.py | 280 +++++++++++++++++++++++ server/app/model/__init__.py | 2 + server/app/model/descriptor.py | 109 +++++++++ server/app/model/endpoint.py | 107 +++++++++ 23 files changed, 1580 insertions(+), 5 deletions(-) create mode 100644 Discovery Server/Dockerfile create mode 100644 Discovery Server/README.md create mode 100644 Discovery Server/app/main.py create mode 100644 Discovery Server/compose.yml create mode 100644 Discovery Server/entrypoint.sh create mode 100644 Discovery Server/stop-supervisor.sh create mode 100644 Discovery Server/supervisord.ini create mode 100644 Discovery Server/uwsgi.ini create mode 100644 Registry Server/Dockerfile create mode 100644 Registry Server/README.md create mode 100644 Registry Server/compose.yml create mode 100644 Registry Server/entrypoint.sh create mode 100644 Registry Server/stop-supervisor.sh create mode 100644 Registry Server/supervisord.ini create mode 100644 Registry Server/uwsgi.ini create mode 100644 server/app/adapter/__init__.py create mode 100644 server/app/adapter/jsonization.py create mode 100644 server/app/interfaces/discovery.py create mode 100644 server/app/interfaces/registry.py create mode 100644 server/app/model/__init__.py create mode 100644 server/app/model/descriptor.py create mode 100644 server/app/model/endpoint.py diff --git a/Discovery Server/Dockerfile b/Discovery Server/Dockerfile new file mode 100644 index 000000000..6dc3c4cac --- /dev/null +++ b/Discovery Server/Dockerfile @@ -0,0 +1,45 @@ +FROM python:3.11-alpine + +LABEL org.label-schema.name="Eclipse BaSyx" \ + org.label-schema.version="1.0" \ + org.label-schema.description="Docker image for the basyx-python-sdk server application" \ + org.label-schema.maintainer="Eclipse BaSyx" + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# If we have more dependencies for the server it would make sense +# to refactor uswgi to the pyproject.toml +RUN apk update && \ + apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ + pip install uwsgi && \ + pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ + apk del git bash + + +COPY uwsgi.ini /etc/uwsgi/ +COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +RUN chmod +x /etc/supervisor/stop-supervisor.sh + +# Makes it possible to use a different configuration +ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini +# object stores aren't thread-safe yet +# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 +ENV UWSGI_CHEAPER=0 +ENV UWSGI_PROCESSES=1 +ENV NGINX_MAX_UPLOAD=1M +ENV NGINX_WORKER_PROCESSES=1 +ENV LISTEN_PORT=80 +ENV CLIENT_BODY_BUFFER_SIZE=1M + +# Copy the entrypoint that will generate Nginx additional configs +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +COPY ./app /app +WORKDIR /app + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Discovery Server/README.md b/Discovery Server/README.md new file mode 100644 index 000000000..0b0938167 --- /dev/null +++ b/Discovery Server/README.md @@ -0,0 +1,63 @@ +# Eclipse BaSyx Python SDK - Dicovery Service + +This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Discovery Service**. +It provides basic discovery functionality for AAS IDs and their corresponding assets, as specified in the official [Discovery Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/DiscoveryServiceSpecification/V3.1.0_SSP-001). + +## Overview + +The Discovery Service is a core component in the Asset Administration Shell ecosystem. Its main responsibility is to store and retrieve relations between AAS identifiers and asset identifiers. It acts as a lookup service for resolving asset-related queries to corresponding AAS. + +This implementation supports: + +- Adding links between AAS and assets +- Querying AAS by asset links +- Querying asset links by AAS ID +- Removing AAS-related asset links +- Configurable in-memory or MongoDB-based persistent storage + +## Features + +| Feature | Description | +|---------------------------------------------|-------------------------------------------------------| +| `add_asset_links` | Register specific asset ids linked to an AAS | +| `get_all_specific_asset_ids_by_aas_id` | Retrieve specific asset ids associated with an AAS | +| `search_aas_by_asset_link` | Find AAS identifiers by providing asset link values | +| `remove_asset_links_for_aas` | Delete all asset links associated with a specific AAS | + +## Specification Compliance + +- Complies with: **Discovery Service Specification v3.1.0_SSP-001** + +## Configuration + +The service can be configured to use either: + +- **In-memory storage** (default): Temporary data storage that resets on service restart. +- **MongoDB storage**: Persistent backend storage using MongoDB. + +### Configuration via Environment Variables + +| Variable | Description | Default | +|----------------|--------------------------------------------|-------------------------| +| `STORAGE_TYPE` | `inmemory` or `mongodb` | `inmemory` | +| `MONGODB_URI` | MongoDB connection URI | `mongodb://localhost:27017` | +| `MONGODB_DBNAME` | Name of the MongoDB database | `basyx_registry` | + +## Deployment via Docker + +A `Dockerfile` and `docker-compose.yml` are provided for simple deployment. + +## Acknowledgments + +This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. + +[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 +[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html +[3]: https://github.com/eclipse-basyx/basyx-python-sdk +[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 +[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 +[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces +[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx +[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html +[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html +[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/Discovery Server/app/main.py b/Discovery Server/app/main.py new file mode 100644 index 000000000..19c97b416 --- /dev/null +++ b/Discovery Server/app/main.py @@ -0,0 +1,25 @@ +import os +import sys +from basyx.aas.adapter.discovery import DiscoveryAPI, MongoDiscoveryStore,InMemoryDiscoveryStore + +storage_type = os.getenv("STORAGE_TYPE", "inmemory") +base_path = os.getenv("API_BASE_PATH") + +wsgi_optparams = {} + +if base_path is not None: + wsgi_optparams["base_path"] = base_path + +if storage_type == "inmemory": + application = DiscoveryAPI(InMemoryDiscoveryStore(), **wsgi_optparams) + +elif storage_type in "mongodb": + uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") + dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") + + application = DiscoveryAPI(MongoDiscoveryStore(uri,dbname), **wsgi_optparams) + +else: + print(f"STORAGE_TYPE must be either inmemory or mongodb! Current value: {storage_type}", + file=sys.stderr) + diff --git a/Discovery Server/compose.yml b/Discovery Server/compose.yml new file mode 100644 index 000000000..6e1d65404 --- /dev/null +++ b/Discovery Server/compose.yml @@ -0,0 +1,7 @@ +services: + app: + build: . + ports: + - "8084:80" + environment: + STORAGE_TYPE: inmemory diff --git a/Discovery Server/entrypoint.sh b/Discovery Server/entrypoint.sh new file mode 100644 index 000000000..722394409 --- /dev/null +++ b/Discovery Server/entrypoint.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env sh +set -e + +# Get the maximum upload file size for Nginx, default to 0: unlimited +USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} + +# Get the number of workers for Nginx, default to 1 +USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} + +# Set the max number of connections per worker for Nginx, if requested +# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below +NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} + +# Get the listen port for Nginx, default to 80 +USE_LISTEN_PORT=${LISTEN_PORT:-80} + +# Get the client_body_buffer_size for Nginx, default to 1M +USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} + +# Create the conf.d directory if it doesn't exist +if [ ! -d /etc/nginx/conf.d ]; then + mkdir -p /etc/nginx/conf.d +fi + +if [ -f /app/nginx.conf ]; then + cp /app/nginx.conf /etc/nginx/nginx.conf +else + content='user nginx;\n' + # Set the number of worker processes in Nginx + content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" + content=$content'error_log /var/log/nginx/error.log warn;\n' + content=$content'pid /var/run/nginx.pid;\n' + content=$content'events {\n' + content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" + content=$content'}\n' + content=$content'http {\n' + content=$content' include /etc/nginx/mime.types;\n' + content=$content' default_type application/octet-stream;\n' + content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" + content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" + content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" + content=$content' access_log /var/log/nginx/access.log main;\n' + content=$content' sendfile on;\n' + content=$content' keepalive_timeout 65;\n' + content=$content' include /etc/nginx/conf.d/*.conf;\n' + content=$content'}\n' + content=$content'daemon off;\n' + # Set the max number of open file descriptors for Nginx workers, if requested + if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then + content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" + fi + # Save generated /etc/nginx/nginx.conf + printf "$content" > /etc/nginx/nginx.conf + + content_server='server {\n' + content_server=$content_server" listen ${USE_LISTEN_PORT};\n" + content_server=$content_server' location / {\n' + content_server=$content_server' include uwsgi_params;\n' + content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' + content_server=$content_server' }\n' + content_server=$content_server'}\n' + # Save generated server /etc/nginx/conf.d/nginx.conf + printf "$content_server" > /etc/nginx/conf.d/nginx.conf + + # # Generate additional configuration + printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf + printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf + printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf +fi + +exec "$@" diff --git a/Discovery Server/stop-supervisor.sh b/Discovery Server/stop-supervisor.sh new file mode 100644 index 000000000..9a953c94b --- /dev/null +++ b/Discovery Server/stop-supervisor.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +printf "READY\n" + +while read line; do + echo "Processing Event: $line" >&2 + kill $PPID +done < /dev/stdin diff --git a/Discovery Server/supervisord.ini b/Discovery Server/supervisord.ini new file mode 100644 index 000000000..d73d98014 --- /dev/null +++ b/Discovery Server/supervisord.ini @@ -0,0 +1,27 @@ +[supervisord] +nodaemon=true + +[program:uwsgi] +command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[program:nginx] +command=/usr/sbin/nginx +stdout_logfile=/var/log/nginx.out.log +stdout_logfile_maxbytes=0 +stderr_logfile=/var/log/nginx.err.log +stderr_logfile_maxbytes=0 +stopsignal=QUIT +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[eventlistener:quit_on_failure] +events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL +command=/etc/supervisor/stop-supervisor.sh diff --git a/Discovery Server/uwsgi.ini b/Discovery Server/uwsgi.ini new file mode 100644 index 000000000..9c54ae1cc --- /dev/null +++ b/Discovery Server/uwsgi.ini @@ -0,0 +1,9 @@ +[uwsgi] +wsgi-file = /app/main.py +socket = /tmp/uwsgi.sock +chown-socket = nginx:nginx +chmod-socket = 664 +hook-master-start = unix_signal:15 gracefully_kill_them_all +need-app = true +die-on-term = true +show-config = false diff --git a/Registry Server/Dockerfile b/Registry Server/Dockerfile new file mode 100644 index 000000000..3d52a15ab --- /dev/null +++ b/Registry Server/Dockerfile @@ -0,0 +1,45 @@ +FROM python:3.11-alpine + +LABEL org.label-schema.name="Eclipse BaSyx" \ + org.label-schema.version="1.0" \ + org.label-schema.description="Docker image for the basyx-python-sdk server application" \ + org.label-schema.maintainer="Eclipse BaSyx" + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# If we have more dependencies for the server it would make sense +# to refactor uswgi to the pyproject.toml +RUN apk update && \ + apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ + pip install uwsgi && \ + pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ + apk del git bash + + +COPY uwsgi.ini /etc/uwsgi/ +COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +RUN chmod +x /etc/supervisor/stop-supervisor.sh + +# Makes it possible to use a different configuration +ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini +# object stores aren't thread-safe yet +# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 +ENV UWSGI_CHEAPER=0 +ENV UWSGI_PROCESSES=1 +ENV NGINX_MAX_UPLOAD=1M +ENV NGINX_WORKER_PROCESSES=1 +ENV LISTEN_PORT=80 +ENV CLIENT_BODY_BUFFER_SIZE=1M + +# Copy the entrypoint that will generate Nginx additional configs +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +COPY ../server/app /app +WORKDIR /app + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Registry Server/README.md b/Registry Server/README.md new file mode 100644 index 000000000..339226c53 --- /dev/null +++ b/Registry Server/README.md @@ -0,0 +1,97 @@ +# Eclipse BaSyx Python SDK - HTTP Server + +This package contains a Dockerfile to spin up an exemplary HTTP/REST server following the [Specification of the AAS Part 2 API][6] with ease. +The server currently implements the following interfaces: + +- [Asset Administration Shell Repository Service][4] +- [Submodel Repository Service][5] + +It uses the [HTTP API][1] and the [AASX][7], [JSON][8], and [XML][9] Adapters of the [BaSyx Python SDK][3], to serve regarding files from a given directory. +The files are only read, changes won't persist. + +Alternatively, the container can also be told to use the [Local-File Backend][2] instead, which stores AAS and Submodels as individual JSON files and allows for persistent changes (except supplementary files, i.e. files referenced by `File` submodel elements). +See [below](#options) on how to configure this. + +## Building +The container image can be built via: +``` +$ docker buildx build -t basyx-python-sdk-http-server . +``` + +## Running + +### Storage +The container needs to be provided with the directory `/storage` to store AAS and Submodel files: AASX, JSON, XML or JSON files of Local-File Backend. + +This directory can be mapped via the `-v` option from another image or a local directory. +To map the directory `storage` inside the container, `-v ./storage:/storage` can be used. +The directory `storage` will be created in the current working directory, if it doesn't already exist. + +### Port +The HTTP server inside the container listens on port 80 by default. +To expose it on the host on port 8080, use the option `-p 8080:80` when running it. + +### Options +The container can be configured via environment variables: +- `API_BASE_PATH` determines the base path under which all other API paths are made available. + Default: `/api/v3.0` +- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: + - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve AASX, JSON, XML files from the storage directory. + The files are not modified, all changes done via the API are only stored in memory. + - When instead set to `LOCAL_FILE`, the server makes use of the [LocalFileBackend][2], where AAS and Submodels are persistently stored as JSON files. + Supplementary files, i.e. files referenced by `File` submodel elements, are not stored in this case. +- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. + +### Running Examples + +Putting it all together, the container can be started via the following command: +``` +$ docker run -p 8080:80 -v ./storage:/storage basyx-python-sdk-http-server +``` + +Since Windows uses backslashes instead of forward slashes in paths, you'll have to adjust the path to the storage directory there: +``` +> docker run -p 8080:80 -v .\storage:/storage basyx-python-sdk-http-server +``` + +Per default, the server will use the `LOCAL_FILE_READ_ONLY` storage type and serve the API under `/api/v3.0` and read files from `/storage`. If you want to change this, you can do so like this: +``` +$ docker run -p 8080:80 -v ./storage2:/storage2 -e API_BASE_PATH=/api/v3.1 -e STORAGE_TYPE=LOCAL_FILE_BACKEND -e STORAGE_PATH=/storage2 basyx-python-sdk-http-server +``` + +## Building and running the image with docker-compose + +The container image can also be built and run via: +``` +$ docker compose up +``` + +This is the exemplary `docker-compose` file for the server: +````yaml +services: + app: + build: . + ports: + - "8080:80" + volumes: + - ./storage:/storage + +```` + +Here files are read from `/storage` and the server can be accessed at http://localhost:8080/api/v3.0/ from your host system. +To get a different setup this compose.yaml file can be adapted and expanded. + +## Acknowledgments + +This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. + +[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 +[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html +[3]: https://github.com/eclipse-basyx/basyx-python-sdk +[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 +[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 +[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces +[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx +[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html +[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html +[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/Registry Server/compose.yml b/Registry Server/compose.yml new file mode 100644 index 000000000..932422dbc --- /dev/null +++ b/Registry Server/compose.yml @@ -0,0 +1,7 @@ +services: + app: + build: . + ports: + - "8083:80" + volumes: + - ./storage:/storage diff --git a/Registry Server/entrypoint.sh b/Registry Server/entrypoint.sh new file mode 100644 index 000000000..722394409 --- /dev/null +++ b/Registry Server/entrypoint.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env sh +set -e + +# Get the maximum upload file size for Nginx, default to 0: unlimited +USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} + +# Get the number of workers for Nginx, default to 1 +USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} + +# Set the max number of connections per worker for Nginx, if requested +# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below +NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} + +# Get the listen port for Nginx, default to 80 +USE_LISTEN_PORT=${LISTEN_PORT:-80} + +# Get the client_body_buffer_size for Nginx, default to 1M +USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} + +# Create the conf.d directory if it doesn't exist +if [ ! -d /etc/nginx/conf.d ]; then + mkdir -p /etc/nginx/conf.d +fi + +if [ -f /app/nginx.conf ]; then + cp /app/nginx.conf /etc/nginx/nginx.conf +else + content='user nginx;\n' + # Set the number of worker processes in Nginx + content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" + content=$content'error_log /var/log/nginx/error.log warn;\n' + content=$content'pid /var/run/nginx.pid;\n' + content=$content'events {\n' + content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" + content=$content'}\n' + content=$content'http {\n' + content=$content' include /etc/nginx/mime.types;\n' + content=$content' default_type application/octet-stream;\n' + content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" + content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" + content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" + content=$content' access_log /var/log/nginx/access.log main;\n' + content=$content' sendfile on;\n' + content=$content' keepalive_timeout 65;\n' + content=$content' include /etc/nginx/conf.d/*.conf;\n' + content=$content'}\n' + content=$content'daemon off;\n' + # Set the max number of open file descriptors for Nginx workers, if requested + if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then + content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" + fi + # Save generated /etc/nginx/nginx.conf + printf "$content" > /etc/nginx/nginx.conf + + content_server='server {\n' + content_server=$content_server" listen ${USE_LISTEN_PORT};\n" + content_server=$content_server' location / {\n' + content_server=$content_server' include uwsgi_params;\n' + content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' + content_server=$content_server' }\n' + content_server=$content_server'}\n' + # Save generated server /etc/nginx/conf.d/nginx.conf + printf "$content_server" > /etc/nginx/conf.d/nginx.conf + + # # Generate additional configuration + printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf + printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf + printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf +fi + +exec "$@" diff --git a/Registry Server/stop-supervisor.sh b/Registry Server/stop-supervisor.sh new file mode 100644 index 000000000..9a953c94b --- /dev/null +++ b/Registry Server/stop-supervisor.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +printf "READY\n" + +while read line; do + echo "Processing Event: $line" >&2 + kill $PPID +done < /dev/stdin diff --git a/Registry Server/supervisord.ini b/Registry Server/supervisord.ini new file mode 100644 index 000000000..d73d98014 --- /dev/null +++ b/Registry Server/supervisord.ini @@ -0,0 +1,27 @@ +[supervisord] +nodaemon=true + +[program:uwsgi] +command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[program:nginx] +command=/usr/sbin/nginx +stdout_logfile=/var/log/nginx.out.log +stdout_logfile_maxbytes=0 +stderr_logfile=/var/log/nginx.err.log +stderr_logfile_maxbytes=0 +stopsignal=QUIT +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[eventlistener:quit_on_failure] +events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL +command=/etc/supervisor/stop-supervisor.sh diff --git a/Registry Server/uwsgi.ini b/Registry Server/uwsgi.ini new file mode 100644 index 000000000..9c54ae1cc --- /dev/null +++ b/Registry Server/uwsgi.ini @@ -0,0 +1,9 @@ +[uwsgi] +wsgi-file = /app/main.py +socket = /tmp/uwsgi.sock +chown-socket = nginx:nginx +chmod-socket = 664 +hook-master-start = unix_signal:15 gracefully_kill_them_all +need-app = true +die-on-term = true +show-config = false diff --git a/server/app/adapter/__init__.py b/server/app/adapter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py new file mode 100644 index 000000000..cd5f01a76 --- /dev/null +++ b/server/app/adapter/jsonization.py @@ -0,0 +1,332 @@ +from typing import Dict, Set, Optional, Type + +import server.app.model as server_model +from basyx.aas import model +from basyx.aas.adapter import _generic +from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO +from basyx.aas.adapter.json import AASToJsonEncoder +from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES, \ + read_aas_json_file_into + +import logging +from typing import Callable + +logger = logging.getLogger(__name__) + +JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES + ( + ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), + ('submodelDescriptors', server_model.SubmodelDescriptor) +) + + +class ServerAASFromJsonDecoder(AASFromJsonDecoder): + @classmethod + def _get_aas_class_parsers(cls) -> Dict[str, Callable[[Dict[str, object]], object]]: + aas_class_parsers = super()._get_aas_class_parsers() + aas_class_parsers.update({ + 'AssetAdministrationShellDescriptor': cls._construct_asset_administration_shell_descriptor, + 'SubmodelDescriptor': cls._construct_submodel_descriptor, + 'AssetLink': cls._construct_asset_link, + 'ProtocolInformation': cls._construct_protocol_information, + 'Endpoint': cls._construct_endpoint + }) + return aas_class_parsers + + # ################################################################################################## + # Utility Methods used in constructor methods to add general attributes (from abstract base classes) + # ################################################################################################## + + @classmethod + def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None: + super()._amend_abstract_attributes(obj, dct) + + if isinstance(obj, server_model.Descriptor): + if 'description' in dct: + obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), + model.MultiLanguageTextType) + if 'displayName' in dct: + obj.display_name = cls._construct_lang_string_set(_get_ts(dct, 'displayName', list), + model.MultiLanguageNameType) + if 'extensions' in dct: + for extension in _get_ts(dct, 'extensions', list): + obj.extension.add(cls._construct_extension(extension)) + + @classmethod + def _construct_asset_administration_shell_descriptor( + cls, dct: Dict[str, object], + object_class=server_model.AssetAdministrationShellDescriptor) -> server_model.AssetAdministrationShellDescriptor: + ret = object_class(id_=_get_ts(dct, 'id', str)) + cls._amend_abstract_attributes(ret, dct) + if 'administration' in dct: + ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) + if 'assetKind' in dct: + ret.asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] + if 'assetType' in dct: + ret.asset_type = _get_ts(dct, 'assetType', str) + global_asset_id = None + if 'globalAssetId' in dct: + ret.global_asset_id = _get_ts(dct, 'globalAssetId', str) + specific_asset_id = set() + if 'specificAssetIds' in dct: + for desc_data in _get_ts(dct, "specificAssetIds", list): + specific_asset_id.add(cls._construct_specific_asset_id(desc_data, model.SpecificAssetId)) + if 'endpoints' in dct: + for endpoint_dct in _get_ts(dct, 'endpoints', list): + if 'protocolInformation' in endpoint_dct: + ret.endpoints.append( + cls._construct_endpoint(endpoint_dct, + server_model.Endpoint)) + elif 'href' in endpoint_dct: + protocol_info = server_model.ProtocolInformation( + href=_get_ts(endpoint_dct['href'], 'href', str), + endpoint_protocol=_get_ts(endpoint_dct['href'], + 'endpointProtocol', + str) if 'endpointProtocol' in + endpoint_dct[ + 'href'] else None, + endpoint_protocol_version=_get_ts( + endpoint_dct['href'], + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in + endpoint_dct['href'] else None + ) + ret.endpoints.append(server_model.Endpoint( + protocol_information=protocol_info, + interface=_get_ts(endpoint_dct, 'interface', + str))) + if 'idShort' in dct: + ret.id_short = _get_ts(dct, 'idShort', str) + if 'submodelDescriptors' in dct: + ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), + server_model.SubmodelDescriptor) + return ret + + @classmethod + def _construct_protocol_information(cls, dct: Dict[str, object], + object_class=server_model.ProtocolInformation) -> server_model.ProtocolInformation: + ret = object_class( + href=_get_ts(dct, 'href', str), + endpoint_protocol=_get_ts(dct, 'endpointProtocol', + str) if 'endpointProtocol' in dct else None, + endpoint_protocol_version=_get_ts(dct, + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in dct else None, + subprotocol=_get_ts(dct, 'subprotocol', + str) if 'subprotocol' in dct else None, + subprotocol_body=_get_ts(dct, 'subprotocolBody', + str) if 'subprotocolBody' in dct else None, + subprotocol_body_encoding=_get_ts(dct, + 'subprotocolBodyEncoding', + str) if 'subprotocolBodyEncoding' in dct else None + ) + return ret + + @classmethod + def _construct_endpoint(cls, dct: Dict[str, object], + object_class=server_model.Endpoint) -> server_model.Endpoint: + ret = object_class( + protocol_information=cls._construct_protocol_information( + _get_ts(dct, 'protocolInformation', dict), + server_model.ProtocolInformation + ), + interface=_get_ts(dct, 'interface', + str) + ) + cls._amend_abstract_attributes(ret, dct) + return ret + + @classmethod + def _construct_submodel_descriptor( + cls, dct: Dict[str, object], + object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: + ret = object_class(id_=_get_ts(dct, 'id', str), + endpoints=[]) + cls._amend_abstract_attributes(ret, dct) + for endpoint_dct in _get_ts(dct, 'endpoints', list): + if 'protocolInformation' in endpoint_dct: + ret.endpoints.append( + cls._construct_endpoint(endpoint_dct, + server_model.Endpoint)) + elif 'href' in endpoint_dct: + protocol_info = server_model.ProtocolInformation( + href=_get_ts(endpoint_dct['href'], 'href', str), + endpoint_protocol=_get_ts(endpoint_dct['href'], + 'endpointProtocol', + str) if 'endpointProtocol' in + endpoint_dct[ + 'href'] else None, + endpoint_protocol_version=_get_ts( + endpoint_dct['href'], + 'endpointProtocolVersion', + list) if 'endpointProtocolVersion' in + endpoint_dct['href'] else None + ) + ret.endpoints.append(server_model.Endpoint( + protocol_information=protocol_info, + interface=_get_ts(endpoint_dct, 'interface', + str))) + if 'administration' in dct: + ret.administration = cls._construct_administrative_information( + _get_ts(dct, 'administration', dict)) + if 'idShort' in dct: + ret.id_short = _get_ts(dct, 'idShort', str) + if 'semanticId' in dct: + ret.semantic_id = cls._construct_reference(_get_ts(dct, 'semanticId', dict)) + if 'supplementalSemanticIds' in dct: + for ref in _get_ts(dct, 'supplementalSemanticIds', list): + ret.supplemental_semantic_id.append(cls._construct_reference(ref)) + return ret + + @classmethod + def _construct_asset_link( + cls, dct: Dict[str, object], object_class=server_model.AssetLink) -> server_model.AssetLink: + ret = object_class(name=_get_ts(dct, 'name', str), + value=_get_ts(dct, 'value', str)) + return ret + + +class ServerStrictAASFromJsonDecoder(ServerAASFromJsonDecoder): + """ + A strict version of the AASFromJsonDecoder class for deserializing Asset Administration Shell data from the + official JSON format + + This version has set ``failsafe = False``, which will lead to Exceptions raised for every missing attribute or wrong + object type. + """ + failsafe = False + + +class ServerStrippedAASFromJsonDecoder(ServerAASFromJsonDecoder): + """ + Decoder for stripped JSON objects. Used in the HTTP adapter. + """ + stripped = True + + +class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, ServerStrippedAASFromJsonDecoder): + """ + Non-failsafe decoder for stripped JSON objects. + """ + pass + + +def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, + replace_existing: bool = False, + ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, + decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: + return read_aas_json_file_into(object_store=object_store, file=file, replace_existing=replace_existing, + ignore_existing=ignore_existing, failsafe=failsafe, stripped=stripped, + decoder=decoder, keys_to_types=JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES) + + +class ServerAASToJsonEncoder(AASToJsonEncoder): + + @classmethod + def _get_aas_class_serializers(cls) -> Dict[Type, Callable]: + serializers = super()._get_aas_class_serializers() + serializers.update({ + server_model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, + server_model.SubmodelDescriptor: cls._submodel_descriptor_to_json, + server_model.Endpoint: cls._endpoint_to_json, + server_model.ProtocolInformation: cls._protocol_information_to_json, + server_model.AssetLink: cls._asset_link_to_json + }) + return serializers + + @classmethod + def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: + data: Dict[str, object] = super()._abstract_classes_to_json(obj) + if isinstance(obj, server_model.Descriptor): + if obj.description: + data['description'] = obj.description + if obj.display_name: + data['displayName'] = obj.display_name + if obj.extension: + data['extensions'] = list(obj.extension) + return data + + @classmethod + def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> \ + Dict[str, object]: + """ + serialization of an object from class AssetAdministrationShell to json + + :param obj: object of class AssetAdministrationShell + :return: dict with the serialized attributes of this object + """ + data = cls._abstract_classes_to_json(obj) + data.update(cls._namespace_to_json(obj)) + data['id'] = obj.id + if obj.administration: + data['administration'] = obj.administration + if obj.asset_kind: + data['assetKind'] = _generic.ASSET_KIND[obj.asset_kind] + if obj.asset_type: + data['assetType'] = obj.asset_type + if obj.global_asset_id: + data['globalAssetId'] = obj.global_asset_id + if obj.specific_asset_id: + data['specificAssetIds'] = list(obj.specific_asset_id) + if obj.endpoints: + data['endpoints'] = list(obj.endpoints) + if obj.id_short: + data['idShort'] = obj.id_short + if obj.submodel_descriptors: + data['submodelDescriptors'] = list(obj.submodel_descriptors) + return data + + @classmethod + def _protocol_information_to_json(cls, + obj: server_model.ProtocolInformation) -> \ + Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + + data['href'] = obj.href + if obj.endpoint_protocol: + data['endpointProtocol'] = obj.endpoint_protocol + if obj.endpoint_protocol_version: + data['endpointProtocolVersion'] = obj.endpoint_protocol_version + if obj.subprotocol: + data['subprotocol'] = obj.subprotocol + if obj.subprotocol_body: + data['subprotocolBody'] = obj.subprotocol_body + if obj.subprotocol_body_encoding: + data['subprotocolBodyEncoding'] = obj.subprotocol_body_encoding + return data + + @classmethod + def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + data['protocolInformation'] = cls._protocol_information_to_json( + obj.protocol_information) + data['interface'] = obj.interface + return data + + @classmethod + def _submodel_descriptor_to_json(cls, obj: server_model.SubmodelDescriptor) -> Dict[str, object]: + """ + serialization of an object from class Submodel to json + + :param obj: object of class Submodel + :return: dict with the serialized attributes of this object + """ + data = cls._abstract_classes_to_json(obj) + data['id'] = obj.id + data['endpoints'] = [cls._endpoint_to_json(ep) for ep in + obj.endpoints] + if obj.id_short: + data['idShort'] = obj.id_short + if obj.administration: + data['administration'] = obj.administration + if obj.semantic_id: + data['semanticId'] = obj.semantic_id + if obj.supplemental_semantic_id: + data['supplementalSemanticIds'] = list(obj.supplemental_semantic_id) + return data + + @classmethod + def _asset_link_to_json(cls, obj: server_model.AssetLink) -> Dict[str, object]: + data = cls._abstract_classes_to_json(obj) + data['name'] = obj.name + data['value'] = obj.value + return data diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index ae5bb6506..04100051e 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -22,9 +22,11 @@ from basyx.aas import model from basyx.aas.adapter._generic import XML_NS_MAP -from basyx.aas.adapter.json import StrictStrippedAASFromJsonDecoder, StrictAASFromJsonDecoder, AASToJsonEncoder from basyx.aas.adapter.xml import xml_serialization, XMLConstructables, read_aas_xml_element from basyx.aas.model import AbstractObjectStore +from server.app import model as server_model +from server.app.adapter.jsonization import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, \ + ServerStrictStrippedAASFromJsonDecoder from server.app.util.converters import base64url_decode @@ -159,7 +161,7 @@ def __init__(self, *args, content_type="text/xml", **kwargs): super().__init__(*args, **kwargs, content_type=content_type) -class ResultToJsonEncoder(AASToJsonEncoder): +class ResultToJsonEncoder(ServerAASToJsonEncoder): @classmethod def _result_to_json(cls, result: Result) -> Dict[str, object]: return { @@ -292,7 +294,12 @@ class HTTPApiDecoder: @classmethod def check_type_support(cls, type_: type): - if type_ not in cls.type_constructables_map: + tolerated_types = ( + server_model.AssetAdministrationShellDescriptor, + server_model.SubmodelDescriptor, + server_model.AssetLink, + ) + if type_ not in cls.type_constructables_map and type_ not in tolerated_types: raise TypeError(f"Parsing {type_} is not supported!") @classmethod @@ -304,8 +311,8 @@ def assert_type(cls, obj: object, type_: Type[T]) -> T: @classmethod def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: cls.check_type_support(expect_type) - decoder: Type[StrictAASFromJsonDecoder] = StrictStrippedAASFromJsonDecoder if stripped \ - else StrictAASFromJsonDecoder + decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ + else ServerStrictAASFromJsonDecoder try: parsed = json.loads(data, cls=decoder) if isinstance(parsed, list) and expect_single: @@ -324,6 +331,10 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool model.SpecificAssetId: decoder._construct_specific_asset_id, # type: ignore[assignment] model.Reference: decoder._construct_reference, # type: ignore[assignment] model.Qualifier: decoder._construct_qualifier, # type: ignore[assignment] + server_model.AssetAdministrationShellDescriptor: + decoder._construct_asset_administration_shell_descriptor, # type: ignore[assignment] + server_model.SubmodelDescriptor: decoder._construct_submodel_descriptor, # type: ignore[assignment] + server_model.AssetLink: decoder._construct_asset_link, # type: ignore[assignment] } constructor: Optional[Callable[..., T]] = mapping.get(expect_type) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py new file mode 100644 index 000000000..b08448b06 --- /dev/null +++ b/server/app/interfaces/discovery.py @@ -0,0 +1,215 @@ +""" +This module implements the Discovery interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. +""" + +import abc +import json +from typing import Dict, List, Set, Any + +import werkzeug.exceptions +from pymongo import MongoClient +from pymongo.collection import Collection +from werkzeug.routing import Rule, Submount +from werkzeug.wrappers import Request, Response + +from basyx.aas import model +from server.app.util.converters import Base64URLConverter +from server.app.interfaces.base import BaseWSGIApp, HTTPApiDecoder +from .. import model as server_model +from ..adapter.jsonization import ServerAASToJsonEncoder + +encoder=ServerAASToJsonEncoder() + +class AbstractDiscoveryStore(metaclass=abc.ABCMeta): + aas_id_to_asset_ids: Any + asset_id_to_aas_ids: Any + + @abc.abstractmethod + def __init__(self): + pass + + @abc.abstractmethod + def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: + pass + + @abc.abstractmethod + def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: + pass + + @abc.abstractmethod + def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: + pass + + @abc.abstractmethod + def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: + pass + + @abc.abstractmethod + def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: + pass + + @abc.abstractmethod + def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + pass + + + +class InMemoryDiscoveryStore(AbstractDiscoveryStore): + def __init__(self): + self.aas_id_to_asset_ids: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} + self.asset_id_to_aas_ids: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} + + def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: + return list(self.aas_id_to_asset_ids.get(aas_id, set())) + + def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, + asset_ids: List[model.SpecificAssetId]) -> None: + serialized_assets = [encoder.default(asset_id) for asset_id in asset_ids] + if aas_id in self.aas_id_to_asset_ids: + for asset in serialized_assets: + if asset not in self.aas_id_to_asset_ids[aas_id]: + self.aas_id_to_asset_ids[aas_id].append(asset) + else: + self.aas_id_to_asset_ids[aas_id] = serialized_assets[:] + + def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: + key = aas_id + if key in self.aas_id_to_asset_ids: + del self.aas_id_to_asset_ids[key] + + def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: + result = [] + for asset_key, aas_ids in self.asset_id_to_aas_ids.items(): + expected_key = f"{asset_link.name}:{asset_link.value}" + if asset_key == expected_key: + result.extend(list(aas_ids)) + return result + + def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + asset_key = f"{asset_id.name}:{asset_id.value}" + if asset_key in self.asset_id_to_aas_ids: + self.asset_id_to_aas_ids[asset_key].add(aas_id) + else: + self.asset_id_to_aas_ids[asset_key] = {aas_id} + + def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + asset_key = f"{asset_id.name}:{asset_id.value}" + if asset_key in self.asset_id_to_aas_ids: + self.asset_id_to_aas_ids[asset_key].discard(aas_id) + + +class MongoDiscoveryStore(AbstractDiscoveryStore): + def __init__(self, + uri: str = "mongodb://localhost:27017", + db_name: str = "basyx", + coll_aas_to_assets: str = "aas_to_assets", + coll_asset_to_aas: str = "asset_to_aas"): + self.client = MongoClient(uri) + self.db = self.client[db_name] + self.coll_aas_to_assets: Collection = self.db[coll_aas_to_assets] + self.coll_asset_to_aas: Collection = self.db[coll_asset_to_aas] + # Create an index for fast asset reverse lookups. + self.coll_asset_to_aas.create_index("_id") + + def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: + key = aas_id + doc = self.coll_aas_to_assets.find_one({"_id": key}) + return doc["asset_ids"] if doc and "asset_ids" in doc else [] + + def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: + key = aas_id + # Convert each SpecificAssetId using the serialization helper. + serializable_assets = [encoder.default(asset_id) for asset_id in asset_ids] + self.coll_aas_to_assets.update_one( + {"_id": key}, + {"$addToSet": {"asset_ids": {"$each": serializable_assets}}}, + upsert=True + ) + + def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: + key = aas_id + self.coll_aas_to_assets.delete_one({"_id": key}) + + def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: + # Query MongoDB for specificAssetIds where 'name' and 'value' match + doc = self.coll_asset_to_aas.find_one({ + "name": asset_link.name, + "value": asset_link.value + }) + return doc["aas_ids"] if doc and "aas_ids" in doc else [] + + def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + asset_key = str(encoder.default(asset_id)) + self.coll_asset_to_aas.update_one( + {"_id": asset_key}, + {"$addToSet": {"aas_ids": aas_id}}, + upsert=True + ) + + def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: + asset_key = str(encoder.default(asset_id)) + self.coll_asset_to_aas.update_one( + {"_id": asset_key}, + {"$pull": {"aas_ids": aas_id}} + ) + + +class DiscoveryAPI(BaseWSGIApp): + def __init__(self, + persistent_store: AbstractDiscoveryStore, base_path: str = "/api/v3.0"): + self.persistent_store: AbstractDiscoveryStore = persistent_store + self.url_map = werkzeug.routing.Map([ + Submount(base_path, [ + Rule("/lookup/shellsByAssetLink", methods=["POST"], + endpoint=self.search_all_aas_ids_by_asset_link), + Submount("/lookup/shells", [ + Rule("/", methods=["GET"], + endpoint=self.get_all_specific_asset_ids_by_aas_id), + Rule("/", methods=["POST"], + endpoint=self.post_all_asset_links_by_id), + Rule("/", methods=["DELETE"], + endpoint=self.delete_all_asset_links_by_id), + ]), + ]) + ], converters={ + "base64url": Base64URLConverter + }, strict_slashes=False) + + def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, + **_kwargs) -> Response: + asset_links = HTTPApiDecoder.request_body_list(request, server_model.AssetLink, False) + matching_aas_keys = set() + for asset_link in asset_links: + aas_keys = self.persistent_store.search_aas_ids_by_asset_link(asset_link) + matching_aas_keys.update(aas_keys) + matching_aas_keys = list(matching_aas_keys) + paginated_slice, cursor = self._get_slice(request, matching_aas_keys) + return response_t(list(paginated_slice), cursor=cursor) + + def get_all_specific_asset_ids_by_aas_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + aas_identifier = url_args.get("aas_id") + asset_ids = self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier) + return response_t(asset_ids) + + def post_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + aas_identifier = url_args.get("aas_id") + specific_asset_ids = HTTPApiDecoder.request_body_list(request, model.SpecificAssetId, False) + self.persistent_store.add_specific_asset_ids_to_aas(aas_identifier, specific_asset_ids) + for asset_id in specific_asset_ids: + self.persistent_store._add_aas_id_to_specific_asset_id(asset_id, aas_identifier) + updated = {aas_identifier: self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier)} + return response_t(updated) + + def delete_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + aas_identifier = url_args.get("aas_id") + self.persistent_store.delete_specific_asset_ids_by_aas_id(aas_identifier) + for key in list(self.persistent_store.asset_id_to_aas_ids.keys()): + self.persistent_store.asset_id_to_aas_ids[key].discard(aas_identifier) + return response_t() + + +if __name__ == "__main__": + from werkzeug.serving import run_simple + + run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), + use_debugger=True, use_reloader=True) diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py new file mode 100644 index 000000000..f33ab1651 --- /dev/null +++ b/server/app/interfaces/registry.py @@ -0,0 +1,280 @@ +""" +This module implements the Registry interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. +""" + +from typing import Dict, Iterator, List, Type, Tuple + +import werkzeug.exceptions +import werkzeug.routing +import werkzeug.urls +import werkzeug.utils +from werkzeug.exceptions import Conflict, NotFound +from werkzeug.routing import MapAdapter, Rule, Submount +from werkzeug.wrappers import Request, Response + +import server.app.model as server_model +from basyx.aas import model +from server.app.util.converters import Base64URLConverter +from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder + + +class RegistryAPI(ObjectStoreWSGIApp): + def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.0"): + self.object_store: model.AbstractObjectStore = object_store + self.url_map = werkzeug.routing.Map([ + Submount(base_path, [ + Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_all_aas_descriptors), + Rule("/shell-descriptors", methods=["POST"], endpoint=self.post_aas_descriptor), + Submount("/shell-descriptors", [ + Rule("/", methods=["GET"], endpoint=self.get_aas_descriptor_by_id), + Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor_by_id), + Rule("/", methods=["DELETE"], endpoint=self.delete_aas_descriptor_by_id), + Submount("/", [ + Rule("/submodel-descriptors", methods=["GET"], + endpoint=self.get_all_submodel_descriptors_through_superpath), + Rule("/submodel-descriptors", methods=["POST"], + endpoint=self.post_submodel_descriptor_through_superpath), + Submount("/submodel-descriptors", [ + Rule("/", methods=["GET"], + endpoint=self.get_submodel_descriptor_by_id_through_superpath), + Rule("/", methods=["PUT"], + endpoint=self.put_submodel_descriptor_by_id_through_superpath), + Rule("/", methods=["DELETE"], + endpoint=self.delete_submodel_descriptor_by_id_through_superpath), + ]) + ]) + ]), + Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors), + Rule("/submodel-descriptors", methods=["POST"], endpoint=self.post_submodel_descriptor), + Submount("/submodel-descriptors", [ + Rule("/", methods=["GET"], endpoint=self.get_submodel_descriptor_by_id), + Rule("/", methods=["PUT"], endpoint=self.put_submodel_descriptor_by_id), + Rule("/", methods=["DELETE"], + endpoint=self.delete_submodel_descriptor_by_id), + ]) + ]) + ], converters={ + "base64url": Base64URLConverter + }, strict_slashes=False) + + def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ + Iterator[server_model.AssetAdministrationShellDescriptor], int]: + + descriptors: Iterator[server_model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( + server_model.AssetAdministrationShellDescriptor + ) + + id_short = request.args.get("idShort") + if id_short is not None: + descriptors = filter(lambda desc: desc.id_short == id_short, descriptors) + + asset_ids = request.args.getlist("assetIds") + if asset_ids is not None: + # Decode and instantiate SpecificAssetIds + specific_asset_ids: List[model.SpecificAssetId] = list( + map(lambda asset_id: HTTPApiDecoder.base64url_json(asset_id, model.SpecificAssetId, False), asset_ids) + ) + # Filter AAS based on these SpecificAssetIds + descriptors = filter( + lambda desc: all(specific_asset_id in desc.specific_asset_id + for specific_asset_id in specific_asset_ids), + descriptors + ) + + paginated_descriptors, end_index = self._get_slice(request, descriptors) + return paginated_descriptors, end_index + + def _get_aas_descriptor(self, url_args: Dict) -> server_model.AssetAdministrationShellDescriptor: + return self._get_obj_ts(url_args["aas_id"], server_model.AssetAdministrationShellDescriptor) + + def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: + submodel_descriptors: Iterator[server_model.SubmodelDescriptor] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) + id_short = request.args.get("idShort") + if id_short is not None: + submodel_descriptors = filter(lambda sm: sm.id_short == id_short, submodel_descriptors) + semantic_id = request.args.get("semanticId") + if semantic_id is not None: + spec_semantic_id = HTTPApiDecoder.base64url_json( + semantic_id, model.Reference, False) # type: ignore[type-abstract] + submodel_descriptors = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodel_descriptors) + paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) + return paginated_submodel_descriptors, end_index + + def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescriptor: + return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) + + # ------ AAS REGISTRY ROUTES ------- + def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + aas_descriptors, cursor = self._get_all_aas_descriptors(request) + return response_t(list(aas_descriptors), cursor=cursor) + + def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + map_adapter: MapAdapter) -> Response: + descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) + try: + self.object_store.add(descriptor) + except KeyError as e: + raise Conflict(f"AssetAdministrationShellDescriptor with Identifier {descriptor.id} already exists!") from e + descriptor.commit() + created_resource_url = map_adapter.build(self.get_aas_descriptor_by_id, { + "aas_id": descriptor.id + }, force_external=True) + return response_t(descriptor, status=201, headers={"Location": created_resource_url}) + + def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + descriptor = self._get_aas_descriptor(url_args) + return response_t(descriptor) + + def put_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + descriptor = self._get_aas_descriptor(url_args) + descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, + is_stripped_request(request))) + descriptor.commit() + return response_t() + + def delete_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + descriptor = self._get_aas_descriptor(url_args) + self.object_store.remove(descriptor) + return response_t() + + def get_all_submodel_descriptors_through_superpath(self, + request: Request, + url_args: Dict, + response_t: Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_aas_descriptor(url_args) + submodel_descriptors, cursor = self._get_slice(request, + aas_descriptor.submodel_descriptors) + return response_t(list(submodel_descriptors), cursor=cursor) + + def get_submodel_descriptor_by_id_through_superpath(self, + request: Request, + url_args: Dict, + response_t: + Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_aas_descriptor(url_args) + submodel_id = url_args["submodel_id"] + submodel_descriptor = next( + (sd for sd in aas_descriptor.submodel_descriptors if + sd.id == submodel_id), None) + if submodel_descriptor is None: + raise NotFound( + f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + return response_t(submodel_descriptor) + + def post_submodel_descriptor_through_superpath(self, + request: Request, + url_args: Dict, + response_t: Type[ + APIResponse], + map_adapter: MapAdapter) -> Response: + aas_descriptor = self._get_aas_descriptor(url_args) + submodel_descriptor = HTTPApiDecoder.request_body(request, + server_model.SubmodelDescriptor, + is_stripped_request( + request)) + if any(sd.id == submodel_descriptor.id for sd in + aas_descriptor.submodel_descriptors): + raise Conflict( + f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") + aas_descriptor.submodel_descriptors.append(submodel_descriptor) + aas_descriptor.commit() + created_resource_url = map_adapter.build( + self.get_submodel_descriptor_by_id_through_superpath, { + "aas_id": aas_descriptor.id, + "submodel_id": submodel_descriptor.id + }, force_external=True) + return response_t(submodel_descriptor, status=201, + headers={"Location": created_resource_url}) + + def put_submodel_descriptor_by_id_through_superpath(self, + request: Request, + url_args: Dict, + response_t: + Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_aas_descriptor(url_args) + submodel_id = url_args["submodel_id"] + submodel_descriptor = next( + (sd for sd in aas_descriptor.submodel_descriptors if + sd.id == submodel_id), None) + if submodel_descriptor is None: + raise NotFound( + f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + submodel_descriptor.update_from( + HTTPApiDecoder.request_body(request, + server_model.SubmodelDescriptor, + is_stripped_request(request))) + aas_descriptor.commit() + return response_t() + + def delete_submodel_descriptor_by_id_through_superpath(self, + request: Request, + url_args: Dict, + response_t: + Type[ + APIResponse], + **_kwargs) -> Response: + aas_descriptor = self._get_aas_descriptor(url_args) + submodel_id = url_args["submodel_id"] + submodel_descriptor = next( + (sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) + if submodel_descriptor is None: + raise NotFound(f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + aas_descriptor.submodel_descriptors.remove(submodel_descriptor) + aas_descriptor.commit() + return response_t() + + # ------ Submodel REGISTRY ROUTES ------- + def get_all_submodel_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + submodel_descriptors, cursor = self._get_all_submodel_descriptors(request) + return response_t(list(submodel_descriptors), cursor=cursor, stripped=is_stripped_request(request)) + + def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + submodel_descriptor = self._get_submodel_descriptor(url_args) + return response_t(submodel_descriptor, stripped=is_stripped_request(request)) + + def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + map_adapter: MapAdapter) -> Response: + submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, + is_stripped_request(request)) + try: + self.object_store.add(submodel_descriptor) + except KeyError as e: + raise Conflict(f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") from e + submodel_descriptor.commit() + created_resource_url = map_adapter.build(self.get_submodel_descriptor_by_id, { + "submodel_id": submodel_descriptor.id + }, force_external=True) + return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) + + def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + submodel_descriptor = self._get_submodel_descriptor(url_args) + submodel_descriptor.update_from( + HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) + submodel_descriptor.commit() + return response_t() + + def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor)) + return response_t() + + +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8083, RegistryAPI(create_full_example()), + use_debugger=True, use_reloader=True) diff --git a/server/app/model/__init__.py b/server/app/model/__init__.py new file mode 100644 index 000000000..5736b5492 --- /dev/null +++ b/server/app/model/__init__.py @@ -0,0 +1,2 @@ +from .descriptor import * +from .endpoint import * diff --git a/server/app/model/descriptor.py b/server/app/model/descriptor.py new file mode 100644 index 000000000..38276cd2d --- /dev/null +++ b/server/app/model/descriptor.py @@ -0,0 +1,109 @@ +from __future__ import absolute_import + +import abc +from typing import Optional, Iterable, List + +from basyx.aas import model +from server.app.model.endpoint import Endpoint + + +class Descriptor(model.HasExtension, metaclass=abc.ABCMeta): + @abc.abstractmethod + def __init__(self, description: Optional[model.MultiLanguageTextType] = None, + display_name: Optional[model.MultiLanguageNameType] = None, extension: Iterable[model.Extension] = ()): + super().__init__() + self.description: Optional[model.MultiLanguageTextType] = description + self.display_name: Optional[model.MultiLanguageNameType] = display_name + self.extension = model.NamespaceSet(self, [("name", True)], extension) + + def commit(self): + pass + + def update(self): + pass + + def update_from(self, other: "Descriptor", update_source: bool = False): + """ + Updates the descriptor's attributes from another descriptor. + + :param other: The descriptor to update from. + :param update_source: Placeholder for compatibility; not used in this context. + """ + for attr in vars(other): + if attr == "id": + continue # Skip updating the unique identifier of the AAS + setattr(self, attr, getattr(other, attr)) + + +class SubmodelDescriptor(Descriptor): + + def __init__(self, id_: model.Identifier, endpoints: List[Endpoint], + administration: Optional[model.AdministrativeInformation] = None, + id_short: Optional[model.NameType] = None, semantic_id: Optional[model.Reference] = None, + supplemental_semantic_id: Iterable[model.Reference] = ()): + super().__init__() + self.id: model.Identifier = id_ + self.endpoints: List[Endpoint] = endpoints + self.administration: Optional[model.AdministrativeInformation] = administration + self.id_short: Optional[model.NameType] = id_short + self.semantic_id: Optional[model.Reference] = semantic_id + self.supplemental_semantic_id: model.ConstrainedList[model.Reference] = \ + model.ConstrainedList(supplemental_semantic_id) + + +class AssetAdministrationShellDescriptor(Descriptor): + + def __init__(self, + id_: model.Identifier, + administration: Optional[model.AdministrativeInformation] = None, + asset_kind: Optional[model.AssetKind] = None, + asset_type: Optional[model.Identifier] = None, + endpoints: Optional[List[Endpoint]] = None, + global_asset_id: Optional[model.Identifier] = None, + id_short: Optional[model.NameType] = None, + specific_asset_id: Iterable[model.SpecificAssetId] = (), + submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, + description: Optional[model.MultiLanguageTextType] = None, + display_name: Optional[model.MultiLanguageNameType] = None, + extension: Iterable[model.Extension] = ()): + """AssetAdministrationShellDescriptor - + + Nur das 'id'-Feld (id_) ist zwingend erforderlich. Alle anderen Felder erhalten Defaultwerte. + """ + super().__init__() + self.administration: Optional[model.AdministrativeInformation] = administration + self.asset_kind: Optional[model.AssetKind] = asset_kind + self.asset_type: Optional[model.Identifier] = asset_type + self.endpoints: Optional[ + List[Endpoint]] = endpoints if endpoints is not None else [] # leere Liste, falls nicht gesetzt + self.global_asset_id: Optional[model.Identifier] = global_asset_id + self.id_short: Optional[model.NameType] = id_short + self.id: model.Identifier = id_ + self._specific_asset_id: model.ConstrainedList[model.SpecificAssetId] = model.ConstrainedList( + specific_asset_id, + item_set_hook=self._check_constraint_set_spec_asset_id, + item_del_hook=self._check_constraint_del_spec_asset_id + ) + self.submodel_descriptors = submodel_descriptors if submodel_descriptors is not None else [] + self.description: Optional[model.MultiLanguageTextType] = description + self.display_name: Optional[model.MultiLanguageNameType] = display_name + self.extension = model.NamespaceSet(self, [("name", True)], extension) + + @property + def specific_asset_id(self) -> model.ConstrainedList[model.SpecificAssetId]: + return self._specific_asset_id + + @specific_asset_id.setter + def specific_asset_id(self, specific_asset_id: Iterable[model.SpecificAssetId]) -> None: + # constraints are checked via _check_constraint_set_spec_asset_id() in this case + self._specific_asset_id[:] = specific_asset_id + + def _check_constraint_set_spec_asset_id(self, items_to_replace: List[model.SpecificAssetId], + new_items: List[model.SpecificAssetId], + old_list: List[model.SpecificAssetId]) -> None: + model.AssetInformation._validate_aasd_131(self.global_asset_id, + len(old_list) - len(items_to_replace) + len(new_items) > 0) + + def _check_constraint_del_spec_asset_id(self, _item_to_del: model.SpecificAssetId, + old_list: List[model.SpecificAssetId]) -> None: + model.AssetInformation._validate_aasd_131(self.global_asset_id, len(old_list) > 1) diff --git a/server/app/model/endpoint.py b/server/app/model/endpoint.py new file mode 100644 index 000000000..3be6dc061 --- /dev/null +++ b/server/app/model/endpoint.py @@ -0,0 +1,107 @@ +from __future__ import absolute_import + +import re +from enum import Enum +from typing import Optional, List + +from basyx.aas.model import base + + +class AssetLink: + def __init__(self, name: base.LabelType, value: base.Identifier): + if not name: + raise ValueError("AssetLink 'name' must be a non-empty string.") + if not value: + raise ValueError("AssetLink 'value' must be a non-empty string.") + self.name = name + self.value = value + + +class SecurityTypeEnum(Enum): + NONE = "NONE" + RFC_TLSA = "RFC_TLSA" + W3C_DID = "W3C_DID" + + +class SecurityAttributeObject: + def __init__(self, type_: SecurityTypeEnum, key: str, value: str): + + if not isinstance(type_, SecurityTypeEnum): + raise ValueError(f"Invalid security type: {type_}. Must be one of {list(SecurityTypeEnum)}") + if not key or not isinstance(key, str): + raise ValueError("Key must be a non-empty string.") + if not value or not isinstance(value, str): + raise ValueError("Value must be a non-empty string.") + self.type = type_ + self.key = key + self.value = value + + +class ProtocolInformation: + + def __init__( + self, + href: str, + endpoint_protocol: Optional[str] = None, + endpoint_protocol_version: Optional[List[str]] = None, + subprotocol: Optional[str] = None, + subprotocol_body: Optional[str] = None, + subprotocol_body_encoding: Optional[str] = None, + security_attributes: Optional[List[SecurityAttributeObject]] = None + ): + if not href or not isinstance(href, str): + raise ValueError("href must be a non-empty string representing a valid URL.") + + self.href = href + self.endpoint_protocol = endpoint_protocol + self.endpoint_protocol_version = endpoint_protocol_version or [] + self.subprotocol = subprotocol + self.subprotocol_body = subprotocol_body + self.subprotocol_body_encoding = subprotocol_body_encoding + self.security_attributes = security_attributes or [] + + +class Endpoint: + INTERFACE_SHORTNAMES = { + "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", + "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", + "CD-REPOSITORY", "AAS-DISCOVERY" + } + VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") + + def __init__(self, interface: base.NameType, protocol_information: ProtocolInformation): # noqa: E501 + + self.interface = interface + self.protocol_information = protocol_information + + @property + def interface(self) -> str: + return self._interface + + @interface.setter + def interface(self, interface: base.NameType): + if interface is None: + raise ValueError("Invalid value for `interface`, must not be `None`") + if not self.is_valid_interface(interface): + raise ValueError(f"Invalid interface format: {interface}. Expected format: '-', ") + + self._interface = interface + + @classmethod + def is_valid_interface(cls, interface: base.NameType) -> bool: + parts = interface.split("-", 1) + if len(parts) != 2: + return False + short_name, version = parts + return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) + + @property + def protocol_information(self) -> ProtocolInformation: + return self._protocol_information + + @protocol_information.setter + def protocol_information(self, protocol_information: ProtocolInformation): + if protocol_information is None: + raise ValueError("Invalid value for `protocol_information`, must not be `None`") # noqa: E501 + + self._protocol_information = protocol_information From 1268f6a086d60b6a23097426df8b0eb9d654d24a Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 24 Apr 2025 15:56:07 +0200 Subject: [PATCH 42/76] correct json serialisation for AASDescriptor --- server/app/adapter/jsonization.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index cd5f01a76..92a87fc5a 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -97,8 +97,11 @@ def _construct_asset_administration_shell_descriptor( if 'idShort' in dct: ret.id_short = _get_ts(dct, 'idShort', str) if 'submodelDescriptors' in dct: - ret.submodel_descriptors = cls._construct_submodel_descriptor(_get_ts(dct, 'submodelDescriptors', list), - server_model.SubmodelDescriptor) + for sm_dct in _get_ts(dct, 'submodelDescriptors', list): + ret.submodel_descriptors.append(cls._construct_submodel_descriptor( + sm_dct, + server_model.SubmodelDescriptor + )) return ret @classmethod From 74b64d2bd57425c0d9ad91b1cb391834dd241143 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Fri, 25 Apr 2025 12:58:33 +0200 Subject: [PATCH 43/76] adapt filter options for get_all_aas_descritors and remove filter for get_all_submodels_descriptors --- server/app/interfaces/registry.py | 42 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index f33ab1651..fbef785a3 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -8,13 +8,13 @@ import werkzeug.routing import werkzeug.urls import werkzeug.utils -from werkzeug.exceptions import Conflict, NotFound +from werkzeug.exceptions import Conflict, NotFound, BadRequest from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response import server.app.model as server_model from basyx.aas import model -from server.app.util.converters import Base64URLConverter +from server.app.util.converters import Base64URLConverter, base64url_decode from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder @@ -64,20 +64,26 @@ def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ server_model.AssetAdministrationShellDescriptor ) - id_short = request.args.get("idShort") - if id_short is not None: - descriptors = filter(lambda desc: desc.id_short == id_short, descriptors) - - asset_ids = request.args.getlist("assetIds") - if asset_ids is not None: - # Decode and instantiate SpecificAssetIds - specific_asset_ids: List[model.SpecificAssetId] = list( - map(lambda asset_id: HTTPApiDecoder.base64url_json(asset_id, model.SpecificAssetId, False), asset_ids) + asset_kind = request.args.get("assetKind") + if asset_kind is not None: + try: + asset_kind = model.AssetKind[asset_kind] + except KeyError: + raise BadRequest(f"Invalid assetKind '{asset_kind}', must be one of {list(model.AssetKind.__members__)}") + descriptors = filter( + lambda desc: desc.asset_kind == asset_kind, + descriptors ) - # Filter AAS based on these SpecificAssetIds + + asset_type = request.args.get("assetType") + if asset_type is not None: + asset_type = base64url_decode(asset_type) + try: + asset_type = model.Identifier(asset_type) + except Exception: + raise BadRequest(f"Invalid assetType: '{asset_type}'") descriptors = filter( - lambda desc: all(specific_asset_id in desc.specific_asset_id - for specific_asset_id in specific_asset_ids), + lambda desc: desc.asset_type == asset_type, descriptors ) @@ -89,14 +95,6 @@ def _get_aas_descriptor(self, url_args: Dict) -> server_model.AssetAdministratio def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: submodel_descriptors: Iterator[server_model.SubmodelDescriptor] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) - id_short = request.args.get("idShort") - if id_short is not None: - submodel_descriptors = filter(lambda sm: sm.id_short == id_short, submodel_descriptors) - semantic_id = request.args.get("semanticId") - if semantic_id is not None: - spec_semantic_id = HTTPApiDecoder.base64url_json( - semantic_id, model.Reference, False) # type: ignore[type-abstract] - submodel_descriptors = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodel_descriptors) paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) return paginated_submodel_descriptors, end_index From b64d589ed6bd92b29cc55c8549c19dbd09fb5a40 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Fri, 25 Apr 2025 13:53:59 +0200 Subject: [PATCH 44/76] add service description --- server/app/interfaces/registry.py | 12 ++++++++++++ server/app/model/__init__.py | 1 + server/app/model/service.py | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 server/app/model/service.py diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index fbef785a3..2d34bcbf6 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -23,6 +23,7 @@ def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/a self.object_store: model.AbstractObjectStore = object_store self.url_map = werkzeug.routing.Map([ Submount(base_path, [ + Rule("/description", methods=["GET"], endpoint=self.get_self_description), Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_all_aas_descriptors), Rule("/shell-descriptors", methods=["POST"], endpoint=self.post_aas_descriptor), Submount("/shell-descriptors", [ @@ -101,6 +102,17 @@ def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[serv def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescriptor: return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) + # ------ COMMON ROUTES ------- + def get_self_description(self, request: Request, url_args: Dict, response_t: Type[APIResponse], + **_kwargs) -> Response: + service_description = server_model.ServiceDescription(profiles=[ + server_model.ServiceSpecificationProfileEnum.AAS_REGISTRY_FULL, + server_model.ServiceSpecificationProfileEnum.AAS_REGISTRY_READ, + server_model.ServiceSpecificationProfileEnum.SUBMODEL_REGISTRY_FULL, + server_model.ServiceSpecificationProfileEnum.SUBMODEL_REGISTRY_READ + ]) + return response_t(service_description.to_dict()) + # ------ AAS REGISTRY ROUTES ------- def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: diff --git a/server/app/model/__init__.py b/server/app/model/__init__.py index 5736b5492..0f5e5d953 100644 --- a/server/app/model/__init__.py +++ b/server/app/model/__init__.py @@ -1,2 +1,3 @@ from .descriptor import * from .endpoint import * +from .service import * diff --git a/server/app/model/service.py b/server/app/model/service.py new file mode 100644 index 000000000..39bc3dc03 --- /dev/null +++ b/server/app/model/service.py @@ -0,0 +1,21 @@ +from typing import List +from enum import Enum + +class ServiceSpecificationProfileEnum(str, Enum): + AAS_REGISTRY_FULL = "https://adminshell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-001" + AAS_REGISTRY_READ = "https://adminshell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-002" + SUBMODEL_REGISTRY_FULL = "https://adminshell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-001" + SUBMODEL_REGISTRY_READ = "https://adminshell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-002" + #TODO add other profiles + + +class ServiceDescription: + def __init__(self, profiles: List[ServiceSpecificationProfileEnum]): + if not profiles: + raise ValueError("At least one profile must be specified") + self.profiles = profiles + + def to_dict(self): + return { + "profiles": [p.value for p in self.profiles] + } \ No newline at end of file From 1de92b3ea84137131758f8a70af31f586974235e Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Mon, 23 Jun 2025 08:35:31 +0200 Subject: [PATCH 45/76] clean code --- server/app/adapter/jsonization.py | 7 +++---- server/app/interfaces/discovery.py | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index 92a87fc5a..e3e21f463 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -2,10 +2,9 @@ import server.app.model as server_model from basyx.aas import model -from basyx.aas.adapter import _generic -from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO +from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO, ASSET_KIND, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES from basyx.aas.adapter.json import AASToJsonEncoder -from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES, \ +from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, \ read_aas_json_file_into import logging @@ -263,7 +262,7 @@ def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetA if obj.administration: data['administration'] = obj.administration if obj.asset_kind: - data['assetKind'] = _generic.ASSET_KIND[obj.asset_kind] + data['assetKind'] = ASSET_KIND[obj.asset_kind] if obj.asset_type: data['assetType'] = obj.asset_type if obj.global_asset_id: diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index b08448b06..4f456f789 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -3,7 +3,6 @@ """ import abc -import json from typing import Dict, List, Set, Any import werkzeug.exceptions From 59748cf87b2bd46ddcc81596912b5de5854527b7 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 8 Jul 2025 16:46:24 +0200 Subject: [PATCH 46/76] add README and docker deployment for registry --- Discovery Server/README.md | 2 +- Json2RegoRulesConverter.py | 98 +++++++++++++++++ Registry Server/README.md | 97 ----------------- policies/access_policy.rego | 12 +++ policies/rules.json | 101 ++++++++++++++++++ .../Dockerfile | 28 ++--- registry_server/README.md | 74 +++++++++++++ registry_server/app/__init__.py | 0 registry_server/app/main.py | 27 +++++ .../compose.yml | 4 +- .../entrypoint.sh | 2 +- registry_server/requirements.txt | 1 + .../stop-supervisor.sh | 0 .../storage/descriptorCompleteExample.json | 71 ++++++++++++ .../supervisord.ini | 0 .../uwsgi.ini | 1 + server/app/version.py | 21 ++++ test.py | 26 +++++ 18 files changed, 453 insertions(+), 112 deletions(-) create mode 100644 Json2RegoRulesConverter.py delete mode 100644 Registry Server/README.md create mode 100644 policies/access_policy.rego create mode 100644 policies/rules.json rename {Registry Server => registry_server}/Dockerfile (62%) create mode 100644 registry_server/README.md create mode 100644 registry_server/app/__init__.py create mode 100644 registry_server/app/main.py rename {Registry Server => registry_server}/compose.yml (53%) rename {Registry Server => registry_server}/entrypoint.sh (99%) create mode 100644 registry_server/requirements.txt rename {Registry Server => registry_server}/stop-supervisor.sh (100%) create mode 100644 registry_server/storage/descriptorCompleteExample.json rename {Registry Server => registry_server}/supervisord.ini (100%) rename {Registry Server => registry_server}/uwsgi.ini (90%) create mode 100644 server/app/version.py create mode 100644 test.py diff --git a/Discovery Server/README.md b/Discovery Server/README.md index 0b0938167..a562dbae0 100644 --- a/Discovery Server/README.md +++ b/Discovery Server/README.md @@ -1,4 +1,4 @@ -# Eclipse BaSyx Python SDK - Dicovery Service +# Eclipse BaSyx Python SDK - Discovery Service This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Discovery Service**. It provides basic discovery functionality for AAS IDs and their corresponding assets, as specified in the official [Discovery Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/DiscoveryServiceSpecification/V3.1.0_SSP-001). diff --git a/Json2RegoRulesConverter.py b/Json2RegoRulesConverter.py new file mode 100644 index 000000000..34c69898a --- /dev/null +++ b/Json2RegoRulesConverter.py @@ -0,0 +1,98 @@ +import json +from typing import Dict, Any + +def convert_idta_rule_to_rego(rule: Dict[str, Any], rule_index: int = 0) -> str: + formula = rule.get("FORMULA", {}) + acl = rule.get("ACL", {}) + rights = acl.get("RIGHTS", []) + access = acl.get("ACCESS", "DENY").upper() + + if access != "ALLOW": + return "" + + rego_conditions = [] + + def parse_expression(expr: Dict[str, Any]) -> str: + if "$eq" in expr: + left = parse_operand(expr["$eq"][0]) + right = parse_operand(expr["$eq"][1]) + return f"{left} == {right}" + elif "$regex" in expr: + left = parse_operand(expr["$regex"][0]) + pattern = expr["$regex"][1].get("$strVal", "") + return f're_match("{pattern}", {left})' + elif "$ge" in expr: + left = parse_operand(expr["$ge"][0]) + right = parse_operand(expr["$ge"][1]) + return f"{left} >= {right}" + elif "$le" in expr: + left = parse_operand(expr["$le"][0]) + right = parse_operand(expr["$le"][1]) + return f"{left} <= {right}" + elif "$and" in expr: + return " and ".join([f"({parse_expression(sub)})" for sub in expr["$and"]]) + elif "$or" in expr: + return " or ".join([f"({parse_expression(sub)})" for sub in expr["$or"]]) + else: + return "# unsupported expression" + + def parse_operand(operand: Dict[str, Any]) -> str: + if "$attribute" in operand: + attr = operand["$attribute"] + if "CLAIM" in attr: + return f'input.subject.{attr["CLAIM"]}' + if "REFERENCE" in attr: + return f'input.resource.{attr["REFERENCE"].replace("(Submodel)*#", "")}' + if "GLOBAL" in attr: + return f'input.context.{attr["GLOBAL"]}' + elif "$field" in operand: + return f'input.resource.{operand["$field"].replace("$sm#", "")}' + elif "$strVal" in operand: + return f'"{operand["$strVal"]}"' + elif "$timeVal" in operand: + return f'"{operand["$timeVal"]}"' + else: + return "# unsupported operand" + + if formula: + rego_conditions.append(parse_expression(formula)) + + if rights: + right_exprs = [f'input.action == "{right}"' for right in rights] + rego_conditions.append(f"({' or '.join(right_exprs)})") + + if not rego_conditions: + return "" + + conditions_block = "\n ".join(rego_conditions) + rule_block = f""" +allow_rule_{rule_index} {{ + {conditions_block} +}}""" + return rule_block + + +def generate_rego_policy_from_idta(json_data: Dict[str, Any]) -> str: + """ + Generate a complete Rego policy from an IDTA-01004 rule set. + """ + rules = json_data.get("AllAccessPermissionRules", {}).get("rules", []) + rule_blocks = [convert_idta_rule_to_rego(rule, idx) for idx, rule in enumerate(rules)] + rule_blocks = [rb for rb in rule_blocks if rb.strip()] + + allow_conditions = " or ".join([f"allow_rule_{i}" for i in range(len(rule_blocks))]) + rego_policy = "package accesscontrol\n\ndefault allow = false\n\n" + rego_policy += f"allow {{\n {allow_conditions}\n}}\n" + rego_policy += "\n".join(rule_blocks) + return rego_policy + +def save_rego_policy_to_file(rego_policy: str, file_path: str) -> None: + with open(file_path, "w") as f: + f.write(rego_policy) + + +if __name__ == "__main__": + with open("policies/rules.json") as f: + json_data = json.load(f) + rego_policy = generate_rego_policy_from_idta(json_data) + save_rego_policy_to_file(rego_policy, "policies/access_policy.rego") diff --git a/Registry Server/README.md b/Registry Server/README.md deleted file mode 100644 index 339226c53..000000000 --- a/Registry Server/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# Eclipse BaSyx Python SDK - HTTP Server - -This package contains a Dockerfile to spin up an exemplary HTTP/REST server following the [Specification of the AAS Part 2 API][6] with ease. -The server currently implements the following interfaces: - -- [Asset Administration Shell Repository Service][4] -- [Submodel Repository Service][5] - -It uses the [HTTP API][1] and the [AASX][7], [JSON][8], and [XML][9] Adapters of the [BaSyx Python SDK][3], to serve regarding files from a given directory. -The files are only read, changes won't persist. - -Alternatively, the container can also be told to use the [Local-File Backend][2] instead, which stores AAS and Submodels as individual JSON files and allows for persistent changes (except supplementary files, i.e. files referenced by `File` submodel elements). -See [below](#options) on how to configure this. - -## Building -The container image can be built via: -``` -$ docker buildx build -t basyx-python-sdk-http-server . -``` - -## Running - -### Storage -The container needs to be provided with the directory `/storage` to store AAS and Submodel files: AASX, JSON, XML or JSON files of Local-File Backend. - -This directory can be mapped via the `-v` option from another image or a local directory. -To map the directory `storage` inside the container, `-v ./storage:/storage` can be used. -The directory `storage` will be created in the current working directory, if it doesn't already exist. - -### Port -The HTTP server inside the container listens on port 80 by default. -To expose it on the host on port 8080, use the option `-p 8080:80` when running it. - -### Options -The container can be configured via environment variables: -- `API_BASE_PATH` determines the base path under which all other API paths are made available. - Default: `/api/v3.0` -- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: - - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve AASX, JSON, XML files from the storage directory. - The files are not modified, all changes done via the API are only stored in memory. - - When instead set to `LOCAL_FILE`, the server makes use of the [LocalFileBackend][2], where AAS and Submodels are persistently stored as JSON files. - Supplementary files, i.e. files referenced by `File` submodel elements, are not stored in this case. -- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. - -### Running Examples - -Putting it all together, the container can be started via the following command: -``` -$ docker run -p 8080:80 -v ./storage:/storage basyx-python-sdk-http-server -``` - -Since Windows uses backslashes instead of forward slashes in paths, you'll have to adjust the path to the storage directory there: -``` -> docker run -p 8080:80 -v .\storage:/storage basyx-python-sdk-http-server -``` - -Per default, the server will use the `LOCAL_FILE_READ_ONLY` storage type and serve the API under `/api/v3.0` and read files from `/storage`. If you want to change this, you can do so like this: -``` -$ docker run -p 8080:80 -v ./storage2:/storage2 -e API_BASE_PATH=/api/v3.1 -e STORAGE_TYPE=LOCAL_FILE_BACKEND -e STORAGE_PATH=/storage2 basyx-python-sdk-http-server -``` - -## Building and running the image with docker-compose - -The container image can also be built and run via: -``` -$ docker compose up -``` - -This is the exemplary `docker-compose` file for the server: -````yaml -services: - app: - build: . - ports: - - "8080:80" - volumes: - - ./storage:/storage - -```` - -Here files are read from `/storage` and the server can be accessed at http://localhost:8080/api/v3.0/ from your host system. -To get a different setup this compose.yaml file can be adapted and expanded. - -## Acknowledgments - -This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. - -[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 -[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html -[3]: https://github.com/eclipse-basyx/basyx-python-sdk -[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 -[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 -[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces -[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx -[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html -[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html -[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/policies/access_policy.rego b/policies/access_policy.rego new file mode 100644 index 000000000..48d95fa41 --- /dev/null +++ b/policies/access_policy.rego @@ -0,0 +1,12 @@ +package accesscontrol + +default allow = false + +allow { + allow_rule_0 +} + +allow_rule_0 { + ((input.resource.semanticId == "SemanticID-Nameplate") or (input.resource.semanticId == "SemanticID-TechnicalData")) and (input.subject.Role == "admin") and (re_match("^https://company1.com/.*$", input.resource.Id)) and (input.context.UTCNOW >= "09:00") and (input.context.UTCNOW <= "17:00") + (input.action == "READ" or input.action == "WRITE") +} \ No newline at end of file diff --git a/policies/rules.json b/policies/rules.json new file mode 100644 index 000000000..bfe82ff72 --- /dev/null +++ b/policies/rules.json @@ -0,0 +1,101 @@ +{ + "AllAccessPermissionRules": { + "rules": [ + { + "ACL": { + "ATTRIBUTES": [ + { + "CLAIM": "Roles" + } + ], + "RIGHTS": [ + "READ", + "WRITE" + ], + "ACCESS": "ALLOW" + }, + "OBJECTS": [ + { + "IDENTIFIABLE": "(Submodel)*" + } + ], + "FORMULA": { + "$and": [ + { + "$or": [ + { + "$eq": [ + { + "$field": "$sm#semanticId" + }, + { + "$strVal": "SemanticID-Nameplate" + } + ] + }, + { + "$eq": [ + { + "$field": "$sm#semanticId" + }, + { + "$strVal": "SemanticID-TechnicalData" + } + ] + } + ] + }, + { + "$eq": [ + { + "$attribute": { + "CLAIM": "Role" + } + }, + { + "$strVal": "admin" + } + ] + }, + { + "$regex": [ + { + "$attribute": { + "REFERENCE": "(Submodel)*#Id" + } + }, + { + "$strVal": "^https://company1.com/.*$" + } + ] + }, + { + "$ge": [ + { + "$attribute": { + "GLOBAL": "UTCNOW" + } + }, + { + "$timeVal": "09:00" + } + ] + }, + { + "$le": [ + { + "$attribute": { + "GLOBAL": "UTCNOW" + } + }, + { + "$timeVal": "17:00" + } + ] + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/Registry Server/Dockerfile b/registry_server/Dockerfile similarity index 62% rename from Registry Server/Dockerfile rename to registry_server/Dockerfile index 3d52a15ab..344ddd0ee 100644 --- a/Registry Server/Dockerfile +++ b/registry_server/Dockerfile @@ -1,10 +1,5 @@ FROM python:3.11-alpine -LABEL org.label-schema.name="Eclipse BaSyx" \ - org.label-schema.version="1.0" \ - org.label-schema.description="Docker image for the basyx-python-sdk server application" \ - org.label-schema.maintainer="Eclipse BaSyx" - ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 @@ -13,13 +8,12 @@ ENV PYTHONUNBUFFERED=1 RUN apk update && \ apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ pip install uwsgi && \ - pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ apk del git bash -COPY uwsgi.ini /etc/uwsgi/ -COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini -COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +COPY registry_server/uwsgi.ini /etc/uwsgi/ +COPY registry_server/supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY registry_server/stop-supervisor.sh /etc/supervisor/stop-supervisor.sh RUN chmod +x /etc/supervisor/stop-supervisor.sh # Makes it possible to use a different configuration @@ -34,12 +28,22 @@ ENV LISTEN_PORT=80 ENV CLIENT_BODY_BUFFER_SIZE=1M # Copy the entrypoint that will generate Nginx additional configs -COPY entrypoint.sh /entrypoint.sh +COPY registry_server/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] -COPY ../server/app /app +ENV SETUPTOOLS_SCM_PRETEND_VERSION=1.0.0 + + +COPY ./registry_server/requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY ./sdk /sdk +COPY ./server /server +COPY ./registry_server/app /app + WORKDIR /app +RUN pip install ../sdk -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] \ No newline at end of file diff --git a/registry_server/README.md b/registry_server/README.md new file mode 100644 index 000000000..887fb8bcb --- /dev/null +++ b/registry_server/README.md @@ -0,0 +1,74 @@ +# Eclipse BaSyx Python SDK - Registry Service + +This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Registry Service**. +It provides basic registry functionality for AAS and submodels descriptors, as specified in the official [Asset Administration Shell Registry Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRegistryServiceSpecification/V3.1.0_SSP-001) and [Submodel Registry Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRegistryServiceSpecification/V3.1.0_SSP-001). + +## Overview + +The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Such an endpoint for an AAS and the related Submodel-IDs make the AAS and the submodels with their submodelElements accessible. + + + +## Features +# AAS Registry: +| Function | Description | Example URL | +|--------------------------------------------------|----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| **GetAllAssetAdministrationShellDescriptors** | Return all AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors` | +| **GetAssetAdministrationShellDescriptorById** | Return a specific AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | +| **PostAssetAdministrationShellDescriptor** | Register/create a new AAS descriptor | `POST http://localhost:8083/api/v3.0/shell-descriptors` | +| **PutAssetAdministrationShellDescriptorById** | Update an existing AAS descriptor | `PUT http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | +| **DeleteAssetAdministrationShellDescriptorById** | Delete an AAS descriptor by ID | `DELETE http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | +| **GetSubmodelDescriptorsThroughSuperPath** | Return all submodel descriptors under AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors` | +| **PostSubmodelDescriptorThroughSuperPath** | Register/create a new submodel descriptor under AAS descriptor | `Post http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors` | +| **GetSubmodelDescriptorThroughSuperPath** | Return a specific submodel descriptor under AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **PutSubmodelDescriptorThroughSuperPath** | Update a specific submodel descriptor under AAS descriptor | `PUT http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **DeleteSubmodelDescriptorThroughSuperPath** | Delete a specific submodel descriptor under AAS descriptor | `DELETE http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **GetDescription** | Return the self‑description of the AAS registry service | `GET http://localhost:8083/api/v3.0/description` | + +# Submodel Registry: +| Function | Description | Example URL | +|----------------------------------|--------------------------------------------------------------|-----------------------------------------------------------------------------------| +| **GetAllSubmodelDescriptors** | Return all submodel descriptors | `GET http://localhost:8083/api/v3.0/submodel-descriptors` | +| **PostSubmodelDescriptor** | Register/create a new submodel descriptor | `Post http://localhost:8083/api/v3.0/submodel-descriptors` | +| **GetSubmodelDescriptorById** | Return a specific submodel descriptor | `GET http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | +| **PutSubmodelDescriptorById** | Update a specific submodel descriptor | `PUT http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | +| **DeleteSubmodelDescriptorById** | Delete a specific submodel descriptor | `DELETE http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | +| **GetDescription** | Return the self‑description of the submodel registry service | `GET http://localhost:8083/api/v3.0/description` | + + + +## Specification Compliance + +- Complies with: **Asset Administration Shell Registry Service Specification v3.1.0_SSP-001** and **Submodel Registry Service Specification v3.1.0_SSP-001** + +## Configuration + +The service can be configured to use either: + +- **In-memory storage** (default): Temporary data storage that resets on service restart. +- **MongoDB storage**: Persistent backend storage using MongoDB. + +### Configuration via Environment Variables + +| Variable | Description | Default | +|----------------|--------------------------------------------|-------------------------| +| `STORAGE_TYPE` | `inmemory` or `mongodb` | `inmemory` | +| `MONGODB_URI` | MongoDB connection URI | `mongodb://localhost:27017` | +| `MONGODB_DBNAME` | Name of the MongoDB database | `basyx_registry` | + +## Deployment via Docker + +A `Dockerfile` and `docker-compose.yml` are provided for simple deployment. +The container image can be built and run via: +```bash +docker compose up --build +``` + +## Test + +An example descriptor for testing purposes is provided as a JSON file in the [storage](./storage) folder. + +## Acknowledgments + +This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker](https://github.com/tiangolo/uwsgi-nginx-docker) repository. + diff --git a/registry_server/app/__init__.py b/registry_server/app/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/registry_server/app/main.py b/registry_server/app/main.py new file mode 100644 index 000000000..b182118ee --- /dev/null +++ b/registry_server/app/main.py @@ -0,0 +1,27 @@ +import sys +import os +sys.path.insert(0, "/") +from basyx.aas.backend.local_file import LocalFileObjectStore +from basyx.aas import model +from server.app.interfaces.registry import RegistryAPI + +storage_path = os.getenv("STORAGE_PATH", "/storage") +storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") +base_path = os.getenv("API_BASE_PATH") + +wsgi_optparams = {} + +if base_path is not None: + wsgi_optparams["base_path"] = base_path + +if storage_type == "LOCAL_FILE_BACKEND": + application = RegistryAPI(LocalFileObjectStore(storage_path), **wsgi_optparams) + +elif storage_type in "LOCAL_FILE_READ_ONLY": + object_store: model.DictObjectStore = model.DictObjectStore() + + application = RegistryAPI(object_store, **wsgi_optparams) + +else: + print(f"STORAGE_TYPE must be either LOCAL_FILE or LOCAL_FILE_READ_ONLY! Current value: {storage_type}", + file=sys.stderr) \ No newline at end of file diff --git a/Registry Server/compose.yml b/registry_server/compose.yml similarity index 53% rename from Registry Server/compose.yml rename to registry_server/compose.yml index 932422dbc..99f3e3cc9 100644 --- a/Registry Server/compose.yml +++ b/registry_server/compose.yml @@ -1,6 +1,8 @@ services: app: - build: . + build: + context: .. + dockerfile: registry_server/Dockerfile ports: - "8083:80" volumes: diff --git a/Registry Server/entrypoint.sh b/registry_server/entrypoint.sh similarity index 99% rename from Registry Server/entrypoint.sh rename to registry_server/entrypoint.sh index 722394409..522d4fca2 100644 --- a/Registry Server/entrypoint.sh +++ b/registry_server/entrypoint.sh @@ -68,4 +68,4 @@ else printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf fi -exec "$@" +exec "$@" \ No newline at end of file diff --git a/registry_server/requirements.txt b/registry_server/requirements.txt new file mode 100644 index 000000000..9c12eecda --- /dev/null +++ b/registry_server/requirements.txt @@ -0,0 +1 @@ +Werkzeug diff --git a/Registry Server/stop-supervisor.sh b/registry_server/stop-supervisor.sh similarity index 100% rename from Registry Server/stop-supervisor.sh rename to registry_server/stop-supervisor.sh diff --git a/registry_server/storage/descriptorCompleteExample.json b/registry_server/storage/descriptorCompleteExample.json new file mode 100644 index 000000000..f762aa836 --- /dev/null +++ b/registry_server/storage/descriptorCompleteExample.json @@ -0,0 +1,71 @@ +{ + "id": "https://example.org/aas/motor", + "endpoints": [ + { + "protocolInformation": { + "href": "https://localhost:1234/api/v3.0/aas", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ] + }, + "interface": "AAS-3.0" + }, + { + "protocolInformation": { + "href": "opc.tcp://localhost:4840" + }, + "interface": "AAS-3.0" + }, + { + "protocolInformation": { + "href": "https://localhost:5678", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "OPC UA Basic SOAP", + "subprotocolBody": "ns=2;s=MyAAS", + "subprotocolBodyEncoding": "application/soap+xml" + }, + "interface": "AAS-3.0" + } + ], + "submodelDescriptors":[ + { + "id": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate", + "endpoints": [ + { + "href": { + "href": "https://localhost:1234/api/v3.0/submodel", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ] + }, + "interface": "AAS-3.0" + }, + { + "protocolInformation": { + "href": "opc.tcp://localhost:4840" + }, + "interface": "AAS-3.0" + }, + { + "protocolInformation": { + "href": "https://localhost:5678", + "endpointProtocol": "HTTP", + "endpointProtocolVersion": [ + "1.1" + ], + "subprotocol": "OPC UA Basic SOAP", + "subprotocolBody": "ns=2;s=MyAAS", + "subprotocolBodyEncoding": "application/soap+xml" + }, + "interface": "AAS-3.0" + } + ] + } + + ] +} \ No newline at end of file diff --git a/Registry Server/supervisord.ini b/registry_server/supervisord.ini similarity index 100% rename from Registry Server/supervisord.ini rename to registry_server/supervisord.ini diff --git a/Registry Server/uwsgi.ini b/registry_server/uwsgi.ini similarity index 90% rename from Registry Server/uwsgi.ini rename to registry_server/uwsgi.ini index 9c54ae1cc..f333b2299 100644 --- a/Registry Server/uwsgi.ini +++ b/registry_server/uwsgi.ini @@ -7,3 +7,4 @@ hook-master-start = unix_signal:15 gracefully_kill_them_all need-app = true die-on-term = true show-config = false +logto = /tmp/uwsgi.log diff --git a/server/app/version.py b/server/app/version.py new file mode 100644 index 000000000..844ef354c --- /dev/null +++ b/server/app/version.py @@ -0,0 +1,21 @@ +# file generated by setuptools-scm +# don't change, don't track in version control + +__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"] + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple + from typing import Union + + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '0.1.dev2109+g5f9e7d2' +__version_tuple__ = version_tuple = (0, 1, 'dev2109', 'g5f9e7d2') diff --git a/test.py b/test.py new file mode 100644 index 000000000..f66264eff --- /dev/null +++ b/test.py @@ -0,0 +1,26 @@ + +from server.app.interfaces.registry import * +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8083, RegistryAPI(create_full_example()), + use_debugger=True, use_reloader=True) + +#from server.app.interfaces.discovery import * +#if __name__ == "__main__": +# from werkzeug.serving import run_simple + + # run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), + # use_debugger=True, use_reloader=True) +# from server.app.interfaces.repository import * +# if __name__ == "__main__": +# from werkzeug.serving import run_simple +# from basyx.aas.examples.data.example_aas import create_full_example +# +# run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), +# use_debugger=True, use_reloader=True) + + + + From a7efefca4c4e15ef1d8f6da42c9a4c3647199ac6 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 8 Jul 2025 17:10:13 +0200 Subject: [PATCH 47/76] remove files from another branch --- .gitignore | 2 + policies/access_policy.rego | 12 ----- policies/rules.json | 101 ------------------------------------ 3 files changed, 2 insertions(+), 113 deletions(-) delete mode 100644 policies/access_policy.rego delete mode 100644 policies/rules.json diff --git a/.gitignore b/.gitignore index 18b522c3a..c78c82036 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ compliance_tool/aas_compliance_tool/version.py # ignore the content of the server storage server/storage/ +test.py/ +Json2RegoRulesConverter.py diff --git a/policies/access_policy.rego b/policies/access_policy.rego deleted file mode 100644 index 48d95fa41..000000000 --- a/policies/access_policy.rego +++ /dev/null @@ -1,12 +0,0 @@ -package accesscontrol - -default allow = false - -allow { - allow_rule_0 -} - -allow_rule_0 { - ((input.resource.semanticId == "SemanticID-Nameplate") or (input.resource.semanticId == "SemanticID-TechnicalData")) and (input.subject.Role == "admin") and (re_match("^https://company1.com/.*$", input.resource.Id)) and (input.context.UTCNOW >= "09:00") and (input.context.UTCNOW <= "17:00") - (input.action == "READ" or input.action == "WRITE") -} \ No newline at end of file diff --git a/policies/rules.json b/policies/rules.json deleted file mode 100644 index bfe82ff72..000000000 --- a/policies/rules.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "AllAccessPermissionRules": { - "rules": [ - { - "ACL": { - "ATTRIBUTES": [ - { - "CLAIM": "Roles" - } - ], - "RIGHTS": [ - "READ", - "WRITE" - ], - "ACCESS": "ALLOW" - }, - "OBJECTS": [ - { - "IDENTIFIABLE": "(Submodel)*" - } - ], - "FORMULA": { - "$and": [ - { - "$or": [ - { - "$eq": [ - { - "$field": "$sm#semanticId" - }, - { - "$strVal": "SemanticID-Nameplate" - } - ] - }, - { - "$eq": [ - { - "$field": "$sm#semanticId" - }, - { - "$strVal": "SemanticID-TechnicalData" - } - ] - } - ] - }, - { - "$eq": [ - { - "$attribute": { - "CLAIM": "Role" - } - }, - { - "$strVal": "admin" - } - ] - }, - { - "$regex": [ - { - "$attribute": { - "REFERENCE": "(Submodel)*#Id" - } - }, - { - "$strVal": "^https://company1.com/.*$" - } - ] - }, - { - "$ge": [ - { - "$attribute": { - "GLOBAL": "UTCNOW" - } - }, - { - "$timeVal": "09:00" - } - ] - }, - { - "$le": [ - { - "$attribute": { - "GLOBAL": "UTCNOW" - } - }, - { - "$timeVal": "17:00" - } - ] - } - ] - } - } - ] - } -} \ No newline at end of file From d3d4dbb65e542d56f6e142e2ede11b713bc95488 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 8 Jul 2025 17:13:45 +0200 Subject: [PATCH 48/76] Stop tracking unnecessary files --- Json2RegoRulesConverter.py | 98 -------------------------------------- test.py | 26 ---------- 2 files changed, 124 deletions(-) delete mode 100644 Json2RegoRulesConverter.py delete mode 100644 test.py diff --git a/Json2RegoRulesConverter.py b/Json2RegoRulesConverter.py deleted file mode 100644 index 34c69898a..000000000 --- a/Json2RegoRulesConverter.py +++ /dev/null @@ -1,98 +0,0 @@ -import json -from typing import Dict, Any - -def convert_idta_rule_to_rego(rule: Dict[str, Any], rule_index: int = 0) -> str: - formula = rule.get("FORMULA", {}) - acl = rule.get("ACL", {}) - rights = acl.get("RIGHTS", []) - access = acl.get("ACCESS", "DENY").upper() - - if access != "ALLOW": - return "" - - rego_conditions = [] - - def parse_expression(expr: Dict[str, Any]) -> str: - if "$eq" in expr: - left = parse_operand(expr["$eq"][0]) - right = parse_operand(expr["$eq"][1]) - return f"{left} == {right}" - elif "$regex" in expr: - left = parse_operand(expr["$regex"][0]) - pattern = expr["$regex"][1].get("$strVal", "") - return f're_match("{pattern}", {left})' - elif "$ge" in expr: - left = parse_operand(expr["$ge"][0]) - right = parse_operand(expr["$ge"][1]) - return f"{left} >= {right}" - elif "$le" in expr: - left = parse_operand(expr["$le"][0]) - right = parse_operand(expr["$le"][1]) - return f"{left} <= {right}" - elif "$and" in expr: - return " and ".join([f"({parse_expression(sub)})" for sub in expr["$and"]]) - elif "$or" in expr: - return " or ".join([f"({parse_expression(sub)})" for sub in expr["$or"]]) - else: - return "# unsupported expression" - - def parse_operand(operand: Dict[str, Any]) -> str: - if "$attribute" in operand: - attr = operand["$attribute"] - if "CLAIM" in attr: - return f'input.subject.{attr["CLAIM"]}' - if "REFERENCE" in attr: - return f'input.resource.{attr["REFERENCE"].replace("(Submodel)*#", "")}' - if "GLOBAL" in attr: - return f'input.context.{attr["GLOBAL"]}' - elif "$field" in operand: - return f'input.resource.{operand["$field"].replace("$sm#", "")}' - elif "$strVal" in operand: - return f'"{operand["$strVal"]}"' - elif "$timeVal" in operand: - return f'"{operand["$timeVal"]}"' - else: - return "# unsupported operand" - - if formula: - rego_conditions.append(parse_expression(formula)) - - if rights: - right_exprs = [f'input.action == "{right}"' for right in rights] - rego_conditions.append(f"({' or '.join(right_exprs)})") - - if not rego_conditions: - return "" - - conditions_block = "\n ".join(rego_conditions) - rule_block = f""" -allow_rule_{rule_index} {{ - {conditions_block} -}}""" - return rule_block - - -def generate_rego_policy_from_idta(json_data: Dict[str, Any]) -> str: - """ - Generate a complete Rego policy from an IDTA-01004 rule set. - """ - rules = json_data.get("AllAccessPermissionRules", {}).get("rules", []) - rule_blocks = [convert_idta_rule_to_rego(rule, idx) for idx, rule in enumerate(rules)] - rule_blocks = [rb for rb in rule_blocks if rb.strip()] - - allow_conditions = " or ".join([f"allow_rule_{i}" for i in range(len(rule_blocks))]) - rego_policy = "package accesscontrol\n\ndefault allow = false\n\n" - rego_policy += f"allow {{\n {allow_conditions}\n}}\n" - rego_policy += "\n".join(rule_blocks) - return rego_policy - -def save_rego_policy_to_file(rego_policy: str, file_path: str) -> None: - with open(file_path, "w") as f: - f.write(rego_policy) - - -if __name__ == "__main__": - with open("policies/rules.json") as f: - json_data = json.load(f) - rego_policy = generate_rego_policy_from_idta(json_data) - save_rego_policy_to_file(rego_policy, "policies/access_policy.rego") diff --git a/test.py b/test.py deleted file mode 100644 index f66264eff..000000000 --- a/test.py +++ /dev/null @@ -1,26 +0,0 @@ - -from server.app.interfaces.registry import * -if __name__ == "__main__": - from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - - run_simple("localhost", 8083, RegistryAPI(create_full_example()), - use_debugger=True, use_reloader=True) - -#from server.app.interfaces.discovery import * -#if __name__ == "__main__": -# from werkzeug.serving import run_simple - - # run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), - # use_debugger=True, use_reloader=True) -# from server.app.interfaces.repository import * -# if __name__ == "__main__": -# from werkzeug.serving import run_simple -# from basyx.aas.examples.data.example_aas import create_full_example -# -# run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), -# use_debugger=True, use_reloader=True) - - - - From 673f18d0a825174de60f323a8de3d77fe6269d67 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 15 Jul 2025 11:30:30 +0200 Subject: [PATCH 49/76] Update README --- registry_server/README.md | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/registry_server/README.md b/registry_server/README.md index 887fb8bcb..6c62e5068 100644 --- a/registry_server/README.md +++ b/registry_server/README.md @@ -19,7 +19,7 @@ The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Su | **PutAssetAdministrationShellDescriptorById** | Update an existing AAS descriptor | `PUT http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | | **DeleteAssetAdministrationShellDescriptorById** | Delete an AAS descriptor by ID | `DELETE http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | | **GetSubmodelDescriptorsThroughSuperPath** | Return all submodel descriptors under AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors` | -| **PostSubmodelDescriptorThroughSuperPath** | Register/create a new submodel descriptor under AAS descriptor | `Post http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors` | +| **PostSubmodelDescriptorThroughSuperPath** | Register/create a new submodel descriptor under AAS descriptor | `POST http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors` | | **GetSubmodelDescriptorThroughSuperPath** | Return a specific submodel descriptor under AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | | **PutSubmodelDescriptorThroughSuperPath** | Update a specific submodel descriptor under AAS descriptor | `PUT http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | | **DeleteSubmodelDescriptorThroughSuperPath** | Delete a specific submodel descriptor under AAS descriptor | `DELETE http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | @@ -29,7 +29,7 @@ The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Su | Function | Description | Example URL | |----------------------------------|--------------------------------------------------------------|-----------------------------------------------------------------------------------| | **GetAllSubmodelDescriptors** | Return all submodel descriptors | `GET http://localhost:8083/api/v3.0/submodel-descriptors` | -| **PostSubmodelDescriptor** | Register/create a new submodel descriptor | `Post http://localhost:8083/api/v3.0/submodel-descriptors` | +| **PostSubmodelDescriptor** | Register/create a new submodel descriptor | `POST http://localhost:8083/api/v3.0/submodel-descriptors` | | **GetSubmodelDescriptorById** | Return a specific submodel descriptor | `GET http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | | **PutSubmodelDescriptorById** | Update a specific submodel descriptor | `PUT http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | | **DeleteSubmodelDescriptorById** | Delete a specific submodel descriptor | `DELETE http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | @@ -37,24 +37,16 @@ The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Su -## Specification Compliance - -- Complies with: **Asset Administration Shell Registry Service Specification v3.1.0_SSP-001** and **Submodel Registry Service Specification v3.1.0_SSP-001** - ## Configuration -The service can be configured to use either: - -- **In-memory storage** (default): Temporary data storage that resets on service restart. -- **MongoDB storage**: Persistent backend storage using MongoDB. +The container can be configured via environment variables: -### Configuration via Environment Variables +- `API_BASE_PATH` determines the base path under which all other API paths are made available. Default: `/api/v3.0` +- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: + - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve JSON files from the storage directory. The files are not modified, all changes done via the API are only stored in memory. + - When instead set to `LOCAL_FILE_BACKEND`, the server makes use of the [LocalFileBackend](https://github.com/eclipse-basyx/basyx-python-sdk/tree/main/backend/basyx_backend/local_file), where AAS and Submodels descriptors are persistently stored as JSON files. +- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. -| Variable | Description | Default | -|----------------|--------------------------------------------|-------------------------| -| `STORAGE_TYPE` | `inmemory` or `mongodb` | `inmemory` | -| `MONGODB_URI` | MongoDB connection URI | `mongodb://localhost:27017` | -| `MONGODB_DBNAME` | Name of the MongoDB database | `basyx_registry` | ## Deployment via Docker From a581603fe43218c5b2be9ace50ab88ddd40148ce Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 15 Jul 2025 11:40:34 +0200 Subject: [PATCH 50/76] add docker deployment for discovery service --- discovery_server/Dockerfile | 50 +++++++++++++ discovery_server/README.md | 48 +++++++++++++ discovery_server/app/main.py | 25 +++++++ discovery_server/compose.yml | 9 +++ discovery_server/entrypoint.sh | 71 +++++++++++++++++++ discovery_server/requirements.txt | 2 + discovery_server/stop-supervisor.sh | 8 +++ .../storage/AssetIdsFullExample.json | 62 ++++++++++++++++ discovery_server/storage/ListOfAssetIds.json | 6 ++ discovery_server/supervisord.ini | 27 +++++++ discovery_server/uwsgi.ini | 9 +++ 11 files changed, 317 insertions(+) create mode 100644 discovery_server/Dockerfile create mode 100644 discovery_server/README.md create mode 100644 discovery_server/app/main.py create mode 100644 discovery_server/compose.yml create mode 100644 discovery_server/entrypoint.sh create mode 100644 discovery_server/requirements.txt create mode 100644 discovery_server/stop-supervisor.sh create mode 100644 discovery_server/storage/AssetIdsFullExample.json create mode 100644 discovery_server/storage/ListOfAssetIds.json create mode 100644 discovery_server/supervisord.ini create mode 100644 discovery_server/uwsgi.ini diff --git a/discovery_server/Dockerfile b/discovery_server/Dockerfile new file mode 100644 index 000000000..e0c1f1f14 --- /dev/null +++ b/discovery_server/Dockerfile @@ -0,0 +1,50 @@ +FROM python:3.11-alpine + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV PYTHONPATH="${PYTHONPATH}:/app" + +# If we have more dependencies for the server it would make sense +# to refactor uswgi to the pyproject.toml +RUN apk update && \ + apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ + pip install uwsgi && \ + apk del git bash + + +COPY discovery_server/uwsgi.ini /etc/uwsgi/ +COPY discovery_server/supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY discovery_server/stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +RUN chmod +x /etc/supervisor/stop-supervisor.sh + +# Makes it possible to use a different configuration +ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini +# object stores aren't thread-safe yet +# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 +ENV UWSGI_CHEAPER=0 +ENV UWSGI_PROCESSES=1 +ENV NGINX_MAX_UPLOAD=1M +ENV NGINX_WORKER_PROCESSES=1 +ENV LISTEN_PORT=80 +ENV CLIENT_BODY_BUFFER_SIZE=1M + +# Copy the entrypoint that will generate Nginx additional configs +COPY discovery_server/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +ENV SETUPTOOLS_SCM_PRETEND_VERSION=1.0.0 + + +COPY ./discovery_server/requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY ./sdk /sdk +COPY ./server /app/server +COPY ./discovery_server/app /app + +WORKDIR /app +RUN pip install ../sdk + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] \ No newline at end of file diff --git a/discovery_server/README.md b/discovery_server/README.md new file mode 100644 index 000000000..5083f48a7 --- /dev/null +++ b/discovery_server/README.md @@ -0,0 +1,48 @@ +# Eclipse BaSyx Python SDK - Discovery Service + +This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Discovery Service**. +It provides basic discovery functionality for AAS IDs and their corresponding assets, as specified in the official [Discovery Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/DiscoveryServiceSpecification/V3.1.0_SSP-001). + +## Overview + +The Discovery Service stores and retrieves relations between AAS identifiers and asset identifiers. It acts as a lookup service for resolving asset-related queries to corresponding AAS. + +## Features + +| Function | Description | Example URL | +|------------------------------------------|----------------------------------------------------------|-----------------------------------------------------------------------| +| **search_all_aas_ids_by_asset_link** | Find AAS identifiers by providing asset link values | `POST http://localhost:8084/api/v3.0/lookup/shellsByAssetLink` | +| **get_all_specific_asset_ids_by_aas_id** | Return specific asset ids associated with an AAS ID | `GET http://localhost:8084/api/v3.0/lookup/shells/{aasIdentifier}` | +| **post_all_asset_links_by_id** | Register specific asset ids linked to an AAS | `POST http://localhost:8084/api/v3.0/lookup/shells/{aasIdentifier}` | +| **delete_all_asset_links_by_id** | Delete all asset links associated with a specific AAS ID | `DELETE http://localhost:8084/api/v3.0/lookup/shells/{aasIdentifier}` | +| + +## Configuration + +The service can be configured to use either: + +- **In-memory storage** (default): Temporary data storage that resets on service restart. +- **MongoDB storage**: Persistent backend storage using MongoDB. + +### Configuration via Environment Variables + +| Variable | Description | Default | +|------------------|--------------------------------------------|-----------------------------| +| `STORAGE_TYPE` | `inmemory` or `mongodb` | `inmemory` | +| `MONGODB_URI` | MongoDB connection URI | `mongodb://localhost:27017` | +| `MONGODB_DBNAME` | Name of the MongoDB database | `basyx_registry` | + +## Deployment via Docker + +A `Dockerfile` and `docker-compose.yml` are provided for simple deployment. +The container image can be built and run via: +```bash +docker compose up --build +``` +## Test + +Examples of asset links and specific asset IDs for testing purposes are provided as JSON files in the [storage](./storage) folder. + +## Acknowledgments + +This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker](https://github.com/tiangolo/uwsgi-nginx-docker) repository. diff --git a/discovery_server/app/main.py b/discovery_server/app/main.py new file mode 100644 index 000000000..0092e6918 --- /dev/null +++ b/discovery_server/app/main.py @@ -0,0 +1,25 @@ +import os +import sys +from server.app.interfaces.discovery import DiscoveryAPI, MongoDiscoveryStore,InMemoryDiscoveryStore + +storage_type = os.getenv("STORAGE_TYPE", "inmemory") +base_path = os.getenv("API_BASE_PATH") + +wsgi_optparams = {} + +if base_path is not None: + wsgi_optparams["base_path"] = base_path + +if storage_type == "inmemory": + application = DiscoveryAPI(InMemoryDiscoveryStore(), **wsgi_optparams) + +elif storage_type == "mongodb": + uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") + dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") + + application = DiscoveryAPI(MongoDiscoveryStore(uri,dbname), **wsgi_optparams) + +else: + print(f"STORAGE_TYPE must be either inmemory or mongodb! Current value: {storage_type}", + file=sys.stderr) + diff --git a/discovery_server/compose.yml b/discovery_server/compose.yml new file mode 100644 index 000000000..56be002e1 --- /dev/null +++ b/discovery_server/compose.yml @@ -0,0 +1,9 @@ +services: + app: + build: + context: .. + dockerfile: discovery_server/Dockerfile + ports: + - "8084:80" + environment: + - STORAGE_TYPE=inmemory diff --git a/discovery_server/entrypoint.sh b/discovery_server/entrypoint.sh new file mode 100644 index 000000000..722394409 --- /dev/null +++ b/discovery_server/entrypoint.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env sh +set -e + +# Get the maximum upload file size for Nginx, default to 0: unlimited +USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} + +# Get the number of workers for Nginx, default to 1 +USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} + +# Set the max number of connections per worker for Nginx, if requested +# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below +NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} + +# Get the listen port for Nginx, default to 80 +USE_LISTEN_PORT=${LISTEN_PORT:-80} + +# Get the client_body_buffer_size for Nginx, default to 1M +USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} + +# Create the conf.d directory if it doesn't exist +if [ ! -d /etc/nginx/conf.d ]; then + mkdir -p /etc/nginx/conf.d +fi + +if [ -f /app/nginx.conf ]; then + cp /app/nginx.conf /etc/nginx/nginx.conf +else + content='user nginx;\n' + # Set the number of worker processes in Nginx + content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" + content=$content'error_log /var/log/nginx/error.log warn;\n' + content=$content'pid /var/run/nginx.pid;\n' + content=$content'events {\n' + content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" + content=$content'}\n' + content=$content'http {\n' + content=$content' include /etc/nginx/mime.types;\n' + content=$content' default_type application/octet-stream;\n' + content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" + content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" + content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" + content=$content' access_log /var/log/nginx/access.log main;\n' + content=$content' sendfile on;\n' + content=$content' keepalive_timeout 65;\n' + content=$content' include /etc/nginx/conf.d/*.conf;\n' + content=$content'}\n' + content=$content'daemon off;\n' + # Set the max number of open file descriptors for Nginx workers, if requested + if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then + content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" + fi + # Save generated /etc/nginx/nginx.conf + printf "$content" > /etc/nginx/nginx.conf + + content_server='server {\n' + content_server=$content_server" listen ${USE_LISTEN_PORT};\n" + content_server=$content_server' location / {\n' + content_server=$content_server' include uwsgi_params;\n' + content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' + content_server=$content_server' }\n' + content_server=$content_server'}\n' + # Save generated server /etc/nginx/conf.d/nginx.conf + printf "$content_server" > /etc/nginx/conf.d/nginx.conf + + # # Generate additional configuration + printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf + printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf + printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf +fi + +exec "$@" diff --git a/discovery_server/requirements.txt b/discovery_server/requirements.txt new file mode 100644 index 000000000..376baed5f --- /dev/null +++ b/discovery_server/requirements.txt @@ -0,0 +1,2 @@ +Werkzeug +pymongo diff --git a/discovery_server/stop-supervisor.sh b/discovery_server/stop-supervisor.sh new file mode 100644 index 000000000..9a953c94b --- /dev/null +++ b/discovery_server/stop-supervisor.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +printf "READY\n" + +while read line; do + echo "Processing Event: $line" >&2 + kill $PPID +done < /dev/stdin diff --git a/discovery_server/storage/AssetIdsFullExample.json b/discovery_server/storage/AssetIdsFullExample.json new file mode 100644 index 000000000..720d106fc --- /dev/null +++ b/discovery_server/storage/AssetIdsFullExample.json @@ -0,0 +1,62 @@ +[ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "ud800;udbff3udbffUud800Bud800qudbffhudbffTd6^dnTudbff5?Aoudbff36Xud800>udbffUudbff\"Hjeud800Fudbff;udbffC?5q]udbff8aIudbffkp[?sud800kXljub;Gudbffqud8003ud8005udbff[>Z6d_udbffO=hxs R9<_pudbffo" + } + ], + "referredSemanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "ooOud800pqudbfffud800b:4udbffiudbffudbffd_ud800sJudbffOudbffiB:udbff@pEudbffM;8ud800mS;udbff3ud800q8udbff^udbffmDhFttgudbffrudbffhudbffrEud800e" + } + ] + } + } + ], + "name": "ud800Vud800?ud800tudbff1Ah_ud8003udbffZud800d5WAud800ScMIud800e>", + "value": "udbffBudbffSud800udbffn%ud800kudbffa:Tcfudbff?udbff?ud8005udbffZudbff_ud800iud800qq.@Zud800jmludbffFB<:Wfud800=audbffludbffailudbff?ud800uLudbff7ud800GJqG'ud800kudbffrudbff>>RudbffQudbff=udbffQS]UudbffOZS", + "externalSubjectId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "^7<\\agVu_%ud800:pD<-ud800j9udbffkiKCudbffVudbffjudbffDudbffiudbffZsud800WhLG:tQfLP" + } + ], + "referredSemanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "]Pud800DudbffY[0Y", + "value": "udbffBudbffSud800udbffn%ud800kudbffa:Tcfudbff?udbff?ud8005udbffZudbff_ud800iud800qq.@Zud800jmludbffFB<:Wfud800=audbffludbffailudbff?ud800uLudbff7ud800GJqG'ud800kudbffrudbff>>RudbffQudbff=udbffQS]UudbffOZS" + } +] \ No newline at end of file diff --git a/discovery_server/supervisord.ini b/discovery_server/supervisord.ini new file mode 100644 index 000000000..d73d98014 --- /dev/null +++ b/discovery_server/supervisord.ini @@ -0,0 +1,27 @@ +[supervisord] +nodaemon=true + +[program:uwsgi] +command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[program:nginx] +command=/usr/sbin/nginx +stdout_logfile=/var/log/nginx.out.log +stdout_logfile_maxbytes=0 +stderr_logfile=/var/log/nginx.err.log +stderr_logfile_maxbytes=0 +stopsignal=QUIT +startsecs = 0 +autorestart=false +# may make sense to have autorestart enabled in production + +[eventlistener:quit_on_failure] +events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL +command=/etc/supervisor/stop-supervisor.sh diff --git a/discovery_server/uwsgi.ini b/discovery_server/uwsgi.ini new file mode 100644 index 000000000..9c54ae1cc --- /dev/null +++ b/discovery_server/uwsgi.ini @@ -0,0 +1,9 @@ +[uwsgi] +wsgi-file = /app/main.py +socket = /tmp/uwsgi.sock +chown-socket = nginx:nginx +chmod-socket = 664 +hook-master-start = unix_signal:15 gracefully_kill_them_all +need-app = true +die-on-term = true +show-config = false From 42dd1894c83c74c4b92b4e50b43aac6f9f0d0959 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 15 Jul 2025 13:19:02 +0200 Subject: [PATCH 51/76] Update repository --- .gitignore | 4 +- Discovery Server/Dockerfile | 45 ------------------ Discovery Server/README.md | 63 ------------------------- Discovery Server/app/main.py | 25 ---------- Discovery Server/compose.yml | 7 --- Discovery Server/entrypoint.sh | 71 ----------------------------- Discovery Server/stop-supervisor.sh | 8 ---- Discovery Server/supervisord.ini | 27 ----------- Discovery Server/uwsgi.ini | 9 ---- registry_server/app/__init__.py | 0 test.py | 26 +++++++++++ 11 files changed, 28 insertions(+), 257 deletions(-) delete mode 100644 Discovery Server/Dockerfile delete mode 100644 Discovery Server/README.md delete mode 100644 Discovery Server/app/main.py delete mode 100644 Discovery Server/compose.yml delete mode 100644 Discovery Server/entrypoint.sh delete mode 100644 Discovery Server/stop-supervisor.sh delete mode 100644 Discovery Server/supervisord.ini delete mode 100644 Discovery Server/uwsgi.ini delete mode 100644 registry_server/app/__init__.py create mode 100644 test.py diff --git a/.gitignore b/.gitignore index c78c82036..47f31defc 100644 --- a/.gitignore +++ b/.gitignore @@ -32,5 +32,5 @@ compliance_tool/aas_compliance_tool/version.py # ignore the content of the server storage server/storage/ -test.py/ -Json2RegoRulesConverter.py +test.py +/storage/ diff --git a/Discovery Server/Dockerfile b/Discovery Server/Dockerfile deleted file mode 100644 index 6dc3c4cac..000000000 --- a/Discovery Server/Dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -FROM python:3.11-alpine - -LABEL org.label-schema.name="Eclipse BaSyx" \ - org.label-schema.version="1.0" \ - org.label-schema.description="Docker image for the basyx-python-sdk server application" \ - org.label-schema.maintainer="Eclipse BaSyx" - -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 - -# If we have more dependencies for the server it would make sense -# to refactor uswgi to the pyproject.toml -RUN apk update && \ - apk add --no-cache nginx supervisor gcc musl-dev linux-headers python3-dev git bash && \ - pip install uwsgi && \ - pip install --no-cache-dir git+https://github.com/eclipse-basyx/basyx-python-sdk@main#subdirectory=sdk && \ - apk del git bash - - -COPY uwsgi.ini /etc/uwsgi/ -COPY supervisord.ini /etc/supervisor/conf.d/supervisord.ini -COPY stop-supervisor.sh /etc/supervisor/stop-supervisor.sh -RUN chmod +x /etc/supervisor/stop-supervisor.sh - -# Makes it possible to use a different configuration -ENV UWSGI_INI=/etc/uwsgi/uwsgi.ini -# object stores aren't thread-safe yet -# https://github.com/eclipse-basyx/basyx-python-sdk/issues/205 -ENV UWSGI_CHEAPER=0 -ENV UWSGI_PROCESSES=1 -ENV NGINX_MAX_UPLOAD=1M -ENV NGINX_WORKER_PROCESSES=1 -ENV LISTEN_PORT=80 -ENV CLIENT_BODY_BUFFER_SIZE=1M - -# Copy the entrypoint that will generate Nginx additional configs -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -ENTRYPOINT ["/entrypoint.sh"] - -COPY ./app /app -WORKDIR /app - -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] diff --git a/Discovery Server/README.md b/Discovery Server/README.md deleted file mode 100644 index a562dbae0..000000000 --- a/Discovery Server/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Eclipse BaSyx Python SDK - Discovery Service - -This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Discovery Service**. -It provides basic discovery functionality for AAS IDs and their corresponding assets, as specified in the official [Discovery Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/DiscoveryServiceSpecification/V3.1.0_SSP-001). - -## Overview - -The Discovery Service is a core component in the Asset Administration Shell ecosystem. Its main responsibility is to store and retrieve relations between AAS identifiers and asset identifiers. It acts as a lookup service for resolving asset-related queries to corresponding AAS. - -This implementation supports: - -- Adding links between AAS and assets -- Querying AAS by asset links -- Querying asset links by AAS ID -- Removing AAS-related asset links -- Configurable in-memory or MongoDB-based persistent storage - -## Features - -| Feature | Description | -|---------------------------------------------|-------------------------------------------------------| -| `add_asset_links` | Register specific asset ids linked to an AAS | -| `get_all_specific_asset_ids_by_aas_id` | Retrieve specific asset ids associated with an AAS | -| `search_aas_by_asset_link` | Find AAS identifiers by providing asset link values | -| `remove_asset_links_for_aas` | Delete all asset links associated with a specific AAS | - -## Specification Compliance - -- Complies with: **Discovery Service Specification v3.1.0_SSP-001** - -## Configuration - -The service can be configured to use either: - -- **In-memory storage** (default): Temporary data storage that resets on service restart. -- **MongoDB storage**: Persistent backend storage using MongoDB. - -### Configuration via Environment Variables - -| Variable | Description | Default | -|----------------|--------------------------------------------|-------------------------| -| `STORAGE_TYPE` | `inmemory` or `mongodb` | `inmemory` | -| `MONGODB_URI` | MongoDB connection URI | `mongodb://localhost:27017` | -| `MONGODB_DBNAME` | Name of the MongoDB database | `basyx_registry` | - -## Deployment via Docker - -A `Dockerfile` and `docker-compose.yml` are provided for simple deployment. - -## Acknowledgments - -This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker][10] repository. - -[1]: https://github.com/eclipse-basyx/basyx-python-sdk/pull/238 -[2]: https://basyx-python-sdk.readthedocs.io/en/latest/backend/local_file.html -[3]: https://github.com/eclipse-basyx/basyx-python-sdk -[4]: https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRepositoryServiceSpecification/V3.0.1_SSP-001 -[5]: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRepositoryServiceSpecification/V3.0.1_SSP-001 -[6]: https://industrialdigitaltwin.org/content-hub/aasspecifications/idta_01002-3-0_application_programming_interfaces -[7]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/aasx.html#adapter-aasx -[8]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/json.html -[9]: https://basyx-python-sdk.readthedocs.io/en/latest/adapter/xml.html -[10]: https://github.com/tiangolo/uwsgi-nginx-docker diff --git a/Discovery Server/app/main.py b/Discovery Server/app/main.py deleted file mode 100644 index 19c97b416..000000000 --- a/Discovery Server/app/main.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -import sys -from basyx.aas.adapter.discovery import DiscoveryAPI, MongoDiscoveryStore,InMemoryDiscoveryStore - -storage_type = os.getenv("STORAGE_TYPE", "inmemory") -base_path = os.getenv("API_BASE_PATH") - -wsgi_optparams = {} - -if base_path is not None: - wsgi_optparams["base_path"] = base_path - -if storage_type == "inmemory": - application = DiscoveryAPI(InMemoryDiscoveryStore(), **wsgi_optparams) - -elif storage_type in "mongodb": - uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") - dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") - - application = DiscoveryAPI(MongoDiscoveryStore(uri,dbname), **wsgi_optparams) - -else: - print(f"STORAGE_TYPE must be either inmemory or mongodb! Current value: {storage_type}", - file=sys.stderr) - diff --git a/Discovery Server/compose.yml b/Discovery Server/compose.yml deleted file mode 100644 index 6e1d65404..000000000 --- a/Discovery Server/compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -services: - app: - build: . - ports: - - "8084:80" - environment: - STORAGE_TYPE: inmemory diff --git a/Discovery Server/entrypoint.sh b/Discovery Server/entrypoint.sh deleted file mode 100644 index 722394409..000000000 --- a/Discovery Server/entrypoint.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env sh -set -e - -# Get the maximum upload file size for Nginx, default to 0: unlimited -USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} - -# Get the number of workers for Nginx, default to 1 -USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} - -# Set the max number of connections per worker for Nginx, if requested -# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below -NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} - -# Get the listen port for Nginx, default to 80 -USE_LISTEN_PORT=${LISTEN_PORT:-80} - -# Get the client_body_buffer_size for Nginx, default to 1M -USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} - -# Create the conf.d directory if it doesn't exist -if [ ! -d /etc/nginx/conf.d ]; then - mkdir -p /etc/nginx/conf.d -fi - -if [ -f /app/nginx.conf ]; then - cp /app/nginx.conf /etc/nginx/nginx.conf -else - content='user nginx;\n' - # Set the number of worker processes in Nginx - content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" - content=$content'error_log /var/log/nginx/error.log warn;\n' - content=$content'pid /var/run/nginx.pid;\n' - content=$content'events {\n' - content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" - content=$content'}\n' - content=$content'http {\n' - content=$content' include /etc/nginx/mime.types;\n' - content=$content' default_type application/octet-stream;\n' - content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" - content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" - content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" - content=$content' access_log /var/log/nginx/access.log main;\n' - content=$content' sendfile on;\n' - content=$content' keepalive_timeout 65;\n' - content=$content' include /etc/nginx/conf.d/*.conf;\n' - content=$content'}\n' - content=$content'daemon off;\n' - # Set the max number of open file descriptors for Nginx workers, if requested - if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then - content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" - fi - # Save generated /etc/nginx/nginx.conf - printf "$content" > /etc/nginx/nginx.conf - - content_server='server {\n' - content_server=$content_server" listen ${USE_LISTEN_PORT};\n" - content_server=$content_server' location / {\n' - content_server=$content_server' include uwsgi_params;\n' - content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' - content_server=$content_server' }\n' - content_server=$content_server'}\n' - # Save generated server /etc/nginx/conf.d/nginx.conf - printf "$content_server" > /etc/nginx/conf.d/nginx.conf - - # # Generate additional configuration - printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf - printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf - printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf -fi - -exec "$@" diff --git a/Discovery Server/stop-supervisor.sh b/Discovery Server/stop-supervisor.sh deleted file mode 100644 index 9a953c94b..000000000 --- a/Discovery Server/stop-supervisor.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -printf "READY\n" - -while read line; do - echo "Processing Event: $line" >&2 - kill $PPID -done < /dev/stdin diff --git a/Discovery Server/supervisord.ini b/Discovery Server/supervisord.ini deleted file mode 100644 index d73d98014..000000000 --- a/Discovery Server/supervisord.ini +++ /dev/null @@ -1,27 +0,0 @@ -[supervisord] -nodaemon=true - -[program:uwsgi] -command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[program:nginx] -command=/usr/sbin/nginx -stdout_logfile=/var/log/nginx.out.log -stdout_logfile_maxbytes=0 -stderr_logfile=/var/log/nginx.err.log -stderr_logfile_maxbytes=0 -stopsignal=QUIT -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[eventlistener:quit_on_failure] -events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL -command=/etc/supervisor/stop-supervisor.sh diff --git a/Discovery Server/uwsgi.ini b/Discovery Server/uwsgi.ini deleted file mode 100644 index 9c54ae1cc..000000000 --- a/Discovery Server/uwsgi.ini +++ /dev/null @@ -1,9 +0,0 @@ -[uwsgi] -wsgi-file = /app/main.py -socket = /tmp/uwsgi.sock -chown-socket = nginx:nginx -chmod-socket = 664 -hook-master-start = unix_signal:15 gracefully_kill_them_all -need-app = true -die-on-term = true -show-config = false diff --git a/registry_server/app/__init__.py b/registry_server/app/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/test.py b/test.py new file mode 100644 index 000000000..f66264eff --- /dev/null +++ b/test.py @@ -0,0 +1,26 @@ + +from server.app.interfaces.registry import * +if __name__ == "__main__": + from werkzeug.serving import run_simple + from basyx.aas.examples.data.example_aas import create_full_example + + run_simple("localhost", 8083, RegistryAPI(create_full_example()), + use_debugger=True, use_reloader=True) + +#from server.app.interfaces.discovery import * +#if __name__ == "__main__": +# from werkzeug.serving import run_simple + + # run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), + # use_debugger=True, use_reloader=True) +# from server.app.interfaces.repository import * +# if __name__ == "__main__": +# from werkzeug.serving import run_simple +# from basyx.aas.examples.data.example_aas import create_full_example +# +# run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), +# use_debugger=True, use_reloader=True) + + + + From d37bc01ebbcdb5d943c53b1d5b9b65ed9fd105f1 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 15 Jul 2025 13:22:57 +0200 Subject: [PATCH 52/76] Ignore test.py --- test.py | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 test.py diff --git a/test.py b/test.py deleted file mode 100644 index f66264eff..000000000 --- a/test.py +++ /dev/null @@ -1,26 +0,0 @@ - -from server.app.interfaces.registry import * -if __name__ == "__main__": - from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - - run_simple("localhost", 8083, RegistryAPI(create_full_example()), - use_debugger=True, use_reloader=True) - -#from server.app.interfaces.discovery import * -#if __name__ == "__main__": -# from werkzeug.serving import run_simple - - # run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), - # use_debugger=True, use_reloader=True) -# from server.app.interfaces.repository import * -# if __name__ == "__main__": -# from werkzeug.serving import run_simple -# from basyx.aas.examples.data.example_aas import create_full_example -# -# run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), -# use_debugger=True, use_reloader=True) - - - - From 01767c13cde64ddf9e6943d0f1d6a0c41f27e9d8 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 24 Feb 2026 13:24:32 +0100 Subject: [PATCH 53/76] add init --- server/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 server/__init__.py diff --git a/server/__init__.py b/server/__init__.py new file mode 100644 index 000000000..e69de29bb From 11669cf1257c0c806c165efb314075732b9c97b3 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Tue, 24 Feb 2026 15:28:37 +0100 Subject: [PATCH 54/76] Resolve import conflict --- server/app/interfaces/repository.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 18976c81b..ebfcea57d 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -22,7 +22,7 @@ from basyx.aas import model from basyx.aas.adapter import aasx -from util.converters import IdentifierToBase64URLConverter, IdShortPathConverter, base64url_decode +from server.app.util.converters import IdentifierToBase64URLConverter, IdShortPathConverter, base64url_decode from .base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder, T From 12d64bda47d0187ebccf480a31238b5fe945926e Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Sun, 1 Mar 2026 16:10:56 +0100 Subject: [PATCH 55/76] remove import errors --- server/app/adapter/jsonization.py | 14 ++++---- server/app/interfaces/discovery.py | 8 ++--- server/app/interfaces/registry.py | 8 ++--- server/app/model/__init__.py | 2 +- server/app/model/descriptor.py | 2 +- .../{service.py => service_specification.py} | 0 server/app/version.py | 34 ------------------- server/pyproject.toml | 1 + 8 files changed, 19 insertions(+), 50 deletions(-) rename server/app/model/{service.py => service_specification.py} (100%) delete mode 100644 server/app/version.py diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index e3e21f463..ca5fbb9e5 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -1,14 +1,16 @@ -from typing import Dict, Set, Optional, Type +from typing import Dict, Set, Optional, Type, Callable +import logging -import server.app.model as server_model from basyx.aas import model from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO, ASSET_KIND, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES from basyx.aas.adapter.json import AASToJsonEncoder -from basyx.aas.adapter.json.json_deserialization import _get_ts, AASFromJsonDecoder, \ - read_aas_json_file_into +from basyx.aas.adapter.json.json_deserialization import ( + _get_ts, + AASFromJsonDecoder, + read_aas_json_file_into, + ) -import logging -from typing import Callable +import app.model as server_model logger = logging.getLogger(__name__) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 7fcff41dd..0fe580b89 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -12,10 +12,10 @@ from werkzeug.wrappers import Request, Response from basyx.aas import model -from server.app.util.converters import IdentifierToBase64URLConverter -from server.app.interfaces.base import BaseWSGIApp, HTTPApiDecoder -from server.app import model as server_model -from server.app.adapter.jsonization import ServerAASToJsonEncoder +from app.util.converters import IdentifierToBase64URLConverter +from app.interfaces.base import BaseWSGIApp, HTTPApiDecoder +from app import model as server_model +from app.adapter.jsonization import ServerAASToJsonEncoder encoder=ServerAASToJsonEncoder() diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 69673da7f..49874a63e 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -2,7 +2,7 @@ This module implements the Registry interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. """ -from typing import Dict, Iterator, List, Type, Tuple +from typing import Dict, Iterator, Type, Tuple import werkzeug.exceptions import werkzeug.routing @@ -12,10 +12,10 @@ from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response -import server.app.model as server_model from basyx.aas import model -from server.app.util.converters import IdentifierToBase64URLConverter, base64url_decode -from server.app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder +import app.model as server_model +from app.util.converters import IdentifierToBase64URLConverter, base64url_decode +from app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder class RegistryAPI(ObjectStoreWSGIApp): diff --git a/server/app/model/__init__.py b/server/app/model/__init__.py index 0f5e5d953..79b363526 100644 --- a/server/app/model/__init__.py +++ b/server/app/model/__init__.py @@ -1,3 +1,3 @@ from .descriptor import * from .endpoint import * -from .service import * +from .service_specification import * diff --git a/server/app/model/descriptor.py b/server/app/model/descriptor.py index 38276cd2d..0edb2448b 100644 --- a/server/app/model/descriptor.py +++ b/server/app/model/descriptor.py @@ -4,7 +4,7 @@ from typing import Optional, Iterable, List from basyx.aas import model -from server.app.model.endpoint import Endpoint +from app.model.endpoint import Endpoint class Descriptor(model.HasExtension, metaclass=abc.ABCMeta): diff --git a/server/app/model/service.py b/server/app/model/service_specification.py similarity index 100% rename from server/app/model/service.py rename to server/app/model/service_specification.py diff --git a/server/app/version.py b/server/app/version.py deleted file mode 100644 index e057c6ca7..000000000 --- a/server/app/version.py +++ /dev/null @@ -1,34 +0,0 @@ -# file generated by setuptools-scm -# don't change, don't track in version control - -__all__ = [ - "__version__", - "__version_tuple__", - "version", - "version_tuple", - "__commit_id__", - "commit_id", -] - -TYPE_CHECKING = False -if TYPE_CHECKING: - from typing import Tuple - from typing import Union - - VERSION_TUPLE = Tuple[Union[int, str], ...] - COMMIT_ID = Union[str, None] -else: - VERSION_TUPLE = object - COMMIT_ID = object - -version: str -__version__: str -__version_tuple__: VERSION_TUPLE -version_tuple: VERSION_TUPLE -commit_id: COMMIT_ID -__commit_id__: COMMIT_ID - -__version__ = version = '0.1.dev2170+g5c5e1ae83.d20260224' -__version_tuple__ = version_tuple = (0, 1, 'dev2170', 'g5c5e1ae83.d20260224') - -__commit_id__ = commit_id = 'g5c5e1ae83' diff --git a/server/pyproject.toml b/server/pyproject.toml index 8c40deff9..cbcfcf6b3 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -38,6 +38,7 @@ requires-python = ">=3.10" dependencies = [ "urllib3>=1.26,<3", "Werkzeug>=3.0.3,<4", + "pymongo>=4.16.0", ] [project.optional-dependencies] From 70448ae4d8a18ad4fd3f63beaeb2f5e868d52457 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Sun, 1 Mar 2026 16:13:00 +0100 Subject: [PATCH 56/76] remove init file --- server/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 server/__init__.py diff --git a/server/__init__.py b/server/__init__.py deleted file mode 100644 index e69de29bb..000000000 From f885bcec7e689e66c1c61e86d80664e1e2f022d2 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Sun, 1 Mar 2026 18:08:27 +0100 Subject: [PATCH 57/76] correct errors --- server/app/interfaces/base.py | 6 ++-- server/app/interfaces/descriptorStore.py | 5 ++-- server/app/interfaces/discovery.py | 38 +++++++++++------------- server/app/interfaces/provider.py | 2 +- server/app/interfaces/repository.py | 6 ++-- server/app/model/endpoint.py | 5 +++- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 8234eddc2..14fb30c68 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -264,13 +264,13 @@ def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, res class ObjectStoreWSGIApp(BaseWSGIApp): object_store: AbstractObjectStore - def _get_all_obj_of_type(self, type_: Type[model.provider._IDENTIFIABLE]) -> Iterator[model.provider._IDENTIFIABLE]: + def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: for obj in self.object_store: if isinstance(obj, type_): yield obj - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IDENTIFIABLE]) \ - -> model.provider._IDENTIFIABLE: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) \ + -> model.provider._IT: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") diff --git a/server/app/interfaces/descriptorStore.py b/server/app/interfaces/descriptorStore.py index da85a212f..187684656 100644 --- a/server/app/interfaces/descriptorStore.py +++ b/server/app/interfaces/descriptorStore.py @@ -5,12 +5,11 @@ import json import threading from pathlib import Path -from typing import Dict, List, Optional, Set +from typing import Dict, List, Optional from abc import ABC, abstractmethod import logging -from basyx.aas import model -import server.app.model as server_model +import app.model as server_model logger = logging.getLogger(__name__) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 0fe580b89..68684c7f0 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -63,13 +63,12 @@ def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - serialized_assets = [encoder.default(asset_id) for asset_id in asset_ids] - if aas_id in self.aas_id_to_asset_ids: - for asset in serialized_assets: - if asset not in self.aas_id_to_asset_ids[aas_id]: - self.aas_id_to_asset_ids[aas_id].append(asset) - else: - self.aas_id_to_asset_ids[aas_id] = serialized_assets[:] + + if aas_id not in self.aas_id_to_asset_ids: + self.aas_id_to_asset_ids[aas_id] = set() + + for asset in asset_ids: + self.aas_id_to_asset_ids[aas_id].add(asset) def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: key = aas_id @@ -85,16 +84,16 @@ def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> Li return result def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = f"{asset_id.name}:{asset_id.value}" - if asset_key in self.asset_id_to_aas_ids: - self.asset_id_to_aas_ids[asset_key].add(aas_id) + if asset_id in self.asset_id_to_aas_ids: + self.asset_id_to_aas_ids[asset_id].add(aas_id) else: - self.asset_id_to_aas_ids[asset_key] = {aas_id} + self.asset_id_to_aas_ids[asset_id] = {aas_id} def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = f"{asset_id.name}:{asset_id.value}" - if asset_key in self.asset_id_to_aas_ids: - self.asset_id_to_aas_ids[asset_key].discard(aas_id) + if asset_id in self.asset_id_to_aas_ids: + self.asset_id_to_aas_ids[asset_id].discard(aas_id) + + class MongoDiscoveryStore(AbstractDiscoveryStore): @@ -103,7 +102,7 @@ def __init__(self, db_name: str = "basyx", coll_aas_to_assets: str = "aas_to_assets", coll_asset_to_aas: str = "asset_to_aas"): - self.client = MongoClient(uri) + self.client: MongoClient = MongoClient(uri) self.db = self.client[db_name] self.coll_aas_to_assets: Collection = self.db[coll_aas_to_assets] self.coll_asset_to_aas: Collection = self.db[coll_asset_to_aas] @@ -181,17 +180,16 @@ def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, res for asset_link in asset_links: aas_keys = self.persistent_store.search_aas_ids_by_asset_link(asset_link) matching_aas_keys.update(aas_keys) - matching_aas_keys = list(matching_aas_keys) - paginated_slice, cursor = self._get_slice(request, matching_aas_keys) + paginated_slice, cursor = self._get_slice(request, list(matching_aas_keys)) return response_t(list(paginated_slice), cursor=cursor) def get_all_specific_asset_ids_by_aas_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: - aas_identifier = url_args.get("aas_id") + aas_identifier = str(url_args["aas_id"]) asset_ids = self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier) return response_t(asset_ids) def post_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: - aas_identifier = url_args.get("aas_id") + aas_identifier = str(url_args["aas_id"]) specific_asset_ids = HTTPApiDecoder.request_body_list(request, model.SpecificAssetId, False) self.persistent_store.add_specific_asset_ids_to_aas(aas_identifier, specific_asset_ids) for asset_id in specific_asset_ids: @@ -200,7 +198,7 @@ def post_all_asset_links_by_id(self, request: Request, url_args: dict, response_ return response_t(updated) def delete_all_asset_links_by_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: - aas_identifier = url_args.get("aas_id") + aas_identifier = str(url_args["aas_id"]) self.persistent_store.delete_specific_asset_ids_by_aas_id(aas_identifier) for key in list(self.persistent_store.asset_id_to_aas_ids.keys()): self.persistent_store.asset_id_to_aas_ids[key].discard(aas_identifier) diff --git a/server/app/interfaces/provider.py b/server/app/interfaces/provider.py index ef4484c70..34f610442 100644 --- a/server/app/interfaces/provider.py +++ b/server/app/interfaces/provider.py @@ -138,7 +138,7 @@ def _dict_to_descriptor(self, data: Dict[str, Any]) -> object: signatures differ. """ # Lazy import to avoid heavy dependencies at module load time - from server.app.model.descriptor import ( + from app.model.descriptor import ( AssetAdministrationShellDescriptor, SubmodelDescriptor, ) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index c1ee513e5..935b481af 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -167,14 +167,14 @@ def __call__(self, environ, start_response) -> Iterable[bytes]: response: Response = self.handle_request(Request(environ)) return response(environ, start_response) - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IDENTIFIABLE]) \ - -> model.provider._IDENTIFIABLE: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) \ + -> model.provider._IT: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") return identifiable - def _get_all_obj_of_type(self, type_: Type[model.provider._IDENTIFIABLE]) -> Iterator[model.provider._IDENTIFIABLE]: + def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: for obj in self.object_store: if isinstance(obj, type_): yield obj diff --git a/server/app/model/endpoint.py b/server/app/model/endpoint.py index 3be6dc061..e7cc0e591 100644 --- a/server/app/model/endpoint.py +++ b/server/app/model/endpoint.py @@ -93,7 +93,10 @@ def is_valid_interface(cls, interface: base.NameType) -> bool: if len(parts) != 2: return False short_name, version = parts - return short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version) + if short_name in cls.INTERFACE_SHORTNAMES and cls.VERSION_PATTERN.match(version): + return True + else: + return False @property def protocol_information(self) -> ProtocolInformation: From 5389ab41a3d3db0e8aa0be4a52a09f71fe35e3f1 Mon Sep 17 00:00:00 2001 From: s-heppner Date: Wed, 11 Mar 2026 14:00:32 +0100 Subject: [PATCH 58/76] Add DescriptorStores (#75) * Add DescriptorStore * Fix unittests for LocalFileDescriptorStore --- server/app/backend/__init__.py | 0 server/app/backend/local_file.py | 174 +++++++++++++++++++++++++ server/app/model/provider.py | 45 +++++++ server/test/backend/__init__.py | 0 server/test/backend/test_local_file.py | 91 +++++++++++++ server/test/model/__init__.py | 0 server/test/model/test_provider.py | 52 ++++++++ 7 files changed, 362 insertions(+) create mode 100644 server/app/backend/__init__.py create mode 100644 server/app/backend/local_file.py create mode 100644 server/app/model/provider.py create mode 100644 server/test/backend/__init__.py create mode 100644 server/test/backend/test_local_file.py create mode 100644 server/test/model/__init__.py create mode 100644 server/test/model/test_provider.py diff --git a/server/app/backend/__init__.py b/server/app/backend/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/app/backend/local_file.py b/server/app/backend/local_file.py new file mode 100644 index 000000000..c31576f78 --- /dev/null +++ b/server/app/backend/local_file.py @@ -0,0 +1,174 @@ +from typing import Iterator, Dict, Type, Union +import logging +import json +import os +import hashlib +import threading +import weakref + +from app.model import AssetAdministrationShellDescriptor, SubmodelDescriptor +from basyx.aas import model +from basyx.aas.model import provider as sdk_provider + +from app.model.descriptor import Descriptor +from app.adapter import jsonization + + +logger = logging.getLogger(__name__) + + +# We need to resolve the Descriptor type in order to deserialize it again from JSON +DESCRIPTOR_TYPE_TO_STRING: Dict[Type[Union[AssetAdministrationShellDescriptor, SubmodelDescriptor]], str] = { + AssetAdministrationShellDescriptor: "AssetAdministrationShellDescriptor", + SubmodelDescriptor: "SubmodelDescriptor", +} + + +class LocalFileDescriptorStore(sdk_provider.AbstractObjectStore[model.Identifier, Descriptor]): + """ + An ObjectStore implementation for :class:`~app.model.descriptor.Descriptor` BaSyx Python SDK objects backed + by a local file based local backend + """ + def __init__(self, directory_path: str): + """ + Initializer of class LocalFileDescriptorStore + + :param directory_path: Path to the local file backend (the path where you want to store your AAS JSON files) + """ + self.directory_path: str = directory_path.rstrip("/") + + # A dictionary of weak references to local replications of stored objects. Objects are kept in this cache as + # long as there is any other reference in the Python application to them. We use this to make sure that only one + # local replication of each object is kept in the application and retrieving an object from the store always + # returns the **same** (not only equal) object. Still, objects are forgotten, when they are not referenced + # anywhere else to save memory. + self._object_cache: weakref.WeakValueDictionary[model.Identifier, Descriptor] \ + = weakref.WeakValueDictionary() + self._object_cache_lock = threading.Lock() + + def check_directory(self, create=False): + """ + Check if the directory exists and created it if not (and requested to do so) + + :param create: If True and the database does not exist, try to create it + """ + if not os.path.exists(self.directory_path): + if not create: + raise FileNotFoundError("The given directory ({}) does not exist".format(self.directory_path)) + # Create directory + os.mkdir(self.directory_path) + logger.info("Creating directory {}".format(self.directory_path)) + + def get_descriptor_by_hash(self, hash_: str) -> Descriptor: + """ + Retrieve an AAS Descriptor object from the local file by its identifier hash + + :raises KeyError: If the respective file could not be found + """ + # Try to get the correct file + try: + with open("{}/{}.json".format(self.directory_path, hash_), "r") as file: + obj = json.load(file, cls=jsonization.ServerAASFromJsonDecoder) + except FileNotFoundError as e: + raise KeyError("No Descriptor with hash {} found in local file database".format(hash_)) from e + # If we still have a local replication of that object (since it is referenced from anywhere else), update that + # replication and return it. + with self._object_cache_lock: + if obj.id in self._object_cache: + old_obj = self._object_cache[obj.id] + old_obj.update_from(obj) + return old_obj + self._object_cache[obj.id] = obj + return obj + + def get_item(self, identifier: model.Identifier) -> Descriptor: + """ + Retrieve an AAS Descriptor object from the local file by its :class:`~basyx.aas.model.base.Identifier` + + :raises KeyError: If the respective file could not be found + """ + try: + return self.get_descriptor_by_hash(self._transform_id(identifier)) + except KeyError as e: + raise KeyError("No Identifiable with id {} found in local file database".format(identifier)) from e + + def add(self, x: Descriptor) -> None: + """ + Add a Descriptor object to the store + + :raises KeyError: If an object with the same id exists already in the object store + """ + logger.debug("Adding object %s to Local File Store ...", repr(x)) + if os.path.exists("{}/{}.json".format(self.directory_path, self._transform_id(x.id))): + raise KeyError("Descriptor with id {} already exists in local file database".format(x.id)) + with open("{}/{}.json".format(self.directory_path, self._transform_id(x.id)), "w") as file: + # Usually, we don't need to serialize the modelType, since during HTTP requests, we know exactly if this + # is an AASDescriptor or SubmodelDescriptor. However, here we cannot distinguish them, so to deserialize + # them successfully, we hack the `modelType` into the JSON. + serialized = json.loads( + json.dumps(x, cls=jsonization.ServerAASToJsonEncoder) + ) + serialized["modelType"] = DESCRIPTOR_TYPE_TO_STRING[type(x)] + json.dump(serialized, file, indent=4) + with self._object_cache_lock: + self._object_cache[x.id] = x + + def discard(self, x: Descriptor) -> None: + """ + Delete an :class:`~app.model.descriptor.Descriptor` AAS object from the local file store + + :param x: The object to be deleted + :raises KeyError: If the object does not exist in the database + """ + logger.debug("Deleting object %s from Local File Store database ...", repr(x)) + try: + os.remove("{}/{}.json".format(self.directory_path, self._transform_id(x.id))) + except FileNotFoundError as e: + raise KeyError("No AAS Descriptor object with id {} exists in local file database".format(x.id)) from e + with self._object_cache_lock: + self._object_cache.pop(x.id, None) + + def __contains__(self, x: object) -> bool: + """ + Check if an object with the given :class:`~basyx.aas.model.base.Identifier` or the same + :class:`~basyx.aas.model.base.Identifier` as the given object is contained in the local file database + + :param x: AAS object :class:`~basyx.aas.model.base.Identifier` or :class:`~app.model.descriptor.Descriptor` + AAS object + :return: ``True`` if such an object exists in the database, ``False`` otherwise + """ + if isinstance(x, model.Identifier): + identifier = x + elif isinstance(x, Descriptor): + identifier = x.id + else: + return False + logger.debug("Checking existence of Descriptor object with id %s in database ...", repr(x)) + return os.path.exists("{}/{}.json".format(self.directory_path, self._transform_id(identifier))) + + def __len__(self) -> int: + """ + Retrieve the number of objects in the local file database + + :return: The number of objects (determined from the number of documents) + """ + logger.debug("Fetching number of documents from database ...") + return len(os.listdir(self.directory_path)) + + def __iter__(self) -> Iterator[Descriptor]: + """ + Iterate all :class:`~app.model.descriptor.Descriptor` objects in the local folder. + + This method returns an iterator, containing only a list of all identifiers in the database and retrieving + the identifiable objects on the fly. + """ + logger.debug("Iterating over objects in database ...") + for name in os.listdir(self.directory_path): + yield self.get_descriptor_by_hash(name.rstrip(".json")) + + @staticmethod + def _transform_id(identifier: model.Identifier) -> str: + """ + Helper method to represent an ASS Identifier as a string to be used as Local file document id + """ + return hashlib.sha256(identifier.encode("utf-8")).hexdigest() \ No newline at end of file diff --git a/server/app/model/provider.py b/server/app/model/provider.py new file mode 100644 index 000000000..6ed8a2614 --- /dev/null +++ b/server/app/model/provider.py @@ -0,0 +1,45 @@ +from typing import Iterable, Dict, TypeVar, Iterator + +from basyx.aas import model +from basyx.aas.model import provider as sdk_provider + +from app.model.descriptor import Descriptor + +_DESCRIPTOR_TYPE = TypeVar("_DESCRIPTOR_TYPE", bound=Descriptor) + +class DictDescriptorStore(sdk_provider.AbstractObjectStore[model.Identifier, _DESCRIPTOR_TYPE]): + """ + A local in-memory object store for :class:`~app.model.descriptor.Descriptor` objects, backed by a dict, mapping + :class:`~basyx.aas.model.base.Identifier` → :class:`~app.model.descriptor.Descriptor` + """ + + def __init__(self, descriptors: Iterable[_DESCRIPTOR_TYPE] = ()) -> None: + self._backend: Dict[model.Identifier, _DESCRIPTOR_TYPE] = {} + for x in descriptors: + self.add(x) + + def get_item(self, identifier: model.Identifier) -> _DESCRIPTOR_TYPE: + return self._backend[identifier] + + def add(self, x: _DESCRIPTOR_TYPE) -> None: + if x.id in self._backend and self._backend.get(x.id) is not x: + raise KeyError("Descriptor object with same id {} is already stored in this store" + .format(x.id)) + self._backend[x.id] = x + + def discard(self, x: _DESCRIPTOR_TYPE) -> None: + if self._backend.get(x.id) is x: + del self._backend[x.id] + + def __contains__(self, x: object) -> bool: + if isinstance(x, model.Identifier): + return x in self._backend + if not isinstance(x, Descriptor): + return False + return self._backend.get(x.id) is x + + def __len__(self) -> int: + return len(self._backend) + + def __iter__(self) -> Iterator[_DESCRIPTOR_TYPE]: + return iter(self._backend.values()) diff --git a/server/test/backend/__init__.py b/server/test/backend/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/test/backend/test_local_file.py b/server/test/backend/test_local_file.py new file mode 100644 index 000000000..a5a7281c9 --- /dev/null +++ b/server/test/backend/test_local_file.py @@ -0,0 +1,91 @@ +# Copyright (c) 2026 the Eclipse BaSyx Authors +# +# This program and the accompanying materials are made available under the terms of the MIT License, available in +# the LICENSE file of this project. +# +# SPDX-License-Identifier: MIT +import os.path +import shutil + +from unittest import TestCase + +from app.backend import local_file +from app import model +from app.model import provider + +store_path: str = os.path.dirname(__file__) + "/local_file_test_folder" +source_core: str = "file://localhost/{}/".format(store_path) + + +class LocalFileBackendTest(TestCase): + def setUp(self) -> None: + self.descriptor_store = local_file.LocalFileDescriptorStore(store_path) + self.descriptor_store.check_directory(create=True) + self.mock_endpoint = model.Endpoint( + interface="AAS-3.0", + protocol_information=model.ProtocolInformation(href="https://example.org/") + ) + self.aasd1 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/1", + endpoints=[self.mock_endpoint]) + self.aasd2 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/2", + endpoints=[self.mock_endpoint]) + self.sd1 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/1", + endpoints=[self.mock_endpoint]) + self.sd2 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/2", + endpoints=[self.mock_endpoint]) + + def tearDown(self) -> None: + try: + self.descriptor_store.clear() + finally: + shutil.rmtree(store_path) + + + def test_add(self) -> None: + self.descriptor_store.add(self.aasd1) + # Note that this test is only checking that there are no errors during adding. + # The actual logic is tested together with retrieval in `test_retrieval`. + + def test_retrieval(self) -> None: + self.descriptor_store.add(self.sd1) + + # When retrieving the object, we should get the *same* instance as we added + retrieved_descriptor = self.descriptor_store.get_item("https://example.org/SubmodelDescriptor/1") + self.assertIs(self.sd1, retrieved_descriptor) + + def test_iterating(self) -> None: + self.descriptor_store.add(self.sd1) + self.descriptor_store.add(self.sd2) + self.descriptor_store.add(self.aasd1) + self.descriptor_store.add(self.aasd2) + self.assertEqual(4, len(self.descriptor_store)) + + # Iterate objects, add them to a DictDescriptorStore and check them + retrieved_descriptor_store = provider.DictDescriptorStore() + for item in self.descriptor_store: + retrieved_descriptor_store.add(item) + self.assertEqual(4, len(retrieved_descriptor_store)) + self.assertIn(self.sd1, retrieved_descriptor_store) + self.assertIn(self.sd2, retrieved_descriptor_store) + self.assertIn(self.aasd1, retrieved_descriptor_store) + self.assertIn(self.aasd2, retrieved_descriptor_store) + + def test_key_errors(self) -> None: + self.descriptor_store.add(self.aasd1) + with self.assertRaises(KeyError) as cm: + self.descriptor_store.add(self.aasd1) + self.assertEqual("'Descriptor with id https://example.org/AASDescriptor/1 already exists in " + "local file database'", str(cm.exception)) + + self.descriptor_store.discard(self.aasd1) + with self.assertRaises(KeyError) as cm: + self.descriptor_store.get_item("https://example.org/AASDescriptor/1") + self.assertIsNone(self.descriptor_store.get("https://example.org/AASDescriptor/1")) + self.assertEqual("'No Identifiable with id https://example.org/AASDescriptor/1 found in local " + "file database'", str(cm.exception)) + + def test_reload_discard(self) -> None: + self.descriptor_store.add(self.sd1) + self.descriptor_store = local_file.LocalFileDescriptorStore(store_path) + self.descriptor_store.discard(self.sd1) + self.assertNotIn(self.sd1, self.descriptor_store) \ No newline at end of file diff --git a/server/test/model/__init__.py b/server/test/model/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/server/test/model/test_provider.py b/server/test/model/test_provider.py new file mode 100644 index 000000000..55d6129e4 --- /dev/null +++ b/server/test/model/test_provider.py @@ -0,0 +1,52 @@ +import unittest + +from app import model +from app.model.provider import DictDescriptorStore + +class DictDescriptorStoreTest(unittest.TestCase): + def setUp(self) -> None: + self.mock_endpoint = model.Endpoint( + interface="AAS-3.0", + protocol_information=model.ProtocolInformation(href="https://example.org/") + ) + self.aasd1 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/1", + endpoints=[self.mock_endpoint]) + self.aasd2 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/2", + endpoints=[self.mock_endpoint]) + self.sd1 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/1", + endpoints=[self.mock_endpoint]) + self.sd2 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/2", + endpoints=[self.mock_endpoint]) + + def test_store_retrieve(self) -> None: + descriptor_store: DictDescriptorStore = DictDescriptorStore() + descriptor_store.add(self.aasd1) + descriptor_store.add(self.aasd2) + self.assertIn(self.aasd1, descriptor_store) + self.assertFalse(self.sd1 in descriptor_store) + + aasd3 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/1", + endpoints=[self.mock_endpoint]) + with self.assertRaises(KeyError) as cm: + descriptor_store.add(aasd3) + self.assertEqual("'Descriptor object with same id https://example.org/AASDescriptor/1 is already " + "stored in this store'", str(cm.exception)) + self.assertEqual(2, len(descriptor_store)) + self.assertIs(self.aasd1, descriptor_store.get("https://example.org/AASDescriptor/1")) + + descriptor_store.discard(self.aasd1) + with self.assertRaises(KeyError) as cm: + descriptor_store.get_item("https://example.org/AASDescriptor/1") + self.assertIsNone(descriptor_store.get("https://example.org/AASDescriptor/1")) + self.assertEqual("'https://example.org/AASDescriptor/1'", str(cm.exception)) + self.assertIs(self.aasd2, descriptor_store.pop()) + self.assertEqual(0, len(descriptor_store)) + + def test_store_update(self) -> None: + descriptor_store1: DictDescriptorStore = DictDescriptorStore() + descriptor_store2: DictDescriptorStore = DictDescriptorStore() + descriptor_store1.add(self.sd1) + descriptor_store2.add(self.sd2) + descriptor_store1.update(descriptor_store2) + self.assertIsInstance(descriptor_store1, DictDescriptorStore) + self.assertIn(self.sd2, descriptor_store1) From d2761de844f43606f194ab5eb982dc0c0b3b2938 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 11 Mar 2026 14:27:18 +0100 Subject: [PATCH 59/76] Delete unnecessary files descriptorStore.py and provider.py --- server/app/interfaces/descriptorStore.py | 240 ----------------------- server/app/interfaces/provider.py | 176 ----------------- 2 files changed, 416 deletions(-) delete mode 100644 server/app/interfaces/descriptorStore.py delete mode 100644 server/app/interfaces/provider.py diff --git a/server/app/interfaces/descriptorStore.py b/server/app/interfaces/descriptorStore.py deleted file mode 100644 index 187684656..000000000 --- a/server/app/interfaces/descriptorStore.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -Persistent Storage for BaSyx Registry API -Supports AssetAdministrationShellDescriptors and SubmodelDescriptors -""" -import json -import threading -from pathlib import Path -from typing import Dict, List, Optional -from abc import ABC, abstractmethod -import logging - -import app.model as server_model - -logger = logging.getLogger(__name__) - - -class RegistryStorageInterface(ABC): - """Abstract interface for registry storage implementations""" - - @abstractmethod - def save_aas_descriptor(self, descriptor: server_model.AssetAdministrationShellDescriptor) -> None: - """Save or update an AAS descriptor""" - pass - - @abstractmethod - def get_aas_descriptor(self, aas_id: str) -> Optional[server_model.AssetAdministrationShellDescriptor]: - """Retrieve an AAS descriptor by ID""" - pass - - @abstractmethod - def delete_aas_descriptor(self, aas_id: str) -> bool: - """Delete an AAS descriptor. Returns True if deleted, False if not found""" - pass - - @abstractmethod - def list_aas_descriptors(self) -> List[server_model.AssetAdministrationShellDescriptor]: - """List all AAS descriptors""" - pass - - @abstractmethod - def save_submodel_descriptor(self, descriptor: server_model.SubmodelDescriptor) -> None: - """Save or update a Submodel descriptor""" - pass - - @abstractmethod - def get_submodel_descriptor(self, submodel_id: str) -> Optional[server_model.SubmodelDescriptor]: - """Retrieve a Submodel descriptor by ID""" - pass - - @abstractmethod - def delete_submodel_descriptor(self, submodel_id: str) -> bool: - """Delete a Submodel descriptor. Returns True if deleted, False if not found""" - pass - - @abstractmethod - def list_submodel_descriptors(self) -> List[server_model.SubmodelDescriptor]: - """List all Submodel descriptors""" - pass - - -class JsonFileStorage(RegistryStorageInterface): - """ - File-based persistent storage using JSON. - Thread-safe with automatic saving. - """ - - def __init__(self, storage_path: str = "registry_storage.json"): - self.storage_path = Path(storage_path) - self.lock = threading.RLock() - self.data = { - "aas_descriptors": {}, - "submodel_descriptors": {} - } - self._load() - - def _load(self) -> None: - """Load data from file""" - if self.storage_path.exists(): - try: - with open(self.storage_path, 'r', encoding='utf-8') as f: - loaded_data = json.load(f) - self.data = loaded_data - logger.info(f"Loaded registry data from {self.storage_path}") - except Exception as e: - logger.error(f"Failed to load registry data: {e}") - # Keep empty data structure on error - - def _save(self) -> None: - """Save data to file""" - try: - # Write to temporary file first, then rename (atomic operation) - temp_path = self.storage_path.with_suffix('.tmp') - with open(temp_path, 'w', encoding='utf-8') as f: - json.dump(self.data, f, indent=2, ensure_ascii=False) - temp_path.replace(self.storage_path) - logger.debug(f"Saved registry data to {self.storage_path}") - except Exception as e: - logger.error(f"Failed to save registry data: {e}") - - def save_aas_descriptor(self, descriptor: server_model.AssetAdministrationShellDescriptor) -> None: - with self.lock: - # Convert descriptor to dict for JSON serialization - descriptor_dict = self._serialize_descriptor(descriptor) - aas_id = self._get_identifier(descriptor) - self.data["aas_descriptors"][aas_id] = descriptor_dict - self._save() - - def get_aas_descriptor(self, aas_id: str) -> Optional[server_model.AssetAdministrationShellDescriptor]: - with self.lock: - descriptor_dict = self.data["aas_descriptors"].get(aas_id) - if descriptor_dict: - return self._deserialize_descriptor(descriptor_dict, server_model.AssetAdministrationShellDescriptor) - return None - - def delete_aas_descriptor(self, aas_id: str) -> bool: - with self.lock: - if aas_id in self.data["aas_descriptors"]: - del self.data["aas_descriptors"][aas_id] - self._save() - return True - return False - - def list_aas_descriptors(self) -> List[server_model.AssetAdministrationShellDescriptor]: - with self.lock: - return [ - self._deserialize_descriptor(desc_dict, server_model.AssetAdministrationShellDescriptor) - for desc_dict in self.data["aas_descriptors"].values() - ] - - def save_submodel_descriptor(self, descriptor: server_model.SubmodelDescriptor) -> None: - with self.lock: - descriptor_dict = self._serialize_descriptor(descriptor) - submodel_id = self._get_identifier(descriptor) - self.data["submodel_descriptors"][submodel_id] = descriptor_dict - self._save() - - def get_submodel_descriptor(self, submodel_id: str) -> Optional[server_model.SubmodelDescriptor]: - with self.lock: - descriptor_dict = self.data["submodel_descriptors"].get(submodel_id) - if descriptor_dict: - return self._deserialize_descriptor(descriptor_dict, server_model.SubmodelDescriptor) - return None - - def delete_submodel_descriptor(self, submodel_id: str) -> bool: - with self.lock: - if submodel_id in self.data["submodel_descriptors"]: - del self.data["submodel_descriptors"][submodel_id] - self._save() - return True - return False - - def list_submodel_descriptors(self) -> List[server_model.SubmodelDescriptor]: - with self.lock: - return [ - self._deserialize_descriptor(desc_dict, server_model.SubmodelDescriptor) - for desc_dict in self.data["submodel_descriptors"].values() - ] - - def _serialize_descriptor(self, descriptor) -> dict: - """Convert descriptor object to JSON-serializable dict""" - # Use your ServerAASToJsonEncoder here - from server.app.adapter.jsonization import ServerAASToJsonEncoder - return json.loads(json.dumps(descriptor, cls=ServerAASToJsonEncoder)) - - def _deserialize_descriptor(self, descriptor_dict: dict, descriptor_class): - """Convert dict back to descriptor object""" - # Use your JSON deserialization logic here - from server.app.adapter.jsonization import AASFromJsonDecoder - # You'll need to adapt this based on your actual deserialization approach - return descriptor_class(**descriptor_dict) - - def _get_identifier(self, descriptor) -> str: - """Extract identifier from descriptor""" - if hasattr(descriptor, 'id'): - return str(descriptor.id) - elif hasattr(descriptor, 'identification'): - return str(descriptor.identification.id) - else: - raise ValueError(f"Cannot extract identifier from descriptor: {descriptor}") - - -class InMemoryStorage(RegistryStorageInterface): - """ - In-memory storage (no persistence). - Useful for testing and development. - """ - - def __init__(self): - self.aas_descriptors: Dict[str, server_model.AssetAdministrationShellDescriptor] = {} - self.submodel_descriptors: Dict[str, server_model.SubmodelDescriptor] = {} - self.lock = threading.RLock() - - def save_aas_descriptor(self, descriptor: server_model.AssetAdministrationShellDescriptor) -> None: - with self.lock: - aas_id = self._get_identifier(descriptor) - self.aas_descriptors[aas_id] = descriptor - - def get_aas_descriptor(self, aas_id: str) -> Optional[server_model.AssetAdministrationShellDescriptor]: - with self.lock: - return self.aas_descriptors.get(aas_id) - - def delete_aas_descriptor(self, aas_id: str) -> bool: - with self.lock: - if aas_id in self.aas_descriptors: - del self.aas_descriptors[aas_id] - return True - return False - - def list_aas_descriptors(self) -> List[server_model.AssetAdministrationShellDescriptor]: - with self.lock: - return list(self.aas_descriptors.values()) - - def save_submodel_descriptor(self, descriptor: server_model.SubmodelDescriptor) -> None: - with self.lock: - submodel_id = self._get_identifier(descriptor) - self.submodel_descriptors[submodel_id] = descriptor - - def get_submodel_descriptor(self, submodel_id: str) -> Optional[server_model.SubmodelDescriptor]: - with self.lock: - return self.submodel_descriptors.get(submodel_id) - - def delete_submodel_descriptor(self, submodel_id: str) -> bool: - with self.lock: - if submodel_id in self.submodel_descriptors: - del self.submodel_descriptors[submodel_id] - return True - return False - - def list_submodel_descriptors(self) -> List[server_model.SubmodelDescriptor]: - with self.lock: - return list(self.submodel_descriptors.values()) - - def _get_identifier(self, descriptor) -> str: - """Extract identifier from descriptor""" - if hasattr(descriptor, 'id'): - return str(descriptor.id) - elif hasattr(descriptor, 'identification'): - return str(descriptor.identification.id) - else: - raise ValueError(f"Cannot extract identifier from descriptor: {descriptor}") diff --git a/server/app/interfaces/provider.py b/server/app/interfaces/provider.py deleted file mode 100644 index 34f610442..000000000 --- a/server/app/interfaces/provider.py +++ /dev/null @@ -1,176 +0,0 @@ -import os -from typing import MutableSet, Type, Iterator, Iterable, Dict, Optional, Any - -from basyx.aas import model -import json - - - - -class DescriptorStore(MutableSet[object]): - """A simple in‑memory store for descriptor objects. - - The store uses a dictionary keyed by the descriptor's ``id`` attribute. - It enforces that at most one descriptor with a given identifier is - present. Membership checks can be performed either by descriptor - instance or by identifier string. Objects added to this store must - expose an ``id`` attribute. - """ - - def __init__(self, objects: Iterable[object] = ()) -> None: - self._backend: Dict[str, object] = {} - for obj in objects: - self.add(obj) - - def add(self, obj: object) -> None: - """Add a descriptor to the store. - - :param obj: The descriptor object to add. The object must have - an ``id`` attribute. If another descriptor with the same - identifier already exists, a :class:`KeyError` is raised. - """ - if not hasattr(obj, "id"): - raise TypeError("Objects stored in DescriptorStore must have an 'id' attribute") - identifier: model.Identifier = getattr(obj, "id") - if identifier in self._backend and self._backend[identifier] is not obj: - raise KeyError(f"Descriptor object with same id {identifier!r} is already stored") - self._backend[identifier] = obj - - def discard(self, obj: object) -> None: - """Remove a descriptor from the store if present. - - :param obj: The descriptor object to remove. If the object is not - present in the store, this method does nothing. - """ - if not hasattr(obj, "id"): - return - identifier: model.Identifier = getattr(obj, "id") # type: ignore[assignment] - if self._backend.get(identifier) is obj: - del self._backend[identifier] - - def __contains__(self, obj: object) -> bool: # type: ignore[override] - """Check whether a descriptor or identifier is contained in the store. - - :param obj: Either a descriptor instance or an identifier string. - :return: ``True`` if the object or identifier is present in the store. - """ - # Allow lookup by id string directly - if isinstance(obj, str): - return obj in self._backend - # Otherwise, ensure it's a descriptor and compare by identity - if not hasattr(obj, "id"): - return False - identifier: model.Identifier = getattr(obj, "id") # type: ignore[assignment] - return self._backend.get(identifier) is obj - - def __len__(self) -> int: # type: ignore[override] - return len(self._backend) - - def __iter__(self) -> Iterator[object]: # type: ignore[override] - return iter(self._backend.values()) - - # Additional helper methods - def get_descriptor(self, identifier: model.Identifier) -> object: - """Retrieve a descriptor by its identifier. - - :param identifier: The descriptor's identifier. - :return: The descriptor instance stored under the given identifier. - :raises KeyError: If no descriptor with the given identifier exists. - """ - return self._backend[identifier] - - def get(self, identifier: model.Identifier, default: Optional[object] = None) -> Optional[object]: - """Retrieve a descriptor by its identifier, returning a default if not found. - - :param identifier: The descriptor's identifier. - :param default: The value to return if the identifier is not present. - :return: The descriptor instance or ``default``. - """ - return self._backend.get(identifier, default) - - -class PersistentDescriptorStore(DescriptorStore): - """A descriptor store that persists its contents to a JSON file. - - The store writes out the entire collection of descriptors whenever - it is modified. At initialization time it attempts to read - existing descriptor data from the given file. The file on disk - will be created automatically if it does not exist. - """ - - def __init__(self, file_path: str, objects: Iterable[object] = ()) -> None: - #: Path to the backing JSON file. - self._file_path = file_path - # If a file exists, prepopulate the backend from it; otherwise start - # with an empty store. We intentionally bypass the DescriptorStore - # constructor here because we want to load from disk before adding - # any objects passed in via the ``objects`` iterable. - if os.path.isfile(self._file_path): - self._backend = self._load_from_file() - else: - self._backend = {} - # Add initial objects, if any; they will overwrite duplicates. - for obj in objects: - self.add(obj) - # Ensure the file exists and reflects the current state. - self._save_to_file() - - # -- Serialization helpers ------------------------------------------------ - - def _descriptor_to_dict(self, obj: object) -> Dict[str, Any]: - """Serialize a descriptor object into a JSON‑friendly dictionary. - - The default implementation uses ``vars(obj)`` (i.e., the object's - ``__dict__``) and filters out callables and private attributes. - Override this method if your descriptor classes require custom - serialization. - """ - return {k: v for k, v in vars(obj).items() if not callable(v) and not k.startswith("_")} - - def _dict_to_descriptor(self, data: Dict[str, Any]) -> object: - """Deserialize a JSON dictionary back into a descriptor object. - - This method instantiates either an - ``AssetAdministrationShellDescriptor`` or a ``SubmodelDescriptor`` - based on the presence of characteristic fields. It passes - all attributes except ``id`` to the descriptor constructor. - Override this method if your descriptor types or construction - signatures differ. - """ - # Lazy import to avoid heavy dependencies at module load time - from app.model.descriptor import ( - AssetAdministrationShellDescriptor, - SubmodelDescriptor, - ) - kwargs = {k: v for k, v in data.items() if k != "id"} - if "endpoints" in data and "asset_kind" in data: - return AssetAdministrationShellDescriptor(id_=data["id"], **kwargs) - else: - return SubmodelDescriptor(id_=data["id"], **kwargs) - - def _load_from_file(self) -> Dict[str, object]: - """Read descriptor data from the backing JSON file.""" - with open(self._file_path, "r", encoding="utf-8") as f: - raw_data: Dict[str, Dict[str, Any]] = json.load(f) - return {identifier: self._dict_to_descriptor(d) for identifier, d in raw_data.items()} - - def _save_to_file(self) -> None: - """Write the current collection of descriptors to the backing file.""" - raw_data: Dict[str, Dict[str, Any]] = { - identifier: self._descriptor_to_dict(obj) for identifier, obj in self._backend.items() - } - os.makedirs(os.path.dirname(self._file_path), exist_ok=True) - with open(self._file_path, "w", encoding="utf-8") as f: - json.dump(raw_data, f, indent=2) - - # -- Overrides of DescriptorStore methods --------------------------------- - - def add(self, obj: object) -> None: - """Add a descriptor and persist the updated store.""" - super().add(obj) - self._save_to_file() - - def discard(self, obj: object) -> None: - """Remove a descriptor, if present, and persist the updated store.""" - super().discard(obj) - self._save_to_file() From 990e03a80e2a436c6d8805ebc5951c0aa52b00f1 Mon Sep 17 00:00:00 2001 From: s-heppner Date: Wed, 11 Mar 2026 15:04:06 +0100 Subject: [PATCH 60/76] Fix DiscoveryStore and remove MongoDB dependency --- discovery_server/app/main.py | 26 +++--- discovery_server/compose.yml | 2 +- server/app/interfaces/discovery.py | 126 +++++++---------------------- server/pyproject.toml | 1 - 4 files changed, 44 insertions(+), 111 deletions(-) diff --git a/discovery_server/app/main.py b/discovery_server/app/main.py index 0092e6918..22322f86a 100644 --- a/discovery_server/app/main.py +++ b/discovery_server/app/main.py @@ -1,8 +1,9 @@ import os -import sys -from server.app.interfaces.discovery import DiscoveryAPI, MongoDiscoveryStore,InMemoryDiscoveryStore +import atexit -storage_type = os.getenv("STORAGE_TYPE", "inmemory") +from server.app.interfaces.discovery import DiscoveryAPI, DiscoveryStore + +storage_path = os.getenv("storage_path", None) base_path = os.getenv("API_BASE_PATH") wsgi_optparams = {} @@ -10,16 +11,17 @@ if base_path is not None: wsgi_optparams["base_path"] = base_path -if storage_type == "inmemory": - application = DiscoveryAPI(InMemoryDiscoveryStore(), **wsgi_optparams) -elif storage_type == "mongodb": - uri = os.getenv("MONGODB_URI", "mongodb://localhost:27017") - dbname = os.getenv("MONGODB_DBNAME", "basyx_registry") +# Load DiscoveryStore from disk, if `storage_path` is set +if storage_path: + discovery_store: DiscoveryStore = DiscoveryStore.from_file(storage_path) +else: + discovery_store = DiscoveryStore() - application = DiscoveryAPI(MongoDiscoveryStore(uri,dbname), **wsgi_optparams) +def persist_store(): + if storage_path: + discovery_store.to_file(storage_path) -else: - print(f"STORAGE_TYPE must be either inmemory or mongodb! Current value: {storage_type}", - file=sys.stderr) +atexit.register(persist_store) +application = DiscoveryAPI(discovery_store, **wsgi_optparams) diff --git a/discovery_server/compose.yml b/discovery_server/compose.yml index 56be002e1..60577dd73 100644 --- a/discovery_server/compose.yml +++ b/discovery_server/compose.yml @@ -6,4 +6,4 @@ services: ports: - "8084:80" environment: - - STORAGE_TYPE=inmemory + - storage_path="./discovery_store" diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 68684c7f0..8db2c839d 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -3,6 +3,7 @@ """ import abc +import json from typing import Dict, List, Set, Any import werkzeug.exceptions @@ -15,45 +16,10 @@ from app.util.converters import IdentifierToBase64URLConverter from app.interfaces.base import BaseWSGIApp, HTTPApiDecoder from app import model as server_model -from app.adapter.jsonization import ServerAASToJsonEncoder +from app.adapter import jsonization -encoder=ServerAASToJsonEncoder() -class AbstractDiscoveryStore(metaclass=abc.ABCMeta): - aas_id_to_asset_ids: Any - asset_id_to_aas_ids: Any - - @abc.abstractmethod - def __init__(self): - pass - - @abc.abstractmethod - def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: - pass - - @abc.abstractmethod - def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - pass - - @abc.abstractmethod - def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: - pass - - @abc.abstractmethod - def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: - pass - - @abc.abstractmethod - def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_identifier: model.Identifier) -> None: - pass - - @abc.abstractmethod - def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - pass - - - -class InMemoryDiscoveryStore(AbstractDiscoveryStore): +class DiscoveryStore: def __init__(self): self.aas_id_to_asset_ids: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} self.asset_id_to_aas_ids: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} @@ -93,69 +59,35 @@ def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId if asset_id in self.asset_id_to_aas_ids: self.asset_id_to_aas_ids[asset_id].discard(aas_id) - - - -class MongoDiscoveryStore(AbstractDiscoveryStore): - def __init__(self, - uri: str = "mongodb://localhost:27017", - db_name: str = "basyx", - coll_aas_to_assets: str = "aas_to_assets", - coll_asset_to_aas: str = "asset_to_aas"): - self.client: MongoClient = MongoClient(uri) - self.db = self.client[db_name] - self.coll_aas_to_assets: Collection = self.db[coll_aas_to_assets] - self.coll_asset_to_aas: Collection = self.db[coll_asset_to_aas] - # Create an index for fast asset reverse lookups. - self.coll_asset_to_aas.create_index("_id") - - def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: - key = aas_id - doc = self.coll_aas_to_assets.find_one({"_id": key}) - return doc["asset_ids"] if doc and "asset_ids" in doc else [] - - def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: - key = aas_id - # Convert each SpecificAssetId using the serialization helper. - serializable_assets = [encoder.default(asset_id) for asset_id in asset_ids] - self.coll_aas_to_assets.update_one( - {"_id": key}, - {"$addToSet": {"asset_ids": {"$each": serializable_assets}}}, - upsert=True - ) - - def delete_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> None: - key = aas_id - self.coll_aas_to_assets.delete_one({"_id": key}) - - def search_aas_ids_by_asset_link(self, asset_link: server_model.AssetLink) -> List[model.Identifier]: - # Query MongoDB for specificAssetIds where 'name' and 'value' match - doc = self.coll_asset_to_aas.find_one({ - "name": asset_link.name, - "value": asset_link.value - }) - return doc["aas_ids"] if doc and "aas_ids" in doc else [] - - def _add_aas_id_to_specific_asset_id(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = str(encoder.default(asset_id)) - self.coll_asset_to_aas.update_one( - {"_id": asset_key}, - {"$addToSet": {"aas_ids": aas_id}}, - upsert=True - ) - - def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId, aas_id: model.Identifier) -> None: - asset_key = str(encoder.default(asset_id)) - self.coll_asset_to_aas.update_one( - {"_id": asset_key}, - {"$pull": {"aas_ids": aas_id}} - ) + @classmethod + def from_file(cls, filename: str) -> "DiscoveryStore": + """ + Load the state of the `DiscoveryStore` from a local file. + The file should be in the format as written by the `self.to_file()` method. + """ + with open(filename, "r") as file: + data = json.load(file, cls=jsonization.ServerAASFromJsonDecoder) + discovery_store = DiscoveryStore() + discovery_store.aas_id_to_asset_ids = data["aas_id_to_asset_ids"] + discovery_store.asset_id_to_aas_ids = data["asset_id_to_aas_ids"] + return discovery_store + + def to_file(self, filename: str) -> None: + """ + Write the current state of the `DiscoveryStore` to a local JSON file for persistence. + """ + with open(filename, "w") as file: + data = { + "aas_id_to_asset_ids": self.aas_id_to_asset_ids, + "asset_id_to_aas_ids": self.asset_id_to_aas_ids, + } + json.dump(data, file, cls=jsonization.ServerAASToJsonEncoder, indent=4) class DiscoveryAPI(BaseWSGIApp): def __init__(self, - persistent_store: AbstractDiscoveryStore, base_path: str = "/api/v3.0"): - self.persistent_store: AbstractDiscoveryStore = persistent_store + persistent_store: DiscoveryStore, base_path: str = "/api/v3.0"): + self.persistent_store: DiscoveryStore = persistent_store self.url_map = werkzeug.routing.Map([ Submount(base_path, [ Rule("/lookup/shellsByAssetLink", methods=["POST"], @@ -208,5 +140,5 @@ def delete_all_asset_links_by_id(self, request: Request, url_args: dict, respons if __name__ == "__main__": from werkzeug.serving import run_simple - run_simple("localhost", 8084, DiscoveryAPI(InMemoryDiscoveryStore()), + run_simple("localhost", 8084, DiscoveryAPI(DiscoveryStore()), use_debugger=True, use_reloader=True) diff --git a/server/pyproject.toml b/server/pyproject.toml index cbcfcf6b3..8c40deff9 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -38,7 +38,6 @@ requires-python = ">=3.10" dependencies = [ "urllib3>=1.26,<3", "Werkzeug>=3.0.3,<4", - "pymongo>=4.16.0", ] [project.optional-dependencies] From 298b49530e37790320493163b51f4b84c2a73762 Mon Sep 17 00:00:00 2001 From: s-heppner Date: Wed, 11 Mar 2026 15:26:49 +0100 Subject: [PATCH 61/76] Fix Descriptor types for DescriptorStores --- server/app/backend/local_file.py | 20 +++++++++++--------- server/app/model/provider.py | 11 +++++++---- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/server/app/backend/local_file.py b/server/app/backend/local_file.py index c31576f78..34f265ba4 100644 --- a/server/app/backend/local_file.py +++ b/server/app/backend/local_file.py @@ -10,12 +10,14 @@ from basyx.aas import model from basyx.aas.model import provider as sdk_provider -from app.model.descriptor import Descriptor +from app.model import descriptor from app.adapter import jsonization logger = logging.getLogger(__name__) +_DESCRIPTOR_TYPE = Union[descriptor.AssetAdministrationShellDescriptor, descriptor.SubmodelDescriptor] +_DESCRIPTOR_CLASSES = (descriptor.AssetAdministrationShellDescriptor, descriptor.SubmodelDescriptor) # We need to resolve the Descriptor type in order to deserialize it again from JSON DESCRIPTOR_TYPE_TO_STRING: Dict[Type[Union[AssetAdministrationShellDescriptor, SubmodelDescriptor]], str] = { @@ -24,7 +26,7 @@ } -class LocalFileDescriptorStore(sdk_provider.AbstractObjectStore[model.Identifier, Descriptor]): +class LocalFileDescriptorStore(sdk_provider.AbstractObjectStore[model.Identifier, _DESCRIPTOR_TYPE]): """ An ObjectStore implementation for :class:`~app.model.descriptor.Descriptor` BaSyx Python SDK objects backed by a local file based local backend @@ -42,7 +44,7 @@ def __init__(self, directory_path: str): # local replication of each object is kept in the application and retrieving an object from the store always # returns the **same** (not only equal) object. Still, objects are forgotten, when they are not referenced # anywhere else to save memory. - self._object_cache: weakref.WeakValueDictionary[model.Identifier, Descriptor] \ + self._object_cache: weakref.WeakValueDictionary[model.Identifier, _DESCRIPTOR_TYPE] \ = weakref.WeakValueDictionary() self._object_cache_lock = threading.Lock() @@ -59,7 +61,7 @@ def check_directory(self, create=False): os.mkdir(self.directory_path) logger.info("Creating directory {}".format(self.directory_path)) - def get_descriptor_by_hash(self, hash_: str) -> Descriptor: + def get_descriptor_by_hash(self, hash_: str) -> _DESCRIPTOR_TYPE: """ Retrieve an AAS Descriptor object from the local file by its identifier hash @@ -81,7 +83,7 @@ def get_descriptor_by_hash(self, hash_: str) -> Descriptor: self._object_cache[obj.id] = obj return obj - def get_item(self, identifier: model.Identifier) -> Descriptor: + def get_item(self, identifier: model.Identifier) -> _DESCRIPTOR_TYPE: """ Retrieve an AAS Descriptor object from the local file by its :class:`~basyx.aas.model.base.Identifier` @@ -92,7 +94,7 @@ def get_item(self, identifier: model.Identifier) -> Descriptor: except KeyError as e: raise KeyError("No Identifiable with id {} found in local file database".format(identifier)) from e - def add(self, x: Descriptor) -> None: + def add(self, x: _DESCRIPTOR_TYPE) -> None: """ Add a Descriptor object to the store @@ -113,7 +115,7 @@ def add(self, x: Descriptor) -> None: with self._object_cache_lock: self._object_cache[x.id] = x - def discard(self, x: Descriptor) -> None: + def discard(self, x: _DESCRIPTOR_TYPE) -> None: """ Delete an :class:`~app.model.descriptor.Descriptor` AAS object from the local file store @@ -139,7 +141,7 @@ def __contains__(self, x: object) -> bool: """ if isinstance(x, model.Identifier): identifier = x - elif isinstance(x, Descriptor): + elif isinstance(x, _DESCRIPTOR_CLASSES): identifier = x.id else: return False @@ -155,7 +157,7 @@ def __len__(self) -> int: logger.debug("Fetching number of documents from database ...") return len(os.listdir(self.directory_path)) - def __iter__(self) -> Iterator[Descriptor]: + def __iter__(self) -> Iterator[_DESCRIPTOR_TYPE]: """ Iterate all :class:`~app.model.descriptor.Descriptor` objects in the local folder. diff --git a/server/app/model/provider.py b/server/app/model/provider.py index 6ed8a2614..595dd27ac 100644 --- a/server/app/model/provider.py +++ b/server/app/model/provider.py @@ -1,11 +1,14 @@ -from typing import Iterable, Dict, TypeVar, Iterator +from typing import Iterable, Dict, Iterator, Union from basyx.aas import model from basyx.aas.model import provider as sdk_provider -from app.model.descriptor import Descriptor +from app.model import descriptor + + +_DESCRIPTOR_TYPE = Union[descriptor.AssetAdministrationShellDescriptor, descriptor.SubmodelDescriptor] +_DESCRIPTOR_CLASSES = (descriptor.AssetAdministrationShellDescriptor, descriptor.SubmodelDescriptor) -_DESCRIPTOR_TYPE = TypeVar("_DESCRIPTOR_TYPE", bound=Descriptor) class DictDescriptorStore(sdk_provider.AbstractObjectStore[model.Identifier, _DESCRIPTOR_TYPE]): """ @@ -34,7 +37,7 @@ def discard(self, x: _DESCRIPTOR_TYPE) -> None: def __contains__(self, x: object) -> bool: if isinstance(x, model.Identifier): return x in self._backend - if not isinstance(x, Descriptor): + if not isinstance(x, _DESCRIPTOR_CLASSES): return False return self._backend.get(x.id) is x From 1aab8c271cd4360b035d32eabba83f5121218ca1 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 12 Mar 2026 12:56:01 +0100 Subject: [PATCH 62/76] update discovery --- discovery_server/compose.yml | 9 - discovery_server/requirements.txt | 2 - discovery_server/stop-supervisor.sh | 8 - .../storage/AssetIdsFullExample.json | 62 - discovery_server/storage/ListOfAssetIds.json | 6 - discovery_server/supervisord.ini | 27 - registry_server/entrypoint.sh | 71 - registry_server/requirements.txt | 1 - registry_server/stop-supervisor.sh | 8 - .../storage/descriptorCompleteExample.json | 71 - registry_server/supervisord.ini | 27 - server/app/interfaces/base.py | 6 +- server/app/interfaces/discovery.py | 15 +- .../app/services/run_discovery.py | 2 +- .../app/services/run_registry.py | 0 .../docker/common}/entrypoint.sh | 0 .../docker/discovery}/Dockerfile | 32 +- .../docker/discovery}/uwsgi.ini | 2 +- .../docker/registry}/Dockerfile | 0 .../docker/registry}/uwsgi.ini | 0 server/docker/repository/Dockerfile | 2 +- server/docker/repository/entrypoint.sh | 71 - .../discovery_standalone}/README.md | 2 +- .../discovery_standalone/compose.yml | 12 + .../registry_standalone}/README.md | 0 .../registry_standalone}/compose.yml | 0 ...e4ab22cbb96b078e42f0b7a7b57f121544cb1.json | 31 + ...106ba8a4ccd64b74fa68ee5f35c603a626c2e.json | 136 ++ ...553891c1314fa37721b334d143adffd5470b3.json | 31 + ...3491c3a4a20593fc7d925fac4c6aa66916a3b.json | 31 + ...53a0432f269a716776577ec89091983c64795.json | 31 + ...a22cf3c97f21b79155efc15262eee7fc7fd67.json | 221 +++ ...8bc07c9bcaa6c1366cd36b44960565c2641d2.json | 31 + ...05d19efbc09615ef40a850f89292614b8a914.json | 221 +++ ...552b1e02ca1b1302eb4e0b61c30e7a959ed34.json | 284 ++++ ...b3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json | 220 +++ ...97dead8d84ad3a33a7c5ff09b410deffaf331.json | 221 +++ ...b72dfe1dc6b77ef28f956d70d49d29878b893.json | 309 ++++ ...7b67f1ea690f1dac00433d769f334afba76df.json | 31 + ...eb697e3ea37b3ecf796b6aecc5c093b048717.json | 509 +++++++ ...f6697c83305ec1874277cfeb379aee2d5804f.json | 221 +++ ...dbdd7773c2a4119b81aeb8df2602b950877dc.json | 334 +++++ ...96ab50587bce87e2f9b12df20290619016351.json | 84 ++ ...dce99e5b21775fc28a1cfae1514aac1bd7634.json | 359 +++++ ...748b5d5319adde2cd6c88432f2b22345b6491.json | 40 + ...2e7ae6c49bee97ad233140d30fba802e2d7a1.json | 221 +++ ...00686cd29e75363a2d8f59b1d315b958bc8ed.json | 221 +++ ...5b54f96a43b915c5c508b1863b9fe9de546f6.json | 495 +++++++ ...63f696f2441a3ed4030e277d44d64f937ddd3.json | 459 ++++++ ...17b3f92547c2aed8c417ee0fd48c28198e3bd.json | 31 + ...2cacdcc769000e5c4d0e80ac5cde735eec993.json | 221 +++ ...43e8710cd0e1f91cf7310524c762cace48e81.json | 221 +++ ...bedcb91061b10f30ea0c9d943bf7757fe4e4c.json | 31 + ...4a9bcaa873662aa813f1c989fc1f762c6c1a8.json | 221 +++ ...7b293d9623fe56b3a78b25033156bf81bb3c7.json | 31 + ...ac8ea6de2405362dc0e7850d2a30352ad332d.json | 49 + ...d98cfbf9f524c651136459c622f8228902ceb.json | 31 + ...06f651382d45795cf3a9a0082245edfd09e99.json | 31 + ...ed122a558bd1e15292021a45a1100888fed50.json | 31 + ...b61bcd16703126019650509f56b464d963c10.json | 220 +++ ...7cd12787de7c92a1f439a6d3a5bc793b026ab.json | 31 + ...dea45f60ec49debda0d5d0eb0e9a019612acf.json | 134 ++ ...c1956a07b6534dba3a39b2de7438598636658.json | 31 + ...112a95a63d60732565673080ccb293d6420d9.json | 221 +++ ...fc9edfb2293605e159bdb76cbcbdf783b1378.json | 31 + ...48f275e4a3f6c196fb214f08852ef594f1f24.json | 26 + ...3fdeec2206c7eb496e442c49e334c5c9e9f9b.json | 384 +++++ ...3819a8c05bf22e27455df0be93c2919d5af21.json | 221 +++ ...8bf888b4ce781e716830381a104d3dfc9cab8.json | 134 ++ ...5a21cd52783d2f8025c125bee6c42ad156dca.json | 31 + ...870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json | 359 +++++ ...8f70c9154087ddf27e428533f89b818b7a921.json | 31 + ...4755f359ad7cbf1863457c54782e0b9903b63.json | 31 + ...51072241ce59e82de32e74ad020d937319d8a.json | 221 +++ ...e6acaf396910f3d0464f0f4c853222d338da6.json | 31 + ...ea14b7bbca536f7c81241fc11d1b1c2c54766.json | 31 + ...15c9f2542c45cd74c263a2a907048ea576f93.json | 221 +++ ...834b78994c08382e389683e3256ffabb06cd9.json | 221 +++ ...ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json | 208 +++ ...2f8a72c522c6f70ba9e25f5eed1c333bbe471.json | 221 +++ ...52b41bfb22ca367ed82d43649ddfb9b98d900.json | 31 + ...b083095b518932696927546beaefb61b213a4.json | 34 + ...712c69fbf92692075bb7bdf5f6ba53d0c965d.json | 31 + ...3079fd13487666c72580bc02df83f7cb8dc80.json | 31 + ...718e28d55c59b1d8219daacb4fdc5334a5fd2.json | 221 +++ ...327813f9200f4b431e9ae75eebf9b98d8b2b4.json | 31 + ...46c218f861f89f327e7764c2eb864f7fb1144.json | 209 +++ ...090f7688f853c05cfd8bb1deaaf37a2cf96d8.json | 31 + ...146f16eda31e5afe2dc8e4c3528cf61a5b1de.json | 31 + ...9cdaa4e60975917ef731467397daa8c177141.json | 31 + ...8d6dcb9f2c7170d69990755d31628758cfa62.json | 134 ++ ...bff00d8e89b3dacd9f2acc9f82a457bf57278.json | 1250 +++++++++++++++++ ...ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json | 31 + ...7b7050cc54a45d607c97b381000996107c272.json | 31 + ...1ecbe99426bf178f531d7b697c6e0917580fb.json | 221 +++ ...36e3a42e1800f68ca04ed11fd10c2daa9426c.json | 424 ++++++ ...b3e5124ca0074335397ec0a841862c43352de.json | 10 + ...f343eef78556826ca6cd60414360de305bae8.json | 134 ++ ...7e5dae06eb662c6c5deee15ffd68ddff2a8db.json | 221 +++ ...c691aba6afb5f4e168e7ebfbdf553de186a49.json | 31 + ...65ad747e83c32006e3fe293f531c17d124ec2.json | 384 +++++ ...10b00988c057572f5ff5b082bc965085aa11e.json | 31 + ...76ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json | 221 +++ ...b5746d5a7b4a162a8a712060d8b6ee31d426f.json | 221 +++ ...6169b998dc2bf7b82eacb9b8be212f04045b3.json | 209 +++ ...2cbff8b373759263ac9f41014a76f75096b8c.json | 31 + ...93959038d700ba8bdb6692dcbd5d29958f1a5.json | 31 + ...31868cb9c7651b7533d8588b93d1895aac092.json | 208 +++ ...e96136cf4b665ad4d81dabfa4f823e009396f.json | 31 + ...5bff6f9b8b82a4a7187ce12a7882b18e51aea.json | 334 +++++ ...a3387718f3236c1b1aaf2b809b397df5c60b3.json | 31 + ...2f0ddd1833540bd997b37c924d9573b020725.json | 221 +++ ...a22be573a79859e09196c847ba53af9bcf94a.json | 31 + ...2f669df6651faf6973c33f2d20447b0d2f298.json | 31 + ...8d43cc64c96fa52f8e2c0f8164d56a4c2872a.json | 31 + ...dac95a9b0d7e3779e64d39e4e0440c59920ba.json | 31 + ...ba193c9d3f180ad36c9611ffc98bd17fb0e42.json | 259 ++++ ...8e894a0d775dffceed1d7d80d96540d0ec747.json | 589 ++++++++ ...144902d139910c6cb97d3d30847949ddd7757.json | 31 + ...17f37740b2d34443b39b5285d68c5ace055cc.json | 31 + ...5873aab80273f6efd44e874ad7558a7018106.json | 31 + ...b4b9fc3a89cc12906af6700961f7be9d78c86.json | 221 +++ ...2b85c464c5400ca91c27b624646b2a12cf141.json | 31 + ...cd8834ff1dc67e56e46382544a2237774f215.json | 134 ++ ...4eaa1c4a859752ab737b125a2e643f275fb3a.json | 259 ++++ ...289bb329b7e9e22be896c6e4502980698d9da.json | 31 + ...6ffe95e9fe7df5d6849b020aaaa146602855c.json | 221 +++ ...60208d89f4185ef423c84aa712c4807c80877.json | 221 +++ ...b6527a7ffea802467dc7eb68005acfd0736bb.json | 221 +++ ...746cf0075bf056c4a59e30ef73e03fe829216.json | 84 ++ ...cf72833e5727241323726e69505a7a27f6b15.json | 31 + ...b1d8dac579c34192cd2bf71002dd6ece23b4f.json | 221 +++ ...b2c2dd086de0626fdf39c9c8715c956fac6e1.json | 31 + ...25bc0f461b488ca41551b3e466e6b5574e636.json | 31 + ...eb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json | 221 +++ ...255e23e8d755cdc8560196797bc9e5dbb6786.json | 31 + ...5dc3a2ca817db532ee6e884307c67ffad6a65.json | 37 + ...2f3678174ad638fbf17eee94d903a8a10f837.json | 31 + ...15d8a6b8c6279f0ada0de12a3b0180c05addd.json | 31 + ...4814aad5996bd76dc7d876caf959593822051.json | 208 +++ ...297e7876d585b556a5d0a814aef014441b76c.json | 31 + ...e77d1bc1168598783a9b38e0f7b501955697f.json | 221 +++ ...594df707f550709e6a2272e58bdc477ccb974.json | 31 + ...3cee8df719800973a323c977bf461752a032c.json | 208 +++ ...4bc09db7bb700d3ac13d1d7d636a25e215939.json | 221 +++ ...6536105609c47a3412078af2fae99212d8220.json | 221 +++ ...3c8b05f6c2e5d40bafd32f81e82c00b74b479.json | 31 + ...efb6270b578e675aca163ad538fabcc133280.json | 31 + ...6ce961991c163ed3a710f31a7b34edd7380e9.json | 208 +++ ...1a2298ea454b005f24114c461322bddb0a44d.json | 221 +++ ...805ca5711a5ce716cfbadb01421f50f3809ff.json | 209 +++ ...2248a68a8e28d04fc32c9fd8e89ec3d530e39.json | 31 + ...93586fcb9ccf486c2fdb1b07cfa7cc89d4705.json | 34 + ...8ccfd3443d5ce31e97e011dd707cc458dc879.json | 31 + ...3fd7b11d1797622ad0e42b843101a5ceb0271.json | 31 + ...2aa08e37b462c4605aabbb3aab9a2b1f2641d.json | 31 + ...37988ae346ac3420f10adf74676e062095f5d.json | 31 + ...fc95894643e48c1c25b7a2a8f6ee2ce4e5230.json | 31 + ...c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json | 31 + ...87305b1849887103293165fe37a3097f10e3a.json | 221 +++ ...776415e2dd317aa25280b81200a13a4bf00c6.json | 26 + ...0a6fde81c2c075e557c78f0b8e70e77e80d8e.json | 280 ++++ ...50b02e9a06ac48283712777c00b83883aec69.json | 352 +++++ ...cb0bab6b97dc840af071bf5f78240ea2817ec.json | 31 + ...4b27318cec0c9c920a1dfe7e81747f38b23c4.json | 221 +++ ...f92aa811f098b245ade2c35bdd2877a7f392a.json | 31 + ...f4ccad065d86b419ede6de15e8e8205618805.json | 84 ++ ...eedc8715dd3995776964d324419d60936659b.json | 134 ++ ...6cd70bb4edc4f9368bcb22813295c2fdf32d0.json | 34 + ...e7122257ca9f64fa978161ea3345a1dd088f9.json | 221 +++ ...1695d98bc5e37bb666cc21ad8db455fa58576.json | 221 +++ ...e55007660a8d2ae3f2c33e9bacf75e4349e11.json | 459 ++++++ ...265a43c8bc6cb9ab298f1dbdcd549418973e3.json | 221 +++ ...ad6436e237d26ed293cce1fc0d453d261642e.json | 31 + ...fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json | 31 + ...9134fdc546a2a138370eadeb13e0ac0e3cb26.json | 221 +++ ...bac8218a44bf38ae47d4a802a328cb49de4e6.json | 415 ++++++ ...6ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json | 40 + ...2694552cc53e695d67403463dba14c0c198e2.json | 280 ++++ ...7b9e58b1061df45de7062a2c385ac9352a5a7.json | 221 +++ ...710ac999ae3fba5342474ba509f9287e67d3a.json | 221 +++ ...a88b3d59b83c23f05279aa2b565ac4b16ffaa.json | 31 + ...9edce6ea15699f8e1386bb83be5023eeeaf47.json | 34 + ...a51adb568afb181d5a391c064d075823ab3da.json | 31 + ...18ed0918a3e4822f04a02e2c8b5c484b0ba85.json | 34 + ...e16cd38327cecf90a926a4e3d36778297ca18.json | 221 +++ ...a5a2a6634bc0b49cece36a48ede86f5b51a68.json | 209 +++ ...2997e04d6bf83efac699e3fa136d80d7948a2.json | 515 +++++++ ...0eba5a4f1e7b661269abcb39b21abc3b93577.json | 31 + ...751f53f092d4ff6ecac7a23e8edc5d96314ad.json | 31 + ...503953d1faa0ef6c6d4398e2a87a2aa782afb.json | 31 + ...4d7dfb14ec98f2088e7c3d462ee108acb90cd.json | 280 ++++ ...04be71639d0293e6f37aa191b386f44c09975.json | 208 +++ ...dae9247de3409255173a055ba49af014744c0.json | 221 +++ ...f3957e81f217002077611430138188c23fb06.json | 31 + ...3f9e95ce4d800f1f2410feac3bab25bccb4d0.json | 259 ++++ ...e713c5feee2c75a832f8cbc7f49183d1035f1.json | 283 ++++ ...62bb0a6b7508747aea81f0a2de8c3510ee94e.json | 31 + ...8ba8246f0b3df52414ef1724e3858a3b90406.json | 31 + ...b302b4ca34c50f8b78b04f078f6a90f429bc1.json | 31 + ...83b5d90ab9d76f69214872b8f56333b4eec06.json | 221 +++ ...de389f3d78ec4872047bed16973ad2d8de471.json | 221 +++ ...3daccaf453c71e1e7684a7f622cf1d42a1031.json | 49 + ...fae95b9eead454e7f0b95405362846b9859c8.json | 221 +++ ...b3279f412af90d324eb292b0108cec8a7ae21.json | 221 +++ ...06ee07cb7f396769a5e7553937a09acef0375.json | 84 ++ ...57309ffe09dae1acec27145dc3795502a3bfc.json | 221 +++ ...6ff1f1b0d713850fa7e8033e9601268f0b0fa.json | 221 +++ ...cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json | 221 +++ ...d41007aa50220d85bc69c5366220aa7d80112.json | 259 ++++ ...2214c9ce67ed462f7daf0563eb16a942e4ede.json | 40 + ...88ae7014c85265d818a24d5109d2e25c99609.json | 220 +++ ...e48693e34ef1fbf83cebe290bc9f55ac2a7aa.json | 424 ++++++ ...8a75ac4097e900999c4d45f001dd15fcb2958.json | 209 +++ ...17cbe4f17fefed14f4ef777316007a0a045ce.json | 208 +++ ...e65df7b33d35df093479a0381f14d28a8c557.json | 34 + ...7508e0d340f28ca992c55c43c1e146cbcb75c.json | 31 + ...39a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json | 34 + ...95314a6afd88c2f27c3f95be8d74d69042e5e.json | 31 + ...d495e60e52003b4c91d351af7a3dddb1c2b37.json | 31 + ...6f750d79014b4c63ff782d28bbd01f6641b79.json | 221 +++ ...198a9dafe02e24ccdaca582f02af348c3074a.json | 31 + ...feef105ccabad344a17d5a4b35ff45be854fa.json | 31 + ...db7fecaaa628d8ea1eb325d09f4f1502ec77c.json | 471 +++++++ ...6bcc52e66214c0a51ef0f93842af6492699ef.json | 31 + ...515df1369ae642a7166d7f62b32dba9f05e9f.json | 415 ++++++ ...43f06bc08ab63281b5e36085f6a54601877e1.json | 208 +++ ...e0fe3f3aab76ec769b2074a997f4e21f62fc6.json | 31 + ...8941b49cffcb1811d234af2564b0d30e3ee5e.json | 31 + ...9bf4fb1de7070e8cc5429bc537c70481c5fa5.json | 208 +++ ...f7831eedb9ee52c098235709a1aa770d05420.json | 159 +++ ...517658b305a8d88449526fb9ecb6023ea6523.json | 31 + ...e0cd3b04cb02d228de803726945c86afd210e.json | 509 +++++++ ...a3f0f1e76ef2ce78787446797edd65c994b56.json | 221 +++ ...b1e644368914347b1389145255fa279b2b749.json | 31 + ...d17ec24da30562e0752f6e05ac4e9df000cac.json | 31 + ...3e75aedffadadff270d266aca3bbc1d8c27ec.json | 17 + ...6e9d06ad9e418129897b1b03de845a405e16b.json | 496 +++++++ ...d8a8986d385d7a3fc20499572d965f6702f11.json | 31 + ...ea2d9329a85dc7318d70cf6f5e975ffb8972e.json | 34 + ...fd68f2c25bbe8235df30fbcedd2b277054cdc.json | 221 +++ ...ae1281b21b44c78359629d9b068b290cd0309.json | 31 + ...218d98ca6b10fbd18327dde27c7fa0770434d.json | 280 ++++ ...cb479fdc289ba68243dcfe2dda846416c4a07.json | 221 +++ ...320d3eca5988b8ac476758828d9df18c428ed.json | 31 + ...ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json | 221 +++ ...1c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json | 31 + ...2a933377f264a258747e18e21503d1b014ce8.json | 31 + ...0bceda9260f61d56cd44bf1352ac0ebb1e353.json | 409 ++++++ ...342a566820c435e8b618ac11f838eaa40bf69.json | 221 +++ ...1cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json | 31 + ...25c0d9b94e5eea352a0869bfff8ce84e57894.json | 280 ++++ ...6e3fc262c970765b40c65c6927b1513c200a9.json | 40 + ...78ceaf1d34ee6dfbf90ec8c20c50c95459518.json | 221 +++ ...6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json | 434 ++++++ ...317e2714e01b072a8fff6637b20a39e42440c.json | 352 +++++ ...62fb1af6c8494b41bff45b4ad69b6a1471845.json | 221 +++ ...fb806ba237b4ae9851292a1e529a29a6c3459.json | 221 +++ ...4b7f766bc75be0aaba7ba96dafefcf0308cfa.json | 315 +++++ ...e1464d50506f9d959205b8ff0ea11e725f608.json | 31 + ...e8d106f541561dc5b5c9da41a7b27feb558b4.json | 31 + ...b63c8fd9f675db5b9eceba930f3d6b348db46.json | 221 +++ ...e88335a8ff43a3a73bbe0e0f8ee64245064a1.json | 31 + ...84bda5f67789a3138517df25af645738ae66c.json | 31 + ...7df8f980f5293a29b60c8f3e33e1828b86e61.json | 209 +++ ...2c59a776fc6f8cfc7726d205600616fd78882.json | 70 + ...4e0f9e0528f7e5adafabde9219e281e34fe1a.json | 390 +++++ ...6b789142a5dffe21da1ad7c000802ab6ea731.json | 221 +++ ...3c2c70043461183ccddce31a397a7a7e7fd19.json | 309 ++++ ...0001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json | 31 + ...6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json | 31 + ...7cc386d5e5fc420a71ebe8c143c156b88964f.json | 31 + ...0b1eb451a34b32fccf98c21138a23458cda95.json | 221 +++ ...c584930331b94ea66a0ac84a9fc108f4b7ae2.json | 40 + ...54fc450894ad7a9ee223730411b6cc6762a3e.json | 280 ++++ ...a46cbcd84dedd2d535641e6ed74ef466b4a81.json | 31 + ...fb99324b2317539f92ae7f3f56f43a0b5b8d2.json | 134 ++ ...ca5402c8de56264d86e753fe6e2e4b703c38e.json | 234 +++ ...d1b6a3673aae74c0bb001f319d230327ae2a3.json | 31 + ...4bf955fe6da0c228af1354e79f5fe1bf4d8a5.json | 31 + ...78b78c7ae2111975f1112ead0d1d6d8233c41.json | 240 ++++ ...eb82c4327af3685863dc5d3557a4939a3386c.json | 31 + ...87ce239d61c29ace2ec5cffcaba3ad4485479.json | 31 + ...2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json | 31 + ...01673681674b766ab9e8acc48c69f74379521.json | 221 +++ ...f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json | 31 + ...4f0369c63322d5c9b5fac3e42050c7cd05d81.json | 49 + ...39e3216cf103ff9ed0ab01cbf578119f457bb.json | 31 + ...512a2d14ac4a70f636d41662e1cd64abbd743.json | 30 + ...fc9abccdfb19b455ae7cbfba3c328a4938920.json | 221 +++ ...ba7388ab9d8571c3757da8b139c6d6309db48.json | 31 + ...7c12453864c488bc9f1e2ee293058bb6b2b0e.json | 31 + ...3a8ff45bbccfca555b3405cb9d5f0c4deab46.json | 31 + ...8eef62fce103f9a1b129031a85dfe814e32a2.json | 1181 ++++++++++++++++ ...882eb90e8e01d0a84530e3f3e13aadca1a51d.json | 221 +++ ...f6d111f8ae3f2d1885df4b4f5d349334695eb.json | 208 +++ ...f5329b75692b4747e15807f126ca62cb5c12b.json | 31 + ...06c38c9410554b7bb0862a64066b3896ad469.json | 31 + 298 files changed, 41195 insertions(+), 395 deletions(-) delete mode 100644 discovery_server/compose.yml delete mode 100644 discovery_server/requirements.txt delete mode 100644 discovery_server/stop-supervisor.sh delete mode 100644 discovery_server/storage/AssetIdsFullExample.json delete mode 100644 discovery_server/storage/ListOfAssetIds.json delete mode 100644 discovery_server/supervisord.ini delete mode 100644 registry_server/entrypoint.sh delete mode 100644 registry_server/requirements.txt delete mode 100644 registry_server/stop-supervisor.sh delete mode 100644 registry_server/storage/descriptorCompleteExample.json delete mode 100644 registry_server/supervisord.ini rename discovery_server/app/main.py => server/app/services/run_discovery.py (88%) rename registry_server/app/main.py => server/app/services/run_registry.py (100%) rename {discovery_server => server/docker/common}/entrypoint.sh (100%) rename {discovery_server => server/docker/discovery}/Dockerfile (59%) rename {discovery_server => server/docker/discovery}/uwsgi.ini (79%) rename {registry_server => server/docker/registry}/Dockerfile (100%) rename {registry_server => server/docker/registry}/uwsgi.ini (100%) delete mode 100644 server/docker/repository/entrypoint.sh rename {discovery_server => server/example_configurations/discovery_standalone}/README.md (98%) create mode 100644 server/example_configurations/discovery_standalone/compose.yml rename {registry_server => server/example_configurations/registry_standalone}/README.md (100%) rename {registry_server => server/example_configurations/registry_standalone}/compose.yml (100%) create mode 100644 server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json create mode 100644 server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json create mode 100644 server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json create mode 100644 server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json create mode 100644 server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json create mode 100644 server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json create mode 100644 server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json create mode 100644 server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json create mode 100644 server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json create mode 100644 server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json create mode 100644 server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json create mode 100644 server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json create mode 100644 server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json create mode 100644 server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json create mode 100644 server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json create mode 100644 server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json create mode 100644 server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json create mode 100644 server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json create mode 100644 server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json create mode 100644 server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json create mode 100644 server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json create mode 100644 server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json create mode 100644 server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json create mode 100644 server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json create mode 100644 server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json create mode 100644 server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json create mode 100644 server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json create mode 100644 server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json create mode 100644 server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json create mode 100644 server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json create mode 100644 server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json create mode 100644 server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json create mode 100644 server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json create mode 100644 server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json create mode 100644 server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json create mode 100644 server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json create mode 100644 server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json create mode 100644 server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json create mode 100644 server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json create mode 100644 server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json create mode 100644 server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json create mode 100644 server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json create mode 100644 server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json create mode 100644 server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json create mode 100644 server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json create mode 100644 server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json create mode 100644 server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json create mode 100644 server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json create mode 100644 server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json create mode 100644 server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json create mode 100644 server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json create mode 100644 server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json create mode 100644 server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json create mode 100644 server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json create mode 100644 server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json create mode 100644 server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json create mode 100644 server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json create mode 100644 server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json create mode 100644 server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json create mode 100644 server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json create mode 100644 server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json create mode 100644 server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json create mode 100644 server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json create mode 100644 server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json create mode 100644 server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json create mode 100644 server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json create mode 100644 server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json create mode 100644 server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json create mode 100644 server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json create mode 100644 server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json create mode 100644 server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json create mode 100644 server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json create mode 100644 server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json create mode 100644 server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json create mode 100644 server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json create mode 100644 server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json create mode 100644 server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json create mode 100644 server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json create mode 100644 server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json create mode 100644 server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json create mode 100644 server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json create mode 100644 server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json create mode 100644 server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json create mode 100644 server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json create mode 100644 server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json create mode 100644 server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json create mode 100644 server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json create mode 100644 server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json create mode 100644 server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json create mode 100644 server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json create mode 100644 server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json create mode 100644 server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json create mode 100644 server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json create mode 100644 server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json create mode 100644 server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json create mode 100644 server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json create mode 100644 server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json create mode 100644 server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json create mode 100644 server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json create mode 100644 server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json create mode 100644 server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json create mode 100644 server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json create mode 100644 server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json create mode 100644 server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json create mode 100644 server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json create mode 100644 server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json create mode 100644 server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json create mode 100644 server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json create mode 100644 server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json create mode 100644 server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json create mode 100644 server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json create mode 100644 server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json create mode 100644 server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json create mode 100644 server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json create mode 100644 server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json create mode 100644 server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json create mode 100644 server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json create mode 100644 server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json create mode 100644 server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json create mode 100644 server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json create mode 100644 server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json create mode 100644 server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json create mode 100644 server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json create mode 100644 server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json create mode 100644 server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json create mode 100644 server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json create mode 100644 server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json create mode 100644 server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json create mode 100644 server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json create mode 100644 server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json create mode 100644 server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json create mode 100644 server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json create mode 100644 server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json create mode 100644 server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json create mode 100644 server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json create mode 100644 server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json create mode 100644 server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json create mode 100644 server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json create mode 100644 server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json create mode 100644 server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json create mode 100644 server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json create mode 100644 server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json create mode 100644 server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json create mode 100644 server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json create mode 100644 server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json create mode 100644 server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json create mode 100644 server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json create mode 100644 server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json create mode 100644 server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json create mode 100644 server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json create mode 100644 server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json create mode 100644 server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json create mode 100644 server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json create mode 100644 server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json create mode 100644 server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json create mode 100644 server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json create mode 100644 server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json create mode 100644 server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json create mode 100644 server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json create mode 100644 server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json create mode 100644 server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json create mode 100644 server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json create mode 100644 server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json create mode 100644 server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json create mode 100644 server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json create mode 100644 server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json create mode 100644 server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json create mode 100644 server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json create mode 100644 server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json create mode 100644 server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json create mode 100644 server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json create mode 100644 server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json create mode 100644 server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json create mode 100644 server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json create mode 100644 server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json create mode 100644 server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json create mode 100644 server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json create mode 100644 server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json create mode 100644 server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json create mode 100644 server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json create mode 100644 server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json create mode 100644 server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json create mode 100644 server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json create mode 100644 server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json create mode 100644 server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json create mode 100644 server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json create mode 100644 server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json create mode 100644 server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json create mode 100644 server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json create mode 100644 server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json create mode 100644 server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json create mode 100644 server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json create mode 100644 server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json create mode 100644 server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json create mode 100644 server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json create mode 100644 server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json create mode 100644 server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json create mode 100644 server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json create mode 100644 server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json create mode 100644 server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json create mode 100644 server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json create mode 100644 server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json create mode 100644 server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json create mode 100644 server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json create mode 100644 server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json create mode 100644 server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json create mode 100644 server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json create mode 100644 server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json create mode 100644 server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json create mode 100644 server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json create mode 100644 server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json create mode 100644 server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json create mode 100644 server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json create mode 100644 server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json create mode 100644 server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json create mode 100644 server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json create mode 100644 server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json create mode 100644 server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json create mode 100644 server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json create mode 100644 server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json create mode 100644 server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json create mode 100644 server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json create mode 100644 server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json create mode 100644 server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json create mode 100644 server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json create mode 100644 server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json create mode 100644 server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json create mode 100644 server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json create mode 100644 server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json create mode 100644 server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json create mode 100644 server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json create mode 100644 server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json create mode 100644 server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json create mode 100644 server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json create mode 100644 server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json create mode 100644 server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json create mode 100644 server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json create mode 100644 server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json create mode 100644 server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json create mode 100644 server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json create mode 100644 server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json create mode 100644 server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json create mode 100644 server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json create mode 100644 server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json create mode 100644 server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json create mode 100644 server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json create mode 100644 server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json create mode 100644 server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json create mode 100644 server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json create mode 100644 server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json create mode 100644 server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json create mode 100644 server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json create mode 100644 server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json create mode 100644 server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json create mode 100644 server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json create mode 100644 server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json create mode 100644 server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json create mode 100644 server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json create mode 100644 server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json create mode 100644 server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json create mode 100644 server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json create mode 100644 server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json create mode 100644 server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json create mode 100644 server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json create mode 100644 server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json create mode 100644 server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json create mode 100644 server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json create mode 100644 server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json create mode 100644 server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json create mode 100644 server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json create mode 100644 server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json create mode 100644 server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json diff --git a/discovery_server/compose.yml b/discovery_server/compose.yml deleted file mode 100644 index 60577dd73..000000000 --- a/discovery_server/compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - app: - build: - context: .. - dockerfile: discovery_server/Dockerfile - ports: - - "8084:80" - environment: - - storage_path="./discovery_store" diff --git a/discovery_server/requirements.txt b/discovery_server/requirements.txt deleted file mode 100644 index 376baed5f..000000000 --- a/discovery_server/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -Werkzeug -pymongo diff --git a/discovery_server/stop-supervisor.sh b/discovery_server/stop-supervisor.sh deleted file mode 100644 index 9a953c94b..000000000 --- a/discovery_server/stop-supervisor.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -printf "READY\n" - -while read line; do - echo "Processing Event: $line" >&2 - kill $PPID -done < /dev/stdin diff --git a/discovery_server/storage/AssetIdsFullExample.json b/discovery_server/storage/AssetIdsFullExample.json deleted file mode 100644 index 720d106fc..000000000 --- a/discovery_server/storage/AssetIdsFullExample.json +++ /dev/null @@ -1,62 +0,0 @@ -[ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "ud800;udbff3udbffUud800Bud800qudbffhudbffTd6^dnTudbff5?Aoudbff36Xud800>udbffUudbff\"Hjeud800Fudbff;udbffC?5q]udbff8aIudbffkp[?sud800kXljub;Gudbffqud8003ud8005udbff[>Z6d_udbffO=hxs R9<_pudbffo" - } - ], - "referredSemanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "ooOud800pqudbfffud800b:4udbffiudbffudbffd_ud800sJudbffOudbffiB:udbff@pEudbffM;8ud800mS;udbff3ud800q8udbff^udbffmDhFttgudbffrudbffhudbffrEud800e" - } - ] - } - } - ], - "name": "ud800Vud800?ud800tudbff1Ah_ud8003udbffZud800d5WAud800ScMIud800e>", - "value": "udbffBudbffSud800udbffn%ud800kudbffa:Tcfudbff?udbff?ud8005udbffZudbff_ud800iud800qq.@Zud800jmludbffFB<:Wfud800=audbffludbffailudbff?ud800uLudbff7ud800GJqG'ud800kudbffrudbff>>RudbffQudbff=udbffQS]UudbffOZS", - "externalSubjectId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "^7<\\agVu_%ud800:pD<-ud800j9udbffkiKCudbffVudbffjudbffDudbffiudbffZsud800WhLG:tQfLP" - } - ], - "referredSemanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "]Pud800DudbffY[0Y", - "value": "udbffBudbffSud800udbffn%ud800kudbffa:Tcfudbff?udbff?ud8005udbffZudbff_ud800iud800qq.@Zud800jmludbffFB<:Wfud800=audbffludbffailudbff?ud800uLudbff7ud800GJqG'ud800kudbffrudbff>>RudbffQudbff=udbffQS]UudbffOZS" - } -] \ No newline at end of file diff --git a/discovery_server/supervisord.ini b/discovery_server/supervisord.ini deleted file mode 100644 index d73d98014..000000000 --- a/discovery_server/supervisord.ini +++ /dev/null @@ -1,27 +0,0 @@ -[supervisord] -nodaemon=true - -[program:uwsgi] -command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[program:nginx] -command=/usr/sbin/nginx -stdout_logfile=/var/log/nginx.out.log -stdout_logfile_maxbytes=0 -stderr_logfile=/var/log/nginx.err.log -stderr_logfile_maxbytes=0 -stopsignal=QUIT -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[eventlistener:quit_on_failure] -events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL -command=/etc/supervisor/stop-supervisor.sh diff --git a/registry_server/entrypoint.sh b/registry_server/entrypoint.sh deleted file mode 100644 index 522d4fca2..000000000 --- a/registry_server/entrypoint.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env sh -set -e - -# Get the maximum upload file size for Nginx, default to 0: unlimited -USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} - -# Get the number of workers for Nginx, default to 1 -USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} - -# Set the max number of connections per worker for Nginx, if requested -# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below -NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} - -# Get the listen port for Nginx, default to 80 -USE_LISTEN_PORT=${LISTEN_PORT:-80} - -# Get the client_body_buffer_size for Nginx, default to 1M -USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} - -# Create the conf.d directory if it doesn't exist -if [ ! -d /etc/nginx/conf.d ]; then - mkdir -p /etc/nginx/conf.d -fi - -if [ -f /app/nginx.conf ]; then - cp /app/nginx.conf /etc/nginx/nginx.conf -else - content='user nginx;\n' - # Set the number of worker processes in Nginx - content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" - content=$content'error_log /var/log/nginx/error.log warn;\n' - content=$content'pid /var/run/nginx.pid;\n' - content=$content'events {\n' - content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" - content=$content'}\n' - content=$content'http {\n' - content=$content' include /etc/nginx/mime.types;\n' - content=$content' default_type application/octet-stream;\n' - content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" - content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" - content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" - content=$content' access_log /var/log/nginx/access.log main;\n' - content=$content' sendfile on;\n' - content=$content' keepalive_timeout 65;\n' - content=$content' include /etc/nginx/conf.d/*.conf;\n' - content=$content'}\n' - content=$content'daemon off;\n' - # Set the max number of open file descriptors for Nginx workers, if requested - if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then - content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" - fi - # Save generated /etc/nginx/nginx.conf - printf "$content" > /etc/nginx/nginx.conf - - content_server='server {\n' - content_server=$content_server" listen ${USE_LISTEN_PORT};\n" - content_server=$content_server' location / {\n' - content_server=$content_server' include uwsgi_params;\n' - content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' - content_server=$content_server' }\n' - content_server=$content_server'}\n' - # Save generated server /etc/nginx/conf.d/nginx.conf - printf "$content_server" > /etc/nginx/conf.d/nginx.conf - - # # Generate additional configuration - printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf - printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf - printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf -fi - -exec "$@" \ No newline at end of file diff --git a/registry_server/requirements.txt b/registry_server/requirements.txt deleted file mode 100644 index 9c12eecda..000000000 --- a/registry_server/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -Werkzeug diff --git a/registry_server/stop-supervisor.sh b/registry_server/stop-supervisor.sh deleted file mode 100644 index 9a953c94b..000000000 --- a/registry_server/stop-supervisor.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -printf "READY\n" - -while read line; do - echo "Processing Event: $line" >&2 - kill $PPID -done < /dev/stdin diff --git a/registry_server/storage/descriptorCompleteExample.json b/registry_server/storage/descriptorCompleteExample.json deleted file mode 100644 index f762aa836..000000000 --- a/registry_server/storage/descriptorCompleteExample.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "id": "https://example.org/aas/motor", - "endpoints": [ - { - "protocolInformation": { - "href": "https://localhost:1234/api/v3.0/aas", - "endpointProtocol": "HTTP", - "endpointProtocolVersion": [ - "1.1" - ] - }, - "interface": "AAS-3.0" - }, - { - "protocolInformation": { - "href": "opc.tcp://localhost:4840" - }, - "interface": "AAS-3.0" - }, - { - "protocolInformation": { - "href": "https://localhost:5678", - "endpointProtocol": "HTTP", - "endpointProtocolVersion": [ - "1.1" - ], - "subprotocol": "OPC UA Basic SOAP", - "subprotocolBody": "ns=2;s=MyAAS", - "subprotocolBodyEncoding": "application/soap+xml" - }, - "interface": "AAS-3.0" - } - ], - "submodelDescriptors":[ - { - "id": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate", - "endpoints": [ - { - "href": { - "href": "https://localhost:1234/api/v3.0/submodel", - "endpointProtocol": "HTTP", - "endpointProtocolVersion": [ - "1.1" - ] - }, - "interface": "AAS-3.0" - }, - { - "protocolInformation": { - "href": "opc.tcp://localhost:4840" - }, - "interface": "AAS-3.0" - }, - { - "protocolInformation": { - "href": "https://localhost:5678", - "endpointProtocol": "HTTP", - "endpointProtocolVersion": [ - "1.1" - ], - "subprotocol": "OPC UA Basic SOAP", - "subprotocolBody": "ns=2;s=MyAAS", - "subprotocolBodyEncoding": "application/soap+xml" - }, - "interface": "AAS-3.0" - } - ] - } - - ] -} \ No newline at end of file diff --git a/registry_server/supervisord.ini b/registry_server/supervisord.ini deleted file mode 100644 index d73d98014..000000000 --- a/registry_server/supervisord.ini +++ /dev/null @@ -1,27 +0,0 @@ -[supervisord] -nodaemon=true - -[program:uwsgi] -command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[program:nginx] -command=/usr/sbin/nginx -stdout_logfile=/var/log/nginx.out.log -stdout_logfile_maxbytes=0 -stderr_logfile=/var/log/nginx.err.log -stderr_logfile_maxbytes=0 -stopsignal=QUIT -startsecs = 0 -autorestart=false -# may make sense to have autorestart enabled in production - -[eventlistener:quit_on_failure] -events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,PROCESS_STATE_FATAL -command=/etc/supervisor/stop-supervisor.sh diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 14fb30c68..8234eddc2 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -264,13 +264,13 @@ def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, res class ObjectStoreWSGIApp(BaseWSGIApp): object_store: AbstractObjectStore - def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: + def _get_all_obj_of_type(self, type_: Type[model.provider._IDENTIFIABLE]) -> Iterator[model.provider._IDENTIFIABLE]: for obj in self.object_store: if isinstance(obj, type_): yield obj - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) \ - -> model.provider._IT: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IDENTIFIABLE]) \ + -> model.provider._IDENTIFIABLE: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 8db2c839d..dc6a721c4 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -1,14 +1,10 @@ """ This module implements the Discovery interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. """ - -import abc import json -from typing import Dict, List, Set, Any +from typing import Dict, List, Set import werkzeug.exceptions -from pymongo import MongoClient -from pymongo.collection import Collection from werkzeug.routing import Rule, Submount from werkzeug.wrappers import Request, Response @@ -63,13 +59,14 @@ def _delete_aas_id_from_specific_asset_ids(self, asset_id: model.SpecificAssetId def from_file(cls, filename: str) -> "DiscoveryStore": """ Load the state of the `DiscoveryStore` from a local file. - The file should be in the format as written by the `self.to_file()` method. + Safely handles files that are missing expected keys. + """ with open(filename, "r") as file: data = json.load(file, cls=jsonization.ServerAASFromJsonDecoder) discovery_store = DiscoveryStore() - discovery_store.aas_id_to_asset_ids = data["aas_id_to_asset_ids"] - discovery_store.asset_id_to_aas_ids = data["asset_id_to_aas_ids"] + discovery_store.aas_id_to_asset_ids = data.get("aas_id_to_asset_ids", {}) + discovery_store.asset_id_to_aas_ids = data.get("asset_id_to_aas_ids", {}) return discovery_store def to_file(self, filename: str) -> None: @@ -86,7 +83,7 @@ def to_file(self, filename: str) -> None: class DiscoveryAPI(BaseWSGIApp): def __init__(self, - persistent_store: DiscoveryStore, base_path: str = "/api/v3.0"): + persistent_store: DiscoveryStore, base_path: str = "/api/v3.1.1"): self.persistent_store: DiscoveryStore = persistent_store self.url_map = werkzeug.routing.Map([ Submount(base_path, [ diff --git a/discovery_server/app/main.py b/server/app/services/run_discovery.py similarity index 88% rename from discovery_server/app/main.py rename to server/app/services/run_discovery.py index 22322f86a..0b047db20 100644 --- a/discovery_server/app/main.py +++ b/server/app/services/run_discovery.py @@ -1,7 +1,7 @@ import os import atexit -from server.app.interfaces.discovery import DiscoveryAPI, DiscoveryStore +from app.interfaces.discovery import DiscoveryAPI, DiscoveryStore storage_path = os.getenv("storage_path", None) base_path = os.getenv("API_BASE_PATH") diff --git a/registry_server/app/main.py b/server/app/services/run_registry.py similarity index 100% rename from registry_server/app/main.py rename to server/app/services/run_registry.py diff --git a/discovery_server/entrypoint.sh b/server/docker/common/entrypoint.sh similarity index 100% rename from discovery_server/entrypoint.sh rename to server/docker/common/entrypoint.sh diff --git a/discovery_server/Dockerfile b/server/docker/discovery/Dockerfile similarity index 59% rename from discovery_server/Dockerfile rename to server/docker/discovery/Dockerfile index e0c1f1f14..8bc377e1c 100644 --- a/discovery_server/Dockerfile +++ b/server/docker/discovery/Dockerfile @@ -1,8 +1,12 @@ FROM python:3.11-alpine +LABEL org.label-schema.name="Eclipse BaSyx" \ + org.label-schema.version="1.0" \ + org.label-schema.description="Docker image for the basyx-python-sdk discovery server application" \ + org.label-schema.maintainer="Eclipse BaSyx" + ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 -ENV PYTHONPATH="${PYTHONPATH}:/app" # If we have more dependencies for the server it would make sense # to refactor uswgi to the pyproject.toml @@ -11,10 +15,12 @@ RUN apk update && \ pip install uwsgi && \ apk del git bash - -COPY discovery_server/uwsgi.ini /etc/uwsgi/ -COPY discovery_server/supervisord.ini /etc/supervisor/conf.d/supervisord.ini -COPY discovery_server/stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +COPY ./sdk /sdk +COPY ./server/app /server/app +COPY ./server/pyproject.toml /server/pyproject.toml +COPY ./server/docker/discovery/uwsgi.ini /etc/uwsgi/ +COPY ./server/docker/common/supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY ./server/docker/common/stop-supervisor.sh /etc/supervisor/stop-supervisor.sh RUN chmod +x /etc/supervisor/stop-supervisor.sh # Makes it possible to use a different configuration @@ -27,24 +33,18 @@ ENV NGINX_MAX_UPLOAD=1M ENV NGINX_WORKER_PROCESSES=1 ENV LISTEN_PORT=80 ENV CLIENT_BODY_BUFFER_SIZE=1M +ENV API_BASE_PATH=/api/v3.1.1/ # Copy the entrypoint that will generate Nginx additional configs -COPY discovery_server/entrypoint.sh /entrypoint.sh +COPY server/docker/common/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] ENV SETUPTOOLS_SCM_PRETEND_VERSION=1.0.0 - -COPY ./discovery_server/requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -COPY ./sdk /sdk -COPY ./server /app/server -COPY ./discovery_server/app /app - -WORKDIR /app -RUN pip install ../sdk +WORKDIR /server/app +RUN pip install ../../sdk +RUN pip install .. CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] \ No newline at end of file diff --git a/discovery_server/uwsgi.ini b/server/docker/discovery/uwsgi.ini similarity index 79% rename from discovery_server/uwsgi.ini rename to server/docker/discovery/uwsgi.ini index 9c54ae1cc..250ea4b23 100644 --- a/discovery_server/uwsgi.ini +++ b/server/docker/discovery/uwsgi.ini @@ -1,5 +1,5 @@ [uwsgi] -wsgi-file = /app/main.py +wsgi-file = /server/app/services/run_discovery.py socket = /tmp/uwsgi.sock chown-socket = nginx:nginx chmod-socket = 664 diff --git a/registry_server/Dockerfile b/server/docker/registry/Dockerfile similarity index 100% rename from registry_server/Dockerfile rename to server/docker/registry/Dockerfile diff --git a/registry_server/uwsgi.ini b/server/docker/registry/uwsgi.ini similarity index 100% rename from registry_server/uwsgi.ini rename to server/docker/registry/uwsgi.ini diff --git a/server/docker/repository/Dockerfile b/server/docker/repository/Dockerfile index eed1c1abe..bf701c808 100644 --- a/server/docker/repository/Dockerfile +++ b/server/docker/repository/Dockerfile @@ -45,7 +45,7 @@ ENV STORAGE_OVERWRITE=False VOLUME ["/input", "/storage"] # Copy the entrypoint that will generate Nginx additional configs -COPY server/docker/repository/entrypoint.sh /entrypoint.sh +COPY server/docker/common/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] diff --git a/server/docker/repository/entrypoint.sh b/server/docker/repository/entrypoint.sh deleted file mode 100644 index 722394409..000000000 --- a/server/docker/repository/entrypoint.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env sh -set -e - -# Get the maximum upload file size for Nginx, default to 0: unlimited -USE_NGINX_MAX_UPLOAD=${NGINX_MAX_UPLOAD:-0} - -# Get the number of workers for Nginx, default to 1 -USE_NGINX_WORKER_PROCESSES=${NGINX_WORKER_PROCESSES:-1} - -# Set the max number of connections per worker for Nginx, if requested -# Cannot exceed worker_rlimit_nofile, see NGINX_WORKER_OPEN_FILES below -NGINX_WORKER_CONNECTIONS=${NGINX_WORKER_CONNECTIONS:-1024} - -# Get the listen port for Nginx, default to 80 -USE_LISTEN_PORT=${LISTEN_PORT:-80} - -# Get the client_body_buffer_size for Nginx, default to 1M -USE_CLIENT_BODY_BUFFER_SIZE=${CLIENT_BODY_BUFFER_SIZE:-1M} - -# Create the conf.d directory if it doesn't exist -if [ ! -d /etc/nginx/conf.d ]; then - mkdir -p /etc/nginx/conf.d -fi - -if [ -f /app/nginx.conf ]; then - cp /app/nginx.conf /etc/nginx/nginx.conf -else - content='user nginx;\n' - # Set the number of worker processes in Nginx - content=$content"worker_processes ${USE_NGINX_WORKER_PROCESSES};\n" - content=$content'error_log /var/log/nginx/error.log warn;\n' - content=$content'pid /var/run/nginx.pid;\n' - content=$content'events {\n' - content=$content" worker_connections ${NGINX_WORKER_CONNECTIONS};\n" - content=$content'}\n' - content=$content'http {\n' - content=$content' include /etc/nginx/mime.types;\n' - content=$content' default_type application/octet-stream;\n' - content=$content' log_format main '"'\$remote_addr - \$remote_user [\$time_local] \"\$request\" '\n" - content=$content' '"'\$status \$body_bytes_sent \"\$http_referer\" '\n" - content=$content' '"'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';\n" - content=$content' access_log /var/log/nginx/access.log main;\n' - content=$content' sendfile on;\n' - content=$content' keepalive_timeout 65;\n' - content=$content' include /etc/nginx/conf.d/*.conf;\n' - content=$content'}\n' - content=$content'daemon off;\n' - # Set the max number of open file descriptors for Nginx workers, if requested - if [ -n "${NGINX_WORKER_OPEN_FILES}" ] ; then - content=$content"worker_rlimit_nofile ${NGINX_WORKER_OPEN_FILES};\n" - fi - # Save generated /etc/nginx/nginx.conf - printf "$content" > /etc/nginx/nginx.conf - - content_server='server {\n' - content_server=$content_server" listen ${USE_LISTEN_PORT};\n" - content_server=$content_server' location / {\n' - content_server=$content_server' include uwsgi_params;\n' - content_server=$content_server' uwsgi_pass unix:///tmp/uwsgi.sock;\n' - content_server=$content_server' }\n' - content_server=$content_server'}\n' - # Save generated server /etc/nginx/conf.d/nginx.conf - printf "$content_server" > /etc/nginx/conf.d/nginx.conf - - # # Generate additional configuration - printf "client_max_body_size $USE_NGINX_MAX_UPLOAD;\n" > /etc/nginx/conf.d/upload.conf - printf "client_body_buffer_size $USE_CLIENT_BODY_BUFFER_SIZE;\n" > /etc/nginx/conf.d/body-buffer-size.conf - printf "add_header Access-Control-Allow-Origin *;\n" > /etc/nginx/conf.d/cors-header.conf -fi - -exec "$@" diff --git a/discovery_server/README.md b/server/example_configurations/discovery_standalone/README.md similarity index 98% rename from discovery_server/README.md rename to server/example_configurations/discovery_standalone/README.md index 5083f48a7..45dfde793 100644 --- a/discovery_server/README.md +++ b/server/example_configurations/discovery_standalone/README.md @@ -18,7 +18,7 @@ The Discovery Service stores and retrieves relations between AAS identifiers and | ## Configuration - +Add discovery_store as directory The service can be configured to use either: - **In-memory storage** (default): Temporary data storage that resets on service restart. diff --git a/server/example_configurations/discovery_standalone/compose.yml b/server/example_configurations/discovery_standalone/compose.yml new file mode 100644 index 000000000..b875bb16b --- /dev/null +++ b/server/example_configurations/discovery_standalone/compose.yml @@ -0,0 +1,12 @@ +name: basyx-python-server +services: + app: + build: + context: ../../.. + dockerfile: server/docker/discovery/Dockerfile + ports: + - "8084:80" + environment: + - storage_path=/discovery_store.json + volumes: + - ./discovery_store.json:/discovery_store.json \ No newline at end of file diff --git a/registry_server/README.md b/server/example_configurations/registry_standalone/README.md similarity index 100% rename from registry_server/README.md rename to server/example_configurations/registry_standalone/README.md diff --git a/registry_server/compose.yml b/server/example_configurations/registry_standalone/compose.yml similarity index 100% rename from registry_server/compose.yml rename to server/example_configurations/registry_standalone/compose.yml diff --git a/server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json b/server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json new file mode 100644 index 000000000..b38b4fb2a --- /dev/null +++ b/server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y30_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json b/server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json new file mode 100644 index 000000000..3d9784885 --- /dev/null +++ b/server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json @@ -0,0 +1,136 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Pipe33", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "F40", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40" + }, + { + "idShort": "HasControlModule_F40", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe33" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe33" + }, + { + "type": "Entity", + "value": "F40" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json b/server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json new file mode 100644 index 000000000..4d26a80c8 --- /dev/null +++ b/server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y17_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json b/server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json new file mode 100644 index 000000000..feaefb504 --- /dev/null +++ b/server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_Regler_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json b/server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json new file mode 100644 index 000000000..5be92b1bb --- /dev/null +++ b/server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y25_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json b/server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json new file mode 100644 index 000000000..90f75a892 --- /dev/null +++ b/server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Norbro" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "pneumatisher Antrieb" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Rudolf-Plank-Str.2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "76275" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Ettlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Norbro Serie 40R" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "9999", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json b/server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json new file mode 100644 index 000000000..2ff640e58 --- /dev/null +++ b/server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y18_Actuator_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json b/server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json new file mode 100644 index 000000000..c00eee36f --- /dev/null +++ b/server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json b/server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json new file mode 100644 index 000000000..9fe906a0c --- /dev/null +++ b/server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json @@ -0,0 +1,284 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/TechnicalData", + "submodelElements": [ + { + "idShort": "Input_signal", + "description": [ + { + "language": "de", + "text": "Angabe \u00fcber eine eingehende Information" + }, + { + "language": "en", + "text": "information on the incoming information" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF945#002" + } + ] + }, + "value": "4\u008520mA", + "valueType": "xs:string" + }, + { + "idShort": "Min_supply_pressure", + "description": [ + { + "language": "de", + "text": "min. Speisedruck wird nach Notwendigket verwendet, um eine weitere differenzierende Begrifflichkeit f\u00fcr einen zweiten, aus dem prim\u00e4ren Betriebsdruck abgeleiteten Druck zu haben. Hier den min. Speisedruck" + }, + { + "language": "en", + "text": "max. supply pressure is used as necessary in order to have a further differentiating term for a second pressure based on the primary operating pressure, here the max. supply pressure" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD910#001" + } + ] + }, + "value": "2", + "valueType": "xs:string" + }, + { + "idShort": "Max_supply_pressure", + "description": [ + { + "language": "de", + "text": "max. Speisedruck wird nach Notwendigket verwendet, um eine weitere differenzierende Begrifflichkeit f\u00fcr einen zweiten, aus dem prim\u00e4ren Betriebsdruck abgeleiteten Druck zu haben. Hier den max. Speisedruck" + }, + { + "language": "en", + "text": "greatest possible minimum operating pressure for operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD911#001" + } + ] + }, + "value": "6", + "valueType": "xs:string" + }, + { + "idShort": "Air_consumption", + "description": [ + { + "language": "de", + "text": "Verbrauch des Werkzeuge an Druckluft, z.B. f\u00fcr Druckluft-Schlagschrauber" + }, + { + "language": "en", + "text": "Tool's consumption of compressed air, e.g. for compressed air hammer screw driver" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA453#003" + } + ] + }, + "value": "0.03", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_input_signal", + "description": [ + { + "language": "de", + "text": "Form und/oder Funktion des Signals am Eingang, das sowohl wertediskontinuierlich (bin\u00e4r) als auch wertekontinuierlich (analog oder auch die digitale Abbildung eines Analogsignals) in Bezug auf den G\u00fcltigkeitsbereich des Signal sein kann" + }, + { + "language": "en", + "text": "form and/or function of the signal at the input which can be discontinuous (binary) or continuous (analog or as digital mapping of an analog signal) in respect to the signal's range of validity" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAG071#008" + } + ] + }, + "value": "4\u008520mA", + "valueType": "xs:string" + }, + { + "idShort": "Max_ambient_temperature_during_operating_phase", + "description": [ + { + "language": "de", + "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" + }, + { + "language": "en", + "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF525#003" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "Min_ambient_temperature_during_operating_phase", + "description": [ + { + "language": "de", + "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / kleinster Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht mehr unterschritten werden kann oder darf" + }, + { + "language": "en", + "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / lower limit value of a physical quantity whose value cannot or must not be undershot" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF526#003" + } + ] + }, + "value": "85", + "valueType": "xs:string" + }, + { + "idShort": "Max_relative_humidity", + "description": [ + { + "language": "de", + "text": "h\u00f6chster Wert von relativer Feuchte, f\u00fcr die ein Ger\u00e4t ausgelegt ist oder auszulegen ist, damit es innerhalb seiner Spezifikationen betrieben wird" + }, + { + "language": "en", + "text": "highest value of relative humidity for which a device is or must be designed to operate within its specified limits" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN102#003" + } + ] + }, + "value": "90", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_electrical_connection__control_side", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der steuerseitig liegenden Verbindungsstelle, \u00fcber die ein elektrisches Betriebsmittel bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" + }, + { + "language": "en", + "text": "physical design of the control side to link an electrical operating unit to another in conformity with the intended use" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM488#006" + } + ] + }, + "value": "Thread M20*1.5", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_pneumatic_connections", + "description": [ + { + "language": "de", + "text": "geometrische Anforderungen der genormten pneumatischen Anschl\u00fcsse" + }, + { + "language": "en", + "text": "geometric requirements for the standardised pneumatic connections" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ904#001" + } + ] + }, + "value": "Threads G 1/4 ", + "valueType": "xs:string" + }, + { + "idShort": "Protection_class_acc_IP", + "description": [ + { + "language": "de", + "text": "gibt die Schutzklass nach IP eines Lasernivellierger\u00e4tes an" + }, + { + "language": "en", + "text": "indicates the protection class acc. IP of a laser level gage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAJ501#002" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json b/server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json new file mode 100644 index 000000000..d970202c5 --- /dev/null +++ b/server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json @@ -0,0 +1,220 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Norgren/Herion" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Indirect solenoid actuated spool valves" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Bruckstra\u00dfe 93" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "46519" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Alpen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "97100 Namur" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json b/server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json new file mode 100644 index 000000000..ab53436d0 --- /dev/null +++ b/server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "IAT" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Unit" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TU20" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json b/server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json new file mode 100644 index 000000000..f3e257409 --- /dev/null +++ b/server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json @@ -0,0 +1,309 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/TechnicalData", + "submodelElements": [ + { + "idShort": "Output_Power", + "description": [ + { + "language": "de", + "text": "vom Hersteller f\u00fcr das Betriebsmittel bemessene Leistung bei angegebenen Betriebsbedingungen" + }, + { + "language": "en", + "text": "power of the output terminal of an electric circuit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF725#002" + } + ] + }, + "value": "0.37", + "valueType": "xs:string" + }, + { + "idShort": "Power_factor_cos_phi", + "description": [ + { + "language": "de", + "text": "Verh\u00e4ltnis vom Betrag der Wirkleistung zur Scheinleistung" + }, + { + "language": "en", + "text": "Relation of the amount of the active power to the false performance" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN420#001" + } + ] + }, + "value": "0.96", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP55", + "valueType": "xs:string" + }, + { + "idShort": "max_resistance_to_a_continuous_temperature", + "description": [ + { + "language": "de", + "text": "maximaler Wert der Temperatur, der ein Bauteil dauerhaft ausgesetzt werden kann, ohne seine charakteristischen Eigenschaften zu verlieren" + }, + { + "language": "en", + "text": "maximum value of the temperature which a component may be suspended permanently without losing its characteristic properties" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI476#003" + } + ] + }, + "value": "155", + "valueType": "xs:string" + }, + { + "idShort": "Power_frequency", + "description": [ + { + "language": "de", + "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" + }, + { + "language": "en", + "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC859#003" + } + ] + }, + "value": "50/60", + "valueType": "xs:string" + }, + { + "idShort": "max_input_current_with_AC_50_Hz", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Wechselstrom mit 50 Hz, der bei angesteuertem Eingang eingespeist/aufgenommen wird" + }, + { + "language": "en", + "text": "Maximum value of alternating current (50 Hz) that is fed in/taken up with a controlled input" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB849#007" + } + ] + }, + "value": "02. Jul", + "valueType": "xs:string" + }, + { + "idShort": "max_input_current_with_AC_60_Hz", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Wechselstrom mit 60 Hz, der bei angesteuertem Eingang eingespeist/aufgenommen wird" + }, + { + "language": "en", + "text": "Maximum value of alternating current (60 Hz) that is fed in/taken up with a controlled input" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB850#007" + } + ] + }, + "value": "02. Mai", + "valueType": "xs:string" + }, + { + "idShort": "max_rated_supply_voltage_with_AC", + "description": [ + { + "language": "de", + "text": "vom Hersteller angegebener gr\u00f6\u00dftm\u00f6glicher Wert der erforderlichen Wechselspannung als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" + }, + { + "language": "en", + "text": "Maximum value stipulated by the manufacturer of the required electric motor driven alternating voltage which must be temporarily or permanently applied to the supply input of an operating unit to maintain its function" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB831#008" + } + ] + }, + "value": "240", + "valueType": "xs:string" + }, + { + "idShort": "min_rated_supply_voltage_with_AC", + "description": [ + { + "language": "de", + "text": "vom Hersteller angegebener kleinstm\u00f6glicher Wert der erforderlichen Wechselspannung mit als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" + }, + { + "language": "en", + "text": "Minimum value stipulated by the manufacturer of the required electric motor driven alternating voltage which must be temporarily or permanently applied to the supply input of an operating unit to maintain its function" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB965#008" + } + ] + }, + "value": "220", + "valueType": "xs:string" + }, + { + "idShort": "max_rotation_speed", + "description": [ + { + "language": "de", + "text": "gibt die maximale Motordrehzahl an" + }, + { + "language": "en", + "text": "indicates the maxmium motor rotation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAR636#004" + } + ] + }, + "value": "2840", + "valueType": "xs:string" + }, + { + "idShort": "min_rotation_speed", + "description": [ + { + "language": "de", + "text": "Angabe zur minimalen Drehzahl" + }, + { + "language": "en", + "text": "description of minimum speed" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAR637#003" + } + ] + }, + "value": "360", + "valueType": "xs:string" + }, + { + "idShort": "Pitch_circle_diameter_of_stator_coupling", + "description": [ + { + "language": "de", + "text": "Angabe des Durchmesser f\u00fcr die Befestigung der Drehmomentst\u00fctze" + }, + { + "language": "en", + "text": "specifies the diameter for mounting the stator coupling" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ253#001" + } + ] + }, + "value": "85", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json b/server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json new file mode 100644 index 000000000..b052ec3a4 --- /dev/null +++ b/server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T23_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json b/server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json new file mode 100644 index 000000000..df6ccee98 --- /dev/null +++ b/server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json @@ -0,0 +1,509 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/TechnicalData", + "submodelElements": [ + { + "idShort": "Rotation_speed", + "description": [ + { + "language": "de", + "text": "Quotient aus Anzahl der Umdrehungen und der zugeh\u00f6rigen Zeitspanne" + }, + { + "language": "en", + "text": "Quotient of number of rotations divided by the associated time span" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAD222#006" + } + ] + }, + "value": "2751", + "valueType": "xs:string" + }, + { + "idShort": "Normal_feed_flow", + "description": [ + { + "language": "de", + "text": "F\u00f6rderstrom, der bei \u00fcblichem Betrieb zu erwarten ist" + }, + { + "language": "en", + "text": "delivery which is to be expected for usual operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAJ126#007" + } + ] + }, + "value": "3", + "valueType": "xs:string" + }, + { + "idShort": "Max_ambient_temperature_during_operating_phase", + "description": [ + { + "language": "de", + "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" + }, + { + "language": "en", + "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF525#003" + } + ] + }, + "value": "40", + "valueType": "xs:string" + }, + { + "idShort": "Max_pressure", + "description": [ + { + "language": "de", + "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" + }, + { + "language": "en", + "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA447#006" + } + ] + }, + "value": "25", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_width_of_the_suction_supports", + "description": [ + { + "language": "de", + "text": "gibt die Nennweite des Saugstutzens an, eine numerische Festlegung der Gr\u00f6\u00dfe f\u00fcr die \u2018lichte Weite\u2019 (Innenma\u00df), die f\u00fcr alle Komponenten eines Rohrleitungssystems gleich ist, im Unterschied zu Komponenten, die durch einen Au\u00dfendurchmesser festgelegt sind oder durch eine Gewindegr\u00f6\u00dfe. Sie ist einen runde Zahl (ungef\u00e4hr der innere Durchmesser des Rohrleitungsanschlusses gemessen in Millimeter. Sie bezieht sich gew\u00f6hnlich nur ungef\u00e4hr auf die Fertigungsma\u00dfe" + }, + { + "language": "en", + "text": "provides the nominal width of the suction supports. A numeric determination of the size for the 'open width' (internal measurement), which is the same for all components of a pipe system, in contrast to components determined by an outer diameter or by a thread size. It is a round number (approx. that of the internal diameter of the pipe connection measured in millimeters. Normally, this relates only approximately to the production measurements" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO804#001" + } + ] + }, + "value": "DN25/ DN32", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_pressure_plastic", + "description": [ + { + "language": "de", + "text": "Nenndruck gibt f\u00fcr ein Rohrleitungssystem eine Referenzgr\u00f6\u00dfe an. Die Angabe erfolgt durch die Bezeichnung PN (Pressure Nominal) gefolgt von einer dimensionslosen ganzen Zahl, die den Auslegungsdruck in bar bei Raumtemperatur (20 \u00b0C) angibt. Der bei einer bestimmten Temperatur zul\u00e4ssige Betriebsdruck wird \u00fcblicherweise in Prozent des Nenndruckes angegeben. Bei h\u00f6heren und tieferen Temperaturen ist, bedingt durch die Abnahme der zul\u00e4ssigen Werkstoffkennwerte (Streckgrenze), der zul\u00e4ssige Druck entsprechend geringer. PN 10 zum Beispiel bezeichnet eine Rohrleitung mit dem h\u00f6chstzul\u00e4ssigen Druck von 10 bar bei einer Fluidtemperatur von 20 \u00b0C" + }, + { + "language": "en", + "text": "The nominal pressure is a pipe system to a reference value. This is specified by the term PN (Pressure Nominal) followed by a dimensionless whole number that specifies the design pressure in bar at room temperature (20 \u00b0 C). The allowable operating pressure at a certain temperature is usually expressed as a percentage of the nominal pressure. At higher and lower temperatures is due to the decrease in the allowable material properties (yield strength), the allowable pressure correspondingly lower. PN 10, for example, refers to a pipe with the maximum pressure of 10 bar at a fluid temperature of 20 \u00b0 C" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAX147#001" + } + ] + }, + "value": "PN25", + "valueType": "xs:string" + }, + { + "idShort": "Max_temperature_of_medium_to_be_transported", + "description": [ + { + "language": "de", + "text": "Maximale Temperatur des Mediums das gef\u00f6rdert werden soll" + }, + { + "language": "en", + "text": "Maximum temperature if the medium to be transported" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC658#005" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Min_temp_of_medium_to_be_transported", + "description": [ + { + "language": "de", + "text": "Minimale Temperatur des Mediums das gef\u00f6rdert werden soll" + }, + { + "language": "en", + "text": "Minimum temperature if the medium to be transported" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC729#004" + } + ] + }, + "value": "90", + "valueType": "xs:string" + }, + { + "idShort": "Material_property_of_the_pumping_medium", + "description": [ + { + "language": "de", + "text": "Beschreibt die mechanischen, physikalischen und chemischen Eigenschaften des Werkstoffes" + }, + { + "language": "en", + "text": "Describes the mechanical, physical and chemical properties of the material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAD195#006" + } + ] + }, + "value": "Die Dichte betraegt 998,2kg/m^3", + "valueType": "xs:string" + }, + { + "idShort": "Measurement_performance_of_the_electric_motor", + "description": [ + { + "language": "de", + "text": "Die vom Hersteller f\u00fcr das Betriebsmittel bemessene Leistung bei angegebenen Betriebsbedingungen" + }, + { + "language": "en", + "text": "The output measured by the manufacturer for the operating medium at defined operating conditions" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAH734#003" + } + ] + }, + "value": "0.37", + "valueType": "xs:string" + }, + { + "idShort": "Power_frequency", + "description": [ + { + "language": "de", + "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" + }, + { + "language": "en", + "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC859#003" + } + ] + }, + "value": "50", + "valueType": "xs:string" + }, + { + "idShort": "Rated_voltage", + "description": [ + { + "language": "de", + "text": "vom Hersteller angegebener Wert, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind, f\u00fcr die Spannung, die an ein elektrisches Betriebsmittel unter Ber\u00fccksichtigung der Gebrauchsbedingungen angelegt werden" + }, + { + "language": "en", + "text": "manufacturer's value for the voltage, which is derived from measured values that have been obtained under established conditions and rules" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAH005#006" + } + ] + }, + "value": "200-240", + "valueType": "xs:string" + }, + { + "idShort": "Rated_current", + "description": [ + { + "language": "de", + "text": "vom Hersteller angegebener Wert des Stromes, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" + }, + { + "language": "en", + "text": "value of the current, resulting from measurements which were determined under specified conditions and rules as defined by the manufacturer" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF726#003" + } + ] + }, + "value": "03.02.2005 00:00", + "valueType": "xs:string" + }, + { + "idShort": "Power_factor_cos_phi", + "description": [ + { + "language": "de", + "text": "Verh\u00e4ltnis vom Betrag der Wirkleistung zur Scheinleistung" + }, + { + "language": "en", + "text": "Relation of the amount of the active power to the false performance" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN420#001" + } + ] + }, + "value": "0.96", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_speed", + "description": [ + { + "language": "de", + "text": "Drehzahl die den Nenndaten des verwendeten Motors entspricht" + }, + { + "language": "en", + "text": "Speed corresponding to the motor used according to the name plate ratings" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA580#006" + } + ] + }, + "value": "360-2840", + "valueType": "xs:string" + }, + { + "idShort": "Motor_efficiency", + "description": [ + { + "language": "de", + "text": "Verh\u00e4ltnis der vom Motor abgegebenen Leistung zu der vom Motor aufgenommenen Leistung" + }, + { + "language": "en", + "text": "determined proportion of the motor power input p_mot delivered as pump power input p_mot,u" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC232#001" + } + ] + }, + "value": "68", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP55", + "valueType": "xs:string" + }, + { + "idShort": "Net_weight", + "description": [ + { + "language": "de", + "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t. Da unter \u201eGewicht\u201c in diesem Fall die Masse verstanden wird, ist auch die Ma\u00dfeinheit (Kilo-) Gramm als SI-Einheit zu verwenden" + }, + { + "language": "en", + "text": "Dimensions of the weigh item without packaging and without transport device. As, in this case, 'weight' means dimensions, the measure unit (kilo) gram is to be used as the SI unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAD875#007" + } + ] + }, + "value": "2.4", + "valueType": "xs:string" + }, + { + "idShort": "Gross_weight", + "description": [ + { + "language": "de", + "text": "quantitative Angabe zur Masse eines Gegenstandes mit Verpackung" + }, + { + "language": "en", + "text": "Quantitative statement of the mass of an object, including packaging" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAF368#004" + } + ] + }, + "value": "2.6", + "valueType": "xs:string" + }, + { + "idShort": "Kind_of_motor_protection_device", + "description": [ + { + "language": "de", + "text": "gibt an, welche Art der Vorrichtung zum Schutz des Motors vorhanden ist" + }, + { + "language": "en", + "text": "indicates the available kind of device to protect the motor" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAR645#006" + } + ] + }, + "value": "PTC", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json b/server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json new file mode 100644 index 000000000..42703f0ac --- /dev/null +++ b/server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json b/server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json new file mode 100644 index 000000000..c19c88e52 --- /dev/null +++ b/server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json @@ -0,0 +1,334 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/TechnicalData", + "submodelElements": [ + { + "idShort": "max_measuring_range", + "description": [ + { + "language": "de", + "text": "Gibt den h\u00f6chsten Wert des Impulsstroms an, der vom Impulsz\u00e4hler erfasst wird" + }, + { + "language": "en", + "text": "Max. value of the impulse current which can be detected by the counter" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD387#001" + } + ] + }, + "value": "5", + "valueType": "xs:string" + }, + { + "idShort": "Max_deviation", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6gliche Abweichung der tats\u00e4chlichen von der eingestellten (geregelten) Temperatur" + }, + { + "language": "en", + "text": "maximum deviation of the actual temperature to the adjusted temperature" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI784#002" + } + ] + }, + "value": "4", + "valueType": "xs:string" + }, + { + "idShort": "Design_of_the_process_connection", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" + }, + { + "language": "en", + "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB411#007" + } + ] + }, + "value": "Thread G1(1/2), 1(1/2)NPT", + "valueType": "xs:string" + }, + { + "idShort": "Min_process_pressure", + "description": [ + { + "language": "de", + "text": "kleinster Absolutwert des die Mess- oder Stelleinrichtung ber\u00fchrenden Druckes, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the least absolute value of the pressure which affects them and under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY641#001" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Max_process_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY820#001" + } + ] + }, + "value": "200", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_process_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" + }, + { + "language": "en", + "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN307#004" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_storage_temperature", + "description": [ + { + "language": "de", + "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN272#004" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Lower_limiting_value_of_storage_temperature", + "description": [ + { + "language": "de", + "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN276#004" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_ambient_temperature", + "description": [ + { + "language": "de", + "text": "maximale Umgebungstemperatur (\u00b0C), f\u00fcr die das K\u00fchlger\u00e4t geeignet ist, wie in Anhang IV in Erg\u00e4nzung der Verordnung (EU) 2017/1369 erl\u00e4utert" + }, + { + "language": "en", + "text": "maximum ambient temperature (\u00b0C), for which the refrigerating appliance is suitable, as explained in Annex IV supplementing Regulation (EU) 2017/1369" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABF703#001" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Minimum_ambient_temperature", + "description": [ + { + "language": "de", + "text": "minimale Umgebungstemperatur (\u00b0C), f\u00fcr die das K\u00fchlger\u00e4t geeignet ist, wie in Anhang IV in Erg\u00e4nzung der Verordnung (EU) 2017/1369 erl\u00e4utert" + }, + { + "language": "en", + "text": "minimum ambient temperature (\u00b0C), for which the refrigerating appliance is suitable, as explained in Annex IV supplementing Regulation (EU) 2017/1369" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABF726#001" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "Operating_voltage", + "description": [ + { + "language": "de", + "text": "Spannung, die zusammen mit dem Bemessungsbetriebsstrom die Anwendung des Ger\u00e4tes bestimmt und auf die sich die verschiedenen Pr\u00fcfungen und die Gebrauchskategorien beziehen. Bei einpoligen Ger\u00e4ten ist die Bemessungsbetriebsspannung im Allgemeinen die Spannung \u00fcber den Pol. Bei mehrpoligen Ger\u00e4ten wird sie im Allgemeinen als verkettete Spannung angegeben" + }, + { + "language": "en", + "text": "voltage which, together with the rated operating current, determines the use of the device and to which the various tests and the use categories refer. With single pole devices the rated rated operating voltage is generally the voltage over the pole. With multi-pole devices it is generally given as chained voltage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAB415#008" + } + ] + }, + "value": "14\u008536V DC", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4\u008520mA/HART- Zweileiter", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_protection", + "description": [ + { + "language": "de", + "text": "Ausma\u00df des durch ein Geh\u00e4use gebotenen Schutzes vor Zugang zu gef\u00e4hrlichen Teilen und Eindringen von festen Fremdk\u00f6rpern und/oder Wasser, der durch normierte Pr\u00fcfverfahren best\u00e4tigt wurde, angegeben als IP-Einstufung" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and/or ingress of water and verified by standardized test methods, expressed as a IP rating" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAG975#013" + } + ] + }, + "value": "IP66/IP67", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json b/server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json new file mode 100644 index 000000000..ee22dff6d --- /dev/null +++ b/server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json @@ -0,0 +1,84 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/TechnicalData", + "submodelElements": [ + { + "idShort": "ISO_5211", + "description": [ + { + "language": "de", + "text": "Bezugnahme auf eine oder mehrere Normen und Richtlinien anstelle der Wiedergabe detaillierter Festlegungen. ANMERKUNG Eine Anwendungsnorm ist die Vorgabe eines Handlungsmusters, das bei Anwendung befolgt, oder einer Qualit\u00e4t, die bei Anwendung eingehalten werden muss. Sie dient dazu, unabh\u00e4ngig voneinander entstehende Artefakte mit einheitlichen Eigenschaften oder Qualit\u00e4ten herzustellen. Nationale und internationale Normen werden in sog. Normungsgremien verabschiedet" + }, + { + "language": "en", + "text": "Reference to one or more norms and guidelines instead of repeating detailed specs. COMMENT: An application norm is a specification of a pattern of use which must be followed during use, or of a quality which must be maintained during use. It serves to cause artifacts which arise independently of one another to be manufactured with uniform properties or qualities. National and international standards are established by so-called standards committees" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAP798#001" + } + ] + }, + "value": "F05", + "valueType": "xs:string" + }, + { + "idShort": "Operating_Pressure", + "description": [ + { + "language": "de", + "text": "festgelegte, vereinbarte Abstufungsreihe f\u00fcr maximal zul\u00e4ssige Betriebsdr\u00fccke" + }, + { + "language": "en", + "text": "determined, agreed graduation sequence for maximum allowable operating pressures" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAG984#007" + } + ] + }, + "value": "4", + "valueType": "xs:string" + }, + { + "idShort": "Springstroke", + "description": [ + { + "language": "de", + "text": "Federweg der Feder." + }, + { + "language": "en", + "text": "Springstroke." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Springstroke" + } + ] + }, + "value": "35 to 60", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json b/server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json new file mode 100644 index 000000000..72e78f85d --- /dev/null +++ b/server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json @@ -0,0 +1,359 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/TechnicalData", + "submodelElements": [ + { + "idShort": "Measuring_range_conductivity", + "description": [ + { + "language": "de", + "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" + }, + { + "language": "en", + "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH095#003" + } + ] + }, + "value": "0.01...20", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_process_connection", + "description": [ + { + "language": "de", + "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" + }, + { + "language": "en", + "text": "classification of a process connection according to its fabricated form" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA021#007" + } + ] + }, + "value": "\"Thread G 1\"\" PES\"", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_temperature_sensor", + "description": [ + { + "language": "de", + "text": "Charakterisierung einer Temperatursensors bez\u00fcglich seiner elektrischen Ausf\u00fchrung" + }, + { + "language": "en", + "text": "classification of a temperature probe according to its electrical design" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN862#002" + } + ] + }, + "value": "Pt100", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_process_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" + }, + { + "language": "en", + "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN307#004" + } + ] + }, + "value": "135", + "valueType": "xs:string" + }, + { + "idShort": "Max_process_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY820#001" + } + ] + }, + "value": "16", + "valueType": "xs:string" + }, + { + "idShort": "Measurement_error", + "description": [ + { + "language": "de", + "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" + }, + { + "language": "en", + "text": "deviation of measured value from the true value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ356#003" + } + ] + }, + "value": "5% of reading", + "valueType": "xs:string" + }, + { + "idShort": "Repeatability", + "description": [ + { + "language": "de", + "text": "Grad der \u00dcbereinstimmung einer Anzahl aufeinander folgender Messungen des Ausgangssignals f\u00fcr denselben Wert der Eingangsvariablen unter denselben Bedingungen, wenn die Ausgangsvariable, aus der gleichen Richtung kommend, alle Werte ihres Bereichs durchl\u00e4uft" + }, + { + "language": "en", + "text": "degree of agreement for a number of subsequent measurements of the output signal for the same value of the input variable under the same conditions, when the output variable, originating from the same direction, passes through all variables in its range" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ350#003" + } + ] + }, + "value": "0.2% of reading", + "valueType": "xs:string" + }, + { + "idShort": "Minimum_ambient_temperature", + "description": [ + { + "language": "de", + "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" + }, + { + "language": "en", + "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as \u2018Climate class, W [climate class]. This appliance is intended to be used at an ambient temperature between \u2019X\u2019 [lowest temperature] \u00b0C and \u2019X\u2019 [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV259#003" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_ambient_temperature", + "description": [ + { + "language": "de", + "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" + }, + { + "language": "en", + "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as: \u2018Climate class: W [climate class]. This appliance is intended to be used at an ambient temperature between \u201cX\u201d [lowest temperature] \u00b0C and \u201cX\u201d [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV260#002" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_storage_temperature", + "description": [ + { + "language": "de", + "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN272#004" + } + ] + }, + "value": "-25", + "valueType": "xs:string" + }, + { + "idShort": "Lower_limiting_value_of_storage_temperature", + "description": [ + { + "language": "de", + "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN276#004" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + }, + { + "idShort": "Min_air_humidity", + "description": [ + { + "language": "de", + "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW976#002" + } + ] + }, + "value": "5", + "valueType": "xs:string" + }, + { + "idShort": "Max_air_humidity", + "description": [ + { + "language": "de", + "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN164#003" + } + ] + }, + "value": "95", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json b/server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json new file mode 100644 index 000000000..7096eebc7 --- /dev/null +++ b/server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json @@ -0,0 +1,40 @@ +{ + "data": { + "idShort": "Y25_Ball_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/DynamicData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json b/server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json new file mode 100644 index 000000000..cedacb1a6 --- /dev/null +++ b/server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FDL30" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Hauptstrasse 1" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "79689" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Maulburg" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "LIQUIPHANT II" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unknown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json b/server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json new file mode 100644 index 000000000..8a5c2b066 --- /dev/null +++ b/server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json b/server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json new file mode 100644 index 000000000..047030288 --- /dev/null +++ b/server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json @@ -0,0 +1,495 @@ +{ + "data": { + "idShort": "IdGenerationSettings", + "modelType": "Submodel", + "id": "https://repodomainurl.com/sm/B461C6ED32214933B8B6CE569C8F0A03/1/0", + "administration": { + "version": "1", + "revision": "0" + }, + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/1/0" + } + ] + }, + "submodelElements": [ + { + "idShort": "AssetIDShort", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIDShort/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" + } + ] + }, + "value": "string", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/IdType" + } + ], + "value": [ + { + "idShort": "Prefix", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdShortPrefix/1/0" + } + ] + }, + "value": "example", + "valueType": "xs:string" + }, + { + "idShort": "DynamicPart", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdShortDynamicPart/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" + } + ] + }, + "value": "(AssetIdShort)", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/AllowedValue" + } + ], + "value": "AssetIdShort", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "AASIDShort", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdShort/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" + } + ] + }, + "value": "string", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/IdType" + } + ], + "value": [ + { + "idShort": "Prefix", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdShortPrefix/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" + } + ] + }, + "value": "aas_", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/ExampleValue" + } + ], + "value": "aas_", + "valueType": "xs:string" + }, + { + "idShort": "DynamicPart", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdShortDynamicPart/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" + } + ] + }, + "value": "(GUID|AssetIdShort)", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/AllowedValue" + } + ], + "value": "AssetIdShort", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "AASID", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AasId/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" + } + ] + }, + "value": "IRI", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/IdType" + } + ], + "value": [ + { + "idShort": "Prefix", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdPrefix/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" + } + ] + }, + "value": "https://example.com/aas/", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/ExampleValue" + } + ], + "value": "https://i40.xitaso.com/aas/", + "valueType": "xs:string" + }, + { + "idShort": "DynamicPart", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdDynamicPart/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" + } + ] + }, + "value": "(GUID|AssetIdShort|AASIdShort)", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/AllowedValue" + } + ], + "value": "AssetIdShort", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "AssetID", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AssetId/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" + } + ] + }, + "value": "IRI", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/IdType" + } + ], + "value": [ + { + "idShort": "Prefix", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdPrefix/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" + } + ] + }, + "value": "https://example.com/", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/ExampleValue" + } + ], + "value": "https://i40.xitaso.com/", + "valueType": "xs:string" + }, + { + "idShort": "DynamicPart", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdDynamicPart/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" + } + ] + }, + "value": "(GUID|AssetIdShort)", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/AllowedValue" + } + ], + "value": "AssetIdShort", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "SubmodelID", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/SubmodelId/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" + } + ] + }, + "value": "IRI", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/IdType" + } + ], + "value": [ + { + "idShort": "Prefix", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/SubmodelIdPrefix/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" + } + ] + }, + "value": "https://example1234.com/sm/", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/ExampleValue" + } + ], + "value": "https://i40.xitaso.com/sm/", + "valueType": "xs:string" + }, + { + "idShort": "DynamicPart", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/IdGenerationSettings/SubmodelIdDynamicPart/1/0" + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" + } + ] + }, + "value": "(GUID)", + "kind": "TemplateQualifier", + "valueType": "xs:string", + "type": "SMT/AllowedValue" + } + ], + "value": "GUID", + "valueType": "xs:string" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json b/server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json new file mode 100644 index 000000000..ac89872be --- /dev/null +++ b/server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json @@ -0,0 +1,459 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/TechnicalData", + "submodelElements": [ + { + "idShort": "Measuring_range", + "description": [ + { + "language": "de", + "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" + }, + { + "language": "en", + "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH095#003" + } + ] + }, + "value": "0...60", + "valueType": "xs:string" + }, + { + "idShort": "Display_range", + "description": [ + { + "language": "de", + "text": "Ausgabebereich bei anzeigenden Messger\u00e4ten" + }, + { + "language": "en", + "text": "output range of a measuring device which displays" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ355#003" + } + ] + }, + "value": "0...20", + "valueType": "xs:string" + }, + { + "idShort": "Lower_range_limit_of_temperature", + "description": [ + { + "language": "de", + "text": "niedrigster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" + }, + { + "language": "en", + "text": "lowest value of temperature that the device can be adjusted to measure within the specified accuracy limits" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY818#001" + } + ] + }, + "value": "-35", + "valueType": "xs:string" + }, + { + "idShort": "Upper_range_limit_of_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" + }, + { + "language": "en", + "text": "highest value of the temperature that a device can be adjusted to measure within its specified accuracy limits" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY819#001" + } + ] + }, + "value": "250", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4...20mA/HART/Profibus", + "valueType": "xs:string" + }, + { + "idShort": "Max_input_voltage_with_DC", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6glicher Wert der Gleichspannung, die am Eingang eines Betriebsmittels angelegt werden kann" + }, + { + "language": "en", + "text": "maximum value of direct-voltage that can be applied to the input of an operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB848#008" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "Max_input_current_with_DC", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Gleichstrom, der bei angesteuertem Eingang eingespeist/aufgenommen wird" + }, + { + "language": "en", + "text": "Maximum value of an DC current that is fed in/taken up with a controlled input" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB852#007" + } + ] + }, + "value": "21", + "valueType": "xs:string" + }, + { + "idShort": "Max_DC__input_capacity", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6gliche Gleichstrom-Eingangsleistung f\u00fcr die der Wechselrichter eine netzsynchrone Wechselspannung erzeugen kann" + }, + { + "language": "en", + "text": "maximum DC-input power for the inverters produce a synchronous AC network" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI736#002" + } + ] + }, + "value": "3", + "valueType": "xs:string" + }, + { + "idShort": "Max_load", + "description": [ + { + "language": "de", + "text": "maximale B\u00fcrde, die an den Anschl\u00fcssen des Ger\u00e4ts angelegt werden kann oder vom Ger\u00e4t an ein externes angeschlossenes Ger\u00e4t weitergegeben wird" + }, + { + "language": "en", + "text": "maximum load that can be applied to the terminals of the device or will be given by the device to an external devices connected to it" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA042#009" + } + ] + }, + "value": "600", + "valueType": "xs:string" + }, + { + "idShort": "Minimum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW301#002" + } + ] + }, + "value": "55", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW302#002" + } + ] + }, + "value": "-10", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN313#004" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Lower_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN314#004" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Min_air_humidity", + "description": [ + { + "language": "de", + "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW976#002" + } + ] + }, + "value": "10", + "valueType": "xs:string" + }, + { + "idShort": "Max_air_humidity", + "description": [ + { + "language": "de", + "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN164#003" + } + ] + }, + "value": "90", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_auxiliary_energy", + "description": [ + { + "language": "de", + "text": "n\u00e4here Angaben zur Energie, welche dem Betriebsmittel oder dem Betriebssystem zum Aufrechterhalten seiner Funktion zeitweise oder st\u00e4ndig zugef\u00fchrt werden muss" + }, + { + "language": "en", + "text": "further information on the energy which must be fed to the operating resource or operating system continually or occasionally so that performance of its function can be sustained" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAB236#008" + } + ] + }, + "value": "24V AC/DC", + "valueType": "xs:string" + }, + { + "idShort": "Number_of_connections_sensor_actor", + "description": [ + { + "language": "de", + "text": "Quantitative Angabe zur Menge Anschl\u00fcsse Sensor/Aktor" + }, + { + "language": "en", + "text": "Quantitative statement about the set of connections sensor / actor" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAP400#001" + } + ] + }, + "value": "1*Konduktiver Sensor", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json b/server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json new file mode 100644 index 000000000..18f7f0a50 --- /dev/null +++ b/server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "HC20_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json b/server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json new file mode 100644 index 000000000..9d44b2012 --- /dev/null +++ b/server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "VEGA" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "F\u00fcllstandsensor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Am Hohenstein 113" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "77761" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Schiltach" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "VEGAFlex 65 FX65.XXAGD1HKMXX" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json b/server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json new file mode 100644 index 000000000..a50b68115 --- /dev/null +++ b/server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Beh\u00e4lter" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "zyl. Beh\u00e4lter" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json b/server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json new file mode 100644 index 000000000..0c0f2cbd4 --- /dev/null +++ b/server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y37_Positioner_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json b/server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json new file mode 100644 index 000000000..cf7581b6b --- /dev/null +++ b/server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "ABB" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Typ 18345-2021465101" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Schillerstr.72" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "32425" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Minden" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TZIDC" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json b/server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json new file mode 100644 index 000000000..d28f140d8 --- /dev/null +++ b/server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y21_MagneticPositioner_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json b/server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json new file mode 100644 index 000000000..3c15866a1 --- /dev/null +++ b/server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json @@ -0,0 +1,49 @@ +{ + "data": { + "idShort": "B2_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/DynamicData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json b/server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json new file mode 100644 index 000000000..7d4a31034 --- /dev/null +++ b/server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L26_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json b/server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json new file mode 100644 index 000000000..c62ccfa6d --- /dev/null +++ b/server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y25_Pneumatischer_Antrieb_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json b/server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json new file mode 100644 index 000000000..791a30eaa --- /dev/null +++ b/server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y24_Magnetic_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json b/server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json new file mode 100644 index 000000000..a92cddf80 --- /dev/null +++ b/server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json @@ -0,0 +1,220 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "RTD Thermometer omnigrad TST40N" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Colmarer Str. 6" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "79576" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Weil am Rhein" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TST" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json b/server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json new file mode 100644 index 000000000..303e7993f --- /dev/null +++ b/server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "TU10_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json b/server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json new file mode 100644 index 000000000..3d8b11f0f --- /dev/null +++ b/server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json @@ -0,0 +1,134 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/TechnicalData", + "submodelElements": [ + { + "idShort": "Nennweite", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "G1/2", + "valueType": "xs:string" + }, + { + "idShort": "Einbaulaenge", + "description": [ + { + "language": "de", + "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" + }, + { + "language": "en", + "text": "overall length of that part of a device or component to be found within a containment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM599#004" + } + ] + }, + "value": "100", + "valueType": "xs:string" + }, + { + "idShort": "min_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-50\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "400\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "14571", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json b/server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json new file mode 100644 index 000000000..6d69e6cd7 --- /dev/null +++ b/server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L11_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json b/server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json new file mode 100644 index 000000000..18a075793 --- /dev/null +++ b/server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Yokogawa" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "SC202G" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Berlinerstrasse 101-103" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "40880" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Ratingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "SC202G" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "S", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json b/server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json new file mode 100644 index 000000000..354af0203 --- /dev/null +++ b/server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y24_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json b/server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json new file mode 100644 index 000000000..4246d6c4c --- /dev/null +++ b/server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json @@ -0,0 +1,26 @@ +{ + "data": { + "idShort": "MnestixDefaultSubmodels", + "modelType": "AssetAdministrationShell", + "id": "https://mnestix.com/aas/F11BF9F696A3454EBA0AA4503783F142_4", + "derivedFrom": { + "type": "ModelReference", + "keys": [ + { + "type": "AssetAdministrationShell", + "value": "https://mnestix.com/aas/MnestixCustomSubmodelTemplate" + } + ] + }, + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "exampleAsset", + "specificAssetIds": [ + { + "name": "assetIdShort", + "value": "exampleAssetIdShort" + } + ] + } + } +} \ No newline at end of file diff --git a/server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json b/server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json new file mode 100644 index 000000000..aad5baacd --- /dev/null +++ b/server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json @@ -0,0 +1,384 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/TechnicalData", + "submodelElements": [ + { + "idShort": "Nominal_width_DN", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "DN25", + "valueType": "xs:string" + }, + { + "idShort": "Max_flow_rate", + "description": [ + { + "language": "de", + "text": "Wassermenge, die maximal pro Zeiteiheit durch das Ger\u00e4t flie\u00dfen kann" + }, + { + "language": "en", + "text": "maximum water quantity which can flow through the appliance per time unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC971#002" + } + ] + }, + "value": "18000", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_pressure_PN_of_the_flange", + "description": [ + { + "language": "de", + "text": "Beschreibung der Flanschbennung der Druckstufe" + }, + { + "language": "en", + "text": "description of the pressure stage of the label of the flange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK644#005" + } + ] + }, + "value": "40", + "valueType": "xs:string" + }, + { + "idShort": "Material", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "1.4404/316L, 1.4539/904L", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_protection_IP_of_the_evaluating_electronics", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP67", + "valueType": "xs:string" + }, + { + "idShort": "Measurement_error", + "description": [ + { + "language": "de", + "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" + }, + { + "language": "en", + "text": "deviation of measured value from the true value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ356#003" + } + ] + }, + "value": "0.1%+[(zero point stability: measured value)*100]%", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4 - 20 mA DC/ HART", + "valueType": "xs:string" + }, + { + "idShort": "Max_medium_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB864#006" + } + ] + }, + "value": "120", + "valueType": "xs:string" + }, + { + "idShort": "Min_medium_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB988#006" + } + ] + }, + "value": "-50", + "valueType": "xs:string" + }, + { + "idShort": "minimum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW301#002" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "maximum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW302#002" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_cable_entry", + "description": [ + { + "language": "de", + "text": "Beschreibung der geometrischen und / oder funktionalen Ausf\u00fchrung der Einf\u00fchrung f\u00fcr Kabel" + }, + { + "language": "en", + "text": "description of the geometrical and / or functional modeling of the cable entry" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAG180#006" + } + ] + }, + "value": "M20*1.5(8 to 12 mm)", + "valueType": "xs:string" + }, + { + "idShort": "Supply_voltage_type", + "description": [ + { + "language": "de", + "text": "bestimmte Form der Spannung, die angibt, ob das Betriebsmittel mit Wechselspannung (AC), Gleichspannung (DC), Wechsel-/Gleichstrom (AC/DC) oder modulierter Gleichspannung (UC) versorgt werden kann" + }, + { + "language": "en", + "text": "Type of voltage required for supplying the device" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC078#007" + } + ] + }, + "value": "85 to 260 V AC, 45 to 65 Hz", + "valueType": "xs:string" + }, + { + "idShort": "Max_storage_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6gliche Temperatur mit der ein W\u00e4rmespeicher beschickt werden kann" + }, + { + "language": "en", + "text": "maximum temperature which can be fed with a heat storage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI791#003" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Min_storage_temperature", + "description": [ + { + "language": "de", + "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ342#005" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json b/server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json new file mode 100644 index 000000000..9ca5b70a0 --- /dev/null +++ b/server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Beh\u00e4lter" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "zyl. Beh\u00e4lter" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json b/server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json new file mode 100644 index 000000000..0b196ca2f --- /dev/null +++ b/server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json @@ -0,0 +1,134 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/TechnicalData", + "submodelElements": [ + { + "idShort": "Nennweite", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "DN25", + "valueType": "xs:string" + }, + { + "idShort": "Nenndruck", + "description": [ + { + "language": "de", + "text": "Beschreibung der Flanschbennung der Druckstufe" + }, + { + "language": "en", + "text": "description of the pressure stage of the label of the flange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK644#005" + } + ] + }, + "value": "PN40", + "valueType": "xs:string" + }, + { + "idShort": "Prozessanschluss", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" + }, + { + "language": "en", + "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB411#007" + } + ] + }, + "value": "geflanscht", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "371", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "14.409", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json b/server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json new file mode 100644 index 000000000..740cc4aff --- /dev/null +++ b/server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Pipe32_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json b/server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json new file mode 100644 index 000000000..07748dba6 --- /dev/null +++ b/server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json @@ -0,0 +1,359 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/TechnicalData", + "submodelElements": [ + { + "idShort": "Measuring_range_conductivity", + "description": [ + { + "language": "de", + "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" + }, + { + "language": "en", + "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH095#003" + } + ] + }, + "value": "0.01...20", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_process_connection", + "description": [ + { + "language": "de", + "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" + }, + { + "language": "en", + "text": "classification of a process connection according to its fabricated form" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA021#007" + } + ] + }, + "value": "\"Thread G 1\"\" PES\"", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_temperature_sensor", + "description": [ + { + "language": "de", + "text": "Charakterisierung einer Temperatursensors bez\u00fcglich seiner elektrischen Ausf\u00fchrung" + }, + { + "language": "en", + "text": "classification of a temperature probe according to its electrical design" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN862#002" + } + ] + }, + "value": "Pt100", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_process_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" + }, + { + "language": "en", + "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN307#004" + } + ] + }, + "value": "135", + "valueType": "xs:string" + }, + { + "idShort": "Max_process_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY820#001" + } + ] + }, + "value": "16", + "valueType": "xs:string" + }, + { + "idShort": "Measurement_error", + "description": [ + { + "language": "de", + "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" + }, + { + "language": "en", + "text": "deviation of measured value from the true value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ356#003" + } + ] + }, + "value": "5% of reading", + "valueType": "xs:string" + }, + { + "idShort": "Repeatability", + "description": [ + { + "language": "de", + "text": "Grad der \u00dcbereinstimmung einer Anzahl aufeinander folgender Messungen des Ausgangssignals f\u00fcr denselben Wert der Eingangsvariablen unter denselben Bedingungen, wenn die Ausgangsvariable, aus der gleichen Richtung kommend, alle Werte ihres Bereichs durchl\u00e4uft" + }, + { + "language": "en", + "text": "degree of agreement for a number of subsequent measurements of the output signal for the same value of the input variable under the same conditions, when the output variable, originating from the same direction, passes through all variables in its range" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ350#003" + } + ] + }, + "value": "0.2% of reading", + "valueType": "xs:string" + }, + { + "idShort": "Minimum_ambient_temperature", + "description": [ + { + "language": "de", + "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" + }, + { + "language": "en", + "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as \u2018Climate class, W [climate class]. This appliance is intended to be used at an ambient temperature between \u2019X\u2019 [lowest temperature] \u00b0C and \u2019X\u2019 [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV259#003" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_ambient_temperature", + "description": [ + { + "language": "de", + "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" + }, + { + "language": "en", + "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as: \u2018Climate class: W [climate class]. This appliance is intended to be used at an ambient temperature between \u201cX\u201d [lowest temperature] \u00b0C and \u201cX\u201d [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV260#002" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_storage_temperature", + "description": [ + { + "language": "de", + "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN272#004" + } + ] + }, + "value": "-25", + "valueType": "xs:string" + }, + { + "idShort": "Lower_limiting_value_of_storage_temperature", + "description": [ + { + "language": "de", + "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN276#004" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + }, + { + "idShort": "Min_air_humidity", + "description": [ + { + "language": "de", + "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW976#002" + } + ] + }, + "value": "5", + "valueType": "xs:string" + }, + { + "idShort": "Max_air_humidity", + "description": [ + { + "language": "de", + "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN164#003" + } + ] + }, + "value": "95", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json b/server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json new file mode 100644 index 000000000..c20c244ea --- /dev/null +++ b/server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "HC30_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json b/server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json new file mode 100644 index 000000000..f39c75c21 --- /dev/null +++ b/server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T10_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json b/server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json new file mode 100644 index 000000000..96afb633c --- /dev/null +++ b/server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Emerson Electric Co." + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Stellventil" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8000 West Florissant Avenue, P.O. Box 4100" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63136" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Saint Louis Missouri" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "US" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GX Stellventil" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2005", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json b/server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json new file mode 100644 index 000000000..f3e85ee77 --- /dev/null +++ b/server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N13_Pumpe_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json b/server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json new file mode 100644 index 000000000..7b1fd1554 --- /dev/null +++ b/server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y37_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json b/server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json new file mode 100644 index 000000000..848e9cb75 --- /dev/null +++ b/server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Messumformer" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Dieselstra\u00dfe 24" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "70839" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Gerlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Mycom S CLM153" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json b/server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json new file mode 100644 index 000000000..62a85bf95 --- /dev/null +++ b/server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "ABB Automation Products GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Temperatursensor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Borsigstr. 2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63755" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Alzenau" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TSP 121" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json b/server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json new file mode 100644 index 000000000..694bb9032 --- /dev/null +++ b/server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Y16", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "Y16_Regler", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler" + }, + { + "idShort": "HasComponent_Y16_Regler", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y16" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y16" + }, + { + "type": "Entity", + "value": "Y16_Regler" + } + ] + } + }, + { + "idShort": "Y16_Stellventil", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil" + }, + { + "idShort": "HasComponent_Y16_Stellventil", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y16" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y16" + }, + { + "type": "Entity", + "value": "Y16_Stellventil" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json b/server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json new file mode 100644 index 000000000..683d6d409 --- /dev/null +++ b/server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Masoneilan" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "SVI II-21121111" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Baker-Hughe-Strasse 1" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "29221" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Celle" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "SVI" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json b/server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json new file mode 100644 index 000000000..e7a25de52 --- /dev/null +++ b/server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y37_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json b/server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json new file mode 100644 index 000000000..c576f7893 --- /dev/null +++ b/server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "DynamicData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/DynamicData", + "submodelElements": [ + { + "idShort": "Level", + "description": [ + { + "language": "de", + "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." + }, + { + "language": "en", + "text": "Height of the liquid inside of the vessel in centimeter." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Level" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json b/server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json new file mode 100644 index 000000000..6d4fbd33a --- /dev/null +++ b/server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Pipe33_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json b/server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json new file mode 100644 index 000000000..af759b8b8 --- /dev/null +++ b/server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F17_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json b/server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json new file mode 100644 index 000000000..c71fbef4f --- /dev/null +++ b/server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GRUNDFOS" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "UPS 32-80 B 180" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Martin Bachs Vej 3" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8850" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Bjerringbro" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DK" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "UP UPS Series 100" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2006", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json b/server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json new file mode 100644 index 000000000..faf06ec31 --- /dev/null +++ b/server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T20_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json b/server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json new file mode 100644 index 000000000..fbc9e1687 --- /dev/null +++ b/server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json @@ -0,0 +1,209 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/TechnicalData", + "submodelElements": [ + { + "idShort": "Case_Matrial", + "description": [ + { + "language": "de", + "text": "Eine auf Normen basierende Nummerierung der Werkstoffe. Durch Bezugnahme auf eine Norm ist der Werkstoff eindeutig beschrieben" + }, + { + "language": "en", + "text": "A norm-based numbering of the materials. The material is unambiguously described by referring to a norm" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ250#002" + } + ] + }, + "value": "CrNiMo-Steel 1.4571", + "valueType": "xs:string" + }, + { + "idShort": "Foerdergut", + "description": [ + { + "language": "de", + "text": "Im allgemeinen Sprachgebrauch \u00fcblicher Name oder der Handelsname des Stoffs oder Stoffgemisches" + }, + { + "language": "en", + "text": "Usual name or brand name of the material or material blend in general language" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO905#002" + } + ] + }, + "value": "reines Wasser", + "valueType": "xs:string" + }, + { + "idShort": "max_temprature", + "description": [ + { + "language": "de", + "text": "Oberste, nicht zu \u00fcberschreitende Temperatur des Materials oder Messstoffes, oberhalb der das Betriebsmittel ohne bleibende Ver\u00e4nderungen seiner Eigenschaften nicht betrieben werden darf" + }, + { + "language": "en", + "text": "For a given operating resource, the greatest temperature, not ever to be exceeded, of materials or measuring substances above which the resource cannot be operated without permanent changes in its characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA373#005" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Dichtung", + "description": [ + { + "language": "de", + "text": "Zusatzangaben zum Produktnamen der Abdichtung, um sie so bei einer Produktfamilie oder speziellen Auspr\u00e4gungen (Varianten) der Abdichtung voneinander unterscheiden zu k\u00f6nnen" + }, + { + "language": "en", + "text": "additional information for the product name of the sealing to be able to distinguish - for a product family or for special design (variants) - the products from each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO946#001" + } + ] + }, + "value": "BQ1EGG", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Schutzartklassen beschreibende Norm. Art und Nummer der Norm mit Ausgabejahr und Ausgabemonat sind anzugeben" + }, + { + "language": "en", + "text": "norm describing the protection type classes. Issue year and issue month must be given" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ042#002" + } + ] + }, + "value": "IP55", + "valueType": "xs:string" + }, + { + "idShort": "Head", + "description": [ + { + "language": "de", + "text": "im Betriebspunkt herrschende Differenz der Gesamtenergieh\u00f6he an der Austrittsseite des Pumpenaggregates zur Gesamtenergieh\u00f6he der Eintrittsseite des Pumpenaggregates" + }, + { + "language": "en", + "text": "difference between the total energy height on the outlet side of the pump aggregate and the total energy height of the intake side of the pump aggregate ruling at operating point" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAJ125#007" + } + ] + }, + "value": "0.41", + "valueType": "xs:string" + }, + { + "idShort": "Flow_Rate", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter F\u00f6rderstrom, den die Pumpe kontinuierlich ohne internen Schaden zu nehmen, erbringen kann, wenn sie bei Auslegungsdrehzahl und mit dem F\u00f6rdergut arbeitet, f\u00fcr die sie geliefert wurde" + }, + { + "language": "en", + "text": "greatest rate of flow the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAI023#005" + } + ] + }, + "value": "10.4", + "valueType": "xs:string" + }, + { + "idShort": "speed", + "description": [ + { + "language": "de", + "text": "h\u00f6chste zul\u00e4ssige Drehzahl der Pumpe" + }, + { + "language": "en", + "text": "highest permissible rotating speed of the pump" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAJ156#007" + } + ] + }, + "value": "1395", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json b/server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json new file mode 100644 index 000000000..cf5559c51 --- /dev/null +++ b/server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Q11_Conductivity_Sensor_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json b/server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json new file mode 100644 index 000000000..90663edb8 --- /dev/null +++ b/server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y13_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json b/server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json new file mode 100644 index 000000000..e817bf552 --- /dev/null +++ b/server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json b/server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json new file mode 100644 index 000000000..8237a2cea --- /dev/null +++ b/server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json @@ -0,0 +1,134 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/TechnicalData", + "submodelElements": [ + { + "idShort": "Nennweite", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "G1/2", + "valueType": "xs:string" + }, + { + "idShort": "Einbaulaenge", + "description": [ + { + "language": "de", + "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" + }, + { + "language": "en", + "text": "overall length of that part of a device or component to be found within a containment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM599#004" + } + ] + }, + "value": "100", + "valueType": "xs:string" + }, + { + "idShort": "min_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-50\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "400\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "14571", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json b/server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json new file mode 100644 index 000000000..699620680 --- /dev/null +++ b/server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json @@ -0,0 +1,1250 @@ +{ + "data": { + "idShort": "TimeSeries", + "description": [ + { + "language": "de", + "text": "Enth\u00e4lt Zeitreihendaten und Referenzen auf Zeitreihendaten, um diese entlang des Asset\n Lebenszyklus aufzufinden und semantisch zu beschreiben.\n " + }, + { + "language": "en", + "text": "Contains time series data and references to time series data to discover and semantically\n describe them along the asset lifecycle.\n " + } + ], + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/TimeSeries", + "administration": { + "version": "1", + "revision": "1" + }, + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/1/1" + } + ] + }, + "kind": "Template", + "submodelElements": [ + { + "idShort": "Metadata", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Metadata/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "f22_current_value" + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Description/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "Current process value of flow sensor F22" + } + ] + }, + { + "idShort": "Record", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Record/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Time", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/RelativePointInTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/SubmodelTemplates/Cardinality/1/0\n " + } + ] + }, + "value": "OneToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + }, + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/SubmodelTemplates/AllowedIdShort/1/0\n " + } + ] + }, + "value": "Time[\\d{2,3}]", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "AllowedIdShort" + } + ], + "valueType": "xs:long" + } + ] + } + ] + }, + { + "idShort": "Segments", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "ExternalSegment", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/ExternalSegment/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "externalSegment f22_current_value " + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "An example external segment of current process value of flow sensor F22" + } + ] + }, + { + "idShort": "RecordCount", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "360", + "valueType": "xs:long" + }, + { + "idShort": "StartTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07 17:55:03.579795+00:00", + "valueType": "xs:string" + }, + { + "idShort": "EndTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07T18:54:52.324618+00:00", + "valueType": "xs:string" + }, + { + "idShort": "Duration", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "T1H", + "valueType": "xs:string" + }, + { + "idShort": "SamplingInterval", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "10", + "valueType": "xs:long" + }, + { + "idShort": "SamplingRate", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "State", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "completed", + "valueType": "xs:string" + }, + { + "idShort": "LastUpdate", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07T18:54:52.324618+00:00", + "valueType": "xs:string" + }, + { + "idShort": "File", + "category": "PARAMETER", + "modelType": "File", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/File/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "contentType": "String", + "value": "C:\\Users\\wan\\sciebo\\Lehrstuhl\\PLS-Labor\\Digitalisierung Pumpwerk\\AAS Pumpwerk\\2024\\Test Metadata\\f22_current_value.xlsx" + }, + { + "idShort": "Blob", + "category": "VARIABLE", + "modelType": "Blob", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Blob/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "contentType": "application/json" + } + ] + }, + { + "idShort": "LinkedSegment", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/LinkedSegment/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "linkedSegment f22_current_value " + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "An example linked segment of current process value of flow sensor F22" + } + ] + }, + { + "idShort": "RecordCount", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "StartTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "EndTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07T18:55:00", + "valueType": "xs:string" + }, + { + "idShort": "Duration", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "T1H", + "valueType": "xs:string" + }, + { + "idShort": "SamplingInterval", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "10", + "valueType": "xs:long" + }, + { + "idShort": "SamplingRate", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "State", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "complete", + "valueType": "xs:string" + }, + { + "idShort": "LastUpdate", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "Endpoint", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Endpoint/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "http://10.42.0.114:8086", + "valueType": "xs:string" + }, + { + "idShort": "Query", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Query/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "from(bucket: \"iat\")\n |> range(start: {range_start}, stop: {range_stop}) \n |> filter(fn: (r) => r._measurement == \"f22_current_value\"", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "InternalSegment", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/InternalSegment/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ] + }, + { + "idShort": "RecordCount", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "StartTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "EndTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "Duration", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "SamplingInterval", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "SamplingRate", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "State", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "LastUpdate", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "Records", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Records/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Record", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Record/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Time", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/RelativePointInTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/SubmodelTemplates/Cardinality/1/0\n " + } + ] + }, + "value": "OneToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + }, + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/SubmodelTemplates/AllowedIdShort/1/0\n " + } + ] + }, + "value": "Time[\\d{2,3}]", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "AllowedIdShort" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "sampleAccelerationX", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://sample.com/AccelerationX/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "sampleAccelerationY", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://sample.com/AccelerationY/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "sampleAccelerationZ", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://sample.com/AccelerationZ/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + } + ] + } + ] + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json b/server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json new file mode 100644 index 000000000..967ae95d2 --- /dev/null +++ b/server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Pipe31_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json b/server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json new file mode 100644 index 000000000..a7febc4cd --- /dev/null +++ b/server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N18_Frequenzumrichter_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json b/server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json new file mode 100644 index 000000000..77f0a7b94 --- /dev/null +++ b/server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GRUNDFOS" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "MGE 71A2-14FT85C" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Park u. 8" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "H-2045" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Toeroekbalint" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "HU" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "MGE 71" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json b/server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json new file mode 100644 index 000000000..c6230b6cd --- /dev/null +++ b/server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json @@ -0,0 +1,424 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Pipe11", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "N13", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13" + }, + { + "idShort": "HasControlModule_N13", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + }, + { + "type": "Entity", + "value": "N13" + } + ] + } + }, + { + "idShort": "P14", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14" + }, + { + "idShort": "HasControlModule_P14", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + }, + { + "type": "Entity", + "value": "P14" + } + ] + } + }, + { + "idShort": "T15", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15" + }, + { + "idShort": "HasControlModule_T15", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + }, + { + "type": "Entity", + "value": "T15" + } + ] + } + }, + { + "idShort": "F17", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17" + }, + { + "idShort": "HasControlModule_F17", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + }, + { + "type": "Entity", + "value": "F17" + } + ] + } + }, + { + "idShort": "Y16", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16" + }, + { + "idShort": "HasControlModule_Y16", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe11" + }, + { + "type": "Entity", + "value": "Y16" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json b/server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json new file mode 100644 index 000000000..13d10d17c --- /dev/null +++ b/server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json @@ -0,0 +1,10 @@ +{ + "data": { + "modelType": "AssetAdministrationShell", + "id": "http://acplt.org/Test_Asset", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "http://acplt.org/Test_Asset" + } + } +} \ No newline at end of file diff --git a/server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json b/server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json new file mode 100644 index 000000000..0d43e9456 --- /dev/null +++ b/server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json @@ -0,0 +1,134 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/TechnicalData", + "submodelElements": [ + { + "idShort": "Type_of_input_signal", + "description": [ + { + "language": "de", + "text": "Form und/oder Funktion des Signals am Eingang, das sowohl wertediskontinuierlich (bin\u00e4r) als auch wertekontinuierlich (analog oder auch die digitale Abbildung eines Analogsignals) in Bezug auf den G\u00fcltigkeitsbereich des Signal sein kann" + }, + { + "language": "en", + "text": "form and/or function of the signal at the input which can be discontinuous (binary) or continuous (analog or as digital mapping of an analog signal) in respect to the signal's range of validity" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA004#006" + } + ] + }, + "value": "4-20mA", + "valueType": "xs:string" + }, + { + "idShort": "Plug_type", + "description": [ + { + "language": "de", + "text": "Art des am Ger\u00e4t angeschlossenen Steckers zur Versorgung des Ger\u00e4tes mit elektrischer Energie" + }, + { + "language": "en", + "text": "version of plug that the appliance is delivered with" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAE804#005" + } + ] + }, + "value": "contoured, heavy top guided", + "valueType": "xs:string" + }, + { + "idShort": "Max_operating_temperature_range", + "description": [ + { + "language": "de", + "text": "oberer Grenzwert des Einsatzes in einer bestimmten Temperatur, in dem ein Betriebsmittel eingesetzt werden kann, ohne dass sich bestimmte garantierte Eigenschaften gravierend \u00e4ndern, abh\u00e4ngig von der Verweildauer" + }, + { + "language": "en", + "text": "maximum boundary value of the usage in a specified temperature, in which an operating unit can be used, without serious changes of assigned features, depending on the exposure time" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAG321#003" + } + ] + }, + "value": "350", + "valueType": "xs:string" + }, + { + "idShort": "Min_operating_temperature_range", + "description": [ + { + "language": "de", + "text": "unterer Grenzwert des Temperatureinsatzbereiches. Der Temperatureinsatzbereich von Betriebsmitteln beschreibt den Temperaturbereich, in dem diese eingesetzt werden k\u00f6nnen, ohne dass sich bestimmte garantierte Eigenschaften gravierend \u00e4ndern. Zeitliche Einschr\u00e4nkungen wie Kurzzeit oder Dauer m\u00fcssen angegeben werden" + }, + { + "language": "en", + "text": "minimum boundary value of the usage in a specified temperature, in which an operating unit can be used, without serious changes of assigned features, depending on the exposure time. Temporal restrictions like short-time or durability have to be stated" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAG322#003" + } + ] + }, + "value": "-29", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_body_weight", + "description": [ + { + "language": "de", + "text": "vom Hersteller empfohlenes h\u00f6chste K\u00f6rpergewicht des Anwenders, um das Produkt bestimmungsgem\u00e4\u00df zu nutzen" + }, + { + "language": "en", + "text": "greatest body weight of user recommended by the manufacturer for the intended use of product" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAA912#006" + } + ] + }, + "value": "7", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json b/server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json new file mode 100644 index 000000000..3b343d850 --- /dev/null +++ b/server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Leitf\u00e4higkeitsmesswertaufnehmer" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Dieselstra\u00dfe 24" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "70839" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Gerlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "CLS21 Condumax" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json b/server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json new file mode 100644 index 000000000..9126a3df6 --- /dev/null +++ b/server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F16_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json b/server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json new file mode 100644 index 000000000..9e6752150 --- /dev/null +++ b/server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json @@ -0,0 +1,384 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/TechnicalData", + "submodelElements": [ + { + "idShort": "Nennweite", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "DN25", + "valueType": "xs:string" + }, + { + "idShort": "Nenndruck", + "description": [ + { + "language": "de", + "text": "Beschreibung der Flanschbennung der Druckstufe" + }, + { + "language": "en", + "text": "description of the pressure stage of the label of the flange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK644#005" + } + ] + }, + "value": "PN40", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "14571", + "valueType": "xs:string" + }, + { + "idShort": "Dichtwerkstoff", + "description": [ + { + "language": "de", + "text": "Substanz, aus welcher die Dichtung hergestellt ist" + }, + { + "language": "en", + "text": "substance from which a leave is manufactured" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK468#006" + } + ] + }, + "value": "PTFE", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP67", + "valueType": "xs:string" + }, + { + "idShort": "Betriebsmedium", + "description": [ + { + "language": "de", + "text": "Medium, mit welchem das Ger\u00e4t betrieben werden darf (Medium am Eingang)" + }, + { + "language": "en", + "text": "temperature at which the specified accuracy data are valid. For deviations from the nominal temperature, the specified temperature coefficients must be must be added to the specified accuracies" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD905#001" + } + ] + }, + "value": "Wasser", + "valueType": "xs:string" + }, + { + "idShort": "min_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-55\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "200\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "min_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-20\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "70\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "Ausgang", + "description": [ + { + "language": "de", + "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" + }, + { + "language": "en", + "text": "rules and agreements by that communication partner can interact with each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW333#001" + } + ] + }, + "value": "4 - 20 mA DC/ HART", + "valueType": "xs:string" + }, + { + "idShort": "Spannungsversorgung", + "description": [ + { + "language": "de", + "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" + }, + { + "language": "en", + "text": "describes the source of electrical energy that supplies the object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK788#003" + } + ] + }, + "value": "24...46", + "valueType": "xs:string" + }, + { + "idShort": "max_Durchfluss", + "description": [ + { + "language": "de", + "text": "Wassermenge, die maximal pro Zeiteiheit durch das Ger\u00e4t flie\u00dfen kann" + }, + { + "language": "en", + "text": "maximum water quantity which can flow through the appliance per time unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC971#002" + } + ] + }, + "value": "6", + "valueType": "xs:string" + }, + { + "idShort": "Messwertabweichung", + "description": [ + { + "language": "de", + "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" + }, + { + "language": "en", + "text": "deviation of measured value from the true value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ356#003" + } + ] + }, + "value": " \u00b1 0,5 % v. M. unter Referenzbedingungen", + "valueType": "xs:string" + }, + { + "idShort": "zul_Viskositaet", + "description": [ + { + "language": "de", + "text": "H\u00f6chste zul\u00e4ssige Viskosit\u00e4t des Messstoffes, Betriebsstoffes oder Mediums f\u00fcr einen bestimmungsgem\u00e4\u00dfen Gebrauch des Betriebsmittels" + }, + { + "language": "en", + "text": "Greatest permissible viscosity of measured substance, operating substances or mediums for the operating resource to be used as intended" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA046#006" + } + ] + }, + "value": "7.5Ma s", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json b/server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json new file mode 100644 index 000000000..08cc8dd33 --- /dev/null +++ b/server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y14_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json b/server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json new file mode 100644 index 000000000..ee7ca1bd1 --- /dev/null +++ b/server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Emerson Electric Co." + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Stellventil" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8000 West Florissant Avenue, P.O. Box 4100" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63136" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Saint Louis Missouri" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "US" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GX Stellventil" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2005", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json b/server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json new file mode 100644 index 000000000..dd6914c6d --- /dev/null +++ b/server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "KSB AG" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "frequency converter" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Johann-Klein-Str. 9" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "67227" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Frankenthal" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "PumpDrive" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json b/server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json new file mode 100644 index 000000000..adb345692 --- /dev/null +++ b/server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json @@ -0,0 +1,209 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/TechnicalData", + "submodelElements": [ + { + "idShort": "Type_of_insert_element_terminal_block", + "description": [ + { + "language": "de", + "text": "Charakterisierung des Anschlussblocks eines Messeinsatzes bez\u00fcglich Ausf\u00fchrung oder Vorhandensein" + }, + { + "language": "en", + "text": "classification of the terminal block of an insert according to its design or existence" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAT747#004" + } + ] + }, + "value": "minearl insulated(MI), flexibel", + "valueType": "xs:string" + }, + { + "idShort": "Outer_diameter", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Abstand zwischen zwei gegen\u00fcberliegenden Punkten auf dem \u00e4u\u00dferen Umfang" + }, + { + "language": "en", + "text": "largest distance between two opposite points on the outer circumference" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF192#004" + } + ] + }, + "value": "6", + "valueType": "xs:string" + }, + { + "idShort": "Max_operating_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC821#006" + } + ] + }, + "value": "600", + "valueType": "xs:string" + }, + { + "idShort": "Min_operating_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "minimum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC820#006" + } + ] + }, + "value": "-50", + "valueType": "xs:string" + }, + { + "idShort": "Max_process_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY820#001" + } + ] + }, + "value": "20", + "valueType": "xs:string" + }, + { + "idShort": "Response_time", + "description": [ + { + "language": "de", + "text": "Zeit zwischen dem Erregen und dem ersten Schlie\u00dfen oder \u00d6ffnen des Kontaktkreises f\u00fcr ein Schaltger\u00e4t im Ruhezustand" + }, + { + "language": "en", + "text": "time between triggering and the first closing or opening of the contact circuit for a switching device in idle state" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA572#007" + } + ] + }, + "value": "3", + "valueType": "xs:string" + }, + { + "idShort": "Tip_length", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfte Ausdehnung einer Spitze l\u00e4ngs einer Symmetrieachse oder die Entfernung zwischen zwei festgelegten Punkten gem\u00e4\u00df Messvorschrift" + }, + { + "language": "en", + "text": "maximum dimension of tip along the axis of symmetry or distance between two defined points" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABF062#001" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "Insulation_resistance", + "description": [ + { + "language": "de", + "text": "Widerstand der Isolierung gegen das Flie\u00dfen eines elektrischen Stromes" + }, + { + "language": "en", + "text": "Resistance of insulation against the flow of an electric current" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ352#003" + } + ] + }, + "value": "100", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json b/server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json new file mode 100644 index 000000000..f42d987b4 --- /dev/null +++ b/server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F17_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json b/server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json new file mode 100644 index 000000000..4dd1a2f68 --- /dev/null +++ b/server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json b/server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json new file mode 100644 index 000000000..4909b3530 --- /dev/null +++ b/server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Y37", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "Y37_Positioner", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner" + }, + { + "idShort": "HasComponent_Y37_Positioner", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y37" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y37" + }, + { + "type": "Entity", + "value": "Y37_Positioner" + } + ] + } + }, + { + "idShort": "Y37_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve" + }, + { + "idShort": "HasComponent_Y37_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y37" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y37" + }, + { + "type": "Entity", + "value": "Y37_Valve" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json b/server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json new file mode 100644 index 000000000..22521779a --- /dev/null +++ b/server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T12_Temperature_Sensor_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json b/server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json new file mode 100644 index 000000000..479d834ae --- /dev/null +++ b/server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json @@ -0,0 +1,334 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/TechnicalData", + "submodelElements": [ + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4...20mA/HART", + "valueType": "xs:string" + }, + { + "idShort": "min_process_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_process_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "150", + "valueType": "xs:string" + }, + { + "idShort": "min_ambient_temperature", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_ambient_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "min_storage_temperature", + "description": [ + { + "language": "de", + "text": "minimal zul\u00e4ssige Lagertemperatur des Betriebsmittels" + }, + { + "language": "en", + "text": "minimum permissible temperature of the operating resource during storage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABA653#001" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_storage_temperature", + "description": [ + { + "language": "de", + "text": "maximal zul\u00e4ssige Lagertemperatur des Betriebsmittels" + }, + { + "language": "en", + "text": "maximum permissible temperature of the operating resource during storage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABA654#001" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Power_supply", + "description": [ + { + "language": "de", + "text": "Versorgung von Ger\u00e4ten oder Anlagen mit gesonderter, zus\u00e4tzlicher Stromzuf\u00fchrung" + }, + { + "language": "en", + "text": "supply of devices or systems with separate, additional power supply" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ002#001" + } + ] + }, + "value": "12...36", + "valueType": "xs:string" + }, + { + "idShort": "Min_process_pressure", + "description": [ + { + "language": "de", + "text": "kleinster Absolutwert des die Mess- oder Stelleinrichtung ber\u00fchrenden Druckes, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the least absolute value of the pressure which affects them and under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY641#001" + } + ] + }, + "value": "-1", + "valueType": "xs:string" + }, + { + "idShort": "Max_process_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY820#001" + } + ] + }, + "value": "40", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP66/67", + "valueType": "xs:string" + }, + { + "idShort": "Accuracy_of_the_measuring_instrument", + "description": [ + { + "language": "de", + "text": "Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" + }, + { + "language": "en", + "text": "degree of approximation between a result of determination and the approved reference value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH809#004" + } + ] + }, + "value": "\u00b18", + "valueType": "xs:string" + }, + { + "idShort": "length", + "description": [ + { + "language": "de", + "text": "Angabe zur physikalische Ausdehnung eines Produktes" + }, + { + "language": "en", + "text": "information on the physical dimension of a product" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAG779#003" + } + ] + }, + "value": "300", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json b/server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json new file mode 100644 index 000000000..4fa4260e6 --- /dev/null +++ b/server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "P19_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json b/server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json new file mode 100644 index 000000000..2a7766617 --- /dev/null +++ b/server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Samson AG " + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "pneumatischer Schwenkantrieb" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Strazacka 35" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "43-382" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Bielsko-Biala" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "PO" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "RD RDF10-3" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json b/server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json new file mode 100644 index 000000000..8e903ce6a --- /dev/null +++ b/server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N12_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json b/server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json new file mode 100644 index 000000000..2eb286d56 --- /dev/null +++ b/server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N13_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json b/server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json new file mode 100644 index 000000000..646ced613 --- /dev/null +++ b/server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T12_Messumformer_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json b/server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json new file mode 100644 index 000000000..cf5a0bf3b --- /dev/null +++ b/server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y18_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json b/server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json new file mode 100644 index 000000000..e347bb8a8 --- /dev/null +++ b/server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json @@ -0,0 +1,259 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/TechnicalData", + "submodelElements": [ + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4-20mA/HART", + "valueType": "xs:string" + }, + { + "idShort": "Measuring_range", + "description": [ + { + "language": "de", + "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" + }, + { + "language": "en", + "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH095#003" + } + ] + }, + "value": "0-1000", + "valueType": "xs:string" + }, + { + "idShort": "Sensor_type", + "description": [ + { + "language": "de", + "text": "Zusatzangaben zur Bezeichnung von Sensoren, um so bei einer Sensorenfamilie oder bei speziellen Auspr\u00e4gungen (Varianten) die Sensoren voneinander unterscheiden zu k\u00f6nnen" + }, + { + "language": "en", + "text": "Additional information for describing sensors to be able to distinguish - for a sensor family or for special design (variants) - the products from each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA063#005" + } + ] + }, + "value": "2-elektrode", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_temperature_sensor", + "description": [ + { + "language": "de", + "text": "Charakterisierung einer Temperatursensors bez\u00fcglich seiner elektrischen Ausf\u00fchrung" + }, + { + "language": "en", + "text": "classification of a temperature probe according to its electrical design" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN862#002" + } + ] + }, + "value": "Pt1000", + "valueType": "xs:string" + }, + { + "idShort": "Temperature_compensation", + "description": [ + { + "language": "de", + "text": "Beschreibung der Art und Weise, wie der Einfluss der Temperatur auf das Messergebnis korrigiert wird" + }, + { + "language": "en", + "text": "Principle of temperature correction" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAE809#006" + } + ] + }, + "value": "NaCl in water", + "valueType": "xs:string" + }, + { + "idShort": "Max_ambient_temperature_during_operating_phase", + "description": [ + { + "language": "de", + "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" + }, + { + "language": "en", + "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF525#003" + } + ] + }, + "value": "55", + "valueType": "xs:string" + }, + { + "idShort": "Min_ambient_temperature_during_operating_phase", + "description": [ + { + "language": "de", + "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / kleinster Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht mehr unterschritten werden kann oder darf" + }, + { + "language": "en", + "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / lower limit value of a physical quantity whose value cannot or must not be undershot" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF526#003" + } + ] + }, + "value": "-10", + "valueType": "xs:string" + }, + { + "idShort": "Supply_voltage_at_DC", + "description": [ + { + "language": "de", + "text": "erforderliche Spannung als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten / unter der Bedingung: Art des Stromes = direct current (Gleichstrom)" + }, + { + "language": "en", + "text": "required voltage as electromotive force that must temporally or permanently apply at the power supply input of an electric device to maintain the function of the operating resource / on condition: type of current = direct current (d.c.)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF535#004" + } + ] + }, + "value": "24", + "valueType": "xs:string" + }, + { + "idShort": "Step_response_time_t90", + "description": [ + { + "language": "de", + "text": "zeitliche Dauer, bei einer stufenartigen Ver\u00e4nderung des Eingangssignals eines Systems, die die \u00c4nderung des Ausgangssignals des Systems ben\u00f6tigt, um zum ersten Mal 90% des letzten Werts des stabilen Zustands zu erreichen" + }, + { + "language": "en", + "text": "time duration from a step change in the input signal to a system for the change in output of the system to reach for the first time 90% of its final steady state value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM701#004" + } + ] + }, + "value": "7", + "valueType": "xs:string" + }, + { + "idShort": "Accuracy", + "description": [ + { + "language": "de", + "text": "Das Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" + }, + { + "language": "en", + "text": "extent of approximation of a result derived from measurements to the recognized reference value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA989#004" + } + ] + }, + "value": "0.3", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json b/server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json new file mode 100644 index 000000000..31cd6028f --- /dev/null +++ b/server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json @@ -0,0 +1,589 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/TechnicalData", + "submodelElements": [ + { + "idShort": "Input", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Function", + "description": [ + { + "language": "de", + "text": "Funktionsweise des Ger\u00e4ts." + }, + { + "language": "en", + "text": "Functioning of the device." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Function" + } + ] + }, + "value": "K-band FMCW radar", + "valueType": "xs:string" + }, + { + "idShort": "Min_tank_height", + "description": [ + { + "language": "de", + "text": "Minimale H\u00f6he in des Beh\u00e4lters, in dem der F\u00fcllstand gemmessen werden soll." + }, + { + "language": "en", + "text": "Minimum height of the tank in which the level is to be measured." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/MinTankHeight" + } + ] + }, + "value": "0.5", + "valueType": "xs:string" + }, + { + "idShort": "Max__measuring_range", + "description": [ + { + "language": "de", + "text": "Maximale H\u00f6he des Beh\u00e4lters, in dem der F\u00fcllstand gemmessen werden soll.." + }, + { + "language": "en", + "text": "Maximum height of the tank in which the level is to be measured." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/MaxMeasuringRange" + } + ] + }, + "value": "40", + "valueType": "xs:string" + }, + { + "idShort": "Blocking_Distance_dead_zone", + "description": [ + { + "language": "de", + "text": "Totzone im vermessenen Beh\u00e4lter, welche nicht vom Sensor erkannt werden kann." + }, + { + "language": "en", + "text": "Dead zone in the measured container, which cannot be detected by the sensor." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/BlockingDistance" + } + ] + }, + "value": "\"Antenna ex tension length + antenna length + 0.1 m / 4\"\"\"", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Output", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAG973#004" + } + ] + }, + "value": "4...20 mA HART\u00ae or 3.8...20.5 mA acc. to NAMUR NE 43", + "valueType": "xs:string" + }, + { + "idShort": "Accuracy", + "description": [ + { + "language": "de", + "text": "Relative Messgenauigkeit in % bei einer Temperatur von 20\u00b0C und einer Signalst\u00e4rke von 20mA." + }, + { + "language": "en", + "text": "Relative measurement accuracy in % at a temperature of 20\u00b0C and a signal strength of 20mA." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Accuracy" + } + ] + }, + "value": "0.05% (rel. 20 mA, 20\u00b0C / 68\u00b0F)", + "valueType": "xs:string" + }, + { + "idShort": "Resolution", + "description": [ + { + "language": "de", + "text": "Aufl\u00f6sung des Ausgangssignals." + }, + { + "language": "en", + "text": "Resolution of the output signal." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Resolution" + } + ] + }, + "value": "\u00b12", + "valueType": "xs:string" + }, + { + "idShort": "Temperature_drift", + "description": [ + { + "language": "de", + "text": "temperaturbezogene \u00c4nderung der Messgr\u00f6\u00dfe eines Messger\u00e4tes bezogen auf die Messspanne dieser Messgr\u00f6\u00dfe" + }, + { + "language": "en", + "text": "Temperature-related change of the measured quantity of a measuring instrument related to the measuring range of this measured magnitude" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC140#007" + } + ] + }, + "value": "0.005", + "valueType": "xs:string" + }, + { + "idShort": "Error_signal", + "description": [ + { + "language": "de", + "text": "Ausfallsignal hoch und niedrig." + }, + { + "language": "en", + "text": "Error Signal high and low." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/ErrorSignal" + } + ] + }, + "value": "High: 22 mA, Low : 3.6 mA acc. to NAMUR NE 43", + "valueType": "xs:string" + }, + { + "idShort": "Max__Load", + "description": [ + { + "language": "de", + "text": "Maximaler ohmscher Widerstand." + }, + { + "language": "en", + "text": "Maximum ohmic resistance." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/MaxLoad" + } + ] + }, + "value": "350", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Measuring_accuracy", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Resolution", + "description": [ + { + "language": "de", + "text": "Aufl\u00f6sung des Messwerts." + }, + { + "language": "en", + "text": "Resolution of the measured value." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/MeasurementResolution" + } + ] + }, + "value": "1", + "valueType": "xs:string" + }, + { + "idShort": "Accuracy", + "description": [ + { + "language": "de", + "text": "Messgenaugikeit in mm." + }, + { + "language": "en", + "text": "Measurement accuracy in mm." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/MeasurementAccuracy" + } + ] + }, + "value": "+/-3", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Application_conditions", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Ambient_temperature", + "description": [ + { + "language": "de", + "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr die Prozessanschlusstemperatur." + }, + { + "language": "en", + "text": "Permissible temperature range of the process connection temperature." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/FlangeTemperature" + } + ] + }, + "value": "-40...+80\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "min_Storage_temperature", + "description": [ + { + "language": "de", + "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN276#004" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_Storage_temperature", + "description": [ + { + "language": "de", + "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" + }, + { + "language": "en", + "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN272#004" + } + ] + }, + "value": "85", + "valueType": "xs:string" + }, + { + "idShort": "Flange_temperature", + "description": [ + { + "language": "de", + "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr die Prozessanschlusstemperatur." + }, + { + "language": "en", + "text": "Permissible temperature range of the process connection temperature." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/FlangeTemperature" + } + ] + }, + "value": "-40...+150\u00b0C", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Mechanical_data", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Housing", + "description": [ + { + "language": "de", + "text": "Materialzusammensetzung, aus der ein einzelnes Bauteil hergestellt ist, als Ergebnis eines Herstellungsprozesses, in dem der/die Rohstoff(e) durch Extrusion, Verformung, Schwei\u00dfen usw. in die endg\u00fcltige Form gebracht werden" + }, + { + "language": "en", + "text": "material composition that a single component comprises as the result of a manufacturing process whereby the raw material(s) are given their final shape by means of extrusion, molding, welding or other processes" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAB664#016" + } + ] + }, + "value": "Aluminium", + "valueType": "xs:string" + }, + { + "idShort": "Wetted_parts", + "description": [ + { + "language": "de", + "text": "Werkstoff der medienber\u00fchrenden Teile, einschlie\u00dflich der Antenne." + }, + { + "language": "en", + "text": "Material of the parts in contact with the medium, including the antenna." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/WettedParts" + } + ] + }, + "value": "Stainless steel (1.4404 / 316L), Hastelloy C-22 (2.4602)", + "valueType": "xs:string" + }, + { + "idShort": "Process_fitting", + "description": [ + { + "language": "de", + "text": "Werkstoff des Prozessanschlusse." + }, + { + "language": "en", + "text": "Material of the process fitting." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/ProcessFitting" + } + ] + }, + "value": "Stainless steel (1.4404 / 316L), Hastelloy C-22 (2.4602)", + "valueType": "xs:string" + }, + { + "idShort": "Gaskets", + "description": [ + { + "language": "de", + "text": "Flanschausf\u00fchrung nach EN 1092-1." + }, + { + "language": "en", + "text": "Flange design according to EN 1092-1." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Gaskets" + } + ] + }, + "value": "Viton (-40...+150\u00b0C / -40...+300\u00b0F), Kalrez 6375 (-20...+150\u00b0C / -5...+300\u00b0F)", + "valueType": "xs:string" + }, + { + "idShort": "Thread", + "description": [ + { + "language": "de", + "text": "Gewinde f\u00fcr den Prozessanschluss." + }, + { + "language": "en", + "text": "Thread for process connetcion." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Thread" + } + ] + }, + "value": "\"G 1 1/2\"\", NPT 1 1/2\"\"\"", + "valueType": "xs:string" + }, + { + "idShort": "Flange", + "description": [ + { + "language": "de", + "text": "Flanschausf\u00fchrung nach EN 1092-1." + }, + { + "language": "en", + "text": "Flange design according to EN 1092-1." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Flange" + } + ] + }, + "value": "\"DN 40...DN 150 (PN 40 / PN 16), 1 1/2\"\"...8\"\" (150 lb / 300 lb), 10 K (40...100A)\"", + "valueType": "xs:string" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json b/server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json new file mode 100644 index 000000000..d1e6f68e5 --- /dev/null +++ b/server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Pipe21_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json b/server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json new file mode 100644 index 000000000..4e1b8bf64 --- /dev/null +++ b/server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y14_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json b/server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json new file mode 100644 index 000000000..98376d76b --- /dev/null +++ b/server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L10_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json b/server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json new file mode 100644 index 000000000..479cff06a --- /dev/null +++ b/server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "IAT" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Unit" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TU10" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json b/server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json new file mode 100644 index 000000000..60884ca24 --- /dev/null +++ b/server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L10_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json b/server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json new file mode 100644 index 000000000..ff267e408 --- /dev/null +++ b/server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json @@ -0,0 +1,134 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/TechnicalData", + "submodelElements": [ + { + "idShort": "Mandrel_diameter", + "description": [ + { + "language": "de", + "text": "Distanz zwischen zwei Schnittpunkten einer Geraden durch den Mittelpunkt der Spindel mit deren Umfang" + }, + { + "language": "en", + "text": "distance between two intersections of a straight line through the centre of the mandrel with its diameter" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH895#003" + } + ] + }, + "value": "50", + "valueType": "xs:string" + }, + { + "idShort": "Min_permissible_pressure", + "description": [ + { + "language": "de", + "text": "der bei der Festlegung der Anforderungen an die Berstscheibe bei einer zugeh\u00f6rigen Temperatur berechnete minimale Berstdruck" + }, + { + "language": "en", + "text": "The minimum bursting pressure calculated when defining the requirements for the burst disc at a corresponding temperature:" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAI489#007" + } + ] + }, + "value": "4", + "valueType": "xs:string" + }, + { + "idShort": "Max_operating_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb (unter normalen Betriebsbedingungen) auftritt bzw. auftreten darf" + }, + { + "language": "en", + "text": "Max. pressure which occurs or may occur in an operating system (under normal operating conditions)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB836#007" + } + ] + }, + "value": "8", + "valueType": "xs:string" + }, + { + "idShort": "Min_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB906#006" + } + ] + }, + "value": "90", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json b/server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json new file mode 100644 index 000000000..454c39af4 --- /dev/null +++ b/server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json @@ -0,0 +1,259 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/TechnicalData", + "submodelElements": [ + { + "idShort": "Power_supply", + "description": [ + { + "language": "de", + "text": "Versorgung von Ger\u00e4ten oder Anlagen mit gesonderter, zus\u00e4tzlicher Stromzuf\u00fchrung" + }, + { + "language": "en", + "text": "supply of devices or systems with separate, additional power supply" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ002#001" + } + ] + }, + "value": "taken from 4-20mA", + "valueType": "xs:string" + }, + { + "idShort": "Supply_voltage_type", + "description": [ + { + "language": "de", + "text": "bestimmte Form der Spannung, die angibt, ob das Betriebsmittel mit Wechselspannung (AC), Gleichspannung (DC), Wechsel-/Gleichstrom (AC/DC) oder modulierter Gleichspannung (UC) versorgt werden kann" + }, + { + "language": "en", + "text": "Type of voltage required for supplying the device" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC078#007" + } + ] + }, + "value": "9Vdc at 20mA", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4-20mA", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_input_signal", + "description": [ + { + "language": "de", + "text": "Form und/oder Funktion des Signals am Eingang, das sowohl wertediskontinuierlich (bin\u00e4r) als auch wertekontinuierlich (analog oder auch die digitale Abbildung eines Analogsignals) in Bezug auf den G\u00fcltigkeitsbereich des Signal sein kann" + }, + { + "language": "en", + "text": "form and/or function of the signal at the input which can be discontinuous (binary) or continuous (analog or as digital mapping of an analog signal) in respect to the signal's range of validity" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA004#006" + } + ] + }, + "value": "4-20mA, 450 Ohms inout resistance", + "valueType": "xs:string" + }, + { + "idShort": "Minimum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW301#002" + } + ] + }, + "value": "-50", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW302#002" + } + ] + }, + "value": "85", + "valueType": "xs:string" + }, + { + "idShort": "max_humidity_during_operation_UL_1449", + "description": [ + { + "language": "de", + "text": "Maximale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" + }, + { + "language": "en", + "text": "maximum relative humidity the SPD is allowed to be subjected to during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD514#001" + } + ] + }, + "value": "10", + "valueType": "xs:string" + }, + { + "idShort": "min_humidity_during_operation_UL_1449", + "description": [ + { + "language": "de", + "text": "Minimale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" + }, + { + "language": "en", + "text": "minimum relative humidity the SPD is allowed to be subjected to during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD516#001" + } + ] + }, + "value": "90", + "valueType": "xs:string" + }, + { + "idShort": "Supply_pressure", + "description": [ + { + "language": "de", + "text": "Druck der pneumatischen Versorgung, der am Versorgungseingang eines Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" + }, + { + "language": "en", + "text": "Pressure of the pneumatic supply that must be applied to the supply input of an electrical operating medium for a certain period of time or all the time to maintain the function of the operating medium" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAI992#007" + } + ] + }, + "value": "20 to 100 psi max", + "valueType": "xs:string" + }, + { + "idShort": "protection_class_acc_IP", + "description": [ + { + "language": "de", + "text": "gibt die Schutzklass nach IP eines Lasernivellierger\u00e4tes an" + }, + { + "language": "en", + "text": "indicates the protection class acc. IP of a laser level gage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAJ501#002" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json b/server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json new file mode 100644 index 000000000..a95d22621 --- /dev/null +++ b/server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_MagneticPositioner_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json b/server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json new file mode 100644 index 000000000..1769212e1 --- /dev/null +++ b/server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json b/server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json new file mode 100644 index 000000000..b1bcba141 --- /dev/null +++ b/server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Siemens" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Sitrans P DS III/P410" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Siemensallee 75" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "76181" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Karlsruhe" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Sitrans P" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json b/server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json new file mode 100644 index 000000000..b3ed167f5 --- /dev/null +++ b/server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "ABB Automation Products GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Temperatursensor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Borsigstr. 2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63755" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Alzenau" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TSP 121" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json b/server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json new file mode 100644 index 000000000..2bb95b7ae --- /dev/null +++ b/server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json @@ -0,0 +1,84 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/TechnicalData", + "submodelElements": [ + { + "idShort": "Height", + "description": [ + { + "language": "de", + "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu L\u00e4nge/Breite/Tiefe stehende Ausdehnung - bei Gegenst\u00e4nden mit fester Orientierung oder in bevorzugter Gebrauchslage der parallel zur Schwerkraft gemessenen Abstand zwischen Ober- und Unterkante" + }, + { + "language": "en", + "text": "for objects with orientation in preferred position during use the dimension perpendicular to diameter/length/width/depth" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA020#009" + } + ] + }, + "value": "1", + "valueType": "xs:string" + }, + { + "idShort": "Width", + "description": [ + { + "language": "de", + "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu H\u00f6he/L\u00e4nge/Tiefe stehende Ausdehnung rechtwinklig zur l\u00e4ngsten Symmetrieachse" + }, + { + "language": "en", + "text": "for objects with orientation in preferred position during use the dimension perpendicular to height/ length/depth" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAF016#006" + } + ] + }, + "value": "1", + "valueType": "xs:string" + }, + { + "idShort": "Volume", + "description": [ + { + "language": "de", + "text": "Inneres Volumen eines Raums, einschlie\u00dflich des Volumens von den Stutzen bis zur ersten Verbindung, aber abz\u00fcglich des Volumens fest eingebauter innen liegender Teile" + }, + { + "language": "en", + "text": "Internal volume of a chamber, including the volume of nozzles to the first connection, and excluding the volume of permanent internal parts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA138#006" + } + ] + }, + "value": "1", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json b/server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json new file mode 100644 index 000000000..b7f79dea2 --- /dev/null +++ b/server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y21_Regler_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json b/server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json new file mode 100644 index 000000000..4995bfe0c --- /dev/null +++ b/server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Beh\u00e4lter" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "zyl. Beh\u00e4lter" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json b/server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json new file mode 100644 index 000000000..aa02d87fa --- /dev/null +++ b/server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F22_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json b/server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json new file mode 100644 index 000000000..def2d7798 --- /dev/null +++ b/server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json b/server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json new file mode 100644 index 000000000..59b88b216 --- /dev/null +++ b/server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GRUNDFOS" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "UPS 25-60 B 180" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Park u. 8" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "H-2045" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Toeroekbalint" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "HU" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Grundfos Pumpe 96281498" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json b/server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json new file mode 100644 index 000000000..73b47438a --- /dev/null +++ b/server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F13_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json b/server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json new file mode 100644 index 000000000..dba1d9c8e --- /dev/null +++ b/server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json @@ -0,0 +1,37 @@ +{ + "data": { + "idShort": "MnestixConfiguration", + "modelType": "AssetAdministrationShell", + "id": "https://mnestix.com/aas/E0468D0C97304243B8F0387A1333B4A8", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://mnestix.com/E0468D0C97304243B8F0387A1333B4A8", + "specificAssetIds": [ + { + "name": "assetIdShort", + "value": "aas_E0468D0C97304243B8F0387A1333B4A8" + } + ] + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://repodomainurl.com/sm/VGhlbWVTZXR0aW5ncw/1/0" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://repodomainurl.com/sm/B461C6ED32214933B8B6CE569C8F0A03/1/0" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json b/server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json new file mode 100644 index 000000000..ac4186767 --- /dev/null +++ b/server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N38_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json b/server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json new file mode 100644 index 000000000..57e8e6613 --- /dev/null +++ b/server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F31_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json b/server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json new file mode 100644 index 000000000..81e53216a --- /dev/null +++ b/server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Y21", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "Y21_Regler", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler" + }, + { + "idShort": "HasComponent_Y21_Regler", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y21" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y21" + }, + { + "type": "Entity", + "value": "Y21_Regler" + } + ] + } + }, + { + "idShort": "Y21_Stellventil", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil" + }, + { + "idShort": "HasComponent_Y21_Stellventil", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y21" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y21" + }, + { + "type": "Entity", + "value": "Y21_Stellventil" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json b/server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json new file mode 100644 index 000000000..36c0915b1 --- /dev/null +++ b/server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json b/server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json new file mode 100644 index 000000000..e04dc7ee9 --- /dev/null +++ b/server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json b/server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json new file mode 100644 index 000000000..349019c14 --- /dev/null +++ b/server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y20_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json b/server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json new file mode 100644 index 000000000..35018a3a3 --- /dev/null +++ b/server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "N13", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "N13_Motor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor" + }, + { + "idShort": "HasComponent_N13_Motor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N13" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N13" + }, + { + "type": "Entity", + "value": "N13_Motor" + } + ] + } + }, + { + "idShort": "N13_Pumpe", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe" + }, + { + "idShort": "HasComponent_N13_Pumpe", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N13" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N13" + }, + { + "type": "Entity", + "value": "N13_Pumpe" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json b/server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json new file mode 100644 index 000000000..98c1d77a6 --- /dev/null +++ b/server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Masoneilan" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "28-28110" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Baker-Hughe-Strasse 1" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "29221" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Celle" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "28000 Series VariPak" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json b/server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json new file mode 100644 index 000000000..f9874866e --- /dev/null +++ b/server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "KSB AG" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Motor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Johann-Klein-Str. 9" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "67227" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Frankenthal" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "3\u00a0~ Mot 1LA7080-4AA11-ZX77A" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json b/server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json new file mode 100644 index 000000000..f6799f62b --- /dev/null +++ b/server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_Stellventil_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json b/server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json new file mode 100644 index 000000000..aa8a4be94 --- /dev/null +++ b/server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L10_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json b/server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json new file mode 100644 index 000000000..729fe41d3 --- /dev/null +++ b/server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Q11", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "Q11_Conductivity_Sensor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor" + }, + { + "idShort": "HasComponent_Q11_Conductivity_Sensor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Q11" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Q11" + }, + { + "type": "Entity", + "value": "Q11_Conductivity_Sensor" + } + ] + } + }, + { + "idShort": "Q11_Messumformer", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer" + }, + { + "idShort": "HasComponent_Q11_Messumformer", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Q11" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Q11" + }, + { + "type": "Entity", + "value": "Q11_Messumformer" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json b/server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json new file mode 100644 index 000000000..5a5bc1fb3 --- /dev/null +++ b/server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Argus/Flowserve Flow Control GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Flanged Ball Valve" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Rudolf-Plank-Str.2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "76275" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Ettlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FK 79" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json b/server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json new file mode 100644 index 000000000..dd9689246 --- /dev/null +++ b/server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json @@ -0,0 +1,209 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/TechnicalData", + "submodelElements": [ + { + "idShort": "Kommunikationsprotokoll", + "description": [ + { + "language": "de", + "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" + }, + { + "language": "en", + "text": "rules and agreements by that communication partner can interact with each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW333#001" + } + ] + }, + "value": "4 - 20 mA DC/ HART", + "valueType": "xs:string" + }, + { + "idShort": "min_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-55\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "600\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "min_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-40\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "85\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "Spannungsversorgung", + "description": [ + { + "language": "de", + "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" + }, + { + "language": "en", + "text": "describes the source of electrical energy that supplies the object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK788#003" + } + ] + }, + "value": "11...42", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "14571", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP66", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json b/server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json new file mode 100644 index 000000000..636357e47 --- /dev/null +++ b/server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Q11_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json b/server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json new file mode 100644 index 000000000..13e2b891c --- /dev/null +++ b/server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "DynamicData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/DynamicData", + "submodelElements": [ + { + "idShort": "Level", + "description": [ + { + "language": "de", + "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." + }, + { + "language": "en", + "text": "Height of the liquid inside of the vessel in centimeter." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Level" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json b/server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json new file mode 100644 index 000000000..733fa894a --- /dev/null +++ b/server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T27_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json b/server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json new file mode 100644 index 000000000..2cfdcc817 --- /dev/null +++ b/server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "W15_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json b/server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json new file mode 100644 index 000000000..5b3b0dabd --- /dev/null +++ b/server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N29_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json b/server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json new file mode 100644 index 000000000..78f516120 --- /dev/null +++ b/server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N13_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json b/server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json new file mode 100644 index 000000000..aac8489de --- /dev/null +++ b/server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T15_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json b/server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json new file mode 100644 index 000000000..21ff8c50c --- /dev/null +++ b/server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L12_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json b/server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json new file mode 100644 index 000000000..1a4881ee4 --- /dev/null +++ b/server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "ABB" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Typ 18345-2021465101" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Schillerstr.72" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "32425" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Minden" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TZIDC" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json b/server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json new file mode 100644 index 000000000..74df5dd24 --- /dev/null +++ b/server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json @@ -0,0 +1,26 @@ +{ + "data": { + "idShort": "MnestixCustomSubmodels", + "modelType": "AssetAdministrationShell", + "id": "https://mnestix.com/aas/B9961AFAC3324809AFC5E48D26D55992_3", + "derivedFrom": { + "type": "ModelReference", + "keys": [ + { + "type": "AssetAdministrationShell", + "value": "https://mnestix.com/aas/MnestixDefaultSubmodelTemplate" + } + ] + }, + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "exampleAsset", + "specificAssetIds": [ + { + "name": "assetIdShort", + "value": "exampleAssetIdShort" + } + ] + } + } +} \ No newline at end of file diff --git a/server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json b/server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json new file mode 100644 index 000000000..10bbe3a83 --- /dev/null +++ b/server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json @@ -0,0 +1,280 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "B2", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "L26", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26" + }, + { + "idShort": "HasControlModule_L26", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B2" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B2" + }, + { + "type": "Entity", + "value": "L26" + } + ] + } + }, + { + "idShort": "T27", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27" + }, + { + "idShort": "HasControlModule_T27", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B2" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B2" + }, + { + "type": "Entity", + "value": "T27" + } + ] + } + }, + { + "idShort": "Q28", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28" + }, + { + "idShort": "HasControlModule_Q28", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B2" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B2" + }, + { + "type": "Entity", + "value": "Q28" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json b/server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json new file mode 100644 index 000000000..a9521bc09 --- /dev/null +++ b/server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json @@ -0,0 +1,352 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "B3", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "T33", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33" + }, + { + "idShort": "HasControlModule_T33", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + }, + { + "type": "Entity", + "value": "T33" + } + ] + } + }, + { + "idShort": "L32", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32" + }, + { + "idShort": "HasControlModule_L32", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + }, + { + "type": "Entity", + "value": "L32" + } + ] + } + }, + { + "idShort": "L34", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34" + }, + { + "idShort": "HasControlModule_L34", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + }, + { + "type": "Entity", + "value": "L34" + } + ] + } + }, + { + "idShort": "L35", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35" + }, + { + "idShort": "HasControlModule_L35", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B3" + }, + { + "type": "Entity", + "value": "L35" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json b/server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json new file mode 100644 index 000000000..8807133b2 --- /dev/null +++ b/server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "HC40_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json b/server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json new file mode 100644 index 000000000..84da6de99 --- /dev/null +++ b/server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Emerson Electric Co." + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Digitaler Stellungsregler" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8000 West Florissant Avenue, P.O. Box 4100" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63136" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Saint Louis Missouri" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "US" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FISHER FIELDVUE DVC200" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json b/server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json new file mode 100644 index 000000000..e6b340d24 --- /dev/null +++ b/server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "TU20_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json b/server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json new file mode 100644 index 000000000..f968da44b --- /dev/null +++ b/server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json @@ -0,0 +1,84 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/TechnicalData", + "submodelElements": [ + { + "idShort": "Height", + "description": [ + { + "language": "de", + "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu L\u00e4nge/Breite/Tiefe stehende Ausdehnung - bei Gegenst\u00e4nden mit fester Orientierung oder in bevorzugter Gebrauchslage der parallel zur Schwerkraft gemessenen Abstand zwischen Ober- und Unterkante" + }, + { + "language": "en", + "text": "for objects with orientation in preferred position during use the dimension perpendicular to diameter/length/width/depth" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA020#009" + } + ] + }, + "value": "1", + "valueType": "xs:string" + }, + { + "idShort": "Width", + "description": [ + { + "language": "de", + "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu H\u00f6he/L\u00e4nge/Tiefe stehende Ausdehnung rechtwinklig zur l\u00e4ngsten Symmetrieachse" + }, + { + "language": "en", + "text": "for objects with orientation in preferred position during use the dimension perpendicular to height/ length/depth" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAF016#006" + } + ] + }, + "value": "1", + "valueType": "xs:string" + }, + { + "idShort": "Volume", + "description": [ + { + "language": "de", + "text": "Inneres Volumen eines Raums, einschlie\u00dflich des Volumens von den Stutzen bis zur ersten Verbindung, aber abz\u00fcglich des Volumens fest eingebauter innen liegender Teile" + }, + { + "language": "en", + "text": "Internal volume of a chamber, including the volume of nozzles to the first connection, and excluding the volume of permanent internal parts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA138#006" + } + ] + }, + "value": "1", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json b/server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json new file mode 100644 index 000000000..dd705ba6f --- /dev/null +++ b/server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json @@ -0,0 +1,134 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/TechnicalData", + "submodelElements": [ + { + "idShort": "Nennweite", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "DN25", + "valueType": "xs:string" + }, + { + "idShort": "Nenndruck", + "description": [ + { + "language": "de", + "text": "Beschreibung der Flanschbennung der Druckstufe" + }, + { + "language": "en", + "text": "description of the pressure stage of the label of the flange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK644#005" + } + ] + }, + "value": "PN40", + "valueType": "xs:string" + }, + { + "idShort": "Prozessanschluss", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" + }, + { + "language": "en", + "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB411#007" + } + ] + }, + "value": "geflanscht", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "371", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "14.409", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json b/server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json new file mode 100644 index 000000000..0940a16aa --- /dev/null +++ b/server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "Dynamic_Data", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/DynamicData", + "submodelElements": [ + { + "idShort": "Level", + "description": [ + { + "language": "de", + "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." + }, + { + "language": "en", + "text": "Height of the liquid inside of the vessel in centimeter." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Level" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json b/server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json new file mode 100644 index 000000000..ae08c6195 --- /dev/null +++ b/server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Leitf\u00e4higkeitsmesswertaufnehmer" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Dieselstra\u00dfe 24" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "70839" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Gerlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "CLS21 Condumax" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json b/server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json new file mode 100644 index 000000000..b02b0194d --- /dev/null +++ b/server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Argus/Flowserve Flow Control GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Flanged Ball Valve" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Rudolf-Plank-Str.2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "76275" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Ettlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FK 79" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json b/server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json new file mode 100644 index 000000000..9fb2b6e25 --- /dev/null +++ b/server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json @@ -0,0 +1,459 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/TechnicalData", + "submodelElements": [ + { + "idShort": "Measuring_range", + "description": [ + { + "language": "de", + "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" + }, + { + "language": "en", + "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH095#003" + } + ] + }, + "value": "0...60", + "valueType": "xs:string" + }, + { + "idShort": "Display_range", + "description": [ + { + "language": "de", + "text": "Ausgabebereich bei anzeigenden Messger\u00e4ten" + }, + { + "language": "en", + "text": "output range of a measuring device which displays" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ355#003" + } + ] + }, + "value": "0...20", + "valueType": "xs:string" + }, + { + "idShort": "Lower_range_limit_of_temperature", + "description": [ + { + "language": "de", + "text": "niedrigster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" + }, + { + "language": "en", + "text": "lowest value of temperature that the device can be adjusted to measure within the specified accuracy limits" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY818#001" + } + ] + }, + "value": "-35", + "valueType": "xs:string" + }, + { + "idShort": "Upper_range_limit_of_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" + }, + { + "language": "en", + "text": "highest value of the temperature that a device can be adjusted to measure within its specified accuracy limits" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY819#001" + } + ] + }, + "value": "250", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4...20mA/HART/Profibus", + "valueType": "xs:string" + }, + { + "idShort": "Max_input_voltage_with_DC", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6glicher Wert der Gleichspannung, die am Eingang eines Betriebsmittels angelegt werden kann" + }, + { + "language": "en", + "text": "maximum value of direct-voltage that can be applied to the input of an operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB848#008" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "Max_input_current_with_DC", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Gleichstrom, der bei angesteuertem Eingang eingespeist/aufgenommen wird" + }, + { + "language": "en", + "text": "Maximum value of an DC current that is fed in/taken up with a controlled input" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB852#007" + } + ] + }, + "value": "21", + "valueType": "xs:string" + }, + { + "idShort": "Max_DC__input_capacity", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6gliche Gleichstrom-Eingangsleistung f\u00fcr die der Wechselrichter eine netzsynchrone Wechselspannung erzeugen kann" + }, + { + "language": "en", + "text": "maximum DC-input power for the inverters produce a synchronous AC network" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI736#002" + } + ] + }, + "value": "3", + "valueType": "xs:string" + }, + { + "idShort": "Max_load", + "description": [ + { + "language": "de", + "text": "maximale B\u00fcrde, die an den Anschl\u00fcssen des Ger\u00e4ts angelegt werden kann oder vom Ger\u00e4t an ein externes angeschlossenes Ger\u00e4t weitergegeben wird" + }, + { + "language": "en", + "text": "maximum load that can be applied to the terminals of the device or will be given by the device to an external devices connected to it" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA042#009" + } + ] + }, + "value": "600", + "valueType": "xs:string" + }, + { + "idShort": "Minimum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW301#002" + } + ] + }, + "value": "55", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" + }, + { + "language": "en", + "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW302#002" + } + ] + }, + "value": "-10", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN313#004" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Lower_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN314#004" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Min_air_humidity", + "description": [ + { + "language": "de", + "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW976#002" + } + ] + }, + "value": "10", + "valueType": "xs:string" + }, + { + "idShort": "Max_air_humidity", + "description": [ + { + "language": "de", + "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" + }, + { + "language": "en", + "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN164#003" + } + ] + }, + "value": "90", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_auxiliary_energy", + "description": [ + { + "language": "de", + "text": "n\u00e4here Angaben zur Energie, welche dem Betriebsmittel oder dem Betriebssystem zum Aufrechterhalten seiner Funktion zeitweise oder st\u00e4ndig zugef\u00fchrt werden muss" + }, + { + "language": "en", + "text": "further information on the energy which must be fed to the operating resource or operating system continually or occasionally so that performance of its function can be sustained" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAB236#008" + } + ] + }, + "value": "24V AC/DC", + "valueType": "xs:string" + }, + { + "idShort": "Number_of_connections_sensor_actor", + "description": [ + { + "language": "de", + "text": "Quantitative Angabe zur Menge Anschl\u00fcsse Sensor/Aktor" + }, + { + "language": "en", + "text": "Quantitative statement about the set of connections sensor / actor" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAP400#001" + } + ] + }, + "value": "1*Konduktiver Sensor", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json b/server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json new file mode 100644 index 000000000..9f14eac50 --- /dev/null +++ b/server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Argus/Flowserve Flow Control GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Flanged Ball Valve" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Rudolf-Plank-Str.2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "76275" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Ettlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FK 79" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json b/server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json new file mode 100644 index 000000000..c016c25ac --- /dev/null +++ b/server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N18_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json b/server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json new file mode 100644 index 000000000..50a0f2309 --- /dev/null +++ b/server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y18_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json b/server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json new file mode 100644 index 000000000..9c4b760ea --- /dev/null +++ b/server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Siemens AG " + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Temperatursensor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Werner-von-Siemens-Stra\u00dfe 1" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "80333" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "M\u00fcnchen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Einschaub-Widerstandsthermometer" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json b/server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json new file mode 100644 index 000000000..46f0e569b --- /dev/null +++ b/server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json @@ -0,0 +1,415 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/TechnicalData", + "submodelElements": [ + { + "idShort": "Max_medium_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB864#006" + } + ] + }, + "value": "110", + "valueType": "xs:string" + }, + { + "idShort": "Min_medium_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB988#006" + } + ] + }, + "value": "2", + "valueType": "xs:string" + }, + { + "idShort": "Temperature_class", + "description": [ + { + "language": "de", + "text": "Charakterisierungssystem eines elektrischen Ger\u00e4ts, basierend auf dessen maximaler Oberfl\u00e4chentemperatur, bez\u00fcglich der spezifischen explosionsf\u00e4higen Atmosph\u00e4re, f\u00fcr deren Nutzung das Ger\u00e4t vorgesehen ist" + }, + { + "language": "en", + "text": "classification system of electrical apparatus, based on its maximum surface temperature, related to the specific explosive atmosphere for which it is intended to be used" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO371#005" + } + ] + }, + "value": "110", + "valueType": "xs:string" + }, + { + "idShort": "Material_body", + "description": [ + { + "language": "de", + "text": "Werkstoff, aus dem das Ger\u00e4tegeh\u00e4use gefertigt ist" + }, + { + "language": "en", + "text": "substance of which the appliance exterior is made of" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO747#008" + } + ] + }, + "value": "Bronze", + "valueType": "xs:string" + }, + { + "idShort": "Construction_form_of_impeller", + "description": [ + { + "language": "de", + "text": "Gruppe von Bauelementen mit gleichen Konstruktionsmerkmalen und gleichem Aufbau, die aufgrund \u00e4hnlicher Herstellungstechniken f\u00fcr die Bauartzulassungspr\u00fcfung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden k\u00f6nnen. Sie werden im allgemeinen von einer Bauartspezifikation erfasst. Anmerkung: In bestimmten F\u00e4llen k\u00f6nnen Bauelemente aus verschiedenen Bauartspezifikationen als zum gleichen Typ geh\u00f6rig betrachtet und daher f\u00fcr die Bauartzulassung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden" + }, + { + "language": "en", + "text": "Group of components with the same construction features and the same structure, which - due to similar manufacturing techniques - can be collated for construction approval testing and class conformity controls. They are generally allocated to a construction type. Note: in certain cases, components can be viewed from various construction type specifications as belonging to the same type and, therefore, can be collated for construction approval and class conformity controls" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABF501#001" + } + ] + }, + "value": "Komposit PES/PP", + "valueType": "xs:string" + }, + { + "idShort": "Max_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB906#006" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Max_operation_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb auftritt bzw. auftreten darf, angegeben in der abgeleiteten SI-EInheit des Druckes" + }, + { + "language": "en", + "text": "greatest pressure that occurs in a system in operation or shall occur, indicated in the derived SI unit of pressure" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAJ845#005" + } + ] + }, + "value": "10", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_size", + "description": [ + { + "language": "de", + "text": "numerische Bezeichnung der Gr\u00f6\u00dfe bezogen auf den Str\u00f6mungsquerschnitt eines fluidtechnischen Ger\u00e4tes" + }, + { + "language": "en", + "text": "numeric identifier for the measured variable referred to the flow cross section of a fluidic device" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC418#001" + } + ] + }, + "value": "G1 1/2", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_pressure_of_the_operating_medium", + "description": [ + { + "language": "de", + "text": "PN (Nenndruck) ist eine alphanumerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung. Sie umfasst die Buchstaben PN gefolgt von einer dimensionslosen Zahl" + }, + { + "language": "en", + "text": "PN (nominal pressure) is an alphanumeric variable for reference purposes, relating to a combination of mechanical and measurement properties of a pipe component. It comprises the letters PN followed by a dimensionless number (according to EN 1333/96.08)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO778#001" + } + ] + }, + "value": "PN10", + "valueType": "xs:string" + }, + { + "idShort": "Insertion_length", + "description": [ + { + "language": "de", + "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" + }, + { + "language": "en", + "text": "overall length of that part of a device or component to be found within a containment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO023#004" + } + ] + }, + "value": "180", + "valueType": "xs:string" + }, + { + "idShort": "Power_frequency", + "description": [ + { + "language": "de", + "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" + }, + { + "language": "en", + "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC859#003" + } + ] + }, + "value": "50", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_voltage", + "description": [ + { + "language": "de", + "text": "Nennspannung ist der vom Hersteller oder Lieferanten spezifizierte Wert der elektrischen Spannung im Normalbetrieb" + }, + { + "language": "en", + "text": "nominal voltage is the specified value which shows the voltage in normal operation given by the manufacturer or supplier" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC856#007" + } + ] + }, + "value": "1*230V", + "valueType": "xs:string" + }, + { + "idShort": "Power_consumption", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Drehzahlstufe1", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH939#001" + } + ] + }, + "value": "50", + "valueType": "xs:string" + }, + { + "idShort": "Drehzahlstufe2", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH939#001" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Drehzahlstufe3", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH939#001" + } + ] + }, + "value": "70", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Net_weight", + "description": [ + { + "language": "de", + "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t. Da unter \u201eGewicht\u201c in diesem Fall die Masse verstanden wird, ist auch die Ma\u00dfeinheit (Kilo-) Gramm als SI-Einheit zu verwenden" + }, + { + "language": "en", + "text": "Dimensions of the weigh item without packaging and without transport device. As, in this case, 'weight' means dimensions, the measure unit (kilo) gram is to be used as the SI unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAD875#007" + } + ] + }, + "value": "02. Sep", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json b/server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json new file mode 100644 index 000000000..3a4411650 --- /dev/null +++ b/server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json @@ -0,0 +1,40 @@ +{ + "data": { + "idShort": "L34_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/DynamicData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json b/server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json new file mode 100644 index 000000000..637370652 --- /dev/null +++ b/server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json @@ -0,0 +1,280 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Y24", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "Y24_Ball_Vave", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve" + }, + { + "idShort": "HasComponent_Y24_Ball_Vave", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y24" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y24" + }, + { + "type": "Entity", + "value": "Y24_Ball_Vave" + } + ] + } + }, + { + "idShort": "Y24_Magnetic_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve" + }, + { + "idShort": "HasComponent_Y24_Magnetic_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y24" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y24" + }, + { + "type": "Entity", + "value": "Y24_Magnetic_Valve" + } + ] + } + }, + { + "idShort": "Y24_Pneumatischer_Antrieb", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb" + }, + { + "idShort": "HasComponent_Y24_Pneumatischer_Antrieb", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y24" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y24" + }, + { + "type": "Entity", + "value": "Y24_Pneumatischer_Antrieb" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json b/server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json new file mode 100644 index 000000000..111b00421 --- /dev/null +++ b/server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Emerson Electric Co." + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Digitaler Stellungsregler" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8000 West Florissant Avenue, P.O. Box 4100" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63136" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Saint Louis Missouri" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "US" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FISHER FIELDVUE DVC200" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2005", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json b/server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json new file mode 100644 index 000000000..a1c419f21 --- /dev/null +++ b/server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Yokogawa" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "EJX510A" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "2-9-32, Nakacho" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "180-8750" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Musashino, Tokyo" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "JP" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "EJX-A" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2006", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json b/server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json new file mode 100644 index 000000000..6f067eec3 --- /dev/null +++ b/server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y15_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json b/server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json new file mode 100644 index 000000000..3d7441c5b --- /dev/null +++ b/server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "Dynamic_Data", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/DynamicData", + "submodelElements": [ + { + "idShort": "Drive_Power", + "description": [ + { + "language": "de", + "text": "gemessene auf das Fluid beim Durchgang durch die Pumpe \u00fcbertragene mechanische Leistung" + }, + { + "language": "en", + "text": "measured useful mechanical power transferred to the fluid during its passage through the pump" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC172#001" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json b/server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json new file mode 100644 index 000000000..53890b592 --- /dev/null +++ b/server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T33_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json b/server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json new file mode 100644 index 000000000..fdddec4eb --- /dev/null +++ b/server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "DynamicData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/DynamicData", + "submodelElements": [ + { + "idShort": "Level", + "description": [ + { + "language": "de", + "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." + }, + { + "language": "en", + "text": "Height of the liquid inside of the vessel in centimeter." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Level" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json b/server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json new file mode 100644 index 000000000..d71b84171 --- /dev/null +++ b/server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Emerson Electric Co." + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Stellventil" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8000 West Florissant Avenue, P.O. Box 4100" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63136" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Saint Louis Missouri" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "US" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GX Stellventil" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json b/server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json new file mode 100644 index 000000000..ead7c781e --- /dev/null +++ b/server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json @@ -0,0 +1,209 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/TechnicalData", + "submodelElements": [ + { + "idShort": "Nominal_Pressure", + "description": [ + { + "language": "de", + "text": "alphanummerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung" + }, + { + "language": "en", + "text": "alphanumeric variable for reference purposes, relating to a combination of mechanical and dimensional properties of a component of a pipe" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ333#004" + } + ] + }, + "value": "40", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_Size", + "description": [ + { + "language": "de", + "text": "Untergruppe einer Bauart, deren Unterscheidungsmerkmale im Allgemeinen die Abmessungen sind" + }, + { + "language": "en", + "text": "subgroup of a construction type, whose differentiating features are generally the dimensions" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAP898#005" + } + ] + }, + "value": "25", + "valueType": "xs:string" + }, + { + "idShort": "Material", + "description": [ + { + "language": "de", + "text": "auf Normen basierender Nummerncode von Werkstoffen des Geh\u00e4uses" + }, + { + "language": "en", + "text": "standard-based coding of materials of housing" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAD738#006" + } + ] + }, + "value": "SS/SS-SS-RFE", + "valueType": "xs:string" + }, + { + "idShort": "Test_Pressure", + "description": [ + { + "language": "de", + "text": "Testdruck zum pr\u00fcfen des Ventils." + }, + { + "language": "en", + "text": "Test pressure to check the valve." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/TestPressure" + } + ] + }, + "value": "54.6", + "valueType": "xs:string" + }, + { + "idShort": "Permissible_Temprature", + "description": [ + { + "language": "de", + "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr den Betrieb." + }, + { + "language": "en", + "text": "Permissible temperature range for operation." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/PermissibleTemperature" + } + ] + }, + "value": "-50 to 220", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_Permissible_Operating_Pressure_at_Room_Temperature", + "description": [ + { + "language": "de", + "text": "Maximal zul\u00e4ssiger Betriebsdruck bei Raumtemperatur." + }, + { + "language": "en", + "text": "Maximum Permissible Operating Pressure at Room Temperature." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/MaxOperatingPressure" + } + ] + }, + "value": "36.4", + "valueType": "xs:string" + }, + { + "idShort": "Max_perm_temperature", + "description": [ + { + "language": "de", + "text": "Die Hitzbest\u00e4ndigkeit eines Produktes in Grad Celsius" + }, + { + "language": "en", + "text": "The heat resistance of a product in degrees centigrade." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAF417#005" + } + ] + }, + "value": "220", + "valueType": "xs:string" + }, + { + "idShort": "Connection", + "description": [ + { + "language": "de", + "text": "Prozessanschluss." + }, + { + "language": "en", + "text": "Process connection." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Connection" + } + ] + }, + "value": "Flange Connection", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json b/server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json new file mode 100644 index 000000000..cca7959f2 --- /dev/null +++ b/server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json @@ -0,0 +1,515 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/TechnicalData", + "submodelElements": [ + { + "idShort": "Nennweite", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "DN25", + "valueType": "xs:string" + }, + { + "idShort": "Nenndruck", + "description": [ + { + "language": "de", + "text": "Beschreibung der Flanschbennung der Druckstufe" + }, + { + "language": "en", + "text": "description of the pressure stage of the label of the flange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK644#005" + } + ] + }, + "value": "PN40", + "valueType": "xs:string" + }, + { + "idShort": "max_Druck", + "description": [ + { + "language": "de", + "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" + }, + { + "language": "en", + "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA447#006" + } + ] + }, + "value": "420", + "valueType": "xs:string" + }, + { + "idShort": "Ausgang", + "description": [ + { + "language": "de", + "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" + }, + { + "language": "en", + "text": "rules and agreements by that communication partner can interact with each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW333#001" + } + ] + }, + "value": "4 - 20 mA DC/ HART", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP67", + "valueType": "xs:string" + }, + { + "idShort": "Betriebsmedium", + "description": [ + { + "language": "de", + "text": "Medium, mit welchem das Ger\u00e4t betrieben werden darf (Medium am Eingang)" + }, + { + "language": "en", + "text": "temperature at which the specified accuracy data are valid. For deviations from the nominal temperature, the specified temperature coefficients must be must be added to the specified accuracies" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD905#001" + } + ] + }, + "value": "Wasser", + "valueType": "xs:string" + }, + { + "idShort": "Messwertabweichung", + "description": [ + { + "language": "de", + "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" + }, + { + "language": "en", + "text": "deviation of measured value from the true value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ356#003" + } + ] + }, + "value": "\u00b1 0,75 %", + "valueType": "xs:string" + }, + { + "idShort": "min_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-29", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "250", + "valueType": "xs:string" + }, + { + "idShort": "min_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-29", + "valueType": "xs:string" + }, + { + "idShort": "max_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "85", + "valueType": "xs:string" + }, + { + "idShort": "min_Luftfeuchte", + "description": [ + { + "language": "de", + "text": "Minimale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" + }, + { + "language": "en", + "text": "minimum relative humidity the SPD is allowed to be subjected to during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD516#001" + } + ] + }, + "value": "5", + "valueType": "xs:string" + }, + { + "idShort": "max_Luftfeuchte", + "description": [ + { + "language": "de", + "text": "Maximale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" + }, + { + "language": "en", + "text": "maximum relative humidity the SPD is allowed to be subjected to during operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD514#001" + } + ] + }, + "value": "100", + "valueType": "xs:string" + }, + { + "idShort": "Spannungsversorgung", + "description": [ + { + "language": "de", + "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" + }, + { + "language": "en", + "text": "describes the source of electrical energy that supplies the object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK788#003" + } + ] + }, + "value": "10.5...30", + "valueType": "xs:string" + }, + { + "idShort": "Beschichtung", + "description": [ + { + "language": "de", + "text": "bei einer Gef\u00e4\u00dfprothese die Wirksubstanz der Beschichtung zur Impr\u00e4gnierung, Keimreduzierung oder Reduktion der Oberfl\u00e4chenthrombogenizit\u00e4t" + }, + { + "language": "en", + "text": "active substance of vessel graft coating for water proofing or to reduce germs or surface thrombogenicity" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAA376#007" + } + ] + }, + "value": "Geh\u00e4use und Abdeckung: korrosionsfeste Beschichtung", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Koerper", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "SCS14A", + "valueType": "xs:string" + }, + { + "idShort": "Dichtung", + "description": [ + { + "language": "de", + "text": "Substanz, aus welcher die Dichtung hergestellt ist" + }, + { + "language": "en", + "text": "substance from which a leave is manufactured" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK468#006" + } + ] + }, + "value": "PTFE", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Farbe", + "description": [ + { + "language": "de", + "text": "mit dem Auge wahrnehmbare Erscheinungsweise von Oberfl\u00e4chen" + }, + { + "language": "en", + "text": "with the eye perceptible frequency of publication of environment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN521#007" + } + ] + }, + "value": "Mintrgr\u00fcn( Munsell 5.6BG 3.3/2.9)", + "valueType": "xs:string" + }, + { + "idShort": "Elektrischer_Anschluss", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" + }, + { + "language": "en", + "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB414#007" + } + ] + }, + "value": "ISO M20 x 1.5 Innengewinde", + "valueType": "xs:string" + }, + { + "idShort": "Prozessanschluss", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" + }, + { + "language": "en", + "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB411#007" + } + ] + }, + "value": "DIN PN 40 Zwischenflansch", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json b/server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json new file mode 100644 index 000000000..201f3872d --- /dev/null +++ b/server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y17_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json b/server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json new file mode 100644 index 000000000..d4030abcb --- /dev/null +++ b/server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y17_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json b/server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json new file mode 100644 index 000000000..b5abe9ec8 --- /dev/null +++ b/server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y18_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json b/server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json new file mode 100644 index 000000000..9bfb75386 --- /dev/null +++ b/server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json @@ -0,0 +1,280 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Pipe21", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "N29", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29" + }, + { + "idShort": "HasControlModule_N29", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe21" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe21" + }, + { + "type": "Entity", + "value": "N29" + } + ] + } + }, + { + "idShort": "Y30", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30" + }, + { + "idShort": "HasControlModule_Y30", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe21" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe21" + }, + { + "type": "Entity", + "value": "Y30" + } + ] + } + }, + { + "idShort": "F31", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31" + }, + { + "idShort": "HasControlModule_F31", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe21" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe21" + }, + { + "type": "Entity", + "value": "F31" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json b/server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json new file mode 100644 index 000000000..6f5bd0a14 --- /dev/null +++ b/server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Y39", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "Y39_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve" + }, + { + "idShort": "HasComponent_Y39_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y39" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y39" + }, + { + "type": "Entity", + "value": "Y39_Valve" + } + ] + } + }, + { + "idShort": "Y39_Pneumatischer_Antrieb", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb" + }, + { + "idShort": "HasComponent_Y39_Pneumatischer_Antrieb", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y39" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y39" + }, + { + "type": "Entity", + "value": "Y39_Pneumatischer_Antrieb" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json b/server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json new file mode 100644 index 000000000..9e84b6dcd --- /dev/null +++ b/server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "unkown" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pipe" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json b/server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json new file mode 100644 index 000000000..eed4a0bf3 --- /dev/null +++ b/server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "P14_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json b/server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json new file mode 100644 index 000000000..b96fc69ca --- /dev/null +++ b/server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json @@ -0,0 +1,259 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/TechnicalData", + "submodelElements": [ + { + "idShort": "Max_measurement_span", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6gliche algebraische Differenz zwischen dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsendwert und dem kleinstm\u00f6glichen einstellbaren Messbereichsanfangswert" + }, + { + "language": "en", + "text": "greatest possible algebraic difference between the greatest measurement range boundary value which can be set and the least possible value which can be set" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA033#008" + } + ] + }, + "value": "16", + "valueType": "xs:string" + }, + { + "idShort": "Min_measurement_span", + "description": [ + { + "language": "de", + "text": "kleinstm\u00f6gliche algebraische Differenz zwischen dem kleinstm\u00f6glichen einstellbaren Messbereichsendwert und dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsanfangswert" + }, + { + "language": "en", + "text": "lowest possible algebraic difference between the least measurement range boundary value which can be set and the greatest possible value which can be set" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA034#008" + } + ] + }, + "value": "0.16", + "valueType": "xs:string" + }, + { + "idShort": "Connection_type_of_process_connection", + "description": [ + { + "language": "de", + "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" + }, + { + "language": "en", + "text": "classification of a process connection according to its fabricated form" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO333#005" + } + ] + }, + "value": "G1/2 B nach EN837-1", + "valueType": "xs:string" + }, + { + "idShort": "Cable_inlet_present", + "description": [ + { + "language": "de", + "text": "Angabe, ob eine Kabeleinf\u00fchrung vorhanden ist" + }, + { + "language": "en", + "text": "whether a cable inlet is available" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAF727#008" + } + ] + }, + "value": "M20*1.5", + "valueType": "xs:string" + }, + { + "idShort": "max_operating_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen darf ohne Verlust seiner Funktionsf\u00e4higkeit" + }, + { + "language": "en", + "text": "maximum possible atmospheric pressure an operational funds is able to reach or to build up without damaging its operability" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAA900#007" + } + ] + }, + "value": "21", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4...20mA", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN313#004" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "Lower_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN314#004" + } + ] + }, + "value": "85", + "valueType": "xs:string" + }, + { + "idShort": "upper_limiting_value_of_process_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" + }, + { + "language": "en", + "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN307#004" + } + ] + }, + "value": "85", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json b/server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json new file mode 100644 index 000000000..73282b424 --- /dev/null +++ b/server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json @@ -0,0 +1,283 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/TechnicalData", + "submodelElements": [ + { + "idShort": "Commnunication", + "description": [ + { + "language": "de", + "text": "Bezugnahme auf eine oder mehrere Normen und Richtlinien anstelle der Wiedergabe detaillierter Festlegungen. ANMERKUNG Eine Anwendungsnorm ist die Vorgabe eines Handlungsmusters, das bei Anwendung befolgt, oder einer Qualit\u00e4t, die bei Anwendung eingehalten werden muss. Sie dient dazu, unabh\u00e4ngig voneinander entstehende Artefakte mit einheitlichen Eigenschaften oder Qualit\u00e4ten herzustellen. Nationale und internationale Normen werden in sog. Normungsgremien verabschiedet" + }, + { + "language": "en", + "text": "Reference to one or more norms and guidelines instead of repeating detailed specs. COMMENT: An application norm is a specification of a pattern of use which must be followed during use, or of a quality which must be maintained during use. It serves to cause artifacts which arise independently of one another to be manufactured with uniform properties or qualities. National and international standards are established by so-called standards committees" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAP798#001" + } + ] + }, + "value": "RS 352", + "valueType": "xs:string" + }, + { + "idShort": "Analogeingaenge", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Anzahl_parametrierbarer_Analogeingaenge", + "description": [ + { + "language": "de", + "text": "quantitative Angabe zur Menge analoger Schnittstellen am Ger\u00e4t zur Datenaufnahme anderer Ger\u00e4te" + }, + { + "language": "en", + "text": "quantitative specification of the amount of analogue interfaces at the device for data acquisition from other devices" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF912#001" + } + ] + }, + "value": "2", + "valueType": "xs:string" + }, + { + "idShort": "Spannungseingang", + "description": [ + { + "language": "de", + "text": "G\u00fcltiger Wertebereich f\u00fcr die Spannung an einem Analogeingang in Volt." + }, + { + "language": "en", + "text": "Valid value range for the voltage at an analog input in volts." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Spannungseingang" + } + ] + }, + "value": "0/2 - 10 V DC Ri = 22 k?", + "valueType": "xs:string" + }, + { + "idShort": "Stromeingang", + "description": [ + { + "language": "de", + "text": "G\u00fcltiger Wertebereich f\u00fcr den eingehenden Strom ein einem Analogeingang." + }, + { + "language": "en", + "text": "Valid range of values for the incoming current on an analog input." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Stromeingang" + } + ] + }, + "value": "0/4 - 20 mA DC Ri = 500 ?", + "valueType": "xs:string" + }, + { + "idShort": "Aufloesung", + "description": [ + { + "language": "de", + "text": "Anzahl der Bits, mit welcher ein Analogwert am Analogeingang digitalisiert werden kann - die Aufl\u00f6sung des A/D-Wandlers bzw. D/A-Wandlers bestimmt zusammen mit dem gew\u00e4hlten Eingangsbereich die kleinste Spannungsdifferenz (Schrittweite), die aufgel\u00f6st werden k\u00f6nnen" + }, + { + "language": "en", + "text": "Number of bits with which an analog value that can be digitalized at the analog output - the resolution of the A/D or D/A converter, together with the selected input range, determines the smallest voltage difference (increment) that can be resolved" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC831#007" + } + ] + }, + "value": "10", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Analogausgaenge", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Anzahl_parametrierbarer_Analogausgaenge", + "description": [ + { + "language": "de", + "text": "quantitative Angabe \u00fcber die Schnittstellen f\u00fcr analoge Daten\u00fcbermittlung an andere Ger\u00e4te" + }, + { + "language": "en", + "text": "quantitative specification of the interfaces for analogue data transfer to other devices" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAG545#001" + } + ] + }, + "value": "1 (Umschaltung zwischen 4 Ausgabewerten)", + "valueType": "xs:string" + }, + { + "idShort": "Spannungsausgang", + "description": [ + { + "language": "de", + "text": "G\u00fcltiger Wertebereich f\u00fcr die Spannung an einem Analogausgang in Volt." + }, + { + "language": "en", + "text": "Valid value range for the voltage at an analog output in volts." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Spannungsausgangang" + } + ] + }, + "value": "0 - 10 V / maximal 5 mA DC", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Digitaleingaenge", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Anzahl_Digitaleingaenge_insgesamt", + "description": [ + { + "language": "de", + "text": "quantitative Angabe zur Menge digitaler Schnittstellen am Ger\u00e4t zur Datenaufnahme anderer Ger\u00e4te" + }, + { + "language": "en", + "text": "quantitative specification of the amount of digital interfaces at the device for data acquisition from other devices" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF914#001" + } + ] + }, + "value": "6", + "valueType": "xs:string" + }, + { + "idShort": "parametrierbar", + "description": [ + { + "language": "de", + "text": "Anzahl der parametrierbaren Digitalausg\u00e4nge." + }, + { + "language": "en", + "text": "Number of configurable digital outputs." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/parametrierbar" + } + ] + }, + "value": "4", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Relaisausgaenge", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Anzahl_parametrierbarer_Relaisausgaenge", + "description": [ + { + "language": "de", + "text": "quantitative Angabe zur Menge digitaler Schnittstellen am Ger\u00e4t zur Daten\u00fcbermittlung an andere Ger\u00e4te" + }, + { + "language": "en", + "text": "quantitative specification of the amount of digital interfaces at the device for data transfer to other devices" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF913#001" + } + ] + }, + "value": "2 x Schlie\u00dfer", + "valueType": "xs:string" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json b/server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json new file mode 100644 index 000000000..2e876cfed --- /dev/null +++ b/server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Q11_Messumformer_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json b/server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json new file mode 100644 index 000000000..ba2f0efbc --- /dev/null +++ b/server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F13_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json b/server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json new file mode 100644 index 000000000..553ec264c --- /dev/null +++ b/server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "T12_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json b/server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json new file mode 100644 index 000000000..f70bfe15b --- /dev/null +++ b/server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "VEGA" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Druckmessumformer" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Am Hohenstein 113" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "77761" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Schiltach" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "VEGABAR 66 BR66 XXCNGX1AHTMAX" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json b/server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json new file mode 100644 index 000000000..759b78c42 --- /dev/null +++ b/server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "ABB Automation Products GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Drall-Durchflussmesser" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Dransfelder Str. 2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "37079" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "G\u00e4ttingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TRIO-WIRL ST 4 0" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json b/server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json new file mode 100644 index 000000000..4ebe0418b --- /dev/null +++ b/server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json @@ -0,0 +1,49 @@ +{ + "data": { + "idShort": "B3_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/DynamicData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json b/server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json new file mode 100644 index 000000000..1bb6350ca --- /dev/null +++ b/server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Masoneilan" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "28-28110" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Baker-Hughe-Strasse 1" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "29221" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Celle" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "28000 Series VariPak" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json b/server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json new file mode 100644 index 000000000..914c37136 --- /dev/null +++ b/server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Messumformer" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Dieselstra\u00dfe 24" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "70839" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Gerlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Mycom S CLM153" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json b/server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json new file mode 100644 index 000000000..473f19604 --- /dev/null +++ b/server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json @@ -0,0 +1,84 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/TechnicalData", + "submodelElements": [ + { + "idShort": "Height", + "description": [ + { + "language": "de", + "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu L\u00e4nge/Breite/Tiefe stehende Ausdehnung - bei Gegenst\u00e4nden mit fester Orientierung oder in bevorzugter Gebrauchslage der parallel zur Schwerkraft gemessenen Abstand zwischen Ober- und Unterkante" + }, + { + "language": "en", + "text": "for objects with orientation in preferred position during use the dimension perpendicular to diameter/length/width/depth" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA020#009" + } + ] + }, + "value": "1", + "valueType": "xs:string" + }, + { + "idShort": "Width", + "description": [ + { + "language": "de", + "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu H\u00f6he/L\u00e4nge/Tiefe stehende Ausdehnung rechtwinklig zur l\u00e4ngsten Symmetrieachse" + }, + { + "language": "en", + "text": "for objects with orientation in preferred position during use the dimension perpendicular to height/ length/depth" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAF016#006" + } + ] + }, + "value": "1", + "valueType": "xs:string" + }, + { + "idShort": "Volume", + "description": [ + { + "language": "de", + "text": "Inneres Volumen eines Raums, einschlie\u00dflich des Volumens von den Stutzen bis zur ersten Verbindung, aber abz\u00fcglich des Volumens fest eingebauter innen liegender Teile" + }, + { + "language": "en", + "text": "Internal volume of a chamber, including the volume of nozzles to the first connection, and excluding the volume of permanent internal parts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA138#006" + } + ] + }, + "value": "1", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json b/server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json new file mode 100644 index 000000000..b6c392aa6 --- /dev/null +++ b/server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Yokogawa Deutschland GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Vortex Flowmeter" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Broichhofstr. 7-11" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "40880" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Ratingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "digitalYEWFLO DY025-61" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json b/server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json new file mode 100644 index 000000000..6735900e2 --- /dev/null +++ b/server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "KSB AG" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Motor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Johann-Klein-Str. 9" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "67227" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Frankenthal" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "3\u00a0~ Mot 1LA7080-4AA11-ZX77A" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json b/server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json new file mode 100644 index 000000000..0c38bbcc9 --- /dev/null +++ b/server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GRUNDFOS" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "CRNE 3-5 A-FGJ-G-V-HQQV" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Martin Bachs Vej 3" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8850" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Bjerringbro" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DK" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Grundfos Pumpe 96499985" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json b/server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json new file mode 100644 index 000000000..7bd451c2f --- /dev/null +++ b/server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json @@ -0,0 +1,259 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/TechnicalData", + "submodelElements": [ + { + "idShort": "Kommunikationsprotokoll", + "description": [ + { + "language": "de", + "text": "Angabe, ob die Hard- bzw. Software \u00fcber eine Schnittstelle verf\u00fcgt, die f\u00fcr die Daten\u00fcbertragung ein Kommunikationsprotokoll f\u00fcr sonstige Bussysteme verwendet" + }, + { + "language": "en", + "text": "whether, from the PLC programming software, a protocol is supported" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAD280#009" + } + ] + }, + "value": "4 - 20 mA DC/ HART", + "valueType": "xs:string" + }, + { + "idShort": "Ausgang", + "description": [ + { + "language": "de", + "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" + }, + { + "language": "en", + "text": "rules and agreements by that communication partner can interact with each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW333#001" + } + ] + }, + "value": "Luftruck", + "valueType": "xs:string" + }, + { + "idShort": "max_Druck", + "description": [ + { + "language": "de", + "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" + }, + { + "language": "en", + "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA447#006" + } + ] + }, + "value": "7", + "valueType": "xs:string" + }, + { + "idShort": "min_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP66", + "valueType": "xs:string" + }, + { + "idShort": "max_Spannung", + "description": [ + { + "language": "de", + "text": "h\u00f6chster Wert der Spannung, die am Versorgungseingang eines elektrischen Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" + }, + { + "language": "en", + "text": "maximum value of the required voltage which must be temporarily or permanently applied to the supply connection of an operating unit to maintain its function" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAE321#006" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "max_Strom", + "description": [ + { + "language": "de", + "text": "maximal aufnehmbarer Strom" + }, + { + "language": "en", + "text": "maximum of energy which can be drawn" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF954#003" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "elektrischer_Anschluss", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" + }, + { + "language": "en", + "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB414#007" + } + ] + }, + "value": "ISO M20 x 1.5 Innengewinde", + "valueType": "xs:string" + }, + { + "idShort": "pneumatischer_Anschluss", + "description": [ + { + "language": "de", + "text": "Art und Gr\u00f6\u00dfe des Druckmedienanschlusses eines pneumatischen Bauteils" + }, + { + "language": "en", + "text": "type and size of the pressure media connection on a pneumatic component" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ960#002" + } + ] + }, + "value": "G1/4", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json b/server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json new file mode 100644 index 000000000..9c1f1f49e --- /dev/null +++ b/server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json @@ -0,0 +1,40 @@ +{ + "data": { + "idShort": "Y24_Ball_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/DynamicData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json b/server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json new file mode 100644 index 000000000..e55093529 --- /dev/null +++ b/server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json @@ -0,0 +1,220 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Norgren/Herion" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Indirect solenoid actuated spool valves" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Bruckstra\u00dfe 93" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "46519" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Alpen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "97100 Namur" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json b/server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json new file mode 100644 index 000000000..157e3c79a --- /dev/null +++ b/server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json @@ -0,0 +1,424 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Pipe12", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "N18", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18" + }, + { + "idShort": "HasControlModule_N18", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + }, + { + "type": "Entity", + "value": "N18" + } + ] + } + }, + { + "idShort": "P19", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19" + }, + { + "idShort": "HasControlModule_P19", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + }, + { + "type": "Entity", + "value": "P19" + } + ] + } + }, + { + "idShort": "T20", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20" + }, + { + "idShort": "HasControlModule_T20", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + }, + { + "type": "Entity", + "value": "T20" + } + ] + } + }, + { + "idShort": "F22", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22" + }, + { + "idShort": "HasControlModule_F22", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + }, + { + "type": "Entity", + "value": "F22" + } + ] + } + }, + { + "idShort": "Y21", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21" + }, + { + "idShort": "HasControlModule_Y21", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe12" + }, + { + "type": "Entity", + "value": "Y21" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json b/server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json new file mode 100644 index 000000000..4d6df19c2 --- /dev/null +++ b/server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json @@ -0,0 +1,209 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/TechnicalData", + "submodelElements": [ + { + "idShort": "Nominal_Pressure", + "description": [ + { + "language": "de", + "text": "alphanummerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung" + }, + { + "language": "en", + "text": "alphanumeric variable for reference purposes, relating to a combination of mechanical and dimensional properties of a component of a pipe" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ333#004" + } + ] + }, + "value": "40", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_Size", + "description": [ + { + "language": "de", + "text": "Untergruppe einer Bauart, deren Unterscheidungsmerkmale im Allgemeinen die Abmessungen sind" + }, + { + "language": "en", + "text": "subgroup of a construction type, whose differentiating features are generally the dimensions" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAP898#005" + } + ] + }, + "value": "25", + "valueType": "xs:string" + }, + { + "idShort": "Material", + "description": [ + { + "language": "de", + "text": "auf Normen basierender Nummerncode von Werkstoffen des Geh\u00e4uses" + }, + { + "language": "en", + "text": "standard-based coding of materials of housing" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAD738#006" + } + ] + }, + "value": "SS/SS-SS-RFE", + "valueType": "xs:string" + }, + { + "idShort": "Test_Pressure", + "description": [ + { + "language": "de", + "text": "Testdruck zum pr\u00fcfen des Ventils." + }, + { + "language": "en", + "text": "Test pressure to check the valve." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/TestPressure" + } + ] + }, + "value": "54.6", + "valueType": "xs:string" + }, + { + "idShort": "Permissible_Temprature", + "description": [ + { + "language": "de", + "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr den Betrieb." + }, + { + "language": "en", + "text": "Permissible temperature range for operation." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/PermissibleTemperature" + } + ] + }, + "value": "-50 to 220", + "valueType": "xs:string" + }, + { + "idShort": "Maximum_Permissible_Operating_Pressure_at_Room_Temperature", + "description": [ + { + "language": "de", + "text": "Maximal zul\u00e4ssiger Betriebsdruck bei Raumtemperatur." + }, + { + "language": "en", + "text": "Maximum Permissible Operating Pressure at Room Temperature." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/MaxOperatingPressure" + } + ] + }, + "value": "36.4", + "valueType": "xs:string" + }, + { + "idShort": "Max_perm_temperature", + "description": [ + { + "language": "de", + "text": "Die Hitzbest\u00e4ndigkeit eines Produktes in Grad Celsius" + }, + { + "language": "en", + "text": "The heat resistance of a product in degrees centigrade." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAF417#005" + } + ] + }, + "value": "220", + "valueType": "xs:string" + }, + { + "idShort": "Connection", + "description": [ + { + "language": "de", + "text": "Prozessanschluss." + }, + { + "language": "en", + "text": "Process connection." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Connection" + } + ] + }, + "value": "Flange Connection", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json b/server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json new file mode 100644 index 000000000..3b2af1db1 --- /dev/null +++ b/server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Pipe31", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "N36", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36" + }, + { + "idShort": "HasControlModule_N36", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe31" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe31" + }, + { + "type": "Entity", + "value": "N36" + } + ] + } + }, + { + "idShort": "Y37", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37" + }, + { + "idShort": "HasControlModule_Y37", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe31" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe31" + }, + { + "type": "Entity", + "value": "Y37" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json b/server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json new file mode 100644 index 000000000..ee712db25 --- /dev/null +++ b/server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "Dynamic_Data", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/DynamicData", + "submodelElements": [ + { + "idShort": "Valve_Opening", + "description": [ + { + "language": "de", + "text": "\u00d6ffnunggrad des Venitls." + }, + { + "language": "en", + "text": "Degree of opening of the valve." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/ValveOpening" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json b/server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json new file mode 100644 index 000000000..bbfd764a6 --- /dev/null +++ b/server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y20_MagneticPostitioner_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json b/server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json new file mode 100644 index 000000000..f0dce3309 --- /dev/null +++ b/server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "Dynamic_Data", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/DynamicData", + "submodelElements": [ + { + "idShort": "Valve_Opening", + "description": [ + { + "language": "de", + "text": "\u00d6ffnunggrad des Venitls." + }, + { + "language": "en", + "text": "Degree of opening of the valve." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/ValveOpening" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json b/server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json new file mode 100644 index 000000000..181c4ed86 --- /dev/null +++ b/server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y16_Actuator_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json b/server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json new file mode 100644 index 000000000..3946e9a13 --- /dev/null +++ b/server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y22_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json b/server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json new file mode 100644 index 000000000..a9e8721b8 --- /dev/null +++ b/server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Samson AG" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Pneumatischer Antrieb" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Weism\u00fcllerstra\u00dfe 3" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "60341" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Frankfurt am Main" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Typ 3277" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2005", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json b/server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json new file mode 100644 index 000000000..dd0ecb8fe --- /dev/null +++ b/server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y21_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json b/server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json new file mode 100644 index 000000000..4804f3dd3 --- /dev/null +++ b/server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N12_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json b/server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json new file mode 100644 index 000000000..322bc7441 --- /dev/null +++ b/server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json @@ -0,0 +1,471 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/TechnicalData", + "submodelElements": [ + { + "idShort": "Temperature_range", + "description": [ + { + "language": "de", + "text": "Bereich von der kleinsten bis zur gr\u00f6\u00dften Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "Range from the smallest through to the largest temperature in the outer surroundings of the operating medium" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO931#001" + } + ] + }, + "value": "-25...110", + "valueType": "xs:string" + }, + { + "idShort": "Density", + "description": [ + { + "language": "de", + "text": "Quotient aus der Masse m und dem Volumen V einer Stoffportion" + }, + { + "language": "en", + "text": "quotient of the mass m divided by the spatial volume V" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA356#004" + } + ] + }, + "value": "983.2", + "valueType": "xs:string" + }, + { + "idShort": "Max_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB906#006" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Max_operating_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC821#006" + } + ] + }, + "value": "10", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_pipe_connection", + "description": [ + { + "language": "de", + "text": "Angabe, welche Rohrarten angeflanscht werden k\u00f6nnen" + }, + { + "language": "en", + "text": "Specifying which types of pipe can be flanged" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAX110#001" + } + ] + }, + "value": "G2", + "valueType": "xs:string" + }, + { + "idShort": "Pressure_rating_SDR", + "description": [ + { + "language": "de", + "text": "Standard Dimensionsrate (SDR) ist eine zur Klassifizierung von Kunststoffrohren gebr\u00e4uchliche Kennzahl, die das Verh\u00e4ltnis zwischen Au\u00dfendurchmesser und Wanddicke eines Rohres wiedergibt" + }, + { + "language": "en", + "text": "Standard dimension ratio (SDR) is a common classification of plastic pipes figure which represents the ratio between the outside diameter and wall thickness of a pipe" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAX111#001" + } + ] + }, + "value": "PN10", + "valueType": "xs:string" + }, + { + "idShort": "Power_input_of_motor", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Speed1", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit f\u00fcr den Betrieb des Motors notwendige elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "under given operating conditions and nominal value of power output, the entire effective electrical power input from the mains network that is required for operation of the motor for the period of time in question" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA448#004" + } + ] + }, + "value": "135", + "valueType": "xs:string" + }, + { + "idShort": "Speed2", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit f\u00fcr den Betrieb des Motors notwendige elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "under given operating conditions and nominal value of power output, the entire effective electrical power input from the mains network that is required for operation of the motor for the period of time in question" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA448#004" + } + ] + }, + "value": "205", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Max_power", + "description": [ + { + "language": "de", + "text": "Maximalwert der Leistung, die sich nach der Gleichung P = dE/dt bzw. P = dW/dt als zeitliche Ableitung von Energie, die gerade \u00fcbertragen oder umgewandelt wird, oder von Arbeit, die gerade verrichtet wird, ergibt" + }, + { + "language": "en", + "text": "maximum value of power, that results from the equation P = dE/dt or P = dW/dt, which say that power is the derivative of the energy being transmitted or converted now with respect to time, or else the derivative of the work which is being done now with respect to time" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC671#009" + } + ] + }, + "value": "240", + "valueType": "xs:string" + }, + { + "idShort": "Operating_frequency", + "description": [ + { + "language": "de", + "text": "Frequenz der elektrischen Spannung und/oder der elektromagnetischen Schwingung, f\u00fcr die das Ger\u00e4t ausgelegt ist" + }, + { + "language": "en", + "text": "The voltage frequency and/or electromagnetic pulse for which the device is designed" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB505#006" + } + ] + }, + "value": "50", + "valueType": "xs:string" + }, + { + "idShort": "Max_rated_voltage_at_AC_50_Hz", + "description": [ + { + "language": "de", + "text": "max. Wert einer Wechselspannung mit einer Frequenz von 50Hz, der vom Hersteller f\u00fcr ein Bauteil, Ger\u00e4t oder eine Einrichtung angegeben wird und auf den sich Funktions- und Leistungsmerkmale beziehen" + }, + { + "language": "en", + "text": "maximum value of a rated voltage at AC 50 Hz stipulated by the manufacturer for a component, device or equipment which relates to the function and power properties" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF975#004" + } + ] + }, + "value": "230", + "valueType": "xs:string" + }, + { + "idShort": "Operating_current", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Speed1", + "description": [ + { + "language": "de", + "text": "Vom Hersteller angegebener Wert des Stromes, der beim Betrieb der Anlage oder von Anlageteilen vorhanden ist oder vorhanden sein muss" + }, + { + "language": "en", + "text": "Manufacturer's value of the current, which is or must be present during operation of the system or of system parts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC051#004" + } + ] + }, + "value": "0.62", + "valueType": "xs:string" + }, + { + "idShort": "Speed2", + "description": [ + { + "language": "de", + "text": "Vom Hersteller angegebener Wert des Stromes, der beim Betrieb der Anlage oder von Anlageteilen vorhanden ist oder vorhanden sein muss" + }, + { + "language": "en", + "text": "Manufacturer's value of the current, which is or must be present during operation of the system or of system parts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC051#004" + } + ] + }, + "value": "0.91", + "valueType": "xs:string" + }, + { + "idShort": "Speed3", + "description": [ + { + "language": "de", + "text": "Vom Hersteller angegebener Wert des Stromes, der beim Betrieb der Anlage oder von Anlageteilen vorhanden ist oder vorhanden sein muss" + }, + { + "language": "en", + "text": "Manufacturer's value of the current, which is or must be present during operation of the system or of system parts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC051#004" + } + ] + }, + "value": "1.5", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Protection_class", + "description": [ + { + "language": "de", + "text": "Angabe \u00fcber die Schutzklasse der Objekts" + }, + { + "language": "en", + "text": "indication of the safety class of the object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK401#005" + } + ] + }, + "value": "IP42", + "valueType": "xs:string" + }, + { + "idShort": "Thermal_insulation_present", + "description": [ + { + "language": "de", + "text": "Angabe, ob das Produkt mit einer thermischen Isolierung ausgestattet ist" + }, + { + "language": "en", + "text": "whether the device is equipped with a thermal insulation or not" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAL232#004" + } + ] + }, + "value": "F", + "valueType": "xs:string" + }, + { + "idShort": "kind_of_motor_protection_device", + "description": [ + { + "language": "de", + "text": "gibt an, welche Art der Vorrichtung zum Schutz des Motors vorhanden ist" + }, + { + "language": "en", + "text": "indicates the available kind of device to protect the motor" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAR645#006" + } + ] + }, + "value": "CONTACT", + "valueType": "xs:string" + }, + { + "idShort": "Net_weight", + "description": [ + { + "language": "de", + "text": "Masse des W\u00e4geguts ohne Verpackung und ohne Transportger\u00e4t" + }, + { + "language": "en", + "text": "mass of the weighed object without packing and transport equipment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF040#007" + } + ] + }, + "value": "5.2", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json b/server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json new file mode 100644 index 000000000..7b524bc79 --- /dev/null +++ b/server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y22_MagneticPositioner_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json b/server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json new file mode 100644 index 000000000..1297fc50b --- /dev/null +++ b/server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json @@ -0,0 +1,415 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/TechnicalData", + "submodelElements": [ + { + "idShort": "Max_medium_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB864#006" + } + ] + }, + "value": "110", + "valueType": "xs:string" + }, + { + "idShort": "Min_medium_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB988#006" + } + ] + }, + "value": "2", + "valueType": "xs:string" + }, + { + "idShort": "Temperature_class", + "description": [ + { + "language": "de", + "text": "Charakterisierungssystem eines elektrischen Ger\u00e4ts, basierend auf dessen maximaler Oberfl\u00e4chentemperatur, bez\u00fcglich der spezifischen explosionsf\u00e4higen Atmosph\u00e4re, f\u00fcr deren Nutzung das Ger\u00e4t vorgesehen ist" + }, + { + "language": "en", + "text": "classification system of electrical apparatus, based on its maximum surface temperature, related to the specific explosive atmosphere for which it is intended to be used" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO371#005" + } + ] + }, + "value": "110", + "valueType": "xs:string" + }, + { + "idShort": "Material_body", + "description": [ + { + "language": "de", + "text": "Werkstoff, aus dem das Ger\u00e4tegeh\u00e4use gefertigt ist" + }, + { + "language": "en", + "text": "substance of which the appliance exterior is made of" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO747#008" + } + ] + }, + "value": "Bronze", + "valueType": "xs:string" + }, + { + "idShort": "Construction_form_of_impeller", + "description": [ + { + "language": "de", + "text": "Gruppe von Bauelementen mit gleichen Konstruktionsmerkmalen und gleichem Aufbau, die aufgrund \u00e4hnlicher Herstellungstechniken f\u00fcr die Bauartzulassungspr\u00fcfung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden k\u00f6nnen. Sie werden im allgemeinen von einer Bauartspezifikation erfasst. Anmerkung: In bestimmten F\u00e4llen k\u00f6nnen Bauelemente aus verschiedenen Bauartspezifikationen als zum gleichen Typ geh\u00f6rig betrachtet und daher f\u00fcr die Bauartzulassung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden" + }, + { + "language": "en", + "text": "Group of components with the same construction features and the same structure, which - due to similar manufacturing techniques - can be collated for construction approval testing and class conformity controls. They are generally allocated to a construction type. Note: in certain cases, components can be viewed from various construction type specifications as belonging to the same type and, therefore, can be collated for construction approval and class conformity controls" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABF501#001" + } + ] + }, + "value": "Komposit PES/PP", + "valueType": "xs:string" + }, + { + "idShort": "Max_ambient_temperature_during_operation", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB906#006" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Max_operation_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb auftritt bzw. auftreten darf, angegeben in der abgeleiteten SI-EInheit des Druckes" + }, + { + "language": "en", + "text": "greatest pressure that occurs in a system in operation or shall occur, indicated in the derived SI unit of pressure" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAJ845#005" + } + ] + }, + "value": "10", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_size", + "description": [ + { + "language": "de", + "text": "numerische Bezeichnung der Gr\u00f6\u00dfe bezogen auf den Str\u00f6mungsquerschnitt eines fluidtechnischen Ger\u00e4tes" + }, + { + "language": "en", + "text": "numeric identifier for the measured variable referred to the flow cross section of a fluidic device" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC418#001" + } + ] + }, + "value": "G1 1/2", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_pressure_of_the_operating_medium", + "description": [ + { + "language": "de", + "text": "PN (Nenndruck) ist eine alphanumerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung. Sie umfasst die Buchstaben PN gefolgt von einer dimensionslosen Zahl" + }, + { + "language": "en", + "text": "PN (nominal pressure) is an alphanumeric variable for reference purposes, relating to a combination of mechanical and measurement properties of a pipe component. It comprises the letters PN followed by a dimensionless number (according to EN 1333/96.08)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO778#001" + } + ] + }, + "value": "PN10", + "valueType": "xs:string" + }, + { + "idShort": "Insertion_length", + "description": [ + { + "language": "de", + "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" + }, + { + "language": "en", + "text": "overall length of that part of a device or component to be found within a containment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO023#004" + } + ] + }, + "value": "180", + "valueType": "xs:string" + }, + { + "idShort": "Power_frequency", + "description": [ + { + "language": "de", + "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" + }, + { + "language": "en", + "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC859#003" + } + ] + }, + "value": "50", + "valueType": "xs:string" + }, + { + "idShort": "Nominal_voltage", + "description": [ + { + "language": "de", + "text": "Nennspannung ist der vom Hersteller oder Lieferanten spezifizierte Wert der elektrischen Spannung im Normalbetrieb" + }, + { + "language": "en", + "text": "nominal voltage is the specified value which shows the voltage in normal operation given by the manufacturer or supplier" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC856#007" + } + ] + }, + "value": "1*230V", + "valueType": "xs:string" + }, + { + "idShort": "Power_consumption", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Drehzahlstufe1", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH939#001" + } + ] + }, + "value": "50", + "valueType": "xs:string" + }, + { + "idShort": "Drehzahlstufe2", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH939#001" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Drehzahlstufe3", + "description": [ + { + "language": "de", + "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH939#001" + } + ] + }, + "value": "70", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Net_weight", + "description": [ + { + "language": "de", + "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t. Da unter \u201eGewicht\u201c in diesem Fall die Masse verstanden wird, ist auch die Ma\u00dfeinheit (Kilo-) Gramm als SI-Einheit zu verwenden" + }, + { + "language": "en", + "text": "Dimensions of the weigh item without packaging and without transport device. As, in this case, 'weight' means dimensions, the measure unit (kilo) gram is to be used as the SI unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAD875#007" + } + ] + }, + "value": "02. Sep", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json b/server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json new file mode 100644 index 000000000..898e9b20c --- /dev/null +++ b/server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "T12", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "T12_Messumformer", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer" + }, + { + "idShort": "HasComponent_T12_Messumformer", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "T12" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "T12" + }, + { + "type": "Entity", + "value": "T12_Messumformer" + } + ] + } + }, + { + "idShort": "T12_Temperature_Sensor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor" + }, + { + "idShort": "HasComponent_T12_Temperature_Sensor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "T12" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "T12" + }, + { + "type": "Entity", + "value": "T12_Temperature_Sensor" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json b/server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json new file mode 100644 index 000000000..e249746f1 --- /dev/null +++ b/server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N13_Motor_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json b/server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json new file mode 100644 index 000000000..fa92b7b61 --- /dev/null +++ b/server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L35_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json b/server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json new file mode 100644 index 000000000..c8d93e59b --- /dev/null +++ b/server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Pipe32", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "N38", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38" + }, + { + "idShort": "HasControlModule_N38", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe32" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe32" + }, + { + "type": "Entity", + "value": "N38" + } + ] + } + }, + { + "idShort": "Y39", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39" + }, + { + "idShort": "HasControlModule_Y39", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe32" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Pipe32" + }, + { + "type": "Entity", + "value": "Y39" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json b/server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json new file mode 100644 index 000000000..c97e737c9 --- /dev/null +++ b/server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json @@ -0,0 +1,159 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/TechnicalData", + "submodelElements": [ + { + "idShort": "Springstroke", + "description": [ + { + "language": "de", + "text": "Federweg der Feder." + }, + { + "language": "en", + "text": "Springstroke." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Springstroke" + } + ] + }, + "value": "31 to 47", + "valueType": "xs:string" + }, + { + "idShort": "Air_consumption", + "description": [ + { + "language": "de", + "text": "Verbrauch des Werkzeuge an Druckluft, z.B. f\u00fcr Druckluft-Schlagschrauber" + }, + { + "language": "en", + "text": "Tool's consumption of compressed air, e.g. for compressed air hammer screw driver" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA453#003" + } + ] + }, + "value": "0.74", + "valueType": "xs:string" + }, + { + "idShort": "maximum_operating_pressure", + "description": [ + { + "language": "de", + "text": "oberer Grenzwert des Druckbereiches, bei dem ein fluidtechnisches Ger\u00e4t seine Funktion erf\u00fcllt" + }, + { + "language": "en", + "text": "upper limit of the pressure range at which a fluidic device fulfils its function" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ943#001" + } + ] + }, + "value": "8.3", + "valueType": "xs:string" + }, + { + "idShort": "Min_operating_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "minimum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC820#006" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Max_operating_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC821#006" + } + ] + }, + "value": "100", + "valueType": "xs:string" + }, + { + "idShort": "Weight", + "description": [ + { + "language": "de", + "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t" + }, + { + "language": "en", + "text": "Mass of weight without packaging and transport unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB713#006" + } + ] + }, + "value": "5.5", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json b/server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json new file mode 100644 index 000000000..52da19ea8 --- /dev/null +++ b/server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Pipe12_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json b/server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json new file mode 100644 index 000000000..88c920493 --- /dev/null +++ b/server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json @@ -0,0 +1,509 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/TechnicalData", + "submodelElements": [ + { + "idShort": "HS_Code_of_the_WCO", + "description": [ + { + "language": "de", + "text": "International angewendete 4 bis 6-stellige Kodierung von Warenklassen entsprechend der Definition durch das Harmonized System (HS) der World Customs Organization (WCO)" + }, + { + "language": "en", + "text": "Internationally applied 4 to 6-digit coding of classes of goods as defined by the Harmonized System (HS) of the World Customs Organization (WCO)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ851#001" + } + ] + }, + "value": "90261029", + "valueType": "xs:string" + }, + { + "idShort": "Cable_entry", + "description": [ + { + "language": "de", + "text": "Charakterisierung einer Kabel- oder Conduiteinf\u00fchrung bez\u00fcglich des Anschlussgewindes" + }, + { + "language": "en", + "text": "classification of a cable or conduit entry according to the thread" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA279#008" + } + ] + }, + "value": "M20*1.5", + "valueType": "xs:string" + }, + { + "idShort": "Total_length_metric", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfte L\u00e4ngenausdehnung eines Objektes, inklusive ausragender Bauteile" + }, + { + "language": "en", + "text": "largest dimension of an object, inclusive jutting parts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAJ184#004" + } + ] + }, + "value": "5", + "valueType": "xs:string" + }, + { + "idShort": "Connection_type_of_process_connection", + "description": [ + { + "language": "de", + "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" + }, + { + "language": "en", + "text": "classification of a process connection according to its fabricated form" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO333#005" + } + ] + }, + "value": "Verschraubung, lose G1/2A PN3", + "valueType": "xs:string" + }, + { + "idShort": "Measuring_range", + "description": [ + { + "language": "de", + "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" + }, + { + "language": "en", + "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH095#003" + } + ] + }, + "value": "0...0.1", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4...20mA/HART", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_process_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" + }, + { + "language": "en", + "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN307#004" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Min_process_pressure", + "description": [ + { + "language": "de", + "text": "kleinster Absolutwert des die Mess- oder Stelleinrichtung ber\u00fchrenden Druckes, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the least absolute value of the pressure which affects them and under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY641#001" + } + ] + }, + "value": "-0.2", + "valueType": "xs:string" + }, + { + "idShort": "Max_process_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" + }, + { + "language": "en", + "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAY820#001" + } + ] + }, + "value": "15", + "valueType": "xs:string" + }, + { + "idShort": "Power_supply", + "description": [ + { + "language": "de", + "text": "Versorgung von Ger\u00e4ten oder Anlagen mit gesonderter, zus\u00e4tzlicher Stromzuf\u00fchrung" + }, + { + "language": "en", + "text": "supply of devices or systems with separate, additional power supply" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ002#001" + } + ] + }, + "value": "12...36", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP66/67", + "valueType": "xs:string" + }, + { + "idShort": "Max_output_current", + "description": [ + { + "language": "de", + "text": "Maximaler Strom, der an den Ausgangsanschl\u00fcssen des Steuerstromkreises eines Schaltger\u00e4ts anliegt" + }, + { + "language": "en", + "text": "Maximum current at the output connections of the control circuit of a switching device" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAC639#007" + } + ] + }, + "value": "22", + "valueType": "xs:string" + }, + { + "idShort": "Accuracy_of_the_measuring_instrument", + "description": [ + { + "language": "de", + "text": "Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" + }, + { + "language": "en", + "text": "degree of approximation between a result of determination and the approved reference value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH809#004" + } + ] + }, + "value": "\u00b13", + "valueType": "xs:string" + }, + { + "idShort": "Vibration_resistance", + "description": [ + { + "language": "de", + "text": "mechanische Widerstandsf\u00e4higkeit von Ger\u00e4ten gegen\u00fcber sinusf\u00f6rmigen Schwingungen mit vorgegebenem Sch\u00e4rfegrad" + }, + { + "language": "en", + "text": "mechanical resistance capacity of devices against sinusoidal oscillations with prescribed test intensity" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO888#003" + } + ] + }, + "value": "4g and 5...100Hz", + "valueType": "xs:string" + }, + { + "idShort": "Set_display_language", + "description": [ + { + "language": "de", + "text": "Sprache oder Sprachen, die auf der Anzeige eingestellt ist" + }, + { + "language": "en", + "text": "language or languages set on the display" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABA335#001" + } + ] + }, + "value": "DE", + "valueType": "xs:string" + }, + { + "idShort": "Shock_resistance", + "description": [ + { + "language": "de", + "text": "Schockfestigkeit" + }, + { + "language": "en", + "text": "Shock resistance" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV513#002" + } + ] + }, + "value": "Beschleunigung 100g/6ms", + "valueType": "xs:string" + }, + { + "idShort": "Dynamic_behavior_dead_time", + "description": [ + { + "language": "de", + "text": "Zeitdauer zwischen dem Moment, in dem die Abweichung einer Eingangsgr\u00f6\u00dfe erstellt wird und dem Moment, in dem die daraus resultierende Abweichung der Ausgangsgr\u00f6\u00dfe beginnt" + }, + { + "language": "en", + "text": "time interval between the instant when the variation of an input variable is produced and the instant when the consequent variation of the output variable starts" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE258#006" + } + ] + }, + "value": "150", + "valueType": "xs:string" + }, + { + "idShort": "Rise_time", + "description": [ + { + "language": "de", + "text": "Anstiegszeit ist die Zeit, in der ein Signal von 10 % auf 90 % seines Endwertes ansteigt" + }, + { + "language": "en", + "text": "min. supply pressure is used as necessary in order to have a further differentiating term for a second pressure based on the primary operating pressure, here the min. supply pressure" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD909#001" + } + ] + }, + "value": "100", + "valueType": "xs:string" + }, + { + "idShort": "Step_response_time_t90", + "description": [ + { + "language": "de", + "text": "zeitliche Dauer, bei einer stufenartigen Ver\u00e4nderung des Eingangssignals eines Systems, die die \u00c4nderung des Ausgangssignals des Systems ben\u00f6tigt, um zum ersten Mal 90% des letzten Werts des stabilen Zustands zu erreichen" + }, + { + "language": "en", + "text": "time duration from a step change in the input signal to a system for the change in output of the system to reach for the first time 90% of its final steady state value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM701#004" + } + ] + }, + "value": "250", + "valueType": "xs:string" + }, + { + "idShort": "Damping", + "description": [ + { + "language": "de", + "text": "D\u00e4mpfung liegt dann vor, wenn das Ausgangssignal kleiner als das Eingangssignal ist" + }, + { + "language": "en", + "text": "Damping is present when an output signal is lower than the corresponding input signal" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE235#003" + } + ] + }, + "value": "0...999s, einstellbar", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json b/server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json new file mode 100644 index 000000000..d846f966e --- /dev/null +++ b/server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "KSB AG" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Blockpumpe mit Wellendichtung" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Johann-Klein-Str. 9" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "67227" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Frankenthal" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Etachrom BC-025-125.1/054" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json b/server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json new file mode 100644 index 000000000..1cf9b37e7 --- /dev/null +++ b/server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y21_Stellventil_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json b/server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json new file mode 100644 index 000000000..6a8fec73e --- /dev/null +++ b/server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y25_Magnetic_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json b/server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json new file mode 100644 index 000000000..5f726791c --- /dev/null +++ b/server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json @@ -0,0 +1,17 @@ +{ + "data": { + "idShort": "aas_registry", + "modelType": "AssetAdministrationShell", + "id": "https://mnestix.com/aas/registry", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://mnestix.com/registry", + "specificAssetIds": [ + { + "name": "assetIdShort", + "value": "registry" + } + ] + } + } +} \ No newline at end of file diff --git a/server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json b/server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json new file mode 100644 index 000000000..85655c8a5 --- /dev/null +++ b/server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json @@ -0,0 +1,496 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "TU10", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "B1", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1" + }, + { + "idShort": "HasEquipmentModule_B1", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + }, + { + "type": "Entity", + "value": "B1" + } + ] + } + }, + { + "idShort": "Pipe11", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11" + }, + { + "idShort": "HasEquipmentModule_Pipe11", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + }, + { + "type": "Entity", + "value": "Pipe11" + } + ] + } + }, + { + "idShort": "Pipe12", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12" + }, + { + "idShort": "HasEquipmentModule_Pipe12", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + }, + { + "type": "Entity", + "value": "Pipe12" + } + ] + } + }, + { + "idShort": "T23", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23" + }, + { + "idShort": "HasControlModule_T23", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + }, + { + "type": "Entity", + "value": "T23" + } + ] + } + }, + { + "idShort": "Y24", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24" + }, + { + "idShort": "HasControlModule_Y24", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + }, + { + "type": "Entity", + "value": "Y24" + } + ] + } + }, + { + "idShort": "Y25", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25" + }, + { + "idShort": "HasControlModule_Y25", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU10" + }, + { + "type": "Entity", + "value": "Y25" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json b/server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json new file mode 100644 index 000000000..dd5bab01b --- /dev/null +++ b/server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L11_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json b/server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json new file mode 100644 index 000000000..986194367 --- /dev/null +++ b/server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json @@ -0,0 +1,34 @@ +{ + "data": { + "idShort": "Dynamic_Data", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/DynamicData", + "submodelElements": [ + { + "idShort": "Drive_Power", + "description": [ + { + "language": "de", + "text": "gemessene auf das Fluid beim Durchgang durch die Pumpe \u00fcbertragene mechanische Leistung" + }, + { + "language": "en", + "text": "measured useful mechanical power transferred to the fluid during its passage through the pump" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC172#001" + } + ] + }, + "value": "0", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json b/server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json new file mode 100644 index 000000000..95de4ecaa --- /dev/null +++ b/server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "VEGA" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "VEGASON 61" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Am Hohenstein 113" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "77761" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Schiltach" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "VEGASON" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json b/server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json new file mode 100644 index 000000000..381637664 --- /dev/null +++ b/server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y39_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json b/server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json new file mode 100644 index 000000000..2bc2081cc --- /dev/null +++ b/server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json @@ -0,0 +1,280 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "B1", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "L10", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10" + }, + { + "idShort": "HasControlModule_L10", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B1" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B1" + }, + { + "type": "Entity", + "value": "L10" + } + ] + } + }, + { + "idShort": "Q11", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11" + }, + { + "idShort": "HasControlModule_Q11", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B1" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B1" + }, + { + "type": "Entity", + "value": "Q11" + } + ] + } + }, + { + "idShort": "T12", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12" + }, + { + "idShort": "HasControlModule_T12", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B1" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "B1" + }, + { + "type": "Entity", + "value": "T12" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json b/server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json new file mode 100644 index 000000000..9ba256271 --- /dev/null +++ b/server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "SOMAS" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "A11-DA-015-F07" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Box 107" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "66123" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "SAEFFLE" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "SE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Si-503 DE" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json b/server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json new file mode 100644 index 000000000..fdb5e989a --- /dev/null +++ b/server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L10_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json b/server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json new file mode 100644 index 000000000..9a9e4d964 --- /dev/null +++ b/server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "PT100" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Dieselstra\u00dfe 24" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "70839" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Gerlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "CLS21 Condumax" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json b/server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json new file mode 100644 index 000000000..5e35acb0b --- /dev/null +++ b/server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F40_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json b/server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json new file mode 100644 index 000000000..76f3930ae --- /dev/null +++ b/server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y24_Pneumatischer_Antrieb_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json b/server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json new file mode 100644 index 000000000..3e030fb22 --- /dev/null +++ b/server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json @@ -0,0 +1,409 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/TechnicalData", + "submodelElements": [ + { + "idShort": "Messumformer", + "description": [ + { + "language": "de", + "text": "bestimmte Ausf\u00fchrung im Rahmen eines Typs, die im Allgemeinen durch die Konstruktion oder die Ma\u00dfe gekennzeichnet ist" + }, + { + "language": "en", + "text": "sub level of type which is generally distinguished by the construction or the dimensions" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAP886#004" + } + ] + }, + "value": "IFC 300", + "valueType": "xs:string" + }, + { + "idShort": "Nennweite", + "description": [ + { + "language": "de", + "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" + }, + { + "language": "en", + "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH222#001" + } + ] + }, + "value": "DN25", + "valueType": "xs:string" + }, + { + "idShort": "Messwertabweichung", + "description": [ + { + "language": "de", + "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" + }, + { + "language": "en", + "text": "deviation of measured value from the true value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ356#003" + } + ] + }, + "value": " \u00b1 0,5", + "valueType": "xs:string" + }, + { + "idShort": "min_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "140", + "valueType": "xs:string" + }, + { + "idShort": "min_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "65", + "valueType": "xs:string" + }, + { + "idShort": "min_zulaessige_Lagertemperatur", + "description": [ + { + "language": "de", + "text": "minimal zul\u00e4ssige Lagertemperatur des Betriebsmittels" + }, + { + "language": "en", + "text": "minimum permissible temperature of the operating resource during storage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABA653#001" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_zulaessige_Lagertemperatur", + "description": [ + { + "language": "de", + "text": "maximal zul\u00e4ssige Lagertemperatur des Betriebsmittels" + }, + { + "language": "en", + "text": "maximum permissible temperature of the operating resource during storage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABA654#001" + } + ] + }, + "value": "70", + "valueType": "xs:string" + }, + { + "idShort": "Betriebsmedium", + "description": [ + { + "language": "de", + "text": "Medium, mit welchem das Ger\u00e4t betrieben werden darf (Medium am Eingang)" + }, + { + "language": "en", + "text": "temperature at which the specified accuracy data are valid. For deviations from the nominal temperature, the specified temperature coefficients must be must be added to the specified accuracies" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABD905#001" + } + ] + }, + "value": "Wasser", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP67", + "valueType": "xs:string" + }, + { + "idShort": "Dichtwerkstoff", + "description": [ + { + "language": "de", + "text": "Substanz, aus welcher die Dichtung hergestellt ist" + }, + { + "language": "en", + "text": "substance from which a leave is manufactured" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK468#006" + } + ] + }, + "value": "PFA", + "valueType": "xs:string" + }, + { + "idShort": "Gehaeusewerkstoff", + "description": [ + { + "language": "de", + "text": "Bezeichnung des Werkstoffes f\u00fcr die Herstellung des Geh\u00e4uses bzw. des Griffes" + }, + { + "language": "en", + "text": "designation of the material for the production of the housing or handle" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABF427#001" + } + ] + }, + "value": "Stahlblech", + "valueType": "xs:string" + }, + { + "idShort": "Material_der_Elektrode", + "description": [ + { + "language": "de", + "text": "Material der Elektroden, die auf einem zur elektrophysiologischen Untersuchung genutzten Katheters aufgebracht sind" + }, + { + "language": "en", + "text": "Material of the electrodes, which are deposited on a used for the electrophysiological study catheter" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAS788#001" + } + ] + }, + "value": "Hastelloy C", + "valueType": "xs:string" + }, + { + "idShort": "Spannungsversorgung", + "description": [ + { + "language": "de", + "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" + }, + { + "language": "en", + "text": "describes the source of electrical energy that supplies the object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK788#003" + } + ] + }, + "value": "12 - 24 V", + "valueType": "xs:string" + }, + { + "idShort": "Ausgaenge", + "description": [ + { + "language": "de", + "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" + }, + { + "language": "en", + "text": "rules and agreements by that communication partner can interact with each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW333#001" + } + ] + }, + "value": "HART", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json b/server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json new file mode 100644 index 000000000..5f9b37625 --- /dev/null +++ b/server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GRUNDFOS" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "CRNE 3-5 A-FGJ-G-V-HQQV" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Martin Bachs Vej 3" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8850" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Bjerringbro" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DK" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Grundfos Pumpe 96499985" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json b/server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json new file mode 100644 index 000000000..a65cbb03e --- /dev/null +++ b/server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Pipe11_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json b/server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json new file mode 100644 index 000000000..f31eda8bf --- /dev/null +++ b/server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json @@ -0,0 +1,280 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "Y25", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "Y25_Ball_Vave", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve" + }, + { + "idShort": "HasComponent_Y25_Ball_Vave", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y25" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y25" + }, + { + "type": "Entity", + "value": "Y25_Ball_Vave" + } + ] + } + }, + { + "idShort": "Y25_Magnetic_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve" + }, + { + "idShort": "HasComponent_Y25_Magnetic_Valve", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y25" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y25" + }, + { + "type": "Entity", + "value": "Y25_Magnetic_Valve" + } + ] + } + }, + { + "idShort": "Y25_Pneumatischer_Antrieb", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb" + }, + { + "idShort": "HasComponent_Y25_Pneumatischer_Antrieb", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y25" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "Y25" + }, + { + "type": "Entity", + "value": "Y25_Pneumatischer_Antrieb" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json b/server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json new file mode 100644 index 000000000..7b140994d --- /dev/null +++ b/server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json @@ -0,0 +1,40 @@ +{ + "data": { + "idShort": "N18_Motor_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/DynamicData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json b/server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json new file mode 100644 index 000000000..7b6f6582f --- /dev/null +++ b/server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Krohne Messtechnik GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Radar Level Sensor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Kludwig-Krohne-Stra\u00dfe 5" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "47058" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Duisburg" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Optiwave 7300C" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json b/server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json new file mode 100644 index 000000000..0472ac183 --- /dev/null +++ b/server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json @@ -0,0 +1,434 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/TechnicalData", + "submodelElements": [ + { + "idShort": "Accuracy_of_the_measuring_instrument", + "description": [ + { + "language": "de", + "text": "Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" + }, + { + "language": "en", + "text": "degree of approximation between a result of determination and the approved reference value" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH809#004" + } + ] + }, + "value": "\u00b10.04% of span", + "valueType": "xs:string" + }, + { + "idShort": "Stability", + "description": [ + { + "language": "de", + "text": "beschreibt die Art der Festigkeit des Objekts" + }, + { + "language": "en", + "text": "describes the strength of the object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK641#002" + } + ] + }, + "value": "\u00b10.2% of URL per 15 years", + "valueType": "xs:string" + }, + { + "idShort": "Response_time", + "description": [ + { + "language": "de", + "text": "Zeitraum zwischen Meldung des Auftraggebers und R\u00fcckmeldung des Auftragnehmers (Vertragsbestandteil)" + }, + { + "language": "en", + "text": "Period between notification by the customer and response by the contractor (part of the contract)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAR717#003" + } + ] + }, + "value": "90", + "valueType": "xs:string" + }, + { + "idShort": "Burst_pressure", + "description": [ + { + "language": "de", + "text": "Druck, bei dem ein Bauteil oder Leitungssystem birst und Druckmedium austritt" + }, + { + "language": "en", + "text": "pressure at which a component or piping fails and fluid begins to escape" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ810#001" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "Max_measurement_span", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dftm\u00f6gliche algebraische Differenz zwischen dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsendwert und dem kleinstm\u00f6glichen einstellbaren Messbereichsanfangswert" + }, + { + "language": "en", + "text": "greatest possible algebraic difference between the greatest measurement range boundary value which can be set and the least possible value which can be set" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA033#008" + } + ] + }, + "value": "0.04", + "valueType": "xs:string" + }, + { + "idShort": "Min_measurement_span", + "description": [ + { + "language": "de", + "text": "kleinstm\u00f6gliche algebraische Differenz zwischen dem kleinstm\u00f6glichen einstellbaren Messbereichsendwert und dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsanfangswert" + }, + { + "language": "en", + "text": "lowest possible algebraic difference between the least measurement range boundary value which can be set and the greatest possible value which can be set" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA034#008" + } + ] + }, + "value": "2", + "valueType": "xs:string" + }, + { + "idShort": "Measuring_range", + "description": [ + { + "language": "de", + "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" + }, + { + "language": "en", + "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAH095#003" + } + ] + }, + "value": "from -0.1 to 2", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN313#004" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "Lower_limiting_value_of_ambient_temperature", + "description": [ + { + "language": "de", + "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" + }, + { + "language": "en", + "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN314#004" + } + ] + }, + "value": "85", + "valueType": "xs:string" + }, + { + "idShort": "Upper_limiting_value_of_process_temperature", + "description": [ + { + "language": "de", + "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" + }, + { + "language": "en", + "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN307#004" + } + ] + }, + "value": "120", + "valueType": "xs:string" + }, + { + "idShort": "Ambient_humidity", + "description": [ + { + "language": "de", + "text": "gemessene Umgebungsfeuchte" + }, + { + "language": "en", + "text": "measured ambient humidity" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC147#001" + } + ] + }, + "value": "0 to 100% RH", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_output_signal", + "description": [ + { + "language": "de", + "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" + }, + { + "language": "en", + "text": "Signal at output of the information processing or transmission system part under consideration" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA006#006" + } + ] + }, + "value": "4 to 20 mA DC Output with digital communication (HART 5 protocol)", + "valueType": "xs:string" + }, + { + "idShort": "Type_of_process_connection", + "description": [ + { + "language": "de", + "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" + }, + { + "language": "en", + "text": "classification of a process connection according to its fabricated form" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA021#007" + } + ] + }, + "value": "G1/2 DIN 16 288 male", + "valueType": "xs:string" + }, + { + "idShort": "Design_of_electrical_connection", + "description": [ + { + "language": "de", + "text": "mechanische Konstruktion der elektrischen Verbindung zum Sicherheitsschalter" + }, + { + "language": "en", + "text": "mechanical design of the electrical connection to the safety switch" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF334#001" + } + ] + }, + "value": "M20 female, two electrical connections with a blind plug", + "valueType": "xs:string" + }, + { + "idShort": "Degree_of_Protection", + "description": [ + { + "language": "de", + "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAV695#001" + } + ] + }, + "value": "IP66/IP67, Type 4X", + "valueType": "xs:string" + }, + { + "idShort": "supply_voltage_at_DC", + "description": [ + { + "language": "de", + "text": "erforderliche Spannung als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten / unter der Bedingung: Art des Stromes = direct current (Gleichstrom)" + }, + { + "language": "en", + "text": "required voltage as electromotive force that must temporally or permanently apply at the power supply input of an electric device to maintain the function of the operating resource / on condition: type of current = direct current (d.c.)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF535#004" + } + ] + }, + "value": "10.5 to 42 V DC", + "valueType": "xs:string" + }, + { + "idShort": "Max_operation_overpressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter noch zul\u00e4ssiger \u00dcberdruck bei ordnungsgem\u00e4\u00dfem Betrieb des Bauteils bzw. des Ger\u00e4tes" + }, + { + "language": "en", + "text": "largest permissible pressure at proper operation of the device or component" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI725#005" + } + ] + }, + "value": "4", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json b/server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json new file mode 100644 index 000000000..e9f658448 --- /dev/null +++ b/server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json @@ -0,0 +1,352 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "TU30", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "B3", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3" + }, + { + "idShort": "HasEquipmentModule_B3", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + }, + { + "type": "Entity", + "value": "B3" + } + ] + } + }, + { + "idShort": "Pipe31", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31" + }, + { + "idShort": "HasEquipmentModule_Pipe31", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + }, + { + "type": "Entity", + "value": "Pipe31" + } + ] + } + }, + { + "idShort": "Pipe32", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32" + }, + { + "idShort": "HasEquipmentModule_Pipe32", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + }, + { + "type": "Entity", + "value": "Pipe32" + } + ] + } + }, + { + "idShort": "Pipe33", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33" + }, + { + "idShort": "HasEquipmentModule_Pipe33", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU30" + }, + { + "type": "Entity", + "value": "Pipe33" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json b/server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json new file mode 100644 index 000000000..d2915e73b --- /dev/null +++ b/server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "PT100" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Dieselstra\u00dfe 24" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "70839" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Gerlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "CLS21 Condumax" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json b/server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json new file mode 100644 index 000000000..e99d579fd --- /dev/null +++ b/server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Endress+Hauser" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "\"Proline Promass 83F25, DN25 1\"\"\"" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Colmarer Str. 6" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "79576" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Weil am Rhein" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "PROMASS F" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json b/server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json new file mode 100644 index 000000000..94c5c4456 --- /dev/null +++ b/server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json @@ -0,0 +1,315 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/TechnicalData", + "submodelElements": [ + { + "idShort": "Function", + "description": [ + { + "language": "de", + "text": "Funktionsweise des Ger\u00e4ts." + }, + { + "language": "en", + "text": "Functioning of the device." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Function" + } + ] + }, + "value": "5/2 way, spring return", + "valueType": "xs:string" + }, + { + "idShort": "Ports_size", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "First", + "description": [ + { + "language": "de", + "text": "Angabe, ob am Produkt ein Flansch vorhanden ist oder nicht" + }, + { + "language": "en", + "text": "specification whether or whether not the product is equipped with a flange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAL874#004" + } + ] + }, + "value": "Flange", + "valueType": "xs:string" + }, + { + "idShort": "Third_and_Fifth", + "description": [ + { + "language": "de", + "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" + }, + { + "language": "en", + "text": "identifier for the cross section shape of a thread profile" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAA052#008" + } + ] + }, + "value": "G1/8", + "valueType": "xs:string" + }, + { + "idShort": "Secon_and_Forth", + "description": [ + { + "language": "de", + "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" + }, + { + "language": "en", + "text": "identifier for the cross section shape of a thread profile" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAA052#008" + } + ] + }, + "value": "G1/4", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Actuation_Return", + "description": [ + { + "language": "de", + "text": "Federweg der Feder." + }, + { + "language": "en", + "text": "Springstroke." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Springstroke" + } + ] + }, + "value": "Solenoid_Spring", + "valueType": "xs:string" + }, + { + "idShort": "Flow", + "description": [ + { + "language": "de", + "text": "Angabe \u00fcber den Nennvolumenstrom des Objekts" + }, + { + "language": "en", + "text": "describes the nominal volume flow rate" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI855#002" + } + ] + }, + "value": "750", + "valueType": "xs:string" + }, + { + "idShort": "Weight", + "description": [ + { + "language": "de", + "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t" + }, + { + "language": "en", + "text": "Mass of weight without packaging and transport unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB713#006" + } + ] + }, + "value": "0.26", + "valueType": "xs:string" + }, + { + "idShort": "Rated_current", + "description": [ + { + "language": "de", + "text": "vom Hersteller angegebener Wert des Stromes, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" + }, + { + "language": "en", + "text": "value of the current, resulting from measurements which were determined under specified conditions and rules as defined by the manufacturer" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF726#003" + } + ] + }, + "value": "70", + "valueType": "xs:string" + }, + { + "idShort": "Protection_Class", + "description": [ + { + "language": "de", + "text": "Ausma\u00df des durch ein Geh\u00e4use gebotenen Schutzes vor Zugang zu gef\u00e4hrlichen Teilen und Eindringen von festen Fremdk\u00f6rpern und/oder Wasser, der durch normierte Pr\u00fcfverfahren best\u00e4tigt wurde, angegeben als IP-Einstufung" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and/or ingress of water and verified by standardized test methods, expressed as a IP rating" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAG975#013" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + }, + { + "idShort": "temp_Ambient", + "description": [ + { + "language": "de", + "text": "Zul\u00e4ssige Umgebungstemperatur." + }, + { + "language": "en", + "text": "Permissible ambient temperature." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/AmbientTemperature" + } + ] + }, + "value": "-15...+50", + "valueType": "xs:string" + }, + { + "idShort": "el_connection", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" + }, + { + "language": "en", + "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB414#007" + } + ] + }, + "value": "Connector DIN EN 175301-803", + "valueType": "xs:string" + }, + { + "idShort": "Interface", + "description": [ + { + "language": "de", + "text": "formelle Festlegung aller Eigenschaften einer Schnittstelle, die erforderlich sind, um die vollst\u00e4ndige (physikalische und funktionelle) Kompatibilit\u00e4t zweier zu verbindender Systeme f\u00fcr den Datenaustausch sicherzustellen" + }, + { + "language": "en", + "text": "formal specification of all characteristics of an interface that are required for guaranteeing the complete (physical and functional) compatibility of two systems to be connected for the data exchange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF528#001" + } + ] + }, + "value": "NAMUR", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json b/server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json new file mode 100644 index 000000000..75ee1bb98 --- /dev/null +++ b/server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y39_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json b/server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json new file mode 100644 index 000000000..1e0501609 --- /dev/null +++ b/server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L32_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json b/server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json new file mode 100644 index 000000000..12cd03790 --- /dev/null +++ b/server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Siemens AG " + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Temperatursensor" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Werner-von-Siemens-Stra\u00dfe 1" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "80333" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "M\u00fcnchen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Einschaub-Widerstandsthermometer" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json b/server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json new file mode 100644 index 000000000..127d65e47 --- /dev/null +++ b/server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "HC10_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json b/server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json new file mode 100644 index 000000000..a8cfbe808 --- /dev/null +++ b/server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N14_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json b/server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json new file mode 100644 index 000000000..cda11c31b --- /dev/null +++ b/server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json @@ -0,0 +1,209 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/TechnicalData", + "submodelElements": [ + { + "idShort": "Kommunikationsprotokoll", + "description": [ + { + "language": "de", + "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" + }, + { + "language": "en", + "text": "rules and agreements by that communication partner can interact with each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW333#001" + } + ] + }, + "value": "4 - 20 mA DC/ HART", + "valueType": "xs:string" + }, + { + "idShort": "min_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC020#007" + } + ] + }, + "value": "-55\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Mediumstemperatur", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" + }, + { + "language": "en", + "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB904#006" + } + ] + }, + "value": "600\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "min_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-40\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "max_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "85\u00b0C", + "valueType": "xs:string" + }, + { + "idShort": "Spannungsversorgung", + "description": [ + { + "language": "de", + "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" + }, + { + "language": "en", + "text": "describes the source of electrical energy that supplies the object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAK788#003" + } + ] + }, + "value": "11...42", + "valueType": "xs:string" + }, + { + "idShort": "Werkstoff", + "description": [ + { + "language": "de", + "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" + }, + { + "language": "en", + "text": "Short name or material number of the applied material" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAM562#001" + } + ] + }, + "value": "14571", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP66", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json b/server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json new file mode 100644 index 000000000..e018571d6 --- /dev/null +++ b/server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json @@ -0,0 +1,70 @@ +{ + "data": { + "idShort": "ThemeSettings", + "modelType": "Submodel", + "id": "https://repodomainurl.com/sm/VGhlbWVTZXR0aW5ncw/1/0", + "administration": { + "version": "1", + "revision": "0" + }, + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/ThemeSettings/1/0" + } + ] + }, + "submodelElements": [ + { + "idShort": "Base64Logo", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/ThemeSettings/Base64Logo/1/0" + } + ] + }, + "value": "data:image/svg+xml;base64,PHN2ZyBpZD0iRWJlbmVfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCA0MTkuMTEgMTA1LjIxIiB4bWw6c3BhY2U9InByZXNlcnZlIiBjb2xvcj0iI2ZmZiIgY2xhc3M9InNjLWZVbk1DaCBpS2tGWk0iPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiNGRkZGRkY7fQ0KPC9zdHlsZT48Zz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjMuMzYsNTkuMzFMMTEuODQsNzYuNzhIMGwxNy44LTI1LjQ1TDEuODMsMjguMjloMTIuMDRsMTAuNCwxNC45Mmw5LjgxLTE0LjkyaDExLjg0TDI5Ljc3LDUxLjEzTDQ3LjcsNzYuNzggSDM1LjUzTDIzLjM2LDU5LjMxeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik01Ny42OCwyOC4yOWgxMC42N3Y0OC40OEg1Ny42OFYyOC4yOXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNOTQuNjMsMzcuOThINzcuODF2LTkuNjhoNDQuMzZ2OS42OGgtMTYuNzV2MzguOGgtMTAuOFYzNy45OHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTc3LjEsNzEuMTVsNS4zNi03LjcyYzUuMTcsMy40NywxMS4xOSw1LjE3LDE3LjQsNS4xN2M5LjQ5LDAsMTEuMjYtMS44MywxMS4yNi01Ljg5IGMwLTMuOTktNC4wNi00Ljc4LTExLjUyLTUuODJjLTEyLjk2LTEuODMtMTkuNy00LjE5LTE5LjctMTQuNzJjMC0xMC44LDYuNTQtMTQuNjUsMjAuMjItMTQuNjVjOS44OCwwLDE1LjksMi4yOSwxOS42Myw0Ljc4IGwtNS43Niw4LjMxYy0zLjA3LTIuMDMtOC43Ny0zLjczLTE0LTMuNzNjLTcuNTksMC05LjQyLDEuNS05LjQyLDUuMDNjMCwzLjkzLDMuOTksNC42NSwxMS43MSw1Ljc2IGMxMS42NSwxLjcsMTkuNDMsMy42LDE5LjQzLDE0LjUyYzAsOS44MS01LjM3LDE1LjMxLTIxLjUzLDE1LjMxQzE5MC41OCw3Ny41LDE4Mi42LDc1LjIxLDE3Ny4xLDcxLjE1eiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yMzAuMTYsNTIuNWMwLTE4LjE5LDEwLjIxLTI0Ljk5LDI1LjY1LTI0Ljk5YzE1LjQ0LDAsMjUuNzEsNi44LDI1LjcxLDI0Ljk5YzAsMTguMjUtMTAuMjcsMjUuMDYtMjUuNzEsMjUuMDYgQzI0MC4zOCw3Ny41NiwyMzAuMTYsNzAuNzYsMjMwLjE2LDUyLjV6IE0yNzAuNjcsNTIuN2MwLTkuNDktMy43My0xNS4zOC0xNC44NS0xNS4zOGMtMTEuMTIsMC0xNC44NSw1Ljg5LTE0Ljg1LDE1LjM4IGMwLDkuNDksMy43MywxNS40NCwxNC44NSwxNS40NEMyNjYuOTQsNjguMTQsMjcwLjY3LDYyLjE4LDI3MC42Nyw1Mi43eiIvPjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMTUxLjg0LDI3Ljk3IDE0MC45NywyNy45NyAxMjEuNTQsNzYuNzggMTMyLjAxLDc2Ljc4IDE0Ni4xNCw0MC42NiAxNTMuNzMsNTkuOTYgMTQ0LjgzLDU5Ljk2ICAxNDEuMzcsNjguNzkgMTU3LjEzLDY4Ljc5IDE2MC4yOCw3Ni43OCAxNzEuNCw3Ni43OCAgIi8+PC9nPjxyZWN0IHg9IjM5MS45NiIgeT0iNTIuODEiIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA2OCAtMC43MDc0IDAuNzA3NCAwLjcwNjggNjQuMjIzMiAzMDAuNjM5NSkiIGNsYXNzPSJzdDAiIHdpZHRoPSI1LjcyIiBoZWlnaHQ9IjQwLjA0Ii8+PHJlY3QgeD0iMzgzLjg3IiB5PSI2MC45MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC43MDcyIC0wLjcwNyAwLjcwNyAwLjcwNzIgNTYuMDEyNiAyOTcuMTE4NSkiIGNsYXNzPSJzdDAiIHdpZHRoPSI1LjcyIiBoZWlnaHQ9IjQwLjA0Ii8+PHJlY3QgeD0iMzY2LjcxIiB5PSIyMS40MiIgdHJhbnNmb3JtPSJtYXRyaXgoMC43MDcxIC0wLjcwNzIgMC43MDcyIDAuNzA3MSA5Ni4xMTgzIDI4MC41ODc4KSIgY2xhc3M9InN0MCIgd2lkdGg9IjQwLjA0IiBoZWlnaHQ9IjUuNzMiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjM5MC43NiwwIDM2Ni41LDI0LjI3IDM0Mi4yMywwIDMzOC4xOCw0LjA1IDM2Ni41LDMyLjM2IDM5NC44MSw0LjA1ICIvPjxyZWN0IHg9IjM3NC44MSIgeT0iMjkuNTEiIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3NCAtMC43MDY4IDAuNzA2OCAwLjcwNzQgOTIuNjM3OCAyODguNTM3NCkiIGNsYXNzPSJzdDAiIHdpZHRoPSI0MC4wNCIgaGVpZ2h0PSI1LjcyIi8+PHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIzOTQuODQsNTIuNjEgNDE5LjExLDI4LjM0IDQxNS4wNiwyNC4yOSAzODYuNzQsNTIuNjEgNDE1LjA2LDgwLjkyIDQxOS4xMSw3Ni44NyAiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjMxNy45NCwyNC4yOSAzMTMuODksMjguMzQgMzM4LjE2LDUyLjYxIDMxMy44OSw3Ni44NyAzMTcuOTQsODAuOTIgMzQ2LjI1LDUyLjYxICIvPjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMzMwLjA5LDEyLjE1IDMyNi4wNCwxNi4xOSAzNjIuNDUsNTIuNjEgMzI2LjA0LDg5LjAyIDMzMC4wOSw5My4wNyAzNzAuNTUsNTIuNjEgIi8+PHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIzOTQuODEsMTAxLjE3IDM2Ni41LDcyLjg1IDMzOC4xOCwxMDEuMTcgMzQyLjIzLDEwNS4yMSAzNjYuNSw4MC45NSAzOTAuNzYsMTA1LjIxICIvPjwvc3ZnPg==", + "valueType": "xs:string" + }, + { + "idShort": "PrimaryColor", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/ThemeSettings/PrimaryColor/1/0" + } + ] + }, + "value": "#0d4453", + "valueType": "xs:string" + }, + { + "idShort": "SecondaryColor", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://mnestix.com/sm/ThemeSettings/SecondaryColor/1/0" + } + ] + }, + "value": "#147f8a", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json b/server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json new file mode 100644 index 000000000..cd0079ee2 --- /dev/null +++ b/server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json @@ -0,0 +1,390 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/TechnicalData", + "submodelElements": [ + { + "idShort": "Function", + "description": [ + { + "language": "de", + "text": "Benennung der technischen Aufgabe eines Ger\u00e4tes" + }, + { + "language": "en", + "text": "description of the technical task of a device" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW605#001" + } + ] + }, + "value": "5/2 way, spring return", + "valueType": "xs:string" + }, + { + "idShort": "Ports_size", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "First", + "description": [ + { + "language": "de", + "text": "Angabe, ob am Produkt ein Flansch vorhanden ist oder nicht" + }, + { + "language": "en", + "text": "specification whether or whether not the product is equipped with a flange" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAL874#004" + } + ] + }, + "value": "Flange", + "valueType": "xs:string" + }, + { + "idShort": "Third_and_Fifth", + "description": [ + { + "language": "de", + "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" + }, + { + "language": "en", + "text": "identifier for the cross section shape of a thread profile" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAA052#008" + } + ] + }, + "value": "G1/8", + "valueType": "xs:string" + }, + { + "idShort": "Secon_and_Forth", + "description": [ + { + "language": "de", + "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" + }, + { + "language": "en", + "text": "identifier for the cross section shape of a thread profile" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAA052#008" + } + ] + }, + "value": "G1/4", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Actuation_Return", + "description": [ + { + "language": "de", + "text": "Federweg der Feder." + }, + { + "language": "en", + "text": "Springstroke." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "http://acplt.org/vocab/Springstroke" + } + ] + }, + "value": "Solenoid_Spring", + "valueType": "xs:string" + }, + { + "idShort": "Flow", + "description": [ + { + "language": "de", + "text": "Angabe \u00fcber den Nennvolumenstrom des Objekts" + }, + { + "language": "en", + "text": "describes the nominal volume flow rate" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI855#002" + } + ] + }, + "value": "750", + "valueType": "xs:string" + }, + { + "idShort": "Weight", + "description": [ + { + "language": "de", + "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t" + }, + { + "language": "en", + "text": "Mass of weight without packaging and transport unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB713#006" + } + ] + }, + "value": "0.26", + "valueType": "xs:string" + }, + { + "idShort": "Rated_current", + "description": [ + { + "language": "de", + "text": "vom Hersteller angegebener Wert des Stromes, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" + }, + { + "language": "en", + "text": "value of the current, resulting from measurements which were determined under specified conditions and rules as defined by the manufacturer" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF726#003" + } + ] + }, + "value": "70", + "valueType": "xs:string" + }, + { + "idShort": "Protection_Class", + "description": [ + { + "language": "de", + "text": "Ausma\u00df des durch ein Geh\u00e4use gebotenen Schutzes vor Zugang zu gef\u00e4hrlichen Teilen und Eindringen von festen Fremdk\u00f6rpern und/oder Wasser, der durch normierte Pr\u00fcfverfahren best\u00e4tigt wurde, angegeben als IP-Einstufung" + }, + { + "language": "en", + "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and/or ingress of water and verified by standardized test methods, expressed as a IP rating" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAG975#013" + } + ] + }, + "value": "IP65", + "valueType": "xs:string" + }, + { + "idShort": "Ambient_Temperature", + "description": [ + { + "language": "de", + "text": "Temperatur des umgebenden Raumes, in dem das Bauteil das Leitungssystem oder die Anlage arbeitet" + }, + { + "language": "en", + "text": "temperature of the surrounding operating environment of a component or system" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ842#001" + } + ] + }, + "value": "-15...+50", + "valueType": "xs:string" + }, + { + "idShort": "Electrical_connection", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" + }, + { + "language": "en", + "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB414#007" + } + ] + }, + "value": "Connector DIN EN 175301-803", + "valueType": "xs:string" + }, + { + "idShort": "Solenoid", + "description": [ + { + "language": "de", + "text": "eindeutiger Identifikator des Produktes" + }, + { + "language": "en", + "text": "unique identifier of the product" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABA671#001" + } + ] + }, + "value": "3050", + "valueType": "xs:string" + }, + { + "idShort": "Operating_Pressure", + "description": [ + { + "language": "de", + "text": "beschreibt die Gr\u00f6\u00dfe des ger\u00e4tesseitigen Lufteingangs" + }, + { + "language": "en", + "text": "describes the size of the device-sided air inlet" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAG867#002" + } + ] + }, + "value": "2...8", + "valueType": "xs:string" + }, + { + "idShort": "Voltage", + "description": [ + { + "language": "de", + "text": "erforderliche elektrische Hilfsenergie, die am Versorgungseingang eines elektrischen Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" + }, + { + "language": "en", + "text": "Required auxiliary electrical energy which must always or at times be present at the supply input for the function of the operating resource to be maintained" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAD220#007" + } + ] + }, + "value": "24", + "valueType": "xs:string" + }, + { + "idShort": "Power_Consumption", + "description": [ + { + "language": "de", + "text": "aus dem Versorgungsnetz, einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" + }, + { + "language": "en", + "text": "power requirement of the device or component during defined operating conditions" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC969#007" + } + ] + }, + "value": "1.6", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json b/server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json new file mode 100644 index 000000000..cf0e55ea2 --- /dev/null +++ b/server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "IAT" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Unit" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Turmstra\u00dfe 46" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "52064" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Aachen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "TU30" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "unkown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json b/server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json new file mode 100644 index 000000000..6e30ebe0a --- /dev/null +++ b/server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json @@ -0,0 +1,309 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/TechnicalData", + "submodelElements": [ + { + "idShort": "Max_operating_pressure", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb (unter normalen Betriebsbedingungen) auftritt bzw. auftreten darf" + }, + { + "language": "en", + "text": "Max. pressure which occurs or may occur in an operating system (under normal operating conditions)" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB836#007" + } + ] + }, + "value": "40", + "valueType": "xs:string" + }, + { + "idShort": "Max_testing_pressure", + "description": [ + { + "language": "de", + "text": "h\u00f6chster Druck, der w\u00e4hrend der erstmaligen oder wiederkehrenden Druckpr\u00fcfung zur Anwendung kommt und zu keiner dauerhaften Form\u00e4nderung, Besch\u00e4digung oder Funktionsst\u00f6rung f\u00fchrt" + }, + { + "language": "en", + "text": "Maximum pressure applied during initial and repeated testing pressure and which does not result in permanent dimensional change, damage or malfunction" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB881#006" + } + ] + }, + "value": "60", + "valueType": "xs:string" + }, + { + "idShort": "Min_operating_temperature", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "minimum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC820#006" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "Max_operating_temperature", + "description": [ + { + "language": "de", + "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC821#006" + } + ] + }, + "value": "150", + "valueType": "xs:string" + }, + { + "idShort": "Max_ambient_temperature_during_operating_phase", + "description": [ + { + "language": "de", + "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" + }, + { + "language": "en", + "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF525#003" + } + ] + }, + "value": "-20", + "valueType": "xs:string" + }, + { + "idShort": "Min_ambient_temperature_during_operating_phase", + "description": [ + { + "language": "de", + "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / kleinster Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht mehr unterschritten werden kann oder darf" + }, + { + "language": "en", + "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / lower limit value of a physical quantity whose value cannot or must not be undershot" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF526#003" + } + ] + }, + "value": "70", + "valueType": "xs:string" + }, + { + "idShort": "Max_dynamic_viscosity", + "description": [ + { + "language": "de", + "text": "h\u00f6chste dynamische Viskosit\u00e4t, f\u00fcr die ein Ger\u00e4t ausgelegt ist oder auszulegen ist, damit es innerhalb seiner Spezifikationen betrieben wird" + }, + { + "language": "en", + "text": "highest dynamic viscosity for which a device is or must be designed to operate within its specified limits" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAQ454#003" + } + ] + }, + "value": "10000", + "valueType": "xs:string" + }, + { + "idShort": "Min_density", + "description": [ + { + "language": "de", + "text": "Kleinste zul\u00e4ssige Dichte des Messstoffes, Betriebsstoffes oder Mediums f\u00fcr einen bestimmungsgem\u00e4\u00dfen Gebrauch des Betriebsmittels" + }, + { + "language": "en", + "text": "Least permissible density of measuring substance, operating substance or medium for use of the operating resource in accordance with its intended purpose" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA044#006" + } + ] + }, + "value": "0.5", + "valueType": "xs:string" + }, + { + "idShort": "Startup_delay", + "description": [ + { + "language": "de", + "text": "Mindestzeit, um vom AUS-Zustand in den EIN-Zustand zu wechseln, wenn die Spannung UON oder gr\u00f6\u00dfer anliegt" + }, + { + "language": "en", + "text": "Least time required to change from the OUT state to the IN state when the voltage is UON or greater" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAB260#005" + } + ] + }, + "value": "0.4", + "valueType": "xs:string" + }, + { + "idShort": "Connection_type_of_process_connection", + "description": [ + { + "language": "de", + "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" + }, + { + "language": "en", + "text": "classification of a process connection according to its fabricated form" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO333#005" + } + ] + }, + "value": "Einschraubst\u00fcck G1A, 1.4571", + "valueType": "xs:string" + }, + { + "idShort": "Style_of_housing", + "description": [ + { + "language": "de", + "text": "Charakterisierung eines Geh\u00e4uses bez\u00fcglich seiner mechanischen Ausf\u00fchrung" + }, + { + "language": "en", + "text": "classification of a housing according to its mechanical design" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO650#004" + } + ] + }, + "value": "Aluminiumgeh\u00e4use F6", + "valueType": "xs:string" + }, + { + "idShort": "IP_protection_class_with_connector", + "description": [ + { + "language": "de", + "text": "erreichbarer Schutzumfang eines fluidtechnischen Ger\u00e4ts in Verbindung mit dem vom Hersteller empfohlenen Konnektor hinsichtlich des Eindringens von Fremdk\u00f6rpern und Wasser" + }, + { + "language": "en", + "text": "scope of protection that can be achieved with a fluidic device in combination with the connector recommended by the manufacturer with respect to the ingress of foreign bodies and water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ971#001" + } + ] + }, + "value": "IP66", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json b/server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json new file mode 100644 index 000000000..b3d8cca5f --- /dev/null +++ b/server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y14_Actuator_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json b/server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json new file mode 100644 index 000000000..1849f1aef --- /dev/null +++ b/server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y21_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21/HierarchicalStructures" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json b/server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json new file mode 100644 index 000000000..e2fc68024 --- /dev/null +++ b/server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N36_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json b/server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json new file mode 100644 index 000000000..bfa6e443d --- /dev/null +++ b/server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Emerson Electric Co." + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Digitaler Stellungsregler" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "8000 West Florissant Avenue, P.O. Box 4100" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "63136" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Saint Louis Missouri" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "US" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FISHER FIELDVUE DVC200" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json b/server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json new file mode 100644 index 000000000..ba8283ce8 --- /dev/null +++ b/server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json @@ -0,0 +1,40 @@ +{ + "data": { + "idShort": "N18_Pumpe_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/DynamicData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json b/server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json new file mode 100644 index 000000000..dd5f44215 --- /dev/null +++ b/server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json @@ -0,0 +1,280 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "N18", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "N18_Frequenzumrichter", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter" + }, + { + "idShort": "HasComponent_N18_Frequenzumrichter", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N18" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N18" + }, + { + "type": "Entity", + "value": "N18_Frequenzumrichter" + } + ] + } + }, + { + "idShort": "N18_Motor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor" + }, + { + "idShort": "HasComponent_N18_Motor", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N18" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N18" + }, + { + "type": "Entity", + "value": "N18_Motor" + } + ] + } + }, + { + "idShort": "N18_Pumpe", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe" + }, + { + "idShort": "HasComponent_N18_Pumpe", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N18" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "N18" + }, + { + "type": "Entity", + "value": "N18_Pumpe" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json b/server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json new file mode 100644 index 000000000..3cccc4102 --- /dev/null +++ b/server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y17_Actuator_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json b/server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json new file mode 100644 index 000000000..4585d170e --- /dev/null +++ b/server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json @@ -0,0 +1,134 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/TechnicalData", + "submodelElements": [ + { + "idShort": "Antriebsflaeche", + "description": [ + { + "language": "de", + "text": "Konstruktive Ausbildung des Antriebes" + }, + { + "language": "en", + "text": "Constructive design of drive" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAJ008#006" + } + ] + }, + "value": "240", + "valueType": "xs:string" + }, + { + "idShort": "Ventiltyp", + "description": [ + { + "language": "de", + "text": "Eine Gruppe von Bauelementen mit gleichen Konstruktionsmerkmalen und gleichem Aufbau, die aufgrund \u00e4hnlicher Herstellungstechniken f\u00fcr die Bauartzulassungspr\u00fcfung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden k\u00f6nnen. Sie werden im allgemeinen von einer Bauartspezifikation erfasst. Anmerkung: In bestimmten F\u00e4llen k\u00f6nnen Bauelemente aus verschiedenen Bauartspezifikationen als zum gleichen Typ geh\u00f6rig betrachtet und daher f\u00fcr die Bauartzulassung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden" + }, + { + "language": "en", + "text": "a group of construction elements with the same construction features and the same construction, which can be collated for the construction type approval and quality conformity controls as a result of similar manufacturing methods. they are generally allocated to a construction type specification. Note: in certain cases, construction element from different construction type specifications can be viewed as belonging to the same type and hence collated for the construction type approval and quality conformity controls" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAD071#006" + } + ] + }, + "value": "Kugelhahn", + "valueType": "xs:string" + }, + { + "idShort": "Hub", + "description": [ + { + "language": "de", + "text": "Kraftbetriebener Weg, den der Lastaufnahmepunkt zur\u00fccklegen kann" + }, + { + "language": "en", + "text": "Power driven path which can be covered by the load reception point" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA361#005" + } + ] + }, + "value": "15", + "valueType": "xs:string" + }, + { + "idShort": "Federbereich", + "description": [ + { + "language": "de", + "text": "Weg der Feder vom unbelasteten Zustand bis zur maximalen Belastung. Bei einer Druckfeder ist es der Weg von der unbelasteten Federl\u00e4nge bis zur Blockl\u00e4nge" + }, + { + "language": "en", + "text": "Path of the spring from unburdened state up to the maximum burden. With a pressure sprint it is the path from unburdened spring length up to the block length" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAB081#004" + } + ] + }, + "value": "0.2\u00851", + "valueType": "xs:string" + }, + { + "idShort": "max_Luftdruck", + "description": [ + { + "language": "de", + "text": "Angabe eines Drucks, der f\u00fcr ein Ventil beschreibt, dass es zu einer bestimmten Einstufung geh\u00f6rt, bei der das Ventil schlie\u00dft" + }, + { + "language": "en", + "text": "specification of a pressure describing, for a valve, that it belongs to a particular classification at which the valve closes" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC533#001" + } + ] + }, + "value": "6", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json b/server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json new file mode 100644 index 000000000..58cc12b6c --- /dev/null +++ b/server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json @@ -0,0 +1,234 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/TechnicalData", + "submodelElements": [ + { + "idShort": "Kommunikationsprotokoll", + "description": [ + { + "language": "de", + "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" + }, + { + "language": "en", + "text": "rules and agreements by that communication partner can interact with each other" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAW333#001" + } + ] + }, + "value": "4 - 20 mA DC/ HART", + "valueType": "xs:string" + }, + { + "idShort": "max_Druck", + "description": [ + { + "language": "de", + "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" + }, + { + "language": "en", + "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAA447#006" + } + ] + }, + "value": "7", + "valueType": "xs:string" + }, + { + "idShort": "min_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" + }, + { + "language": "en", + "text": "The maximum permissible temperature in the external environment of the operating resource" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAE585#006" + } + ] + }, + "value": "-40", + "valueType": "xs:string" + }, + { + "idShort": "max_Umgebungstemperatur", + "description": [ + { + "language": "de", + "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" + }, + { + "language": "en", + "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC022#006" + } + ] + }, + "value": "80", + "valueType": "xs:string" + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" + }, + { + "language": "en", + "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC106#007" + } + ] + }, + "value": "IP66", + "valueType": "xs:string" + }, + { + "idShort": "max_Spannung", + "description": [ + { + "language": "de", + "text": "h\u00f6chster Wert der Spannung, die am Versorgungseingang eines elektrischen Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" + }, + { + "language": "en", + "text": "maximum value of the required voltage which must be temporarily or permanently applied to the supply connection of an operating unit to maintain its function" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAE321#006" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "max_Strom", + "description": [ + { + "language": "de", + "text": "maximal aufnehmbarer Strom" + }, + { + "language": "en", + "text": "maximum of energy which can be drawn" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF954#003" + } + ] + }, + "value": "30", + "valueType": "xs:string" + }, + { + "idShort": "elektrischer_Anschluss", + "description": [ + { + "language": "de", + "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" + }, + { + "language": "en", + "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAB414#007" + } + ] + }, + "value": "ISO M20 x 1.5 Innengewinde", + "valueType": "xs:string" + }, + { + "idShort": "pneumatischer_Anschluss", + "description": [ + { + "language": "de", + "text": "Art und Gr\u00f6\u00dfe des Druckmedienanschlusses eines pneumatischen Bauteils" + }, + { + "language": "en", + "text": "type and size of the pressure media connection on a pneumatic component" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAZ960#002" + } + ] + }, + "value": "G1/4", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json b/server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json new file mode 100644 index 000000000..14f350193 --- /dev/null +++ b/server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y18_MagneticPositioner_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json b/server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json new file mode 100644 index 000000000..780838a66 --- /dev/null +++ b/server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y22_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json b/server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json new file mode 100644 index 000000000..67d2aa42b --- /dev/null +++ b/server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json @@ -0,0 +1,240 @@ +{ + "data": { + "idShort": "TechnicalData", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/TechnicalData", + "submodelElements": [ + { + "idShort": "Wiclung_60Hz", + "modelType": "SubmodelElementCollection", + "value": [ + { + "idShort": "Power", + "description": [ + { + "language": "de", + "text": "Angabe \u00fcber die Aufnahme der Nennleistung in Watt" + }, + { + "language": "en", + "text": "describes the nominal power consumption" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAI843#002" + } + ] + }, + "value": "0.63", + "valueType": "xs:string" + }, + { + "idShort": "Amperage", + "description": [ + { + "language": "de", + "text": "geeigneter (meist gerundeter) Wert eines Stromes zur Beschreibung, Bezeichnung oder Identifizierung eines Bauteiles, eines Ger\u00e4tes, eines Betriebsmittels, einer Einrichtung oder einer Ausr\u00fcstung" + }, + { + "language": "en", + "text": "suitable (normally rounded) value of a current for describing, designating or identifying a component, a device, an operating medium, an installation or equipment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF829#003" + } + ] + }, + "value": "Jan 48", + "valueType": "xs:string" + }, + { + "idShort": "Voltage", + "description": [ + { + "language": "de", + "text": "gemessene aktuelle Motorspannung" + }, + { + "language": "en", + "text": "measured actual motor voltage" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-ABC234#001" + } + ] + }, + "value": "460", + "valueType": "xs:string" + }, + { + "idShort": "Phase", + "description": [ + { + "language": "de", + "text": "Verh\u00e4ltnis vom Betrag der Wirkleistung zur Scheinleistung" + }, + { + "language": "en", + "text": "Relation of the amount of the active power to the false performance" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAN420#001" + } + ] + }, + "value": "cos(phi) = 0.8", + "valueType": "xs:string" + }, + { + "idShort": "speed_", + "description": [ + { + "language": "de", + "text": "Quotient aus Anzahl der Umdrehungen und der zugeh\u00f6rigen Zeitspanne" + }, + { + "language": "en", + "text": "Quotient of the number of revolutions and the corresponding time span" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAC881#006" + } + ] + }, + "value": "1695", + "valueType": "xs:string" + }, + { + "idShort": "Voltage2", + "description": [ + { + "language": "de", + "text": "Ein vom Hersteller angegebener Wert der Spannung, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" + }, + { + "language": "en", + "text": "A voltage value given by the manufacturer resulting from measurement values determined under defined conditions and rules" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-BAH737#004" + } + ] + }, + "value": "440-480", + "valueType": "xs:string" + }, + { + "idShort": "Amperage2", + "description": [ + { + "language": "de", + "text": "geeigneter (meist gerundeter) Wert eines Stromes zur Beschreibung, Bezeichnung oder Identifizierung eines Bauteiles, eines Ger\u00e4tes, eines Betriebsmittels, einer Einrichtung oder einer Ausr\u00fcstung" + }, + { + "language": "en", + "text": "suitable (normally rounded) value of a current for describing, designating or identifying a component, a device, an operating medium, an installation or equipment" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAF829#003" + } + ] + }, + "value": "1.54-1.57", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "Schutzart", + "description": [ + { + "language": "de", + "text": "klassifiziert den Umfang des Schutzes des elektromagnetischen Ger\u00e4tes gegen direktes Ber\u00fchren, gegen Eindringen von festen Fremdk\u00f6rpern und/oder gegen Eindringen von Wasser" + }, + { + "language": "en", + "text": "classifies the scope of the protection of the electromagnetic device against direct contact, against insertion of hard foreign objects and/or infiltration through water" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO885#002" + } + ] + }, + "value": "IP 55", + "valueType": "xs:string" + }, + { + "idShort": "Bauform", + "description": [ + { + "language": "de", + "text": "Auspr\u00e4gung f\u00fcr das Produkt, um so Einzelprodukte einer Produktfamilie oder spezielle Varianten voneinander unterscheiden zu k\u00f6nnen" + }, + { + "language": "en", + "text": "Characteristic to differentiate between different products of a product family or special variants" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ModelReference", + "keys": [ + { + "type": "ConceptDescription", + "value": "0173-1#02-AAO057#002" + } + ] + }, + "value": "IM B5", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json b/server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json new file mode 100644 index 000000000..dc7bf33d5 --- /dev/null +++ b/server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "TU30_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json b/server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json new file mode 100644 index 000000000..476c99d1f --- /dev/null +++ b/server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "N13_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json b/server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json new file mode 100644 index 000000000..63cbe4d79 --- /dev/null +++ b/server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Q28_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json b/server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json new file mode 100644 index 000000000..b7c5f6c77 --- /dev/null +++ b/server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Argus/Flowserve Flow Control GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Flanged Ball Valve" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Rudolf-Plank-Str.2" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "76275" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Ettlingen" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "FK 79" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json b/server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json new file mode 100644 index 000000000..cd70c53ca --- /dev/null +++ b/server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "L11_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json b/server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json new file mode 100644 index 000000000..44fe0b136 --- /dev/null +++ b/server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json @@ -0,0 +1,49 @@ +{ + "data": { + "idShort": "B1_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/DynamicData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json b/server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json new file mode 100644 index 000000000..5911fb138 --- /dev/null +++ b/server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y21_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json b/server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json new file mode 100644 index 000000000..9daa76c5b --- /dev/null +++ b/server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json @@ -0,0 +1,30 @@ +{ + "data": { + "idShort": "aas_xNBLy1C", + "modelType": "AssetAdministrationShell", + "id": "https://wgrp.biz/aas/xNBLy1C", + "derivedFrom": { + "type": "ModelReference", + "keys": [ + { + "type": "AssetAdministrationShell", + "value": "https://mnestix.com/aas/F11BF9F696A3454EBA0AA4503783F141" + } + ] + }, + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://wgrp.biz/xNBLy1C", + "specificAssetIds": [ + { + "name": "assetIdShort", + "value": "xNBLy1" + } + ], + "defaultThumbnail": { + "path": "https://wgrpproductdata.blob.core.windows.net/product-images/00H14DAP.png", + "contentType": "image/png" + } + } + } +} \ No newline at end of file diff --git a/server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json b/server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json new file mode 100644 index 000000000..68d7c356c --- /dev/null +++ b/server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Krohne Messtechnik GmbH" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Durchflussmessger\u00e4t (magnetisch-induktiv)" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Kludwig-Krohne-Stra\u00dfe 5" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "47058" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Duisburg" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "DE" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "OPTIFLUX 4300 C" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json b/server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json new file mode 100644 index 000000000..1b85ad86d --- /dev/null +++ b/server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y39_Pneumatischer_Antrieb_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json b/server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json new file mode 100644 index 000000000..ed05f00c5 --- /dev/null +++ b/server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y20_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20/HierarchicalStructures" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json b/server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json new file mode 100644 index 000000000..b47a497ce --- /dev/null +++ b/server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y14_Valve_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json b/server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json new file mode 100644 index 000000000..7b926a5f6 --- /dev/null +++ b/server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json @@ -0,0 +1,1181 @@ +{ + "data": { + "idShort": "TimeSeries", + "description": [ + { + "language": "de", + "text": "Enth\u00e4lt Zeitreihendaten und Referenzen auf Zeitreihendaten, um diese entlang des Asset\n Lebenszyklus aufzufinden und semantisch zu beschreiben.\n " + }, + { + "language": "en", + "text": "Contains time series data and references to time series data to discover and semantically\n describe them along the asset lifecycle.\n " + } + ], + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/TimeSeries", + "administration": { + "version": "1", + "revision": "1" + }, + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/1/1" + } + ] + }, + "kind": "Template", + "submodelElements": [ + { + "idShort": "Metadata", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Metadata/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "y21_current_value" + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Description/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "Current process value of flow sensor Y21" + } + ] + } + ] + }, + { + "idShort": "Segments", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "ExternalSegment", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/ExternalSegment/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "externalSegment y21_current_value " + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "An example external segment of current process value of valve Y21" + } + ] + }, + { + "idShort": "RecordCount", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "360", + "valueType": "xs:long" + }, + { + "idShort": "StartTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07 17:55:03.579795+00:00", + "valueType": "xs:string" + }, + { + "idShort": "EndTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07T18:54:52.324618+00:00", + "valueType": "xs:string" + }, + { + "idShort": "Duration", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "T1H", + "valueType": "xs:string" + }, + { + "idShort": "SamplingInterval", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "10", + "valueType": "xs:long" + }, + { + "idShort": "SamplingRate", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "State", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "completed", + "valueType": "xs:string" + }, + { + "idShort": "LastUpdate", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07T18:54:52.324618+00:00", + "valueType": "xs:string" + }, + { + "idShort": "File", + "category": "PARAMETER", + "modelType": "File", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/File/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "contentType": "String", + "value": "C:\\Users\\wan\\sciebo\\Lehrstuhl\\PLS-Labor\\Digitalisierung Pumpwerk\\AAS Pumpwerk\\2024\\Test Metadata\\y21_current_value.xlsx" + }, + { + "idShort": "Blob", + "category": "VARIABLE", + "modelType": "Blob", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Blob/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "contentType": "application/json" + } + ] + }, + { + "idShort": "LinkedSegment", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/LinkedSegment/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "linkedSegment y21_current_value " + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "language": "en", + "text": "An example linked segment of current process value of valve Y21" + } + ] + }, + { + "idShort": "RecordCount", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "StartTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07T17:55:00", + "valueType": "xs:string" + }, + { + "idShort": "EndTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "2024-02-07T18:55:00", + "valueType": "xs:string" + }, + { + "idShort": "Duration", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "T1H", + "valueType": "xs:string" + }, + { + "idShort": "SamplingInterval", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "10", + "valueType": "xs:long" + }, + { + "idShort": "SamplingRate", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "State", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "complete", + "valueType": "xs:string" + }, + { + "idShort": "LastUpdate", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "Endpoint", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Endpoint/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "http://10.42.0.114:8086", + "valueType": "xs:string" + }, + { + "idShort": "Query", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Query/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": "from(bucket: \"iat\")\n |> range(start: {range_start}, stop: {range_stop}) \n |> filter(fn: (r) => r._measurement == \"y21_current_value\"", + "valueType": "xs:string" + } + ] + }, + { + "idShort": "InternalSegment", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segments/InternalSegment/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Name", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ] + }, + { + "idShort": "Description", + "category": "PARAMETER", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ] + }, + { + "idShort": "RecordCount", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "StartTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "EndTime", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "Duration", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "SamplingInterval", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "SamplingRate", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "State", + "category": "PARAMETER", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "LastUpdate", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:string" + }, + { + "idShort": "Records", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Records/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "One", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Record", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/TimeSeries/Record/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "value": [ + { + "idShort": "Time", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/idta/TimeSeries/RelativePointInTime/1/1\n " + } + ] + }, + "qualifiers": [ + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/SubmodelTemplates/Cardinality/1/0\n " + } + ] + }, + "value": "OneToMany", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + }, + { + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "\n https://admin-shell.io/SubmodelTemplates/AllowedIdShort/1/0\n " + } + ] + }, + "value": "Time[\\d{2,3}]", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "AllowedIdShort" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "sampleAccelerationX", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://sample.com/AccelerationX/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "sampleAccelerationY", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://sample.com/AccelerationY/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + }, + { + "idShort": "sampleAccelerationZ", + "category": "VARIABLE", + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://sample.com/AccelerationZ/1/1" + } + ] + }, + "qualifiers": [ + { + "value": "ZeroToOne", + "kind": "ConceptQualifier", + "valueType": "xs:string", + "type": "Cardinality" + } + ], + "valueType": "xs:long" + } + ] + } + ] + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json b/server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json new file mode 100644 index 000000000..b0e8dd364 --- /dev/null +++ b/server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json @@ -0,0 +1,221 @@ +{ + "data": { + "idShort": "Nameplate", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/Nameplate", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" + } + ] + }, + "submodelElements": [ + { + "idShort": "ManufacturerName", + "description": [ + { + "language": "de", + "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + }, + { + "language": "en", + "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "GRUNDFOS" + } + ] + }, + { + "idShort": "ManufacturerProductDesignation", + "description": [ + { + "language": "de", + "text": "Kurze Beschreibung des Produktes (Kurztext)" + }, + { + "language": "en", + "text": "Short description of the product (short text)" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAW338#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "UPS 25-60 B 180" + } + ] + }, + { + "idShort": "Address", + "modelType": "SubmodelElementCollection", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAQ832#005" + } + ] + }, + "value": [ + { + "idShort": "Street", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO128#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Park u. 8" + } + ] + }, + { + "idShort": "Zipcode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO129#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "H-2045" + } + ] + }, + { + "idShort": "CityTown", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Toeroekbalint" + } + ] + }, + { + "idShort": "NationalCode", + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO132#002" + } + ] + }, + "value": [ + { + "language": "de", + "text": "HU" + } + ] + } + ] + }, + { + "idShort": "ManufacturerProductFamily", + "description": [ + { + "language": "de", + "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" + }, + { + "language": "en", + "text": "2nd level of a 3 level manufacturer specific product hierarchy" + } + ], + "modelType": "MultiLanguageProperty", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAU731#001" + } + ] + }, + "value": [ + { + "language": "de", + "text": "Grundfos Pumpe 96281498" + } + ] + }, + { + "idShort": "YearOfConstruction", + "description": [ + { + "language": "de", + "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" + }, + { + "language": "en", + "text": "Year as completion date of object" + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAP906#001" + } + ] + }, + "value": "2007", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json b/server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json new file mode 100644 index 000000000..73a33212b --- /dev/null +++ b/server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json @@ -0,0 +1,208 @@ +{ + "data": { + "idShort": "HierarchicalStructures", + "modelType": "Submodel", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" + } + ] + }, + "submodelElements": [ + { + "idShort": "TU20", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" + } + ] + }, + "statements": [ + { + "idShort": "B2", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2" + }, + { + "idShort": "HasEquipmentModule_B2", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU20" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU20" + }, + { + "type": "Entity", + "value": "B2" + } + ] + } + }, + { + "idShort": "Pipe21", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." + } + ], + "modelType": "Entity", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" + } + ] + }, + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21" + }, + { + "idShort": "HasEquipmentModule_Pipe21", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." + } + ], + "modelType": "RelationshipElement", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" + } + ] + }, + "first": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU20" + } + ] + }, + "second": { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" + }, + { + "type": "Entity", + "value": "TU20" + }, + { + "type": "Entity", + "value": "Pipe21" + } + ] + } + } + ], + "entityType": "SelfManagedEntity", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20" + }, + { + "idShort": "ArcheType", + "category": "CONSTANT", + "description": [ + { + "language": "en", + "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." + } + ], + "modelType": "Property", + "semanticId": { + "type": "ExternalReference", + "keys": [ + { + "type": "GlobalReference", + "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" + } + ] + }, + "value": "OneDown", + "valueType": "xs:string" + } + ] + } +} \ No newline at end of file diff --git a/server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json b/server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json new file mode 100644 index 000000000..bddc40c81 --- /dev/null +++ b/server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "F15_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15/TechnicalData" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15/Nameplate" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json b/server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json new file mode 100644 index 000000000..f99693ba3 --- /dev/null +++ b/server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json @@ -0,0 +1,31 @@ +{ + "data": { + "idShort": "Y14_AAS", + "modelType": "AssetAdministrationShell", + "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14/AAS/ver:1.0&rev:1.0", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14" + }, + "submodels": [ + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14/Nameplate" + } + ] + }, + { + "type": "ModelReference", + "keys": [ + { + "type": "Submodel", + "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14/TechnicalData" + } + ] + } + ] + } +} \ No newline at end of file From 1287a430b426d1c0f2ec692c2e86b3d30eccbea2 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 12 Mar 2026 13:00:12 +0100 Subject: [PATCH 63/76] add gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8e3325572..b98e56f58 100644 --- a/.gitignore +++ b/.gitignore @@ -32,7 +32,7 @@ compliance_tool/aas_compliance_tool/version.py server/app/version.py # Ignore the content of the server storage -server/input/ -server/storage/ +server/example_configurations/repository_standalone/input/ +server/example_configurations/repository_standalone/storage/ test.py /storage/ From e691383c9f2915c57583d7c687a7095ef92c4f60 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Fri, 13 Mar 2026 10:41:34 +0100 Subject: [PATCH 64/76] Ignore server/storage dicrectory --- .gitignore | 1 + ...e4ab22cbb96b078e42f0b7a7b57f121544cb1.json | 31 - ...106ba8a4ccd64b74fa68ee5f35c603a626c2e.json | 136 -- ...553891c1314fa37721b334d143adffd5470b3.json | 31 - ...3491c3a4a20593fc7d925fac4c6aa66916a3b.json | 31 - ...53a0432f269a716776577ec89091983c64795.json | 31 - ...a22cf3c97f21b79155efc15262eee7fc7fd67.json | 221 --- ...8bc07c9bcaa6c1366cd36b44960565c2641d2.json | 31 - ...05d19efbc09615ef40a850f89292614b8a914.json | 221 --- ...552b1e02ca1b1302eb4e0b61c30e7a959ed34.json | 284 ---- ...b3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json | 220 --- ...97dead8d84ad3a33a7c5ff09b410deffaf331.json | 221 --- ...b72dfe1dc6b77ef28f956d70d49d29878b893.json | 309 ---- ...7b67f1ea690f1dac00433d769f334afba76df.json | 31 - ...eb697e3ea37b3ecf796b6aecc5c093b048717.json | 509 ------- ...f6697c83305ec1874277cfeb379aee2d5804f.json | 221 --- ...dbdd7773c2a4119b81aeb8df2602b950877dc.json | 334 ----- ...96ab50587bce87e2f9b12df20290619016351.json | 84 -- ...dce99e5b21775fc28a1cfae1514aac1bd7634.json | 359 ----- ...748b5d5319adde2cd6c88432f2b22345b6491.json | 40 - ...2e7ae6c49bee97ad233140d30fba802e2d7a1.json | 221 --- ...00686cd29e75363a2d8f59b1d315b958bc8ed.json | 221 --- ...5b54f96a43b915c5c508b1863b9fe9de546f6.json | 495 ------- ...63f696f2441a3ed4030e277d44d64f937ddd3.json | 459 ------ ...17b3f92547c2aed8c417ee0fd48c28198e3bd.json | 31 - ...2cacdcc769000e5c4d0e80ac5cde735eec993.json | 221 --- ...43e8710cd0e1f91cf7310524c762cace48e81.json | 221 --- ...bedcb91061b10f30ea0c9d943bf7757fe4e4c.json | 31 - ...4a9bcaa873662aa813f1c989fc1f762c6c1a8.json | 221 --- ...7b293d9623fe56b3a78b25033156bf81bb3c7.json | 31 - ...ac8ea6de2405362dc0e7850d2a30352ad332d.json | 49 - ...d98cfbf9f524c651136459c622f8228902ceb.json | 31 - ...06f651382d45795cf3a9a0082245edfd09e99.json | 31 - ...ed122a558bd1e15292021a45a1100888fed50.json | 31 - ...b61bcd16703126019650509f56b464d963c10.json | 220 --- ...7cd12787de7c92a1f439a6d3a5bc793b026ab.json | 31 - ...dea45f60ec49debda0d5d0eb0e9a019612acf.json | 134 -- ...c1956a07b6534dba3a39b2de7438598636658.json | 31 - ...112a95a63d60732565673080ccb293d6420d9.json | 221 --- ...fc9edfb2293605e159bdb76cbcbdf783b1378.json | 31 - ...48f275e4a3f6c196fb214f08852ef594f1f24.json | 26 - ...3fdeec2206c7eb496e442c49e334c5c9e9f9b.json | 384 ----- ...3819a8c05bf22e27455df0be93c2919d5af21.json | 221 --- ...8bf888b4ce781e716830381a104d3dfc9cab8.json | 134 -- ...5a21cd52783d2f8025c125bee6c42ad156dca.json | 31 - ...870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json | 359 ----- ...8f70c9154087ddf27e428533f89b818b7a921.json | 31 - ...4755f359ad7cbf1863457c54782e0b9903b63.json | 31 - ...51072241ce59e82de32e74ad020d937319d8a.json | 221 --- ...e6acaf396910f3d0464f0f4c853222d338da6.json | 31 - ...ea14b7bbca536f7c81241fc11d1b1c2c54766.json | 31 - ...15c9f2542c45cd74c263a2a907048ea576f93.json | 221 --- ...834b78994c08382e389683e3256ffabb06cd9.json | 221 --- ...ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json | 208 --- ...2f8a72c522c6f70ba9e25f5eed1c333bbe471.json | 221 --- ...52b41bfb22ca367ed82d43649ddfb9b98d900.json | 31 - ...b083095b518932696927546beaefb61b213a4.json | 34 - ...712c69fbf92692075bb7bdf5f6ba53d0c965d.json | 31 - ...3079fd13487666c72580bc02df83f7cb8dc80.json | 31 - ...718e28d55c59b1d8219daacb4fdc5334a5fd2.json | 221 --- ...327813f9200f4b431e9ae75eebf9b98d8b2b4.json | 31 - ...46c218f861f89f327e7764c2eb864f7fb1144.json | 209 --- ...090f7688f853c05cfd8bb1deaaf37a2cf96d8.json | 31 - ...146f16eda31e5afe2dc8e4c3528cf61a5b1de.json | 31 - ...9cdaa4e60975917ef731467397daa8c177141.json | 31 - ...8d6dcb9f2c7170d69990755d31628758cfa62.json | 134 -- ...bff00d8e89b3dacd9f2acc9f82a457bf57278.json | 1250 ----------------- ...ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json | 31 - ...7b7050cc54a45d607c97b381000996107c272.json | 31 - ...1ecbe99426bf178f531d7b697c6e0917580fb.json | 221 --- ...36e3a42e1800f68ca04ed11fd10c2daa9426c.json | 424 ------ ...b3e5124ca0074335397ec0a841862c43352de.json | 10 - ...f343eef78556826ca6cd60414360de305bae8.json | 134 -- ...7e5dae06eb662c6c5deee15ffd68ddff2a8db.json | 221 --- ...c691aba6afb5f4e168e7ebfbdf553de186a49.json | 31 - ...65ad747e83c32006e3fe293f531c17d124ec2.json | 384 ----- ...10b00988c057572f5ff5b082bc965085aa11e.json | 31 - ...76ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json | 221 --- ...b5746d5a7b4a162a8a712060d8b6ee31d426f.json | 221 --- ...6169b998dc2bf7b82eacb9b8be212f04045b3.json | 209 --- ...2cbff8b373759263ac9f41014a76f75096b8c.json | 31 - ...93959038d700ba8bdb6692dcbd5d29958f1a5.json | 31 - ...31868cb9c7651b7533d8588b93d1895aac092.json | 208 --- ...e96136cf4b665ad4d81dabfa4f823e009396f.json | 31 - ...5bff6f9b8b82a4a7187ce12a7882b18e51aea.json | 334 ----- ...a3387718f3236c1b1aaf2b809b397df5c60b3.json | 31 - ...2f0ddd1833540bd997b37c924d9573b020725.json | 221 --- ...a22be573a79859e09196c847ba53af9bcf94a.json | 31 - ...2f669df6651faf6973c33f2d20447b0d2f298.json | 31 - ...8d43cc64c96fa52f8e2c0f8164d56a4c2872a.json | 31 - ...dac95a9b0d7e3779e64d39e4e0440c59920ba.json | 31 - ...ba193c9d3f180ad36c9611ffc98bd17fb0e42.json | 259 ---- ...8e894a0d775dffceed1d7d80d96540d0ec747.json | 589 -------- ...144902d139910c6cb97d3d30847949ddd7757.json | 31 - ...17f37740b2d34443b39b5285d68c5ace055cc.json | 31 - ...5873aab80273f6efd44e874ad7558a7018106.json | 31 - ...b4b9fc3a89cc12906af6700961f7be9d78c86.json | 221 --- ...2b85c464c5400ca91c27b624646b2a12cf141.json | 31 - ...cd8834ff1dc67e56e46382544a2237774f215.json | 134 -- ...4eaa1c4a859752ab737b125a2e643f275fb3a.json | 259 ---- ...289bb329b7e9e22be896c6e4502980698d9da.json | 31 - ...6ffe95e9fe7df5d6849b020aaaa146602855c.json | 221 --- ...60208d89f4185ef423c84aa712c4807c80877.json | 221 --- ...b6527a7ffea802467dc7eb68005acfd0736bb.json | 221 --- ...746cf0075bf056c4a59e30ef73e03fe829216.json | 84 -- ...cf72833e5727241323726e69505a7a27f6b15.json | 31 - ...b1d8dac579c34192cd2bf71002dd6ece23b4f.json | 221 --- ...b2c2dd086de0626fdf39c9c8715c956fac6e1.json | 31 - ...25bc0f461b488ca41551b3e466e6b5574e636.json | 31 - ...eb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json | 221 --- ...255e23e8d755cdc8560196797bc9e5dbb6786.json | 31 - ...5dc3a2ca817db532ee6e884307c67ffad6a65.json | 37 - ...2f3678174ad638fbf17eee94d903a8a10f837.json | 31 - ...15d8a6b8c6279f0ada0de12a3b0180c05addd.json | 31 - ...4814aad5996bd76dc7d876caf959593822051.json | 208 --- ...297e7876d585b556a5d0a814aef014441b76c.json | 31 - ...e77d1bc1168598783a9b38e0f7b501955697f.json | 221 --- ...594df707f550709e6a2272e58bdc477ccb974.json | 31 - ...3cee8df719800973a323c977bf461752a032c.json | 208 --- ...4bc09db7bb700d3ac13d1d7d636a25e215939.json | 221 --- ...6536105609c47a3412078af2fae99212d8220.json | 221 --- ...3c8b05f6c2e5d40bafd32f81e82c00b74b479.json | 31 - ...efb6270b578e675aca163ad538fabcc133280.json | 31 - ...6ce961991c163ed3a710f31a7b34edd7380e9.json | 208 --- ...1a2298ea454b005f24114c461322bddb0a44d.json | 221 --- ...805ca5711a5ce716cfbadb01421f50f3809ff.json | 209 --- ...2248a68a8e28d04fc32c9fd8e89ec3d530e39.json | 31 - ...93586fcb9ccf486c2fdb1b07cfa7cc89d4705.json | 34 - ...8ccfd3443d5ce31e97e011dd707cc458dc879.json | 31 - ...3fd7b11d1797622ad0e42b843101a5ceb0271.json | 31 - ...2aa08e37b462c4605aabbb3aab9a2b1f2641d.json | 31 - ...37988ae346ac3420f10adf74676e062095f5d.json | 31 - ...fc95894643e48c1c25b7a2a8f6ee2ce4e5230.json | 31 - ...c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json | 31 - ...87305b1849887103293165fe37a3097f10e3a.json | 221 --- ...776415e2dd317aa25280b81200a13a4bf00c6.json | 26 - ...0a6fde81c2c075e557c78f0b8e70e77e80d8e.json | 280 ---- ...50b02e9a06ac48283712777c00b83883aec69.json | 352 ----- ...cb0bab6b97dc840af071bf5f78240ea2817ec.json | 31 - ...4b27318cec0c9c920a1dfe7e81747f38b23c4.json | 221 --- ...f92aa811f098b245ade2c35bdd2877a7f392a.json | 31 - ...f4ccad065d86b419ede6de15e8e8205618805.json | 84 -- ...eedc8715dd3995776964d324419d60936659b.json | 134 -- ...6cd70bb4edc4f9368bcb22813295c2fdf32d0.json | 34 - ...e7122257ca9f64fa978161ea3345a1dd088f9.json | 221 --- ...1695d98bc5e37bb666cc21ad8db455fa58576.json | 221 --- ...e55007660a8d2ae3f2c33e9bacf75e4349e11.json | 459 ------ ...265a43c8bc6cb9ab298f1dbdcd549418973e3.json | 221 --- ...ad6436e237d26ed293cce1fc0d453d261642e.json | 31 - ...fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json | 31 - ...9134fdc546a2a138370eadeb13e0ac0e3cb26.json | 221 --- ...bac8218a44bf38ae47d4a802a328cb49de4e6.json | 415 ------ ...6ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json | 40 - ...2694552cc53e695d67403463dba14c0c198e2.json | 280 ---- ...7b9e58b1061df45de7062a2c385ac9352a5a7.json | 221 --- ...710ac999ae3fba5342474ba509f9287e67d3a.json | 221 --- ...a88b3d59b83c23f05279aa2b565ac4b16ffaa.json | 31 - ...9edce6ea15699f8e1386bb83be5023eeeaf47.json | 34 - ...a51adb568afb181d5a391c064d075823ab3da.json | 31 - ...18ed0918a3e4822f04a02e2c8b5c484b0ba85.json | 34 - ...e16cd38327cecf90a926a4e3d36778297ca18.json | 221 --- ...a5a2a6634bc0b49cece36a48ede86f5b51a68.json | 209 --- ...2997e04d6bf83efac699e3fa136d80d7948a2.json | 515 ------- ...0eba5a4f1e7b661269abcb39b21abc3b93577.json | 31 - ...751f53f092d4ff6ecac7a23e8edc5d96314ad.json | 31 - ...503953d1faa0ef6c6d4398e2a87a2aa782afb.json | 31 - ...4d7dfb14ec98f2088e7c3d462ee108acb90cd.json | 280 ---- ...04be71639d0293e6f37aa191b386f44c09975.json | 208 --- ...dae9247de3409255173a055ba49af014744c0.json | 221 --- ...f3957e81f217002077611430138188c23fb06.json | 31 - ...3f9e95ce4d800f1f2410feac3bab25bccb4d0.json | 259 ---- ...e713c5feee2c75a832f8cbc7f49183d1035f1.json | 283 ---- ...62bb0a6b7508747aea81f0a2de8c3510ee94e.json | 31 - ...8ba8246f0b3df52414ef1724e3858a3b90406.json | 31 - ...b302b4ca34c50f8b78b04f078f6a90f429bc1.json | 31 - ...83b5d90ab9d76f69214872b8f56333b4eec06.json | 221 --- ...de389f3d78ec4872047bed16973ad2d8de471.json | 221 --- ...3daccaf453c71e1e7684a7f622cf1d42a1031.json | 49 - ...fae95b9eead454e7f0b95405362846b9859c8.json | 221 --- ...b3279f412af90d324eb292b0108cec8a7ae21.json | 221 --- ...06ee07cb7f396769a5e7553937a09acef0375.json | 84 -- ...57309ffe09dae1acec27145dc3795502a3bfc.json | 221 --- ...6ff1f1b0d713850fa7e8033e9601268f0b0fa.json | 221 --- ...cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json | 221 --- ...d41007aa50220d85bc69c5366220aa7d80112.json | 259 ---- ...2214c9ce67ed462f7daf0563eb16a942e4ede.json | 40 - ...88ae7014c85265d818a24d5109d2e25c99609.json | 220 --- ...e48693e34ef1fbf83cebe290bc9f55ac2a7aa.json | 424 ------ ...8a75ac4097e900999c4d45f001dd15fcb2958.json | 209 --- ...17cbe4f17fefed14f4ef777316007a0a045ce.json | 208 --- ...e65df7b33d35df093479a0381f14d28a8c557.json | 34 - ...7508e0d340f28ca992c55c43c1e146cbcb75c.json | 31 - ...39a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json | 34 - ...95314a6afd88c2f27c3f95be8d74d69042e5e.json | 31 - ...d495e60e52003b4c91d351af7a3dddb1c2b37.json | 31 - ...6f750d79014b4c63ff782d28bbd01f6641b79.json | 221 --- ...198a9dafe02e24ccdaca582f02af348c3074a.json | 31 - ...feef105ccabad344a17d5a4b35ff45be854fa.json | 31 - ...db7fecaaa628d8ea1eb325d09f4f1502ec77c.json | 471 ------- ...6bcc52e66214c0a51ef0f93842af6492699ef.json | 31 - ...515df1369ae642a7166d7f62b32dba9f05e9f.json | 415 ------ ...43f06bc08ab63281b5e36085f6a54601877e1.json | 208 --- ...e0fe3f3aab76ec769b2074a997f4e21f62fc6.json | 31 - ...8941b49cffcb1811d234af2564b0d30e3ee5e.json | 31 - ...9bf4fb1de7070e8cc5429bc537c70481c5fa5.json | 208 --- ...f7831eedb9ee52c098235709a1aa770d05420.json | 159 --- ...517658b305a8d88449526fb9ecb6023ea6523.json | 31 - ...e0cd3b04cb02d228de803726945c86afd210e.json | 509 ------- ...a3f0f1e76ef2ce78787446797edd65c994b56.json | 221 --- ...b1e644368914347b1389145255fa279b2b749.json | 31 - ...d17ec24da30562e0752f6e05ac4e9df000cac.json | 31 - ...3e75aedffadadff270d266aca3bbc1d8c27ec.json | 17 - ...6e9d06ad9e418129897b1b03de845a405e16b.json | 496 ------- ...d8a8986d385d7a3fc20499572d965f6702f11.json | 31 - ...ea2d9329a85dc7318d70cf6f5e975ffb8972e.json | 34 - ...fd68f2c25bbe8235df30fbcedd2b277054cdc.json | 221 --- ...ae1281b21b44c78359629d9b068b290cd0309.json | 31 - ...218d98ca6b10fbd18327dde27c7fa0770434d.json | 280 ---- ...cb479fdc289ba68243dcfe2dda846416c4a07.json | 221 --- ...320d3eca5988b8ac476758828d9df18c428ed.json | 31 - ...ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json | 221 --- ...1c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json | 31 - ...2a933377f264a258747e18e21503d1b014ce8.json | 31 - ...0bceda9260f61d56cd44bf1352ac0ebb1e353.json | 409 ------ ...342a566820c435e8b618ac11f838eaa40bf69.json | 221 --- ...1cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json | 31 - ...25c0d9b94e5eea352a0869bfff8ce84e57894.json | 280 ---- ...6e3fc262c970765b40c65c6927b1513c200a9.json | 40 - ...78ceaf1d34ee6dfbf90ec8c20c50c95459518.json | 221 --- ...6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json | 434 ------ ...317e2714e01b072a8fff6637b20a39e42440c.json | 352 ----- ...62fb1af6c8494b41bff45b4ad69b6a1471845.json | 221 --- ...fb806ba237b4ae9851292a1e529a29a6c3459.json | 221 --- ...4b7f766bc75be0aaba7ba96dafefcf0308cfa.json | 315 ----- ...e1464d50506f9d959205b8ff0ea11e725f608.json | 31 - ...e8d106f541561dc5b5c9da41a7b27feb558b4.json | 31 - ...b63c8fd9f675db5b9eceba930f3d6b348db46.json | 221 --- ...e88335a8ff43a3a73bbe0e0f8ee64245064a1.json | 31 - ...84bda5f67789a3138517df25af645738ae66c.json | 31 - ...7df8f980f5293a29b60c8f3e33e1828b86e61.json | 209 --- ...2c59a776fc6f8cfc7726d205600616fd78882.json | 70 - ...4e0f9e0528f7e5adafabde9219e281e34fe1a.json | 390 ----- ...6b789142a5dffe21da1ad7c000802ab6ea731.json | 221 --- ...3c2c70043461183ccddce31a397a7a7e7fd19.json | 309 ---- ...0001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json | 31 - ...6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json | 31 - ...7cc386d5e5fc420a71ebe8c143c156b88964f.json | 31 - ...0b1eb451a34b32fccf98c21138a23458cda95.json | 221 --- ...c584930331b94ea66a0ac84a9fc108f4b7ae2.json | 40 - ...54fc450894ad7a9ee223730411b6cc6762a3e.json | 280 ---- ...a46cbcd84dedd2d535641e6ed74ef466b4a81.json | 31 - ...fb99324b2317539f92ae7f3f56f43a0b5b8d2.json | 134 -- ...ca5402c8de56264d86e753fe6e2e4b703c38e.json | 234 --- ...d1b6a3673aae74c0bb001f319d230327ae2a3.json | 31 - ...4bf955fe6da0c228af1354e79f5fe1bf4d8a5.json | 31 - ...78b78c7ae2111975f1112ead0d1d6d8233c41.json | 240 ---- ...eb82c4327af3685863dc5d3557a4939a3386c.json | 31 - ...87ce239d61c29ace2ec5cffcaba3ad4485479.json | 31 - ...2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json | 31 - ...01673681674b766ab9e8acc48c69f74379521.json | 221 --- ...f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json | 31 - ...4f0369c63322d5c9b5fac3e42050c7cd05d81.json | 49 - ...39e3216cf103ff9ed0ab01cbf578119f457bb.json | 31 - ...512a2d14ac4a70f636d41662e1cd64abbd743.json | 30 - ...fc9abccdfb19b455ae7cbfba3c328a4938920.json | 221 --- ...ba7388ab9d8571c3757da8b139c6d6309db48.json | 31 - ...7c12453864c488bc9f1e2ee293058bb6b2b0e.json | 31 - ...3a8ff45bbccfca555b3405cb9d5f0c4deab46.json | 31 - ...8eef62fce103f9a1b129031a85dfe814e32a2.json | 1181 ---------------- ...882eb90e8e01d0a84530e3f3e13aadca1a51d.json | 221 --- ...f6d111f8ae3f2d1885df4b4f5d349334695eb.json | 208 --- ...f5329b75692b4747e15807f126ca62cb5c12b.json | 31 - ...06c38c9410554b7bb0862a64066b3896ad469.json | 31 - 273 files changed, 1 insertion(+), 41154 deletions(-) delete mode 100644 server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json delete mode 100644 server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json delete mode 100644 server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json delete mode 100644 server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json delete mode 100644 server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json delete mode 100644 server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json delete mode 100644 server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json delete mode 100644 server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json delete mode 100644 server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json delete mode 100644 server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json delete mode 100644 server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json delete mode 100644 server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json delete mode 100644 server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json delete mode 100644 server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json delete mode 100644 server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json delete mode 100644 server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json delete mode 100644 server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json delete mode 100644 server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json delete mode 100644 server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json delete mode 100644 server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json delete mode 100644 server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json delete mode 100644 server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json delete mode 100644 server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json delete mode 100644 server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json delete mode 100644 server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json delete mode 100644 server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json delete mode 100644 server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json delete mode 100644 server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json delete mode 100644 server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json delete mode 100644 server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json delete mode 100644 server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json delete mode 100644 server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json delete mode 100644 server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json delete mode 100644 server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json delete mode 100644 server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json delete mode 100644 server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json delete mode 100644 server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json delete mode 100644 server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json delete mode 100644 server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json delete mode 100644 server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json delete mode 100644 server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json delete mode 100644 server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json delete mode 100644 server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json delete mode 100644 server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json delete mode 100644 server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json delete mode 100644 server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json delete mode 100644 server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json delete mode 100644 server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json delete mode 100644 server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json delete mode 100644 server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json delete mode 100644 server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json delete mode 100644 server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json delete mode 100644 server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json delete mode 100644 server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json delete mode 100644 server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json delete mode 100644 server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json delete mode 100644 server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json delete mode 100644 server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json delete mode 100644 server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json delete mode 100644 server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json delete mode 100644 server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json delete mode 100644 server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json delete mode 100644 server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json delete mode 100644 server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json delete mode 100644 server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json delete mode 100644 server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json delete mode 100644 server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json delete mode 100644 server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json delete mode 100644 server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json delete mode 100644 server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json delete mode 100644 server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json delete mode 100644 server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json delete mode 100644 server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json delete mode 100644 server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json delete mode 100644 server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json delete mode 100644 server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json delete mode 100644 server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json delete mode 100644 server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json delete mode 100644 server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json delete mode 100644 server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json delete mode 100644 server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json delete mode 100644 server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json delete mode 100644 server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json delete mode 100644 server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json delete mode 100644 server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json delete mode 100644 server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json delete mode 100644 server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json delete mode 100644 server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json delete mode 100644 server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json delete mode 100644 server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json delete mode 100644 server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json delete mode 100644 server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json delete mode 100644 server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json delete mode 100644 server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json delete mode 100644 server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json delete mode 100644 server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json delete mode 100644 server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json delete mode 100644 server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json delete mode 100644 server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json delete mode 100644 server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json delete mode 100644 server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json delete mode 100644 server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json delete mode 100644 server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json delete mode 100644 server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json delete mode 100644 server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json delete mode 100644 server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json delete mode 100644 server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json delete mode 100644 server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json delete mode 100644 server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json delete mode 100644 server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json delete mode 100644 server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json delete mode 100644 server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json delete mode 100644 server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json delete mode 100644 server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json delete mode 100644 server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json delete mode 100644 server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json delete mode 100644 server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json delete mode 100644 server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json delete mode 100644 server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json delete mode 100644 server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json delete mode 100644 server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json delete mode 100644 server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json delete mode 100644 server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json delete mode 100644 server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json delete mode 100644 server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json delete mode 100644 server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json delete mode 100644 server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json delete mode 100644 server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json delete mode 100644 server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json delete mode 100644 server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json delete mode 100644 server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json delete mode 100644 server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json delete mode 100644 server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json delete mode 100644 server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json delete mode 100644 server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json delete mode 100644 server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json delete mode 100644 server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json delete mode 100644 server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json delete mode 100644 server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json delete mode 100644 server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json delete mode 100644 server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json delete mode 100644 server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json delete mode 100644 server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json delete mode 100644 server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json delete mode 100644 server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json delete mode 100644 server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json delete mode 100644 server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json delete mode 100644 server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json delete mode 100644 server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json delete mode 100644 server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json delete mode 100644 server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json delete mode 100644 server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json delete mode 100644 server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json delete mode 100644 server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json delete mode 100644 server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json delete mode 100644 server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json delete mode 100644 server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json delete mode 100644 server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json delete mode 100644 server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json delete mode 100644 server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json delete mode 100644 server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json delete mode 100644 server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json delete mode 100644 server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json delete mode 100644 server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json delete mode 100644 server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json delete mode 100644 server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json delete mode 100644 server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json delete mode 100644 server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json delete mode 100644 server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json delete mode 100644 server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json delete mode 100644 server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json delete mode 100644 server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json delete mode 100644 server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json delete mode 100644 server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json delete mode 100644 server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json delete mode 100644 server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json delete mode 100644 server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json delete mode 100644 server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json delete mode 100644 server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json delete mode 100644 server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json delete mode 100644 server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json delete mode 100644 server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json delete mode 100644 server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json delete mode 100644 server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json delete mode 100644 server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json delete mode 100644 server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json delete mode 100644 server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json delete mode 100644 server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json delete mode 100644 server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json delete mode 100644 server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json delete mode 100644 server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json delete mode 100644 server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json delete mode 100644 server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json delete mode 100644 server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json delete mode 100644 server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json delete mode 100644 server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json delete mode 100644 server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json delete mode 100644 server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json delete mode 100644 server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json delete mode 100644 server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json delete mode 100644 server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json delete mode 100644 server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json delete mode 100644 server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json delete mode 100644 server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json delete mode 100644 server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json delete mode 100644 server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json delete mode 100644 server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json delete mode 100644 server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json delete mode 100644 server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json delete mode 100644 server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json delete mode 100644 server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json delete mode 100644 server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json delete mode 100644 server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json delete mode 100644 server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json delete mode 100644 server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json delete mode 100644 server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json delete mode 100644 server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json delete mode 100644 server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json delete mode 100644 server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json delete mode 100644 server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json delete mode 100644 server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json delete mode 100644 server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json delete mode 100644 server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json delete mode 100644 server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json delete mode 100644 server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json delete mode 100644 server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json delete mode 100644 server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json delete mode 100644 server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json delete mode 100644 server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json delete mode 100644 server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json delete mode 100644 server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json delete mode 100644 server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json delete mode 100644 server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json delete mode 100644 server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json delete mode 100644 server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json delete mode 100644 server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json delete mode 100644 server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json delete mode 100644 server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json delete mode 100644 server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json delete mode 100644 server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json delete mode 100644 server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json delete mode 100644 server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json delete mode 100644 server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json delete mode 100644 server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json delete mode 100644 server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json delete mode 100644 server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json delete mode 100644 server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json delete mode 100644 server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json delete mode 100644 server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json delete mode 100644 server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json delete mode 100644 server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json delete mode 100644 server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json delete mode 100644 server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json delete mode 100644 server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json delete mode 100644 server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json delete mode 100644 server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json delete mode 100644 server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json delete mode 100644 server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json delete mode 100644 server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json delete mode 100644 server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json delete mode 100644 server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json delete mode 100644 server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json delete mode 100644 server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json delete mode 100644 server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json delete mode 100644 server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json delete mode 100644 server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json delete mode 100644 server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json delete mode 100644 server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json delete mode 100644 server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json delete mode 100644 server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json delete mode 100644 server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json delete mode 100644 server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json diff --git a/.gitignore b/.gitignore index b98e56f58..a718fd412 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ server/example_configurations/repository_standalone/input/ server/example_configurations/repository_standalone/storage/ test.py /storage/ +server/storage/ diff --git a/server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json b/server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json deleted file mode 100644 index b38b4fb2a..000000000 --- a/server/storage/0221a67413b20fedd4c81ec1cc4e4ab22cbb96b078e42f0b7a7b57f121544cb1.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y30_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json b/server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json deleted file mode 100644 index 3d9784885..000000000 --- a/server/storage/03449a45eed1aace8858a389279106ba8a4ccd64b74fa68ee5f35c603a626c2e.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Pipe33", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "F40", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40" - }, - { - "idShort": "HasControlModule_F40", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe33" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe33" - }, - { - "type": "Entity", - "value": "F40" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json b/server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json deleted file mode 100644 index 4d26a80c8..000000000 --- a/server/storage/036566dabddebaf2a91a2e53e6c553891c1314fa37721b334d143adffd5470b3.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y17_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y17/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json b/server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json deleted file mode 100644 index feaefb504..000000000 --- a/server/storage/04ef966cad5272187353658f4dc3491c3a4a20593fc7d925fac4c6aa66916a3b.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_Regler_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json b/server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json deleted file mode 100644 index 5be92b1bb..000000000 --- a/server/storage/0558e271bdfc26247851d21147353a0432f269a716776577ec89091983c64795.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y25_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json b/server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json deleted file mode 100644 index 90f75a892..000000000 --- a/server/storage/05bcb22da4b719771ad3bd72dbea22cf3c97f21b79155efc15262eee7fc7fd67.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Norbro" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "pneumatisher Antrieb" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Rudolf-Plank-Str.2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "76275" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Ettlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Norbro Serie 40R" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "9999", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json b/server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json deleted file mode 100644 index 2ff640e58..000000000 --- a/server/storage/05f1cae8bea15e52111560691818bc07c9bcaa6c1366cd36b44960565c2641d2.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y18_Actuator_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Actuator/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json b/server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json deleted file mode 100644 index c00eee36f..000000000 --- a/server/storage/069bc4f5354f3a385b90e2fca2305d19efbc09615ef40a850f89292614b8a914.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json b/server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json deleted file mode 100644 index 9fe906a0c..000000000 --- a/server/storage/070e0f1bf4c9062a95f7d40d308552b1e02ca1b1302eb4e0b61c30e7a959ed34.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/TechnicalData", - "submodelElements": [ - { - "idShort": "Input_signal", - "description": [ - { - "language": "de", - "text": "Angabe \u00fcber eine eingehende Information" - }, - { - "language": "en", - "text": "information on the incoming information" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF945#002" - } - ] - }, - "value": "4\u008520mA", - "valueType": "xs:string" - }, - { - "idShort": "Min_supply_pressure", - "description": [ - { - "language": "de", - "text": "min. Speisedruck wird nach Notwendigket verwendet, um eine weitere differenzierende Begrifflichkeit f\u00fcr einen zweiten, aus dem prim\u00e4ren Betriebsdruck abgeleiteten Druck zu haben. Hier den min. Speisedruck" - }, - { - "language": "en", - "text": "max. supply pressure is used as necessary in order to have a further differentiating term for a second pressure based on the primary operating pressure, here the max. supply pressure" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD910#001" - } - ] - }, - "value": "2", - "valueType": "xs:string" - }, - { - "idShort": "Max_supply_pressure", - "description": [ - { - "language": "de", - "text": "max. Speisedruck wird nach Notwendigket verwendet, um eine weitere differenzierende Begrifflichkeit f\u00fcr einen zweiten, aus dem prim\u00e4ren Betriebsdruck abgeleiteten Druck zu haben. Hier den max. Speisedruck" - }, - { - "language": "en", - "text": "greatest possible minimum operating pressure for operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD911#001" - } - ] - }, - "value": "6", - "valueType": "xs:string" - }, - { - "idShort": "Air_consumption", - "description": [ - { - "language": "de", - "text": "Verbrauch des Werkzeuge an Druckluft, z.B. f\u00fcr Druckluft-Schlagschrauber" - }, - { - "language": "en", - "text": "Tool's consumption of compressed air, e.g. for compressed air hammer screw driver" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA453#003" - } - ] - }, - "value": "0.03", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_input_signal", - "description": [ - { - "language": "de", - "text": "Form und/oder Funktion des Signals am Eingang, das sowohl wertediskontinuierlich (bin\u00e4r) als auch wertekontinuierlich (analog oder auch die digitale Abbildung eines Analogsignals) in Bezug auf den G\u00fcltigkeitsbereich des Signal sein kann" - }, - { - "language": "en", - "text": "form and/or function of the signal at the input which can be discontinuous (binary) or continuous (analog or as digital mapping of an analog signal) in respect to the signal's range of validity" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAG071#008" - } - ] - }, - "value": "4\u008520mA", - "valueType": "xs:string" - }, - { - "idShort": "Max_ambient_temperature_during_operating_phase", - "description": [ - { - "language": "de", - "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" - }, - { - "language": "en", - "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF525#003" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "Min_ambient_temperature_during_operating_phase", - "description": [ - { - "language": "de", - "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / kleinster Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht mehr unterschritten werden kann oder darf" - }, - { - "language": "en", - "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / lower limit value of a physical quantity whose value cannot or must not be undershot" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF526#003" - } - ] - }, - "value": "85", - "valueType": "xs:string" - }, - { - "idShort": "Max_relative_humidity", - "description": [ - { - "language": "de", - "text": "h\u00f6chster Wert von relativer Feuchte, f\u00fcr die ein Ger\u00e4t ausgelegt ist oder auszulegen ist, damit es innerhalb seiner Spezifikationen betrieben wird" - }, - { - "language": "en", - "text": "highest value of relative humidity for which a device is or must be designed to operate within its specified limits" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN102#003" - } - ] - }, - "value": "90", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_electrical_connection__control_side", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der steuerseitig liegenden Verbindungsstelle, \u00fcber die ein elektrisches Betriebsmittel bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" - }, - { - "language": "en", - "text": "physical design of the control side to link an electrical operating unit to another in conformity with the intended use" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM488#006" - } - ] - }, - "value": "Thread M20*1.5", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_pneumatic_connections", - "description": [ - { - "language": "de", - "text": "geometrische Anforderungen der genormten pneumatischen Anschl\u00fcsse" - }, - { - "language": "en", - "text": "geometric requirements for the standardised pneumatic connections" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ904#001" - } - ] - }, - "value": "Threads G 1/4 ", - "valueType": "xs:string" - }, - { - "idShort": "Protection_class_acc_IP", - "description": [ - { - "language": "de", - "text": "gibt die Schutzklass nach IP eines Lasernivellierger\u00e4tes an" - }, - { - "language": "en", - "text": "indicates the protection class acc. IP of a laser level gage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAJ501#002" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json b/server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json deleted file mode 100644 index d970202c5..000000000 --- a/server/storage/0807afce4c5bbede9ca064005efb3b7b34c3f26b4ea9adf5b8e11daa1323bdaf.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Norgren/Herion" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Indirect solenoid actuated spool valves" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Bruckstra\u00dfe 93" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "46519" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Alpen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "97100 Namur" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json b/server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json deleted file mode 100644 index ab53436d0..000000000 --- a/server/storage/086caeb13ecea461594df1b180f97dead8d84ad3a33a7c5ff09b410deffaf331.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "IAT" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Unit" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TU20" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json b/server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json deleted file mode 100644 index f3e257409..000000000 --- a/server/storage/09532a9285bb8659a40974f35eab72dfe1dc6b77ef28f956d70d49d29878b893.json +++ /dev/null @@ -1,309 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/TechnicalData", - "submodelElements": [ - { - "idShort": "Output_Power", - "description": [ - { - "language": "de", - "text": "vom Hersteller f\u00fcr das Betriebsmittel bemessene Leistung bei angegebenen Betriebsbedingungen" - }, - { - "language": "en", - "text": "power of the output terminal of an electric circuit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF725#002" - } - ] - }, - "value": "0.37", - "valueType": "xs:string" - }, - { - "idShort": "Power_factor_cos_phi", - "description": [ - { - "language": "de", - "text": "Verh\u00e4ltnis vom Betrag der Wirkleistung zur Scheinleistung" - }, - { - "language": "en", - "text": "Relation of the amount of the active power to the false performance" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN420#001" - } - ] - }, - "value": "0.96", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP55", - "valueType": "xs:string" - }, - { - "idShort": "max_resistance_to_a_continuous_temperature", - "description": [ - { - "language": "de", - "text": "maximaler Wert der Temperatur, der ein Bauteil dauerhaft ausgesetzt werden kann, ohne seine charakteristischen Eigenschaften zu verlieren" - }, - { - "language": "en", - "text": "maximum value of the temperature which a component may be suspended permanently without losing its characteristic properties" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI476#003" - } - ] - }, - "value": "155", - "valueType": "xs:string" - }, - { - "idShort": "Power_frequency", - "description": [ - { - "language": "de", - "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" - }, - { - "language": "en", - "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC859#003" - } - ] - }, - "value": "50/60", - "valueType": "xs:string" - }, - { - "idShort": "max_input_current_with_AC_50_Hz", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Wechselstrom mit 50 Hz, der bei angesteuertem Eingang eingespeist/aufgenommen wird" - }, - { - "language": "en", - "text": "Maximum value of alternating current (50 Hz) that is fed in/taken up with a controlled input" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB849#007" - } - ] - }, - "value": "02. Jul", - "valueType": "xs:string" - }, - { - "idShort": "max_input_current_with_AC_60_Hz", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Wechselstrom mit 60 Hz, der bei angesteuertem Eingang eingespeist/aufgenommen wird" - }, - { - "language": "en", - "text": "Maximum value of alternating current (60 Hz) that is fed in/taken up with a controlled input" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB850#007" - } - ] - }, - "value": "02. Mai", - "valueType": "xs:string" - }, - { - "idShort": "max_rated_supply_voltage_with_AC", - "description": [ - { - "language": "de", - "text": "vom Hersteller angegebener gr\u00f6\u00dftm\u00f6glicher Wert der erforderlichen Wechselspannung als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" - }, - { - "language": "en", - "text": "Maximum value stipulated by the manufacturer of the required electric motor driven alternating voltage which must be temporarily or permanently applied to the supply input of an operating unit to maintain its function" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB831#008" - } - ] - }, - "value": "240", - "valueType": "xs:string" - }, - { - "idShort": "min_rated_supply_voltage_with_AC", - "description": [ - { - "language": "de", - "text": "vom Hersteller angegebener kleinstm\u00f6glicher Wert der erforderlichen Wechselspannung mit als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" - }, - { - "language": "en", - "text": "Minimum value stipulated by the manufacturer of the required electric motor driven alternating voltage which must be temporarily or permanently applied to the supply input of an operating unit to maintain its function" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB965#008" - } - ] - }, - "value": "220", - "valueType": "xs:string" - }, - { - "idShort": "max_rotation_speed", - "description": [ - { - "language": "de", - "text": "gibt die maximale Motordrehzahl an" - }, - { - "language": "en", - "text": "indicates the maxmium motor rotation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAR636#004" - } - ] - }, - "value": "2840", - "valueType": "xs:string" - }, - { - "idShort": "min_rotation_speed", - "description": [ - { - "language": "de", - "text": "Angabe zur minimalen Drehzahl" - }, - { - "language": "en", - "text": "description of minimum speed" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAR637#003" - } - ] - }, - "value": "360", - "valueType": "xs:string" - }, - { - "idShort": "Pitch_circle_diameter_of_stator_coupling", - "description": [ - { - "language": "de", - "text": "Angabe des Durchmesser f\u00fcr die Befestigung der Drehmomentst\u00fctze" - }, - { - "language": "en", - "text": "specifies the diameter for mounting the stator coupling" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ253#001" - } - ] - }, - "value": "85", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json b/server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json deleted file mode 100644 index b052ec3a4..000000000 --- a/server/storage/09b37e0c333e3541b88ee61f83e7b67f1ea690f1dac00433d769f334afba76df.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T23_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json b/server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json deleted file mode 100644 index df6ccee98..000000000 --- a/server/storage/0a43f2347d22200c96e4e9c165ceb697e3ea37b3ecf796b6aecc5c093b048717.json +++ /dev/null @@ -1,509 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/TechnicalData", - "submodelElements": [ - { - "idShort": "Rotation_speed", - "description": [ - { - "language": "de", - "text": "Quotient aus Anzahl der Umdrehungen und der zugeh\u00f6rigen Zeitspanne" - }, - { - "language": "en", - "text": "Quotient of number of rotations divided by the associated time span" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAD222#006" - } - ] - }, - "value": "2751", - "valueType": "xs:string" - }, - { - "idShort": "Normal_feed_flow", - "description": [ - { - "language": "de", - "text": "F\u00f6rderstrom, der bei \u00fcblichem Betrieb zu erwarten ist" - }, - { - "language": "en", - "text": "delivery which is to be expected for usual operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAJ126#007" - } - ] - }, - "value": "3", - "valueType": "xs:string" - }, - { - "idShort": "Max_ambient_temperature_during_operating_phase", - "description": [ - { - "language": "de", - "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" - }, - { - "language": "en", - "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF525#003" - } - ] - }, - "value": "40", - "valueType": "xs:string" - }, - { - "idShort": "Max_pressure", - "description": [ - { - "language": "de", - "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" - }, - { - "language": "en", - "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA447#006" - } - ] - }, - "value": "25", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_width_of_the_suction_supports", - "description": [ - { - "language": "de", - "text": "gibt die Nennweite des Saugstutzens an, eine numerische Festlegung der Gr\u00f6\u00dfe f\u00fcr die \u2018lichte Weite\u2019 (Innenma\u00df), die f\u00fcr alle Komponenten eines Rohrleitungssystems gleich ist, im Unterschied zu Komponenten, die durch einen Au\u00dfendurchmesser festgelegt sind oder durch eine Gewindegr\u00f6\u00dfe. Sie ist einen runde Zahl (ungef\u00e4hr der innere Durchmesser des Rohrleitungsanschlusses gemessen in Millimeter. Sie bezieht sich gew\u00f6hnlich nur ungef\u00e4hr auf die Fertigungsma\u00dfe" - }, - { - "language": "en", - "text": "provides the nominal width of the suction supports. A numeric determination of the size for the 'open width' (internal measurement), which is the same for all components of a pipe system, in contrast to components determined by an outer diameter or by a thread size. It is a round number (approx. that of the internal diameter of the pipe connection measured in millimeters. Normally, this relates only approximately to the production measurements" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO804#001" - } - ] - }, - "value": "DN25/ DN32", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_pressure_plastic", - "description": [ - { - "language": "de", - "text": "Nenndruck gibt f\u00fcr ein Rohrleitungssystem eine Referenzgr\u00f6\u00dfe an. Die Angabe erfolgt durch die Bezeichnung PN (Pressure Nominal) gefolgt von einer dimensionslosen ganzen Zahl, die den Auslegungsdruck in bar bei Raumtemperatur (20 \u00b0C) angibt. Der bei einer bestimmten Temperatur zul\u00e4ssige Betriebsdruck wird \u00fcblicherweise in Prozent des Nenndruckes angegeben. Bei h\u00f6heren und tieferen Temperaturen ist, bedingt durch die Abnahme der zul\u00e4ssigen Werkstoffkennwerte (Streckgrenze), der zul\u00e4ssige Druck entsprechend geringer. PN 10 zum Beispiel bezeichnet eine Rohrleitung mit dem h\u00f6chstzul\u00e4ssigen Druck von 10 bar bei einer Fluidtemperatur von 20 \u00b0C" - }, - { - "language": "en", - "text": "The nominal pressure is a pipe system to a reference value. This is specified by the term PN (Pressure Nominal) followed by a dimensionless whole number that specifies the design pressure in bar at room temperature (20 \u00b0 C). The allowable operating pressure at a certain temperature is usually expressed as a percentage of the nominal pressure. At higher and lower temperatures is due to the decrease in the allowable material properties (yield strength), the allowable pressure correspondingly lower. PN 10, for example, refers to a pipe with the maximum pressure of 10 bar at a fluid temperature of 20 \u00b0 C" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAX147#001" - } - ] - }, - "value": "PN25", - "valueType": "xs:string" - }, - { - "idShort": "Max_temperature_of_medium_to_be_transported", - "description": [ - { - "language": "de", - "text": "Maximale Temperatur des Mediums das gef\u00f6rdert werden soll" - }, - { - "language": "en", - "text": "Maximum temperature if the medium to be transported" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC658#005" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Min_temp_of_medium_to_be_transported", - "description": [ - { - "language": "de", - "text": "Minimale Temperatur des Mediums das gef\u00f6rdert werden soll" - }, - { - "language": "en", - "text": "Minimum temperature if the medium to be transported" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC729#004" - } - ] - }, - "value": "90", - "valueType": "xs:string" - }, - { - "idShort": "Material_property_of_the_pumping_medium", - "description": [ - { - "language": "de", - "text": "Beschreibt die mechanischen, physikalischen und chemischen Eigenschaften des Werkstoffes" - }, - { - "language": "en", - "text": "Describes the mechanical, physical and chemical properties of the material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAD195#006" - } - ] - }, - "value": "Die Dichte betraegt 998,2kg/m^3", - "valueType": "xs:string" - }, - { - "idShort": "Measurement_performance_of_the_electric_motor", - "description": [ - { - "language": "de", - "text": "Die vom Hersteller f\u00fcr das Betriebsmittel bemessene Leistung bei angegebenen Betriebsbedingungen" - }, - { - "language": "en", - "text": "The output measured by the manufacturer for the operating medium at defined operating conditions" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAH734#003" - } - ] - }, - "value": "0.37", - "valueType": "xs:string" - }, - { - "idShort": "Power_frequency", - "description": [ - { - "language": "de", - "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" - }, - { - "language": "en", - "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC859#003" - } - ] - }, - "value": "50", - "valueType": "xs:string" - }, - { - "idShort": "Rated_voltage", - "description": [ - { - "language": "de", - "text": "vom Hersteller angegebener Wert, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind, f\u00fcr die Spannung, die an ein elektrisches Betriebsmittel unter Ber\u00fccksichtigung der Gebrauchsbedingungen angelegt werden" - }, - { - "language": "en", - "text": "manufacturer's value for the voltage, which is derived from measured values that have been obtained under established conditions and rules" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAH005#006" - } - ] - }, - "value": "200-240", - "valueType": "xs:string" - }, - { - "idShort": "Rated_current", - "description": [ - { - "language": "de", - "text": "vom Hersteller angegebener Wert des Stromes, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" - }, - { - "language": "en", - "text": "value of the current, resulting from measurements which were determined under specified conditions and rules as defined by the manufacturer" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF726#003" - } - ] - }, - "value": "03.02.2005 00:00", - "valueType": "xs:string" - }, - { - "idShort": "Power_factor_cos_phi", - "description": [ - { - "language": "de", - "text": "Verh\u00e4ltnis vom Betrag der Wirkleistung zur Scheinleistung" - }, - { - "language": "en", - "text": "Relation of the amount of the active power to the false performance" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN420#001" - } - ] - }, - "value": "0.96", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_speed", - "description": [ - { - "language": "de", - "text": "Drehzahl die den Nenndaten des verwendeten Motors entspricht" - }, - { - "language": "en", - "text": "Speed corresponding to the motor used according to the name plate ratings" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA580#006" - } - ] - }, - "value": "360-2840", - "valueType": "xs:string" - }, - { - "idShort": "Motor_efficiency", - "description": [ - { - "language": "de", - "text": "Verh\u00e4ltnis der vom Motor abgegebenen Leistung zu der vom Motor aufgenommenen Leistung" - }, - { - "language": "en", - "text": "determined proportion of the motor power input p_mot delivered as pump power input p_mot,u" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC232#001" - } - ] - }, - "value": "68", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP55", - "valueType": "xs:string" - }, - { - "idShort": "Net_weight", - "description": [ - { - "language": "de", - "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t. Da unter \u201eGewicht\u201c in diesem Fall die Masse verstanden wird, ist auch die Ma\u00dfeinheit (Kilo-) Gramm als SI-Einheit zu verwenden" - }, - { - "language": "en", - "text": "Dimensions of the weigh item without packaging and without transport device. As, in this case, 'weight' means dimensions, the measure unit (kilo) gram is to be used as the SI unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAD875#007" - } - ] - }, - "value": "2.4", - "valueType": "xs:string" - }, - { - "idShort": "Gross_weight", - "description": [ - { - "language": "de", - "text": "quantitative Angabe zur Masse eines Gegenstandes mit Verpackung" - }, - { - "language": "en", - "text": "Quantitative statement of the mass of an object, including packaging" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAF368#004" - } - ] - }, - "value": "2.6", - "valueType": "xs:string" - }, - { - "idShort": "Kind_of_motor_protection_device", - "description": [ - { - "language": "de", - "text": "gibt an, welche Art der Vorrichtung zum Schutz des Motors vorhanden ist" - }, - { - "language": "en", - "text": "indicates the available kind of device to protect the motor" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAR645#006" - } - ] - }, - "value": "PTC", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json b/server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json deleted file mode 100644 index 42703f0ac..000000000 --- a/server/storage/0ba45d558a7106d7cb7abb611a1f6697c83305ec1874277cfeb379aee2d5804f.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json b/server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json deleted file mode 100644 index c19c88e52..000000000 --- a/server/storage/0d472d8dbebab7a6083b7db927bdbdd7773c2a4119b81aeb8df2602b950877dc.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/TechnicalData", - "submodelElements": [ - { - "idShort": "max_measuring_range", - "description": [ - { - "language": "de", - "text": "Gibt den h\u00f6chsten Wert des Impulsstroms an, der vom Impulsz\u00e4hler erfasst wird" - }, - { - "language": "en", - "text": "Max. value of the impulse current which can be detected by the counter" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD387#001" - } - ] - }, - "value": "5", - "valueType": "xs:string" - }, - { - "idShort": "Max_deviation", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6gliche Abweichung der tats\u00e4chlichen von der eingestellten (geregelten) Temperatur" - }, - { - "language": "en", - "text": "maximum deviation of the actual temperature to the adjusted temperature" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI784#002" - } - ] - }, - "value": "4", - "valueType": "xs:string" - }, - { - "idShort": "Design_of_the_process_connection", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" - }, - { - "language": "en", - "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB411#007" - } - ] - }, - "value": "Thread G1(1/2), 1(1/2)NPT", - "valueType": "xs:string" - }, - { - "idShort": "Min_process_pressure", - "description": [ - { - "language": "de", - "text": "kleinster Absolutwert des die Mess- oder Stelleinrichtung ber\u00fchrenden Druckes, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the least absolute value of the pressure which affects them and under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY641#001" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Max_process_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY820#001" - } - ] - }, - "value": "200", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_process_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" - }, - { - "language": "en", - "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN307#004" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_storage_temperature", - "description": [ - { - "language": "de", - "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN272#004" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Lower_limiting_value_of_storage_temperature", - "description": [ - { - "language": "de", - "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN276#004" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_ambient_temperature", - "description": [ - { - "language": "de", - "text": "maximale Umgebungstemperatur (\u00b0C), f\u00fcr die das K\u00fchlger\u00e4t geeignet ist, wie in Anhang IV in Erg\u00e4nzung der Verordnung (EU) 2017/1369 erl\u00e4utert" - }, - { - "language": "en", - "text": "maximum ambient temperature (\u00b0C), for which the refrigerating appliance is suitable, as explained in Annex IV supplementing Regulation (EU) 2017/1369" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABF703#001" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Minimum_ambient_temperature", - "description": [ - { - "language": "de", - "text": "minimale Umgebungstemperatur (\u00b0C), f\u00fcr die das K\u00fchlger\u00e4t geeignet ist, wie in Anhang IV in Erg\u00e4nzung der Verordnung (EU) 2017/1369 erl\u00e4utert" - }, - { - "language": "en", - "text": "minimum ambient temperature (\u00b0C), for which the refrigerating appliance is suitable, as explained in Annex IV supplementing Regulation (EU) 2017/1369" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABF726#001" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "Operating_voltage", - "description": [ - { - "language": "de", - "text": "Spannung, die zusammen mit dem Bemessungsbetriebsstrom die Anwendung des Ger\u00e4tes bestimmt und auf die sich die verschiedenen Pr\u00fcfungen und die Gebrauchskategorien beziehen. Bei einpoligen Ger\u00e4ten ist die Bemessungsbetriebsspannung im Allgemeinen die Spannung \u00fcber den Pol. Bei mehrpoligen Ger\u00e4ten wird sie im Allgemeinen als verkettete Spannung angegeben" - }, - { - "language": "en", - "text": "voltage which, together with the rated operating current, determines the use of the device and to which the various tests and the use categories refer. With single pole devices the rated rated operating voltage is generally the voltage over the pole. With multi-pole devices it is generally given as chained voltage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAB415#008" - } - ] - }, - "value": "14\u008536V DC", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4\u008520mA/HART- Zweileiter", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_protection", - "description": [ - { - "language": "de", - "text": "Ausma\u00df des durch ein Geh\u00e4use gebotenen Schutzes vor Zugang zu gef\u00e4hrlichen Teilen und Eindringen von festen Fremdk\u00f6rpern und/oder Wasser, der durch normierte Pr\u00fcfverfahren best\u00e4tigt wurde, angegeben als IP-Einstufung" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and/or ingress of water and verified by standardized test methods, expressed as a IP rating" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAG975#013" - } - ] - }, - "value": "IP66/IP67", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json b/server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json deleted file mode 100644 index ee22dff6d..000000000 --- a/server/storage/0e3ab0ff80d6d64d9eb5a186e1096ab50587bce87e2f9b12df20290619016351.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/TechnicalData", - "submodelElements": [ - { - "idShort": "ISO_5211", - "description": [ - { - "language": "de", - "text": "Bezugnahme auf eine oder mehrere Normen und Richtlinien anstelle der Wiedergabe detaillierter Festlegungen. ANMERKUNG Eine Anwendungsnorm ist die Vorgabe eines Handlungsmusters, das bei Anwendung befolgt, oder einer Qualit\u00e4t, die bei Anwendung eingehalten werden muss. Sie dient dazu, unabh\u00e4ngig voneinander entstehende Artefakte mit einheitlichen Eigenschaften oder Qualit\u00e4ten herzustellen. Nationale und internationale Normen werden in sog. Normungsgremien verabschiedet" - }, - { - "language": "en", - "text": "Reference to one or more norms and guidelines instead of repeating detailed specs. COMMENT: An application norm is a specification of a pattern of use which must be followed during use, or of a quality which must be maintained during use. It serves to cause artifacts which arise independently of one another to be manufactured with uniform properties or qualities. National and international standards are established by so-called standards committees" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAP798#001" - } - ] - }, - "value": "F05", - "valueType": "xs:string" - }, - { - "idShort": "Operating_Pressure", - "description": [ - { - "language": "de", - "text": "festgelegte, vereinbarte Abstufungsreihe f\u00fcr maximal zul\u00e4ssige Betriebsdr\u00fccke" - }, - { - "language": "en", - "text": "determined, agreed graduation sequence for maximum allowable operating pressures" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAG984#007" - } - ] - }, - "value": "4", - "valueType": "xs:string" - }, - { - "idShort": "Springstroke", - "description": [ - { - "language": "de", - "text": "Federweg der Feder." - }, - { - "language": "en", - "text": "Springstroke." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Springstroke" - } - ] - }, - "value": "35 to 60", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json b/server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json deleted file mode 100644 index 72e78f85d..000000000 --- a/server/storage/0e6b7b8281dd54c8b6bc8a19c84dce99e5b21775fc28a1cfae1514aac1bd7634.json +++ /dev/null @@ -1,359 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/TechnicalData", - "submodelElements": [ - { - "idShort": "Measuring_range_conductivity", - "description": [ - { - "language": "de", - "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" - }, - { - "language": "en", - "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH095#003" - } - ] - }, - "value": "0.01...20", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_process_connection", - "description": [ - { - "language": "de", - "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" - }, - { - "language": "en", - "text": "classification of a process connection according to its fabricated form" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA021#007" - } - ] - }, - "value": "\"Thread G 1\"\" PES\"", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_temperature_sensor", - "description": [ - { - "language": "de", - "text": "Charakterisierung einer Temperatursensors bez\u00fcglich seiner elektrischen Ausf\u00fchrung" - }, - { - "language": "en", - "text": "classification of a temperature probe according to its electrical design" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN862#002" - } - ] - }, - "value": "Pt100", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_process_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" - }, - { - "language": "en", - "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN307#004" - } - ] - }, - "value": "135", - "valueType": "xs:string" - }, - { - "idShort": "Max_process_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY820#001" - } - ] - }, - "value": "16", - "valueType": "xs:string" - }, - { - "idShort": "Measurement_error", - "description": [ - { - "language": "de", - "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" - }, - { - "language": "en", - "text": "deviation of measured value from the true value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ356#003" - } - ] - }, - "value": "5% of reading", - "valueType": "xs:string" - }, - { - "idShort": "Repeatability", - "description": [ - { - "language": "de", - "text": "Grad der \u00dcbereinstimmung einer Anzahl aufeinander folgender Messungen des Ausgangssignals f\u00fcr denselben Wert der Eingangsvariablen unter denselben Bedingungen, wenn die Ausgangsvariable, aus der gleichen Richtung kommend, alle Werte ihres Bereichs durchl\u00e4uft" - }, - { - "language": "en", - "text": "degree of agreement for a number of subsequent measurements of the output signal for the same value of the input variable under the same conditions, when the output variable, originating from the same direction, passes through all variables in its range" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ350#003" - } - ] - }, - "value": "0.2% of reading", - "valueType": "xs:string" - }, - { - "idShort": "Minimum_ambient_temperature", - "description": [ - { - "language": "de", - "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" - }, - { - "language": "en", - "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as \u2018Climate class, W [climate class]. This appliance is intended to be used at an ambient temperature between \u2019X\u2019 [lowest temperature] \u00b0C and \u2019X\u2019 [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV259#003" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_ambient_temperature", - "description": [ - { - "language": "de", - "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" - }, - { - "language": "en", - "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as: \u2018Climate class: W [climate class]. This appliance is intended to be used at an ambient temperature between \u201cX\u201d [lowest temperature] \u00b0C and \u201cX\u201d [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV260#002" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_storage_temperature", - "description": [ - { - "language": "de", - "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN272#004" - } - ] - }, - "value": "-25", - "valueType": "xs:string" - }, - { - "idShort": "Lower_limiting_value_of_storage_temperature", - "description": [ - { - "language": "de", - "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN276#004" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - }, - { - "idShort": "Min_air_humidity", - "description": [ - { - "language": "de", - "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW976#002" - } - ] - }, - "value": "5", - "valueType": "xs:string" - }, - { - "idShort": "Max_air_humidity", - "description": [ - { - "language": "de", - "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN164#003" - } - ] - }, - "value": "95", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json b/server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json deleted file mode 100644 index 7096eebc7..000000000 --- a/server/storage/0e9bf6909a40487e2d3cb72b92a748b5d5319adde2cd6c88432f2b22345b6491.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "data": { - "idShort": "Y25_Ball_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/DynamicData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json b/server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json deleted file mode 100644 index cedacb1a6..000000000 --- a/server/storage/10478806d1a8a09eccb6cba1a042e7ae6c49bee97ad233140d30fba802e2d7a1.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FDL30" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Hauptstrasse 1" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "79689" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Maulburg" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "LIQUIPHANT II" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unknown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json b/server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json deleted file mode 100644 index 8a5c2b066..000000000 --- a/server/storage/10ae63bd2257ba22a903426095600686cd29e75363a2d8f59b1d315b958bc8ed.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json b/server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json deleted file mode 100644 index 047030288..000000000 --- a/server/storage/11af2a73ac8f92874e35e8503385b54f96a43b915c5c508b1863b9fe9de546f6.json +++ /dev/null @@ -1,495 +0,0 @@ -{ - "data": { - "idShort": "IdGenerationSettings", - "modelType": "Submodel", - "id": "https://repodomainurl.com/sm/B461C6ED32214933B8B6CE569C8F0A03/1/0", - "administration": { - "version": "1", - "revision": "0" - }, - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/1/0" - } - ] - }, - "submodelElements": [ - { - "idShort": "AssetIDShort", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIDShort/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" - } - ] - }, - "value": "string", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/IdType" - } - ], - "value": [ - { - "idShort": "Prefix", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdShortPrefix/1/0" - } - ] - }, - "value": "example", - "valueType": "xs:string" - }, - { - "idShort": "DynamicPart", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdShortDynamicPart/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" - } - ] - }, - "value": "(AssetIdShort)", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/AllowedValue" - } - ], - "value": "AssetIdShort", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "AASIDShort", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdShort/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" - } - ] - }, - "value": "string", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/IdType" - } - ], - "value": [ - { - "idShort": "Prefix", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdShortPrefix/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" - } - ] - }, - "value": "aas_", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/ExampleValue" - } - ], - "value": "aas_", - "valueType": "xs:string" - }, - { - "idShort": "DynamicPart", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdShortDynamicPart/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" - } - ] - }, - "value": "(GUID|AssetIdShort)", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/AllowedValue" - } - ], - "value": "AssetIdShort", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "AASID", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AasId/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" - } - ] - }, - "value": "IRI", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/IdType" - } - ], - "value": [ - { - "idShort": "Prefix", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdPrefix/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" - } - ] - }, - "value": "https://example.com/aas/", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/ExampleValue" - } - ], - "value": "https://i40.xitaso.com/aas/", - "valueType": "xs:string" - }, - { - "idShort": "DynamicPart", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AasIdDynamicPart/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" - } - ] - }, - "value": "(GUID|AssetIdShort|AASIdShort)", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/AllowedValue" - } - ], - "value": "AssetIdShort", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "AssetID", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AssetId/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" - } - ] - }, - "value": "IRI", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/IdType" - } - ], - "value": [ - { - "idShort": "Prefix", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdPrefix/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" - } - ] - }, - "value": "https://example.com/", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/ExampleValue" - } - ], - "value": "https://i40.xitaso.com/", - "valueType": "xs:string" - }, - { - "idShort": "DynamicPart", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/AssetIdDynamicPart/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" - } - ] - }, - "value": "(GUID|AssetIdShort)", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/AllowedValue" - } - ], - "value": "AssetIdShort", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "SubmodelID", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/SubmodelId/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/IdType/1/0" - } - ] - }, - "value": "IRI", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/IdType" - } - ], - "value": [ - { - "idShort": "Prefix", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/SubmodelIdPrefix/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/ExampleValue/1/0" - } - ] - }, - "value": "https://example1234.com/sm/", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/ExampleValue" - } - ], - "value": "https://i40.xitaso.com/sm/", - "valueType": "xs:string" - }, - { - "idShort": "DynamicPart", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/IdGenerationSettings/SubmodelIdDynamicPart/1/0" - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/SubmodelTemplates/AllowedValue/1/0" - } - ] - }, - "value": "(GUID)", - "kind": "TemplateQualifier", - "valueType": "xs:string", - "type": "SMT/AllowedValue" - } - ], - "value": "GUID", - "valueType": "xs:string" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json b/server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json deleted file mode 100644 index ac89872be..000000000 --- a/server/storage/11bce895052531b555ed7f4201563f696f2441a3ed4030e277d44d64f937ddd3.json +++ /dev/null @@ -1,459 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/TechnicalData", - "submodelElements": [ - { - "idShort": "Measuring_range", - "description": [ - { - "language": "de", - "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" - }, - { - "language": "en", - "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH095#003" - } - ] - }, - "value": "0...60", - "valueType": "xs:string" - }, - { - "idShort": "Display_range", - "description": [ - { - "language": "de", - "text": "Ausgabebereich bei anzeigenden Messger\u00e4ten" - }, - { - "language": "en", - "text": "output range of a measuring device which displays" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ355#003" - } - ] - }, - "value": "0...20", - "valueType": "xs:string" - }, - { - "idShort": "Lower_range_limit_of_temperature", - "description": [ - { - "language": "de", - "text": "niedrigster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" - }, - { - "language": "en", - "text": "lowest value of temperature that the device can be adjusted to measure within the specified accuracy limits" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY818#001" - } - ] - }, - "value": "-35", - "valueType": "xs:string" - }, - { - "idShort": "Upper_range_limit_of_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" - }, - { - "language": "en", - "text": "highest value of the temperature that a device can be adjusted to measure within its specified accuracy limits" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY819#001" - } - ] - }, - "value": "250", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4...20mA/HART/Profibus", - "valueType": "xs:string" - }, - { - "idShort": "Max_input_voltage_with_DC", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6glicher Wert der Gleichspannung, die am Eingang eines Betriebsmittels angelegt werden kann" - }, - { - "language": "en", - "text": "maximum value of direct-voltage that can be applied to the input of an operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB848#008" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "Max_input_current_with_DC", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Gleichstrom, der bei angesteuertem Eingang eingespeist/aufgenommen wird" - }, - { - "language": "en", - "text": "Maximum value of an DC current that is fed in/taken up with a controlled input" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB852#007" - } - ] - }, - "value": "21", - "valueType": "xs:string" - }, - { - "idShort": "Max_DC__input_capacity", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6gliche Gleichstrom-Eingangsleistung f\u00fcr die der Wechselrichter eine netzsynchrone Wechselspannung erzeugen kann" - }, - { - "language": "en", - "text": "maximum DC-input power for the inverters produce a synchronous AC network" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI736#002" - } - ] - }, - "value": "3", - "valueType": "xs:string" - }, - { - "idShort": "Max_load", - "description": [ - { - "language": "de", - "text": "maximale B\u00fcrde, die an den Anschl\u00fcssen des Ger\u00e4ts angelegt werden kann oder vom Ger\u00e4t an ein externes angeschlossenes Ger\u00e4t weitergegeben wird" - }, - { - "language": "en", - "text": "maximum load that can be applied to the terminals of the device or will be given by the device to an external devices connected to it" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA042#009" - } - ] - }, - "value": "600", - "valueType": "xs:string" - }, - { - "idShort": "Minimum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW301#002" - } - ] - }, - "value": "55", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW302#002" - } - ] - }, - "value": "-10", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN313#004" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Lower_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN314#004" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Min_air_humidity", - "description": [ - { - "language": "de", - "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW976#002" - } - ] - }, - "value": "10", - "valueType": "xs:string" - }, - { - "idShort": "Max_air_humidity", - "description": [ - { - "language": "de", - "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN164#003" - } - ] - }, - "value": "90", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_auxiliary_energy", - "description": [ - { - "language": "de", - "text": "n\u00e4here Angaben zur Energie, welche dem Betriebsmittel oder dem Betriebssystem zum Aufrechterhalten seiner Funktion zeitweise oder st\u00e4ndig zugef\u00fchrt werden muss" - }, - { - "language": "en", - "text": "further information on the energy which must be fed to the operating resource or operating system continually or occasionally so that performance of its function can be sustained" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAB236#008" - } - ] - }, - "value": "24V AC/DC", - "valueType": "xs:string" - }, - { - "idShort": "Number_of_connections_sensor_actor", - "description": [ - { - "language": "de", - "text": "Quantitative Angabe zur Menge Anschl\u00fcsse Sensor/Aktor" - }, - { - "language": "en", - "text": "Quantitative statement about the set of connections sensor / actor" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAP400#001" - } - ] - }, - "value": "1*Konduktiver Sensor", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json b/server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json deleted file mode 100644 index 18f7f0a50..000000000 --- a/server/storage/1289e310e5a2a7b972a7da9e81417b3f92547c2aed8c417ee0fd48c28198e3bd.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "HC20_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json b/server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json deleted file mode 100644 index 9d44b2012..000000000 --- a/server/storage/13402ce50aa832fdc926d8a31252cacdcc769000e5c4d0e80ac5cde735eec993.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "VEGA" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "F\u00fcllstandsensor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Am Hohenstein 113" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "77761" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Schiltach" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "VEGAFlex 65 FX65.XXAGD1HKMXX" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json b/server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json deleted file mode 100644 index a50b68115..000000000 --- a/server/storage/1575904c79ffd67a762b7c1ed4343e8710cd0e1f91cf7310524c762cace48e81.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Beh\u00e4lter" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "zyl. Beh\u00e4lter" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json b/server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json deleted file mode 100644 index 0c0f2cbd4..000000000 --- a/server/storage/1617f604a6086c283e7dbcd0fb0bedcb91061b10f30ea0c9d943bf7757fe4e4c.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y37_Positioner_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json b/server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json deleted file mode 100644 index cf7581b6b..000000000 --- a/server/storage/167360dba775c9df4c53803aeb44a9bcaa873662aa813f1c989fc1f762c6c1a8.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "ABB" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Typ 18345-2021465101" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Schillerstr.72" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "32425" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Minden" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TZIDC" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json b/server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json deleted file mode 100644 index d28f140d8..000000000 --- a/server/storage/16be7fbbd89edd58201981819477b293d9623fe56b3a78b25033156bf81bb3c7.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y21_MagneticPositioner_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_MagneticPositioner/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json b/server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json deleted file mode 100644 index 3c15866a1..000000000 --- a/server/storage/18de9e5f4d165a373b1d61a536cac8ea6de2405362dc0e7850d2a30352ad332d.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "data": { - "idShort": "B2_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/DynamicData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json b/server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json deleted file mode 100644 index 7d4a31034..000000000 --- a/server/storage/1abd15b4bfc30dce1ce33e48362d98cfbf9f524c651136459c622f8228902ceb.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L26_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json b/server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json deleted file mode 100644 index c62ccfa6d..000000000 --- a/server/storage/1bd2567f974649800a65864930906f651382d45795cf3a9a0082245edfd09e99.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y25_Pneumatischer_Antrieb_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json b/server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json deleted file mode 100644 index 791a30eaa..000000000 --- a/server/storage/1c1635fe7e4e53ce8b3e4028037ed122a558bd1e15292021a45a1100888fed50.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y24_Magnetic_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json b/server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json deleted file mode 100644 index a92cddf80..000000000 --- a/server/storage/1e230c754a999f36ae3e7cde981b61bcd16703126019650509f56b464d963c10.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "RTD Thermometer omnigrad TST40N" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Colmarer Str. 6" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "79576" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Weil am Rhein" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TST" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json b/server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json deleted file mode 100644 index 303e7993f..000000000 --- a/server/storage/1f54ebaf878ec57a6341bb12f037cd12787de7c92a1f439a6d3a5bc793b026ab.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "TU10_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json b/server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json deleted file mode 100644 index 3d8b11f0f..000000000 --- a/server/storage/1f61dbe6f3b27d7ff673b416951dea45f60ec49debda0d5d0eb0e9a019612acf.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/TechnicalData", - "submodelElements": [ - { - "idShort": "Nennweite", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "G1/2", - "valueType": "xs:string" - }, - { - "idShort": "Einbaulaenge", - "description": [ - { - "language": "de", - "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" - }, - { - "language": "en", - "text": "overall length of that part of a device or component to be found within a containment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM599#004" - } - ] - }, - "value": "100", - "valueType": "xs:string" - }, - { - "idShort": "min_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-50\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "400\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "14571", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json b/server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json deleted file mode 100644 index 6d69e6cd7..000000000 --- a/server/storage/203c3a28526816d9da7a4affabbc1956a07b6534dba3a39b2de7438598636658.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L11_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L11/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json b/server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json deleted file mode 100644 index 18a075793..000000000 --- a/server/storage/21a7d9eefafeb9d13f12e666fcb112a95a63d60732565673080ccb293d6420d9.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Yokogawa" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "SC202G" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Berlinerstrasse 101-103" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "40880" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Ratingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "SC202G" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "S", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json b/server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json deleted file mode 100644 index 354af0203..000000000 --- a/server/storage/232e67eabb6c78aedb128d9adbffc9edfb2293605e159bdb76cbcbdf783b1378.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y24_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json b/server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json deleted file mode 100644 index 4246d6c4c..000000000 --- a/server/storage/23e51714b9b1414c72f96de231048f275e4a3f6c196fb214f08852ef594f1f24.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "data": { - "idShort": "MnestixDefaultSubmodels", - "modelType": "AssetAdministrationShell", - "id": "https://mnestix.com/aas/F11BF9F696A3454EBA0AA4503783F142_4", - "derivedFrom": { - "type": "ModelReference", - "keys": [ - { - "type": "AssetAdministrationShell", - "value": "https://mnestix.com/aas/MnestixCustomSubmodelTemplate" - } - ] - }, - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "exampleAsset", - "specificAssetIds": [ - { - "name": "assetIdShort", - "value": "exampleAssetIdShort" - } - ] - } - } -} \ No newline at end of file diff --git a/server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json b/server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json deleted file mode 100644 index aad5baacd..000000000 --- a/server/storage/24ae30da85dd894e1671c1514673fdeec2206c7eb496e442c49e334c5c9e9f9b.json +++ /dev/null @@ -1,384 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/TechnicalData", - "submodelElements": [ - { - "idShort": "Nominal_width_DN", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "DN25", - "valueType": "xs:string" - }, - { - "idShort": "Max_flow_rate", - "description": [ - { - "language": "de", - "text": "Wassermenge, die maximal pro Zeiteiheit durch das Ger\u00e4t flie\u00dfen kann" - }, - { - "language": "en", - "text": "maximum water quantity which can flow through the appliance per time unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC971#002" - } - ] - }, - "value": "18000", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_pressure_PN_of_the_flange", - "description": [ - { - "language": "de", - "text": "Beschreibung der Flanschbennung der Druckstufe" - }, - { - "language": "en", - "text": "description of the pressure stage of the label of the flange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK644#005" - } - ] - }, - "value": "40", - "valueType": "xs:string" - }, - { - "idShort": "Material", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "1.4404/316L, 1.4539/904L", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_protection_IP_of_the_evaluating_electronics", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP67", - "valueType": "xs:string" - }, - { - "idShort": "Measurement_error", - "description": [ - { - "language": "de", - "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" - }, - { - "language": "en", - "text": "deviation of measured value from the true value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ356#003" - } - ] - }, - "value": "0.1%+[(zero point stability: measured value)*100]%", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4 - 20 mA DC/ HART", - "valueType": "xs:string" - }, - { - "idShort": "Max_medium_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB864#006" - } - ] - }, - "value": "120", - "valueType": "xs:string" - }, - { - "idShort": "Min_medium_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB988#006" - } - ] - }, - "value": "-50", - "valueType": "xs:string" - }, - { - "idShort": "minimum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW301#002" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "maximum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW302#002" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_cable_entry", - "description": [ - { - "language": "de", - "text": "Beschreibung der geometrischen und / oder funktionalen Ausf\u00fchrung der Einf\u00fchrung f\u00fcr Kabel" - }, - { - "language": "en", - "text": "description of the geometrical and / or functional modeling of the cable entry" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAG180#006" - } - ] - }, - "value": "M20*1.5(8 to 12 mm)", - "valueType": "xs:string" - }, - { - "idShort": "Supply_voltage_type", - "description": [ - { - "language": "de", - "text": "bestimmte Form der Spannung, die angibt, ob das Betriebsmittel mit Wechselspannung (AC), Gleichspannung (DC), Wechsel-/Gleichstrom (AC/DC) oder modulierter Gleichspannung (UC) versorgt werden kann" - }, - { - "language": "en", - "text": "Type of voltage required for supplying the device" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC078#007" - } - ] - }, - "value": "85 to 260 V AC, 45 to 65 Hz", - "valueType": "xs:string" - }, - { - "idShort": "Max_storage_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6gliche Temperatur mit der ein W\u00e4rmespeicher beschickt werden kann" - }, - { - "language": "en", - "text": "maximum temperature which can be fed with a heat storage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI791#003" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Min_storage_temperature", - "description": [ - { - "language": "de", - "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ342#005" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json b/server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json deleted file mode 100644 index 9ca5b70a0..000000000 --- a/server/storage/283fa9221916363c7dda456cb023819a8c05bf22e27455df0be93c2919d5af21.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Beh\u00e4lter" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "zyl. Beh\u00e4lter" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json b/server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json deleted file mode 100644 index 0b196ca2f..000000000 --- a/server/storage/2900f3b78f52c06934ed5d69c0d8bf888b4ce781e716830381a104d3dfc9cab8.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/TechnicalData", - "submodelElements": [ - { - "idShort": "Nennweite", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "DN25", - "valueType": "xs:string" - }, - { - "idShort": "Nenndruck", - "description": [ - { - "language": "de", - "text": "Beschreibung der Flanschbennung der Druckstufe" - }, - { - "language": "en", - "text": "description of the pressure stage of the label of the flange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK644#005" - } - ] - }, - "value": "PN40", - "valueType": "xs:string" - }, - { - "idShort": "Prozessanschluss", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" - }, - { - "language": "en", - "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB411#007" - } - ] - }, - "value": "geflanscht", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "371", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "14.409", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json b/server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json deleted file mode 100644 index 740cc4aff..000000000 --- a/server/storage/2a359306a9354cb42ab421b4b075a21cd52783d2f8025c125bee6c42ad156dca.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Pipe32_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json b/server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json deleted file mode 100644 index 07748dba6..000000000 --- a/server/storage/2a9116b72339b85c1f503fa55b2870ebc7a7a1344fdf6f16dd5fccaa6b3cbd64.json +++ /dev/null @@ -1,359 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/TechnicalData", - "submodelElements": [ - { - "idShort": "Measuring_range_conductivity", - "description": [ - { - "language": "de", - "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" - }, - { - "language": "en", - "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH095#003" - } - ] - }, - "value": "0.01...20", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_process_connection", - "description": [ - { - "language": "de", - "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" - }, - { - "language": "en", - "text": "classification of a process connection according to its fabricated form" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA021#007" - } - ] - }, - "value": "\"Thread G 1\"\" PES\"", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_temperature_sensor", - "description": [ - { - "language": "de", - "text": "Charakterisierung einer Temperatursensors bez\u00fcglich seiner elektrischen Ausf\u00fchrung" - }, - { - "language": "en", - "text": "classification of a temperature probe according to its electrical design" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN862#002" - } - ] - }, - "value": "Pt100", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_process_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" - }, - { - "language": "en", - "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN307#004" - } - ] - }, - "value": "135", - "valueType": "xs:string" - }, - { - "idShort": "Max_process_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY820#001" - } - ] - }, - "value": "16", - "valueType": "xs:string" - }, - { - "idShort": "Measurement_error", - "description": [ - { - "language": "de", - "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" - }, - { - "language": "en", - "text": "deviation of measured value from the true value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ356#003" - } - ] - }, - "value": "5% of reading", - "valueType": "xs:string" - }, - { - "idShort": "Repeatability", - "description": [ - { - "language": "de", - "text": "Grad der \u00dcbereinstimmung einer Anzahl aufeinander folgender Messungen des Ausgangssignals f\u00fcr denselben Wert der Eingangsvariablen unter denselben Bedingungen, wenn die Ausgangsvariable, aus der gleichen Richtung kommend, alle Werte ihres Bereichs durchl\u00e4uft" - }, - { - "language": "en", - "text": "degree of agreement for a number of subsequent measurements of the output signal for the same value of the input variable under the same conditions, when the output variable, originating from the same direction, passes through all variables in its range" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ350#003" - } - ] - }, - "value": "0.2% of reading", - "valueType": "xs:string" - }, - { - "idShort": "Minimum_ambient_temperature", - "description": [ - { - "language": "de", - "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" - }, - { - "language": "en", - "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as \u2018Climate class, W [climate class]. This appliance is intended to be used at an ambient temperature between \u2019X\u2019 [lowest temperature] \u00b0C and \u2019X\u2019 [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV259#003" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_ambient_temperature", - "description": [ - { - "language": "de", - "text": "\u201eKlimaklasse\u201c gem\u00e4\u00df Anhang VIII Tabelle 3 Nummer 1, angegeben als: \u201eKlimaklasse: W [Klimaklasse]. Dieses Ger\u00e4tist f\u00fcr den Betrieb bei einer Umgebungstemperatur zwischen\u201a X\u2018 [niedrigste Temperatur] \u00b0C und\u201a X\u2018 [h\u00f6chste Temperatur] \u00b0C bestimmt.\u201c" - }, - { - "language": "en", - "text": "\u2018climate class\u2019 in accordance with point 1, Table 3 of Annex VIII, and expressed as: \u2018Climate class: W [climate class]. This appliance is intended to be used at an ambient temperature between \u201cX\u201d [lowest temperature] \u00b0C and \u201cX\u201d [highest temperature] \u00b0C\u2019 - according to point (l) of Annex III of Regulation (EU) 1060/2010, supplementing Directive 2010/30/EU" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV260#002" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_storage_temperature", - "description": [ - { - "language": "de", - "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN272#004" - } - ] - }, - "value": "-25", - "valueType": "xs:string" - }, - { - "idShort": "Lower_limiting_value_of_storage_temperature", - "description": [ - { - "language": "de", - "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN276#004" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - }, - { - "idShort": "Min_air_humidity", - "description": [ - { - "language": "de", - "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW976#002" - } - ] - }, - "value": "5", - "valueType": "xs:string" - }, - { - "idShort": "Max_air_humidity", - "description": [ - { - "language": "de", - "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN164#003" - } - ] - }, - "value": "95", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json b/server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json deleted file mode 100644 index c20c244ea..000000000 --- a/server/storage/2c3cfdf81c1fe5116276a5602328f70c9154087ddf27e428533f89b818b7a921.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "HC30_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json b/server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json deleted file mode 100644 index f39c75c21..000000000 --- a/server/storage/2dde3402918c6fd2f7d9c3d11674755f359ad7cbf1863457c54782e0b9903b63.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T10_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/T10/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json b/server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json deleted file mode 100644 index 96afb633c..000000000 --- a/server/storage/2de6ebb28204f6b04bca65a4b1751072241ce59e82de32e74ad020d937319d8a.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Emerson Electric Co." - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Stellventil" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8000 West Florissant Avenue, P.O. Box 4100" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63136" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Saint Louis Missouri" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "US" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GX Stellventil" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2005", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json b/server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json deleted file mode 100644 index f3e85ee77..000000000 --- a/server/storage/2e3d9b2296273f8488dc14b7debe6acaf396910f3d0464f0f4c853222d338da6.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N13_Pumpe_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json b/server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json deleted file mode 100644 index 7b1fd1554..000000000 --- a/server/storage/2ecbaf4973a3769d8c36d7a6917ea14b7bbca536f7c81241fc11d1b1c2c54766.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y37_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json b/server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json deleted file mode 100644 index 848e9cb75..000000000 --- a/server/storage/2f72f331f2b974ecc656245a16a15c9f2542c45cd74c263a2a907048ea576f93.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Messumformer" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Dieselstra\u00dfe 24" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "70839" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Gerlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Mycom S CLM153" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json b/server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json deleted file mode 100644 index 62a85bf95..000000000 --- a/server/storage/2fc02bfc7e1ea29e1a9324291ca834b78994c08382e389683e3256ffabb06cd9.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "ABB Automation Products GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Temperatursensor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Borsigstr. 2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63755" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Alzenau" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TSP 121" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json b/server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json deleted file mode 100644 index 694bb9032..000000000 --- a/server/storage/300ea6a4b5e0d30378ca86723c7ac1b1119618552e3ca5ebb9c64f6f766ba2e3.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Y16", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "Y16_Regler", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler" - }, - { - "idShort": "HasComponent_Y16_Regler", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y16" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y16" - }, - { - "type": "Entity", - "value": "Y16_Regler" - } - ] - } - }, - { - "idShort": "Y16_Stellventil", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil" - }, - { - "idShort": "HasComponent_Y16_Stellventil", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y16" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y16" - }, - { - "type": "Entity", - "value": "Y16_Stellventil" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json b/server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json deleted file mode 100644 index 683d6d409..000000000 --- a/server/storage/30545e2ab32db8f5a49d38ffd4d2f8a72c522c6f70ba9e25f5eed1c333bbe471.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Masoneilan" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "SVI II-21121111" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Baker-Hughe-Strasse 1" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "29221" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Celle" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "SVI" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json b/server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json deleted file mode 100644 index e7a25de52..000000000 --- a/server/storage/33cf69a45f8ae6b0d6468b8dbe152b41bfb22ca367ed82d43649ddfb9b98d900.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y37_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json b/server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json deleted file mode 100644 index c576f7893..000000000 --- a/server/storage/3508008be77554b937a5a66daffb083095b518932696927546beaefb61b213a4.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "DynamicData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/DynamicData", - "submodelElements": [ - { - "idShort": "Level", - "description": [ - { - "language": "de", - "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." - }, - { - "language": "en", - "text": "Height of the liquid inside of the vessel in centimeter." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Level" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json b/server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json deleted file mode 100644 index 6d4fbd33a..000000000 --- a/server/storage/35d4ea141cca6941ec3acfbb661712c69fbf92692075bb7bdf5f6ba53d0c965d.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Pipe33_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json b/server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json deleted file mode 100644 index af759b8b8..000000000 --- a/server/storage/360b03a1dfcf9a80d6b02610c013079fd13487666c72580bc02df83f7cb8dc80.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F17_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json b/server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json deleted file mode 100644 index c71fbef4f..000000000 --- a/server/storage/3683160b61d2c2447fa256d813c718e28d55c59b1d8219daacb4fdc5334a5fd2.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GRUNDFOS" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "UPS 32-80 B 180" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Martin Bachs Vej 3" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8850" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Bjerringbro" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DK" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "UP UPS Series 100" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2006", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json b/server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json deleted file mode 100644 index faf06ec31..000000000 --- a/server/storage/36f62effc401575b6aa287fe7b0327813f9200f4b431e9ae75eebf9b98d8b2b4.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T20_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json b/server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json deleted file mode 100644 index fbc9e1687..000000000 --- a/server/storage/37f11d4840d3378d0716cdcfd7346c218f861f89f327e7764c2eb864f7fb1144.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/TechnicalData", - "submodelElements": [ - { - "idShort": "Case_Matrial", - "description": [ - { - "language": "de", - "text": "Eine auf Normen basierende Nummerierung der Werkstoffe. Durch Bezugnahme auf eine Norm ist der Werkstoff eindeutig beschrieben" - }, - { - "language": "en", - "text": "A norm-based numbering of the materials. The material is unambiguously described by referring to a norm" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ250#002" - } - ] - }, - "value": "CrNiMo-Steel 1.4571", - "valueType": "xs:string" - }, - { - "idShort": "Foerdergut", - "description": [ - { - "language": "de", - "text": "Im allgemeinen Sprachgebrauch \u00fcblicher Name oder der Handelsname des Stoffs oder Stoffgemisches" - }, - { - "language": "en", - "text": "Usual name or brand name of the material or material blend in general language" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO905#002" - } - ] - }, - "value": "reines Wasser", - "valueType": "xs:string" - }, - { - "idShort": "max_temprature", - "description": [ - { - "language": "de", - "text": "Oberste, nicht zu \u00fcberschreitende Temperatur des Materials oder Messstoffes, oberhalb der das Betriebsmittel ohne bleibende Ver\u00e4nderungen seiner Eigenschaften nicht betrieben werden darf" - }, - { - "language": "en", - "text": "For a given operating resource, the greatest temperature, not ever to be exceeded, of materials or measuring substances above which the resource cannot be operated without permanent changes in its characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA373#005" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Dichtung", - "description": [ - { - "language": "de", - "text": "Zusatzangaben zum Produktnamen der Abdichtung, um sie so bei einer Produktfamilie oder speziellen Auspr\u00e4gungen (Varianten) der Abdichtung voneinander unterscheiden zu k\u00f6nnen" - }, - { - "language": "en", - "text": "additional information for the product name of the sealing to be able to distinguish - for a product family or for special design (variants) - the products from each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO946#001" - } - ] - }, - "value": "BQ1EGG", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Schutzartklassen beschreibende Norm. Art und Nummer der Norm mit Ausgabejahr und Ausgabemonat sind anzugeben" - }, - { - "language": "en", - "text": "norm describing the protection type classes. Issue year and issue month must be given" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ042#002" - } - ] - }, - "value": "IP55", - "valueType": "xs:string" - }, - { - "idShort": "Head", - "description": [ - { - "language": "de", - "text": "im Betriebspunkt herrschende Differenz der Gesamtenergieh\u00f6he an der Austrittsseite des Pumpenaggregates zur Gesamtenergieh\u00f6he der Eintrittsseite des Pumpenaggregates" - }, - { - "language": "en", - "text": "difference between the total energy height on the outlet side of the pump aggregate and the total energy height of the intake side of the pump aggregate ruling at operating point" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAJ125#007" - } - ] - }, - "value": "0.41", - "valueType": "xs:string" - }, - { - "idShort": "Flow_Rate", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter F\u00f6rderstrom, den die Pumpe kontinuierlich ohne internen Schaden zu nehmen, erbringen kann, wenn sie bei Auslegungsdrehzahl und mit dem F\u00f6rdergut arbeitet, f\u00fcr die sie geliefert wurde" - }, - { - "language": "en", - "text": "greatest rate of flow the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAI023#005" - } - ] - }, - "value": "10.4", - "valueType": "xs:string" - }, - { - "idShort": "speed", - "description": [ - { - "language": "de", - "text": "h\u00f6chste zul\u00e4ssige Drehzahl der Pumpe" - }, - { - "language": "en", - "text": "highest permissible rotating speed of the pump" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAJ156#007" - } - ] - }, - "value": "1395", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json b/server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json deleted file mode 100644 index cf5559c51..000000000 --- a/server/storage/3850a491447c741c8d34adeb908090f7688f853c05cfd8bb1deaaf37a2cf96d8.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Q11_Conductivity_Sensor_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json b/server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json deleted file mode 100644 index 90663edb8..000000000 --- a/server/storage/38c337af84e6ef02708d24ad266146f16eda31e5afe2dc8e4c3528cf61a5b1de.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y13_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y13/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json b/server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json deleted file mode 100644 index e817bf552..000000000 --- a/server/storage/38fbd7a8fc50b036882cf5a14759cdaa4e60975917ef731467397daa8c177141.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json b/server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json deleted file mode 100644 index 8237a2cea..000000000 --- a/server/storage/3a643ecdc26d0ab3669a72c12128d6dcb9f2c7170d69990755d31628758cfa62.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/TechnicalData", - "submodelElements": [ - { - "idShort": "Nennweite", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "G1/2", - "valueType": "xs:string" - }, - { - "idShort": "Einbaulaenge", - "description": [ - { - "language": "de", - "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" - }, - { - "language": "en", - "text": "overall length of that part of a device or component to be found within a containment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM599#004" - } - ] - }, - "value": "100", - "valueType": "xs:string" - }, - { - "idShort": "min_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-50\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "400\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "14571", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json b/server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json deleted file mode 100644 index 699620680..000000000 --- a/server/storage/3bdd276b72ec7ba917a37cbd952bff00d8e89b3dacd9f2acc9f82a457bf57278.json +++ /dev/null @@ -1,1250 +0,0 @@ -{ - "data": { - "idShort": "TimeSeries", - "description": [ - { - "language": "de", - "text": "Enth\u00e4lt Zeitreihendaten und Referenzen auf Zeitreihendaten, um diese entlang des Asset\n Lebenszyklus aufzufinden und semantisch zu beschreiben.\n " - }, - { - "language": "en", - "text": "Contains time series data and references to time series data to discover and semantically\n describe them along the asset lifecycle.\n " - } - ], - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/TimeSeries", - "administration": { - "version": "1", - "revision": "1" - }, - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/1/1" - } - ] - }, - "kind": "Template", - "submodelElements": [ - { - "idShort": "Metadata", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Metadata/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "f22_current_value" - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Description/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "Current process value of flow sensor F22" - } - ] - }, - { - "idShort": "Record", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Record/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Time", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/RelativePointInTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/SubmodelTemplates/Cardinality/1/0\n " - } - ] - }, - "value": "OneToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - }, - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/SubmodelTemplates/AllowedIdShort/1/0\n " - } - ] - }, - "value": "Time[\\d{2,3}]", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "AllowedIdShort" - } - ], - "valueType": "xs:long" - } - ] - } - ] - }, - { - "idShort": "Segments", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "ExternalSegment", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/ExternalSegment/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "externalSegment f22_current_value " - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "An example external segment of current process value of flow sensor F22" - } - ] - }, - { - "idShort": "RecordCount", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "360", - "valueType": "xs:long" - }, - { - "idShort": "StartTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07 17:55:03.579795+00:00", - "valueType": "xs:string" - }, - { - "idShort": "EndTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07T18:54:52.324618+00:00", - "valueType": "xs:string" - }, - { - "idShort": "Duration", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "T1H", - "valueType": "xs:string" - }, - { - "idShort": "SamplingInterval", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "10", - "valueType": "xs:long" - }, - { - "idShort": "SamplingRate", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "State", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "completed", - "valueType": "xs:string" - }, - { - "idShort": "LastUpdate", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07T18:54:52.324618+00:00", - "valueType": "xs:string" - }, - { - "idShort": "File", - "category": "PARAMETER", - "modelType": "File", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/File/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "contentType": "String", - "value": "C:\\Users\\wan\\sciebo\\Lehrstuhl\\PLS-Labor\\Digitalisierung Pumpwerk\\AAS Pumpwerk\\2024\\Test Metadata\\f22_current_value.xlsx" - }, - { - "idShort": "Blob", - "category": "VARIABLE", - "modelType": "Blob", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Blob/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "contentType": "application/json" - } - ] - }, - { - "idShort": "LinkedSegment", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/LinkedSegment/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "linkedSegment f22_current_value " - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "An example linked segment of current process value of flow sensor F22" - } - ] - }, - { - "idShort": "RecordCount", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "StartTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "EndTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07T18:55:00", - "valueType": "xs:string" - }, - { - "idShort": "Duration", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "T1H", - "valueType": "xs:string" - }, - { - "idShort": "SamplingInterval", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "10", - "valueType": "xs:long" - }, - { - "idShort": "SamplingRate", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "State", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "complete", - "valueType": "xs:string" - }, - { - "idShort": "LastUpdate", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "Endpoint", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Endpoint/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "http://10.42.0.114:8086", - "valueType": "xs:string" - }, - { - "idShort": "Query", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Query/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "from(bucket: \"iat\")\n |> range(start: {range_start}, stop: {range_stop}) \n |> filter(fn: (r) => r._measurement == \"f22_current_value\"", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "InternalSegment", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/InternalSegment/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ] - }, - { - "idShort": "RecordCount", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "StartTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "EndTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "Duration", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "SamplingInterval", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "SamplingRate", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "State", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "LastUpdate", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "Records", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Records/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Record", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Record/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Time", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/RelativePointInTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/SubmodelTemplates/Cardinality/1/0\n " - } - ] - }, - "value": "OneToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - }, - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/SubmodelTemplates/AllowedIdShort/1/0\n " - } - ] - }, - "value": "Time[\\d{2,3}]", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "AllowedIdShort" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "sampleAccelerationX", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://sample.com/AccelerationX/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "sampleAccelerationY", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://sample.com/AccelerationY/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "sampleAccelerationZ", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://sample.com/AccelerationZ/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - } - ] - } - ] - } - ] - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json b/server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json deleted file mode 100644 index 967ae95d2..000000000 --- a/server/storage/3f1ddfcb392693961085fee8a71ed9edce8cc4f0615d725cf022b1b0c7ea8df8.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Pipe31_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json b/server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json deleted file mode 100644 index a7febc4cd..000000000 --- a/server/storage/40468b30fcae3d45d6be88b0b3f7b7050cc54a45d607c97b381000996107c272.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N18_Frequenzumrichter_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json b/server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json deleted file mode 100644 index 77f0a7b94..000000000 --- a/server/storage/40476942ebf03e2db6b23ac8fe31ecbe99426bf178f531d7b697c6e0917580fb.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GRUNDFOS" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "MGE 71A2-14FT85C" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Park u. 8" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "H-2045" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Toeroekbalint" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "HU" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "MGE 71" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json b/server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json deleted file mode 100644 index c6230b6cd..000000000 --- a/server/storage/412b618faaeaf0bbb074baf89dc36e3a42e1800f68ca04ed11fd10c2daa9426c.json +++ /dev/null @@ -1,424 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Pipe11", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "N13", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13" - }, - { - "idShort": "HasControlModule_N13", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - }, - { - "type": "Entity", - "value": "N13" - } - ] - } - }, - { - "idShort": "P14", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14" - }, - { - "idShort": "HasControlModule_P14", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - }, - { - "type": "Entity", - "value": "P14" - } - ] - } - }, - { - "idShort": "T15", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15" - }, - { - "idShort": "HasControlModule_T15", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - }, - { - "type": "Entity", - "value": "T15" - } - ] - } - }, - { - "idShort": "F17", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17" - }, - { - "idShort": "HasControlModule_F17", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - }, - { - "type": "Entity", - "value": "F17" - } - ] - } - }, - { - "idShort": "Y16", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16" - }, - { - "idShort": "HasControlModule_Y16", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe11" - }, - { - "type": "Entity", - "value": "Y16" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json b/server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json deleted file mode 100644 index 13d10d17c..000000000 --- a/server/storage/41ac40314426f2ec81a24a0ad25b3e5124ca0074335397ec0a841862c43352de.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "data": { - "modelType": "AssetAdministrationShell", - "id": "http://acplt.org/Test_Asset", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "http://acplt.org/Test_Asset" - } - } -} \ No newline at end of file diff --git a/server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json b/server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json deleted file mode 100644 index 0d43e9456..000000000 --- a/server/storage/425dbc117bc209f8723f29d5c0ff343eef78556826ca6cd60414360de305bae8.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/TechnicalData", - "submodelElements": [ - { - "idShort": "Type_of_input_signal", - "description": [ - { - "language": "de", - "text": "Form und/oder Funktion des Signals am Eingang, das sowohl wertediskontinuierlich (bin\u00e4r) als auch wertekontinuierlich (analog oder auch die digitale Abbildung eines Analogsignals) in Bezug auf den G\u00fcltigkeitsbereich des Signal sein kann" - }, - { - "language": "en", - "text": "form and/or function of the signal at the input which can be discontinuous (binary) or continuous (analog or as digital mapping of an analog signal) in respect to the signal's range of validity" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA004#006" - } - ] - }, - "value": "4-20mA", - "valueType": "xs:string" - }, - { - "idShort": "Plug_type", - "description": [ - { - "language": "de", - "text": "Art des am Ger\u00e4t angeschlossenen Steckers zur Versorgung des Ger\u00e4tes mit elektrischer Energie" - }, - { - "language": "en", - "text": "version of plug that the appliance is delivered with" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAE804#005" - } - ] - }, - "value": "contoured, heavy top guided", - "valueType": "xs:string" - }, - { - "idShort": "Max_operating_temperature_range", - "description": [ - { - "language": "de", - "text": "oberer Grenzwert des Einsatzes in einer bestimmten Temperatur, in dem ein Betriebsmittel eingesetzt werden kann, ohne dass sich bestimmte garantierte Eigenschaften gravierend \u00e4ndern, abh\u00e4ngig von der Verweildauer" - }, - { - "language": "en", - "text": "maximum boundary value of the usage in a specified temperature, in which an operating unit can be used, without serious changes of assigned features, depending on the exposure time" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAG321#003" - } - ] - }, - "value": "350", - "valueType": "xs:string" - }, - { - "idShort": "Min_operating_temperature_range", - "description": [ - { - "language": "de", - "text": "unterer Grenzwert des Temperatureinsatzbereiches. Der Temperatureinsatzbereich von Betriebsmitteln beschreibt den Temperaturbereich, in dem diese eingesetzt werden k\u00f6nnen, ohne dass sich bestimmte garantierte Eigenschaften gravierend \u00e4ndern. Zeitliche Einschr\u00e4nkungen wie Kurzzeit oder Dauer m\u00fcssen angegeben werden" - }, - { - "language": "en", - "text": "minimum boundary value of the usage in a specified temperature, in which an operating unit can be used, without serious changes of assigned features, depending on the exposure time. Temporal restrictions like short-time or durability have to be stated" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAG322#003" - } - ] - }, - "value": "-29", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_body_weight", - "description": [ - { - "language": "de", - "text": "vom Hersteller empfohlenes h\u00f6chste K\u00f6rpergewicht des Anwenders, um das Produkt bestimmungsgem\u00e4\u00df zu nutzen" - }, - { - "language": "en", - "text": "greatest body weight of user recommended by the manufacturer for the intended use of product" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAA912#006" - } - ] - }, - "value": "7", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json b/server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json deleted file mode 100644 index 3b343d850..000000000 --- a/server/storage/4360c813b0348c83efc17edff5e7e5dae06eb662c6c5deee15ffd68ddff2a8db.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Leitf\u00e4higkeitsmesswertaufnehmer" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Dieselstra\u00dfe 24" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "70839" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Gerlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "CLS21 Condumax" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json b/server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json deleted file mode 100644 index 9126a3df6..000000000 --- a/server/storage/438a0a1bfe3912fed1453024d2fc691aba6afb5f4e168e7ebfbdf553de186a49.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F16_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/F16/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json b/server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json deleted file mode 100644 index 9e6752150..000000000 --- a/server/storage/44a90cc560f00dbb2cd07371f5865ad747e83c32006e3fe293f531c17d124ec2.json +++ /dev/null @@ -1,384 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/TechnicalData", - "submodelElements": [ - { - "idShort": "Nennweite", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "DN25", - "valueType": "xs:string" - }, - { - "idShort": "Nenndruck", - "description": [ - { - "language": "de", - "text": "Beschreibung der Flanschbennung der Druckstufe" - }, - { - "language": "en", - "text": "description of the pressure stage of the label of the flange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK644#005" - } - ] - }, - "value": "PN40", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "14571", - "valueType": "xs:string" - }, - { - "idShort": "Dichtwerkstoff", - "description": [ - { - "language": "de", - "text": "Substanz, aus welcher die Dichtung hergestellt ist" - }, - { - "language": "en", - "text": "substance from which a leave is manufactured" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK468#006" - } - ] - }, - "value": "PTFE", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP67", - "valueType": "xs:string" - }, - { - "idShort": "Betriebsmedium", - "description": [ - { - "language": "de", - "text": "Medium, mit welchem das Ger\u00e4t betrieben werden darf (Medium am Eingang)" - }, - { - "language": "en", - "text": "temperature at which the specified accuracy data are valid. For deviations from the nominal temperature, the specified temperature coefficients must be must be added to the specified accuracies" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD905#001" - } - ] - }, - "value": "Wasser", - "valueType": "xs:string" - }, - { - "idShort": "min_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-55\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "200\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "min_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-20\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "70\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "Ausgang", - "description": [ - { - "language": "de", - "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" - }, - { - "language": "en", - "text": "rules and agreements by that communication partner can interact with each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW333#001" - } - ] - }, - "value": "4 - 20 mA DC/ HART", - "valueType": "xs:string" - }, - { - "idShort": "Spannungsversorgung", - "description": [ - { - "language": "de", - "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" - }, - { - "language": "en", - "text": "describes the source of electrical energy that supplies the object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK788#003" - } - ] - }, - "value": "24...46", - "valueType": "xs:string" - }, - { - "idShort": "max_Durchfluss", - "description": [ - { - "language": "de", - "text": "Wassermenge, die maximal pro Zeiteiheit durch das Ger\u00e4t flie\u00dfen kann" - }, - { - "language": "en", - "text": "maximum water quantity which can flow through the appliance per time unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC971#002" - } - ] - }, - "value": "6", - "valueType": "xs:string" - }, - { - "idShort": "Messwertabweichung", - "description": [ - { - "language": "de", - "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" - }, - { - "language": "en", - "text": "deviation of measured value from the true value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ356#003" - } - ] - }, - "value": " \u00b1 0,5 % v. M. unter Referenzbedingungen", - "valueType": "xs:string" - }, - { - "idShort": "zul_Viskositaet", - "description": [ - { - "language": "de", - "text": "H\u00f6chste zul\u00e4ssige Viskosit\u00e4t des Messstoffes, Betriebsstoffes oder Mediums f\u00fcr einen bestimmungsgem\u00e4\u00dfen Gebrauch des Betriebsmittels" - }, - { - "language": "en", - "text": "Greatest permissible viscosity of measured substance, operating substances or mediums for the operating resource to be used as intended" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA046#006" - } - ] - }, - "value": "7.5Ma s", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json b/server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json deleted file mode 100644 index 08cc8dd33..000000000 --- a/server/storage/46868b81deb60c4596ff9a83bb410b00988c057572f5ff5b082bc965085aa11e.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y14_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y14/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json b/server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json deleted file mode 100644 index ee7ca1bd1..000000000 --- a/server/storage/46951422fcf1d753bb04767147776ae40689cb4ea5f8f7baf94f49ebdd8e58c7.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Emerson Electric Co." - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Stellventil" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8000 West Florissant Avenue, P.O. Box 4100" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63136" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Saint Louis Missouri" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "US" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GX Stellventil" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2005", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json b/server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json deleted file mode 100644 index dd6914c6d..000000000 --- a/server/storage/47a6db81f903d06dcd7c8a983a7b5746d5a7b4a162a8a712060d8b6ee31d426f.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "KSB AG" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "frequency converter" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Johann-Klein-Str. 9" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "67227" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Frankenthal" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "PumpDrive" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json b/server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json deleted file mode 100644 index adb345692..000000000 --- a/server/storage/482f0598597d73bd7e37c62c0826169b998dc2bf7b82eacb9b8be212f04045b3.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/TechnicalData", - "submodelElements": [ - { - "idShort": "Type_of_insert_element_terminal_block", - "description": [ - { - "language": "de", - "text": "Charakterisierung des Anschlussblocks eines Messeinsatzes bez\u00fcglich Ausf\u00fchrung oder Vorhandensein" - }, - { - "language": "en", - "text": "classification of the terminal block of an insert according to its design or existence" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAT747#004" - } - ] - }, - "value": "minearl insulated(MI), flexibel", - "valueType": "xs:string" - }, - { - "idShort": "Outer_diameter", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Abstand zwischen zwei gegen\u00fcberliegenden Punkten auf dem \u00e4u\u00dferen Umfang" - }, - { - "language": "en", - "text": "largest distance between two opposite points on the outer circumference" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF192#004" - } - ] - }, - "value": "6", - "valueType": "xs:string" - }, - { - "idShort": "Max_operating_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC821#006" - } - ] - }, - "value": "600", - "valueType": "xs:string" - }, - { - "idShort": "Min_operating_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "minimum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC820#006" - } - ] - }, - "value": "-50", - "valueType": "xs:string" - }, - { - "idShort": "Max_process_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY820#001" - } - ] - }, - "value": "20", - "valueType": "xs:string" - }, - { - "idShort": "Response_time", - "description": [ - { - "language": "de", - "text": "Zeit zwischen dem Erregen und dem ersten Schlie\u00dfen oder \u00d6ffnen des Kontaktkreises f\u00fcr ein Schaltger\u00e4t im Ruhezustand" - }, - { - "language": "en", - "text": "time between triggering and the first closing or opening of the contact circuit for a switching device in idle state" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA572#007" - } - ] - }, - "value": "3", - "valueType": "xs:string" - }, - { - "idShort": "Tip_length", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfte Ausdehnung einer Spitze l\u00e4ngs einer Symmetrieachse oder die Entfernung zwischen zwei festgelegten Punkten gem\u00e4\u00df Messvorschrift" - }, - { - "language": "en", - "text": "maximum dimension of tip along the axis of symmetry or distance between two defined points" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABF062#001" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "Insulation_resistance", - "description": [ - { - "language": "de", - "text": "Widerstand der Isolierung gegen das Flie\u00dfen eines elektrischen Stromes" - }, - { - "language": "en", - "text": "Resistance of insulation against the flow of an electric current" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ352#003" - } - ] - }, - "value": "100", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json b/server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json deleted file mode 100644 index f42d987b4..000000000 --- a/server/storage/48798a70777d2722c31667dfdcb2cbff8b373759263ac9f41014a76f75096b8c.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F17_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F17/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json b/server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json deleted file mode 100644 index 4dd1a2f68..000000000 --- a/server/storage/48b860c2c5ce932857131ef59f193959038d700ba8bdb6692dcbd5d29958f1a5.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y16/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json b/server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json deleted file mode 100644 index 4909b3530..000000000 --- a/server/storage/48c51674f060d493f694214500a31868cb9c7651b7533d8588b93d1895aac092.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Y37", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "Y37_Positioner", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner" - }, - { - "idShort": "HasComponent_Y37_Positioner", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y37" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y37" - }, - { - "type": "Entity", - "value": "Y37_Positioner" - } - ] - } - }, - { - "idShort": "Y37_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve" - }, - { - "idShort": "HasComponent_Y37_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y37" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y37" - }, - { - "type": "Entity", - "value": "Y37_Valve" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json b/server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json deleted file mode 100644 index 22521779a..000000000 --- a/server/storage/4949958cc7ad16b30c1f4ca76e4e96136cf4b665ad4d81dabfa4f823e009396f.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T12_Temperature_Sensor_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json b/server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json deleted file mode 100644 index 479d834ae..000000000 --- a/server/storage/496f015e1cbf6e4240dc8f9790a5bff6f9b8b82a4a7187ce12a7882b18e51aea.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/TechnicalData", - "submodelElements": [ - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4...20mA/HART", - "valueType": "xs:string" - }, - { - "idShort": "min_process_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_process_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "150", - "valueType": "xs:string" - }, - { - "idShort": "min_ambient_temperature", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_ambient_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "min_storage_temperature", - "description": [ - { - "language": "de", - "text": "minimal zul\u00e4ssige Lagertemperatur des Betriebsmittels" - }, - { - "language": "en", - "text": "minimum permissible temperature of the operating resource during storage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABA653#001" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_storage_temperature", - "description": [ - { - "language": "de", - "text": "maximal zul\u00e4ssige Lagertemperatur des Betriebsmittels" - }, - { - "language": "en", - "text": "maximum permissible temperature of the operating resource during storage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABA654#001" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Power_supply", - "description": [ - { - "language": "de", - "text": "Versorgung von Ger\u00e4ten oder Anlagen mit gesonderter, zus\u00e4tzlicher Stromzuf\u00fchrung" - }, - { - "language": "en", - "text": "supply of devices or systems with separate, additional power supply" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ002#001" - } - ] - }, - "value": "12...36", - "valueType": "xs:string" - }, - { - "idShort": "Min_process_pressure", - "description": [ - { - "language": "de", - "text": "kleinster Absolutwert des die Mess- oder Stelleinrichtung ber\u00fchrenden Druckes, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the least absolute value of the pressure which affects them and under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY641#001" - } - ] - }, - "value": "-1", - "valueType": "xs:string" - }, - { - "idShort": "Max_process_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY820#001" - } - ] - }, - "value": "40", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP66/67", - "valueType": "xs:string" - }, - { - "idShort": "Accuracy_of_the_measuring_instrument", - "description": [ - { - "language": "de", - "text": "Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" - }, - { - "language": "en", - "text": "degree of approximation between a result of determination and the approved reference value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH809#004" - } - ] - }, - "value": "\u00b18", - "valueType": "xs:string" - }, - { - "idShort": "length", - "description": [ - { - "language": "de", - "text": "Angabe zur physikalische Ausdehnung eines Produktes" - }, - { - "language": "en", - "text": "information on the physical dimension of a product" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAG779#003" - } - ] - }, - "value": "300", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json b/server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json deleted file mode 100644 index 4fa4260e6..000000000 --- a/server/storage/4995b6da0e7897ba61b52e6cd62a3387718f3236c1b1aaf2b809b397df5c60b3.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "P19_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json b/server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json deleted file mode 100644 index 2a7766617..000000000 --- a/server/storage/4ba8c8091f87f4630b7301fd89f2f0ddd1833540bd997b37c924d9573b020725.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Samson AG " - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "pneumatischer Schwenkantrieb" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Strazacka 35" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "43-382" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Bielsko-Biala" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "PO" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "RD RDF10-3" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json b/server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json deleted file mode 100644 index 8e903ce6a..000000000 --- a/server/storage/4c809af41df054307f49a6bca43a22be573a79859e09196c847ba53af9bcf94a.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N12_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/N12/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json b/server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json deleted file mode 100644 index 2eb286d56..000000000 --- a/server/storage/4e322cdeb4c109a5a1051d41b102f669df6651faf6973c33f2d20447b0d2f298.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N13_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json b/server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json deleted file mode 100644 index 646ced613..000000000 --- a/server/storage/4ea1707f21627dd8a74eebf3ac68d43cc64c96fa52f8e2c0f8164d56a4c2872a.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T12_Messumformer_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json b/server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json deleted file mode 100644 index cf5a0bf3b..000000000 --- a/server/storage/4ec8e8f2e5351a4abbf84921986dac95a9b0d7e3779e64d39e4e0440c59920ba.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y18_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json b/server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json deleted file mode 100644 index e347bb8a8..000000000 --- a/server/storage/5001fa832c126449e1d7acce94aba193c9d3f180ad36c9611ffc98bd17fb0e42.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/TechnicalData", - "submodelElements": [ - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4-20mA/HART", - "valueType": "xs:string" - }, - { - "idShort": "Measuring_range", - "description": [ - { - "language": "de", - "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" - }, - { - "language": "en", - "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH095#003" - } - ] - }, - "value": "0-1000", - "valueType": "xs:string" - }, - { - "idShort": "Sensor_type", - "description": [ - { - "language": "de", - "text": "Zusatzangaben zur Bezeichnung von Sensoren, um so bei einer Sensorenfamilie oder bei speziellen Auspr\u00e4gungen (Varianten) die Sensoren voneinander unterscheiden zu k\u00f6nnen" - }, - { - "language": "en", - "text": "Additional information for describing sensors to be able to distinguish - for a sensor family or for special design (variants) - the products from each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA063#005" - } - ] - }, - "value": "2-elektrode", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_temperature_sensor", - "description": [ - { - "language": "de", - "text": "Charakterisierung einer Temperatursensors bez\u00fcglich seiner elektrischen Ausf\u00fchrung" - }, - { - "language": "en", - "text": "classification of a temperature probe according to its electrical design" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN862#002" - } - ] - }, - "value": "Pt1000", - "valueType": "xs:string" - }, - { - "idShort": "Temperature_compensation", - "description": [ - { - "language": "de", - "text": "Beschreibung der Art und Weise, wie der Einfluss der Temperatur auf das Messergebnis korrigiert wird" - }, - { - "language": "en", - "text": "Principle of temperature correction" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAE809#006" - } - ] - }, - "value": "NaCl in water", - "valueType": "xs:string" - }, - { - "idShort": "Max_ambient_temperature_during_operating_phase", - "description": [ - { - "language": "de", - "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" - }, - { - "language": "en", - "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF525#003" - } - ] - }, - "value": "55", - "valueType": "xs:string" - }, - { - "idShort": "Min_ambient_temperature_during_operating_phase", - "description": [ - { - "language": "de", - "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / kleinster Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht mehr unterschritten werden kann oder darf" - }, - { - "language": "en", - "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / lower limit value of a physical quantity whose value cannot or must not be undershot" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF526#003" - } - ] - }, - "value": "-10", - "valueType": "xs:string" - }, - { - "idShort": "Supply_voltage_at_DC", - "description": [ - { - "language": "de", - "text": "erforderliche Spannung als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten / unter der Bedingung: Art des Stromes = direct current (Gleichstrom)" - }, - { - "language": "en", - "text": "required voltage as electromotive force that must temporally or permanently apply at the power supply input of an electric device to maintain the function of the operating resource / on condition: type of current = direct current (d.c.)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF535#004" - } - ] - }, - "value": "24", - "valueType": "xs:string" - }, - { - "idShort": "Step_response_time_t90", - "description": [ - { - "language": "de", - "text": "zeitliche Dauer, bei einer stufenartigen Ver\u00e4nderung des Eingangssignals eines Systems, die die \u00c4nderung des Ausgangssignals des Systems ben\u00f6tigt, um zum ersten Mal 90% des letzten Werts des stabilen Zustands zu erreichen" - }, - { - "language": "en", - "text": "time duration from a step change in the input signal to a system for the change in output of the system to reach for the first time 90% of its final steady state value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM701#004" - } - ] - }, - "value": "7", - "valueType": "xs:string" - }, - { - "idShort": "Accuracy", - "description": [ - { - "language": "de", - "text": "Das Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" - }, - { - "language": "en", - "text": "extent of approximation of a result derived from measurements to the recognized reference value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA989#004" - } - ] - }, - "value": "0.3", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json b/server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json deleted file mode 100644 index 31cd6028f..000000000 --- a/server/storage/50a933f66160836852bcaed16c28e894a0d775dffceed1d7d80d96540d0ec747.json +++ /dev/null @@ -1,589 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/TechnicalData", - "submodelElements": [ - { - "idShort": "Input", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Function", - "description": [ - { - "language": "de", - "text": "Funktionsweise des Ger\u00e4ts." - }, - { - "language": "en", - "text": "Functioning of the device." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Function" - } - ] - }, - "value": "K-band FMCW radar", - "valueType": "xs:string" - }, - { - "idShort": "Min_tank_height", - "description": [ - { - "language": "de", - "text": "Minimale H\u00f6he in des Beh\u00e4lters, in dem der F\u00fcllstand gemmessen werden soll." - }, - { - "language": "en", - "text": "Minimum height of the tank in which the level is to be measured." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/MinTankHeight" - } - ] - }, - "value": "0.5", - "valueType": "xs:string" - }, - { - "idShort": "Max__measuring_range", - "description": [ - { - "language": "de", - "text": "Maximale H\u00f6he des Beh\u00e4lters, in dem der F\u00fcllstand gemmessen werden soll.." - }, - { - "language": "en", - "text": "Maximum height of the tank in which the level is to be measured." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/MaxMeasuringRange" - } - ] - }, - "value": "40", - "valueType": "xs:string" - }, - { - "idShort": "Blocking_Distance_dead_zone", - "description": [ - { - "language": "de", - "text": "Totzone im vermessenen Beh\u00e4lter, welche nicht vom Sensor erkannt werden kann." - }, - { - "language": "en", - "text": "Dead zone in the measured container, which cannot be detected by the sensor." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/BlockingDistance" - } - ] - }, - "value": "\"Antenna ex tension length + antenna length + 0.1 m / 4\"\"\"", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Output", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAG973#004" - } - ] - }, - "value": "4...20 mA HART\u00ae or 3.8...20.5 mA acc. to NAMUR NE 43", - "valueType": "xs:string" - }, - { - "idShort": "Accuracy", - "description": [ - { - "language": "de", - "text": "Relative Messgenauigkeit in % bei einer Temperatur von 20\u00b0C und einer Signalst\u00e4rke von 20mA." - }, - { - "language": "en", - "text": "Relative measurement accuracy in % at a temperature of 20\u00b0C and a signal strength of 20mA." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Accuracy" - } - ] - }, - "value": "0.05% (rel. 20 mA, 20\u00b0C / 68\u00b0F)", - "valueType": "xs:string" - }, - { - "idShort": "Resolution", - "description": [ - { - "language": "de", - "text": "Aufl\u00f6sung des Ausgangssignals." - }, - { - "language": "en", - "text": "Resolution of the output signal." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Resolution" - } - ] - }, - "value": "\u00b12", - "valueType": "xs:string" - }, - { - "idShort": "Temperature_drift", - "description": [ - { - "language": "de", - "text": "temperaturbezogene \u00c4nderung der Messgr\u00f6\u00dfe eines Messger\u00e4tes bezogen auf die Messspanne dieser Messgr\u00f6\u00dfe" - }, - { - "language": "en", - "text": "Temperature-related change of the measured quantity of a measuring instrument related to the measuring range of this measured magnitude" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC140#007" - } - ] - }, - "value": "0.005", - "valueType": "xs:string" - }, - { - "idShort": "Error_signal", - "description": [ - { - "language": "de", - "text": "Ausfallsignal hoch und niedrig." - }, - { - "language": "en", - "text": "Error Signal high and low." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/ErrorSignal" - } - ] - }, - "value": "High: 22 mA, Low : 3.6 mA acc. to NAMUR NE 43", - "valueType": "xs:string" - }, - { - "idShort": "Max__Load", - "description": [ - { - "language": "de", - "text": "Maximaler ohmscher Widerstand." - }, - { - "language": "en", - "text": "Maximum ohmic resistance." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/MaxLoad" - } - ] - }, - "value": "350", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Measuring_accuracy", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Resolution", - "description": [ - { - "language": "de", - "text": "Aufl\u00f6sung des Messwerts." - }, - { - "language": "en", - "text": "Resolution of the measured value." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/MeasurementResolution" - } - ] - }, - "value": "1", - "valueType": "xs:string" - }, - { - "idShort": "Accuracy", - "description": [ - { - "language": "de", - "text": "Messgenaugikeit in mm." - }, - { - "language": "en", - "text": "Measurement accuracy in mm." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/MeasurementAccuracy" - } - ] - }, - "value": "+/-3", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Application_conditions", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Ambient_temperature", - "description": [ - { - "language": "de", - "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr die Prozessanschlusstemperatur." - }, - { - "language": "en", - "text": "Permissible temperature range of the process connection temperature." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/FlangeTemperature" - } - ] - }, - "value": "-40...+80\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "min_Storage_temperature", - "description": [ - { - "language": "de", - "text": "minimaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature above which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN276#004" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_Storage_temperature", - "description": [ - { - "language": "de", - "text": "maximaler Temperaturwert, bei dem das Ger\u00e4t ohne permanenten Schaden f\u00fcr die Betriebsf\u00e4higkeit gelagert oder transportiert werden darf" - }, - { - "language": "en", - "text": "temperature up to which the device may be stored or transported without any permanent impairment to its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN272#004" - } - ] - }, - "value": "85", - "valueType": "xs:string" - }, - { - "idShort": "Flange_temperature", - "description": [ - { - "language": "de", - "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr die Prozessanschlusstemperatur." - }, - { - "language": "en", - "text": "Permissible temperature range of the process connection temperature." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/FlangeTemperature" - } - ] - }, - "value": "-40...+150\u00b0C", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Mechanical_data", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Housing", - "description": [ - { - "language": "de", - "text": "Materialzusammensetzung, aus der ein einzelnes Bauteil hergestellt ist, als Ergebnis eines Herstellungsprozesses, in dem der/die Rohstoff(e) durch Extrusion, Verformung, Schwei\u00dfen usw. in die endg\u00fcltige Form gebracht werden" - }, - { - "language": "en", - "text": "material composition that a single component comprises as the result of a manufacturing process whereby the raw material(s) are given their final shape by means of extrusion, molding, welding or other processes" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAB664#016" - } - ] - }, - "value": "Aluminium", - "valueType": "xs:string" - }, - { - "idShort": "Wetted_parts", - "description": [ - { - "language": "de", - "text": "Werkstoff der medienber\u00fchrenden Teile, einschlie\u00dflich der Antenne." - }, - { - "language": "en", - "text": "Material of the parts in contact with the medium, including the antenna." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/WettedParts" - } - ] - }, - "value": "Stainless steel (1.4404 / 316L), Hastelloy C-22 (2.4602)", - "valueType": "xs:string" - }, - { - "idShort": "Process_fitting", - "description": [ - { - "language": "de", - "text": "Werkstoff des Prozessanschlusse." - }, - { - "language": "en", - "text": "Material of the process fitting." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/ProcessFitting" - } - ] - }, - "value": "Stainless steel (1.4404 / 316L), Hastelloy C-22 (2.4602)", - "valueType": "xs:string" - }, - { - "idShort": "Gaskets", - "description": [ - { - "language": "de", - "text": "Flanschausf\u00fchrung nach EN 1092-1." - }, - { - "language": "en", - "text": "Flange design according to EN 1092-1." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Gaskets" - } - ] - }, - "value": "Viton (-40...+150\u00b0C / -40...+300\u00b0F), Kalrez 6375 (-20...+150\u00b0C / -5...+300\u00b0F)", - "valueType": "xs:string" - }, - { - "idShort": "Thread", - "description": [ - { - "language": "de", - "text": "Gewinde f\u00fcr den Prozessanschluss." - }, - { - "language": "en", - "text": "Thread for process connetcion." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Thread" - } - ] - }, - "value": "\"G 1 1/2\"\", NPT 1 1/2\"\"\"", - "valueType": "xs:string" - }, - { - "idShort": "Flange", - "description": [ - { - "language": "de", - "text": "Flanschausf\u00fchrung nach EN 1092-1." - }, - { - "language": "en", - "text": "Flange design according to EN 1092-1." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Flange" - } - ] - }, - "value": "\"DN 40...DN 150 (PN 40 / PN 16), 1 1/2\"\"...8\"\" (150 lb / 300 lb), 10 K (40...100A)\"", - "valueType": "xs:string" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json b/server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json deleted file mode 100644 index d1e6f68e5..000000000 --- a/server/storage/51b6fa4b3365366da25cf090ce9144902d139910c6cb97d3d30847949ddd7757.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Pipe21_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json b/server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json deleted file mode 100644 index 4e1b8bf64..000000000 --- a/server/storage/51f4cf100dd28cadffebcf09e1717f37740b2d34443b39b5285d68c5ace055cc.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y14_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json b/server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json deleted file mode 100644 index 98376d76b..000000000 --- a/server/storage/5392d4be297ac103200c1000c605873aab80273f6efd44e874ad7558a7018106.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L10_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L10/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json b/server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json deleted file mode 100644 index 479cff06a..000000000 --- a/server/storage/53de27b37b0250793a5b2600941b4b9fc3a89cc12906af6700961f7be9d78c86.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "IAT" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Unit" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TU10" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json b/server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json deleted file mode 100644 index 60884ca24..000000000 --- a/server/storage/5417aa08de081421fb335902fc82b85c464c5400ca91c27b624646b2a12cf141.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L10_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L10/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json b/server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json deleted file mode 100644 index ff267e408..000000000 --- a/server/storage/5484f6c8c6df3a3b118e0570e6fcd8834ff1dc67e56e46382544a2237774f215.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/TechnicalData", - "submodelElements": [ - { - "idShort": "Mandrel_diameter", - "description": [ - { - "language": "de", - "text": "Distanz zwischen zwei Schnittpunkten einer Geraden durch den Mittelpunkt der Spindel mit deren Umfang" - }, - { - "language": "en", - "text": "distance between two intersections of a straight line through the centre of the mandrel with its diameter" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH895#003" - } - ] - }, - "value": "50", - "valueType": "xs:string" - }, - { - "idShort": "Min_permissible_pressure", - "description": [ - { - "language": "de", - "text": "der bei der Festlegung der Anforderungen an die Berstscheibe bei einer zugeh\u00f6rigen Temperatur berechnete minimale Berstdruck" - }, - { - "language": "en", - "text": "The minimum bursting pressure calculated when defining the requirements for the burst disc at a corresponding temperature:" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAI489#007" - } - ] - }, - "value": "4", - "valueType": "xs:string" - }, - { - "idShort": "Max_operating_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb (unter normalen Betriebsbedingungen) auftritt bzw. auftreten darf" - }, - { - "language": "en", - "text": "Max. pressure which occurs or may occur in an operating system (under normal operating conditions)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB836#007" - } - ] - }, - "value": "8", - "valueType": "xs:string" - }, - { - "idShort": "Min_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB906#006" - } - ] - }, - "value": "90", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json b/server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json deleted file mode 100644 index 454c39af4..000000000 --- a/server/storage/54ac7ab81aac304198f79e474034eaa1c4a859752ab737b125a2e643f275fb3a.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Positioner/TechnicalData", - "submodelElements": [ - { - "idShort": "Power_supply", - "description": [ - { - "language": "de", - "text": "Versorgung von Ger\u00e4ten oder Anlagen mit gesonderter, zus\u00e4tzlicher Stromzuf\u00fchrung" - }, - { - "language": "en", - "text": "supply of devices or systems with separate, additional power supply" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ002#001" - } - ] - }, - "value": "taken from 4-20mA", - "valueType": "xs:string" - }, - { - "idShort": "Supply_voltage_type", - "description": [ - { - "language": "de", - "text": "bestimmte Form der Spannung, die angibt, ob das Betriebsmittel mit Wechselspannung (AC), Gleichspannung (DC), Wechsel-/Gleichstrom (AC/DC) oder modulierter Gleichspannung (UC) versorgt werden kann" - }, - { - "language": "en", - "text": "Type of voltage required for supplying the device" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC078#007" - } - ] - }, - "value": "9Vdc at 20mA", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4-20mA", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_input_signal", - "description": [ - { - "language": "de", - "text": "Form und/oder Funktion des Signals am Eingang, das sowohl wertediskontinuierlich (bin\u00e4r) als auch wertekontinuierlich (analog oder auch die digitale Abbildung eines Analogsignals) in Bezug auf den G\u00fcltigkeitsbereich des Signal sein kann" - }, - { - "language": "en", - "text": "form and/or function of the signal at the input which can be discontinuous (binary) or continuous (analog or as digital mapping of an analog signal) in respect to the signal's range of validity" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA004#006" - } - ] - }, - "value": "4-20mA, 450 Ohms inout resistance", - "valueType": "xs:string" - }, - { - "idShort": "Minimum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW301#002" - } - ] - }, - "value": "-50", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW302#002" - } - ] - }, - "value": "85", - "valueType": "xs:string" - }, - { - "idShort": "max_humidity_during_operation_UL_1449", - "description": [ - { - "language": "de", - "text": "Maximale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" - }, - { - "language": "en", - "text": "maximum relative humidity the SPD is allowed to be subjected to during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD514#001" - } - ] - }, - "value": "10", - "valueType": "xs:string" - }, - { - "idShort": "min_humidity_during_operation_UL_1449", - "description": [ - { - "language": "de", - "text": "Minimale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" - }, - { - "language": "en", - "text": "minimum relative humidity the SPD is allowed to be subjected to during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD516#001" - } - ] - }, - "value": "90", - "valueType": "xs:string" - }, - { - "idShort": "Supply_pressure", - "description": [ - { - "language": "de", - "text": "Druck der pneumatischen Versorgung, der am Versorgungseingang eines Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" - }, - { - "language": "en", - "text": "Pressure of the pneumatic supply that must be applied to the supply input of an electrical operating medium for a certain period of time or all the time to maintain the function of the operating medium" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAI992#007" - } - ] - }, - "value": "20 to 100 psi max", - "valueType": "xs:string" - }, - { - "idShort": "protection_class_acc_IP", - "description": [ - { - "language": "de", - "text": "gibt die Schutzklass nach IP eines Lasernivellierger\u00e4tes an" - }, - { - "language": "en", - "text": "indicates the protection class acc. IP of a laser level gage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAJ501#002" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json b/server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json deleted file mode 100644 index a95d22621..000000000 --- a/server/storage/5852948caf61837aa7af8e2f96c289bb329b7e9e22be896c6e4502980698d9da.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_MagneticPositioner_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_MagneticPositioner/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json b/server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json deleted file mode 100644 index 1769212e1..000000000 --- a/server/storage/59071ec5148d4d4d4b9094a13bc6ffe95e9fe7df5d6849b020aaaa146602855c.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json b/server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json deleted file mode 100644 index b1bcba141..000000000 --- a/server/storage/59b9381929827bb786fe023a78960208d89f4185ef423c84aa712c4807c80877.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Siemens" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Sitrans P DS III/P410" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Siemensallee 75" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "76181" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Karlsruhe" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Sitrans P" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json b/server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json deleted file mode 100644 index b3ed167f5..000000000 --- a/server/storage/5a6b22bf659271f4a72289501d2b6527a7ffea802467dc7eb68005acfd0736bb.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "ABB Automation Products GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Temperatursensor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Borsigstr. 2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63755" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Alzenau" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TSP 121" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json b/server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json deleted file mode 100644 index 2bb95b7ae..000000000 --- a/server/storage/5b0c99e40401ab266ef8271ee88746cf0075bf056c4a59e30ef73e03fe829216.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/TechnicalData", - "submodelElements": [ - { - "idShort": "Height", - "description": [ - { - "language": "de", - "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu L\u00e4nge/Breite/Tiefe stehende Ausdehnung - bei Gegenst\u00e4nden mit fester Orientierung oder in bevorzugter Gebrauchslage der parallel zur Schwerkraft gemessenen Abstand zwischen Ober- und Unterkante" - }, - { - "language": "en", - "text": "for objects with orientation in preferred position during use the dimension perpendicular to diameter/length/width/depth" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA020#009" - } - ] - }, - "value": "1", - "valueType": "xs:string" - }, - { - "idShort": "Width", - "description": [ - { - "language": "de", - "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu H\u00f6he/L\u00e4nge/Tiefe stehende Ausdehnung rechtwinklig zur l\u00e4ngsten Symmetrieachse" - }, - { - "language": "en", - "text": "for objects with orientation in preferred position during use the dimension perpendicular to height/ length/depth" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAF016#006" - } - ] - }, - "value": "1", - "valueType": "xs:string" - }, - { - "idShort": "Volume", - "description": [ - { - "language": "de", - "text": "Inneres Volumen eines Raums, einschlie\u00dflich des Volumens von den Stutzen bis zur ersten Verbindung, aber abz\u00fcglich des Volumens fest eingebauter innen liegender Teile" - }, - { - "language": "en", - "text": "Internal volume of a chamber, including the volume of nozzles to the first connection, and excluding the volume of permanent internal parts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA138#006" - } - ] - }, - "value": "1", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json b/server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json deleted file mode 100644 index b7f79dea2..000000000 --- a/server/storage/5baa1162d91d4c4c418d3a91714cf72833e5727241323726e69505a7a27f6b15.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y21_Regler_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json b/server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json deleted file mode 100644 index 4995bfe0c..000000000 --- a/server/storage/5c421c7004985a95f3058937f84b1d8dac579c34192cd2bf71002dd6ece23b4f.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Beh\u00e4lter" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "zyl. Beh\u00e4lter" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json b/server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json deleted file mode 100644 index aa02d87fa..000000000 --- a/server/storage/5c5a4e07b702a399d2afaddde20b2c2dd086de0626fdf39c9c8715c956fac6e1.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F22_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json b/server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json deleted file mode 100644 index def2d7798..000000000 --- a/server/storage/5d50b58fc2e7688f0d9031cfef025bc0f461b488ca41551b3e466e6b5574e636.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json b/server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json deleted file mode 100644 index 59b88b216..000000000 --- a/server/storage/5e1c5cf7dcc1afef128707485ddeb7176756a0d3f2aa7d9997c4dd0ff15ebbe5.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GRUNDFOS" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "UPS 25-60 B 180" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Park u. 8" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "H-2045" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Toeroekbalint" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "HU" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Grundfos Pumpe 96281498" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json b/server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json deleted file mode 100644 index 73b47438a..000000000 --- a/server/storage/5fa30fe0cd6224a76ffcb3d01ea255e23e8d755cdc8560196797bc9e5dbb6786.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F13_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/F13/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json b/server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json deleted file mode 100644 index dba1d9c8e..000000000 --- a/server/storage/610865e72c1d60a427c49ab31795dc3a2ca817db532ee6e884307c67ffad6a65.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "data": { - "idShort": "MnestixConfiguration", - "modelType": "AssetAdministrationShell", - "id": "https://mnestix.com/aas/E0468D0C97304243B8F0387A1333B4A8", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://mnestix.com/E0468D0C97304243B8F0387A1333B4A8", - "specificAssetIds": [ - { - "name": "assetIdShort", - "value": "aas_E0468D0C97304243B8F0387A1333B4A8" - } - ] - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://repodomainurl.com/sm/VGhlbWVTZXR0aW5ncw/1/0" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://repodomainurl.com/sm/B461C6ED32214933B8B6CE569C8F0A03/1/0" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json b/server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json deleted file mode 100644 index ac4186767..000000000 --- a/server/storage/61beb6d98279fc12a99dac963372f3678174ad638fbf17eee94d903a8a10f837.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N38_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json b/server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json deleted file mode 100644 index 57e8e6613..000000000 --- a/server/storage/628ecff6388eb1e041707d7444e15d8a6b8c6279f0ada0de12a3b0180c05addd.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F31_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json b/server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json deleted file mode 100644 index 81e53216a..000000000 --- a/server/storage/637907f8bb8df98d90bea58cf0c4814aad5996bd76dc7d876caf959593822051.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Y21", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "Y21_Regler", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler" - }, - { - "idShort": "HasComponent_Y21_Regler", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y21" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y21" - }, - { - "type": "Entity", - "value": "Y21_Regler" - } - ] - } - }, - { - "idShort": "Y21_Stellventil", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil" - }, - { - "idShort": "HasComponent_Y21_Stellventil", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y21" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y21" - }, - { - "type": "Entity", - "value": "Y21_Stellventil" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json b/server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json deleted file mode 100644 index 36c0915b1..000000000 --- a/server/storage/63796f84fa8e58ce59f4b95200e297e7876d585b556a5d0a814aef014441b76c.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json b/server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json deleted file mode 100644 index e04dc7ee9..000000000 --- a/server/storage/659c0c9b9e2db8c2fe6d20528a9e77d1bc1168598783a9b38e0f7b501955697f.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json b/server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json deleted file mode 100644 index 349019c14..000000000 --- a/server/storage/65b92d68bf54356262398f3f9dd594df707f550709e6a2272e58bdc477ccb974.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y20_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json b/server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json deleted file mode 100644 index 35018a3a3..000000000 --- a/server/storage/660ddae781c389df26ad816632b3cee8df719800973a323c977bf461752a032c.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "N13", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "N13_Motor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor" - }, - { - "idShort": "HasComponent_N13_Motor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N13" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N13" - }, - { - "type": "Entity", - "value": "N13_Motor" - } - ] - } - }, - { - "idShort": "N13_Pumpe", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe" - }, - { - "idShort": "HasComponent_N13_Pumpe", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N13" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N13" - }, - { - "type": "Entity", - "value": "N13_Pumpe" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json b/server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json deleted file mode 100644 index 98c1d77a6..000000000 --- a/server/storage/68486ed7beca369ef981b19b86d4bc09db7bb700d3ac13d1d7d636a25e215939.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37_Valve/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Masoneilan" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "28-28110" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Baker-Hughe-Strasse 1" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "29221" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Celle" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "28000 Series VariPak" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json b/server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json deleted file mode 100644 index f9874866e..000000000 --- a/server/storage/6be8c7871fb8752bdc55dd62ba76536105609c47a3412078af2fae99212d8220.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "KSB AG" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Motor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Johann-Klein-Str. 9" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "67227" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Frankenthal" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "3\u00a0~ Mot 1LA7080-4AA11-ZX77A" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json b/server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json deleted file mode 100644 index f6799f62b..000000000 --- a/server/storage/6c20e60f586059a1b7f0479de263c8b05f6c2e5d40bafd32f81e82c00b74b479.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_Stellventil_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json b/server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json deleted file mode 100644 index aa8a4be94..000000000 --- a/server/storage/705d68c1bdc8ea679222e03f5c9efb6270b578e675aca163ad538fabcc133280.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L10_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/L10/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json b/server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json deleted file mode 100644 index 729fe41d3..000000000 --- a/server/storage/707d0b667af7c33293d0f7f1ed16ce961991c163ed3a710f31a7b34edd7380e9.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Q11", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "Q11_Conductivity_Sensor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Conductivity_Sensor" - }, - { - "idShort": "HasComponent_Q11_Conductivity_Sensor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Q11" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Q11" - }, - { - "type": "Entity", - "value": "Q11_Conductivity_Sensor" - } - ] - } - }, - { - "idShort": "Q11_Messumformer", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer" - }, - { - "idShort": "HasComponent_Q11_Messumformer", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Q11" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Q11" - }, - { - "type": "Entity", - "value": "Q11_Messumformer" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json b/server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json deleted file mode 100644 index 5a5bc1fb3..000000000 --- a/server/storage/7378dbb98c1e302f1b0f806ecd21a2298ea454b005f24114c461322bddb0a44d.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Argus/Flowserve Flow Control GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Flanged Ball Valve" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Rudolf-Plank-Str.2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "76275" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Ettlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FK 79" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json b/server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json deleted file mode 100644 index dd9689246..000000000 --- a/server/storage/744d9b0c3f4b7ebf0743f175450805ca5711a5ce716cfbadb01421f50f3809ff.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/TechnicalData", - "submodelElements": [ - { - "idShort": "Kommunikationsprotokoll", - "description": [ - { - "language": "de", - "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" - }, - { - "language": "en", - "text": "rules and agreements by that communication partner can interact with each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW333#001" - } - ] - }, - "value": "4 - 20 mA DC/ HART", - "valueType": "xs:string" - }, - { - "idShort": "min_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-55\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "600\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "min_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-40\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "85\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "Spannungsversorgung", - "description": [ - { - "language": "de", - "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" - }, - { - "language": "en", - "text": "describes the source of electrical energy that supplies the object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK788#003" - } - ] - }, - "value": "11...42", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "14571", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP66", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json b/server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json deleted file mode 100644 index 636357e47..000000000 --- a/server/storage/76a56089dc75a5adcf9e1ba61012248a68a8e28d04fc32c9fd8e89ec3d530e39.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Q11_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json b/server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json deleted file mode 100644 index 13e2b891c..000000000 --- a/server/storage/771e0f90d309e6e9d94ae7d7b2493586fcb9ccf486c2fdb1b07cfa7cc89d4705.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "DynamicData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/DynamicData", - "submodelElements": [ - { - "idShort": "Level", - "description": [ - { - "language": "de", - "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." - }, - { - "language": "en", - "text": "Height of the liquid inside of the vessel in centimeter." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Level" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json b/server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json deleted file mode 100644 index 733fa894a..000000000 --- a/server/storage/78080a79b765405cccba4def5db8ccfd3443d5ce31e97e011dd707cc458dc879.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T27_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json b/server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json deleted file mode 100644 index 2cfdcc817..000000000 --- a/server/storage/7855fff6673d8ac27e691a3ee5f3fd7b11d1797622ad0e42b843101a5ceb0271.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "W15_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/W15/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json b/server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json deleted file mode 100644 index 5b3b0dabd..000000000 --- a/server/storage/786d34f261a87d17158ee7f15862aa08e37b462c4605aabbb3aab9a2b1f2641d.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N29_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json b/server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json deleted file mode 100644 index 78f516120..000000000 --- a/server/storage/78d5ce7ba1939d760507aba905d37988ae346ac3420f10adf74676e062095f5d.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N13_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N13/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json b/server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json deleted file mode 100644 index aac8489de..000000000 --- a/server/storage/794b4c919a14abcd223e5caad3bfc95894643e48c1c25b7a2a8f6ee2ce4e5230.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T15_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json b/server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json deleted file mode 100644 index 21ff8c50c..000000000 --- a/server/storage/79902f48790766d220c49fe9f35c6fd7c09c1a75c2e6918fa7709c9a662e70d2.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L12_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/L12/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json b/server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json deleted file mode 100644 index 1a4881ee4..000000000 --- a/server/storage/79d85ef75f91d6e8f939152098e87305b1849887103293165fe37a3097f10e3a.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "ABB" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Typ 18345-2021465101" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Schillerstr.72" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "32425" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Minden" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TZIDC" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json b/server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json deleted file mode 100644 index 74df5dd24..000000000 --- a/server/storage/7b1fa885d31b94695dfbbc86007776415e2dd317aa25280b81200a13a4bf00c6.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "data": { - "idShort": "MnestixCustomSubmodels", - "modelType": "AssetAdministrationShell", - "id": "https://mnestix.com/aas/B9961AFAC3324809AFC5E48D26D55992_3", - "derivedFrom": { - "type": "ModelReference", - "keys": [ - { - "type": "AssetAdministrationShell", - "value": "https://mnestix.com/aas/MnestixDefaultSubmodelTemplate" - } - ] - }, - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "exampleAsset", - "specificAssetIds": [ - { - "name": "assetIdShort", - "value": "exampleAssetIdShort" - } - ] - } - } -} \ No newline at end of file diff --git a/server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json b/server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json deleted file mode 100644 index 10bbe3a83..000000000 --- a/server/storage/7be941098c7dc0ff713d677d75a0a6fde81c2c075e557c78f0b8e70e77e80d8e.json +++ /dev/null @@ -1,280 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "B2", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "L26", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26" - }, - { - "idShort": "HasControlModule_L26", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B2" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B2" - }, - { - "type": "Entity", - "value": "L26" - } - ] - } - }, - { - "idShort": "T27", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/T27" - }, - { - "idShort": "HasControlModule_T27", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B2" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B2" - }, - { - "type": "Entity", - "value": "T27" - } - ] - } - }, - { - "idShort": "Q28", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28" - }, - { - "idShort": "HasControlModule_Q28", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B2" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B2" - }, - { - "type": "Entity", - "value": "Q28" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json b/server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json deleted file mode 100644 index a9521bc09..000000000 --- a/server/storage/7bf4913ad58b821e7776cc02db950b02e9a06ac48283712777c00b83883aec69.json +++ /dev/null @@ -1,352 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "B3", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "T33", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33" - }, - { - "idShort": "HasControlModule_T33", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - }, - { - "type": "Entity", - "value": "T33" - } - ] - } - }, - { - "idShort": "L32", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32" - }, - { - "idShort": "HasControlModule_L32", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - }, - { - "type": "Entity", - "value": "L32" - } - ] - } - }, - { - "idShort": "L34", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34" - }, - { - "idShort": "HasControlModule_L34", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - }, - { - "type": "Entity", - "value": "L34" - } - ] - } - }, - { - "idShort": "L35", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35" - }, - { - "idShort": "HasControlModule_L35", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B3" - }, - { - "type": "Entity", - "value": "L35" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json b/server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json deleted file mode 100644 index 8807133b2..000000000 --- a/server/storage/7bff5fa31a88c40a01a5343041bcb0bab6b97dc840af071bf5f78240ea2817ec.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "HC40_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json b/server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json deleted file mode 100644 index 84da6de99..000000000 --- a/server/storage/7c648763455aa473bf809d187d84b27318cec0c9c920a1dfe7e81747f38b23c4.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Emerson Electric Co." - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Digitaler Stellungsregler" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8000 West Florissant Avenue, P.O. Box 4100" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63136" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Saint Louis Missouri" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "US" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FISHER FIELDVUE DVC200" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json b/server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json deleted file mode 100644 index e6b340d24..000000000 --- a/server/storage/7cc4a6a3ac57ef72b7ac6f7c102f92aa811f098b245ade2c35bdd2877a7f392a.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "TU20_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json b/server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json deleted file mode 100644 index f968da44b..000000000 --- a/server/storage/7d55df59fe62fa8fa334a3a4ebdf4ccad065d86b419ede6de15e8e8205618805.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2/TechnicalData", - "submodelElements": [ - { - "idShort": "Height", - "description": [ - { - "language": "de", - "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu L\u00e4nge/Breite/Tiefe stehende Ausdehnung - bei Gegenst\u00e4nden mit fester Orientierung oder in bevorzugter Gebrauchslage der parallel zur Schwerkraft gemessenen Abstand zwischen Ober- und Unterkante" - }, - { - "language": "en", - "text": "for objects with orientation in preferred position during use the dimension perpendicular to diameter/length/width/depth" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA020#009" - } - ] - }, - "value": "1", - "valueType": "xs:string" - }, - { - "idShort": "Width", - "description": [ - { - "language": "de", - "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu H\u00f6he/L\u00e4nge/Tiefe stehende Ausdehnung rechtwinklig zur l\u00e4ngsten Symmetrieachse" - }, - { - "language": "en", - "text": "for objects with orientation in preferred position during use the dimension perpendicular to height/ length/depth" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAF016#006" - } - ] - }, - "value": "1", - "valueType": "xs:string" - }, - { - "idShort": "Volume", - "description": [ - { - "language": "de", - "text": "Inneres Volumen eines Raums, einschlie\u00dflich des Volumens von den Stutzen bis zur ersten Verbindung, aber abz\u00fcglich des Volumens fest eingebauter innen liegender Teile" - }, - { - "language": "en", - "text": "Internal volume of a chamber, including the volume of nozzles to the first connection, and excluding the volume of permanent internal parts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA138#006" - } - ] - }, - "value": "1", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json b/server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json deleted file mode 100644 index dd705ba6f..000000000 --- a/server/storage/7d9735f1a33c6534b15d9f3f007eedc8715dd3995776964d324419d60936659b.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/TechnicalData", - "submodelElements": [ - { - "idShort": "Nennweite", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "DN25", - "valueType": "xs:string" - }, - { - "idShort": "Nenndruck", - "description": [ - { - "language": "de", - "text": "Beschreibung der Flanschbennung der Druckstufe" - }, - { - "language": "en", - "text": "description of the pressure stage of the label of the flange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK644#005" - } - ] - }, - "value": "PN40", - "valueType": "xs:string" - }, - { - "idShort": "Prozessanschluss", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" - }, - { - "language": "en", - "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB411#007" - } - ] - }, - "value": "geflanscht", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "371", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "14.409", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json b/server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json deleted file mode 100644 index 0940a16aa..000000000 --- a/server/storage/7ffd6dacfe223948132ecb0b6756cd70bb4edc4f9368bcb22813295c2fdf32d0.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "Dynamic_Data", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/DynamicData", - "submodelElements": [ - { - "idShort": "Level", - "description": [ - { - "language": "de", - "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." - }, - { - "language": "en", - "text": "Height of the liquid inside of the vessel in centimeter." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Level" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json b/server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json deleted file mode 100644 index ae08c6195..000000000 --- a/server/storage/8198780b4deeaf724a5b182e17ee7122257ca9f64fa978161ea3345a1dd088f9.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Leitf\u00e4higkeitsmesswertaufnehmer" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Dieselstra\u00dfe 24" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "70839" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Gerlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "CLS21 Condumax" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json b/server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json deleted file mode 100644 index b02b0194d..000000000 --- a/server/storage/82c95c1ef31124c94f2a790ba7a1695d98bc5e37bb666cc21ad8db455fa58576.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Argus/Flowserve Flow Control GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Flanged Ball Valve" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Rudolf-Plank-Str.2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "76275" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Ettlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FK 79" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json b/server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json deleted file mode 100644 index 9fb2b6e25..000000000 --- a/server/storage/8380addacbd45574006f867f1f1e55007660a8d2ae3f2c33e9bacf75e4349e11.json +++ /dev/null @@ -1,459 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/TechnicalData", - "submodelElements": [ - { - "idShort": "Measuring_range", - "description": [ - { - "language": "de", - "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" - }, - { - "language": "en", - "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH095#003" - } - ] - }, - "value": "0...60", - "valueType": "xs:string" - }, - { - "idShort": "Display_range", - "description": [ - { - "language": "de", - "text": "Ausgabebereich bei anzeigenden Messger\u00e4ten" - }, - { - "language": "en", - "text": "output range of a measuring device which displays" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ355#003" - } - ] - }, - "value": "0...20", - "valueType": "xs:string" - }, - { - "idShort": "Lower_range_limit_of_temperature", - "description": [ - { - "language": "de", - "text": "niedrigster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" - }, - { - "language": "en", - "text": "lowest value of temperature that the device can be adjusted to measure within the specified accuracy limits" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY818#001" - } - ] - }, - "value": "-35", - "valueType": "xs:string" - }, - { - "idShort": "Upper_range_limit_of_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chster Wert von Temperatur, auf den ein Ger\u00e4t innerhalb seiner angegebenen Genauigkeitsgrenzen eingestellt werden kann" - }, - { - "language": "en", - "text": "highest value of the temperature that a device can be adjusted to measure within its specified accuracy limits" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY819#001" - } - ] - }, - "value": "250", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4...20mA/HART/Profibus", - "valueType": "xs:string" - }, - { - "idShort": "Max_input_voltage_with_DC", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6glicher Wert der Gleichspannung, die am Eingang eines Betriebsmittels angelegt werden kann" - }, - { - "language": "en", - "text": "maximum value of direct-voltage that can be applied to the input of an operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB848#008" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "Max_input_current_with_DC", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6glicher Wert f\u00fcr den Gleichstrom, der bei angesteuertem Eingang eingespeist/aufgenommen wird" - }, - { - "language": "en", - "text": "Maximum value of an DC current that is fed in/taken up with a controlled input" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB852#007" - } - ] - }, - "value": "21", - "valueType": "xs:string" - }, - { - "idShort": "Max_DC__input_capacity", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6gliche Gleichstrom-Eingangsleistung f\u00fcr die der Wechselrichter eine netzsynchrone Wechselspannung erzeugen kann" - }, - { - "language": "en", - "text": "maximum DC-input power for the inverters produce a synchronous AC network" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI736#002" - } - ] - }, - "value": "3", - "valueType": "xs:string" - }, - { - "idShort": "Max_load", - "description": [ - { - "language": "de", - "text": "maximale B\u00fcrde, die an den Anschl\u00fcssen des Ger\u00e4ts angelegt werden kann oder vom Ger\u00e4t an ein externes angeschlossenes Ger\u00e4t weitergegeben wird" - }, - { - "language": "en", - "text": "maximum load that can be applied to the terminals of the device or will be given by the device to an external devices connected to it" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA042#009" - } - ] - }, - "value": "600", - "valueType": "xs:string" - }, - { - "idShort": "Minimum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "minimal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "minimal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW301#002" - } - ] - }, - "value": "55", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "maximal zul\u00e4ssige Temperatur, der das Betriebsmittel umgebenden Atmosph\u00e4re w\u00e4hrend Betrieb" - }, - { - "language": "en", - "text": "maximal permitted temperature of the atmosphere surrounding the operating resource during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW302#002" - } - ] - }, - "value": "-10", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN313#004" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Lower_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN314#004" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Min_air_humidity", - "description": [ - { - "language": "de", - "text": "niedrigste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "lowest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW976#002" - } - ] - }, - "value": "10", - "valueType": "xs:string" - }, - { - "idShort": "Max_air_humidity", - "description": [ - { - "language": "de", - "text": "h\u00f6chste relative Luftfeuchte, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden kann" - }, - { - "language": "en", - "text": "highest relative humidity to which a device may be subject without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN164#003" - } - ] - }, - "value": "90", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_auxiliary_energy", - "description": [ - { - "language": "de", - "text": "n\u00e4here Angaben zur Energie, welche dem Betriebsmittel oder dem Betriebssystem zum Aufrechterhalten seiner Funktion zeitweise oder st\u00e4ndig zugef\u00fchrt werden muss" - }, - { - "language": "en", - "text": "further information on the energy which must be fed to the operating resource or operating system continually or occasionally so that performance of its function can be sustained" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAB236#008" - } - ] - }, - "value": "24V AC/DC", - "valueType": "xs:string" - }, - { - "idShort": "Number_of_connections_sensor_actor", - "description": [ - { - "language": "de", - "text": "Quantitative Angabe zur Menge Anschl\u00fcsse Sensor/Aktor" - }, - { - "language": "en", - "text": "Quantitative statement about the set of connections sensor / actor" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAP400#001" - } - ] - }, - "value": "1*Konduktiver Sensor", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json b/server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json deleted file mode 100644 index 9f14eac50..000000000 --- a/server/storage/8385911f65b48e37a31b405cd81265a43c8bc6cb9ab298f1dbdcd549418973e3.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Argus/Flowserve Flow Control GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Flanged Ball Valve" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Rudolf-Plank-Str.2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "76275" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Ettlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FK 79" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json b/server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json deleted file mode 100644 index c016c25ac..000000000 --- a/server/storage/83f28bb1820dc26184dfc7b2c94ad6436e237d26ed293cce1fc0d453d261642e.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N18_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json b/server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json deleted file mode 100644 index 50a0f2309..000000000 --- a/server/storage/85115dd6c30558cf3d10dfcde96fb3ed9ea552d9983ad3639cf9ffbdf8c128cb.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y18_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y18/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json b/server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json deleted file mode 100644 index 9c4b760ea..000000000 --- a/server/storage/85ad0d14f4a351955aec919eac09134fdc546a2a138370eadeb13e0ac0e3cb26.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T15/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Siemens AG " - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Temperatursensor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Werner-von-Siemens-Stra\u00dfe 1" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "80333" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "M\u00fcnchen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Einschaub-Widerstandsthermometer" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json b/server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json deleted file mode 100644 index 46f0e569b..000000000 --- a/server/storage/8624ce0848d50b65267332de2e0bac8218a44bf38ae47d4a802a328cb49de4e6.json +++ /dev/null @@ -1,415 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/TechnicalData", - "submodelElements": [ - { - "idShort": "Max_medium_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB864#006" - } - ] - }, - "value": "110", - "valueType": "xs:string" - }, - { - "idShort": "Min_medium_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB988#006" - } - ] - }, - "value": "2", - "valueType": "xs:string" - }, - { - "idShort": "Temperature_class", - "description": [ - { - "language": "de", - "text": "Charakterisierungssystem eines elektrischen Ger\u00e4ts, basierend auf dessen maximaler Oberfl\u00e4chentemperatur, bez\u00fcglich der spezifischen explosionsf\u00e4higen Atmosph\u00e4re, f\u00fcr deren Nutzung das Ger\u00e4t vorgesehen ist" - }, - { - "language": "en", - "text": "classification system of electrical apparatus, based on its maximum surface temperature, related to the specific explosive atmosphere for which it is intended to be used" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO371#005" - } - ] - }, - "value": "110", - "valueType": "xs:string" - }, - { - "idShort": "Material_body", - "description": [ - { - "language": "de", - "text": "Werkstoff, aus dem das Ger\u00e4tegeh\u00e4use gefertigt ist" - }, - { - "language": "en", - "text": "substance of which the appliance exterior is made of" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO747#008" - } - ] - }, - "value": "Bronze", - "valueType": "xs:string" - }, - { - "idShort": "Construction_form_of_impeller", - "description": [ - { - "language": "de", - "text": "Gruppe von Bauelementen mit gleichen Konstruktionsmerkmalen und gleichem Aufbau, die aufgrund \u00e4hnlicher Herstellungstechniken f\u00fcr die Bauartzulassungspr\u00fcfung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden k\u00f6nnen. Sie werden im allgemeinen von einer Bauartspezifikation erfasst. Anmerkung: In bestimmten F\u00e4llen k\u00f6nnen Bauelemente aus verschiedenen Bauartspezifikationen als zum gleichen Typ geh\u00f6rig betrachtet und daher f\u00fcr die Bauartzulassung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden" - }, - { - "language": "en", - "text": "Group of components with the same construction features and the same structure, which - due to similar manufacturing techniques - can be collated for construction approval testing and class conformity controls. They are generally allocated to a construction type. Note: in certain cases, components can be viewed from various construction type specifications as belonging to the same type and, therefore, can be collated for construction approval and class conformity controls" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABF501#001" - } - ] - }, - "value": "Komposit PES/PP", - "valueType": "xs:string" - }, - { - "idShort": "Max_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB906#006" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Max_operation_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb auftritt bzw. auftreten darf, angegeben in der abgeleiteten SI-EInheit des Druckes" - }, - { - "language": "en", - "text": "greatest pressure that occurs in a system in operation or shall occur, indicated in the derived SI unit of pressure" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAJ845#005" - } - ] - }, - "value": "10", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_size", - "description": [ - { - "language": "de", - "text": "numerische Bezeichnung der Gr\u00f6\u00dfe bezogen auf den Str\u00f6mungsquerschnitt eines fluidtechnischen Ger\u00e4tes" - }, - { - "language": "en", - "text": "numeric identifier for the measured variable referred to the flow cross section of a fluidic device" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC418#001" - } - ] - }, - "value": "G1 1/2", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_pressure_of_the_operating_medium", - "description": [ - { - "language": "de", - "text": "PN (Nenndruck) ist eine alphanumerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung. Sie umfasst die Buchstaben PN gefolgt von einer dimensionslosen Zahl" - }, - { - "language": "en", - "text": "PN (nominal pressure) is an alphanumeric variable for reference purposes, relating to a combination of mechanical and measurement properties of a pipe component. It comprises the letters PN followed by a dimensionless number (according to EN 1333/96.08)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO778#001" - } - ] - }, - "value": "PN10", - "valueType": "xs:string" - }, - { - "idShort": "Insertion_length", - "description": [ - { - "language": "de", - "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" - }, - { - "language": "en", - "text": "overall length of that part of a device or component to be found within a containment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO023#004" - } - ] - }, - "value": "180", - "valueType": "xs:string" - }, - { - "idShort": "Power_frequency", - "description": [ - { - "language": "de", - "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" - }, - { - "language": "en", - "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC859#003" - } - ] - }, - "value": "50", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_voltage", - "description": [ - { - "language": "de", - "text": "Nennspannung ist der vom Hersteller oder Lieferanten spezifizierte Wert der elektrischen Spannung im Normalbetrieb" - }, - { - "language": "en", - "text": "nominal voltage is the specified value which shows the voltage in normal operation given by the manufacturer or supplier" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC856#007" - } - ] - }, - "value": "1*230V", - "valueType": "xs:string" - }, - { - "idShort": "Power_consumption", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Drehzahlstufe1", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH939#001" - } - ] - }, - "value": "50", - "valueType": "xs:string" - }, - { - "idShort": "Drehzahlstufe2", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH939#001" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Drehzahlstufe3", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH939#001" - } - ] - }, - "value": "70", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Net_weight", - "description": [ - { - "language": "de", - "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t. Da unter \u201eGewicht\u201c in diesem Fall die Masse verstanden wird, ist auch die Ma\u00dfeinheit (Kilo-) Gramm als SI-Einheit zu verwenden" - }, - { - "language": "en", - "text": "Dimensions of the weigh item without packaging and without transport device. As, in this case, 'weight' means dimensions, the measure unit (kilo) gram is to be used as the SI unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAD875#007" - } - ] - }, - "value": "02. Sep", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json b/server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json deleted file mode 100644 index 3a4411650..000000000 --- a/server/storage/864a300a19ffd76b1e031009fd36ef4f4dbbd2f447b68c0b868dbd56b0d822aa.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "data": { - "idShort": "L34_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/DynamicData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json b/server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json deleted file mode 100644 index 637370652..000000000 --- a/server/storage/86763be0e05938c1472399535e32694552cc53e695d67403463dba14c0c198e2.json +++ /dev/null @@ -1,280 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Y24", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "Y24_Ball_Vave", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve" - }, - { - "idShort": "HasComponent_Y24_Ball_Vave", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y24" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y24" - }, - { - "type": "Entity", - "value": "Y24_Ball_Vave" - } - ] - } - }, - { - "idShort": "Y24_Magnetic_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve" - }, - { - "idShort": "HasComponent_Y24_Magnetic_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y24" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y24" - }, - { - "type": "Entity", - "value": "Y24_Magnetic_Valve" - } - ] - } - }, - { - "idShort": "Y24_Pneumatischer_Antrieb", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb" - }, - { - "idShort": "HasComponent_Y24_Pneumatischer_Antrieb", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y24" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y24" - }, - { - "type": "Entity", - "value": "Y24_Pneumatischer_Antrieb" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json b/server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json deleted file mode 100644 index 111b00421..000000000 --- a/server/storage/870ebdbc8dfa66f6008ac7458c77b9e58b1061df45de7062a2c385ac9352a5a7.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Emerson Electric Co." - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Digitaler Stellungsregler" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8000 West Florissant Avenue, P.O. Box 4100" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63136" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Saint Louis Missouri" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "US" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FISHER FIELDVUE DVC200" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2005", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json b/server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json deleted file mode 100644 index a1c419f21..000000000 --- a/server/storage/87806899c83e2e8d58d37c4966e710ac999ae3fba5342474ba509f9287e67d3a.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Yokogawa" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "EJX510A" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "2-9-32, Nakacho" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "180-8750" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Musashino, Tokyo" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "JP" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "EJX-A" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2006", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json b/server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json deleted file mode 100644 index 6f067eec3..000000000 --- a/server/storage/8793482eddf7864ae9222b76748a88b3d59b83c23f05279aa2b565ac4b16ffaa.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y15_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/Y15/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json b/server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json deleted file mode 100644 index 3d7441c5b..000000000 --- a/server/storage/881d129ca37bd9becdc2021af8a9edce6ea15699f8e1386bb83be5023eeeaf47.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "Dynamic_Data", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/DynamicData", - "submodelElements": [ - { - "idShort": "Drive_Power", - "description": [ - { - "language": "de", - "text": "gemessene auf das Fluid beim Durchgang durch die Pumpe \u00fcbertragene mechanische Leistung" - }, - { - "language": "en", - "text": "measured useful mechanical power transferred to the fluid during its passage through the pump" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC172#001" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json b/server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json deleted file mode 100644 index 53890b592..000000000 --- a/server/storage/888c37c2a6b8622101f6368b206a51adb568afb181d5a391c064d075823ab3da.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T33_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/T33/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json b/server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json deleted file mode 100644 index fdddec4eb..000000000 --- a/server/storage/8a9222479d205724ee5b9d34de418ed0918a3e4822f04a02e2c8b5c484b0ba85.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "DynamicData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/DynamicData", - "submodelElements": [ - { - "idShort": "Level", - "description": [ - { - "language": "de", - "text": "H\u00f6he der F\u00fcllung in dem Beh\u00e4lter in Zentimeter." - }, - { - "language": "en", - "text": "Height of the liquid inside of the vessel in centimeter." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Level" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json b/server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json deleted file mode 100644 index d71b84171..000000000 --- a/server/storage/8ae057bcb69018dcfb947bd6357e16cd38327cecf90a926a4e3d36778297ca18.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Stellventil/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Emerson Electric Co." - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Stellventil" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8000 West Florissant Avenue, P.O. Box 4100" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63136" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Saint Louis Missouri" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "US" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GX Stellventil" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json b/server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json deleted file mode 100644 index ead7c781e..000000000 --- a/server/storage/8b6ab5cfdadecb3c5ed80160a9ba5a2a6634bc0b49cece36a48ede86f5b51a68.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/TechnicalData", - "submodelElements": [ - { - "idShort": "Nominal_Pressure", - "description": [ - { - "language": "de", - "text": "alphanummerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung" - }, - { - "language": "en", - "text": "alphanumeric variable for reference purposes, relating to a combination of mechanical and dimensional properties of a component of a pipe" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ333#004" - } - ] - }, - "value": "40", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_Size", - "description": [ - { - "language": "de", - "text": "Untergruppe einer Bauart, deren Unterscheidungsmerkmale im Allgemeinen die Abmessungen sind" - }, - { - "language": "en", - "text": "subgroup of a construction type, whose differentiating features are generally the dimensions" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAP898#005" - } - ] - }, - "value": "25", - "valueType": "xs:string" - }, - { - "idShort": "Material", - "description": [ - { - "language": "de", - "text": "auf Normen basierender Nummerncode von Werkstoffen des Geh\u00e4uses" - }, - { - "language": "en", - "text": "standard-based coding of materials of housing" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAD738#006" - } - ] - }, - "value": "SS/SS-SS-RFE", - "valueType": "xs:string" - }, - { - "idShort": "Test_Pressure", - "description": [ - { - "language": "de", - "text": "Testdruck zum pr\u00fcfen des Ventils." - }, - { - "language": "en", - "text": "Test pressure to check the valve." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/TestPressure" - } - ] - }, - "value": "54.6", - "valueType": "xs:string" - }, - { - "idShort": "Permissible_Temprature", - "description": [ - { - "language": "de", - "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr den Betrieb." - }, - { - "language": "en", - "text": "Permissible temperature range for operation." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/PermissibleTemperature" - } - ] - }, - "value": "-50 to 220", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_Permissible_Operating_Pressure_at_Room_Temperature", - "description": [ - { - "language": "de", - "text": "Maximal zul\u00e4ssiger Betriebsdruck bei Raumtemperatur." - }, - { - "language": "en", - "text": "Maximum Permissible Operating Pressure at Room Temperature." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/MaxOperatingPressure" - } - ] - }, - "value": "36.4", - "valueType": "xs:string" - }, - { - "idShort": "Max_perm_temperature", - "description": [ - { - "language": "de", - "text": "Die Hitzbest\u00e4ndigkeit eines Produktes in Grad Celsius" - }, - { - "language": "en", - "text": "The heat resistance of a product in degrees centigrade." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAF417#005" - } - ] - }, - "value": "220", - "valueType": "xs:string" - }, - { - "idShort": "Connection", - "description": [ - { - "language": "de", - "text": "Prozessanschluss." - }, - { - "language": "en", - "text": "Process connection." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Connection" - } - ] - }, - "value": "Flange Connection", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json b/server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json deleted file mode 100644 index cca7959f2..000000000 --- a/server/storage/8c76f8235963a5b47077b8e6d8f2997e04d6bf83efac699e3fa136d80d7948a2.json +++ /dev/null @@ -1,515 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/TechnicalData", - "submodelElements": [ - { - "idShort": "Nennweite", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "DN25", - "valueType": "xs:string" - }, - { - "idShort": "Nenndruck", - "description": [ - { - "language": "de", - "text": "Beschreibung der Flanschbennung der Druckstufe" - }, - { - "language": "en", - "text": "description of the pressure stage of the label of the flange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK644#005" - } - ] - }, - "value": "PN40", - "valueType": "xs:string" - }, - { - "idShort": "max_Druck", - "description": [ - { - "language": "de", - "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" - }, - { - "language": "en", - "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA447#006" - } - ] - }, - "value": "420", - "valueType": "xs:string" - }, - { - "idShort": "Ausgang", - "description": [ - { - "language": "de", - "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" - }, - { - "language": "en", - "text": "rules and agreements by that communication partner can interact with each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW333#001" - } - ] - }, - "value": "4 - 20 mA DC/ HART", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP67", - "valueType": "xs:string" - }, - { - "idShort": "Betriebsmedium", - "description": [ - { - "language": "de", - "text": "Medium, mit welchem das Ger\u00e4t betrieben werden darf (Medium am Eingang)" - }, - { - "language": "en", - "text": "temperature at which the specified accuracy data are valid. For deviations from the nominal temperature, the specified temperature coefficients must be must be added to the specified accuracies" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD905#001" - } - ] - }, - "value": "Wasser", - "valueType": "xs:string" - }, - { - "idShort": "Messwertabweichung", - "description": [ - { - "language": "de", - "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" - }, - { - "language": "en", - "text": "deviation of measured value from the true value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ356#003" - } - ] - }, - "value": "\u00b1 0,75 %", - "valueType": "xs:string" - }, - { - "idShort": "min_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-29", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "250", - "valueType": "xs:string" - }, - { - "idShort": "min_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-29", - "valueType": "xs:string" - }, - { - "idShort": "max_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "85", - "valueType": "xs:string" - }, - { - "idShort": "min_Luftfeuchte", - "description": [ - { - "language": "de", - "text": "Minimale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" - }, - { - "language": "en", - "text": "minimum relative humidity the SPD is allowed to be subjected to during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD516#001" - } - ] - }, - "value": "5", - "valueType": "xs:string" - }, - { - "idShort": "max_Luftfeuchte", - "description": [ - { - "language": "de", - "text": "Maximale relative Luftfeuchte, der das \u00dcberspannungsschutzger\u00e4t im Betrieb ausgesetzt werden darf" - }, - { - "language": "en", - "text": "maximum relative humidity the SPD is allowed to be subjected to during operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD514#001" - } - ] - }, - "value": "100", - "valueType": "xs:string" - }, - { - "idShort": "Spannungsversorgung", - "description": [ - { - "language": "de", - "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" - }, - { - "language": "en", - "text": "describes the source of electrical energy that supplies the object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK788#003" - } - ] - }, - "value": "10.5...30", - "valueType": "xs:string" - }, - { - "idShort": "Beschichtung", - "description": [ - { - "language": "de", - "text": "bei einer Gef\u00e4\u00dfprothese die Wirksubstanz der Beschichtung zur Impr\u00e4gnierung, Keimreduzierung oder Reduktion der Oberfl\u00e4chenthrombogenizit\u00e4t" - }, - { - "language": "en", - "text": "active substance of vessel graft coating for water proofing or to reduce germs or surface thrombogenicity" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAA376#007" - } - ] - }, - "value": "Geh\u00e4use und Abdeckung: korrosionsfeste Beschichtung", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Koerper", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "SCS14A", - "valueType": "xs:string" - }, - { - "idShort": "Dichtung", - "description": [ - { - "language": "de", - "text": "Substanz, aus welcher die Dichtung hergestellt ist" - }, - { - "language": "en", - "text": "substance from which a leave is manufactured" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK468#006" - } - ] - }, - "value": "PTFE", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Farbe", - "description": [ - { - "language": "de", - "text": "mit dem Auge wahrnehmbare Erscheinungsweise von Oberfl\u00e4chen" - }, - { - "language": "en", - "text": "with the eye perceptible frequency of publication of environment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN521#007" - } - ] - }, - "value": "Mintrgr\u00fcn( Munsell 5.6BG 3.3/2.9)", - "valueType": "xs:string" - }, - { - "idShort": "Elektrischer_Anschluss", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" - }, - { - "language": "en", - "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB414#007" - } - ] - }, - "value": "ISO M20 x 1.5 Innengewinde", - "valueType": "xs:string" - }, - { - "idShort": "Prozessanschluss", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle f\u00fcr die Leitungen, welche die f\u00fcr den Prozess notwendigen Stoffe zu- und abf\u00fchren" - }, - { - "language": "en", - "text": "Physical design of the connecting point of lines which supply and dissipate materials necessary for the process" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB411#007" - } - ] - }, - "value": "DIN PN 40 Zwischenflansch", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json b/server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json deleted file mode 100644 index 201f3872d..000000000 --- a/server/storage/8d14a8c39fa33d4b43fc9d7dff20eba5a4f1e7b661269abcb39b21abc3b93577.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y17_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json b/server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json deleted file mode 100644 index d4030abcb..000000000 --- a/server/storage/8deb6c3d6310130e6a3cac5dafe751f53f092d4ff6ecac7a23e8edc5d96314ad.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y17_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json b/server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json deleted file mode 100644 index b5abe9ec8..000000000 --- a/server/storage/901f7d3ab0b1703747de32839c7503953d1faa0ef6c6d4398e2a87a2aa782afb.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y18_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_Valve/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json b/server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json deleted file mode 100644 index 9bfb75386..000000000 --- a/server/storage/90f4451b077c0296a8bbf6888f84d7dfb14ec98f2088e7c3d462ee108acb90cd.json +++ /dev/null @@ -1,280 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Pipe21", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "N29", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29" - }, - { - "idShort": "HasControlModule_N29", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe21" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe21" - }, - { - "type": "Entity", - "value": "N29" - } - ] - } - }, - { - "idShort": "Y30", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30" - }, - { - "idShort": "HasControlModule_Y30", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe21" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe21" - }, - { - "type": "Entity", - "value": "Y30" - } - ] - } - }, - { - "idShort": "F31", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31" - }, - { - "idShort": "HasControlModule_F31", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe21" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe21" - }, - { - "type": "Entity", - "value": "F31" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json b/server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json deleted file mode 100644 index 6f5bd0a14..000000000 --- a/server/storage/91904746283aa26591c020450d204be71639d0293e6f37aa191b386f44c09975.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Y39", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "Y39_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve" - }, - { - "idShort": "HasComponent_Y39_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y39" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y39" - }, - { - "type": "Entity", - "value": "Y39_Valve" - } - ] - } - }, - { - "idShort": "Y39_Pneumatischer_Antrieb", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb" - }, - { - "idShort": "HasComponent_Y39_Pneumatischer_Antrieb", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y39" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y39" - }, - { - "type": "Entity", - "value": "Y39_Pneumatischer_Antrieb" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json b/server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json deleted file mode 100644 index 9e84b6dcd..000000000 --- a/server/storage/91bb81600dc2089d30a3a6b037cdae9247de3409255173a055ba49af014744c0.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "unkown" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pipe" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json b/server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json deleted file mode 100644 index eed4a0bf3..000000000 --- a/server/storage/92402a48ccc1ba7822d32121ed3f3957e81f217002077611430138188c23fb06.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "P14_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json b/server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json deleted file mode 100644 index b96fc69ca..000000000 --- a/server/storage/9260ba3ebc960a3e7d28fda54023f9e95ce4d800f1f2410feac3bab25bccb4d0.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19/TechnicalData", - "submodelElements": [ - { - "idShort": "Max_measurement_span", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6gliche algebraische Differenz zwischen dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsendwert und dem kleinstm\u00f6glichen einstellbaren Messbereichsanfangswert" - }, - { - "language": "en", - "text": "greatest possible algebraic difference between the greatest measurement range boundary value which can be set and the least possible value which can be set" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA033#008" - } - ] - }, - "value": "16", - "valueType": "xs:string" - }, - { - "idShort": "Min_measurement_span", - "description": [ - { - "language": "de", - "text": "kleinstm\u00f6gliche algebraische Differenz zwischen dem kleinstm\u00f6glichen einstellbaren Messbereichsendwert und dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsanfangswert" - }, - { - "language": "en", - "text": "lowest possible algebraic difference between the least measurement range boundary value which can be set and the greatest possible value which can be set" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA034#008" - } - ] - }, - "value": "0.16", - "valueType": "xs:string" - }, - { - "idShort": "Connection_type_of_process_connection", - "description": [ - { - "language": "de", - "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" - }, - { - "language": "en", - "text": "classification of a process connection according to its fabricated form" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO333#005" - } - ] - }, - "value": "G1/2 B nach EN837-1", - "valueType": "xs:string" - }, - { - "idShort": "Cable_inlet_present", - "description": [ - { - "language": "de", - "text": "Angabe, ob eine Kabeleinf\u00fchrung vorhanden ist" - }, - { - "language": "en", - "text": "whether a cable inlet is available" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAF727#008" - } - ] - }, - "value": "M20*1.5", - "valueType": "xs:string" - }, - { - "idShort": "max_operating_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen darf ohne Verlust seiner Funktionsf\u00e4higkeit" - }, - { - "language": "en", - "text": "maximum possible atmospheric pressure an operational funds is able to reach or to build up without damaging its operability" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAA900#007" - } - ] - }, - "value": "21", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4...20mA", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN313#004" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "Lower_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN314#004" - } - ] - }, - "value": "85", - "valueType": "xs:string" - }, - { - "idShort": "upper_limiting_value_of_process_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" - }, - { - "language": "en", - "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN307#004" - } - ] - }, - "value": "85", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json b/server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json deleted file mode 100644 index 73282b424..000000000 --- a/server/storage/936720e2c4723576e18caa20db1e713c5feee2c75a832f8cbc7f49183d1035f1.json +++ /dev/null @@ -1,283 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter/TechnicalData", - "submodelElements": [ - { - "idShort": "Commnunication", - "description": [ - { - "language": "de", - "text": "Bezugnahme auf eine oder mehrere Normen und Richtlinien anstelle der Wiedergabe detaillierter Festlegungen. ANMERKUNG Eine Anwendungsnorm ist die Vorgabe eines Handlungsmusters, das bei Anwendung befolgt, oder einer Qualit\u00e4t, die bei Anwendung eingehalten werden muss. Sie dient dazu, unabh\u00e4ngig voneinander entstehende Artefakte mit einheitlichen Eigenschaften oder Qualit\u00e4ten herzustellen. Nationale und internationale Normen werden in sog. Normungsgremien verabschiedet" - }, - { - "language": "en", - "text": "Reference to one or more norms and guidelines instead of repeating detailed specs. COMMENT: An application norm is a specification of a pattern of use which must be followed during use, or of a quality which must be maintained during use. It serves to cause artifacts which arise independently of one another to be manufactured with uniform properties or qualities. National and international standards are established by so-called standards committees" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAP798#001" - } - ] - }, - "value": "RS 352", - "valueType": "xs:string" - }, - { - "idShort": "Analogeingaenge", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Anzahl_parametrierbarer_Analogeingaenge", - "description": [ - { - "language": "de", - "text": "quantitative Angabe zur Menge analoger Schnittstellen am Ger\u00e4t zur Datenaufnahme anderer Ger\u00e4te" - }, - { - "language": "en", - "text": "quantitative specification of the amount of analogue interfaces at the device for data acquisition from other devices" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF912#001" - } - ] - }, - "value": "2", - "valueType": "xs:string" - }, - { - "idShort": "Spannungseingang", - "description": [ - { - "language": "de", - "text": "G\u00fcltiger Wertebereich f\u00fcr die Spannung an einem Analogeingang in Volt." - }, - { - "language": "en", - "text": "Valid value range for the voltage at an analog input in volts." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Spannungseingang" - } - ] - }, - "value": "0/2 - 10 V DC Ri = 22 k?", - "valueType": "xs:string" - }, - { - "idShort": "Stromeingang", - "description": [ - { - "language": "de", - "text": "G\u00fcltiger Wertebereich f\u00fcr den eingehenden Strom ein einem Analogeingang." - }, - { - "language": "en", - "text": "Valid range of values for the incoming current on an analog input." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Stromeingang" - } - ] - }, - "value": "0/4 - 20 mA DC Ri = 500 ?", - "valueType": "xs:string" - }, - { - "idShort": "Aufloesung", - "description": [ - { - "language": "de", - "text": "Anzahl der Bits, mit welcher ein Analogwert am Analogeingang digitalisiert werden kann - die Aufl\u00f6sung des A/D-Wandlers bzw. D/A-Wandlers bestimmt zusammen mit dem gew\u00e4hlten Eingangsbereich die kleinste Spannungsdifferenz (Schrittweite), die aufgel\u00f6st werden k\u00f6nnen" - }, - { - "language": "en", - "text": "Number of bits with which an analog value that can be digitalized at the analog output - the resolution of the A/D or D/A converter, together with the selected input range, determines the smallest voltage difference (increment) that can be resolved" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC831#007" - } - ] - }, - "value": "10", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Analogausgaenge", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Anzahl_parametrierbarer_Analogausgaenge", - "description": [ - { - "language": "de", - "text": "quantitative Angabe \u00fcber die Schnittstellen f\u00fcr analoge Daten\u00fcbermittlung an andere Ger\u00e4te" - }, - { - "language": "en", - "text": "quantitative specification of the interfaces for analogue data transfer to other devices" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAG545#001" - } - ] - }, - "value": "1 (Umschaltung zwischen 4 Ausgabewerten)", - "valueType": "xs:string" - }, - { - "idShort": "Spannungsausgang", - "description": [ - { - "language": "de", - "text": "G\u00fcltiger Wertebereich f\u00fcr die Spannung an einem Analogausgang in Volt." - }, - { - "language": "en", - "text": "Valid value range for the voltage at an analog output in volts." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Spannungsausgangang" - } - ] - }, - "value": "0 - 10 V / maximal 5 mA DC", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Digitaleingaenge", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Anzahl_Digitaleingaenge_insgesamt", - "description": [ - { - "language": "de", - "text": "quantitative Angabe zur Menge digitaler Schnittstellen am Ger\u00e4t zur Datenaufnahme anderer Ger\u00e4te" - }, - { - "language": "en", - "text": "quantitative specification of the amount of digital interfaces at the device for data acquisition from other devices" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF914#001" - } - ] - }, - "value": "6", - "valueType": "xs:string" - }, - { - "idShort": "parametrierbar", - "description": [ - { - "language": "de", - "text": "Anzahl der parametrierbaren Digitalausg\u00e4nge." - }, - { - "language": "en", - "text": "Number of configurable digital outputs." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/parametrierbar" - } - ] - }, - "value": "4", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Relaisausgaenge", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Anzahl_parametrierbarer_Relaisausgaenge", - "description": [ - { - "language": "de", - "text": "quantitative Angabe zur Menge digitaler Schnittstellen am Ger\u00e4t zur Daten\u00fcbermittlung an andere Ger\u00e4te" - }, - { - "language": "en", - "text": "quantitative specification of the amount of digital interfaces at the device for data transfer to other devices" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF913#001" - } - ] - }, - "value": "2 x Schlie\u00dfer", - "valueType": "xs:string" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json b/server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json deleted file mode 100644 index 2e876cfed..000000000 --- a/server/storage/943d19b60ec9be924cf63c5b01962bb0a6b7508747aea81f0a2de8c3510ee94e.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Q11_Messumformer_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11_Messumformer/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json b/server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json deleted file mode 100644 index ba2f0efbc..000000000 --- a/server/storage/951f2003a017eb2cc288f57923d8ba8246f0b3df52414ef1724e3858a3b90406.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F13_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC20/F13/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json b/server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json deleted file mode 100644 index 553ec264c..000000000 --- a/server/storage/976b42de205fc7e7586581e640cb302b4ca34c50f8b78b04f078f6a90f429bc1.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "T12_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json b/server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json deleted file mode 100644 index f70bfe15b..000000000 --- a/server/storage/979767aa74d1d92e1ae04b1174083b5d90ab9d76f69214872b8f56333b4eec06.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "VEGA" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Druckmessumformer" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Am Hohenstein 113" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "77761" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Schiltach" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "VEGABAR 66 BR66 XXCNGX1AHTMAX" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json b/server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json deleted file mode 100644 index 759b78c42..000000000 --- a/server/storage/990379eb5260ae3747a5750edf0de389f3d78ec4872047bed16973ad2d8de471.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F17/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "ABB Automation Products GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Drall-Durchflussmesser" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Dransfelder Str. 2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "37079" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "G\u00e4ttingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TRIO-WIRL ST 4 0" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json b/server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json deleted file mode 100644 index 4ebe0418b..000000000 --- a/server/storage/9940fd79aba8d90133981aab1323daccaf453c71e1e7684a7f622cf1d42a1031.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "data": { - "idShort": "B3_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3/DynamicData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json b/server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json deleted file mode 100644 index 1bb6350ca..000000000 --- a/server/storage/9ab1624d883884e8ef06a13f813fae95b9eead454e7f0b95405362846b9859c8.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Masoneilan" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "28-28110" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Baker-Hughe-Strasse 1" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "29221" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Celle" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "28000 Series VariPak" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json b/server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json deleted file mode 100644 index 914c37136..000000000 --- a/server/storage/9c0284cc02ecc87c073e1f5d632b3279f412af90d324eb292b0108cec8a7ae21.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Messumformer" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Dieselstra\u00dfe 24" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "70839" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Gerlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Mycom S CLM153" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json b/server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json deleted file mode 100644 index 473f19604..000000000 --- a/server/storage/9c36e3b3b714f8c8d3c00723a9e06ee07cb7f396769a5e7553937a09acef0375.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/TechnicalData", - "submodelElements": [ - { - "idShort": "Height", - "description": [ - { - "language": "de", - "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu L\u00e4nge/Breite/Tiefe stehende Ausdehnung - bei Gegenst\u00e4nden mit fester Orientierung oder in bevorzugter Gebrauchslage der parallel zur Schwerkraft gemessenen Abstand zwischen Ober- und Unterkante" - }, - { - "language": "en", - "text": "for objects with orientation in preferred position during use the dimension perpendicular to diameter/length/width/depth" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA020#009" - } - ] - }, - "value": "1", - "valueType": "xs:string" - }, - { - "idShort": "Width", - "description": [ - { - "language": "de", - "text": "bei eher rechtwinkeligen K\u00f6rpern die orthogonal zu H\u00f6he/L\u00e4nge/Tiefe stehende Ausdehnung rechtwinklig zur l\u00e4ngsten Symmetrieachse" - }, - { - "language": "en", - "text": "for objects with orientation in preferred position during use the dimension perpendicular to height/ length/depth" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAF016#006" - } - ] - }, - "value": "1", - "valueType": "xs:string" - }, - { - "idShort": "Volume", - "description": [ - { - "language": "de", - "text": "Inneres Volumen eines Raums, einschlie\u00dflich des Volumens von den Stutzen bis zur ersten Verbindung, aber abz\u00fcglich des Volumens fest eingebauter innen liegender Teile" - }, - { - "language": "en", - "text": "Internal volume of a chamber, including the volume of nozzles to the first connection, and excluding the volume of permanent internal parts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA138#006" - } - ] - }, - "value": "1", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json b/server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json deleted file mode 100644 index b6c392aa6..000000000 --- a/server/storage/9cb4c17d6771c9daafde3d5b60157309ffe09dae1acec27145dc3795502a3bfc.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Yokogawa Deutschland GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Vortex Flowmeter" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Broichhofstr. 7-11" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "40880" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Ratingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "digitalYEWFLO DY025-61" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json b/server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json deleted file mode 100644 index 6735900e2..000000000 --- a/server/storage/9cd33e349b4bbbdee4cf1d12b4f6ff1f1b0d713850fa7e8033e9601268f0b0fa.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "KSB AG" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Motor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Johann-Klein-Str. 9" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "67227" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Frankenthal" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "3\u00a0~ Mot 1LA7080-4AA11-ZX77A" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json b/server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json deleted file mode 100644 index 0c38bbcc9..000000000 --- a/server/storage/9e9c678e591acf1e2d98643ce39cd642c3a579a22dd8ba869bc87eef9fc6fb5b.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Pumpe/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GRUNDFOS" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "CRNE 3-5 A-FGJ-G-V-HQQV" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Martin Bachs Vej 3" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8850" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Bjerringbro" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DK" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Grundfos Pumpe 96499985" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json b/server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json deleted file mode 100644 index 7bd451c2f..000000000 --- a/server/storage/a338d5fb95560b46a1b54cbc066d41007aa50220d85bc69c5366220aa7d80112.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Regler/TechnicalData", - "submodelElements": [ - { - "idShort": "Kommunikationsprotokoll", - "description": [ - { - "language": "de", - "text": "Angabe, ob die Hard- bzw. Software \u00fcber eine Schnittstelle verf\u00fcgt, die f\u00fcr die Daten\u00fcbertragung ein Kommunikationsprotokoll f\u00fcr sonstige Bussysteme verwendet" - }, - { - "language": "en", - "text": "whether, from the PLC programming software, a protocol is supported" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAD280#009" - } - ] - }, - "value": "4 - 20 mA DC/ HART", - "valueType": "xs:string" - }, - { - "idShort": "Ausgang", - "description": [ - { - "language": "de", - "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" - }, - { - "language": "en", - "text": "rules and agreements by that communication partner can interact with each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW333#001" - } - ] - }, - "value": "Luftruck", - "valueType": "xs:string" - }, - { - "idShort": "max_Druck", - "description": [ - { - "language": "de", - "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" - }, - { - "language": "en", - "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA447#006" - } - ] - }, - "value": "7", - "valueType": "xs:string" - }, - { - "idShort": "min_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP66", - "valueType": "xs:string" - }, - { - "idShort": "max_Spannung", - "description": [ - { - "language": "de", - "text": "h\u00f6chster Wert der Spannung, die am Versorgungseingang eines elektrischen Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" - }, - { - "language": "en", - "text": "maximum value of the required voltage which must be temporarily or permanently applied to the supply connection of an operating unit to maintain its function" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAE321#006" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "max_Strom", - "description": [ - { - "language": "de", - "text": "maximal aufnehmbarer Strom" - }, - { - "language": "en", - "text": "maximum of energy which can be drawn" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF954#003" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "elektrischer_Anschluss", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" - }, - { - "language": "en", - "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB414#007" - } - ] - }, - "value": "ISO M20 x 1.5 Innengewinde", - "valueType": "xs:string" - }, - { - "idShort": "pneumatischer_Anschluss", - "description": [ - { - "language": "de", - "text": "Art und Gr\u00f6\u00dfe des Druckmedienanschlusses eines pneumatischen Bauteils" - }, - { - "language": "en", - "text": "type and size of the pressure media connection on a pneumatic component" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ960#002" - } - ] - }, - "value": "G1/4", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json b/server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json deleted file mode 100644 index 9c1f1f49e..000000000 --- a/server/storage/a34e186729dff380ad873de3c372214c9ce67ed462f7daf0563eb16a942e4ede.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "data": { - "idShort": "Y24_Ball_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/DynamicData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json b/server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json deleted file mode 100644 index e55093529..000000000 --- a/server/storage/a3f81ed9def46240deaa842646e88ae7014c85265d818a24d5109d2e25c99609.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Norgren/Herion" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Indirect solenoid actuated spool valves" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Bruckstra\u00dfe 93" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "46519" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Alpen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "97100 Namur" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json b/server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json deleted file mode 100644 index 157e3c79a..000000000 --- a/server/storage/a48449052205303000ff02f368de48693e34ef1fbf83cebe290bc9f55ac2a7aa.json +++ /dev/null @@ -1,424 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Pipe12", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "N18", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18" - }, - { - "idShort": "HasControlModule_N18", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - }, - { - "type": "Entity", - "value": "N18" - } - ] - } - }, - { - "idShort": "P19", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P19" - }, - { - "idShort": "HasControlModule_P19", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - }, - { - "type": "Entity", - "value": "P19" - } - ] - } - }, - { - "idShort": "T20", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20" - }, - { - "idShort": "HasControlModule_T20", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - }, - { - "type": "Entity", - "value": "T20" - } - ] - } - }, - { - "idShort": "F22", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/F22" - }, - { - "idShort": "HasControlModule_F22", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - }, - { - "type": "Entity", - "value": "F22" - } - ] - } - }, - { - "idShort": "Y21", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21" - }, - { - "idShort": "HasControlModule_Y21", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe12" - }, - { - "type": "Entity", - "value": "Y21" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json b/server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json deleted file mode 100644 index 4d6df19c2..000000000 --- a/server/storage/a617a68ae0971bf52c771b1484e8a75ac4097e900999c4d45f001dd15fcb2958.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/TechnicalData", - "submodelElements": [ - { - "idShort": "Nominal_Pressure", - "description": [ - { - "language": "de", - "text": "alphanummerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung" - }, - { - "language": "en", - "text": "alphanumeric variable for reference purposes, relating to a combination of mechanical and dimensional properties of a component of a pipe" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ333#004" - } - ] - }, - "value": "40", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_Size", - "description": [ - { - "language": "de", - "text": "Untergruppe einer Bauart, deren Unterscheidungsmerkmale im Allgemeinen die Abmessungen sind" - }, - { - "language": "en", - "text": "subgroup of a construction type, whose differentiating features are generally the dimensions" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAP898#005" - } - ] - }, - "value": "25", - "valueType": "xs:string" - }, - { - "idShort": "Material", - "description": [ - { - "language": "de", - "text": "auf Normen basierender Nummerncode von Werkstoffen des Geh\u00e4uses" - }, - { - "language": "en", - "text": "standard-based coding of materials of housing" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAD738#006" - } - ] - }, - "value": "SS/SS-SS-RFE", - "valueType": "xs:string" - }, - { - "idShort": "Test_Pressure", - "description": [ - { - "language": "de", - "text": "Testdruck zum pr\u00fcfen des Ventils." - }, - { - "language": "en", - "text": "Test pressure to check the valve." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/TestPressure" - } - ] - }, - "value": "54.6", - "valueType": "xs:string" - }, - { - "idShort": "Permissible_Temprature", - "description": [ - { - "language": "de", - "text": "Zul\u00e4ssiger Temperaturbereich f\u00fcr den Betrieb." - }, - { - "language": "en", - "text": "Permissible temperature range for operation." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/PermissibleTemperature" - } - ] - }, - "value": "-50 to 220", - "valueType": "xs:string" - }, - { - "idShort": "Maximum_Permissible_Operating_Pressure_at_Room_Temperature", - "description": [ - { - "language": "de", - "text": "Maximal zul\u00e4ssiger Betriebsdruck bei Raumtemperatur." - }, - { - "language": "en", - "text": "Maximum Permissible Operating Pressure at Room Temperature." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/MaxOperatingPressure" - } - ] - }, - "value": "36.4", - "valueType": "xs:string" - }, - { - "idShort": "Max_perm_temperature", - "description": [ - { - "language": "de", - "text": "Die Hitzbest\u00e4ndigkeit eines Produktes in Grad Celsius" - }, - { - "language": "en", - "text": "The heat resistance of a product in degrees centigrade." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAF417#005" - } - ] - }, - "value": "220", - "valueType": "xs:string" - }, - { - "idShort": "Connection", - "description": [ - { - "language": "de", - "text": "Prozessanschluss." - }, - { - "language": "en", - "text": "Process connection." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Connection" - } - ] - }, - "value": "Flange Connection", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json b/server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json deleted file mode 100644 index 3b2af1db1..000000000 --- a/server/storage/a772eb4097f4d6a7794f4ec6d9b17cbe4f17fefed14f4ef777316007a0a045ce.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Pipe31", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "N36", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36" - }, - { - "idShort": "HasControlModule_N36", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe31" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe31" - }, - { - "type": "Entity", - "value": "N36" - } - ] - } - }, - { - "idShort": "Y37", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y37" - }, - { - "idShort": "HasControlModule_Y37", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe31" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe31" - }, - { - "type": "Entity", - "value": "Y37" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json b/server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json deleted file mode 100644 index ee712db25..000000000 --- a/server/storage/a7ce8fe81812f996ca29c8e982de65df7b33d35df093479a0381f14d28a8c557.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "Dynamic_Data", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Ball_Valve/DynamicData", - "submodelElements": [ - { - "idShort": "Valve_Opening", - "description": [ - { - "language": "de", - "text": "\u00d6ffnunggrad des Venitls." - }, - { - "language": "en", - "text": "Degree of opening of the valve." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/ValveOpening" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json b/server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json deleted file mode 100644 index bbfd764a6..000000000 --- a/server/storage/af06108a94870770ccff47b1ee67508e0d340f28ca992c55c43c1e146cbcb75c.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y20_MagneticPostitioner_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20_MagneticPositioner/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json b/server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json deleted file mode 100644 index f0dce3309..000000000 --- a/server/storage/af0a12983ea0f2eb4c83785f1a639a4a47aa04a35d2da648d85ee8ccf6e1f1ff.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "Dynamic_Data", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/DynamicData", - "submodelElements": [ - { - "idShort": "Valve_Opening", - "description": [ - { - "language": "de", - "text": "\u00d6ffnunggrad des Venitls." - }, - { - "language": "en", - "text": "Degree of opening of the valve." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/ValveOpening" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json b/server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json deleted file mode 100644 index 181c4ed86..000000000 --- a/server/storage/b00c4294bc49cc58205b57df6df95314a6afd88c2f27c3f95be8d74d69042e5e.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y16_Actuator_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y16_Actuator/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json b/server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json deleted file mode 100644 index 3946e9a13..000000000 --- a/server/storage/b02154d1a33d54fda30a3e76c8cd495e60e52003b4c91d351af7a3dddb1c2b37.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y22_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json b/server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json deleted file mode 100644 index a9e8721b8..000000000 --- a/server/storage/b097b9736606eab6548e3d4d14b6f750d79014b4c63ff782d28bbd01f6641b79.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Samson AG" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Pneumatischer Antrieb" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Weism\u00fcllerstra\u00dfe 3" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "60341" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Frankfurt am Main" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Typ 3277" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2005", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json b/server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json deleted file mode 100644 index dd0ecb8fe..000000000 --- a/server/storage/b5650a00d4620b8969ebc16ed16198a9dafe02e24ccdaca582f02af348c3074a.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y21_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json b/server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json deleted file mode 100644 index 4804f3dd3..000000000 --- a/server/storage/b57612fb5fa881934bb51c17915feef105ccabad344a17d5a4b35ff45be854fa.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N12_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/N12/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json b/server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json deleted file mode 100644 index 322bc7441..000000000 --- a/server/storage/b5c17271668a31f9fd9ca1f8123db7fecaaa628d8ea1eb325d09f4f1502ec77c.json +++ /dev/null @@ -1,471 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/N29/TechnicalData", - "submodelElements": [ - { - "idShort": "Temperature_range", - "description": [ - { - "language": "de", - "text": "Bereich von der kleinsten bis zur gr\u00f6\u00dften Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "Range from the smallest through to the largest temperature in the outer surroundings of the operating medium" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO931#001" - } - ] - }, - "value": "-25...110", - "valueType": "xs:string" - }, - { - "idShort": "Density", - "description": [ - { - "language": "de", - "text": "Quotient aus der Masse m und dem Volumen V einer Stoffportion" - }, - { - "language": "en", - "text": "quotient of the mass m divided by the spatial volume V" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA356#004" - } - ] - }, - "value": "983.2", - "valueType": "xs:string" - }, - { - "idShort": "Max_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB906#006" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Max_operating_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC821#006" - } - ] - }, - "value": "10", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_pipe_connection", - "description": [ - { - "language": "de", - "text": "Angabe, welche Rohrarten angeflanscht werden k\u00f6nnen" - }, - { - "language": "en", - "text": "Specifying which types of pipe can be flanged" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAX110#001" - } - ] - }, - "value": "G2", - "valueType": "xs:string" - }, - { - "idShort": "Pressure_rating_SDR", - "description": [ - { - "language": "de", - "text": "Standard Dimensionsrate (SDR) ist eine zur Klassifizierung von Kunststoffrohren gebr\u00e4uchliche Kennzahl, die das Verh\u00e4ltnis zwischen Au\u00dfendurchmesser und Wanddicke eines Rohres wiedergibt" - }, - { - "language": "en", - "text": "Standard dimension ratio (SDR) is a common classification of plastic pipes figure which represents the ratio between the outside diameter and wall thickness of a pipe" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAX111#001" - } - ] - }, - "value": "PN10", - "valueType": "xs:string" - }, - { - "idShort": "Power_input_of_motor", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Speed1", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit f\u00fcr den Betrieb des Motors notwendige elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "under given operating conditions and nominal value of power output, the entire effective electrical power input from the mains network that is required for operation of the motor for the period of time in question" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA448#004" - } - ] - }, - "value": "135", - "valueType": "xs:string" - }, - { - "idShort": "Speed2", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit f\u00fcr den Betrieb des Motors notwendige elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "under given operating conditions and nominal value of power output, the entire effective electrical power input from the mains network that is required for operation of the motor for the period of time in question" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA448#004" - } - ] - }, - "value": "205", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Max_power", - "description": [ - { - "language": "de", - "text": "Maximalwert der Leistung, die sich nach der Gleichung P = dE/dt bzw. P = dW/dt als zeitliche Ableitung von Energie, die gerade \u00fcbertragen oder umgewandelt wird, oder von Arbeit, die gerade verrichtet wird, ergibt" - }, - { - "language": "en", - "text": "maximum value of power, that results from the equation P = dE/dt or P = dW/dt, which say that power is the derivative of the energy being transmitted or converted now with respect to time, or else the derivative of the work which is being done now with respect to time" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC671#009" - } - ] - }, - "value": "240", - "valueType": "xs:string" - }, - { - "idShort": "Operating_frequency", - "description": [ - { - "language": "de", - "text": "Frequenz der elektrischen Spannung und/oder der elektromagnetischen Schwingung, f\u00fcr die das Ger\u00e4t ausgelegt ist" - }, - { - "language": "en", - "text": "The voltage frequency and/or electromagnetic pulse for which the device is designed" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB505#006" - } - ] - }, - "value": "50", - "valueType": "xs:string" - }, - { - "idShort": "Max_rated_voltage_at_AC_50_Hz", - "description": [ - { - "language": "de", - "text": "max. Wert einer Wechselspannung mit einer Frequenz von 50Hz, der vom Hersteller f\u00fcr ein Bauteil, Ger\u00e4t oder eine Einrichtung angegeben wird und auf den sich Funktions- und Leistungsmerkmale beziehen" - }, - { - "language": "en", - "text": "maximum value of a rated voltage at AC 50 Hz stipulated by the manufacturer for a component, device or equipment which relates to the function and power properties" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF975#004" - } - ] - }, - "value": "230", - "valueType": "xs:string" - }, - { - "idShort": "Operating_current", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Speed1", - "description": [ - { - "language": "de", - "text": "Vom Hersteller angegebener Wert des Stromes, der beim Betrieb der Anlage oder von Anlageteilen vorhanden ist oder vorhanden sein muss" - }, - { - "language": "en", - "text": "Manufacturer's value of the current, which is or must be present during operation of the system or of system parts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC051#004" - } - ] - }, - "value": "0.62", - "valueType": "xs:string" - }, - { - "idShort": "Speed2", - "description": [ - { - "language": "de", - "text": "Vom Hersteller angegebener Wert des Stromes, der beim Betrieb der Anlage oder von Anlageteilen vorhanden ist oder vorhanden sein muss" - }, - { - "language": "en", - "text": "Manufacturer's value of the current, which is or must be present during operation of the system or of system parts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC051#004" - } - ] - }, - "value": "0.91", - "valueType": "xs:string" - }, - { - "idShort": "Speed3", - "description": [ - { - "language": "de", - "text": "Vom Hersteller angegebener Wert des Stromes, der beim Betrieb der Anlage oder von Anlageteilen vorhanden ist oder vorhanden sein muss" - }, - { - "language": "en", - "text": "Manufacturer's value of the current, which is or must be present during operation of the system or of system parts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC051#004" - } - ] - }, - "value": "1.5", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Protection_class", - "description": [ - { - "language": "de", - "text": "Angabe \u00fcber die Schutzklasse der Objekts" - }, - { - "language": "en", - "text": "indication of the safety class of the object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK401#005" - } - ] - }, - "value": "IP42", - "valueType": "xs:string" - }, - { - "idShort": "Thermal_insulation_present", - "description": [ - { - "language": "de", - "text": "Angabe, ob das Produkt mit einer thermischen Isolierung ausgestattet ist" - }, - { - "language": "en", - "text": "whether the device is equipped with a thermal insulation or not" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAL232#004" - } - ] - }, - "value": "F", - "valueType": "xs:string" - }, - { - "idShort": "kind_of_motor_protection_device", - "description": [ - { - "language": "de", - "text": "gibt an, welche Art der Vorrichtung zum Schutz des Motors vorhanden ist" - }, - { - "language": "en", - "text": "indicates the available kind of device to protect the motor" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAR645#006" - } - ] - }, - "value": "CONTACT", - "valueType": "xs:string" - }, - { - "idShort": "Net_weight", - "description": [ - { - "language": "de", - "text": "Masse des W\u00e4geguts ohne Verpackung und ohne Transportger\u00e4t" - }, - { - "language": "en", - "text": "mass of the weighed object without packing and transport equipment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF040#007" - } - ] - }, - "value": "5.2", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json b/server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json deleted file mode 100644 index 7b524bc79..000000000 --- a/server/storage/b70e6052f9d866b8f01d8d9e4d06bcc52e66214c0a51ef0f93842af6492699ef.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y22_MagneticPositioner_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22_MagneticPositioner/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json b/server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json deleted file mode 100644 index 1297fc50b..000000000 --- a/server/storage/b9ced7f5fc50b02a4236c3efa30515df1369ae642a7166d7f62b32dba9f05e9f.json +++ /dev/null @@ -1,415 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/TechnicalData", - "submodelElements": [ - { - "idShort": "Max_medium_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB864#006" - } - ] - }, - "value": "110", - "valueType": "xs:string" - }, - { - "idShort": "Min_medium_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB988#006" - } - ] - }, - "value": "2", - "valueType": "xs:string" - }, - { - "idShort": "Temperature_class", - "description": [ - { - "language": "de", - "text": "Charakterisierungssystem eines elektrischen Ger\u00e4ts, basierend auf dessen maximaler Oberfl\u00e4chentemperatur, bez\u00fcglich der spezifischen explosionsf\u00e4higen Atmosph\u00e4re, f\u00fcr deren Nutzung das Ger\u00e4t vorgesehen ist" - }, - { - "language": "en", - "text": "classification system of electrical apparatus, based on its maximum surface temperature, related to the specific explosive atmosphere for which it is intended to be used" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO371#005" - } - ] - }, - "value": "110", - "valueType": "xs:string" - }, - { - "idShort": "Material_body", - "description": [ - { - "language": "de", - "text": "Werkstoff, aus dem das Ger\u00e4tegeh\u00e4use gefertigt ist" - }, - { - "language": "en", - "text": "substance of which the appliance exterior is made of" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO747#008" - } - ] - }, - "value": "Bronze", - "valueType": "xs:string" - }, - { - "idShort": "Construction_form_of_impeller", - "description": [ - { - "language": "de", - "text": "Gruppe von Bauelementen mit gleichen Konstruktionsmerkmalen und gleichem Aufbau, die aufgrund \u00e4hnlicher Herstellungstechniken f\u00fcr die Bauartzulassungspr\u00fcfung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden k\u00f6nnen. Sie werden im allgemeinen von einer Bauartspezifikation erfasst. Anmerkung: In bestimmten F\u00e4llen k\u00f6nnen Bauelemente aus verschiedenen Bauartspezifikationen als zum gleichen Typ geh\u00f6rig betrachtet und daher f\u00fcr die Bauartzulassung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden" - }, - { - "language": "en", - "text": "Group of components with the same construction features and the same structure, which - due to similar manufacturing techniques - can be collated for construction approval testing and class conformity controls. They are generally allocated to a construction type. Note: in certain cases, components can be viewed from various construction type specifications as belonging to the same type and, therefore, can be collated for construction approval and class conformity controls" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABF501#001" - } - ] - }, - "value": "Komposit PES/PP", - "valueType": "xs:string" - }, - { - "idShort": "Max_ambient_temperature_during_operation", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Maximum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB906#006" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Max_operation_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb auftritt bzw. auftreten darf, angegeben in der abgeleiteten SI-EInheit des Druckes" - }, - { - "language": "en", - "text": "greatest pressure that occurs in a system in operation or shall occur, indicated in the derived SI unit of pressure" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAJ845#005" - } - ] - }, - "value": "10", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_size", - "description": [ - { - "language": "de", - "text": "numerische Bezeichnung der Gr\u00f6\u00dfe bezogen auf den Str\u00f6mungsquerschnitt eines fluidtechnischen Ger\u00e4tes" - }, - { - "language": "en", - "text": "numeric identifier for the measured variable referred to the flow cross section of a fluidic device" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC418#001" - } - ] - }, - "value": "G1 1/2", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_pressure_of_the_operating_medium", - "description": [ - { - "language": "de", - "text": "PN (Nenndruck) ist eine alphanumerische Kenngr\u00f6\u00dfe f\u00fcr Referenzzwecke, bezogen auf eine Kombination von mechanischen und ma\u00dflichen Eigenschaften eines Bauteils einer Rohrleitung. Sie umfasst die Buchstaben PN gefolgt von einer dimensionslosen Zahl" - }, - { - "language": "en", - "text": "PN (nominal pressure) is an alphanumeric variable for reference purposes, relating to a combination of mechanical and measurement properties of a pipe component. It comprises the letters PN followed by a dimensionless number (according to EN 1333/96.08)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO778#001" - } - ] - }, - "value": "PN10", - "valueType": "xs:string" - }, - { - "idShort": "Insertion_length", - "description": [ - { - "language": "de", - "text": "Gesamtl\u00e4nge des Teils eines Ger\u00e4ts oder einer Komponente, der sich innerhalb eines Beh\u00e4lters befindet" - }, - { - "language": "en", - "text": "overall length of that part of a device or component to be found within a containment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO023#004" - } - ] - }, - "value": "180", - "valueType": "xs:string" - }, - { - "idShort": "Power_frequency", - "description": [ - { - "language": "de", - "text": "Anzahl der Schwingungen des Stromes im Netz pro Zeiteinheit, in Hertz (Hz) gemessen" - }, - { - "language": "en", - "text": "Number of oscillations of the current in the network per time unit, measured in Hertz (Hz)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC859#003" - } - ] - }, - "value": "50", - "valueType": "xs:string" - }, - { - "idShort": "Nominal_voltage", - "description": [ - { - "language": "de", - "text": "Nennspannung ist der vom Hersteller oder Lieferanten spezifizierte Wert der elektrischen Spannung im Normalbetrieb" - }, - { - "language": "en", - "text": "nominal voltage is the specified value which shows the voltage in normal operation given by the manufacturer or supplier" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC856#007" - } - ] - }, - "value": "1*230V", - "valueType": "xs:string" - }, - { - "idShort": "Power_consumption", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Drehzahlstufe1", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH939#001" - } - ] - }, - "value": "50", - "valueType": "xs:string" - }, - { - "idShort": "Drehzahlstufe2", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH939#001" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Drehzahlstufe3", - "description": [ - { - "language": "de", - "text": "f\u00fcr die betrachtete Zeit aus dem Versorgungsnetz (einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen) aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "total electric initial effective power that is absorbed off the supply grid during the concerning time (including the power absorption for additional devices), under set operating conditions and at the nominal value of the initial power" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH939#001" - } - ] - }, - "value": "70", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Net_weight", - "description": [ - { - "language": "de", - "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t. Da unter \u201eGewicht\u201c in diesem Fall die Masse verstanden wird, ist auch die Ma\u00dfeinheit (Kilo-) Gramm als SI-Einheit zu verwenden" - }, - { - "language": "en", - "text": "Dimensions of the weigh item without packaging and without transport device. As, in this case, 'weight' means dimensions, the measure unit (kilo) gram is to be used as the SI unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAD875#007" - } - ] - }, - "value": "02. Sep", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json b/server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json deleted file mode 100644 index 898e9b20c..000000000 --- a/server/storage/bb900322ad16020b768622449ba43f06bc08ab63281b5e36085f6a54601877e1.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "T12", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "T12_Messumformer", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Messumformer" - }, - { - "idShort": "HasComponent_T12_Messumformer", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "T12" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "T12" - }, - { - "type": "Entity", - "value": "T12_Messumformer" - } - ] - } - }, - { - "idShort": "T12_Temperature_Sensor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor" - }, - { - "idShort": "HasComponent_T12_Temperature_Sensor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "T12" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "T12" - }, - { - "type": "Entity", - "value": "T12_Temperature_Sensor" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json b/server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json deleted file mode 100644 index e249746f1..000000000 --- a/server/storage/be1368e143f279ed050d5ecd8bee0fe3f3aab76ec769b2074a997f4e21f62fc6.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N13_Motor_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13_Motor/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json b/server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json deleted file mode 100644 index fa92b7b61..000000000 --- a/server/storage/beac51d11b5996430a7c37cd7058941b49cffcb1811d234af2564b0d30e3ee5e.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L35_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L35/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json b/server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json deleted file mode 100644 index c8d93e59b..000000000 --- a/server/storage/bfedd6e4866c813ed27041a0eb99bf4fb1de7070e8cc5429bc537c70481c5fa5.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Pipe32", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "N38", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38" - }, - { - "idShort": "HasControlModule_N38", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe32" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe32" - }, - { - "type": "Entity", - "value": "N38" - } - ] - } - }, - { - "idShort": "Y39", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39" - }, - { - "idShort": "HasControlModule_Y39", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe32" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Pipe32" - }, - { - "type": "Entity", - "value": "Y39" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json b/server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json deleted file mode 100644 index c97e737c9..000000000 --- a/server/storage/c30b07d535161321fbbfe1d3bb8f7831eedb9ee52c098235709a1aa770d05420.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb/TechnicalData", - "submodelElements": [ - { - "idShort": "Springstroke", - "description": [ - { - "language": "de", - "text": "Federweg der Feder." - }, - { - "language": "en", - "text": "Springstroke." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Springstroke" - } - ] - }, - "value": "31 to 47", - "valueType": "xs:string" - }, - { - "idShort": "Air_consumption", - "description": [ - { - "language": "de", - "text": "Verbrauch des Werkzeuge an Druckluft, z.B. f\u00fcr Druckluft-Schlagschrauber" - }, - { - "language": "en", - "text": "Tool's consumption of compressed air, e.g. for compressed air hammer screw driver" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA453#003" - } - ] - }, - "value": "0.74", - "valueType": "xs:string" - }, - { - "idShort": "maximum_operating_pressure", - "description": [ - { - "language": "de", - "text": "oberer Grenzwert des Druckbereiches, bei dem ein fluidtechnisches Ger\u00e4t seine Funktion erf\u00fcllt" - }, - { - "language": "en", - "text": "upper limit of the pressure range at which a fluidic device fulfils its function" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ943#001" - } - ] - }, - "value": "8.3", - "valueType": "xs:string" - }, - { - "idShort": "Min_operating_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "minimum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC820#006" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Max_operating_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC821#006" - } - ] - }, - "value": "100", - "valueType": "xs:string" - }, - { - "idShort": "Weight", - "description": [ - { - "language": "de", - "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t" - }, - { - "language": "en", - "text": "Mass of weight without packaging and transport unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB713#006" - } - ] - }, - "value": "5.5", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json b/server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json deleted file mode 100644 index 52da19ea8..000000000 --- a/server/storage/c3149cb7860cf4d48dbcd2be6fc517658b305a8d88449526fb9ecb6023ea6523.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Pipe12_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json b/server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json deleted file mode 100644 index 88c920493..000000000 --- a/server/storage/c3afd4a0fea252882a585858dbde0cd3b04cb02d228de803726945c86afd210e.json +++ /dev/null @@ -1,509 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/TechnicalData", - "submodelElements": [ - { - "idShort": "HS_Code_of_the_WCO", - "description": [ - { - "language": "de", - "text": "International angewendete 4 bis 6-stellige Kodierung von Warenklassen entsprechend der Definition durch das Harmonized System (HS) der World Customs Organization (WCO)" - }, - { - "language": "en", - "text": "Internationally applied 4 to 6-digit coding of classes of goods as defined by the Harmonized System (HS) of the World Customs Organization (WCO)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ851#001" - } - ] - }, - "value": "90261029", - "valueType": "xs:string" - }, - { - "idShort": "Cable_entry", - "description": [ - { - "language": "de", - "text": "Charakterisierung einer Kabel- oder Conduiteinf\u00fchrung bez\u00fcglich des Anschlussgewindes" - }, - { - "language": "en", - "text": "classification of a cable or conduit entry according to the thread" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA279#008" - } - ] - }, - "value": "M20*1.5", - "valueType": "xs:string" - }, - { - "idShort": "Total_length_metric", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfte L\u00e4ngenausdehnung eines Objektes, inklusive ausragender Bauteile" - }, - { - "language": "en", - "text": "largest dimension of an object, inclusive jutting parts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAJ184#004" - } - ] - }, - "value": "5", - "valueType": "xs:string" - }, - { - "idShort": "Connection_type_of_process_connection", - "description": [ - { - "language": "de", - "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" - }, - { - "language": "en", - "text": "classification of a process connection according to its fabricated form" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO333#005" - } - ] - }, - "value": "Verschraubung, lose G1/2A PN3", - "valueType": "xs:string" - }, - { - "idShort": "Measuring_range", - "description": [ - { - "language": "de", - "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" - }, - { - "language": "en", - "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH095#003" - } - ] - }, - "value": "0...0.1", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4...20mA/HART", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_process_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" - }, - { - "language": "en", - "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN307#004" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Min_process_pressure", - "description": [ - { - "language": "de", - "text": "kleinster Absolutwert des die Mess- oder Stelleinrichtung ber\u00fchrenden Druckes, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the least absolute value of the pressure which affects them and under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY641#001" - } - ] - }, - "value": "-0.2", - "valueType": "xs:string" - }, - { - "idShort": "Max_process_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Absolutwert des auf die Mess- oder Stelleinrichtung einwirkenden Drucks, mit dem die Mess- oder Stelleinrichtung ohne bleibende Ver\u00e4nderungen ihrer technischen Eigenschaften betrieben werden darf" - }, - { - "language": "en", - "text": "for given measurement or final control equipment, the greatest absolute value of the pressure under which they can be operated without permanent changes in their technical characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAY820#001" - } - ] - }, - "value": "15", - "valueType": "xs:string" - }, - { - "idShort": "Power_supply", - "description": [ - { - "language": "de", - "text": "Versorgung von Ger\u00e4ten oder Anlagen mit gesonderter, zus\u00e4tzlicher Stromzuf\u00fchrung" - }, - { - "language": "en", - "text": "supply of devices or systems with separate, additional power supply" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ002#001" - } - ] - }, - "value": "12...36", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP66/67", - "valueType": "xs:string" - }, - { - "idShort": "Max_output_current", - "description": [ - { - "language": "de", - "text": "Maximaler Strom, der an den Ausgangsanschl\u00fcssen des Steuerstromkreises eines Schaltger\u00e4ts anliegt" - }, - { - "language": "en", - "text": "Maximum current at the output connections of the control circuit of a switching device" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAC639#007" - } - ] - }, - "value": "22", - "valueType": "xs:string" - }, - { - "idShort": "Accuracy_of_the_measuring_instrument", - "description": [ - { - "language": "de", - "text": "Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" - }, - { - "language": "en", - "text": "degree of approximation between a result of determination and the approved reference value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH809#004" - } - ] - }, - "value": "\u00b13", - "valueType": "xs:string" - }, - { - "idShort": "Vibration_resistance", - "description": [ - { - "language": "de", - "text": "mechanische Widerstandsf\u00e4higkeit von Ger\u00e4ten gegen\u00fcber sinusf\u00f6rmigen Schwingungen mit vorgegebenem Sch\u00e4rfegrad" - }, - { - "language": "en", - "text": "mechanical resistance capacity of devices against sinusoidal oscillations with prescribed test intensity" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO888#003" - } - ] - }, - "value": "4g and 5...100Hz", - "valueType": "xs:string" - }, - { - "idShort": "Set_display_language", - "description": [ - { - "language": "de", - "text": "Sprache oder Sprachen, die auf der Anzeige eingestellt ist" - }, - { - "language": "en", - "text": "language or languages set on the display" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABA335#001" - } - ] - }, - "value": "DE", - "valueType": "xs:string" - }, - { - "idShort": "Shock_resistance", - "description": [ - { - "language": "de", - "text": "Schockfestigkeit" - }, - { - "language": "en", - "text": "Shock resistance" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV513#002" - } - ] - }, - "value": "Beschleunigung 100g/6ms", - "valueType": "xs:string" - }, - { - "idShort": "Dynamic_behavior_dead_time", - "description": [ - { - "language": "de", - "text": "Zeitdauer zwischen dem Moment, in dem die Abweichung einer Eingangsgr\u00f6\u00dfe erstellt wird und dem Moment, in dem die daraus resultierende Abweichung der Ausgangsgr\u00f6\u00dfe beginnt" - }, - { - "language": "en", - "text": "time interval between the instant when the variation of an input variable is produced and the instant when the consequent variation of the output variable starts" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE258#006" - } - ] - }, - "value": "150", - "valueType": "xs:string" - }, - { - "idShort": "Rise_time", - "description": [ - { - "language": "de", - "text": "Anstiegszeit ist die Zeit, in der ein Signal von 10 % auf 90 % seines Endwertes ansteigt" - }, - { - "language": "en", - "text": "min. supply pressure is used as necessary in order to have a further differentiating term for a second pressure based on the primary operating pressure, here the min. supply pressure" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD909#001" - } - ] - }, - "value": "100", - "valueType": "xs:string" - }, - { - "idShort": "Step_response_time_t90", - "description": [ - { - "language": "de", - "text": "zeitliche Dauer, bei einer stufenartigen Ver\u00e4nderung des Eingangssignals eines Systems, die die \u00c4nderung des Ausgangssignals des Systems ben\u00f6tigt, um zum ersten Mal 90% des letzten Werts des stabilen Zustands zu erreichen" - }, - { - "language": "en", - "text": "time duration from a step change in the input signal to a system for the change in output of the system to reach for the first time 90% of its final steady state value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM701#004" - } - ] - }, - "value": "250", - "valueType": "xs:string" - }, - { - "idShort": "Damping", - "description": [ - { - "language": "de", - "text": "D\u00e4mpfung liegt dann vor, wenn das Ausgangssignal kleiner als das Eingangssignal ist" - }, - { - "language": "en", - "text": "Damping is present when an output signal is lower than the corresponding input signal" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE235#003" - } - ] - }, - "value": "0...999s, einstellbar", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json b/server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json deleted file mode 100644 index d846f966e..000000000 --- a/server/storage/c4cbbca241820e01bcfd4d0a4cba3f0f1e76ef2ce78787446797edd65c994b56.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "KSB AG" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Blockpumpe mit Wellendichtung" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Johann-Klein-Str. 9" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "67227" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Frankenthal" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Etachrom BC-025-125.1/054" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json b/server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json deleted file mode 100644 index 1cf9b37e7..000000000 --- a/server/storage/c507a15aae194933e1ab332388fb1e644368914347b1389145255fa279b2b749.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y21_Stellventil_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21_Stellventil/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json b/server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json deleted file mode 100644 index 6a8fec73e..000000000 --- a/server/storage/c536816d3ffdbbaee002f5668f4d17ec24da30562e0752f6e05ac4e9df000cac.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y25_Magnetic_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json b/server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json deleted file mode 100644 index 5f726791c..000000000 --- a/server/storage/c543fac5f96d7f3260334ff42953e75aedffadadff270d266aca3bbc1d8c27ec.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "data": { - "idShort": "aas_registry", - "modelType": "AssetAdministrationShell", - "id": "https://mnestix.com/aas/registry", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://mnestix.com/registry", - "specificAssetIds": [ - { - "name": "assetIdShort", - "value": "registry" - } - ] - } - } -} \ No newline at end of file diff --git a/server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json b/server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json deleted file mode 100644 index 85655c8a5..000000000 --- a/server/storage/c5bff34ced22905341f7e4fe2276e9d06ad9e418129897b1b03de845a405e16b.json +++ /dev/null @@ -1,496 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "TU10", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "B1", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1" - }, - { - "idShort": "HasEquipmentModule_B1", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - }, - { - "type": "Entity", - "value": "B1" - } - ] - } - }, - { - "idShort": "Pipe11", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11" - }, - { - "idShort": "HasEquipmentModule_Pipe11", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - }, - { - "type": "Entity", - "value": "Pipe11" - } - ] - } - }, - { - "idShort": "Pipe12", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe12" - }, - { - "idShort": "HasEquipmentModule_Pipe12", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - }, - { - "type": "Entity", - "value": "Pipe12" - } - ] - } - }, - { - "idShort": "T23", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23" - }, - { - "idShort": "HasControlModule_T23", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - }, - { - "type": "Entity", - "value": "T23" - } - ] - } - }, - { - "idShort": "Y24", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24" - }, - { - "idShort": "HasControlModule_Y24", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - }, - { - "type": "Entity", - "value": "Y24" - } - ] - } - }, - { - "idShort": "Y25", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25" - }, - { - "idShort": "HasControlModule_Y25", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU10" - }, - { - "type": "Entity", - "value": "Y25" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json b/server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json deleted file mode 100644 index dd5bab01b..000000000 --- a/server/storage/c657bc979d6447b4d465d4f7e72d8a8986d385d7a3fc20499572d965f6702f11.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L11_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/L11/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json b/server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json deleted file mode 100644 index 986194367..000000000 --- a/server/storage/c6e38ce8c6dd3f1e8b2fa3ee297ea2d9329a85dc7318d70cf6f5e975ffb8972e.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "idShort": "Dynamic_Data", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/DynamicData", - "submodelElements": [ - { - "idShort": "Drive_Power", - "description": [ - { - "language": "de", - "text": "gemessene auf das Fluid beim Durchgang durch die Pumpe \u00fcbertragene mechanische Leistung" - }, - { - "language": "en", - "text": "measured useful mechanical power transferred to the fluid during its passage through the pump" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC172#001" - } - ] - }, - "value": "0", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json b/server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json deleted file mode 100644 index 95de4ecaa..000000000 --- a/server/storage/c84f69649a73a0315540308a0abfd68f2c25bbe8235df30fbcedd2b277054cdc.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/L26/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "VEGA" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "VEGASON 61" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Am Hohenstein 113" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "77761" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Schiltach" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "VEGASON" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json b/server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json deleted file mode 100644 index 381637664..000000000 --- a/server/storage/ca071f7d5a974dacb91766986b2ae1281b21b44c78359629d9b068b290cd0309.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y39_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Valve/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json b/server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json deleted file mode 100644 index 2bc2081cc..000000000 --- a/server/storage/cc72bc76c11f0b7625eb454b193218d98ca6b10fbd18327dde27c7fa0770434d.json +++ /dev/null @@ -1,280 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "B1", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "L10", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10" - }, - { - "idShort": "HasControlModule_L10", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B1" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B1" - }, - { - "type": "Entity", - "value": "L10" - } - ] - } - }, - { - "idShort": "Q11", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Q11" - }, - { - "idShort": "HasControlModule_Q11", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B1" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B1" - }, - { - "type": "Entity", - "value": "Q11" - } - ] - } - }, - { - "idShort": "T12", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12" - }, - { - "idShort": "HasControlModule_T12", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B1" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "B1" - }, - { - "type": "Entity", - "value": "T12" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json b/server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json deleted file mode 100644 index 9ba256271..000000000 --- a/server/storage/ceee7f1db4fecfa73d80c86e72dcb479fdc289ba68243dcfe2dda846416c4a07.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "SOMAS" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "A11-DA-015-F07" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Box 107" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "66123" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "SAEFFLE" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "SE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Si-503 DE" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json b/server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json deleted file mode 100644 index fdb5e989a..000000000 --- a/server/storage/d0086d4055a25614fbf7425b02c320d3eca5988b8ac476758828d9df18c428ed.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L10_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/L10/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json b/server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json deleted file mode 100644 index 9a9e4d964..000000000 --- a/server/storage/d0dec7cf1e450fbfa14e8644d80ae9b5d2dae47e39cf2d868ffb83d7a3e40985.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12_Temperature_Sensor/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "PT100" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Dieselstra\u00dfe 24" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "70839" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Gerlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "CLS21 Condumax" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json b/server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json deleted file mode 100644 index 5e35acb0b..000000000 --- a/server/storage/d0ebf77e392011ba3b93fd644141c71cc9ca27ee4cd4bff1b9a394a9a159f0fb.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F40_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json b/server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json deleted file mode 100644 index 76f3930ae..000000000 --- a/server/storage/d2304403647ea33a6150a92c7c32a933377f264a258747e18e21503d1b014ce8.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y24_Pneumatischer_Antrieb_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Pneumatischer_Antrieb/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json b/server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json deleted file mode 100644 index 3e030fb22..000000000 --- a/server/storage/d2754faaae96fb1637d46bfd0f20bceda9260f61d56cd44bf1352ac0ebb1e353.json +++ /dev/null @@ -1,409 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/TechnicalData", - "submodelElements": [ - { - "idShort": "Messumformer", - "description": [ - { - "language": "de", - "text": "bestimmte Ausf\u00fchrung im Rahmen eines Typs, die im Allgemeinen durch die Konstruktion oder die Ma\u00dfe gekennzeichnet ist" - }, - { - "language": "en", - "text": "sub level of type which is generally distinguished by the construction or the dimensions" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAP886#004" - } - ] - }, - "value": "IFC 300", - "valueType": "xs:string" - }, - { - "idShort": "Nennweite", - "description": [ - { - "language": "de", - "text": "Durchmesser eines Rohres/Schlauchleitung oder die Gr\u00f6\u00dfe/Anschlussma\u00df einer Armatur (Ventil, Schieber)" - }, - { - "language": "en", - "text": "diameter of a pipe/hose or the size/mounting dimension of a valve" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH222#001" - } - ] - }, - "value": "DN25", - "valueType": "xs:string" - }, - { - "idShort": "Messwertabweichung", - "description": [ - { - "language": "de", - "text": "Abweichung eines aus Messungen gewonnenen vom wahren Wert" - }, - { - "language": "en", - "text": "deviation of measured value from the true value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ356#003" - } - ] - }, - "value": " \u00b1 0,5", - "valueType": "xs:string" - }, - { - "idShort": "min_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "140", - "valueType": "xs:string" - }, - { - "idShort": "min_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "65", - "valueType": "xs:string" - }, - { - "idShort": "min_zulaessige_Lagertemperatur", - "description": [ - { - "language": "de", - "text": "minimal zul\u00e4ssige Lagertemperatur des Betriebsmittels" - }, - { - "language": "en", - "text": "minimum permissible temperature of the operating resource during storage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABA653#001" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_zulaessige_Lagertemperatur", - "description": [ - { - "language": "de", - "text": "maximal zul\u00e4ssige Lagertemperatur des Betriebsmittels" - }, - { - "language": "en", - "text": "maximum permissible temperature of the operating resource during storage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABA654#001" - } - ] - }, - "value": "70", - "valueType": "xs:string" - }, - { - "idShort": "Betriebsmedium", - "description": [ - { - "language": "de", - "text": "Medium, mit welchem das Ger\u00e4t betrieben werden darf (Medium am Eingang)" - }, - { - "language": "en", - "text": "temperature at which the specified accuracy data are valid. For deviations from the nominal temperature, the specified temperature coefficients must be must be added to the specified accuracies" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABD905#001" - } - ] - }, - "value": "Wasser", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP67", - "valueType": "xs:string" - }, - { - "idShort": "Dichtwerkstoff", - "description": [ - { - "language": "de", - "text": "Substanz, aus welcher die Dichtung hergestellt ist" - }, - { - "language": "en", - "text": "substance from which a leave is manufactured" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK468#006" - } - ] - }, - "value": "PFA", - "valueType": "xs:string" - }, - { - "idShort": "Gehaeusewerkstoff", - "description": [ - { - "language": "de", - "text": "Bezeichnung des Werkstoffes f\u00fcr die Herstellung des Geh\u00e4uses bzw. des Griffes" - }, - { - "language": "en", - "text": "designation of the material for the production of the housing or handle" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABF427#001" - } - ] - }, - "value": "Stahlblech", - "valueType": "xs:string" - }, - { - "idShort": "Material_der_Elektrode", - "description": [ - { - "language": "de", - "text": "Material der Elektroden, die auf einem zur elektrophysiologischen Untersuchung genutzten Katheters aufgebracht sind" - }, - { - "language": "en", - "text": "Material of the electrodes, which are deposited on a used for the electrophysiological study catheter" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAS788#001" - } - ] - }, - "value": "Hastelloy C", - "valueType": "xs:string" - }, - { - "idShort": "Spannungsversorgung", - "description": [ - { - "language": "de", - "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" - }, - { - "language": "en", - "text": "describes the source of electrical energy that supplies the object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK788#003" - } - ] - }, - "value": "12 - 24 V", - "valueType": "xs:string" - }, - { - "idShort": "Ausgaenge", - "description": [ - { - "language": "de", - "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" - }, - { - "language": "en", - "text": "rules and agreements by that communication partner can interact with each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW333#001" - } - ] - }, - "value": "HART", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json b/server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json deleted file mode 100644 index 5f9b37625..000000000 --- a/server/storage/d3e22eac02c298288d6a81e5d87342a566820c435e8b618ac11f838eaa40bf69.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N13/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GRUNDFOS" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "CRNE 3-5 A-FGJ-G-V-HQQV" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Martin Bachs Vej 3" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8850" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Bjerringbro" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DK" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Grundfos Pumpe 96499985" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json b/server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json deleted file mode 100644 index a65cbb03e..000000000 --- a/server/storage/d59d6553cb7db39fd21447fe4c71cc41ceffceb3ca8f04565b1a9b9d7c42e01d.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Pipe11_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Pipe11/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json b/server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json deleted file mode 100644 index f31eda8bf..000000000 --- a/server/storage/d702cd105c007ef7f74a861503225c0d9b94e5eea352a0869bfff8ce84e57894.json +++ /dev/null @@ -1,280 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "Y25", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "Y25_Ball_Vave", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve" - }, - { - "idShort": "HasComponent_Y25_Ball_Vave", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y25" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y25" - }, - { - "type": "Entity", - "value": "Y25_Ball_Vave" - } - ] - } - }, - { - "idShort": "Y25_Magnetic_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve" - }, - { - "idShort": "HasComponent_Y25_Magnetic_Valve", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y25" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y25" - }, - { - "type": "Entity", - "value": "Y25_Magnetic_Valve" - } - ] - } - }, - { - "idShort": "Y25_Pneumatischer_Antrieb", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Pneumatischer_Antrieb" - }, - { - "idShort": "HasComponent_Y25_Pneumatischer_Antrieb", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y25" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "Y25" - }, - { - "type": "Entity", - "value": "Y25_Pneumatischer_Antrieb" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json b/server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json deleted file mode 100644 index 7b140994d..000000000 --- a/server/storage/d73a848818e7dba52bef9fc83536e3fc262c970765b40c65c6927b1513c200a9.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "data": { - "idShort": "N18_Motor_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/DynamicData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json b/server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json deleted file mode 100644 index 7b6f6582f..000000000 --- a/server/storage/d7cf23fde2ce6969fc960d4b11178ceaf1d34ee6dfbf90ec8c20c50c95459518.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L34/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Krohne Messtechnik GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Radar Level Sensor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Kludwig-Krohne-Stra\u00dfe 5" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "47058" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Duisburg" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Optiwave 7300C" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json b/server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json deleted file mode 100644 index 0472ac183..000000000 --- a/server/storage/d7f65b7bd8cdb625abc4339d8bd6daa3e35fde344aa4b9dc0f76e3aabe8b4903.json +++ /dev/null @@ -1,434 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/P14/TechnicalData", - "submodelElements": [ - { - "idShort": "Accuracy_of_the_measuring_instrument", - "description": [ - { - "language": "de", - "text": "Ausma\u00df der Ann\u00e4herung zwischen einem Ermittlungsergebnis und dem anerkannten Bezugswert" - }, - { - "language": "en", - "text": "degree of approximation between a result of determination and the approved reference value" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH809#004" - } - ] - }, - "value": "\u00b10.04% of span", - "valueType": "xs:string" - }, - { - "idShort": "Stability", - "description": [ - { - "language": "de", - "text": "beschreibt die Art der Festigkeit des Objekts" - }, - { - "language": "en", - "text": "describes the strength of the object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK641#002" - } - ] - }, - "value": "\u00b10.2% of URL per 15 years", - "valueType": "xs:string" - }, - { - "idShort": "Response_time", - "description": [ - { - "language": "de", - "text": "Zeitraum zwischen Meldung des Auftraggebers und R\u00fcckmeldung des Auftragnehmers (Vertragsbestandteil)" - }, - { - "language": "en", - "text": "Period between notification by the customer and response by the contractor (part of the contract)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAR717#003" - } - ] - }, - "value": "90", - "valueType": "xs:string" - }, - { - "idShort": "Burst_pressure", - "description": [ - { - "language": "de", - "text": "Druck, bei dem ein Bauteil oder Leitungssystem birst und Druckmedium austritt" - }, - { - "language": "en", - "text": "pressure at which a component or piping fails and fluid begins to escape" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ810#001" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "Max_measurement_span", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dftm\u00f6gliche algebraische Differenz zwischen dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsendwert und dem kleinstm\u00f6glichen einstellbaren Messbereichsanfangswert" - }, - { - "language": "en", - "text": "greatest possible algebraic difference between the greatest measurement range boundary value which can be set and the least possible value which can be set" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA033#008" - } - ] - }, - "value": "0.04", - "valueType": "xs:string" - }, - { - "idShort": "Min_measurement_span", - "description": [ - { - "language": "de", - "text": "kleinstm\u00f6gliche algebraische Differenz zwischen dem kleinstm\u00f6glichen einstellbaren Messbereichsendwert und dem gr\u00f6\u00dftm\u00f6glichen einstellbaren Messbereichsanfangswert" - }, - { - "language": "en", - "text": "lowest possible algebraic difference between the least measurement range boundary value which can be set and the greatest possible value which can be set" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA034#008" - } - ] - }, - "value": "2", - "valueType": "xs:string" - }, - { - "idShort": "Measuring_range", - "description": [ - { - "language": "de", - "text": "Bereich derjenigen Werte der Messgr\u00f6\u00dfe, f\u00fcr den gefordert ist, dass die Messabweichungen eines Messger\u00e4tes innerhalb festgelegter Grenzen bleiben" - }, - { - "language": "en", - "text": "range of the values of the measuring size for which it is required that the errors of measurement of a measuring device keep within defined boundaries" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAH095#003" - } - ] - }, - "value": "from -0.1 to 2", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "highest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN313#004" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "Lower_limiting_value_of_ambient_temperature", - "description": [ - { - "language": "de", - "text": "niedrigste Umgebungstemperatur, der ein Ger\u00e4t ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens standhalten kann oder muss" - }, - { - "language": "en", - "text": "lowest ambient temperature a device can or must withstand without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN314#004" - } - ] - }, - "value": "85", - "valueType": "xs:string" - }, - { - "idShort": "Upper_limiting_value_of_process_temperature", - "description": [ - { - "language": "de", - "text": "h\u00f6chste Temperatur, der die medienber\u00fchrten Teile des Ger\u00e4ts ohne dauerhafte Einschr\u00e4nkung des Betriebsverhaltens ausgesetzt werden d\u00fcrfen" - }, - { - "language": "en", - "text": "highest temperature to which the wetted parts of the device may be subjected without permanent impairment of operating characteristics" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN307#004" - } - ] - }, - "value": "120", - "valueType": "xs:string" - }, - { - "idShort": "Ambient_humidity", - "description": [ - { - "language": "de", - "text": "gemessene Umgebungsfeuchte" - }, - { - "language": "en", - "text": "measured ambient humidity" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC147#001" - } - ] - }, - "value": "0 to 100% RH", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_output_signal", - "description": [ - { - "language": "de", - "text": "Signal am Ausgang des jeweils betrachteten Teiles des Informationsverarbeitungssystems oder des Informations\u00fcbertragungssystems" - }, - { - "language": "en", - "text": "Signal at output of the information processing or transmission system part under consideration" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA006#006" - } - ] - }, - "value": "4 to 20 mA DC Output with digital communication (HART 5 protocol)", - "valueType": "xs:string" - }, - { - "idShort": "Type_of_process_connection", - "description": [ - { - "language": "de", - "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" - }, - { - "language": "en", - "text": "classification of a process connection according to its fabricated form" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA021#007" - } - ] - }, - "value": "G1/2 DIN 16 288 male", - "valueType": "xs:string" - }, - { - "idShort": "Design_of_electrical_connection", - "description": [ - { - "language": "de", - "text": "mechanische Konstruktion der elektrischen Verbindung zum Sicherheitsschalter" - }, - { - "language": "en", - "text": "mechanical design of the electrical connection to the safety switch" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF334#001" - } - ] - }, - "value": "M20 female, two electrical connections with a blind plug", - "valueType": "xs:string" - }, - { - "idShort": "Degree_of_Protection", - "description": [ - { - "language": "de", - "text": "Umfang des Schutzes durch ein Geh\u00e4use gegen den Zugang zu gef\u00e4hrlichen Teilen, gegen das Eindringen von festen Fremdk\u00f6rpern und gegen das Eindringen von Wasser" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and against ingress of water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAV695#001" - } - ] - }, - "value": "IP66/IP67, Type 4X", - "valueType": "xs:string" - }, - { - "idShort": "supply_voltage_at_DC", - "description": [ - { - "language": "de", - "text": "erforderliche Spannung als elektromotorische Kraft, die am Versorgungseingang eines elektrischen Betriebsmittel zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten / unter der Bedingung: Art des Stromes = direct current (Gleichstrom)" - }, - { - "language": "en", - "text": "required voltage as electromotive force that must temporally or permanently apply at the power supply input of an electric device to maintain the function of the operating resource / on condition: type of current = direct current (d.c.)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF535#004" - } - ] - }, - "value": "10.5 to 42 V DC", - "valueType": "xs:string" - }, - { - "idShort": "Max_operation_overpressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter noch zul\u00e4ssiger \u00dcberdruck bei ordnungsgem\u00e4\u00dfem Betrieb des Bauteils bzw. des Ger\u00e4tes" - }, - { - "language": "en", - "text": "largest permissible pressure at proper operation of the device or component" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI725#005" - } - ] - }, - "value": "4", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json b/server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json deleted file mode 100644 index e9f658448..000000000 --- a/server/storage/da053897ec85e2100215618be0d317e2714e01b072a8fff6637b20a39e42440c.json +++ /dev/null @@ -1,352 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "TU30", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "B3", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/B3" - }, - { - "idShort": "HasEquipmentModule_B3", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - }, - { - "type": "Entity", - "value": "B3" - } - ] - } - }, - { - "idShort": "Pipe31", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe31" - }, - { - "idShort": "HasEquipmentModule_Pipe31", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - }, - { - "type": "Entity", - "value": "Pipe31" - } - ] - } - }, - { - "idShort": "Pipe32", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe32" - }, - { - "idShort": "HasEquipmentModule_Pipe32", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - }, - { - "type": "Entity", - "value": "Pipe32" - } - ] - } - }, - { - "idShort": "Pipe33", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Pipe33" - }, - { - "idShort": "HasEquipmentModule_Pipe33", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU30" - }, - { - "type": "Entity", - "value": "Pipe33" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json b/server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json deleted file mode 100644 index d2915e73b..000000000 --- a/server/storage/da36645ac1c65c349269556ab3562fb1af6c8494b41bff45b4ad69b6a1471845.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T12/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "PT100" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Dieselstra\u00dfe 24" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "70839" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Gerlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "CLS21 Condumax" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json b/server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json deleted file mode 100644 index e99d579fd..000000000 --- a/server/storage/daa7ac6d4c40fab468fdc118940fb806ba237b4ae9851292a1e529a29a6c3459.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/F40/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Endress+Hauser" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "\"Proline Promass 83F25, DN25 1\"\"\"" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Colmarer Str. 6" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "79576" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Weil am Rhein" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "PROMASS F" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json b/server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json deleted file mode 100644 index 94c5c4456..000000000 --- a/server/storage/dad540a7a93769cda10d5a3c5fa4b7f766bc75be0aaba7ba96dafefcf0308cfa.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y24_Magnetic_Valve/TechnicalData", - "submodelElements": [ - { - "idShort": "Function", - "description": [ - { - "language": "de", - "text": "Funktionsweise des Ger\u00e4ts." - }, - { - "language": "en", - "text": "Functioning of the device." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Function" - } - ] - }, - "value": "5/2 way, spring return", - "valueType": "xs:string" - }, - { - "idShort": "Ports_size", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "First", - "description": [ - { - "language": "de", - "text": "Angabe, ob am Produkt ein Flansch vorhanden ist oder nicht" - }, - { - "language": "en", - "text": "specification whether or whether not the product is equipped with a flange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAL874#004" - } - ] - }, - "value": "Flange", - "valueType": "xs:string" - }, - { - "idShort": "Third_and_Fifth", - "description": [ - { - "language": "de", - "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" - }, - { - "language": "en", - "text": "identifier for the cross section shape of a thread profile" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAA052#008" - } - ] - }, - "value": "G1/8", - "valueType": "xs:string" - }, - { - "idShort": "Secon_and_Forth", - "description": [ - { - "language": "de", - "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" - }, - { - "language": "en", - "text": "identifier for the cross section shape of a thread profile" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAA052#008" - } - ] - }, - "value": "G1/4", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Actuation_Return", - "description": [ - { - "language": "de", - "text": "Federweg der Feder." - }, - { - "language": "en", - "text": "Springstroke." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Springstroke" - } - ] - }, - "value": "Solenoid_Spring", - "valueType": "xs:string" - }, - { - "idShort": "Flow", - "description": [ - { - "language": "de", - "text": "Angabe \u00fcber den Nennvolumenstrom des Objekts" - }, - { - "language": "en", - "text": "describes the nominal volume flow rate" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI855#002" - } - ] - }, - "value": "750", - "valueType": "xs:string" - }, - { - "idShort": "Weight", - "description": [ - { - "language": "de", - "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t" - }, - { - "language": "en", - "text": "Mass of weight without packaging and transport unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB713#006" - } - ] - }, - "value": "0.26", - "valueType": "xs:string" - }, - { - "idShort": "Rated_current", - "description": [ - { - "language": "de", - "text": "vom Hersteller angegebener Wert des Stromes, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" - }, - { - "language": "en", - "text": "value of the current, resulting from measurements which were determined under specified conditions and rules as defined by the manufacturer" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF726#003" - } - ] - }, - "value": "70", - "valueType": "xs:string" - }, - { - "idShort": "Protection_Class", - "description": [ - { - "language": "de", - "text": "Ausma\u00df des durch ein Geh\u00e4use gebotenen Schutzes vor Zugang zu gef\u00e4hrlichen Teilen und Eindringen von festen Fremdk\u00f6rpern und/oder Wasser, der durch normierte Pr\u00fcfverfahren best\u00e4tigt wurde, angegeben als IP-Einstufung" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and/or ingress of water and verified by standardized test methods, expressed as a IP rating" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAG975#013" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - }, - { - "idShort": "temp_Ambient", - "description": [ - { - "language": "de", - "text": "Zul\u00e4ssige Umgebungstemperatur." - }, - { - "language": "en", - "text": "Permissible ambient temperature." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/AmbientTemperature" - } - ] - }, - "value": "-15...+50", - "valueType": "xs:string" - }, - { - "idShort": "el_connection", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" - }, - { - "language": "en", - "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB414#007" - } - ] - }, - "value": "Connector DIN EN 175301-803", - "valueType": "xs:string" - }, - { - "idShort": "Interface", - "description": [ - { - "language": "de", - "text": "formelle Festlegung aller Eigenschaften einer Schnittstelle, die erforderlich sind, um die vollst\u00e4ndige (physikalische und funktionelle) Kompatibilit\u00e4t zweier zu verbindender Systeme f\u00fcr den Datenaustausch sicherzustellen" - }, - { - "language": "en", - "text": "formal specification of all characteristics of an interface that are required for guaranteeing the complete (physical and functional) compatibility of two systems to be connected for the data exchange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF528#001" - } - ] - }, - "value": "NAMUR", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json b/server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json deleted file mode 100644 index 75ee1bb98..000000000 --- a/server/storage/db386b3487d7173fa755b3e9438e1464d50506f9d959205b8ff0ea11e725f608.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y39_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json b/server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json deleted file mode 100644 index 1e0501609..000000000 --- a/server/storage/db3e118a42bb4e44dcbe4193c51e8d106f541561dc5b5c9da41a7b27feb558b4.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L32_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json b/server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json deleted file mode 100644 index 12cd03790..000000000 --- a/server/storage/db91b2966b5d250da9687c42b20b63c8fd9f675db5b9eceba930f3d6b348db46.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T20/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Siemens AG " - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Temperatursensor" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Werner-von-Siemens-Stra\u00dfe 1" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "80333" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "M\u00fcnchen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Einschaub-Widerstandsthermometer" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json b/server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json deleted file mode 100644 index 127d65e47..000000000 --- a/server/storage/dd41ec74439c842e37353d1460be88335a8ff43a3a73bbe0e0f8ee64245064a1.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "HC10_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json b/server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json deleted file mode 100644 index a8cfbe808..000000000 --- a/server/storage/de4f0d1730bf66dd3a0db9fa70a84bda5f67789a3138517df25af645738ae66c.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N14_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/N14/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json b/server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json deleted file mode 100644 index cda11c31b..000000000 --- a/server/storage/df17f87ad6b03d24d2b7aac12587df8f980f5293a29b60c8f3e33e1828b86e61.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/T23/TechnicalData", - "submodelElements": [ - { - "idShort": "Kommunikationsprotokoll", - "description": [ - { - "language": "de", - "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" - }, - { - "language": "en", - "text": "rules and agreements by that communication partner can interact with each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW333#001" - } - ] - }, - "value": "4 - 20 mA DC/ HART", - "valueType": "xs:string" - }, - { - "idShort": "min_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Minimum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC020#007" - } - ] - }, - "value": "-55\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Mediumstemperatur", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der Temperatur des Messmediums, von dem innere Parameter (z.B. Leitf\u00e4higkeit, pH-Wert, Redox-Wert, Sauerstoff-Konzentration) oder \u00e4u\u00dfere Parameter (z.B. F\u00fcllstand, Dichte) erfasst werden" - }, - { - "language": "en", - "text": "Maximum limit value of temperature medium from which internal parameters (i.e. conductivity, pH value, redox value, oxygen concentration) or external parameters (i.e. filling level, density) are detected" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB904#006" - } - ] - }, - "value": "600\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "min_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-40\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "max_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "85\u00b0C", - "valueType": "xs:string" - }, - { - "idShort": "Spannungsversorgung", - "description": [ - { - "language": "de", - "text": "beschreibt die Quelle der elektrischen Energie, die das Objekt versorgt" - }, - { - "language": "en", - "text": "describes the source of electrical energy that supplies the object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAK788#003" - } - ] - }, - "value": "11...42", - "valueType": "xs:string" - }, - { - "idShort": "Werkstoff", - "description": [ - { - "language": "de", - "text": "Kurzname oder Werkstoffnummer des verwendeten Werkstoffs" - }, - { - "language": "en", - "text": "Short name or material number of the applied material" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAM562#001" - } - ] - }, - "value": "14571", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP66", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json b/server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json deleted file mode 100644 index e018571d6..000000000 --- a/server/storage/df429b209aef0f853e51307e2d22c59a776fc6f8cfc7726d205600616fd78882.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "data": { - "idShort": "ThemeSettings", - "modelType": "Submodel", - "id": "https://repodomainurl.com/sm/VGhlbWVTZXR0aW5ncw/1/0", - "administration": { - "version": "1", - "revision": "0" - }, - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/ThemeSettings/1/0" - } - ] - }, - "submodelElements": [ - { - "idShort": "Base64Logo", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/ThemeSettings/Base64Logo/1/0" - } - ] - }, - "value": "data:image/svg+xml;base64,PHN2ZyBpZD0iRWJlbmVfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCA0MTkuMTEgMTA1LjIxIiB4bWw6c3BhY2U9InByZXNlcnZlIiBjb2xvcj0iI2ZmZiIgY2xhc3M9InNjLWZVbk1DaCBpS2tGWk0iPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiNGRkZGRkY7fQ0KPC9zdHlsZT48Zz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjMuMzYsNTkuMzFMMTEuODQsNzYuNzhIMGwxNy44LTI1LjQ1TDEuODMsMjguMjloMTIuMDRsMTAuNCwxNC45Mmw5LjgxLTE0LjkyaDExLjg0TDI5Ljc3LDUxLjEzTDQ3LjcsNzYuNzggSDM1LjUzTDIzLjM2LDU5LjMxeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik01Ny42OCwyOC4yOWgxMC42N3Y0OC40OEg1Ny42OFYyOC4yOXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNOTQuNjMsMzcuOThINzcuODF2LTkuNjhoNDQuMzZ2OS42OGgtMTYuNzV2MzguOGgtMTAuOFYzNy45OHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTc3LjEsNzEuMTVsNS4zNi03LjcyYzUuMTcsMy40NywxMS4xOSw1LjE3LDE3LjQsNS4xN2M5LjQ5LDAsMTEuMjYtMS44MywxMS4yNi01Ljg5IGMwLTMuOTktNC4wNi00Ljc4LTExLjUyLTUuODJjLTEyLjk2LTEuODMtMTkuNy00LjE5LTE5LjctMTQuNzJjMC0xMC44LDYuNTQtMTQuNjUsMjAuMjItMTQuNjVjOS44OCwwLDE1LjksMi4yOSwxOS42Myw0Ljc4IGwtNS43Niw4LjMxYy0zLjA3LTIuMDMtOC43Ny0zLjczLTE0LTMuNzNjLTcuNTksMC05LjQyLDEuNS05LjQyLDUuMDNjMCwzLjkzLDMuOTksNC42NSwxMS43MSw1Ljc2IGMxMS42NSwxLjcsMTkuNDMsMy42LDE5LjQzLDE0LjUyYzAsOS44MS01LjM3LDE1LjMxLTIxLjUzLDE1LjMxQzE5MC41OCw3Ny41LDE4Mi42LDc1LjIxLDE3Ny4xLDcxLjE1eiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yMzAuMTYsNTIuNWMwLTE4LjE5LDEwLjIxLTI0Ljk5LDI1LjY1LTI0Ljk5YzE1LjQ0LDAsMjUuNzEsNi44LDI1LjcxLDI0Ljk5YzAsMTguMjUtMTAuMjcsMjUuMDYtMjUuNzEsMjUuMDYgQzI0MC4zOCw3Ny41NiwyMzAuMTYsNzAuNzYsMjMwLjE2LDUyLjV6IE0yNzAuNjcsNTIuN2MwLTkuNDktMy43My0xNS4zOC0xNC44NS0xNS4zOGMtMTEuMTIsMC0xNC44NSw1Ljg5LTE0Ljg1LDE1LjM4IGMwLDkuNDksMy43MywxNS40NCwxNC44NSwxNS40NEMyNjYuOTQsNjguMTQsMjcwLjY3LDYyLjE4LDI3MC42Nyw1Mi43eiIvPjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMTUxLjg0LDI3Ljk3IDE0MC45NywyNy45NyAxMjEuNTQsNzYuNzggMTMyLjAxLDc2Ljc4IDE0Ni4xNCw0MC42NiAxNTMuNzMsNTkuOTYgMTQ0LjgzLDU5Ljk2ICAxNDEuMzcsNjguNzkgMTU3LjEzLDY4Ljc5IDE2MC4yOCw3Ni43OCAxNzEuNCw3Ni43OCAgIi8+PC9nPjxyZWN0IHg9IjM5MS45NiIgeT0iNTIuODEiIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA2OCAtMC43MDc0IDAuNzA3NCAwLjcwNjggNjQuMjIzMiAzMDAuNjM5NSkiIGNsYXNzPSJzdDAiIHdpZHRoPSI1LjcyIiBoZWlnaHQ9IjQwLjA0Ii8+PHJlY3QgeD0iMzgzLjg3IiB5PSI2MC45MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC43MDcyIC0wLjcwNyAwLjcwNyAwLjcwNzIgNTYuMDEyNiAyOTcuMTE4NSkiIGNsYXNzPSJzdDAiIHdpZHRoPSI1LjcyIiBoZWlnaHQ9IjQwLjA0Ii8+PHJlY3QgeD0iMzY2LjcxIiB5PSIyMS40MiIgdHJhbnNmb3JtPSJtYXRyaXgoMC43MDcxIC0wLjcwNzIgMC43MDcyIDAuNzA3MSA5Ni4xMTgzIDI4MC41ODc4KSIgY2xhc3M9InN0MCIgd2lkdGg9IjQwLjA0IiBoZWlnaHQ9IjUuNzMiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjM5MC43NiwwIDM2Ni41LDI0LjI3IDM0Mi4yMywwIDMzOC4xOCw0LjA1IDM2Ni41LDMyLjM2IDM5NC44MSw0LjA1ICIvPjxyZWN0IHg9IjM3NC44MSIgeT0iMjkuNTEiIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3NCAtMC43MDY4IDAuNzA2OCAwLjcwNzQgOTIuNjM3OCAyODguNTM3NCkiIGNsYXNzPSJzdDAiIHdpZHRoPSI0MC4wNCIgaGVpZ2h0PSI1LjcyIi8+PHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIzOTQuODQsNTIuNjEgNDE5LjExLDI4LjM0IDQxNS4wNiwyNC4yOSAzODYuNzQsNTIuNjEgNDE1LjA2LDgwLjkyIDQxOS4xMSw3Ni44NyAiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjMxNy45NCwyNC4yOSAzMTMuODksMjguMzQgMzM4LjE2LDUyLjYxIDMxMy44OSw3Ni44NyAzMTcuOTQsODAuOTIgMzQ2LjI1LDUyLjYxICIvPjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMzMwLjA5LDEyLjE1IDMyNi4wNCwxNi4xOSAzNjIuNDUsNTIuNjEgMzI2LjA0LDg5LjAyIDMzMC4wOSw5My4wNyAzNzAuNTUsNTIuNjEgIi8+PHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIzOTQuODEsMTAxLjE3IDM2Ni41LDcyLjg1IDMzOC4xOCwxMDEuMTcgMzQyLjIzLDEwNS4yMSAzNjYuNSw4MC45NSAzOTAuNzYsMTA1LjIxICIvPjwvc3ZnPg==", - "valueType": "xs:string" - }, - { - "idShort": "PrimaryColor", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/ThemeSettings/PrimaryColor/1/0" - } - ] - }, - "value": "#0d4453", - "valueType": "xs:string" - }, - { - "idShort": "SecondaryColor", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://mnestix.com/sm/ThemeSettings/SecondaryColor/1/0" - } - ] - }, - "value": "#147f8a", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json b/server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json deleted file mode 100644 index cd0079ee2..000000000 --- a/server/storage/e00cee57ea21d4356f45d7349404e0f9e0528f7e5adafabde9219e281e34fe1a.json +++ /dev/null @@ -1,390 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Magnetic_Valve/TechnicalData", - "submodelElements": [ - { - "idShort": "Function", - "description": [ - { - "language": "de", - "text": "Benennung der technischen Aufgabe eines Ger\u00e4tes" - }, - { - "language": "en", - "text": "description of the technical task of a device" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW605#001" - } - ] - }, - "value": "5/2 way, spring return", - "valueType": "xs:string" - }, - { - "idShort": "Ports_size", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "First", - "description": [ - { - "language": "de", - "text": "Angabe, ob am Produkt ein Flansch vorhanden ist oder nicht" - }, - { - "language": "en", - "text": "specification whether or whether not the product is equipped with a flange" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAL874#004" - } - ] - }, - "value": "Flange", - "valueType": "xs:string" - }, - { - "idShort": "Third_and_Fifth", - "description": [ - { - "language": "de", - "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" - }, - { - "language": "en", - "text": "identifier for the cross section shape of a thread profile" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAA052#008" - } - ] - }, - "value": "G1/8", - "valueType": "xs:string" - }, - { - "idShort": "Secon_and_Forth", - "description": [ - { - "language": "de", - "text": "Identifikator f\u00fcr die Form des erzeugten Gewindes" - }, - { - "language": "en", - "text": "identifier for the cross section shape of a thread profile" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAA052#008" - } - ] - }, - "value": "G1/4", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Actuation_Return", - "description": [ - { - "language": "de", - "text": "Federweg der Feder." - }, - { - "language": "en", - "text": "Springstroke." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "http://acplt.org/vocab/Springstroke" - } - ] - }, - "value": "Solenoid_Spring", - "valueType": "xs:string" - }, - { - "idShort": "Flow", - "description": [ - { - "language": "de", - "text": "Angabe \u00fcber den Nennvolumenstrom des Objekts" - }, - { - "language": "en", - "text": "describes the nominal volume flow rate" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI855#002" - } - ] - }, - "value": "750", - "valueType": "xs:string" - }, - { - "idShort": "Weight", - "description": [ - { - "language": "de", - "text": "Masse des W\u00e4gegutes ohne Verpackung und ohne Transportger\u00e4t" - }, - { - "language": "en", - "text": "Mass of weight without packaging and transport unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB713#006" - } - ] - }, - "value": "0.26", - "valueType": "xs:string" - }, - { - "idShort": "Rated_current", - "description": [ - { - "language": "de", - "text": "vom Hersteller angegebener Wert des Stromes, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" - }, - { - "language": "en", - "text": "value of the current, resulting from measurements which were determined under specified conditions and rules as defined by the manufacturer" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF726#003" - } - ] - }, - "value": "70", - "valueType": "xs:string" - }, - { - "idShort": "Protection_Class", - "description": [ - { - "language": "de", - "text": "Ausma\u00df des durch ein Geh\u00e4use gebotenen Schutzes vor Zugang zu gef\u00e4hrlichen Teilen und Eindringen von festen Fremdk\u00f6rpern und/oder Wasser, der durch normierte Pr\u00fcfverfahren best\u00e4tigt wurde, angegeben als IP-Einstufung" - }, - { - "language": "en", - "text": "extent of protection provided by an enclosure against access to hazardous parts, against ingress of solid foreign objects and/or ingress of water and verified by standardized test methods, expressed as a IP rating" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAG975#013" - } - ] - }, - "value": "IP65", - "valueType": "xs:string" - }, - { - "idShort": "Ambient_Temperature", - "description": [ - { - "language": "de", - "text": "Temperatur des umgebenden Raumes, in dem das Bauteil das Leitungssystem oder die Anlage arbeitet" - }, - { - "language": "en", - "text": "temperature of the surrounding operating environment of a component or system" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ842#001" - } - ] - }, - "value": "-15...+50", - "valueType": "xs:string" - }, - { - "idShort": "Electrical_connection", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" - }, - { - "language": "en", - "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB414#007" - } - ] - }, - "value": "Connector DIN EN 175301-803", - "valueType": "xs:string" - }, - { - "idShort": "Solenoid", - "description": [ - { - "language": "de", - "text": "eindeutiger Identifikator des Produktes" - }, - { - "language": "en", - "text": "unique identifier of the product" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABA671#001" - } - ] - }, - "value": "3050", - "valueType": "xs:string" - }, - { - "idShort": "Operating_Pressure", - "description": [ - { - "language": "de", - "text": "beschreibt die Gr\u00f6\u00dfe des ger\u00e4tesseitigen Lufteingangs" - }, - { - "language": "en", - "text": "describes the size of the device-sided air inlet" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAG867#002" - } - ] - }, - "value": "2...8", - "valueType": "xs:string" - }, - { - "idShort": "Voltage", - "description": [ - { - "language": "de", - "text": "erforderliche elektrische Hilfsenergie, die am Versorgungseingang eines elektrischen Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" - }, - { - "language": "en", - "text": "Required auxiliary electrical energy which must always or at times be present at the supply input for the function of the operating resource to be maintained" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAD220#007" - } - ] - }, - "value": "24", - "valueType": "xs:string" - }, - { - "idShort": "Power_Consumption", - "description": [ - { - "language": "de", - "text": "aus dem Versorgungsnetz, einschlie\u00dflich der Leistungsaufnahme f\u00fcr Zusatzeinrichtungen aufgenommene gesamte elektrische Eingangs-Wirkleistung bei festgelegten Betriebsbedingungen und beim Nennwert der Ausgangsleistung" - }, - { - "language": "en", - "text": "power requirement of the device or component during defined operating conditions" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC969#007" - } - ] - }, - "value": "1.6", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json b/server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json deleted file mode 100644 index cf0e55ea2..000000000 --- a/server/storage/e086de2d51c9ab211d7b335603c6b789142a5dffe21da1ad7c000802ab6ea731.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "IAT" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Unit" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Turmstra\u00dfe 46" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "52064" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Aachen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "TU30" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "unkown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json b/server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json deleted file mode 100644 index 6e30ebe0a..000000000 --- a/server/storage/e0b5ddd0537ede8a81d837da8bd3c2c70043461183ccddce31a397a7a7e7fd19.json +++ /dev/null @@ -1,309 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/L32/TechnicalData", - "submodelElements": [ - { - "idShort": "Max_operating_pressure", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Druck, der in einem System beim Betrieb (unter normalen Betriebsbedingungen) auftritt bzw. auftreten darf" - }, - { - "language": "en", - "text": "Max. pressure which occurs or may occur in an operating system (under normal operating conditions)" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB836#007" - } - ] - }, - "value": "40", - "valueType": "xs:string" - }, - { - "idShort": "Max_testing_pressure", - "description": [ - { - "language": "de", - "text": "h\u00f6chster Druck, der w\u00e4hrend der erstmaligen oder wiederkehrenden Druckpr\u00fcfung zur Anwendung kommt und zu keiner dauerhaften Form\u00e4nderung, Besch\u00e4digung oder Funktionsst\u00f6rung f\u00fchrt" - }, - { - "language": "en", - "text": "Maximum pressure applied during initial and repeated testing pressure and which does not result in permanent dimensional change, damage or malfunction" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB881#006" - } - ] - }, - "value": "60", - "valueType": "xs:string" - }, - { - "idShort": "Min_operating_temperature", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "minimum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC820#006" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "Max_operating_temperature", - "description": [ - { - "language": "de", - "text": "gr\u00f6\u00dfter Grenzwert der sich durch den Nennbetrieb typischerweise ergebende Temperatur im nahem Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "maximum limit value of the typically arising temperature in the immediate surrounding area of the operating unit which arises as a result of rated operation" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC821#006" - } - ] - }, - "value": "150", - "valueType": "xs:string" - }, - { - "idShort": "Max_ambient_temperature_during_operating_phase", - "description": [ - { - "language": "de", - "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / gr\u00f6\u00dfter Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht \u00fcberschritten werden kann oder darf" - }, - { - "language": "en", - "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / upper limit value of a physical quantity whose value cannot or must not be exceeded" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF525#003" - } - ] - }, - "value": "-20", - "valueType": "xs:string" - }, - { - "idShort": "Min_ambient_temperature_during_operating_phase", - "description": [ - { - "language": "de", - "text": "unter festgelegten Bedingungen bestimmte Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re / Zeitdauer, in deren Verlauf etwas stattfindet: Zeitraum des Aktiv-seins / kleinster Grenzwert einer physikalischen Gr\u00f6\u00dfe, deren Wert nicht mehr unterschritten werden kann oder darf" - }, - { - "language": "en", - "text": "temperature of the atmosphere surrounding the operating resource under specified conditions / period, in whose course something happens: period of time in which something is active / lower limit value of a physical quantity whose value cannot or must not be undershot" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF526#003" - } - ] - }, - "value": "70", - "valueType": "xs:string" - }, - { - "idShort": "Max_dynamic_viscosity", - "description": [ - { - "language": "de", - "text": "h\u00f6chste dynamische Viskosit\u00e4t, f\u00fcr die ein Ger\u00e4t ausgelegt ist oder auszulegen ist, damit es innerhalb seiner Spezifikationen betrieben wird" - }, - { - "language": "en", - "text": "highest dynamic viscosity for which a device is or must be designed to operate within its specified limits" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAQ454#003" - } - ] - }, - "value": "10000", - "valueType": "xs:string" - }, - { - "idShort": "Min_density", - "description": [ - { - "language": "de", - "text": "Kleinste zul\u00e4ssige Dichte des Messstoffes, Betriebsstoffes oder Mediums f\u00fcr einen bestimmungsgem\u00e4\u00dfen Gebrauch des Betriebsmittels" - }, - { - "language": "en", - "text": "Least permissible density of measuring substance, operating substance or medium for use of the operating resource in accordance with its intended purpose" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA044#006" - } - ] - }, - "value": "0.5", - "valueType": "xs:string" - }, - { - "idShort": "Startup_delay", - "description": [ - { - "language": "de", - "text": "Mindestzeit, um vom AUS-Zustand in den EIN-Zustand zu wechseln, wenn die Spannung UON oder gr\u00f6\u00dfer anliegt" - }, - { - "language": "en", - "text": "Least time required to change from the OUT state to the IN state when the voltage is UON or greater" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAB260#005" - } - ] - }, - "value": "0.4", - "valueType": "xs:string" - }, - { - "idShort": "Connection_type_of_process_connection", - "description": [ - { - "language": "de", - "text": "Charakterisierung eines Prozessanschlusses bez\u00fcglich seiner Herstellungsform" - }, - { - "language": "en", - "text": "classification of a process connection according to its fabricated form" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO333#005" - } - ] - }, - "value": "Einschraubst\u00fcck G1A, 1.4571", - "valueType": "xs:string" - }, - { - "idShort": "Style_of_housing", - "description": [ - { - "language": "de", - "text": "Charakterisierung eines Geh\u00e4uses bez\u00fcglich seiner mechanischen Ausf\u00fchrung" - }, - { - "language": "en", - "text": "classification of a housing according to its mechanical design" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO650#004" - } - ] - }, - "value": "Aluminiumgeh\u00e4use F6", - "valueType": "xs:string" - }, - { - "idShort": "IP_protection_class_with_connector", - "description": [ - { - "language": "de", - "text": "erreichbarer Schutzumfang eines fluidtechnischen Ger\u00e4ts in Verbindung mit dem vom Hersteller empfohlenen Konnektor hinsichtlich des Eindringens von Fremdk\u00f6rpern und Wasser" - }, - { - "language": "en", - "text": "scope of protection that can be achieved with a fluidic device in combination with the connector recommended by the manufacturer with respect to the ingress of foreign bodies and water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ971#001" - } - ] - }, - "value": "IP66", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json b/server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json deleted file mode 100644 index b3d8cca5f..000000000 --- a/server/storage/e0bd29014f943387411658261380001ac5cada6e3e55ab66e7c7bbb3c2bf5818.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y14_Actuator_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Actuator/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json b/server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json deleted file mode 100644 index 1849f1aef..000000000 --- a/server/storage/e1bafc336da64f1dbebf6e474cd6eab3fd6cfb5cd03b9db6e738dad2b0278efa.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y21_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21/HierarchicalStructures" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json b/server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json deleted file mode 100644 index e2fc68024..000000000 --- a/server/storage/e300b1fa4b355613c628cbcd9957cc386d5e5fc420a71ebe8c143c156b88964f.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N36_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N36/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json b/server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json deleted file mode 100644 index bfa6e443d..000000000 --- a/server/storage/e3519220ed9defceba08f43da170b1eb451a34b32fccf98c21138a23458cda95.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Emerson Electric Co." - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Digitaler Stellungsregler" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "8000 West Florissant Avenue, P.O. Box 4100" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "63136" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Saint Louis Missouri" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "US" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FISHER FIELDVUE DVC200" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json b/server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json deleted file mode 100644 index ba8283ce8..000000000 --- a/server/storage/e44c508fd2567fecd0d64ef421ac584930331b94ea66a0ac84a9fc108f4b7ae2.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "data": { - "idShort": "N18_Pumpe_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/DynamicData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json b/server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json deleted file mode 100644 index dd5f44215..000000000 --- a/server/storage/e589ea0f257db5b1404b83f27b054fc450894ad7a9ee223730411b6cc6762a3e.json +++ /dev/null @@ -1,280 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "N18", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "N18_Frequenzumrichter", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Frequenzumrichter" - }, - { - "idShort": "HasComponent_N18_Frequenzumrichter", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N18" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N18" - }, - { - "type": "Entity", - "value": "N18_Frequenzumrichter" - } - ] - } - }, - { - "idShort": "N18_Motor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor" - }, - { - "idShort": "HasComponent_N18_Motor", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N18" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N18" - }, - { - "type": "Entity", - "value": "N18_Motor" - } - ] - } - }, - { - "idShort": "N18_Pumpe", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Pumpe" - }, - { - "idShort": "HasComponent_N18_Pumpe", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N18" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "N18" - }, - { - "type": "Entity", - "value": "N18_Pumpe" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json b/server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json deleted file mode 100644 index 3cccc4102..000000000 --- a/server/storage/e5a969839360e41852cd54c4a3fa46cbcd84dedd2d535641e6ed74ef466b4a81.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y17_Actuator_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y17_Actuator/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json b/server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json deleted file mode 100644 index 4585d170e..000000000 --- a/server/storage/e68b1dd54ab08ef86cb2822dc46fb99324b2317539f92ae7f3f56f43a0b5b8d2.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Y30/TechnicalData", - "submodelElements": [ - { - "idShort": "Antriebsflaeche", - "description": [ - { - "language": "de", - "text": "Konstruktive Ausbildung des Antriebes" - }, - { - "language": "en", - "text": "Constructive design of drive" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAJ008#006" - } - ] - }, - "value": "240", - "valueType": "xs:string" - }, - { - "idShort": "Ventiltyp", - "description": [ - { - "language": "de", - "text": "Eine Gruppe von Bauelementen mit gleichen Konstruktionsmerkmalen und gleichem Aufbau, die aufgrund \u00e4hnlicher Herstellungstechniken f\u00fcr die Bauartzulassungspr\u00fcfung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden k\u00f6nnen. Sie werden im allgemeinen von einer Bauartspezifikation erfasst. Anmerkung: In bestimmten F\u00e4llen k\u00f6nnen Bauelemente aus verschiedenen Bauartspezifikationen als zum gleichen Typ geh\u00f6rig betrachtet und daher f\u00fcr die Bauartzulassung und die G\u00fctekonformit\u00e4tskontrollen zusammengefasst werden" - }, - { - "language": "en", - "text": "a group of construction elements with the same construction features and the same construction, which can be collated for the construction type approval and quality conformity controls as a result of similar manufacturing methods. they are generally allocated to a construction type specification. Note: in certain cases, construction element from different construction type specifications can be viewed as belonging to the same type and hence collated for the construction type approval and quality conformity controls" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAD071#006" - } - ] - }, - "value": "Kugelhahn", - "valueType": "xs:string" - }, - { - "idShort": "Hub", - "description": [ - { - "language": "de", - "text": "Kraftbetriebener Weg, den der Lastaufnahmepunkt zur\u00fccklegen kann" - }, - { - "language": "en", - "text": "Power driven path which can be covered by the load reception point" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA361#005" - } - ] - }, - "value": "15", - "valueType": "xs:string" - }, - { - "idShort": "Federbereich", - "description": [ - { - "language": "de", - "text": "Weg der Feder vom unbelasteten Zustand bis zur maximalen Belastung. Bei einer Druckfeder ist es der Weg von der unbelasteten Federl\u00e4nge bis zur Blockl\u00e4nge" - }, - { - "language": "en", - "text": "Path of the spring from unburdened state up to the maximum burden. With a pressure sprint it is the path from unburdened spring length up to the block length" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAB081#004" - } - ] - }, - "value": "0.2\u00851", - "valueType": "xs:string" - }, - { - "idShort": "max_Luftdruck", - "description": [ - { - "language": "de", - "text": "Angabe eines Drucks, der f\u00fcr ein Ventil beschreibt, dass es zu einer bestimmten Einstufung geh\u00f6rt, bei der das Ventil schlie\u00dft" - }, - { - "language": "en", - "text": "specification of a pressure describing, for a valve, that it belongs to a particular classification at which the valve closes" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC533#001" - } - ] - }, - "value": "6", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json b/server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json deleted file mode 100644 index 58cc12b6c..000000000 --- a/server/storage/e6eb40ffb795f417dec9ec168f5ca5402c8de56264d86e753fe6e2e4b703c38e.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y16_Regler/TechnicalData", - "submodelElements": [ - { - "idShort": "Kommunikationsprotokoll", - "description": [ - { - "language": "de", - "text": "Regeln und Vereinbarungen damit Kommunikationspartner miteinander kommunizieren k\u00f6nnen" - }, - { - "language": "en", - "text": "rules and agreements by that communication partner can interact with each other" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAW333#001" - } - ] - }, - "value": "4 - 20 mA DC/ HART", - "valueType": "xs:string" - }, - { - "idShort": "max_Druck", - "description": [ - { - "language": "de", - "text": "Gr\u00f6\u00dftm\u00f6glicher atmosph\u00e4rischer Druck, den ein Betriebsmittel aufbauen bzw. erreichen kann" - }, - { - "language": "en", - "text": "Greatest possible atmospheric pressure which an operating source can build up or reach" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAA447#006" - } - ] - }, - "value": "7", - "valueType": "xs:string" - }, - { - "idShort": "min_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "Die maximal zul\u00e4ssige Temperatur im \u00e4u\u00dferen Umfeld des Betriebsmittels" - }, - { - "language": "en", - "text": "The maximum permissible temperature in the external environment of the operating resource" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAE585#006" - } - ] - }, - "value": "-40", - "valueType": "xs:string" - }, - { - "idShort": "max_Umgebungstemperatur", - "description": [ - { - "language": "de", - "text": "kleinster Grenzwert der w\u00e4hrend des Aktiv-seins bestimmten Temperatur der das Betriebsmittel umgebenden Atmosph\u00e4re" - }, - { - "language": "en", - "text": "Minimum limit value of specific temperature during operation surrounding the operating unit" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC022#006" - } - ] - }, - "value": "80", - "valueType": "xs:string" - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "Einteilung entsprechend dem Schutz des Betriebsmittels gegen \u00e4u\u00dfere Einfl\u00fcsse jeglicher Art und Schutz vor sich bewegenden Teilen im Betriebsmittel f\u00fcr das elektronische Ger\u00e4t, das Daten aufbereitet und nutzbar macht" - }, - { - "language": "en", - "text": "Classification according to the protection of the operating unit against any external influences and protection against moving parts in the operating unit for the electronic device that processes data and makes them useable" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC106#007" - } - ] - }, - "value": "IP66", - "valueType": "xs:string" - }, - { - "idShort": "max_Spannung", - "description": [ - { - "language": "de", - "text": "h\u00f6chster Wert der Spannung, die am Versorgungseingang eines elektrischen Betriebsmittels zeitweise oder st\u00e4ndig anliegen muss, um die Funktion des Betriebsmittels aufrecht zu erhalten" - }, - { - "language": "en", - "text": "maximum value of the required voltage which must be temporarily or permanently applied to the supply connection of an operating unit to maintain its function" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAE321#006" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "max_Strom", - "description": [ - { - "language": "de", - "text": "maximal aufnehmbarer Strom" - }, - { - "language": "en", - "text": "maximum of energy which can be drawn" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF954#003" - } - ] - }, - "value": "30", - "valueType": "xs:string" - }, - { - "idShort": "elektrischer_Anschluss", - "description": [ - { - "language": "de", - "text": "physikalische Gestaltung der Verbindungsstelle, \u00fcber die ein Bauelementestecker bestimmungsgem\u00e4\u00df mit einem anderen verbunden werden kann" - }, - { - "language": "en", - "text": "Physical design of the connecting point to link a connector component to another in conformity with the intended use" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAB414#007" - } - ] - }, - "value": "ISO M20 x 1.5 Innengewinde", - "valueType": "xs:string" - }, - { - "idShort": "pneumatischer_Anschluss", - "description": [ - { - "language": "de", - "text": "Art und Gr\u00f6\u00dfe des Druckmedienanschlusses eines pneumatischen Bauteils" - }, - { - "language": "en", - "text": "type and size of the pressure media connection on a pneumatic component" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAZ960#002" - } - ] - }, - "value": "G1/4", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json b/server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json deleted file mode 100644 index 14f350193..000000000 --- a/server/storage/e7672f97932a2f5ad3630b92564d1b6a3673aae74c0bb001f319d230327ae2a3.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y18_MagneticPositioner_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/Y18_MagneticPositioner/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json b/server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json deleted file mode 100644 index 780838a66..000000000 --- a/server/storage/e94991e68e7556a2435694720644bf955fe6da0c228af1354e79f5fe1bf4d8a5.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y22_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y22/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json b/server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json deleted file mode 100644 index 67d2aa42b..000000000 --- a/server/storage/eafa7ca6b9886ad8b3a92898b7778b78c7ae2111975f1112ead0d1d6d8233c41.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "data": { - "idShort": "TechnicalData", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/N18_Motor/TechnicalData", - "submodelElements": [ - { - "idShort": "Wiclung_60Hz", - "modelType": "SubmodelElementCollection", - "value": [ - { - "idShort": "Power", - "description": [ - { - "language": "de", - "text": "Angabe \u00fcber die Aufnahme der Nennleistung in Watt" - }, - { - "language": "en", - "text": "describes the nominal power consumption" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAI843#002" - } - ] - }, - "value": "0.63", - "valueType": "xs:string" - }, - { - "idShort": "Amperage", - "description": [ - { - "language": "de", - "text": "geeigneter (meist gerundeter) Wert eines Stromes zur Beschreibung, Bezeichnung oder Identifizierung eines Bauteiles, eines Ger\u00e4tes, eines Betriebsmittels, einer Einrichtung oder einer Ausr\u00fcstung" - }, - { - "language": "en", - "text": "suitable (normally rounded) value of a current for describing, designating or identifying a component, a device, an operating medium, an installation or equipment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF829#003" - } - ] - }, - "value": "Jan 48", - "valueType": "xs:string" - }, - { - "idShort": "Voltage", - "description": [ - { - "language": "de", - "text": "gemessene aktuelle Motorspannung" - }, - { - "language": "en", - "text": "measured actual motor voltage" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-ABC234#001" - } - ] - }, - "value": "460", - "valueType": "xs:string" - }, - { - "idShort": "Phase", - "description": [ - { - "language": "de", - "text": "Verh\u00e4ltnis vom Betrag der Wirkleistung zur Scheinleistung" - }, - { - "language": "en", - "text": "Relation of the amount of the active power to the false performance" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAN420#001" - } - ] - }, - "value": "cos(phi) = 0.8", - "valueType": "xs:string" - }, - { - "idShort": "speed_", - "description": [ - { - "language": "de", - "text": "Quotient aus Anzahl der Umdrehungen und der zugeh\u00f6rigen Zeitspanne" - }, - { - "language": "en", - "text": "Quotient of the number of revolutions and the corresponding time span" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAC881#006" - } - ] - }, - "value": "1695", - "valueType": "xs:string" - }, - { - "idShort": "Voltage2", - "description": [ - { - "language": "de", - "text": "Ein vom Hersteller angegebener Wert der Spannung, der sich aus Messwerten ergibt, die unter festgelegten Bedingungen und Regeln ermittelt worden sind" - }, - { - "language": "en", - "text": "A voltage value given by the manufacturer resulting from measurement values determined under defined conditions and rules" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-BAH737#004" - } - ] - }, - "value": "440-480", - "valueType": "xs:string" - }, - { - "idShort": "Amperage2", - "description": [ - { - "language": "de", - "text": "geeigneter (meist gerundeter) Wert eines Stromes zur Beschreibung, Bezeichnung oder Identifizierung eines Bauteiles, eines Ger\u00e4tes, eines Betriebsmittels, einer Einrichtung oder einer Ausr\u00fcstung" - }, - { - "language": "en", - "text": "suitable (normally rounded) value of a current for describing, designating or identifying a component, a device, an operating medium, an installation or equipment" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAF829#003" - } - ] - }, - "value": "1.54-1.57", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "Schutzart", - "description": [ - { - "language": "de", - "text": "klassifiziert den Umfang des Schutzes des elektromagnetischen Ger\u00e4tes gegen direktes Ber\u00fchren, gegen Eindringen von festen Fremdk\u00f6rpern und/oder gegen Eindringen von Wasser" - }, - { - "language": "en", - "text": "classifies the scope of the protection of the electromagnetic device against direct contact, against insertion of hard foreign objects and/or infiltration through water" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO885#002" - } - ] - }, - "value": "IP 55", - "valueType": "xs:string" - }, - { - "idShort": "Bauform", - "description": [ - { - "language": "de", - "text": "Auspr\u00e4gung f\u00fcr das Produkt, um so Einzelprodukte einer Produktfamilie oder spezielle Varianten voneinander unterscheiden zu k\u00f6nnen" - }, - { - "language": "en", - "text": "Characteristic to differentiate between different products of a product family or special variants" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ModelReference", - "keys": [ - { - "type": "ConceptDescription", - "value": "0173-1#02-AAO057#002" - } - ] - }, - "value": "IM B5", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json b/server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json deleted file mode 100644 index dc7bf33d5..000000000 --- a/server/storage/ecc2dc0c92e778046e5754b2de3eb82c4327af3685863dc5d3557a4939a3386c.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "TU30_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json b/server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json deleted file mode 100644 index 476c99d1f..000000000 --- a/server/storage/ee5e67f7aa9f15b112331b881c587ce239d61c29ace2ec5cffcaba3ad4485479.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "N13_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/N13/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json b/server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json deleted file mode 100644 index 63cbe4d79..000000000 --- a/server/storage/ef25ddc2b19d391c92c70a24f9b2b399e5d0ce46bd157551a9dcb14d3c4c31b0.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Q28_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Q28/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json b/server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json deleted file mode 100644 index b7c5f6c77..000000000 --- a/server/storage/f30f12f7a9cad9ef9bc16ca8a3401673681674b766ab9e8acc48c69f74379521.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y25_Ball_Valve/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Argus/Flowserve Flow Control GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Flanged Ball Valve" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Rudolf-Plank-Str.2" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "76275" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Ettlingen" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "FK 79" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json b/server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json deleted file mode 100644 index cd70c53ca..000000000 --- a/server/storage/f31c2968f30c9b6cfe36c936163f8d6f2173a4bd981492be9f55ef6aa2eebcb8.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "L11_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/L11/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json b/server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json deleted file mode 100644 index 44fe0b136..000000000 --- a/server/storage/f53c331ec4010a3a780a11e3c2f4f0369c63322d5c9b5fac3e42050c7cd05d81.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "data": { - "idShort": "B1_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/DynamicData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/B1/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json b/server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json deleted file mode 100644 index 5911fb138..000000000 --- a/server/storage/f888606d7d2adbdb04458c477c939e3216cf103ff9ed0ab01cbf578119f457bb.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y21_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y21_Valve/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json b/server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json deleted file mode 100644 index 9daa76c5b..000000000 --- a/server/storage/f8e2b406ad732b0a1fa5581cdae512a2d14ac4a70f636d41662e1cd64abbd743.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "data": { - "idShort": "aas_xNBLy1C", - "modelType": "AssetAdministrationShell", - "id": "https://wgrp.biz/aas/xNBLy1C", - "derivedFrom": { - "type": "ModelReference", - "keys": [ - { - "type": "AssetAdministrationShell", - "value": "https://mnestix.com/aas/F11BF9F696A3454EBA0AA4503783F141" - } - ] - }, - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://wgrp.biz/xNBLy1C", - "specificAssetIds": [ - { - "name": "assetIdShort", - "value": "xNBLy1" - } - ], - "defaultThumbnail": { - "path": "https://wgrpproductdata.blob.core.windows.net/product-images/00H14DAP.png", - "contentType": "image/png" - } - } - } -} \ No newline at end of file diff --git a/server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json b/server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json deleted file mode 100644 index 68d7c356c..000000000 --- a/server/storage/fa00538edb91273b62898bc128cfc9abccdfb19b455ae7cbfba3c328a4938920.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/F31/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Krohne Messtechnik GmbH" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Durchflussmessger\u00e4t (magnetisch-induktiv)" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Kludwig-Krohne-Stra\u00dfe 5" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "47058" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Duisburg" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "DE" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "OPTIFLUX 4300 C" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json b/server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json deleted file mode 100644 index 1b85ad86d..000000000 --- a/server/storage/fa334219ffb31b483c40c599b69ba7388ab9d8571c3757da8b139c6d6309db48.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y39_Pneumatischer_Antrieb_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/Y39_Pneumatischer_Antrieb/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json b/server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json deleted file mode 100644 index ed05f00c5..000000000 --- a/server/storage/fa83d5db12579652126440394927c12453864c488bc9f1e2ee293058bb6b2b0e.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y20_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20/HierarchicalStructures" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y20/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json b/server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json deleted file mode 100644 index b47a497ce..000000000 --- a/server/storage/fb05e58b582903c405e1dd47fea3a8ff45bbccfca555b3405cb9d5f0c4deab46.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y14_Valve_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC30/Y14_Valve/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json b/server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json deleted file mode 100644 index 7b926a5f6..000000000 --- a/server/storage/fb24946474f6b08c99ead8965938eef62fce103f9a1b129031a85dfe814e32a2.json +++ /dev/null @@ -1,1181 +0,0 @@ -{ - "data": { - "idShort": "TimeSeries", - "description": [ - { - "language": "de", - "text": "Enth\u00e4lt Zeitreihendaten und Referenzen auf Zeitreihendaten, um diese entlang des Asset\n Lebenszyklus aufzufinden und semantisch zu beschreiben.\n " - }, - { - "language": "en", - "text": "Contains time series data and references to time series data to discover and semantically\n describe them along the asset lifecycle.\n " - } - ], - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU10/Y21/TimeSeries", - "administration": { - "version": "1", - "revision": "1" - }, - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/1/1" - } - ] - }, - "kind": "Template", - "submodelElements": [ - { - "idShort": "Metadata", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Metadata/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "y21_current_value" - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Metadata/Description/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "Current process value of flow sensor Y21" - } - ] - } - ] - }, - { - "idShort": "Segments", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "ExternalSegment", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/ExternalSegment/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "externalSegment y21_current_value " - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "An example external segment of current process value of valve Y21" - } - ] - }, - { - "idShort": "RecordCount", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "360", - "valueType": "xs:long" - }, - { - "idShort": "StartTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07 17:55:03.579795+00:00", - "valueType": "xs:string" - }, - { - "idShort": "EndTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07T18:54:52.324618+00:00", - "valueType": "xs:string" - }, - { - "idShort": "Duration", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "T1H", - "valueType": "xs:string" - }, - { - "idShort": "SamplingInterval", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "10", - "valueType": "xs:long" - }, - { - "idShort": "SamplingRate", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "State", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "completed", - "valueType": "xs:string" - }, - { - "idShort": "LastUpdate", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07T18:54:52.324618+00:00", - "valueType": "xs:string" - }, - { - "idShort": "File", - "category": "PARAMETER", - "modelType": "File", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/File/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "contentType": "String", - "value": "C:\\Users\\wan\\sciebo\\Lehrstuhl\\PLS-Labor\\Digitalisierung Pumpwerk\\AAS Pumpwerk\\2024\\Test Metadata\\y21_current_value.xlsx" - }, - { - "idShort": "Blob", - "category": "VARIABLE", - "modelType": "Blob", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Blob/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "contentType": "application/json" - } - ] - }, - { - "idShort": "LinkedSegment", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/LinkedSegment/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "linkedSegment y21_current_value " - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "language": "en", - "text": "An example linked segment of current process value of valve Y21" - } - ] - }, - { - "idShort": "RecordCount", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "StartTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07T17:55:00", - "valueType": "xs:string" - }, - { - "idShort": "EndTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "2024-02-07T18:55:00", - "valueType": "xs:string" - }, - { - "idShort": "Duration", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "T1H", - "valueType": "xs:string" - }, - { - "idShort": "SamplingInterval", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "10", - "valueType": "xs:long" - }, - { - "idShort": "SamplingRate", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "State", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "complete", - "valueType": "xs:string" - }, - { - "idShort": "LastUpdate", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "Endpoint", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Endpoint/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "http://10.42.0.114:8086", - "valueType": "xs:string" - }, - { - "idShort": "Query", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Query/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": "from(bucket: \"iat\")\n |> range(start: {range_start}, stop: {range_stop}) \n |> filter(fn: (r) => r._measurement == \"y21_current_value\"", - "valueType": "xs:string" - } - ] - }, - { - "idShort": "InternalSegment", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segments/InternalSegment/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Name", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Name/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ] - }, - { - "idShort": "Description", - "category": "PARAMETER", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Description/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ] - }, - { - "idShort": "RecordCount", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/RecordCount/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "StartTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/StartTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "EndTime", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/EndTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "Duration", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/Duration/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "SamplingInterval", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/Segment/SamplingInterval/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "SamplingRate", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/SamplingRate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "State", - "category": "PARAMETER", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/State/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "LastUpdate", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Segment/LastUpdate/1/1\n " - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:string" - }, - { - "idShort": "Records", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Records/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "One", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Record", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/TimeSeries/Record/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "value": [ - { - "idShort": "Time", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/idta/TimeSeries/RelativePointInTime/1/1\n " - } - ] - }, - "qualifiers": [ - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/SubmodelTemplates/Cardinality/1/0\n " - } - ] - }, - "value": "OneToMany", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - }, - { - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "\n https://admin-shell.io/SubmodelTemplates/AllowedIdShort/1/0\n " - } - ] - }, - "value": "Time[\\d{2,3}]", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "AllowedIdShort" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "sampleAccelerationX", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://sample.com/AccelerationX/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "sampleAccelerationY", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://sample.com/AccelerationY/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - }, - { - "idShort": "sampleAccelerationZ", - "category": "VARIABLE", - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://sample.com/AccelerationZ/1/1" - } - ] - }, - "qualifiers": [ - { - "value": "ZeroToOne", - "kind": "ConceptQualifier", - "valueType": "xs:string", - "type": "Cardinality" - } - ], - "valueType": "xs:long" - } - ] - } - ] - } - ] - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json b/server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json deleted file mode 100644 index b0e8dd364..000000000 --- a/server/storage/fb5a0a6890b82c25966c7e9bf4d882eb90e8e01d0a84530e3f3e13aadca1a51d.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "data": { - "idShort": "Nameplate", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU30/N38/Nameplate", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/zvei/nameplate/1/0/Nameplate" - } - ] - }, - "submodelElements": [ - { - "idShort": "ManufacturerName", - "description": [ - { - "language": "de", - "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" - }, - { - "language": "en", - "text": "legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO677#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "GRUNDFOS" - } - ] - }, - { - "idShort": "ManufacturerProductDesignation", - "description": [ - { - "language": "de", - "text": "Kurze Beschreibung des Produktes (Kurztext)" - }, - { - "language": "en", - "text": "Short description of the product (short text)" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAW338#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "UPS 25-60 B 180" - } - ] - }, - { - "idShort": "Address", - "modelType": "SubmodelElementCollection", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAQ832#005" - } - ] - }, - "value": [ - { - "idShort": "Street", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO128#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Park u. 8" - } - ] - }, - { - "idShort": "Zipcode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO129#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "H-2045" - } - ] - }, - { - "idShort": "CityTown", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Toeroekbalint" - } - ] - }, - { - "idShort": "NationalCode", - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAO132#002" - } - ] - }, - "value": [ - { - "language": "de", - "text": "HU" - } - ] - } - ] - }, - { - "idShort": "ManufacturerProductFamily", - "description": [ - { - "language": "de", - "text": "2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie" - }, - { - "language": "en", - "text": "2nd level of a 3 level manufacturer specific product hierarchy" - } - ], - "modelType": "MultiLanguageProperty", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAU731#001" - } - ] - }, - "value": [ - { - "language": "de", - "text": "Grundfos Pumpe 96281498" - } - ] - }, - { - "idShort": "YearOfConstruction", - "description": [ - { - "language": "de", - "text": "Jahreszahl als Datumsangabe f\u00fcr die Fertigstellung des Objektes" - }, - { - "language": "en", - "text": "Year as completion date of object" - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "0173-1#02-AAP906#001" - } - ] - }, - "value": "2007", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json b/server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json deleted file mode 100644 index 73a33212b..000000000 --- a/server/storage/fcc804052fe2db20e746e147154f6d111f8ae3f2d1885df4b4f5d349334695eb.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "data": { - "idShort": "HierarchicalStructures", - "modelType": "Submodel", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/1/0/Submodel" - } - ] - }, - "submodelElements": [ - { - "idShort": "TU20", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Base entry point for the Entity tree in this Submodel, this must be a Self-managed Entity reflecting the Assets administrated in the AAS this Submodel is part of." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/EntryNode/1/0" - } - ] - }, - "statements": [ - { - "idShort": "B2", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/B2" - }, - { - "idShort": "HasEquipmentModule_B2", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU20" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU20" - }, - { - "type": "Entity", - "value": "B2" - } - ] - } - }, - { - "idShort": "Pipe21", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "The Entity Node can be a co-managed or self-managed entity representing an asset in the hierarchical structure." - } - ], - "modelType": "Entity", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/Node/1/0" - } - ] - }, - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/Pipe21" - }, - { - "idShort": "HasEquipmentModule_Pipe21", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "Modeling of logical connections between components and sub-components. Either this or \"IsPartOf\" must be used, not both." - } - ], - "modelType": "RelationshipElement", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/HasPart/1/0" - } - ] - }, - "first": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU20" - } - ] - }, - "second": { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20/HierarchicalStructures" - }, - { - "type": "Entity", - "value": "TU20" - }, - { - "type": "Entity", - "value": "Pipe21" - } - ] - } - } - ], - "entityType": "SelfManagedEntity", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/TU20" - }, - { - "idShort": "ArcheType", - "category": "CONSTANT", - "description": [ - { - "language": "en", - "text": "ArcheType of the Submodel, there are three allowed enumeration entries: 1. \u201cFull\u201d, 2. \u201cOneDown\u201d and 3. \u201cOneUp\u201d." - } - ], - "modelType": "Property", - "semanticId": { - "type": "ExternalReference", - "keys": [ - { - "type": "GlobalReference", - "value": "https://admin-shell.io/idta/HierarchicalStructures/ArcheType/1/0" - } - ] - }, - "value": "OneDown", - "valueType": "xs:string" - } - ] - } -} \ No newline at end of file diff --git a/server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json b/server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json deleted file mode 100644 index bddc40c81..000000000 --- a/server/storage/fdde13c04766aa2cdfabe47015ff5329b75692b4747e15807f126ca62cb5c12b.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "F15_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15/TechnicalData" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC40/F15/Nameplate" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json b/server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json deleted file mode 100644 index f99693ba3..000000000 --- a/server/storage/ff50868c48c55147b5975fe8dae06c38c9410554b7bb0862a64066b3896ad469.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "data": { - "idShort": "Y14_AAS", - "modelType": "AssetAdministrationShell", - "id": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14/AAS/ver:1.0&rev:1.0", - "assetInformation": { - "assetKind": "Instance", - "globalAssetId": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14" - }, - "submodels": [ - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14/Nameplate" - } - ] - }, - { - "type": "ModelReference", - "keys": [ - { - "type": "Submodel", - "value": "https://www.iat.rwth-aachen.de/pls-lab/pumping_station/HC10/Y14/TechnicalData" - } - ] - } - ] - } -} \ No newline at end of file From 27d71e8578498f1992286e677eeab35d359ae067 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Fri, 13 Mar 2026 11:05:39 +0100 Subject: [PATCH 65/76] Update repository.py from develop branch --- server/app/interfaces/repository.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 935b481af..c1ee513e5 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -167,14 +167,14 @@ def __call__(self, environ, start_response) -> Iterable[bytes]: response: Response = self.handle_request(Request(environ)) return response(environ, start_response) - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IT]) \ - -> model.provider._IT: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IDENTIFIABLE]) \ + -> model.provider._IDENTIFIABLE: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") return identifiable - def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]: + def _get_all_obj_of_type(self, type_: Type[model.provider._IDENTIFIABLE]) -> Iterator[model.provider._IDENTIFIABLE]: for obj in self.object_store: if isinstance(obj, type_): yield obj From 21f89c4e0881e7fc7bbbe48eb09e45cd1a123661 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Fri, 13 Mar 2026 13:39:57 +0100 Subject: [PATCH 66/76] Update Registry --- server/app/backend/__init__.py | 1 + server/app/interfaces/base.py | 7 ++-- server/app/interfaces/registry.py | 6 +-- server/app/model/__init__.py | 1 + server/docker/registry/Dockerfile | 37 ++++++++++++------- server/docker/registry/uwsgi.ini | 2 +- .../discovery_standalone/compose.yml | 8 ++-- .../registry_standalone/README.md | 26 ++++++------- 8 files changed, 49 insertions(+), 39 deletions(-) diff --git a/server/app/backend/__init__.py b/server/app/backend/__init__.py index e69de29bb..f6cd30176 100644 --- a/server/app/backend/__init__.py +++ b/server/app/backend/__init__.py @@ -0,0 +1 @@ +from .local_file import * \ No newline at end of file diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 8234eddc2..8283b2325 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -264,19 +264,18 @@ def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, res class ObjectStoreWSGIApp(BaseWSGIApp): object_store: AbstractObjectStore - def _get_all_obj_of_type(self, type_: Type[model.provider._IDENTIFIABLE]) -> Iterator[model.provider._IDENTIFIABLE]: + def _get_all_obj_of_type(self, type_: Type[T]) -> Iterator[T]: for obj in self.object_store: if isinstance(obj, type_): yield obj - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IDENTIFIABLE]) \ - -> model.provider._IDENTIFIABLE: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) \ + -> T: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") return identifiable - class HTTPApiDecoder: # these are the types we can construct (well, only the ones we need) type_constructables_map = { diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 49874a63e..279a4d54e 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -16,10 +16,11 @@ import app.model as server_model from app.util.converters import IdentifierToBase64URLConverter, base64url_decode from app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder +from app.model import DictDescriptorStore class RegistryAPI(ObjectStoreWSGIApp): - def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.0"): + def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.1.1"): self.object_store: model.AbstractObjectStore = object_store self.url_map = werkzeug.routing.Map([ Submount(base_path, [ @@ -284,7 +285,6 @@ def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, res if __name__ == "__main__": from werkzeug.serving import run_simple - from basyx.aas.examples.data.example_aas import create_full_example - run_simple("localhost", 8083, RegistryAPI(create_full_example()), + run_simple("localhost", 8083, RegistryAPI(DictDescriptorStore()), use_debugger=True, use_reloader=True) diff --git a/server/app/model/__init__.py b/server/app/model/__init__.py index 79b363526..561375546 100644 --- a/server/app/model/__init__.py +++ b/server/app/model/__init__.py @@ -1,3 +1,4 @@ from .descriptor import * from .endpoint import * from .service_specification import * +from .provider import * diff --git a/server/docker/registry/Dockerfile b/server/docker/registry/Dockerfile index 344ddd0ee..e9d716007 100644 --- a/server/docker/registry/Dockerfile +++ b/server/docker/registry/Dockerfile @@ -1,5 +1,10 @@ FROM python:3.11-alpine +LABEL org.label-schema.name="Eclipse BaSyx" \ + org.label-schema.version="1.0" \ + org.label-schema.description="Docker image for the basyx-python-sdk registry server application" \ + org.label-schema.maintainer="Eclipse BaSyx" + ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 @@ -11,9 +16,12 @@ RUN apk update && \ apk del git bash -COPY registry_server/uwsgi.ini /etc/uwsgi/ -COPY registry_server/supervisord.ini /etc/supervisor/conf.d/supervisord.ini -COPY registry_server/stop-supervisor.sh /etc/supervisor/stop-supervisor.sh +COPY ./sdk /sdk +COPY ./server/app /server/app +COPY ./server/pyproject.toml /server/pyproject.toml +COPY ./server/docker/registry/uwsgi.ini /etc/uwsgi/ +COPY ./server/docker/common/supervisord.ini /etc/supervisor/conf.d/supervisord.ini +COPY ./server/docker/common/stop-supervisor.sh /etc/supervisor/stop-supervisor.sh RUN chmod +x /etc/supervisor/stop-supervisor.sh # Makes it possible to use a different configuration @@ -26,24 +34,25 @@ ENV NGINX_MAX_UPLOAD=1M ENV NGINX_WORKER_PROCESSES=1 ENV LISTEN_PORT=80 ENV CLIENT_BODY_BUFFER_SIZE=1M +ENV API_BASE_PATH=/api/v3.1.1/ + +# Default values for the storage envs +ENV INPUT=/input +ENV STORAGE=/storage +ENV STORAGE_PERSISTENCY=False +ENV STORAGE_OVERWRITE=False +VOLUME ["/input", "/storage"] # Copy the entrypoint that will generate Nginx additional configs -COPY registry_server/entrypoint.sh /entrypoint.sh +COPY server/docker/common/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] ENV SETUPTOOLS_SCM_PRETEND_VERSION=1.0.0 - -COPY ./registry_server/requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -COPY ./sdk /sdk -COPY ./server /server -COPY ./registry_server/app /app - -WORKDIR /app -RUN pip install ../sdk +WORKDIR /server/app +RUN pip install ../../sdk +RUN pip install .. CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.ini"] \ No newline at end of file diff --git a/server/docker/registry/uwsgi.ini b/server/docker/registry/uwsgi.ini index f333b2299..1ede39c3d 100644 --- a/server/docker/registry/uwsgi.ini +++ b/server/docker/registry/uwsgi.ini @@ -1,5 +1,5 @@ [uwsgi] -wsgi-file = /app/main.py +wsgi-file = /server/app/services/run_registry.py socket = /tmp/uwsgi.sock chown-socket = nginx:nginx chmod-socket = 664 diff --git a/server/example_configurations/discovery_standalone/compose.yml b/server/example_configurations/discovery_standalone/compose.yml index b875bb16b..27b9309e9 100644 --- a/server/example_configurations/discovery_standalone/compose.yml +++ b/server/example_configurations/discovery_standalone/compose.yml @@ -6,7 +6,7 @@ services: dockerfile: server/docker/discovery/Dockerfile ports: - "8084:80" - environment: - - storage_path=/discovery_store.json - volumes: - - ./discovery_store.json:/discovery_store.json \ No newline at end of file + #environment: + #- storage_path=/discovery_store.json + #volumes: + # - ./discovery_store.json:/discovery_store.json diff --git a/server/example_configurations/registry_standalone/README.md b/server/example_configurations/registry_standalone/README.md index 6c62e5068..f29a64af9 100644 --- a/server/example_configurations/registry_standalone/README.md +++ b/server/example_configurations/registry_standalone/README.md @@ -11,19 +11,19 @@ The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Su ## Features # AAS Registry: -| Function | Description | Example URL | -|--------------------------------------------------|----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| **GetAllAssetAdministrationShellDescriptors** | Return all AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors` | -| **GetAssetAdministrationShellDescriptorById** | Return a specific AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | -| **PostAssetAdministrationShellDescriptor** | Register/create a new AAS descriptor | `POST http://localhost:8083/api/v3.0/shell-descriptors` | -| **PutAssetAdministrationShellDescriptorById** | Update an existing AAS descriptor | `PUT http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | -| **DeleteAssetAdministrationShellDescriptorById** | Delete an AAS descriptor by ID | `DELETE http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}` | -| **GetSubmodelDescriptorsThroughSuperPath** | Return all submodel descriptors under AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors` | -| **PostSubmodelDescriptorThroughSuperPath** | Register/create a new submodel descriptor under AAS descriptor | `POST http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors` | -| **GetSubmodelDescriptorThroughSuperPath** | Return a specific submodel descriptor under AAS descriptor | `GET http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | -| **PutSubmodelDescriptorThroughSuperPath** | Update a specific submodel descriptor under AAS descriptor | `PUT http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | -| **DeleteSubmodelDescriptorThroughSuperPath** | Delete a specific submodel descriptor under AAS descriptor | `DELETE http://localhost:8083/api/v3.0/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | -| **GetDescription** | Return the self‑description of the AAS registry service | `GET http://localhost:8083/api/v3.0/description` | +| Function | Description | Example URL | +|--------------------------------------------------|----------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------| +| **GetAllAssetAdministrationShellDescriptors** | Return all AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors` | +| **GetAssetAdministrationShellDescriptorById** | Return a specific AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | +| **PostAssetAdministrationShellDescriptor** | Register/create a new AAS descriptor | `POST http://localhost:8083/api/v3.1.1/shell-descriptors` | +| **PutAssetAdministrationShellDescriptorById** | Update an existing AAS descriptor | `PUT http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | +| **DeleteAssetAdministrationShellDescriptorById** | Delete an AAS descriptor by ID | `DELETE http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | +| **GetSubmodelDescriptorsThroughSuperPath** | Return all submodel descriptors under AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors` | +| **PostSubmodelDescriptorThroughSuperPath** | Register/create a new submodel descriptor under AAS descriptor | `POST http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors` | +| **GetSubmodelDescriptorThroughSuperPath** | Return a specific submodel descriptor under AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **PutSubmodelDescriptorThroughSuperPath** | Update a specific submodel descriptor under AAS descriptor | `PUT http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **DeleteSubmodelDescriptorThroughSuperPath** | Delete a specific submodel descriptor under AAS descriptor | `DELETE http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **GetDescription** | Return the self‑description of the AAS registry service | `GET http://localhost:8083/api/v3.1.1/description` | # Submodel Registry: | Function | Description | Example URL | From 8da14be606a8e3ac91f9ee0fd64476029d9e5625 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Fri, 13 Mar 2026 13:42:18 +0100 Subject: [PATCH 67/76] Update gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index a718fd412..cb3643db8 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,5 @@ server/app/version.py # Ignore the content of the server storage server/example_configurations/repository_standalone/input/ server/example_configurations/repository_standalone/storage/ -test.py /storage/ server/storage/ From 648efed396a9a2112035a6ad3c949580cb83fc92 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 11:24:54 +0200 Subject: [PATCH 68/76] Update Registry after test --- server/app/adapter/__init__.py | 1 + server/app/interfaces/__init__.py | 4 + server/app/interfaces/base.py | 30 ++-- server/app/interfaces/registry.py | 86 +++++++---- server/app/model/provider.py | 32 ++++ server/app/model/service_specification.py | 8 +- server/app/services/run_registry.py | 137 +++++++++++++++++- .../registry_standalone/README.md | 60 +++----- .../registry_standalone/compose.yml | 7 +- 9 files changed, 283 insertions(+), 82 deletions(-) diff --git a/server/app/adapter/__init__.py b/server/app/adapter/__init__.py index e69de29bb..7aa9731cc 100644 --- a/server/app/adapter/__init__.py +++ b/server/app/adapter/__init__.py @@ -0,0 +1 @@ +from .jsonization import * \ No newline at end of file diff --git a/server/app/interfaces/__init__.py b/server/app/interfaces/__init__.py index e69de29bb..975f2b542 100644 --- a/server/app/interfaces/__init__.py +++ b/server/app/interfaces/__init__.py @@ -0,0 +1,4 @@ +from .base import * +from .registry import * +from .discovery import * +from .repository import * \ No newline at end of file diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 8283b2325..fbe96b206 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -20,16 +20,20 @@ from werkzeug.exceptions import NotFound, BadRequest from werkzeug.routing import MapAdapter +import app.model from basyx.aas import model from basyx.aas.adapter._generic import XML_NS_MAP -from basyx.aas.adapter.json import StrictStrippedAASFromJsonDecoder, StrictAASFromJsonDecoder, AASToJsonEncoder +from app.adapter import ServerStrictStrippedAASFromJsonDecoder, ServerStrictAASFromJsonDecoder, ServerAASToJsonEncoder from basyx.aas.adapter.xml import xml_serialization, XMLConstructables, read_aas_xml_element from basyx.aas.model import AbstractObjectStore from app.util.converters import base64url_decode +from app.model import AssetLink, AssetAdministrationShellDescriptor, SubmodelDescriptor +from app.model.provider import _DESCRIPTOR_TYPE -T = TypeVar("T") +T = TypeVar("T") +_STORABLE = TypeVar("_STORABLE", model.provider._IDENTIFIABLE, _DESCRIPTOR_TYPE) @enum.unique class MessageType(enum.Enum): @@ -159,7 +163,7 @@ def __init__(self, *args, content_type="text/xml", **kwargs): super().__init__(*args, **kwargs, content_type=content_type) -class ResultToJsonEncoder(AASToJsonEncoder): +class ResultToJsonEncoder(ServerAASToJsonEncoder): @classmethod def _result_to_json(cls, result: Result) -> Dict[str, object]: return { @@ -264,13 +268,13 @@ def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, res class ObjectStoreWSGIApp(BaseWSGIApp): object_store: AbstractObjectStore - def _get_all_obj_of_type(self, type_: Type[T]) -> Iterator[T]: + def _get_all_obj_of_type(self, type_: Type[_STORABLE]) -> Iterator[_STORABLE]: for obj in self.object_store: if isinstance(obj, type_): yield obj - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) \ - -> T: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[_STORABLE]) \ + -> _STORABLE: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") @@ -292,7 +296,12 @@ class HTTPApiDecoder: @classmethod def check_type_support(cls, type_: type): - if type_ not in cls.type_constructables_map: + tolerated_types = ( + AssetAdministrationShellDescriptor, + SubmodelDescriptor, + AssetLink, + ) + if type_ not in cls.type_constructables_map and type_ not in tolerated_types: raise TypeError(f"Parsing {type_} is not supported!") @classmethod @@ -304,8 +313,8 @@ def assert_type(cls, obj: object, type_: Type[T]) -> T: @classmethod def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: cls.check_type_support(expect_type) - decoder: Type[StrictAASFromJsonDecoder] = StrictStrippedAASFromJsonDecoder if stripped \ - else StrictAASFromJsonDecoder + decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ + else ServerStrictAASFromJsonDecoder try: parsed = json.loads(data, cls=decoder) if isinstance(parsed, list) and expect_single: @@ -324,6 +333,9 @@ def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool model.SpecificAssetId: decoder._construct_specific_asset_id, model.Reference: decoder._construct_reference, model.Qualifier: decoder._construct_qualifier, + app.model.AssetAdministrationShellDescriptor: decoder._construct_asset_administration_shell_descriptor, + app.model.SubmodelDescriptor: decoder._construct_submodel_descriptor, + app.model.AssetLink: decoder._construct_asset_link, } constructor: Optional[Callable[..., T]] = mapping.get(expect_type) # type: ignore[assignment] diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index 279a4d54e..e74073229 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -139,12 +139,21 @@ def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: return response_t(descriptor) def put_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - descriptor = self._get_aas_descriptor(url_args) - descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, - is_stripped_request(request))) - descriptor.commit() - return response_t() + map_adapter: MapAdapter, **_kwargs) -> Response: + try: + descriptor = self._get_aas_descriptor(url_args) + descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, + is_stripped_request(request))) + descriptor.commit() + return response_t() + except NotFound: + descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) + self.object_store.add(descriptor) + descriptor.commit() + created_resource_url = map_adapter.build(self.get_aas_descriptor_by_id, { + "aas_id": descriptor.id + }, force_external=True) + return response_t(descriptor, status=201, headers={"Location": created_resource_url}) def delete_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: @@ -211,21 +220,36 @@ def put_submodel_descriptor_by_id_through_superpath(self, response_t: Type[ APIResponse], - **_kwargs) -> Response: + map_adapter: MapAdapter, **_kwargs) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) - submodel_id = url_args["submodel_id"] - submodel_descriptor = next( - (sd for sd in aas_descriptor.submodel_descriptors if - sd.id == submodel_id), None) - if submodel_descriptor is None: - raise NotFound( - f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") - submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, - is_stripped_request(request))) - aas_descriptor.commit() - return response_t() + try: + submodel_id = url_args["submodel_id"] + submodel_descriptor = next( + (sd for sd in aas_descriptor.submodel_descriptors if + sd.id == submodel_id), None) + if submodel_descriptor is None: + raise NotFound( + f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + submodel_descriptor.update_from( + HTTPApiDecoder.request_body(request, + server_model.SubmodelDescriptor, + is_stripped_request(request))) + aas_descriptor.commit() + return response_t() + except NotFound: + submodel_descriptor = HTTPApiDecoder.request_body(request, + server_model.SubmodelDescriptor, + is_stripped_request( + request)) + aas_descriptor.submodel_descriptors.append(submodel_descriptor) + aas_descriptor.commit() + created_resource_url = map_adapter.build( + self.get_submodel_descriptor_by_id_through_superpath, { + "aas_id": aas_descriptor.id, + "submodel_id": submodel_descriptor.id + }, force_external=True) + return response_t(submodel_descriptor, status=201, + headers={"Location": created_resource_url}) def delete_submodel_descriptor_by_id_through_superpath(self, request: Request, @@ -270,12 +294,22 @@ def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - submodel_descriptor = self._get_submodel_descriptor(url_args) - submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) - submodel_descriptor.commit() - return response_t() + map_adapter: MapAdapter, **_kwargs) -> Response: + try: + submodel_descriptor = self._get_submodel_descriptor(url_args) + submodel_descriptor.update_from( + HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) + submodel_descriptor.commit() + return response_t() + except NotFound: + submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, + is_stripped_request(request)) + self.object_store.add(submodel_descriptor) + submodel_descriptor.commit() + created_resource_url = map_adapter.build(self.get_submodel_descriptor_by_id, { + "submodel_id": submodel_descriptor.id + }, force_external=True) + return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: diff --git a/server/app/model/provider.py b/server/app/model/provider.py index 595dd27ac..3e0f573e8 100644 --- a/server/app/model/provider.py +++ b/server/app/model/provider.py @@ -2,8 +2,13 @@ from basyx.aas import model from basyx.aas.model import provider as sdk_provider +from pathlib import Path +from typing import Dict, IO, Iterable from app.model import descriptor +from app.adapter import read_server_aas_json_file_into + +PathOrIO = Union[Path, IO] _DESCRIPTOR_TYPE = Union[descriptor.AssetAdministrationShellDescriptor, descriptor.SubmodelDescriptor] @@ -46,3 +51,30 @@ def __len__(self) -> int: def __iter__(self) -> Iterator[_DESCRIPTOR_TYPE]: return iter(self._backend.values()) + +def load_directory(directory: Union[Path, str]) -> DictDescriptorStore: + """ + Create a new :class:`~basyx.aas.model.provider.DictIdentifiableStore` and use it to load Asset Administration Shell + and Submodel files in ``AASX``, ``JSON`` and ``XML`` format from a given directory into memory. Additionally, load + all embedded supplementary files into a new :class:`~basyx.aas.adapter.aasx.DictSupplementaryFileContainer`. + + :param directory: :class:`~pathlib.Path` or ``str`` pointing to the directory containing all Asset Administration + Shell and Submodel files to load + :return: Tuple consisting of a :class:`~basyx.aas.model.provider.DictIdentifiableStore` and a + :class:`~basyx.aas.adapter.aasx.DictSupplementaryFileContainer` containing all loaded data + """ + + dict_descriptor_store: DictDescriptorStore = DictDescriptorStore() + + directory = Path(directory) + + for file in directory.iterdir(): + if not file.is_file(): + continue + + suffix = file.suffix.lower() + if suffix == ".json": + with open(file) as f: + read_server_aas_json_file_into(dict_descriptor_store, f) + + return dict_descriptor_store diff --git a/server/app/model/service_specification.py b/server/app/model/service_specification.py index 39bc3dc03..180f7f93c 100644 --- a/server/app/model/service_specification.py +++ b/server/app/model/service_specification.py @@ -2,10 +2,10 @@ from enum import Enum class ServiceSpecificationProfileEnum(str, Enum): - AAS_REGISTRY_FULL = "https://adminshell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-001" - AAS_REGISTRY_READ = "https://adminshell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-002" - SUBMODEL_REGISTRY_FULL = "https://adminshell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-001" - SUBMODEL_REGISTRY_READ = "https://adminshell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-002" + AAS_REGISTRY_FULL = "https://adminshell.io/aas/API/3/1/AssetAdministrationShellRegistryServiceSpecification/SSP-001" + AAS_REGISTRY_READ = "https://adminshell.io/aas/API/3/1/AssetAdministrationShellRegistryServiceSpecification/SSP-002" + SUBMODEL_REGISTRY_FULL = "https://adminshell.io/aas/API/3/1/SubmodelRegistryServiceSpecification/SSP-001" + SUBMODEL_REGISTRY_READ = "https://adminshell.io/aas/API/3/1/SubmodelRegistryServiceSpecification/SSP-002" #TODO add other profiles diff --git a/server/app/services/run_registry.py b/server/app/services/run_registry.py index b182118ee..07a3dbe2b 100644 --- a/server/app/services/run_registry.py +++ b/server/app/services/run_registry.py @@ -1,9 +1,10 @@ +"""" import sys import os sys.path.insert(0, "/") -from basyx.aas.backend.local_file import LocalFileObjectStore -from basyx.aas import model from server.app.interfaces.registry import RegistryAPI +from app.model import DictDescriptorStore +from app.backend import LocalFileDescriptorStore storage_path = os.getenv("STORAGE_PATH", "/storage") storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") @@ -15,13 +16,139 @@ wsgi_optparams["base_path"] = base_path if storage_type == "LOCAL_FILE_BACKEND": - application = RegistryAPI(LocalFileObjectStore(storage_path), **wsgi_optparams) + application = RegistryAPI(LocalFileDescriptorStore(storage_path), **wsgi_optparams) elif storage_type in "LOCAL_FILE_READ_ONLY": - object_store: model.DictObjectStore = model.DictObjectStore() + object_store: DictDescriptorStore = DictDescriptorStore() application = RegistryAPI(object_store, **wsgi_optparams) else: print(f"STORAGE_TYPE must be either LOCAL_FILE or LOCAL_FILE_READ_ONLY! Current value: {storage_type}", - file=sys.stderr) \ No newline at end of file + file=sys.stderr) +""" +# Copyright (c) 2026 the Eclipse BaSyx Authors +# +# This program and the accompanying materials are made available under the terms of the MIT License, available in +# the LICENSE file of this project. +# +# SPDX-License-Identifier: MIT +""" +This module provides the WSGI entry point for the Asset Administration Shell Repository Server. +""" + +import logging +import os +from app.model import load_directory +from app.backend import LocalFileDescriptorStore +from app.model import DictDescriptorStore +from app.interfaces.registry import RegistryAPI +from typing import Union + + +# -------- Helper methods -------- + +def setup_logger() -> logging.Logger: + """ + Configure a custom :class:`~logging.Logger` for the start-up sequence of the server. + + :return: Configured :class:`~logging.Logger` + """ + + logger = logging.getLogger(__name__) + if not logger.handlers: + logger.setLevel(logging.INFO) + handler = logging.StreamHandler() + handler.setLevel(logging.INFO) + handler.setFormatter(logging.Formatter("%(levelname)s [Server Start-up] %(message)s")) + logger.addHandler(handler) + logger.propagate = False + return logger + + +def build_storage( + env_input: str, + env_storage: str, + env_storage_persistency: bool, + env_storage_overwrite: bool, + logger: logging.Logger +) -> Union[DictDescriptorStore, LocalFileDescriptorStore]: + """ + Configure the server's storage according to the given start-up settings. + + :param env_input: ``str`` pointing to the input directory of the server + :param env_storage: ``str`` pointing to the :class:`~basyx.aas.backend.local_file.LocalFileIdentifiableStore` + storage directory of the server if persistent storage is enabled + :param env_storage_persistency: Flag to enable persistent storage + :param env_storage_overwrite: Flag to overwrite existing :class:`Identifiables ` + in the :class:`~basyx.aas.backend.local_file.LocalFileIdentifiableStore` if persistent storage is enabled + :param logger: :class:`~logging.Logger` used for start-up diagnostics + :return: Tuple consisting of a :class:`~basyx.aas.model.provider.DictIdentifiableStore` if persistent storage is + disabled or a :class:`~basyx.aas.backend.local_file.LocalFileIdentifiableStore` if persistent storage is + enabled and a :class:`~basyx.aas.adapter.aasx.DictSupplementaryFileContainer` as storage for + :class:`~interfaces.repository.WSGIApp` + """ + + if env_storage_persistency: + storage_files = LocalFileDescriptorStore(env_storage) + storage_files.check_directory(create=True) + if os.path.isdir(env_input): + input_files = load_directory(env_input) + added, overwritten, skipped = storage_files.sync(input_files, env_storage_overwrite) + logger.info( + "Loaded %d descriptors(s) from \"%s\"", + len(input_files), env_input + ) + logger.info( + "Synced INPUT to STORAGE with %d added and %d %s", + added, + overwritten if env_storage_overwrite else skipped, + "overwritten" if env_storage_overwrite else "skipped" + ) + return storage_files + else: + logger.warning("INPUT directory \"%s\" not found, starting empty", env_input) + return storage_files + + if os.path.isdir(env_input): + input_files = load_directory(env_input) + logger.info( + "Loaded %d descriptors(s) from \"%s\"", + len(input_files), env_input + ) + return input_files + else: + logger.warning("INPUT directory \"%s\" not found, starting empty", env_input) + return DictDescriptorStore() + + +# -------- WSGI entrypoint -------- + +logger = setup_logger() + +env_input = os.getenv("INPUT", "/input") +env_storage = os.getenv("STORAGE", "/storage") +env_storage_persistency = os.getenv("STORAGE_PERSISTENCY", "false").lower() in {"1", "true", "yes"} +env_storage_overwrite = os.getenv("STORAGE_OVERWRITE", "false").lower() in {"1", "true", "yes"} +env_api_base_path = os.getenv("API_BASE_PATH") + +wsgi_optparams = {"base_path": env_api_base_path} if env_api_base_path else {} + +logger.info( + "Loaded settings API_BASE_PATH=\"%s\", INPUT=\"%s\", STORAGE=\"%s\", PERSISTENCY=%s, OVERWRITE=%s", + env_api_base_path or "", env_input, env_storage, env_storage_persistency, env_storage_overwrite +) + +storage_files = build_storage( + env_input, + env_storage, + env_storage_persistency, + env_storage_overwrite, + logger +) + +application = RegistryAPI(storage_files, **wsgi_optparams) + + +if __name__ == "__main__": + logger.info("WSGI entrypoint created. Serve this module with uWSGI/Gunicorn/etc.") diff --git a/server/example_configurations/registry_standalone/README.md b/server/example_configurations/registry_standalone/README.md index f29a64af9..63d6dd8ee 100644 --- a/server/example_configurations/registry_standalone/README.md +++ b/server/example_configurations/registry_standalone/README.md @@ -1,7 +1,7 @@ # Eclipse BaSyx Python SDK - Registry Service -This is a Python-based implementation of the **BaSyx Asset Administration Shell (AAS) Registry Service**. -It provides basic registry functionality for AAS and submodels descriptors, as specified in the official [Asset Administration Shell Registry Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRegistryServiceSpecification/V3.1.0_SSP-001) and [Submodel Registry Service Specification v3.1.0_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRegistryServiceSpecification/V3.1.0_SSP-001). +This is a Python-based implementation of the **Asset Administration Shell (AAS) Registry Service**. +It provides all registry functionality for AAS and submodels descriptors, as specified in the official [Asset Administration Shell Registry Service Specification v3.1.1_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/AssetAdministrationShellRegistryServiceSpecification/V3.1.1_SSP-001) and [Submodel Registry Service Specification v3.1.1_SSP-001](https://app.swaggerhub.com/apis/Plattform_i40/SubmodelRegistryServiceSpecification/V3.1.1_SSP-001). ## Overview @@ -11,19 +11,19 @@ The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Su ## Features # AAS Registry: -| Function | Description | Example URL | -|--------------------------------------------------|----------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------| -| **GetAllAssetAdministrationShellDescriptors** | Return all AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors` | -| **GetAssetAdministrationShellDescriptorById** | Return a specific AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | -| **PostAssetAdministrationShellDescriptor** | Register/create a new AAS descriptor | `POST http://localhost:8083/api/v3.1.1/shell-descriptors` | -| **PutAssetAdministrationShellDescriptorById** | Update an existing AAS descriptor | `PUT http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | -| **DeleteAssetAdministrationShellDescriptorById** | Delete an AAS descriptor by ID | `DELETE http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | -| **GetSubmodelDescriptorsThroughSuperPath** | Return all submodel descriptors under AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors` | -| **PostSubmodelDescriptorThroughSuperPath** | Register/create a new submodel descriptor under AAS descriptor | `POST http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors` | -| **GetSubmodelDescriptorThroughSuperPath** | Return a specific submodel descriptor under AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | -| **PutSubmodelDescriptorThroughSuperPath** | Update a specific submodel descriptor under AAS descriptor | `PUT http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | -| **DeleteSubmodelDescriptorThroughSuperPath** | Delete a specific submodel descriptor under AAS descriptor | `DELETE http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | -| **GetDescription** | Return the self‑description of the AAS registry service | `GET http://localhost:8083/api/v3.1.1/description` | +| Function | Description | Example URL | +|--------------------------------------------------|----------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------| +| **GetAllAssetAdministrationShellDescriptors** | Return all AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors` | +| **GetAssetAdministrationShellDescriptorById** | Return a specific AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | +| **PostAssetAdministrationShellDescriptor** | Register/create a new AAS descriptor | `POST http://localhost:8083/api/v3.1.1/shell-descriptors` | +| **PutAssetAdministrationShellDescriptorById** | Create or update an existing AAS descriptor | `PUT http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | +| **DeleteAssetAdministrationShellDescriptorById** | Delete an AAS descriptor by ID | `DELETE http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}` | +| **GetSubmodelDescriptorsThroughSuperPath** | Return all submodel descriptors under AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors` | +| **PostSubmodelDescriptorThroughSuperPath** | Register/create a new submodel descriptor under AAS descriptor | `POST http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors` | +| **GetSubmodelDescriptorThroughSuperPath** | Return a specific submodel descriptor under AAS descriptor | `GET http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **PutSubmodelDescriptorThroughSuperPath** | Create or update a specific submodel descriptor under AAS descriptor | `PUT http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **DeleteSubmodelDescriptorThroughSuperPath** | Delete a specific submodel descriptor under AAS descriptor | `DELETE http://localhost:8083/api/v3.1.1/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier}` | +| **GetDescription** | Return the self‑description of the AAS registry service | `GET http://localhost:8083/api/v3.1.1/description` | # Submodel Registry: | Function | Description | Example URL | @@ -31,7 +31,7 @@ The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Su | **GetAllSubmodelDescriptors** | Return all submodel descriptors | `GET http://localhost:8083/api/v3.0/submodel-descriptors` | | **PostSubmodelDescriptor** | Register/create a new submodel descriptor | `POST http://localhost:8083/api/v3.0/submodel-descriptors` | | **GetSubmodelDescriptorById** | Return a specific submodel descriptor | `GET http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | -| **PutSubmodelDescriptorById** | Update a specific submodel descriptor | `PUT http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | +| **PutSubmodelDescriptorById** | Create or update a specific submodel descriptor | `PUT http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | | **DeleteSubmodelDescriptorById** | Delete a specific submodel descriptor | `DELETE http://localhost:8083/api/v3.0/submodel-descriptors/{submodelIdentifier}` | | **GetDescription** | Return the self‑description of the submodel registry service | `GET http://localhost:8083/api/v3.0/description` | @@ -39,28 +39,16 @@ The Registry Service provides the endpoint for a given AAS-ID or Submodel-ID. Su ## Configuration -The container can be configured via environment variables: +This example Docker compose configuration starts a registry server. -- `API_BASE_PATH` determines the base path under which all other API paths are made available. Default: `/api/v3.0` -- `STORAGE_TYPE` can be one of `LOCAL_FILE_READ_ONLY` or `LOCAL_FILE_BACKEND`: - - When set to `LOCAL_FILE_READ_ONLY` (the default), the server will read and serve JSON files from the storage directory. The files are not modified, all changes done via the API are only stored in memory. - - When instead set to `LOCAL_FILE_BACKEND`, the server makes use of the [LocalFileBackend](https://github.com/eclipse-basyx/basyx-python-sdk/tree/main/backend/basyx_backend/local_file), where AAS and Submodels descriptors are persistently stored as JSON files. -- `STORAGE_PATH` sets the directory to read the files from *within the container*. If you bind your files to a directory different from the default `/storage`, you can use this variable to adjust the server accordingly. - - -## Deployment via Docker - -A `Dockerfile` and `docker-compose.yml` are provided for simple deployment. -The container image can be built and run via: -```bash -docker compose up --build +The container image can also be built and run via: +``` +$ docker compose up ``` -## Test - -An example descriptor for testing purposes is provided as a JSON file in the [storage](./storage) folder. - -## Acknowledgments +Input files are read from `./input` and stored persistently under `./storage` on your host system. +The server can be accessed at http://localhost:8083/api/v3.1.1/ from your host system. +To get a different setup, the `compose.yaml` file can be adapted using the options described in the main server [README.md](../../README.md#options). -This Dockerfile is inspired by the [tiangolo/uwsgi-nginx-docker](https://github.com/tiangolo/uwsgi-nginx-docker) repository. +Note that the `Dockerfile` has to be specified explicitly via `dockerfile: server/docker/repository/Dockerfile`, as the build context must be set to the repository root to allow access to the local `/sdk`. diff --git a/server/example_configurations/registry_standalone/compose.yml b/server/example_configurations/registry_standalone/compose.yml index 99f3e3cc9..f7ac9223e 100644 --- a/server/example_configurations/registry_standalone/compose.yml +++ b/server/example_configurations/registry_standalone/compose.yml @@ -1,9 +1,12 @@ services: app: build: - context: .. - dockerfile: registry_server/Dockerfile + context: ../../.. + dockerfile: server/docker/registry/Dockerfile ports: - "8083:80" volumes: + - ./input:/input - ./storage:/storage + environment: + STORAGE_PERSISTENCY: True \ No newline at end of file From 1e8f82a6d5c354156d88d6dec54b58e9df43adce Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 13:17:16 +0200 Subject: [PATCH 69/76] Update base.py to be more generic --- server/app/interfaces/base.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index fbe96b206..859f62959 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -33,7 +33,7 @@ T = TypeVar("T") -_STORABLE = TypeVar("_STORABLE", model.provider._IDENTIFIABLE, _DESCRIPTOR_TYPE) + @enum.unique class MessageType(enum.Enum): @@ -268,13 +268,13 @@ def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, res class ObjectStoreWSGIApp(BaseWSGIApp): object_store: AbstractObjectStore - def _get_all_obj_of_type(self, type_: Type[_STORABLE]) -> Iterator[_STORABLE]: + def _get_all_obj_of_type(self, type_: Type[T]) -> Iterator[T]: for obj in self.object_store: if isinstance(obj, type_): yield obj - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[_STORABLE]) \ - -> _STORABLE: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) \ + -> T: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") From f9ba59a2bc88520363684e9c5665b96157efc80e Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 13:18:48 +0200 Subject: [PATCH 70/76] Update gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index cb3643db8..4f2f9979a 100644 --- a/.gitignore +++ b/.gitignore @@ -34,5 +34,7 @@ server/app/version.py # Ignore the content of the server storage server/example_configurations/repository_standalone/input/ server/example_configurations/repository_standalone/storage/ +server/example_configurations/registry_standalone/input/ +server/example_configurations/registry_standalone/storage/ /storage/ server/storage/ From 4b6da4b68507933d291bc99dc81a85a0340b236a Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 15:03:45 +0200 Subject: [PATCH 71/76] Fix myPy issues --- server/app/interfaces/discovery.py | 2 +- server/app/interfaces/registry.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index dc6a721c4..1f7ef7fd7 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -16,7 +16,7 @@ class DiscoveryStore: - def __init__(self): + def __init__(self) -> None: self.aas_id_to_asset_ids: Dict[model.Identifier, Set[model.SpecificAssetId]] = {} self.asset_id_to_aas_ids: Dict[model.SpecificAssetId, Set[model.Identifier]] = {} diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index e74073229..cc842362b 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -66,12 +66,12 @@ def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ server_model.AssetAdministrationShellDescriptor ) - asset_kind = request.args.get("assetKind") - if asset_kind is not None: + asset_kind_str = request.args.get("assetKind") + if asset_kind_str is not None: try: - asset_kind = model.AssetKind[asset_kind] + asset_kind = model.AssetKind[asset_kind_str] except KeyError: - raise BadRequest(f"Invalid assetKind '{asset_kind}', must be one of {list(model.AssetKind.__members__)}") + raise BadRequest(f"Invalid assetKind '{asset_kind_str}', must be one of {list(model.AssetKind.__members__)}") descriptors = filter( lambda desc: desc.asset_kind == asset_kind, descriptors From 75564266675d7820e3caf143bd9adce573654310 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 15:15:13 +0200 Subject: [PATCH 72/76] Fix MyPy errors related to repository.py --- server/app/interfaces/repository.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index c1ee513e5..6928610b4 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -23,7 +23,7 @@ from basyx.aas import model from basyx.aas.adapter import aasx from app.util.converters import IdentifierToBase64URLConverter, IdShortPathConverter, base64url_decode -from .base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder, T +from app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder, T class WSGIApp(ObjectStoreWSGIApp): @@ -167,14 +167,14 @@ def __call__(self, environ, start_response) -> Iterable[bytes]: response: Response = self.handle_request(Request(environ)) return response(environ, start_response) - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._IDENTIFIABLE]) \ - -> model.provider._IDENTIFIABLE: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.Identifiable]) \ + -> model.Identifiable: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") return identifiable - def _get_all_obj_of_type(self, type_: Type[model.provider._IDENTIFIABLE]) -> Iterator[model.provider._IDENTIFIABLE]: + def _get_all_obj_of_type(self, type_: Type[model.Identifiable]) -> Iterator[model.Identifiable]: for obj in self.object_store: if isinstance(obj, type_): yield obj From a93ced26635b23c4423ea71889c784bdedee48c8 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 15:18:55 +0200 Subject: [PATCH 73/76] Fix MyPy errors --- server/app/interfaces/repository.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 6928610b4..e5db4127d 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -167,14 +167,14 @@ def __call__(self, environ, start_response) -> Iterable[bytes]: response: Response = self.handle_request(Request(environ)) return response(environ, start_response) - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.Identifiable]) \ - -> model.Identifiable: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) \ + -> T: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") return identifiable - def _get_all_obj_of_type(self, type_: Type[model.Identifiable]) -> Iterator[model.Identifiable]: + def _get_all_obj_of_type(self, type_: Type[T]) -> Iterator[T]: for obj in self.object_store: if isinstance(obj, type_): yield obj From b3eaf544fb10ad1fe544a67efa6922f5fcbce005 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 15:51:06 +0200 Subject: [PATCH 74/76] Code Style --- server/app/adapter/__init__.py | 2 +- server/app/adapter/jsonization.py | 350 +++++----- server/app/backend/__init__.py | 2 +- server/app/backend/local_file.py | 22 +- server/app/interfaces/__init__.py | 4 +- server/app/interfaces/base.py | 98 +-- server/app/interfaces/discovery.py | 75 +- server/app/interfaces/registry.py | 388 ++++++----- server/app/interfaces/repository.py | 804 ++++++++++++++-------- server/app/model/__init__.py | 2 +- server/app/model/descriptor.py | 83 ++- server/app/model/endpoint.py | 31 +- server/app/model/provider.py | 11 +- server/app/model/service_specification.py | 9 +- server/app/services/run_discovery.py | 4 +- server/app/services/run_registry.py | 71 +- server/app/services/run_repository.py | 42 +- server/app/util/converters.py | 21 +- server/test/backend/test_local_file.py | 41 +- server/test/interfaces/test_repository.py | 23 +- server/test/model/test_provider.py | 35 +- 21 files changed, 1204 insertions(+), 914 deletions(-) diff --git a/server/app/adapter/__init__.py b/server/app/adapter/__init__.py index 7aa9731cc..10c99aa69 100644 --- a/server/app/adapter/__init__.py +++ b/server/app/adapter/__init__.py @@ -1 +1 @@ -from .jsonization import * \ No newline at end of file +from .jsonization import * diff --git a/server/app/adapter/jsonization.py b/server/app/adapter/jsonization.py index ca5fbb9e5..a8ee34710 100644 --- a/server/app/adapter/jsonization.py +++ b/server/app/adapter/jsonization.py @@ -1,22 +1,18 @@ -from typing import Dict, Set, Optional, Type, Callable import logging +from typing import Callable, Dict, Optional, Set, Type from basyx.aas import model -from basyx.aas.adapter._generic import ASSET_KIND_INVERSE, PathOrIO, ASSET_KIND, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES +from basyx.aas.adapter._generic import ASSET_KIND, ASSET_KIND_INVERSE, JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES, PathOrIO from basyx.aas.adapter.json import AASToJsonEncoder -from basyx.aas.adapter.json.json_deserialization import ( - _get_ts, - AASFromJsonDecoder, - read_aas_json_file_into, - ) +from basyx.aas.adapter.json.json_deserialization import AASFromJsonDecoder, _get_ts, read_aas_json_file_into import app.model as server_model logger = logging.getLogger(__name__) JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES = JSON_AAS_TOP_LEVEL_KEYS_TO_TYPES + ( - ('assetAdministrationShellDescriptors', server_model.AssetAdministrationShellDescriptor), - ('submodelDescriptors', server_model.SubmodelDescriptor) + ("assetAdministrationShellDescriptors", server_model.AssetAdministrationShellDescriptor), + ("submodelDescriptors", server_model.SubmodelDescriptor), ) @@ -24,13 +20,15 @@ class ServerAASFromJsonDecoder(AASFromJsonDecoder): @classmethod def _get_aas_class_parsers(cls) -> Dict[str, Callable[[Dict[str, object]], object]]: aas_class_parsers = super()._get_aas_class_parsers() - aas_class_parsers.update({ - 'AssetAdministrationShellDescriptor': cls._construct_asset_administration_shell_descriptor, - 'SubmodelDescriptor': cls._construct_submodel_descriptor, - 'AssetLink': cls._construct_asset_link, - 'ProtocolInformation': cls._construct_protocol_information, - 'Endpoint': cls._construct_endpoint - }) + aas_class_parsers.update( + { + "AssetAdministrationShellDescriptor": cls._construct_asset_administration_shell_descriptor, + "SubmodelDescriptor": cls._construct_submodel_descriptor, + "AssetLink": cls._construct_asset_link, + "ProtocolInformation": cls._construct_protocol_information, + "Endpoint": cls._construct_endpoint, + } + ) return aas_class_parsers # ################################################################################################## @@ -42,150 +40,142 @@ def _amend_abstract_attributes(cls, obj: object, dct: Dict[str, object]) -> None super()._amend_abstract_attributes(obj, dct) if isinstance(obj, server_model.Descriptor): - if 'description' in dct: - obj.description = cls._construct_lang_string_set(_get_ts(dct, 'description', list), - model.MultiLanguageTextType) - if 'displayName' in dct: - obj.display_name = cls._construct_lang_string_set(_get_ts(dct, 'displayName', list), - model.MultiLanguageNameType) - if 'extensions' in dct: - for extension in _get_ts(dct, 'extensions', list): + if "description" in dct: + obj.description = cls._construct_lang_string_set( + _get_ts(dct, "description", list), model.MultiLanguageTextType + ) + if "displayName" in dct: + obj.display_name = cls._construct_lang_string_set( + _get_ts(dct, "displayName", list), model.MultiLanguageNameType + ) + if "extensions" in dct: + for extension in _get_ts(dct, "extensions", list): obj.extension.add(cls._construct_extension(extension)) @classmethod def _construct_asset_administration_shell_descriptor( - cls, dct: Dict[str, object], - object_class=server_model.AssetAdministrationShellDescriptor) -> server_model.AssetAdministrationShellDescriptor: - ret = object_class(id_=_get_ts(dct, 'id', str)) + cls, dct: Dict[str, object], object_class=server_model.AssetAdministrationShellDescriptor + ) -> server_model.AssetAdministrationShellDescriptor: + ret = object_class(id_=_get_ts(dct, "id", str)) cls._amend_abstract_attributes(ret, dct) - if 'administration' in dct: - ret.administration = cls._construct_administrative_information(_get_ts(dct, 'administration', dict)) - if 'assetKind' in dct: - ret.asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, 'assetKind', str)] - if 'assetType' in dct: - ret.asset_type = _get_ts(dct, 'assetType', str) + if "administration" in dct: + ret.administration = cls._construct_administrative_information(_get_ts(dct, "administration", dict)) + if "assetKind" in dct: + ret.asset_kind = ASSET_KIND_INVERSE[_get_ts(dct, "assetKind", str)] + if "assetType" in dct: + ret.asset_type = _get_ts(dct, "assetType", str) global_asset_id = None - if 'globalAssetId' in dct: - ret.global_asset_id = _get_ts(dct, 'globalAssetId', str) + if "globalAssetId" in dct: + ret.global_asset_id = _get_ts(dct, "globalAssetId", str) specific_asset_id = set() - if 'specificAssetIds' in dct: + if "specificAssetIds" in dct: for desc_data in _get_ts(dct, "specificAssetIds", list): specific_asset_id.add(cls._construct_specific_asset_id(desc_data, model.SpecificAssetId)) - if 'endpoints' in dct: - for endpoint_dct in _get_ts(dct, 'endpoints', list): - if 'protocolInformation' in endpoint_dct: - ret.endpoints.append( - cls._construct_endpoint(endpoint_dct, - server_model.Endpoint)) - elif 'href' in endpoint_dct: + if "endpoints" in dct: + for endpoint_dct in _get_ts(dct, "endpoints", list): + if "protocolInformation" in endpoint_dct: + ret.endpoints.append(cls._construct_endpoint(endpoint_dct, server_model.Endpoint)) + elif "href" in endpoint_dct: protocol_info = server_model.ProtocolInformation( - href=_get_ts(endpoint_dct['href'], 'href', str), - endpoint_protocol=_get_ts(endpoint_dct['href'], - 'endpointProtocol', - str) if 'endpointProtocol' in - endpoint_dct[ - 'href'] else None, - endpoint_protocol_version=_get_ts( - endpoint_dct['href'], - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in - endpoint_dct['href'] else None + href=_get_ts(endpoint_dct["href"], "href", str), + endpoint_protocol=( + _get_ts(endpoint_dct["href"], "endpointProtocol", str) + if "endpointProtocol" in endpoint_dct["href"] + else None + ), + endpoint_protocol_version=( + _get_ts(endpoint_dct["href"], "endpointProtocolVersion", list) + if "endpointProtocolVersion" in endpoint_dct["href"] + else None + ), ) - ret.endpoints.append(server_model.Endpoint( - protocol_information=protocol_info, - interface=_get_ts(endpoint_dct, 'interface', - str))) - if 'idShort' in dct: - ret.id_short = _get_ts(dct, 'idShort', str) - if 'submodelDescriptors' in dct: - for sm_dct in _get_ts(dct, 'submodelDescriptors', list): - ret.submodel_descriptors.append(cls._construct_submodel_descriptor( - sm_dct, - server_model.SubmodelDescriptor - )) + ret.endpoints.append( + server_model.Endpoint( + protocol_information=protocol_info, interface=_get_ts(endpoint_dct, "interface", str) + ) + ) + if "idShort" in dct: + ret.id_short = _get_ts(dct, "idShort", str) + if "submodelDescriptors" in dct: + for sm_dct in _get_ts(dct, "submodelDescriptors", list): + ret.submodel_descriptors.append( + cls._construct_submodel_descriptor(sm_dct, server_model.SubmodelDescriptor) + ) return ret @classmethod - def _construct_protocol_information(cls, dct: Dict[str, object], - object_class=server_model.ProtocolInformation) -> server_model.ProtocolInformation: + def _construct_protocol_information( + cls, dct: Dict[str, object], object_class=server_model.ProtocolInformation + ) -> server_model.ProtocolInformation: ret = object_class( - href=_get_ts(dct, 'href', str), - endpoint_protocol=_get_ts(dct, 'endpointProtocol', - str) if 'endpointProtocol' in dct else None, - endpoint_protocol_version=_get_ts(dct, - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in dct else None, - subprotocol=_get_ts(dct, 'subprotocol', - str) if 'subprotocol' in dct else None, - subprotocol_body=_get_ts(dct, 'subprotocolBody', - str) if 'subprotocolBody' in dct else None, - subprotocol_body_encoding=_get_ts(dct, - 'subprotocolBodyEncoding', - str) if 'subprotocolBodyEncoding' in dct else None + href=_get_ts(dct, "href", str), + endpoint_protocol=_get_ts(dct, "endpointProtocol", str) if "endpointProtocol" in dct else None, + endpoint_protocol_version=( + _get_ts(dct, "endpointProtocolVersion", list) if "endpointProtocolVersion" in dct else None + ), + subprotocol=_get_ts(dct, "subprotocol", str) if "subprotocol" in dct else None, + subprotocol_body=_get_ts(dct, "subprotocolBody", str) if "subprotocolBody" in dct else None, + subprotocol_body_encoding=( + _get_ts(dct, "subprotocolBodyEncoding", str) if "subprotocolBodyEncoding" in dct else None + ), ) return ret @classmethod - def _construct_endpoint(cls, dct: Dict[str, object], - object_class=server_model.Endpoint) -> server_model.Endpoint: + def _construct_endpoint(cls, dct: Dict[str, object], object_class=server_model.Endpoint) -> server_model.Endpoint: ret = object_class( protocol_information=cls._construct_protocol_information( - _get_ts(dct, 'protocolInformation', dict), - server_model.ProtocolInformation + _get_ts(dct, "protocolInformation", dict), server_model.ProtocolInformation ), - interface=_get_ts(dct, 'interface', - str) + interface=_get_ts(dct, "interface", str), ) cls._amend_abstract_attributes(ret, dct) return ret @classmethod def _construct_submodel_descriptor( - cls, dct: Dict[str, object], - object_class=server_model.SubmodelDescriptor) -> server_model.SubmodelDescriptor: - ret = object_class(id_=_get_ts(dct, 'id', str), - endpoints=[]) + cls, dct: Dict[str, object], object_class=server_model.SubmodelDescriptor + ) -> server_model.SubmodelDescriptor: + ret = object_class(id_=_get_ts(dct, "id", str), endpoints=[]) cls._amend_abstract_attributes(ret, dct) - for endpoint_dct in _get_ts(dct, 'endpoints', list): - if 'protocolInformation' in endpoint_dct: - ret.endpoints.append( - cls._construct_endpoint(endpoint_dct, - server_model.Endpoint)) - elif 'href' in endpoint_dct: + for endpoint_dct in _get_ts(dct, "endpoints", list): + if "protocolInformation" in endpoint_dct: + ret.endpoints.append(cls._construct_endpoint(endpoint_dct, server_model.Endpoint)) + elif "href" in endpoint_dct: protocol_info = server_model.ProtocolInformation( - href=_get_ts(endpoint_dct['href'], 'href', str), - endpoint_protocol=_get_ts(endpoint_dct['href'], - 'endpointProtocol', - str) if 'endpointProtocol' in - endpoint_dct[ - 'href'] else None, - endpoint_protocol_version=_get_ts( - endpoint_dct['href'], - 'endpointProtocolVersion', - list) if 'endpointProtocolVersion' in - endpoint_dct['href'] else None + href=_get_ts(endpoint_dct["href"], "href", str), + endpoint_protocol=( + _get_ts(endpoint_dct["href"], "endpointProtocol", str) + if "endpointProtocol" in endpoint_dct["href"] + else None + ), + endpoint_protocol_version=( + _get_ts(endpoint_dct["href"], "endpointProtocolVersion", list) + if "endpointProtocolVersion" in endpoint_dct["href"] + else None + ), ) - ret.endpoints.append(server_model.Endpoint( - protocol_information=protocol_info, - interface=_get_ts(endpoint_dct, 'interface', - str))) - if 'administration' in dct: - ret.administration = cls._construct_administrative_information( - _get_ts(dct, 'administration', dict)) - if 'idShort' in dct: - ret.id_short = _get_ts(dct, 'idShort', str) - if 'semanticId' in dct: - ret.semantic_id = cls._construct_reference(_get_ts(dct, 'semanticId', dict)) - if 'supplementalSemanticIds' in dct: - for ref in _get_ts(dct, 'supplementalSemanticIds', list): + ret.endpoints.append( + server_model.Endpoint( + protocol_information=protocol_info, interface=_get_ts(endpoint_dct, "interface", str) + ) + ) + if "administration" in dct: + ret.administration = cls._construct_administrative_information(_get_ts(dct, "administration", dict)) + if "idShort" in dct: + ret.id_short = _get_ts(dct, "idShort", str) + if "semanticId" in dct: + ret.semantic_id = cls._construct_reference(_get_ts(dct, "semanticId", dict)) + if "supplementalSemanticIds" in dct: + for ref in _get_ts(dct, "supplementalSemanticIds", list): ret.supplemental_semantic_id.append(cls._construct_reference(ref)) return ret @classmethod def _construct_asset_link( - cls, dct: Dict[str, object], object_class=server_model.AssetLink) -> server_model.AssetLink: - ret = object_class(name=_get_ts(dct, 'name', str), - value=_get_ts(dct, 'value', str)) + cls, dct: Dict[str, object], object_class=server_model.AssetLink + ) -> server_model.AssetLink: + ret = object_class(name=_get_ts(dct, "name", str), value=_get_ts(dct, "value", str)) return ret @@ -197,6 +187,7 @@ class ServerStrictAASFromJsonDecoder(ServerAASFromJsonDecoder): This version has set ``failsafe = False``, which will lead to Exceptions raised for every missing attribute or wrong object type. """ + failsafe = False @@ -204,6 +195,7 @@ class ServerStrippedAASFromJsonDecoder(ServerAASFromJsonDecoder): """ Decoder for stripped JSON objects. Used in the HTTP adapter. """ + stripped = True @@ -211,16 +203,29 @@ class ServerStrictStrippedAASFromJsonDecoder(ServerStrictAASFromJsonDecoder, Ser """ Non-failsafe decoder for stripped JSON objects. """ + pass -def read_server_aas_json_file_into(object_store: model.AbstractObjectStore, file: PathOrIO, - replace_existing: bool = False, - ignore_existing: bool = False, failsafe: bool = True, stripped: bool = False, - decoder: Optional[Type[AASFromJsonDecoder]] = None) -> Set[model.Identifier]: - return read_aas_json_file_into(object_store=object_store, file=file, replace_existing=replace_existing, - ignore_existing=ignore_existing, failsafe=failsafe, stripped=stripped, - decoder=decoder, keys_to_types=JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES) +def read_server_aas_json_file_into( + object_store: model.AbstractObjectStore, + file: PathOrIO, + replace_existing: bool = False, + ignore_existing: bool = False, + failsafe: bool = True, + stripped: bool = False, + decoder: Optional[Type[AASFromJsonDecoder]] = None, +) -> Set[model.Identifier]: + return read_aas_json_file_into( + object_store=object_store, + file=file, + replace_existing=replace_existing, + ignore_existing=ignore_existing, + failsafe=failsafe, + stripped=stripped, + decoder=decoder, + keys_to_types=JSON_SERVER_AAS_TOP_LEVEL_KEYS_TO_TYPES, + ) class ServerAASToJsonEncoder(AASToJsonEncoder): @@ -228,13 +233,15 @@ class ServerAASToJsonEncoder(AASToJsonEncoder): @classmethod def _get_aas_class_serializers(cls) -> Dict[Type, Callable]: serializers = super()._get_aas_class_serializers() - serializers.update({ - server_model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, - server_model.SubmodelDescriptor: cls._submodel_descriptor_to_json, - server_model.Endpoint: cls._endpoint_to_json, - server_model.ProtocolInformation: cls._protocol_information_to_json, - server_model.AssetLink: cls._asset_link_to_json - }) + serializers.update( + { + server_model.AssetAdministrationShellDescriptor: cls._asset_administration_shell_descriptor_to_json, + server_model.SubmodelDescriptor: cls._submodel_descriptor_to_json, + server_model.Endpoint: cls._endpoint_to_json, + server_model.ProtocolInformation: cls._protocol_information_to_json, + server_model.AssetLink: cls._asset_link_to_json, + } + ) return serializers @classmethod @@ -242,16 +249,17 @@ def _abstract_classes_to_json(cls, obj: object) -> Dict[str, object]: data: Dict[str, object] = super()._abstract_classes_to_json(obj) if isinstance(obj, server_model.Descriptor): if obj.description: - data['description'] = obj.description + data["description"] = obj.description if obj.display_name: - data['displayName'] = obj.display_name + data["displayName"] = obj.display_name if obj.extension: - data['extensions'] = list(obj.extension) + data["extensions"] = list(obj.extension) return data @classmethod - def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetAdministrationShellDescriptor) -> \ - Dict[str, object]: + def _asset_administration_shell_descriptor_to_json( + cls, obj: server_model.AssetAdministrationShellDescriptor + ) -> Dict[str, object]: """ serialization of an object from class AssetAdministrationShell to json @@ -260,50 +268,47 @@ def _asset_administration_shell_descriptor_to_json(cls, obj: server_model.AssetA """ data = cls._abstract_classes_to_json(obj) data.update(cls._namespace_to_json(obj)) - data['id'] = obj.id + data["id"] = obj.id if obj.administration: - data['administration'] = obj.administration + data["administration"] = obj.administration if obj.asset_kind: - data['assetKind'] = ASSET_KIND[obj.asset_kind] + data["assetKind"] = ASSET_KIND[obj.asset_kind] if obj.asset_type: - data['assetType'] = obj.asset_type + data["assetType"] = obj.asset_type if obj.global_asset_id: - data['globalAssetId'] = obj.global_asset_id + data["globalAssetId"] = obj.global_asset_id if obj.specific_asset_id: - data['specificAssetIds'] = list(obj.specific_asset_id) + data["specificAssetIds"] = list(obj.specific_asset_id) if obj.endpoints: - data['endpoints'] = list(obj.endpoints) + data["endpoints"] = list(obj.endpoints) if obj.id_short: - data['idShort'] = obj.id_short + data["idShort"] = obj.id_short if obj.submodel_descriptors: - data['submodelDescriptors'] = list(obj.submodel_descriptors) + data["submodelDescriptors"] = list(obj.submodel_descriptors) return data @classmethod - def _protocol_information_to_json(cls, - obj: server_model.ProtocolInformation) -> \ - Dict[str, object]: + def _protocol_information_to_json(cls, obj: server_model.ProtocolInformation) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) - data['href'] = obj.href + data["href"] = obj.href if obj.endpoint_protocol: - data['endpointProtocol'] = obj.endpoint_protocol + data["endpointProtocol"] = obj.endpoint_protocol if obj.endpoint_protocol_version: - data['endpointProtocolVersion'] = obj.endpoint_protocol_version + data["endpointProtocolVersion"] = obj.endpoint_protocol_version if obj.subprotocol: - data['subprotocol'] = obj.subprotocol + data["subprotocol"] = obj.subprotocol if obj.subprotocol_body: - data['subprotocolBody'] = obj.subprotocol_body + data["subprotocolBody"] = obj.subprotocol_body if obj.subprotocol_body_encoding: - data['subprotocolBodyEncoding'] = obj.subprotocol_body_encoding + data["subprotocolBodyEncoding"] = obj.subprotocol_body_encoding return data @classmethod def _endpoint_to_json(cls, obj: server_model.Endpoint) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) - data['protocolInformation'] = cls._protocol_information_to_json( - obj.protocol_information) - data['interface'] = obj.interface + data["protocolInformation"] = cls._protocol_information_to_json(obj.protocol_information) + data["interface"] = obj.interface return data @classmethod @@ -315,22 +320,21 @@ def _submodel_descriptor_to_json(cls, obj: server_model.SubmodelDescriptor) -> D :return: dict with the serialized attributes of this object """ data = cls._abstract_classes_to_json(obj) - data['id'] = obj.id - data['endpoints'] = [cls._endpoint_to_json(ep) for ep in - obj.endpoints] + data["id"] = obj.id + data["endpoints"] = [cls._endpoint_to_json(ep) for ep in obj.endpoints] if obj.id_short: - data['idShort'] = obj.id_short + data["idShort"] = obj.id_short if obj.administration: - data['administration'] = obj.administration + data["administration"] = obj.administration if obj.semantic_id: - data['semanticId'] = obj.semantic_id + data["semanticId"] = obj.semantic_id if obj.supplemental_semantic_id: - data['supplementalSemanticIds'] = list(obj.supplemental_semantic_id) + data["supplementalSemanticIds"] = list(obj.supplemental_semantic_id) return data @classmethod def _asset_link_to_json(cls, obj: server_model.AssetLink) -> Dict[str, object]: data = cls._abstract_classes_to_json(obj) - data['name'] = obj.name - data['value'] = obj.value + data["name"] = obj.name + data["value"] = obj.value return data diff --git a/server/app/backend/__init__.py b/server/app/backend/__init__.py index f6cd30176..a58825fbb 100644 --- a/server/app/backend/__init__.py +++ b/server/app/backend/__init__.py @@ -1 +1 @@ -from .local_file import * \ No newline at end of file +from .local_file import * diff --git a/server/app/backend/local_file.py b/server/app/backend/local_file.py index 34f265ba4..e55c08e6b 100644 --- a/server/app/backend/local_file.py +++ b/server/app/backend/local_file.py @@ -1,18 +1,16 @@ -from typing import Iterator, Dict, Type, Union -import logging +import hashlib import json +import logging import os -import hashlib import threading import weakref +from typing import Dict, Iterator, Type, Union -from app.model import AssetAdministrationShellDescriptor, SubmodelDescriptor from basyx.aas import model from basyx.aas.model import provider as sdk_provider -from app.model import descriptor from app.adapter import jsonization - +from app.model import AssetAdministrationShellDescriptor, SubmodelDescriptor, descriptor logger = logging.getLogger(__name__) @@ -31,6 +29,7 @@ class LocalFileDescriptorStore(sdk_provider.AbstractObjectStore[model.Identifier An ObjectStore implementation for :class:`~app.model.descriptor.Descriptor` BaSyx Python SDK objects backed by a local file based local backend """ + def __init__(self, directory_path: str): """ Initializer of class LocalFileDescriptorStore @@ -44,8 +43,9 @@ def __init__(self, directory_path: str): # local replication of each object is kept in the application and retrieving an object from the store always # returns the **same** (not only equal) object. Still, objects are forgotten, when they are not referenced # anywhere else to save memory. - self._object_cache: weakref.WeakValueDictionary[model.Identifier, _DESCRIPTOR_TYPE] \ - = weakref.WeakValueDictionary() + self._object_cache: weakref.WeakValueDictionary[model.Identifier, _DESCRIPTOR_TYPE] = ( + weakref.WeakValueDictionary() + ) self._object_cache_lock = threading.Lock() def check_directory(self, create=False): @@ -107,9 +107,7 @@ def add(self, x: _DESCRIPTOR_TYPE) -> None: # Usually, we don't need to serialize the modelType, since during HTTP requests, we know exactly if this # is an AASDescriptor or SubmodelDescriptor. However, here we cannot distinguish them, so to deserialize # them successfully, we hack the `modelType` into the JSON. - serialized = json.loads( - json.dumps(x, cls=jsonization.ServerAASToJsonEncoder) - ) + serialized = json.loads(json.dumps(x, cls=jsonization.ServerAASToJsonEncoder)) serialized["modelType"] = DESCRIPTOR_TYPE_TO_STRING[type(x)] json.dump(serialized, file, indent=4) with self._object_cache_lock: @@ -173,4 +171,4 @@ def _transform_id(identifier: model.Identifier) -> str: """ Helper method to represent an ASS Identifier as a string to be used as Local file document id """ - return hashlib.sha256(identifier.encode("utf-8")).hexdigest() \ No newline at end of file + return hashlib.sha256(identifier.encode("utf-8")).hexdigest() diff --git a/server/app/interfaces/__init__.py b/server/app/interfaces/__init__.py index 975f2b542..a7d6a55d9 100644 --- a/server/app/interfaces/__init__.py +++ b/server/app/interfaces/__init__.py @@ -1,4 +1,4 @@ from .base import * -from .registry import * from .discovery import * -from .repository import * \ No newline at end of file +from .registry import * +from .repository import * diff --git a/server/app/interfaces/base.py b/server/app/interfaces/base.py index 859f62959..8868dd7f3 100644 --- a/server/app/interfaces/base.py +++ b/server/app/interfaces/base.py @@ -10,27 +10,24 @@ import io import itertools import json -from typing import Iterable, Type, Iterator, Tuple, Optional, List, Union, Dict, Callable, TypeVar, Any +from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Tuple, Type, TypeVar, Union import werkzeug.exceptions import werkzeug.routing import werkzeug.utils +from basyx.aas import model +from basyx.aas.adapter._generic import XML_NS_MAP +from basyx.aas.adapter.xml import XMLConstructables, read_aas_xml_element, xml_serialization +from basyx.aas.model import AbstractObjectStore from lxml import etree -from werkzeug import Response, Request -from werkzeug.exceptions import NotFound, BadRequest +from werkzeug import Request, Response +from werkzeug.exceptions import BadRequest, NotFound from werkzeug.routing import MapAdapter import app.model -from basyx.aas import model -from basyx.aas.adapter._generic import XML_NS_MAP -from app.adapter import ServerStrictStrippedAASFromJsonDecoder, ServerStrictAASFromJsonDecoder, ServerAASToJsonEncoder -from basyx.aas.adapter.xml import xml_serialization, XMLConstructables, read_aas_xml_element -from basyx.aas.model import AbstractObjectStore +from app.adapter import ServerAASToJsonEncoder, ServerStrictAASFromJsonDecoder, ServerStrictStrippedAASFromJsonDecoder +from app.model import AssetAdministrationShellDescriptor, AssetLink, SubmodelDescriptor from app.util.converters import base64url_decode -from app.model import AssetLink, AssetAdministrationShellDescriptor, SubmodelDescriptor -from app.model.provider import _DESCRIPTOR_TYPE - - T = TypeVar("T") @@ -48,13 +45,19 @@ def __str__(self): class Message: - def __init__(self, code: str, text: str, message_type: MessageType = MessageType.UNDEFINED, - timestamp: Optional[datetime.datetime] = None): + def __init__( + self, + code: str, + text: str, + message_type: MessageType = MessageType.UNDEFINED, + timestamp: Optional[datetime.datetime] = None, + ): self.code: str = code self.text: str = text self.message_type: MessageType = message_type - self.timestamp: datetime.datetime = timestamp if timestamp is not None \ - else datetime.datetime.now(datetime.timezone.utc) + self.timestamp: datetime.datetime = ( + timestamp if timestamp is not None else datetime.datetime.now(datetime.timezone.utc) + ) class Result: @@ -70,8 +73,9 @@ def __init__(self, success: bool, messages: Optional[List[Message]] = None): class APIResponse(abc.ABC, Response): @abc.abstractmethod - def __init__(self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, - stripped: bool = False, *args, **kwargs): + def __init__( + self, obj: Optional[ResponseData] = None, cursor: Optional[int] = None, stripped: bool = False, *args, **kwargs + ): super().__init__(*args, **kwargs) if obj is None: self.status_code = 204 @@ -91,14 +95,9 @@ def serialize(self, obj: ResponseData, cursor: Optional[int], stripped: bool) -> if cursor is None: data = obj else: - data = { - "paging_metadata": {"cursor": str(cursor)}, - "result": obj - } + data = {"paging_metadata": {"cursor": str(cursor)}, "result": obj} return json.dumps( - data, - cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, - separators=(",", ":") + data, cls=StrippedResultToJsonEncoder if stripped else ResultToJsonEncoder, separators=(",", ":") ) @@ -166,10 +165,7 @@ def __init__(self, *args, content_type="text/xml", **kwargs): class ResultToJsonEncoder(ServerAASToJsonEncoder): @classmethod def _result_to_json(cls, result: Result) -> Dict[str, object]: - return { - "success": result.success, - "messages": result.messages - } + return {"success": result.success, "messages": result.messages} @classmethod def _message_to_json(cls, message: Message) -> Dict[str, object]: @@ -177,7 +173,7 @@ def _message_to_json(cls, message: Message) -> Dict[str, object]: "messageType": message.message_type, "text": message.text, "code": message.code, - "timestamp": message.timestamp.isoformat() + "timestamp": message.timestamp.isoformat(), } def default(self, obj: object) -> object: @@ -204,8 +200,8 @@ def __call__(self, environ, start_response) -> Iterable[bytes]: @classmethod def _get_slice(cls, request: Request, iterator: Iterable[T]) -> Tuple[Iterator[T], int]: - limit_str = request.args.get('limit', default="10") - cursor_str = request.args.get('cursor', default="1") + limit_str = request.args.get("limit", default="10") + cursor_str = request.args.get("cursor", default="1") try: limit, cursor = int(limit_str), int(cursor_str) - 1 # cursor is 1-indexed if limit < 0 or cursor < 0: @@ -238,27 +234,31 @@ def get_response_type(request: Request) -> Type[APIResponse]: response_types: Dict[str, Type[APIResponse]] = { "application/json": JsonResponse, "application/xml": XmlResponse, - "text/xml": XmlResponseAlt + "text/xml": XmlResponseAlt, } if len(request.accept_mimetypes) == 0 or request.accept_mimetypes.best in (None, "*/*"): return JsonResponse mime_type = request.accept_mimetypes.best_match(response_types) if mime_type is None: - raise werkzeug.exceptions.NotAcceptable("This server supports the following content types: " - + ", ".join(response_types.keys())) + raise werkzeug.exceptions.NotAcceptable( + "This server supports the following content types: " + ", ".join(response_types.keys()) + ) return response_types[mime_type] @staticmethod - def http_exception_to_response(exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse]) \ - -> APIResponse: + def http_exception_to_response( + exception: werkzeug.exceptions.HTTPException, response_type: Type[APIResponse] + ) -> APIResponse: headers = exception.get_headers() location = exception.get_response().location if location is not None: headers.append(("Location", location)) if exception.code and exception.code >= 400: - message = Message(type(exception).__name__, - exception.description if exception.description is not None else "", - MessageType.ERROR) + message = Message( + type(exception).__name__, + exception.description if exception.description is not None else "", + MessageType.ERROR, + ) result = Result(False, [message]) else: result = Result(False) @@ -273,13 +273,13 @@ def _get_all_obj_of_type(self, type_: Type[T]) -> Iterator[T]: if isinstance(obj, type_): yield obj - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) \ - -> T: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) -> T: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") return identifiable + class HTTPApiDecoder: # these are the types we can construct (well, only the ones we need) type_constructables_map = { @@ -313,8 +313,9 @@ def assert_type(cls, obj: object, type_: Type[T]) -> T: @classmethod def json_list(cls, data: Union[str, bytes], expect_type: Type[T], stripped: bool, expect_single: bool) -> List[T]: cls.check_type_support(expect_type) - decoder: Type[ServerStrictAASFromJsonDecoder] = ServerStrictStrippedAASFromJsonDecoder if stripped \ - else ServerStrictAASFromJsonDecoder + decoder: Type[ServerStrictAASFromJsonDecoder] = ( + ServerStrictStrippedAASFromJsonDecoder if stripped else ServerStrictAASFromJsonDecoder + ) try: parsed = json.loads(data, cls=decoder) if isinstance(parsed, list) and expect_single: @@ -371,8 +372,9 @@ def xml(cls, data: bytes, expect_type: Type[T], stripped: bool) -> T: cls.check_type_support(expect_type) try: xml_data = io.BytesIO(data) - rv = read_aas_xml_element(xml_data, cls.type_constructables_map[expect_type], - stripped=stripped, failsafe=False) + rv = read_aas_xml_element( + xml_data, cls.type_constructables_map[expect_type], stripped=stripped, failsafe=False + ) except (KeyError, ValueError) as e: # xml deserialization creates an error chain. since we only return one error, return the root cause f: BaseException = e @@ -397,8 +399,8 @@ def request_body(cls, request: Request, expect_type: Type[T], stripped: bool) -> if request.mimetype not in valid_content_types: raise werkzeug.exceptions.UnsupportedMediaType( - f"Invalid content-type: {request.mimetype}! Supported types: " - + ", ".join(valid_content_types)) + f"Invalid content-type: {request.mimetype}! Supported types: " + ", ".join(valid_content_types) + ) if request.mimetype == "application/json": return cls.json(request.get_data(), expect_type, stripped) diff --git a/server/app/interfaces/discovery.py b/server/app/interfaces/discovery.py index 1f7ef7fd7..0506c73c0 100644 --- a/server/app/interfaces/discovery.py +++ b/server/app/interfaces/discovery.py @@ -1,18 +1,19 @@ """ This module implements the Discovery interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. """ + import json from typing import Dict, List, Set import werkzeug.exceptions +from basyx.aas import model from werkzeug.routing import Rule, Submount from werkzeug.wrappers import Request, Response -from basyx.aas import model -from app.util.converters import IdentifierToBase64URLConverter -from app.interfaces.base import BaseWSGIApp, HTTPApiDecoder from app import model as server_model from app.adapter import jsonization +from app.interfaces.base import BaseWSGIApp, HTTPApiDecoder +from app.util.converters import IdentifierToBase64URLConverter class DiscoveryStore: @@ -23,8 +24,7 @@ def __init__(self) -> None: def get_all_specific_asset_ids_by_aas_id(self, aas_id: model.Identifier) -> List[model.SpecificAssetId]: return list(self.aas_id_to_asset_ids.get(aas_id, set())) - def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, - asset_ids: List[model.SpecificAssetId]) -> None: + def add_specific_asset_ids_to_aas(self, aas_id: model.Identifier, asset_ids: List[model.SpecificAssetId]) -> None: if aas_id not in self.aas_id_to_asset_ids: self.aas_id_to_asset_ids[aas_id] = set() @@ -82,28 +82,44 @@ def to_file(self, filename: str) -> None: class DiscoveryAPI(BaseWSGIApp): - def __init__(self, - persistent_store: DiscoveryStore, base_path: str = "/api/v3.1.1"): + def __init__(self, persistent_store: DiscoveryStore, base_path: str = "/api/v3.1.1"): self.persistent_store: DiscoveryStore = persistent_store - self.url_map = werkzeug.routing.Map([ - Submount(base_path, [ - Rule("/lookup/shellsByAssetLink", methods=["POST"], - endpoint=self.search_all_aas_ids_by_asset_link), - Submount("/lookup/shells", [ - Rule("/", methods=["GET"], - endpoint=self.get_all_specific_asset_ids_by_aas_id), - Rule("/", methods=["POST"], - endpoint=self.post_all_asset_links_by_id), - Rule("/", methods=["DELETE"], - endpoint=self.delete_all_asset_links_by_id), - ]), - ]) - ], converters={ - "base64url": IdentifierToBase64URLConverter - }, strict_slashes=False) - - def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, response_t: type, - **_kwargs) -> Response: + self.url_map = werkzeug.routing.Map( + [ + Submount( + base_path, + [ + Rule( + "/lookup/shellsByAssetLink", + methods=["POST"], + endpoint=self.search_all_aas_ids_by_asset_link, + ), + Submount( + "/lookup/shells", + [ + Rule( + "/", + methods=["GET"], + endpoint=self.get_all_specific_asset_ids_by_aas_id, + ), + Rule("/", methods=["POST"], endpoint=self.post_all_asset_links_by_id), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_all_asset_links_by_id, + ), + ], + ), + ], + ) + ], + converters={"base64url": IdentifierToBase64URLConverter}, + strict_slashes=False, + ) + + def search_all_aas_ids_by_asset_link( + self, request: Request, url_args: dict, response_t: type, **_kwargs + ) -> Response: asset_links = HTTPApiDecoder.request_body_list(request, server_model.AssetLink, False) matching_aas_keys = set() for asset_link in asset_links: @@ -112,7 +128,9 @@ def search_all_aas_ids_by_asset_link(self, request: Request, url_args: dict, res paginated_slice, cursor = self._get_slice(request, list(matching_aas_keys)) return response_t(list(paginated_slice), cursor=cursor) - def get_all_specific_asset_ids_by_aas_id(self, request: Request, url_args: dict, response_t: type, **_kwargs) -> Response: + def get_all_specific_asset_ids_by_aas_id( + self, request: Request, url_args: dict, response_t: type, **_kwargs + ) -> Response: aas_identifier = str(url_args["aas_id"]) asset_ids = self.persistent_store.get_all_specific_asset_ids_by_aas_id(aas_identifier) return response_t(asset_ids) @@ -137,5 +155,4 @@ def delete_all_asset_links_by_id(self, request: Request, url_args: dict, respons if __name__ == "__main__": from werkzeug.serving import run_simple - run_simple("localhost", 8084, DiscoveryAPI(DiscoveryStore()), - use_debugger=True, use_reloader=True) + run_simple("localhost", 8084, DiscoveryAPI(DiscoveryStore()), use_debugger=True, use_reloader=True) diff --git a/server/app/interfaces/registry.py b/server/app/interfaces/registry.py index cc842362b..19dbc3234 100644 --- a/server/app/interfaces/registry.py +++ b/server/app/interfaces/registry.py @@ -2,65 +2,111 @@ This module implements the Registry interface defined in the 'Specification of the Asset Administration Shell Part 2 – Application Programming Interface'. """ -from typing import Dict, Iterator, Type, Tuple +from typing import Dict, Iterator, Tuple, Type import werkzeug.exceptions import werkzeug.routing import werkzeug.urls import werkzeug.utils -from werkzeug.exceptions import Conflict, NotFound, BadRequest +from basyx.aas import model +from werkzeug.exceptions import BadRequest, Conflict, NotFound from werkzeug.routing import MapAdapter, Rule, Submount from werkzeug.wrappers import Request, Response -from basyx.aas import model import app.model as server_model -from app.util.converters import IdentifierToBase64URLConverter, base64url_decode -from app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder +from app.interfaces.base import APIResponse, HTTPApiDecoder, ObjectStoreWSGIApp, is_stripped_request from app.model import DictDescriptorStore +from app.util.converters import IdentifierToBase64URLConverter, base64url_decode class RegistryAPI(ObjectStoreWSGIApp): def __init__(self, object_store: model.AbstractObjectStore, base_path: str = "/api/v3.1.1"): self.object_store: model.AbstractObjectStore = object_store - self.url_map = werkzeug.routing.Map([ - Submount(base_path, [ - Rule("/description", methods=["GET"], endpoint=self.get_self_description), - Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_all_aas_descriptors), - Rule("/shell-descriptors", methods=["POST"], endpoint=self.post_aas_descriptor), - Submount("/shell-descriptors", [ - Rule("/", methods=["GET"], endpoint=self.get_aas_descriptor_by_id), - Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor_by_id), - Rule("/", methods=["DELETE"], endpoint=self.delete_aas_descriptor_by_id), - Submount("/", [ - Rule("/submodel-descriptors", methods=["GET"], - endpoint=self.get_all_submodel_descriptors_through_superpath), - Rule("/submodel-descriptors", methods=["POST"], - endpoint=self.post_submodel_descriptor_through_superpath), - Submount("/submodel-descriptors", [ - Rule("/", methods=["GET"], - endpoint=self.get_submodel_descriptor_by_id_through_superpath), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_descriptor_by_id_through_superpath), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_descriptor_by_id_through_superpath), - ]) - ]) - ]), - Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors), - Rule("/submodel-descriptors", methods=["POST"], endpoint=self.post_submodel_descriptor), - Submount("/submodel-descriptors", [ - Rule("/", methods=["GET"], endpoint=self.get_submodel_descriptor_by_id), - Rule("/", methods=["PUT"], endpoint=self.put_submodel_descriptor_by_id), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_descriptor_by_id), - ]) - ]) - ], converters={ - "base64url": IdentifierToBase64URLConverter - }, strict_slashes=False) - - def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ - Iterator[server_model.AssetAdministrationShellDescriptor], int]: + self.url_map = werkzeug.routing.Map( + [ + Submount( + base_path, + [ + Rule("/description", methods=["GET"], endpoint=self.get_self_description), + Rule("/shell-descriptors", methods=["GET"], endpoint=self.get_all_aas_descriptors), + Rule("/shell-descriptors", methods=["POST"], endpoint=self.post_aas_descriptor), + Submount( + "/shell-descriptors", + [ + Rule("/", methods=["GET"], endpoint=self.get_aas_descriptor_by_id), + Rule("/", methods=["PUT"], endpoint=self.put_aas_descriptor_by_id), + Rule( + "/", methods=["DELETE"], endpoint=self.delete_aas_descriptor_by_id + ), + Submount( + "/", + [ + Rule( + "/submodel-descriptors", + methods=["GET"], + endpoint=self.get_all_submodel_descriptors_through_superpath, + ), + Rule( + "/submodel-descriptors", + methods=["POST"], + endpoint=self.post_submodel_descriptor_through_superpath, + ), + Submount( + "/submodel-descriptors", + [ + Rule( + "/", + methods=["GET"], + endpoint=self.get_submodel_descriptor_by_id_through_superpath, + ), + Rule( + "/", + methods=["PUT"], + endpoint=self.put_submodel_descriptor_by_id_through_superpath, + ), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_submodel_descriptor_by_id_through_superpath, + ), + ], + ), + ], + ), + ], + ), + Rule("/submodel-descriptors", methods=["GET"], endpoint=self.get_all_submodel_descriptors), + Rule("/submodel-descriptors", methods=["POST"], endpoint=self.post_submodel_descriptor), + Submount( + "/submodel-descriptors", + [ + Rule( + "/", + methods=["GET"], + endpoint=self.get_submodel_descriptor_by_id, + ), + Rule( + "/", + methods=["PUT"], + endpoint=self.put_submodel_descriptor_by_id, + ), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_submodel_descriptor_by_id, + ), + ], + ), + ], + ) + ], + converters={"base64url": IdentifierToBase64URLConverter}, + strict_slashes=False, + ) + + def _get_all_aas_descriptors( + self, request: "Request" + ) -> Tuple[Iterator[server_model.AssetAdministrationShellDescriptor], int]: descriptors: Iterator[server_model.AssetAdministrationShellDescriptor] = self._get_all_obj_of_type( server_model.AssetAdministrationShellDescriptor @@ -71,11 +117,11 @@ def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ try: asset_kind = model.AssetKind[asset_kind_str] except KeyError: - raise BadRequest(f"Invalid assetKind '{asset_kind_str}', must be one of {list(model.AssetKind.__members__)}") - descriptors = filter( - lambda desc: desc.asset_kind == asset_kind, - descriptors - ) + raise BadRequest( + f"Invalid assetKind '{asset_kind_str}', " + f"must be one of {list(model.AssetKind.__members__)}" + ) + descriptors = filter(lambda desc: desc.asset_kind == asset_kind, descriptors) asset_type = request.args.get("assetType") if asset_type is not None: @@ -84,10 +130,7 @@ def _get_all_aas_descriptors(self, request: "Request") -> Tuple[ asset_type = model.Identifier(asset_type) except Exception: raise BadRequest(f"Invalid assetType: '{asset_type}'") - descriptors = filter( - lambda desc: desc.asset_type == asset_type, - descriptors - ) + descriptors = filter(lambda desc: desc.asset_type == asset_type, descriptors) paginated_descriptors, end_index = self._get_slice(request, descriptors) return paginated_descriptors, end_index @@ -96,7 +139,9 @@ def _get_aas_descriptor(self, url_args: Dict) -> server_model.AssetAdministratio return self._get_obj_ts(url_args["aas_id"], server_model.AssetAdministrationShellDescriptor) def _get_all_submodel_descriptors(self, request: Request) -> Tuple[Iterator[server_model.SubmodelDescriptor], int]: - submodel_descriptors: Iterator[server_model.SubmodelDescriptor] = self._get_all_obj_of_type(server_model.SubmodelDescriptor) + submodel_descriptors: Iterator[server_model.SubmodelDescriptor] = self._get_all_obj_of_type( + server_model.SubmodelDescriptor + ) paginated_submodel_descriptors, end_index = self._get_slice(request, submodel_descriptors) return paginated_submodel_descriptors, end_index @@ -104,164 +149,144 @@ def _get_submodel_descriptor(self, url_args: Dict) -> server_model.SubmodelDescr return self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor) # ------ COMMON ROUTES ------- - def get_self_description(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: - service_description = server_model.ServiceDescription(profiles=[ - server_model.ServiceSpecificationProfileEnum.AAS_REGISTRY_FULL, - server_model.ServiceSpecificationProfileEnum.AAS_REGISTRY_READ, - server_model.ServiceSpecificationProfileEnum.SUBMODEL_REGISTRY_FULL, - server_model.ServiceSpecificationProfileEnum.SUBMODEL_REGISTRY_READ - ]) + def get_self_description( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: + service_description = server_model.ServiceDescription( + profiles=[ + server_model.ServiceSpecificationProfileEnum.AAS_REGISTRY_FULL, + server_model.ServiceSpecificationProfileEnum.AAS_REGISTRY_READ, + server_model.ServiceSpecificationProfileEnum.SUBMODEL_REGISTRY_FULL, + server_model.ServiceSpecificationProfileEnum.SUBMODEL_REGISTRY_READ, + ] + ) return response_t(service_description.to_dict()) # ------ AAS REGISTRY ROUTES ------- - def get_all_aas_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_all_aas_descriptors( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas_descriptors, cursor = self._get_all_aas_descriptors(request) return response_t(list(aas_descriptors), cursor=cursor) - def post_aas_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: + def post_aas_descriptor( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) try: self.object_store.add(descriptor) except KeyError as e: raise Conflict(f"AssetAdministrationShellDescriptor with Identifier {descriptor.id} already exists!") from e descriptor.commit() - created_resource_url = map_adapter.build(self.get_aas_descriptor_by_id, { - "aas_id": descriptor.id - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_aas_descriptor_by_id, {"aas_id": descriptor.id}, force_external=True + ) return response_t(descriptor, status=201, headers={"Location": created_resource_url}) - def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_aas_descriptor_by_id( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: descriptor = self._get_aas_descriptor(url_args) return response_t(descriptor) - def put_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter, **_kwargs) -> Response: + def put_aas_descriptor_by_id( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter, **_kwargs + ) -> Response: try: descriptor = self._get_aas_descriptor(url_args) - descriptor.update_from(HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, - is_stripped_request(request))) + descriptor.update_from( + HTTPApiDecoder.request_body( + request, server_model.AssetAdministrationShellDescriptor, is_stripped_request(request) + ) + ) descriptor.commit() return response_t() except NotFound: descriptor = HTTPApiDecoder.request_body(request, server_model.AssetAdministrationShellDescriptor, False) self.object_store.add(descriptor) descriptor.commit() - created_resource_url = map_adapter.build(self.get_aas_descriptor_by_id, { - "aas_id": descriptor.id - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_aas_descriptor_by_id, {"aas_id": descriptor.id}, force_external=True + ) return response_t(descriptor, status=201, headers={"Location": created_resource_url}) - def delete_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_aas_descriptor_by_id( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: descriptor = self._get_aas_descriptor(url_args) self.object_store.remove(descriptor) return response_t() - def get_all_submodel_descriptors_through_superpath(self, - request: Request, - url_args: Dict, - response_t: Type[ - APIResponse], - **_kwargs) -> Response: + def get_all_submodel_descriptors_through_superpath( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) - submodel_descriptors, cursor = self._get_slice(request, - aas_descriptor.submodel_descriptors) + submodel_descriptors, cursor = self._get_slice(request, aas_descriptor.submodel_descriptors) return response_t(list(submodel_descriptors), cursor=cursor) - def get_submodel_descriptor_by_id_through_superpath(self, - request: Request, - url_args: Dict, - response_t: - Type[ - APIResponse], - **_kwargs) -> Response: + def get_submodel_descriptor_by_id_through_superpath( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) submodel_id = url_args["submodel_id"] - submodel_descriptor = next( - (sd for sd in aas_descriptor.submodel_descriptors if - sd.id == submodel_id), None) + submodel_descriptor = next((sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) if submodel_descriptor is None: - raise NotFound( - f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + raise NotFound(f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") return response_t(submodel_descriptor) - def post_submodel_descriptor_through_superpath(self, - request: Request, - url_args: Dict, - response_t: Type[ - APIResponse], - map_adapter: MapAdapter) -> Response: + def post_submodel_descriptor_through_superpath( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) - submodel_descriptor = HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, - is_stripped_request( - request)) - if any(sd.id == submodel_descriptor.id for sd in - aas_descriptor.submodel_descriptors): - raise Conflict( - f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") + submodel_descriptor = HTTPApiDecoder.request_body( + request, server_model.SubmodelDescriptor, is_stripped_request(request) + ) + if any(sd.id == submodel_descriptor.id for sd in aas_descriptor.submodel_descriptors): + raise Conflict(f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") aas_descriptor.submodel_descriptors.append(submodel_descriptor) aas_descriptor.commit() created_resource_url = map_adapter.build( - self.get_submodel_descriptor_by_id_through_superpath, { - "aas_id": aas_descriptor.id, - "submodel_id": submodel_descriptor.id - }, force_external=True) - return response_t(submodel_descriptor, status=201, - headers={"Location": created_resource_url}) - - def put_submodel_descriptor_by_id_through_superpath(self, - request: Request, - url_args: Dict, - response_t: - Type[ - APIResponse], - map_adapter: MapAdapter, **_kwargs) -> Response: + self.get_submodel_descriptor_by_id_through_superpath, + {"aas_id": aas_descriptor.id, "submodel_id": submodel_descriptor.id}, + force_external=True, + ) + return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) + + def put_submodel_descriptor_by_id_through_superpath( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter, **_kwargs + ) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) try: submodel_id = url_args["submodel_id"] - submodel_descriptor = next( - (sd for sd in aas_descriptor.submodel_descriptors if - sd.id == submodel_id), None) + submodel_descriptor = next((sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) if submodel_descriptor is None: raise NotFound( - f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") + f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!" + ) submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, - is_stripped_request(request))) + HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request)) + ) aas_descriptor.commit() return response_t() except NotFound: - submodel_descriptor = HTTPApiDecoder.request_body(request, - server_model.SubmodelDescriptor, - is_stripped_request( - request)) + submodel_descriptor = HTTPApiDecoder.request_body( + request, server_model.SubmodelDescriptor, is_stripped_request(request) + ) aas_descriptor.submodel_descriptors.append(submodel_descriptor) aas_descriptor.commit() created_resource_url = map_adapter.build( - self.get_submodel_descriptor_by_id_through_superpath, { - "aas_id": aas_descriptor.id, - "submodel_id": submodel_descriptor.id - }, force_external=True) - return response_t(submodel_descriptor, status=201, - headers={"Location": created_resource_url}) - - def delete_submodel_descriptor_by_id_through_superpath(self, - request: Request, - url_args: Dict, - response_t: - Type[ - APIResponse], - **_kwargs) -> Response: + self.get_submodel_descriptor_by_id_through_superpath, + {"aas_id": aas_descriptor.id, "submodel_id": submodel_descriptor.id}, + force_external=True, + ) + return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) + + def delete_submodel_descriptor_by_id_through_superpath( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas_descriptor = self._get_aas_descriptor(url_args) submodel_id = url_args["submodel_id"] - submodel_descriptor = next( - (sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) + submodel_descriptor = next((sd for sd in aas_descriptor.submodel_descriptors if sd.id == submodel_id), None) if submodel_descriptor is None: raise NotFound(f"Submodel Descriptor with Identifier {submodel_id} not found in AssetAdministrationShell!") aas_descriptor.submodel_descriptors.remove(submodel_descriptor) @@ -269,50 +294,58 @@ def delete_submodel_descriptor_by_id_through_superpath(self, return response_t() # ------ Submodel REGISTRY ROUTES ------- - def get_all_submodel_descriptors(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_all_submodel_descriptors( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_descriptors, cursor = self._get_all_submodel_descriptors(request) return response_t(list(submodel_descriptors), cursor=cursor, stripped=is_stripped_request(request)) - def get_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_descriptor_by_id( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_descriptor = self._get_submodel_descriptor(url_args) return response_t(submodel_descriptor, stripped=is_stripped_request(request)) - def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: - submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, - is_stripped_request(request)) + def post_submodel_descriptor( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: + submodel_descriptor = HTTPApiDecoder.request_body( + request, server_model.SubmodelDescriptor, is_stripped_request(request) + ) try: self.object_store.add(submodel_descriptor) except KeyError as e: raise Conflict(f"Submodel Descriptor with Identifier {submodel_descriptor.id} already exists!") from e submodel_descriptor.commit() - created_resource_url = map_adapter.build(self.get_submodel_descriptor_by_id, { - "submodel_id": submodel_descriptor.id - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_submodel_descriptor_by_id, {"submodel_id": submodel_descriptor.id}, force_external=True + ) return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) - def put_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter, **_kwargs) -> Response: + def put_submodel_descriptor_by_id( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter, **_kwargs + ) -> Response: try: submodel_descriptor = self._get_submodel_descriptor(url_args) submodel_descriptor.update_from( - HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request))) + HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, is_stripped_request(request)) + ) submodel_descriptor.commit() return response_t() except NotFound: - submodel_descriptor = HTTPApiDecoder.request_body(request, server_model.SubmodelDescriptor, - is_stripped_request(request)) + submodel_descriptor = HTTPApiDecoder.request_body( + request, server_model.SubmodelDescriptor, is_stripped_request(request) + ) self.object_store.add(submodel_descriptor) submodel_descriptor.commit() - created_resource_url = map_adapter.build(self.get_submodel_descriptor_by_id, { - "submodel_id": submodel_descriptor.id - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_submodel_descriptor_by_id, {"submodel_id": submodel_descriptor.id}, force_external=True + ) return response_t(submodel_descriptor, status=201, headers={"Location": created_resource_url}) - def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_submodel_descriptor_by_id( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: self.object_store.remove(self._get_obj_ts(url_args["submodel_id"], server_model.SubmodelDescriptor)) return response_t() @@ -320,5 +353,4 @@ def delete_submodel_descriptor_by_id(self, request: Request, url_args: Dict, res if __name__ == "__main__": from werkzeug.serving import run_simple - run_simple("localhost", 8083, RegistryAPI(DictDescriptorStore()), - use_debugger=True, use_reloader=True) + run_simple("localhost", 8083, RegistryAPI(DictDescriptorStore()), use_debugger=True, use_reloader=True) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index e5db4127d..0547b0645 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -10,165 +10,342 @@ import io import json -from typing import Type, Iterator, List, Dict, Union, Callable, Tuple, Optional, Iterable +from typing import Callable, Dict, Iterable, Iterator, List, Optional, Tuple, Type, Union import werkzeug.exceptions import werkzeug.routing import werkzeug.utils -from werkzeug import Response, Request -from werkzeug.datastructures import FileStorage -from werkzeug.exceptions import NotFound, BadRequest, Conflict -from werkzeug.routing import Submount, Rule, MapAdapter - from basyx.aas import model from basyx.aas.adapter import aasx +from werkzeug import Request, Response +from werkzeug.datastructures import FileStorage +from werkzeug.exceptions import BadRequest, Conflict, NotFound +from werkzeug.routing import MapAdapter, Rule, Submount + +from app.interfaces.base import APIResponse, HTTPApiDecoder, ObjectStoreWSGIApp, T, is_stripped_request from app.util.converters import IdentifierToBase64URLConverter, IdShortPathConverter, base64url_decode -from app.interfaces.base import ObjectStoreWSGIApp, APIResponse, is_stripped_request, HTTPApiDecoder, T class WSGIApp(ObjectStoreWSGIApp): - def __init__(self, object_store: model.AbstractObjectStore, file_store: aasx.AbstractSupplementaryFileContainer, - base_path: str = "/api/v3.0"): + def __init__( + self, + object_store: model.AbstractObjectStore, + file_store: aasx.AbstractSupplementaryFileContainer, + base_path: str = "/api/v3.0", + ): self.object_store: model.AbstractObjectStore = object_store self.file_store: aasx.AbstractSupplementaryFileContainer = file_store - self.url_map = werkzeug.routing.Map([ - Submount(base_path, [ - Rule("/serialization", methods=["GET"], endpoint=self.not_implemented), - Rule("/description", methods=["GET"], endpoint=self.not_implemented), - Rule("/shells", methods=["GET"], endpoint=self.get_aas_all), - Rule("/shells", methods=["POST"], endpoint=self.post_aas), - Submount("/shells", [ - Rule("/$reference", methods=["GET"], endpoint=self.get_aas_all_reference), - Rule("/", methods=["GET"], endpoint=self.get_aas), - Rule("/", methods=["PUT"], endpoint=self.put_aas), - Rule("/", methods=["DELETE"], endpoint=self.delete_aas), - Submount("/", [ - Rule("/$reference", methods=["GET"], endpoint=self.get_aas_reference), - Rule("/asset-information", methods=["GET"], endpoint=self.get_aas_asset_information), - Rule("/asset-information", methods=["PUT"], endpoint=self.put_aas_asset_information), - Rule("/asset-information/thumbnail", methods=["GET", "PUT", "DELETE"], - endpoint=self.not_implemented), - Rule("/submodel-refs", methods=["GET"], endpoint=self.get_aas_submodel_refs), - Rule("/submodel-refs", methods=["POST"], endpoint=self.post_aas_submodel_refs), - Rule("/submodel-refs/", methods=["DELETE"], - endpoint=self.delete_aas_submodel_refs_specific), - Submount("/submodels", [ - Rule("/", methods=["PUT"], - endpoint=self.put_aas_submodel_refs_submodel), - Rule("/", methods=["DELETE"], - endpoint=self.delete_aas_submodel_refs_submodel), - Rule("/", endpoint=self.aas_submodel_refs_redirect), - Rule("//", endpoint=self.aas_submodel_refs_redirect) - ]) - ]) - ]), - Rule("/submodels", methods=["GET"], endpoint=self.get_submodel_all), - Rule("/submodels", methods=["POST"], endpoint=self.post_submodel), - Submount("/submodels", [ - Rule("/$metadata", methods=["GET"], endpoint=self.get_submodel_all_metadata), - Rule("/$reference", methods=["GET"], endpoint=self.get_submodel_all_reference), - Rule("/$value", methods=["GET"], endpoint=self.not_implemented), - Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/", methods=["GET"], endpoint=self.get_submodel), - Rule("/", methods=["PUT"], endpoint=self.put_submodel), - Rule("/", methods=["DELETE"], endpoint=self.delete_submodel), - Rule("/", methods=["PATCH"], endpoint=self.not_implemented), - Submount("/", [ - Rule("/$metadata", methods=["GET"], endpoint=self.get_submodels_metadata), - Rule("/$metadata", methods=["PATCH"], endpoint=self.not_implemented), - Rule("/$value", methods=["GET"], endpoint=self.not_implemented), - Rule("/$value", methods=["PATCH"], endpoint=self.not_implemented), - Rule("/$reference", methods=["GET"], endpoint=self.get_submodels_reference), - Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/submodel-elements", methods=["GET"], endpoint=self.get_submodel_submodel_elements), - Rule("/submodel-elements", methods=["POST"], - endpoint=self.post_submodel_submodel_elements_id_short_path), - Submount("/submodel-elements", [ - Rule("/$metadata", methods=["GET"], endpoint=self.get_submodel_submodel_elements_metadata), - Rule("/$reference", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_reference), - Rule("/$value", methods=["GET"], endpoint=self.not_implemented), - Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_id_short_path), - Rule("/", methods=["POST"], - endpoint=self.post_submodel_submodel_elements_id_short_path), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_submodel_elements_id_short_path), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_elements_id_short_path), - Rule("/", methods=["PATCH"], endpoint=self.not_implemented), - Submount("/", [ - Rule("/$metadata", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_id_short_path_metadata), - Rule("/$metadata", methods=["PATCH"], endpoint=self.not_implemented), - Rule("/$reference", methods=["GET"], - endpoint=self.get_submodel_submodel_elements_id_short_path_reference), + self.url_map = werkzeug.routing.Map( + [ + Submount( + base_path, + [ + Rule("/serialization", methods=["GET"], endpoint=self.not_implemented), + Rule("/description", methods=["GET"], endpoint=self.not_implemented), + Rule("/shells", methods=["GET"], endpoint=self.get_aas_all), + Rule("/shells", methods=["POST"], endpoint=self.post_aas), + Submount( + "/shells", + [ + Rule("/$reference", methods=["GET"], endpoint=self.get_aas_all_reference), + Rule("/", methods=["GET"], endpoint=self.get_aas), + Rule("/", methods=["PUT"], endpoint=self.put_aas), + Rule("/", methods=["DELETE"], endpoint=self.delete_aas), + Submount( + "/", + [ + Rule("/$reference", methods=["GET"], endpoint=self.get_aas_reference), + Rule( + "/asset-information", + methods=["GET"], + endpoint=self.get_aas_asset_information, + ), + Rule( + "/asset-information", + methods=["PUT"], + endpoint=self.put_aas_asset_information, + ), + Rule( + "/asset-information/thumbnail", + methods=["GET", "PUT", "DELETE"], + endpoint=self.not_implemented, + ), + Rule("/submodel-refs", methods=["GET"], endpoint=self.get_aas_submodel_refs), + Rule("/submodel-refs", methods=["POST"], endpoint=self.post_aas_submodel_refs), + Rule( + "/submodel-refs/", + methods=["DELETE"], + endpoint=self.delete_aas_submodel_refs_specific, + ), + Submount( + "/submodels", + [ + Rule( + "/", + methods=["PUT"], + endpoint=self.put_aas_submodel_refs_submodel, + ), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_aas_submodel_refs_submodel, + ), + Rule( + "/", endpoint=self.aas_submodel_refs_redirect + ), + Rule( + "//", + endpoint=self.aas_submodel_refs_redirect, + ), + ], + ), + ], + ), + ], + ), + Rule("/submodels", methods=["GET"], endpoint=self.get_submodel_all), + Rule("/submodels", methods=["POST"], endpoint=self.post_submodel), + Submount( + "/submodels", + [ + Rule("/$metadata", methods=["GET"], endpoint=self.get_submodel_all_metadata), + Rule("/$reference", methods=["GET"], endpoint=self.get_submodel_all_reference), Rule("/$value", methods=["GET"], endpoint=self.not_implemented), - Rule("/$value", methods=["PATCH"], endpoint=self.not_implemented), Rule("/$path", methods=["GET"], endpoint=self.not_implemented), - Rule("/attachment", methods=["GET"], - endpoint=self.get_submodel_submodel_element_attachment), - Rule("/attachment", methods=["PUT"], - endpoint=self.put_submodel_submodel_element_attachment), - Rule("/attachment", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_element_attachment), - Rule("/invoke", methods=["POST"], endpoint=self.not_implemented), - Rule("/invoke/$value", methods=["POST"], endpoint=self.not_implemented), - Rule("/invoke-async", methods=["POST"], endpoint=self.not_implemented), - Rule("/invoke-async/$value", methods=["POST"], endpoint=self.not_implemented), - Rule("/operation-status/", methods=["GET"], - endpoint=self.not_implemented), - Submount("/operation-results", [ - Rule("/", methods=["GET"], endpoint=self.not_implemented), - Rule("//$value", methods=["GET"], endpoint=self.not_implemented) - ]), - Rule("/qualifiers", methods=["GET"], - endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/qualifiers", methods=["POST"], - endpoint=self.post_submodel_submodel_element_qualifiers), - Submount("/qualifiers", [ - Rule("/", methods=["GET"], - endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_submodel_element_qualifiers), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_element_qualifiers) - ]) - ]) - ]), - Rule("/qualifiers", methods=["GET"], endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/qualifiers", methods=["POST"], endpoint=self.post_submodel_submodel_element_qualifiers), - Submount("/qualifiers", [ - Rule("/", methods=["GET"], - endpoint=self.get_submodel_submodel_element_qualifiers), - Rule("/", methods=["PUT"], - endpoint=self.put_submodel_submodel_element_qualifiers), - Rule("/", methods=["DELETE"], - endpoint=self.delete_submodel_submodel_element_qualifiers) - ]) - ]) - ]), - Rule("/concept-descriptions", methods=["GET"], endpoint=self.get_concept_description_all), - Rule("/concept-descriptions", methods=["POST"], endpoint=self.post_concept_description), - Submount("/concept-descriptions", [ - Rule("/", methods=["GET"], endpoint=self.get_concept_description), - Rule("/", methods=["PUT"], endpoint=self.put_concept_description), - Rule("/", methods=["DELETE"], endpoint=self.delete_concept_description), - ]), - ]) - ], converters={ - "base64url": IdentifierToBase64URLConverter, - "id_short_path": IdShortPathConverter - }, strict_slashes=False) + Rule("/", methods=["GET"], endpoint=self.get_submodel), + Rule("/", methods=["PUT"], endpoint=self.put_submodel), + Rule("/", methods=["DELETE"], endpoint=self.delete_submodel), + Rule("/", methods=["PATCH"], endpoint=self.not_implemented), + Submount( + "/", + [ + Rule("/$metadata", methods=["GET"], endpoint=self.get_submodels_metadata), + Rule("/$metadata", methods=["PATCH"], endpoint=self.not_implemented), + Rule("/$value", methods=["GET"], endpoint=self.not_implemented), + Rule("/$value", methods=["PATCH"], endpoint=self.not_implemented), + Rule("/$reference", methods=["GET"], endpoint=self.get_submodels_reference), + Rule("/$path", methods=["GET"], endpoint=self.not_implemented), + Rule( + "/submodel-elements", + methods=["GET"], + endpoint=self.get_submodel_submodel_elements, + ), + Rule( + "/submodel-elements", + methods=["POST"], + endpoint=self.post_submodel_submodel_elements_id_short_path, + ), + Submount( + "/submodel-elements", + [ + Rule( + "/$metadata", + methods=["GET"], + endpoint=self.get_submodel_submodel_elements_metadata, + ), + Rule( + "/$reference", + methods=["GET"], + endpoint=self.get_submodel_submodel_elements_reference, + ), + Rule("/$value", methods=["GET"], endpoint=self.not_implemented), + Rule("/$path", methods=["GET"], endpoint=self.not_implemented), + Rule( + "/", + methods=["GET"], + endpoint=self.get_submodel_submodel_elements_id_short_path, + ), + Rule( + "/", + methods=["POST"], + endpoint=self.post_submodel_submodel_elements_id_short_path, + ), + Rule( + "/", + methods=["PUT"], + endpoint=self.put_submodel_submodel_elements_id_short_path, + ), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_submodel_submodel_elements_id_short_path, + ), + Rule( + "/", + methods=["PATCH"], + endpoint=self.not_implemented, + ), + Submount( + "/", + [ + Rule( + "/$metadata", + methods=["GET"], + endpoint=self.get_submodel_submodel_elements_id_short_path_metadata, + ), + Rule( + "/$metadata", + methods=["PATCH"], + endpoint=self.not_implemented, + ), + Rule( + "/$reference", + methods=["GET"], + endpoint=self.get_submodel_submodel_elements_id_short_path_reference, + ), + Rule("/$value", methods=["GET"], endpoint=self.not_implemented), + Rule( + "/$value", methods=["PATCH"], endpoint=self.not_implemented + ), + Rule("/$path", methods=["GET"], endpoint=self.not_implemented), + Rule( + "/attachment", + methods=["GET"], + endpoint=self.get_submodel_submodel_element_attachment, + ), + Rule( + "/attachment", + methods=["PUT"], + endpoint=self.put_submodel_submodel_element_attachment, + ), + Rule( + "/attachment", + methods=["DELETE"], + endpoint=self.delete_submodel_submodel_element_attachment, + ), + Rule( + "/invoke", methods=["POST"], endpoint=self.not_implemented + ), + Rule( + "/invoke/$value", + methods=["POST"], + endpoint=self.not_implemented, + ), + Rule( + "/invoke-async", + methods=["POST"], + endpoint=self.not_implemented, + ), + Rule( + "/invoke-async/$value", + methods=["POST"], + endpoint=self.not_implemented, + ), + Rule( + "/operation-status/", + methods=["GET"], + endpoint=self.not_implemented, + ), + Submount( + "/operation-results", + [ + Rule( + "/", + methods=["GET"], + endpoint=self.not_implemented, + ), + Rule( + "//$value", + methods=["GET"], + endpoint=self.not_implemented, + ), + ], + ), + Rule( + "/qualifiers", + methods=["GET"], + endpoint=self.get_submodel_submodel_element_qualifiers, + ), + Rule( + "/qualifiers", + methods=["POST"], + endpoint=self.post_submodel_submodel_element_qualifiers, + ), + Submount( + "/qualifiers", + [ + Rule( + "/", + methods=["GET"], + endpoint=self.get_submodel_submodel_element_qualifiers, + ), + Rule( + "/", + methods=["PUT"], + endpoint=self.put_submodel_submodel_element_qualifiers, + ), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_submodel_submodel_element_qualifiers, + ), + ], + ), + ], + ), + ], + ), + Rule( + "/qualifiers", + methods=["GET"], + endpoint=self.get_submodel_submodel_element_qualifiers, + ), + Rule( + "/qualifiers", + methods=["POST"], + endpoint=self.post_submodel_submodel_element_qualifiers, + ), + Submount( + "/qualifiers", + [ + Rule( + "/", + methods=["GET"], + endpoint=self.get_submodel_submodel_element_qualifiers, + ), + Rule( + "/", + methods=["PUT"], + endpoint=self.put_submodel_submodel_element_qualifiers, + ), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_submodel_submodel_element_qualifiers, + ), + ], + ), + ], + ), + ], + ), + Rule("/concept-descriptions", methods=["GET"], endpoint=self.get_concept_description_all), + Rule("/concept-descriptions", methods=["POST"], endpoint=self.post_concept_description), + Submount( + "/concept-descriptions", + [ + Rule("/", methods=["GET"], endpoint=self.get_concept_description), + Rule("/", methods=["PUT"], endpoint=self.put_concept_description), + Rule( + "/", + methods=["DELETE"], + endpoint=self.delete_concept_description, + ), + ], + ), + ], + ) + ], + converters={"base64url": IdentifierToBase64URLConverter, "id_short_path": IdShortPathConverter}, + strict_slashes=False, + ) # TODO: the parameters can be typed via builtin wsgiref with Python 3.11+ def __call__(self, environ, start_response) -> Iterable[bytes]: response: Response = self.handle_request(Request(environ)) return response(environ, start_response) - def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) \ - -> T: + def _get_obj_ts(self, identifier: model.Identifier, type_: Type[T]) -> T: identifiable = self.object_store.get(identifier) if not isinstance(identifiable, type_): raise NotFound(f"No {type_.__name__} with {identifier} found!") @@ -186,8 +363,9 @@ def _resolve_reference(self, reference: model.ModelReference[model.base._RT]) -> raise werkzeug.exceptions.InternalServerError(str(e)) from e @classmethod - def _get_nested_submodel_element(cls, namespace: model.UniqueIdShortNamespace, id_shorts: List[str]) \ - -> model.SubmodelElement: + def _get_nested_submodel_element( + cls, namespace: model.UniqueIdShortNamespace, id_shorts: List[str] + ) -> model.SubmodelElement: if not id_shorts: raise ValueError("No id_shorts specified!") @@ -217,8 +395,9 @@ def _expect_namespace(cls, obj: object, needle: str) -> model.UniqueIdShortNames return obj @classmethod - def _namespace_submodel_element_op(cls, namespace: model.UniqueIdShortNamespace, op: Callable[[str], T], arg: str) \ - -> T: + def _namespace_submodel_element_op( + cls, namespace: model.UniqueIdShortNamespace, op: Callable[[str], T], arg: str + ) -> T: try: return op(arg) except KeyError as e: @@ -232,8 +411,9 @@ def _qualifiable_qualifier_op(cls, qualifiable: model.Qualifiable, op: Callable[ raise NotFound(f"Qualifier with type {arg!r} not found in {qualifiable!r}") from e @classmethod - def _get_submodel_reference(cls, aas: model.AssetAdministrationShell, submodel_id: model.NameType) \ - -> model.ModelReference[model.Submodel]: + def _get_submodel_reference( + cls, aas: model.AssetAdministrationShell, submodel_id: model.NameType + ) -> model.ModelReference[model.Submodel]: # TODO: this is currently O(n), could be O(1) as aas.submodel, but keys would have to precisely match, as they # are hashed including their KeyType for ref in aas.submodel: @@ -261,19 +441,28 @@ def _get_shells(self, request: Request) -> Tuple[Iterator[model.AssetAdministrat value = asset_dict["value"] if name == "specificAssetId": - decoded_specific_id = HTTPApiDecoder.json_list(value, model.SpecificAssetId, - False, True)[0] + decoded_specific_id = HTTPApiDecoder.json_list(value, model.SpecificAssetId, False, True)[0] specific_asset_ids.append(decoded_specific_id) elif name == "globalAssetId": global_asset_ids.append(value) # Filter AAS based on both SpecificAssetIds and globalAssetIds - aas = filter(lambda shell: ( - (not specific_asset_ids or all(specific_asset_id in shell.asset_information.specific_asset_id - for specific_asset_id in specific_asset_ids)) and - (len(global_asset_ids) <= 1 and - (not global_asset_ids or shell.asset_information.global_asset_id in global_asset_ids)) - ), aas) + aas = filter( + lambda shell: ( + ( + not specific_asset_ids + or all( + specific_asset_id in shell.asset_information.specific_asset_id + for specific_asset_id in specific_asset_ids + ) + ) + and ( + len(global_asset_ids) <= 1 + and (not global_asset_ids or shell.asset_information.global_asset_id in global_asset_ids) + ) + ), + aas, + ) paginated_aas, end_index = self._get_slice(request, aas) return paginated_aas, end_index @@ -289,7 +478,8 @@ def _get_submodels(self, request: Request) -> Tuple[Iterator[model.Submodel], in semantic_id = request.args.get("semanticId") if semantic_id is not None: spec_semantic_id = HTTPApiDecoder.base64url_json( - semantic_id, model.Reference, False) # type: ignore[type-abstract] + semantic_id, model.Reference, False + ) # type: ignore[type-abstract] submodels = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodels) paginated_submodels, end_index = self._get_slice(request, submodels) return paginated_submodels, end_index @@ -297,8 +487,9 @@ def _get_submodels(self, request: Request) -> Tuple[Iterator[model.Submodel], in def _get_submodel(self, url_args: Dict) -> model.Submodel: return self._get_obj_ts(url_args["submodel_id"], model.Submodel) - def _get_submodel_submodel_elements(self, request: Request, url_args: Dict) -> \ - Tuple[Iterator[model.SubmodelElement], int]: + def _get_submodel_submodel_elements( + self, request: Request, url_args: Dict + ) -> Tuple[Iterator[model.SubmodelElement], int]: submodel = self._get_submodel(url_args) paginated_submodel_elements: Iterator[model.SubmodelElement] paginated_submodel_elements, end_index = self._get_slice(request, submodel.submodel_element) @@ -321,23 +512,22 @@ def get_aas_all(self, request: Request, url_args: Dict, response_t: Type[APIResp aashells, cursor = self._get_shells(request) return response_t(list(aashells), cursor=cursor) - def post_aas(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: + def post_aas( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: aas = HTTPApiDecoder.request_body(request, model.AssetAdministrationShell, False) try: self.object_store.add(aas) except KeyError as e: raise Conflict(f"AssetAdministrationShell with Identifier {aas.id} already exists!") from e - created_resource_url = map_adapter.build(self.get_aas, { - "aas_id": aas.id - }, force_external=True) + created_resource_url = map_adapter.build(self.get_aas, {"aas_id": aas.id}, force_external=True) return response_t(aas, status=201, headers={"Location": created_resource_url}) - def get_aas_all_reference(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_aas_all_reference( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aashells, cursor = self._get_shells(request) - references: list[model.ModelReference] = [model.ModelReference.from_referable(aas) - for aas in aashells] + references: list[model.ModelReference] = [model.ModelReference.from_referable(aas) for aas in aashells] return response_t(references, cursor=cursor) # --------- AAS ROUTES --------- @@ -352,8 +542,9 @@ def get_aas_reference(self, request: Request, url_args: Dict, response_t: Type[A def put_aas(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: aas = self._get_shell(url_args) - aas.update_from(HTTPApiDecoder.request_body(request, model.AssetAdministrationShell, - is_stripped_request(request))) + aas.update_from( + HTTPApiDecoder.request_body(request, model.AssetAdministrationShell, is_stripped_request(request)) + ) return response_t() def delete_aas(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response: @@ -361,26 +552,30 @@ def delete_aas(self, request: Request, url_args: Dict, response_t: Type[APIRespo self.object_store.remove(aas) return response_t() - def get_aas_asset_information(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_aas_asset_information( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas = self._get_shell(url_args) return response_t(aas.asset_information) - def put_aas_asset_information(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def put_aas_asset_information( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas = self._get_shell(url_args) aas.asset_information = HTTPApiDecoder.request_body(request, model.AssetInformation, False) return response_t() - def get_aas_submodel_refs(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_aas_submodel_refs( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas = self._get_shell(url_args) submodel_refs: Iterator[model.ModelReference[model.Submodel]] submodel_refs, cursor = self._get_slice(request, aas.submodel) return response_t(list(submodel_refs), cursor=cursor) - def post_aas_submodel_refs(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def post_aas_submodel_refs( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas = self._get_shell(url_args) sm_ref = HTTPApiDecoder.request_body(request, model.ModelReference, False) if sm_ref in aas.submodel: @@ -388,14 +583,16 @@ def post_aas_submodel_refs(self, request: Request, url_args: Dict, response_t: T aas.submodel.add(sm_ref) return response_t(sm_ref, status=201) - def delete_aas_submodel_refs_specific(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_aas_submodel_refs_specific( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas = self._get_shell(url_args) aas.submodel.remove(self._get_submodel_reference(aas, url_args["submodel_id"])) return response_t() - def put_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def put_aas_submodel_refs_submodel( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas = self._get_shell(url_args) sm_ref = self._get_submodel_reference(aas, url_args["submodel_id"]) submodel = self._resolve_reference(sm_ref) @@ -409,8 +606,9 @@ def put_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, respo aas.submodel.add(model.ModelReference.from_referable(submodel)) return response_t() - def delete_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_aas_submodel_refs_submodel( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: aas = self._get_shell(url_args) sm_ref = self._get_submodel_reference(aas, url_args["submodel_id"]) submodel = self._resolve_reference(sm_ref) @@ -418,14 +616,15 @@ def delete_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, re aas.submodel.remove(sm_ref) return response_t() - def aas_submodel_refs_redirect(self, request: Request, url_args: Dict, map_adapter: MapAdapter, response_t=None, - **_kwargs) -> Response: + def aas_submodel_refs_redirect( + self, request: Request, url_args: Dict, map_adapter: MapAdapter, response_t=None, **_kwargs + ) -> Response: aas = self._get_shell(url_args) # the following makes sure the reference exists self._get_submodel_reference(aas, url_args["submodel_id"]) - redirect_url = map_adapter.build(self.get_submodel, { - "submodel_id": url_args["submodel_id"] - }, force_external=True) + redirect_url = map_adapter.build( + self.get_submodel, {"submodel_id": url_args["submodel_id"]}, force_external=True + ) if "path" in url_args: redirect_url += "/" + url_args["path"] if request.query_string: @@ -437,28 +636,30 @@ def get_submodel_all(self, request: Request, url_args: Dict, response_t: Type[AP submodels, cursor = self._get_submodels(request) return response_t(list(submodels), cursor=cursor, stripped=is_stripped_request(request)) - def post_submodel(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: + def post_submodel( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: submodel = HTTPApiDecoder.request_body(request, model.Submodel, is_stripped_request(request)) try: self.object_store.add(submodel) except KeyError as e: raise Conflict(f"Submodel with Identifier {submodel.id} already exists!") from e - created_resource_url = map_adapter.build(self.get_submodel, { - "submodel_id": submodel.id - }, force_external=True) + created_resource_url = map_adapter.build(self.get_submodel, {"submodel_id": submodel.id}, force_external=True) return response_t(submodel, status=201, headers={"Location": created_resource_url}) - def get_submodel_all_metadata(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_all_metadata( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodels, cursor = self._get_submodels(request) return response_t(list(submodels), cursor=cursor, stripped=True) - def get_submodel_all_reference(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_all_reference( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodels, cursor = self._get_submodels(request) - references: list[model.ModelReference] = [model.ModelReference.from_referable(submodel) - for submodel in submodels] + references: list[model.ModelReference] = [ + model.ModelReference.from_referable(submodel) for submodel in submodels + ] return response_t(references, cursor=cursor, stripped=is_stripped_request(request)) # --------- SUBMODEL ROUTES --------- @@ -471,13 +672,15 @@ def get_submodel(self, request: Request, url_args: Dict, response_t: Type[APIRes submodel = self._get_submodel(url_args) return response_t(submodel, stripped=is_stripped_request(request)) - def get_submodels_metadata(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodels_metadata( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel = self._get_submodel(url_args) return response_t(submodel, stripped=True) - def get_submodels_reference(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodels_reference( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel = self._get_submodel(url_args) reference = model.ModelReference.from_referable(submodel) return response_t(reference, stripped=is_stripped_request(request)) @@ -487,83 +690,91 @@ def put_submodel(self, request: Request, url_args: Dict, response_t: Type[APIRes submodel.update_from(HTTPApiDecoder.request_body(request, model.Submodel, is_stripped_request(request))) return response_t() - def get_submodel_submodel_elements(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_submodel_elements( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_elements, cursor = self._get_submodel_submodel_elements(request, url_args) return response_t(list(submodel_elements), cursor=cursor, stripped=is_stripped_request(request)) - def get_submodel_submodel_elements_metadata(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_submodel_elements_metadata( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_elements, cursor = self._get_submodel_submodel_elements(request, url_args) return response_t(list(submodel_elements), cursor=cursor, stripped=True) - def get_submodel_submodel_elements_reference(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_submodel_elements_reference( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_elements, cursor = self._get_submodel_submodel_elements(request, url_args) - references: list[model.ModelReference] = [model.ModelReference.from_referable(element) for element in - list(submodel_elements)] + references: list[model.ModelReference] = [ + model.ModelReference.from_referable(element) for element in list(submodel_elements) + ] return response_t(references, cursor=cursor, stripped=is_stripped_request(request)) - def get_submodel_submodel_elements_id_short_path(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_submodel_elements_id_short_path( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_element = self._get_submodel_submodel_elements_id_short_path(url_args) return response_t(submodel_element, stripped=is_stripped_request(request)) - def get_submodel_submodel_elements_id_short_path_metadata(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], **_kwargs) -> Response: + def get_submodel_submodel_elements_id_short_path_metadata( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_element = self._get_submodel_submodel_elements_id_short_path(url_args) if isinstance(submodel_element, model.Capability) or isinstance(submodel_element, model.Operation): raise BadRequest(f"{submodel_element.id_short} does not allow the content modifier metadata!") return response_t(submodel_element, stripped=True) - def get_submodel_submodel_elements_id_short_path_reference(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], **_kwargs) -> Response: + def get_submodel_submodel_elements_id_short_path_reference( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_element = self._get_submodel_submodel_elements_id_short_path(url_args) reference = model.ModelReference.from_referable(submodel_element) return response_t(reference, stripped=is_stripped_request(request)) - def post_submodel_submodel_elements_id_short_path(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], - map_adapter: MapAdapter): + def post_submodel_submodel_elements_id_short_path( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ): parent = self._get_submodel_or_nested_submodel_element(url_args) if not isinstance(parent, model.UniqueIdShortNamespace): raise BadRequest(f"{parent!r} is not a namespace, can't add child submodel element!") # TODO: remove the following type: ignore comment when mypy supports abstract types for Type[T] # see https://github.com/python/mypy/issues/5374 - new_submodel_element = HTTPApiDecoder.request_body(request, - model.SubmodelElement, # type: ignore[type-abstract] - is_stripped_request(request)) + new_submodel_element = HTTPApiDecoder.request_body( + request, model.SubmodelElement, is_stripped_request(request) # type: ignore[type-abstract] + ) try: parent.add_referable(new_submodel_element) except model.AASConstraintViolation as e: if e.constraint_id != 22: raise - raise Conflict(f"SubmodelElement with idShort {new_submodel_element.id_short} already exists " - f"within {parent}!") + raise Conflict( + f"SubmodelElement with idShort {new_submodel_element.id_short} already exists " f"within {parent}!" + ) submodel = self._get_submodel(url_args) id_short_path = url_args.get("id_shorts", []) - created_resource_url = map_adapter.build(self.get_submodel_submodel_elements_id_short_path, { - "submodel_id": submodel.id, - "id_shorts": id_short_path + [new_submodel_element.id_short] - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_submodel_submodel_elements_id_short_path, + {"submodel_id": submodel.id, "id_shorts": id_short_path + [new_submodel_element.id_short]}, + force_external=True, + ) return response_t(new_submodel_element, status=201, headers={"Location": created_resource_url}) - def put_submodel_submodel_elements_id_short_path(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: + def put_submodel_submodel_elements_id_short_path( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_element = self._get_submodel_submodel_elements_id_short_path(url_args) # TODO: remove the following type: ignore comment when mypy supports abstract types for Type[T] # see https://github.com/python/mypy/issues/5374 - new_submodel_element = HTTPApiDecoder.request_body(request, - model.SubmodelElement, # type: ignore[type-abstract] - is_stripped_request(request)) + new_submodel_element = HTTPApiDecoder.request_body( + request, model.SubmodelElement, is_stripped_request(request) # type: ignore[type-abstract] + ) submodel_element.update_from(new_submodel_element) return response_t() - def delete_submodel_submodel_elements_id_short_path(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_submodel_submodel_elements_id_short_path( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: sm_or_se = self._get_submodel_or_nested_submodel_element(url_args) parent: model.UniqueIdShortNamespace = self._expect_namespace(sm_or_se.parent, sm_or_se.id_short) self._namespace_submodel_element_op(parent, parent.remove_referable, sm_or_se.id_short) @@ -592,8 +803,9 @@ def get_submodel_submodel_element_attachment(self, request: Request, url_args: D # Blob and File both have the content_type attribute return Response(value, content_type=submodel_element.content_type) # type: ignore[attr-defined] - def put_submodel_submodel_element_attachment(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def put_submodel_submodel_element_attachment( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_element = self._get_submodel_submodel_elements_id_short_path(url_args) # spec allows PUT only for File, not for Blob @@ -602,26 +814,27 @@ def put_submodel_submodel_element_attachment(self, request: Request, url_args: D elif submodel_element.value is not None: raise Conflict(f"{submodel_element!r} already references a file!") - filename = request.form.get('fileName') + filename = request.form.get("fileName") if filename is None: raise BadRequest("No 'fileName' specified!") elif not filename.startswith("/"): raise BadRequest(f"Given 'fileName' doesn't start with a slash (/): {filename}") - file_storage: Optional[FileStorage] = request.files.get('file') + file_storage: Optional[FileStorage] = request.files.get("file") if file_storage is None: raise BadRequest("Missing file to upload") elif file_storage.mimetype != submodel_element.content_type: raise werkzeug.exceptions.UnsupportedMediaType( f"Request body is of type {file_storage.mimetype!r}, " - f"while {submodel_element!r} has content_type {submodel_element.content_type!r}!") + f"while {submodel_element!r} has content_type {submodel_element.content_type!r}!" + ) submodel_element.value = self.file_store.add_file(filename, file_storage.stream, submodel_element.content_type) return response_t() - def delete_submodel_submodel_element_attachment(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_submodel_submodel_element_attachment( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: submodel_element = self._get_submodel_submodel_elements_id_short_path(url_args) if not isinstance(submodel_element, (model.Blob, model.File)): raise BadRequest(f"{submodel_element!r} is not a Blob or File, no file content to delete!") @@ -641,30 +854,37 @@ def delete_submodel_submodel_element_attachment(self, request: Request, url_args return response_t() - def get_submodel_submodel_element_qualifiers(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_submodel_submodel_element_qualifiers( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: sm_or_se = self._get_submodel_or_nested_submodel_element(url_args) qualifier_type = url_args.get("qualifier_type") if qualifier_type is None: return response_t(list(sm_or_se.qualifier)) return response_t(self._qualifiable_qualifier_op(sm_or_se, sm_or_se.get_qualifier_by_type, qualifier_type)) - def post_submodel_submodel_element_qualifiers(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: + def post_submodel_submodel_element_qualifiers( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: sm_or_se = self._get_submodel_or_nested_submodel_element(url_args) qualifier = HTTPApiDecoder.request_body(request, model.Qualifier, is_stripped_request(request)) if sm_or_se.qualifier.contains_id("type", qualifier.type): raise Conflict(f"Qualifier with type {qualifier.type} already exists!") sm_or_se.qualifier.add(qualifier) - created_resource_url = map_adapter.build(self.get_submodel_submodel_element_qualifiers, { - "submodel_id": url_args["submodel_id"], - "id_shorts": url_args.get("id_shorts") or None, - "qualifier_type": qualifier.type - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_submodel_submodel_element_qualifiers, + { + "submodel_id": url_args["submodel_id"], + "id_shorts": url_args.get("id_shorts") or None, + "qualifier_type": qualifier.type, + }, + force_external=True, + ) return response_t(qualifier, status=201, headers={"Location": created_resource_url}) - def put_submodel_submodel_element_qualifiers(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: + def put_submodel_submodel_element_qualifiers( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: sm_or_se = self._get_submodel_or_nested_submodel_element(url_args) new_qualifier = HTTPApiDecoder.request_body(request, model.Qualifier, is_stripped_request(request)) qualifier_type = url_args["qualifier_type"] @@ -675,63 +895,79 @@ def put_submodel_submodel_element_qualifiers(self, request: Request, url_args: D sm_or_se.remove_qualifier_by_type(qualifier.type) sm_or_se.qualifier.add(new_qualifier) if qualifier_type_changed: - created_resource_url = map_adapter.build(self.get_submodel_submodel_element_qualifiers, { - "submodel_id": url_args["submodel_id"], - "id_shorts": url_args.get("id_shorts") or None, - "qualifier_type": new_qualifier.type - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_submodel_submodel_element_qualifiers, + { + "submodel_id": url_args["submodel_id"], + "id_shorts": url_args.get("id_shorts") or None, + "qualifier_type": new_qualifier.type, + }, + force_external=True, + ) return response_t(new_qualifier, status=201, headers={"Location": created_resource_url}) return response_t(new_qualifier) - def delete_submodel_submodel_element_qualifiers(self, request: Request, url_args: Dict, - response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_submodel_submodel_element_qualifiers( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: sm_or_se = self._get_submodel_or_nested_submodel_element(url_args) qualifier_type = url_args["qualifier_type"] self._qualifiable_qualifier_op(sm_or_se, sm_or_se.remove_qualifier_by_type, qualifier_type) return response_t() # --------- CONCEPT DESCRIPTION ROUTES --------- - def get_concept_description_all(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_concept_description_all( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: concept_descriptions: Iterator[model.ConceptDescription] = self._get_all_obj_of_type(model.ConceptDescription) concept_descriptions, cursor = self._get_slice(request, concept_descriptions) return response_t(list(concept_descriptions), cursor=cursor, stripped=is_stripped_request(request)) - def post_concept_description(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - map_adapter: MapAdapter) -> Response: - concept_description = HTTPApiDecoder.request_body(request, model.ConceptDescription, - is_stripped_request(request)) + def post_concept_description( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], map_adapter: MapAdapter + ) -> Response: + concept_description = HTTPApiDecoder.request_body( + request, model.ConceptDescription, is_stripped_request(request) + ) try: self.object_store.add(concept_description) except KeyError as e: raise Conflict(f"ConceptDescription with Identifier {concept_description.id} already exists!") from e - created_resource_url = map_adapter.build(self.get_concept_description, { - "concept_id": concept_description.id - }, force_external=True) + created_resource_url = map_adapter.build( + self.get_concept_description, {"concept_id": concept_description.id}, force_external=True + ) return response_t(concept_description, status=201, headers={"Location": created_resource_url}) - def get_concept_description(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def get_concept_description( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: concept_description = self._get_concept_description(url_args) return response_t(concept_description, stripped=is_stripped_request(request)) - def put_concept_description(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def put_concept_description( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: concept_description = self._get_concept_description(url_args) - concept_description.update_from(HTTPApiDecoder.request_body(request, model.ConceptDescription, - is_stripped_request(request))) + concept_description.update_from( + HTTPApiDecoder.request_body(request, model.ConceptDescription, is_stripped_request(request)) + ) return response_t() - def delete_concept_description(self, request: Request, url_args: Dict, response_t: Type[APIResponse], - **_kwargs) -> Response: + def delete_concept_description( + self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs + ) -> Response: self.object_store.remove(self._get_concept_description(url_args)) return response_t() if __name__ == "__main__": - from werkzeug.serving import run_simple from basyx.aas.examples.data.example_aas import create_full_example + from werkzeug.serving import run_simple - run_simple("localhost", 8080, WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), - use_debugger=True, use_reloader=True) + run_simple( + "localhost", + 8080, + WSGIApp(create_full_example(), aasx.DictSupplementaryFileContainer()), + use_debugger=True, + use_reloader=True, + ) diff --git a/server/app/model/__init__.py b/server/app/model/__init__.py index 561375546..684379e2c 100644 --- a/server/app/model/__init__.py +++ b/server/app/model/__init__.py @@ -1,4 +1,4 @@ from .descriptor import * from .endpoint import * -from .service_specification import * from .provider import * +from .service_specification import * diff --git a/server/app/model/descriptor.py b/server/app/model/descriptor.py index 0edb2448b..13fdf8d00 100644 --- a/server/app/model/descriptor.py +++ b/server/app/model/descriptor.py @@ -1,16 +1,21 @@ from __future__ import absolute_import import abc -from typing import Optional, Iterable, List +from typing import Iterable, List, Optional from basyx.aas import model + from app.model.endpoint import Endpoint class Descriptor(model.HasExtension, metaclass=abc.ABCMeta): @abc.abstractmethod - def __init__(self, description: Optional[model.MultiLanguageTextType] = None, - display_name: Optional[model.MultiLanguageNameType] = None, extension: Iterable[model.Extension] = ()): + def __init__( + self, + description: Optional[model.MultiLanguageTextType] = None, + display_name: Optional[model.MultiLanguageNameType] = None, + extension: Iterable[model.Extension] = (), + ): super().__init__() self.description: Optional[model.MultiLanguageTextType] = description self.display_name: Optional[model.MultiLanguageNameType] = display_name @@ -37,35 +42,43 @@ def update_from(self, other: "Descriptor", update_source: bool = False): class SubmodelDescriptor(Descriptor): - def __init__(self, id_: model.Identifier, endpoints: List[Endpoint], - administration: Optional[model.AdministrativeInformation] = None, - id_short: Optional[model.NameType] = None, semantic_id: Optional[model.Reference] = None, - supplemental_semantic_id: Iterable[model.Reference] = ()): + def __init__( + self, + id_: model.Identifier, + endpoints: List[Endpoint], + administration: Optional[model.AdministrativeInformation] = None, + id_short: Optional[model.NameType] = None, + semantic_id: Optional[model.Reference] = None, + supplemental_semantic_id: Iterable[model.Reference] = (), + ): super().__init__() self.id: model.Identifier = id_ self.endpoints: List[Endpoint] = endpoints self.administration: Optional[model.AdministrativeInformation] = administration self.id_short: Optional[model.NameType] = id_short self.semantic_id: Optional[model.Reference] = semantic_id - self.supplemental_semantic_id: model.ConstrainedList[model.Reference] = \ - model.ConstrainedList(supplemental_semantic_id) + self.supplemental_semantic_id: model.ConstrainedList[model.Reference] = model.ConstrainedList( + supplemental_semantic_id + ) class AssetAdministrationShellDescriptor(Descriptor): - def __init__(self, - id_: model.Identifier, - administration: Optional[model.AdministrativeInformation] = None, - asset_kind: Optional[model.AssetKind] = None, - asset_type: Optional[model.Identifier] = None, - endpoints: Optional[List[Endpoint]] = None, - global_asset_id: Optional[model.Identifier] = None, - id_short: Optional[model.NameType] = None, - specific_asset_id: Iterable[model.SpecificAssetId] = (), - submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, - description: Optional[model.MultiLanguageTextType] = None, - display_name: Optional[model.MultiLanguageNameType] = None, - extension: Iterable[model.Extension] = ()): + def __init__( + self, + id_: model.Identifier, + administration: Optional[model.AdministrativeInformation] = None, + asset_kind: Optional[model.AssetKind] = None, + asset_type: Optional[model.Identifier] = None, + endpoints: Optional[List[Endpoint]] = None, + global_asset_id: Optional[model.Identifier] = None, + id_short: Optional[model.NameType] = None, + specific_asset_id: Iterable[model.SpecificAssetId] = (), + submodel_descriptors: Optional[List[SubmodelDescriptor]] = None, + description: Optional[model.MultiLanguageTextType] = None, + display_name: Optional[model.MultiLanguageNameType] = None, + extension: Iterable[model.Extension] = (), + ): """AssetAdministrationShellDescriptor - Nur das 'id'-Feld (id_) ist zwingend erforderlich. Alle anderen Felder erhalten Defaultwerte. @@ -74,15 +87,16 @@ def __init__(self, self.administration: Optional[model.AdministrativeInformation] = administration self.asset_kind: Optional[model.AssetKind] = asset_kind self.asset_type: Optional[model.Identifier] = asset_type - self.endpoints: Optional[ - List[Endpoint]] = endpoints if endpoints is not None else [] # leere Liste, falls nicht gesetzt + self.endpoints: Optional[List[Endpoint]] = ( + endpoints if endpoints is not None else [] + ) # leere Liste, falls nicht gesetzt self.global_asset_id: Optional[model.Identifier] = global_asset_id self.id_short: Optional[model.NameType] = id_short self.id: model.Identifier = id_ self._specific_asset_id: model.ConstrainedList[model.SpecificAssetId] = model.ConstrainedList( specific_asset_id, item_set_hook=self._check_constraint_set_spec_asset_id, - item_del_hook=self._check_constraint_del_spec_asset_id + item_del_hook=self._check_constraint_del_spec_asset_id, ) self.submodel_descriptors = submodel_descriptors if submodel_descriptors is not None else [] self.description: Optional[model.MultiLanguageTextType] = description @@ -98,12 +112,17 @@ def specific_asset_id(self, specific_asset_id: Iterable[model.SpecificAssetId]) # constraints are checked via _check_constraint_set_spec_asset_id() in this case self._specific_asset_id[:] = specific_asset_id - def _check_constraint_set_spec_asset_id(self, items_to_replace: List[model.SpecificAssetId], - new_items: List[model.SpecificAssetId], - old_list: List[model.SpecificAssetId]) -> None: - model.AssetInformation._validate_aasd_131(self.global_asset_id, - len(old_list) - len(items_to_replace) + len(new_items) > 0) + def _check_constraint_set_spec_asset_id( + self, + items_to_replace: List[model.SpecificAssetId], + new_items: List[model.SpecificAssetId], + old_list: List[model.SpecificAssetId], + ) -> None: + model.AssetInformation._validate_aasd_131( + self.global_asset_id, len(old_list) - len(items_to_replace) + len(new_items) > 0 + ) - def _check_constraint_del_spec_asset_id(self, _item_to_del: model.SpecificAssetId, - old_list: List[model.SpecificAssetId]) -> None: + def _check_constraint_del_spec_asset_id( + self, _item_to_del: model.SpecificAssetId, old_list: List[model.SpecificAssetId] + ) -> None: model.AssetInformation._validate_aasd_131(self.global_asset_id, len(old_list) > 1) diff --git a/server/app/model/endpoint.py b/server/app/model/endpoint.py index e7cc0e591..06301e9a1 100644 --- a/server/app/model/endpoint.py +++ b/server/app/model/endpoint.py @@ -2,7 +2,7 @@ import re from enum import Enum -from typing import Optional, List +from typing import List, Optional from basyx.aas.model import base @@ -40,14 +40,14 @@ def __init__(self, type_: SecurityTypeEnum, key: str, value: str): class ProtocolInformation: def __init__( - self, - href: str, - endpoint_protocol: Optional[str] = None, - endpoint_protocol_version: Optional[List[str]] = None, - subprotocol: Optional[str] = None, - subprotocol_body: Optional[str] = None, - subprotocol_body_encoding: Optional[str] = None, - security_attributes: Optional[List[SecurityAttributeObject]] = None + self, + href: str, + endpoint_protocol: Optional[str] = None, + endpoint_protocol_version: Optional[List[str]] = None, + subprotocol: Optional[str] = None, + subprotocol_body: Optional[str] = None, + subprotocol_body_encoding: Optional[str] = None, + security_attributes: Optional[List[SecurityAttributeObject]] = None, ): if not href or not isinstance(href, str): raise ValueError("href must be a non-empty string representing a valid URL.") @@ -63,9 +63,16 @@ def __init__( class Endpoint: INTERFACE_SHORTNAMES = { - "AAS", "SUBMODEL", "SERIALIZE", "AASX-FILE", "AAS-REGISTRY", - "SUBMODEL-REGISTRY", "AAS-REPOSITORY", "SUBMODEL-REPOSITORY", - "CD-REPOSITORY", "AAS-DISCOVERY" + "AAS", + "SUBMODEL", + "SERIALIZE", + "AASX-FILE", + "AAS-REGISTRY", + "SUBMODEL-REGISTRY", + "AAS-REPOSITORY", + "SUBMODEL-REPOSITORY", + "CD-REPOSITORY", + "AAS-DISCOVERY", } VERSION_PATTERN = re.compile(r"^\d+(\.\d+)*$") diff --git a/server/app/model/provider.py b/server/app/model/provider.py index 3e0f573e8..62c534623 100644 --- a/server/app/model/provider.py +++ b/server/app/model/provider.py @@ -1,12 +1,11 @@ -from typing import Iterable, Dict, Iterator, Union +from pathlib import Path +from typing import IO, Dict, Iterable, Iterator, Union from basyx.aas import model from basyx.aas.model import provider as sdk_provider -from pathlib import Path -from typing import Dict, IO, Iterable -from app.model import descriptor from app.adapter import read_server_aas_json_file_into +from app.model import descriptor PathOrIO = Union[Path, IO] @@ -31,8 +30,7 @@ def get_item(self, identifier: model.Identifier) -> _DESCRIPTOR_TYPE: def add(self, x: _DESCRIPTOR_TYPE) -> None: if x.id in self._backend and self._backend.get(x.id) is not x: - raise KeyError("Descriptor object with same id {} is already stored in this store" - .format(x.id)) + raise KeyError("Descriptor object with same id {} is already stored in this store".format(x.id)) self._backend[x.id] = x def discard(self, x: _DESCRIPTOR_TYPE) -> None: @@ -52,6 +50,7 @@ def __len__(self) -> int: def __iter__(self) -> Iterator[_DESCRIPTOR_TYPE]: return iter(self._backend.values()) + def load_directory(directory: Union[Path, str]) -> DictDescriptorStore: """ Create a new :class:`~basyx.aas.model.provider.DictIdentifiableStore` and use it to load Asset Administration Shell diff --git a/server/app/model/service_specification.py b/server/app/model/service_specification.py index 180f7f93c..ff042bbc0 100644 --- a/server/app/model/service_specification.py +++ b/server/app/model/service_specification.py @@ -1,12 +1,13 @@ -from typing import List from enum import Enum +from typing import List + class ServiceSpecificationProfileEnum(str, Enum): AAS_REGISTRY_FULL = "https://adminshell.io/aas/API/3/1/AssetAdministrationShellRegistryServiceSpecification/SSP-001" AAS_REGISTRY_READ = "https://adminshell.io/aas/API/3/1/AssetAdministrationShellRegistryServiceSpecification/SSP-002" SUBMODEL_REGISTRY_FULL = "https://adminshell.io/aas/API/3/1/SubmodelRegistryServiceSpecification/SSP-001" SUBMODEL_REGISTRY_READ = "https://adminshell.io/aas/API/3/1/SubmodelRegistryServiceSpecification/SSP-002" - #TODO add other profiles + # TODO add other profiles class ServiceDescription: @@ -16,6 +17,4 @@ def __init__(self, profiles: List[ServiceSpecificationProfileEnum]): self.profiles = profiles def to_dict(self): - return { - "profiles": [p.value for p in self.profiles] - } \ No newline at end of file + return {"profiles": [p.value for p in self.profiles]} diff --git a/server/app/services/run_discovery.py b/server/app/services/run_discovery.py index 0b047db20..7c47124cf 100644 --- a/server/app/services/run_discovery.py +++ b/server/app/services/run_discovery.py @@ -1,5 +1,5 @@ -import os import atexit +import os from app.interfaces.discovery import DiscoveryAPI, DiscoveryStore @@ -18,10 +18,12 @@ else: discovery_store = DiscoveryStore() + def persist_store(): if storage_path: discovery_store.to_file(storage_path) + atexit.register(persist_store) application = DiscoveryAPI(discovery_store, **wsgi_optparams) diff --git a/server/app/services/run_registry.py b/server/app/services/run_registry.py index 07a3dbe2b..666109d75 100644 --- a/server/app/services/run_registry.py +++ b/server/app/services/run_registry.py @@ -1,32 +1,3 @@ -"""" -import sys -import os -sys.path.insert(0, "/") -from server.app.interfaces.registry import RegistryAPI -from app.model import DictDescriptorStore -from app.backend import LocalFileDescriptorStore - -storage_path = os.getenv("STORAGE_PATH", "/storage") -storage_type = os.getenv("STORAGE_TYPE", "LOCAL_FILE_READ_ONLY") -base_path = os.getenv("API_BASE_PATH") - -wsgi_optparams = {} - -if base_path is not None: - wsgi_optparams["base_path"] = base_path - -if storage_type == "LOCAL_FILE_BACKEND": - application = RegistryAPI(LocalFileDescriptorStore(storage_path), **wsgi_optparams) - -elif storage_type in "LOCAL_FILE_READ_ONLY": - object_store: DictDescriptorStore = DictDescriptorStore() - - application = RegistryAPI(object_store, **wsgi_optparams) - -else: - print(f"STORAGE_TYPE must be either LOCAL_FILE or LOCAL_FILE_READ_ONLY! Current value: {storage_type}", - file=sys.stderr) -""" # Copyright (c) 2026 the Eclipse BaSyx Authors # # This program and the accompanying materials are made available under the terms of the MIT License, available in @@ -34,20 +5,20 @@ # # SPDX-License-Identifier: MIT """ -This module provides the WSGI entry point for the Asset Administration Shell Repository Server. +This module provides the WSGI entry point for the Asset Administration Shell Registry Server. """ import logging import os -from app.model import load_directory -from app.backend import LocalFileDescriptorStore -from app.model import DictDescriptorStore -from app.interfaces.registry import RegistryAPI from typing import Union +from app.backend import LocalFileDescriptorStore +from app.interfaces.registry import RegistryAPI +from app.model import DictDescriptorStore, load_directory # -------- Helper methods -------- + def setup_logger() -> logging.Logger: """ Configure a custom :class:`~logging.Logger` for the start-up sequence of the server. @@ -67,11 +38,7 @@ def setup_logger() -> logging.Logger: def build_storage( - env_input: str, - env_storage: str, - env_storage_persistency: bool, - env_storage_overwrite: bool, - logger: logging.Logger + env_input: str, env_storage: str, env_storage_persistency: bool, env_storage_overwrite: bool, logger: logging.Logger ) -> Union[DictDescriptorStore, LocalFileDescriptorStore]: """ Configure the server's storage according to the given start-up settings. @@ -95,30 +62,24 @@ def build_storage( if os.path.isdir(env_input): input_files = load_directory(env_input) added, overwritten, skipped = storage_files.sync(input_files, env_storage_overwrite) - logger.info( - "Loaded %d descriptors(s) from \"%s\"", - len(input_files), env_input - ) + logger.info('Loaded %d descriptors(s) from "%s"', len(input_files), env_input) logger.info( "Synced INPUT to STORAGE with %d added and %d %s", added, overwritten if env_storage_overwrite else skipped, - "overwritten" if env_storage_overwrite else "skipped" + "overwritten" if env_storage_overwrite else "skipped", ) return storage_files else: - logger.warning("INPUT directory \"%s\" not found, starting empty", env_input) + logger.warning('INPUT directory "%s" not found, starting empty', env_input) return storage_files if os.path.isdir(env_input): input_files = load_directory(env_input) - logger.info( - "Loaded %d descriptors(s) from \"%s\"", - len(input_files), env_input - ) + logger.info('Loaded %d descriptors(s) from "%s"', len(input_files), env_input) return input_files else: - logger.warning("INPUT directory \"%s\" not found, starting empty", env_input) + logger.warning('INPUT directory "%s" not found, starting empty', env_input) return DictDescriptorStore() @@ -135,18 +96,16 @@ def build_storage( wsgi_optparams = {"base_path": env_api_base_path} if env_api_base_path else {} logger.info( - "Loaded settings API_BASE_PATH=\"%s\", INPUT=\"%s\", STORAGE=\"%s\", PERSISTENCY=%s, OVERWRITE=%s", - env_api_base_path or "", env_input, env_storage, env_storage_persistency, env_storage_overwrite -) - -storage_files = build_storage( + 'Loaded settings API_BASE_PATH="%s", INPUT="%s", STORAGE="%s", PERSISTENCY=%s, OVERWRITE=%s', + env_api_base_path or "", env_input, env_storage, env_storage_persistency, env_storage_overwrite, - logger ) +storage_files = build_storage(env_input, env_storage, env_storage_persistency, env_storage_overwrite, logger) + application = RegistryAPI(storage_files, **wsgi_optparams) diff --git a/server/app/services/run_repository.py b/server/app/services/run_repository.py index 478e4d215..418e12ddc 100644 --- a/server/app/services/run_repository.py +++ b/server/app/services/run_repository.py @@ -10,16 +10,18 @@ import logging import os +from typing import Tuple, Union + from basyx.aas.adapter import load_directory from basyx.aas.adapter.aasx import DictSupplementaryFileContainer from basyx.aas.backend.local_file import LocalFileIdentifiableStore from basyx.aas.model.provider import DictIdentifiableStore -from app.interfaces.repository import WSGIApp -from typing import Tuple, Union +from app.interfaces.repository import WSGIApp # -------- Helper methods -------- + def setup_logger() -> logging.Logger: """ Configure a custom :class:`~logging.Logger` for the start-up sequence of the server. @@ -39,11 +41,7 @@ def setup_logger() -> logging.Logger: def build_storage( - env_input: str, - env_storage: str, - env_storage_persistency: bool, - env_storage_overwrite: bool, - logger: logging.Logger + env_input: str, env_storage: str, env_storage_persistency: bool, env_storage_overwrite: bool, logger: logging.Logger ) -> Tuple[Union[DictIdentifiableStore, LocalFileIdentifiableStore], DictSupplementaryFileContainer]: """ Configure the server's storage according to the given start-up settings. @@ -68,29 +66,33 @@ def build_storage( input_files, input_supp_files = load_directory(env_input) added, overwritten, skipped = storage_files.sync(input_files, env_storage_overwrite) logger.info( - "Loaded %d identifiable(s) and %d supplementary file(s) from \"%s\"", - len(input_files), len(input_supp_files), env_input + 'Loaded %d identifiable(s) and %d supplementary file(s) from "%s"', + len(input_files), + len(input_supp_files), + env_input, ) logger.info( "Synced INPUT to STORAGE with %d added and %d %s", added, overwritten if env_storage_overwrite else skipped, - "overwritten" if env_storage_overwrite else "skipped" + "overwritten" if env_storage_overwrite else "skipped", ) return storage_files, input_supp_files else: - logger.warning("INPUT directory \"%s\" not found, starting empty", env_input) + logger.warning('INPUT directory "%s" not found, starting empty', env_input) return storage_files, DictSupplementaryFileContainer() if os.path.isdir(env_input): input_files, input_supp_files = load_directory(env_input) logger.info( - "Loaded %d identifiable(s) and %d supplementary file(s) from \"%s\"", - len(input_files), len(input_supp_files), env_input + 'Loaded %d identifiable(s) and %d supplementary file(s) from "%s"', + len(input_files), + len(input_supp_files), + env_input, ) return input_files, input_supp_files else: - logger.warning("INPUT directory \"%s\" not found, starting empty", env_input) + logger.warning('INPUT directory "%s" not found, starting empty', env_input) return DictIdentifiableStore(), DictSupplementaryFileContainer() @@ -107,16 +109,16 @@ def build_storage( wsgi_optparams = {"base_path": env_api_base_path} if env_api_base_path else {} logger.info( - "Loaded settings API_BASE_PATH=\"%s\", INPUT=\"%s\", STORAGE=\"%s\", PERSISTENCY=%s, OVERWRITE=%s", - env_api_base_path or "", env_input, env_storage, env_storage_persistency, env_storage_overwrite -) - -storage_files, supp_files = build_storage( + 'Loaded settings API_BASE_PATH="%s", INPUT="%s", STORAGE="%s", PERSISTENCY=%s, OVERWRITE=%s', + env_api_base_path or "", env_input, env_storage, env_storage_persistency, env_storage_overwrite, - logger +) + +storage_files, supp_files = build_storage( + env_input, env_storage, env_storage_persistency, env_storage_overwrite, logger ) application = WSGIApp(storage_files, supp_files, **wsgi_optparams) diff --git a/server/app/util/converters.py b/server/app/util/converters.py index 4e37c4702..370049d22 100644 --- a/server/app/util/converters.py +++ b/server/app/util/converters.py @@ -13,14 +13,12 @@ import base64 import binascii +from typing import List import werkzeug.routing import werkzeug.utils -from werkzeug.exceptions import BadRequest - from basyx.aas import model - -from typing import List +from werkzeug.exceptions import BadRequest BASE64URL_ENCODING = "utf-8" @@ -46,9 +44,10 @@ def base64url_encode(data: str) -> str: class IdentifierToBase64URLConverter(werkzeug.routing.UnicodeConverter): """ - A custom URL converter for Werkzeug routing that encodes and decodes - Identifiers using Base64 URL-safe encoding. + A custom URL converter for Werkzeug routing that encodes and decodes + Identifiers using Base64 URL-safe encoding. """ + def to_url(self, value: model.Identifier) -> str: return super().to_url(base64url_encode(value)) @@ -60,12 +59,12 @@ def to_python(self, value: str) -> model.Identifier: class IdShortPathConverter(werkzeug.routing.UnicodeConverter): """ - A custom Werkzeug URL converter for handling dot-separated idShort paths and indexes. + A custom Werkzeug URL converter for handling dot-separated idShort paths and indexes. - This converter joins a list of idShort strings into an id_short_sep-separated path for URLs - (e.g., ["submodel", "element", "1"] -> "submodel.element[1]") and parses incoming URL paths - back into a list, validating each idShort. - """ + This converter joins a list of idShort strings into an id_short_sep-separated path for URLs + (e.g., ["submodel", "element", "1"] -> "submodel.element[1]") and parses incoming URL paths + back into a list, validating each idShort. + """ def to_url(self, value: List[str]) -> str: id_short_path = model.Referable.build_id_short_path(value) diff --git a/server/test/backend/test_local_file.py b/server/test/backend/test_local_file.py index a5a7281c9..aeafb85c5 100644 --- a/server/test/backend/test_local_file.py +++ b/server/test/backend/test_local_file.py @@ -6,11 +6,10 @@ # SPDX-License-Identifier: MIT import os.path import shutil - from unittest import TestCase -from app.backend import local_file from app import model +from app.backend import local_file from app.model import provider store_path: str = os.path.dirname(__file__) + "/local_file_test_folder" @@ -22,17 +21,20 @@ def setUp(self) -> None: self.descriptor_store = local_file.LocalFileDescriptorStore(store_path) self.descriptor_store.check_directory(create=True) self.mock_endpoint = model.Endpoint( - interface="AAS-3.0", - protocol_information=model.ProtocolInformation(href="https://example.org/") + interface="AAS-3.0", protocol_information=model.ProtocolInformation(href="https://example.org/") + ) + self.aasd1 = model.AssetAdministrationShellDescriptor( + id_="https://example.org/AASDescriptor/1", endpoints=[self.mock_endpoint] + ) + self.aasd2 = model.AssetAdministrationShellDescriptor( + id_="https://example.org/AASDescriptor/2", endpoints=[self.mock_endpoint] + ) + self.sd1 = model.SubmodelDescriptor( + id_="https://example.org/SubmodelDescriptor/1", endpoints=[self.mock_endpoint] + ) + self.sd2 = model.SubmodelDescriptor( + id_="https://example.org/SubmodelDescriptor/2", endpoints=[self.mock_endpoint] ) - self.aasd1 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/1", - endpoints=[self.mock_endpoint]) - self.aasd2 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/2", - endpoints=[self.mock_endpoint]) - self.sd1 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/1", - endpoints=[self.mock_endpoint]) - self.sd2 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/2", - endpoints=[self.mock_endpoint]) def tearDown(self) -> None: try: @@ -40,7 +42,6 @@ def tearDown(self) -> None: finally: shutil.rmtree(store_path) - def test_add(self) -> None: self.descriptor_store.add(self.aasd1) # Note that this test is only checking that there are no errors during adding. @@ -74,18 +75,22 @@ def test_key_errors(self) -> None: self.descriptor_store.add(self.aasd1) with self.assertRaises(KeyError) as cm: self.descriptor_store.add(self.aasd1) - self.assertEqual("'Descriptor with id https://example.org/AASDescriptor/1 already exists in " - "local file database'", str(cm.exception)) + self.assertEqual( + "'Descriptor with id https://example.org/AASDescriptor/1 already exists in " "local file database'", + str(cm.exception), + ) self.descriptor_store.discard(self.aasd1) with self.assertRaises(KeyError) as cm: self.descriptor_store.get_item("https://example.org/AASDescriptor/1") self.assertIsNone(self.descriptor_store.get("https://example.org/AASDescriptor/1")) - self.assertEqual("'No Identifiable with id https://example.org/AASDescriptor/1 found in local " - "file database'", str(cm.exception)) + self.assertEqual( + "'No Identifiable with id https://example.org/AASDescriptor/1 found in local " "file database'", + str(cm.exception), + ) def test_reload_discard(self) -> None: self.descriptor_store.add(self.sd1) self.descriptor_store = local_file.LocalFileDescriptorStore(store_path) self.descriptor_store.discard(self.sd1) - self.assertNotIn(self.sd1, self.descriptor_store) \ No newline at end of file + self.assertNotIn(self.sd1, self.descriptor_store) diff --git a/server/test/interfaces/test_repository.py b/server/test/interfaces/test_repository.py index 5cf421a51..01f3bd61d 100644 --- a/server/test/interfaces/test_repository.py +++ b/server/test/interfaces/test_repository.py @@ -25,19 +25,18 @@ # TODO: add id_short format to schemata import os -import random import pathlib +import random import urllib.parse +from typing import Set -import schemathesis import hypothesis.strategies - +import schemathesis from basyx.aas import model from basyx.aas.adapter.aasx import DictSupplementaryFileContainer -from app.interfaces.repository import WSGIApp from basyx.aas.examples.data.example_aas import create_full_example -from typing import Set +from app.interfaces.repository import WSGIApp def _encode_and_quote(identifier: model.Identifier) -> str: @@ -63,7 +62,7 @@ def _check_transformed(response, case): # disable the filter_too_much health check, which triggers if a strategy filters too much data, raising an error suppress_health_check=[hypothesis.HealthCheck.filter_too_much], # disable data generation deadlines, which would result in an error if data generation takes too much time - deadline=None + deadline=None, ) BASE_URL = "/api/v1" @@ -82,11 +81,15 @@ def _check_transformed(response, case): IDENTIFIER_SUBMODEL.add(_encode_and_quote(obj.id)) # load aas and submodel api specs -AAS_SCHEMA = schemathesis.from_path(pathlib.Path(__file__).parent / "http-api-oas-aas.yaml", - app=WSGIApp(create_full_example(), DictSupplementaryFileContainer())) +AAS_SCHEMA = schemathesis.from_path( + pathlib.Path(__file__).parent / "http-api-oas-aas.yaml", + app=WSGIApp(create_full_example(), DictSupplementaryFileContainer()), +) -SUBMODEL_SCHEMA = schemathesis.from_path(pathlib.Path(__file__).parent / "http-api-oas-submodel.yaml", - app=WSGIApp(create_full_example(), DictSupplementaryFileContainer())) +SUBMODEL_SCHEMA = schemathesis.from_path( + pathlib.Path(__file__).parent / "http-api-oas-submodel.yaml", + app=WSGIApp(create_full_example(), DictSupplementaryFileContainer()), +) class APIWorkflowAAS(AAS_SCHEMA.as_state_machine()): # type: ignore diff --git a/server/test/model/test_provider.py b/server/test/model/test_provider.py index 55d6129e4..ee3b810da 100644 --- a/server/test/model/test_provider.py +++ b/server/test/model/test_provider.py @@ -3,20 +3,24 @@ from app import model from app.model.provider import DictDescriptorStore + class DictDescriptorStoreTest(unittest.TestCase): def setUp(self) -> None: self.mock_endpoint = model.Endpoint( - interface="AAS-3.0", - protocol_information=model.ProtocolInformation(href="https://example.org/") + interface="AAS-3.0", protocol_information=model.ProtocolInformation(href="https://example.org/") + ) + self.aasd1 = model.AssetAdministrationShellDescriptor( + id_="https://example.org/AASDescriptor/1", endpoints=[self.mock_endpoint] + ) + self.aasd2 = model.AssetAdministrationShellDescriptor( + id_="https://example.org/AASDescriptor/2", endpoints=[self.mock_endpoint] + ) + self.sd1 = model.SubmodelDescriptor( + id_="https://example.org/SubmodelDescriptor/1", endpoints=[self.mock_endpoint] + ) + self.sd2 = model.SubmodelDescriptor( + id_="https://example.org/SubmodelDescriptor/2", endpoints=[self.mock_endpoint] ) - self.aasd1 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/1", - endpoints=[self.mock_endpoint]) - self.aasd2 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/2", - endpoints=[self.mock_endpoint]) - self.sd1 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/1", - endpoints=[self.mock_endpoint]) - self.sd2 = model.SubmodelDescriptor(id_="https://example.org/SubmodelDescriptor/2", - endpoints=[self.mock_endpoint]) def test_store_retrieve(self) -> None: descriptor_store: DictDescriptorStore = DictDescriptorStore() @@ -25,12 +29,15 @@ def test_store_retrieve(self) -> None: self.assertIn(self.aasd1, descriptor_store) self.assertFalse(self.sd1 in descriptor_store) - aasd3 = model.AssetAdministrationShellDescriptor(id_="https://example.org/AASDescriptor/1", - endpoints=[self.mock_endpoint]) + aasd3 = model.AssetAdministrationShellDescriptor( + id_="https://example.org/AASDescriptor/1", endpoints=[self.mock_endpoint] + ) with self.assertRaises(KeyError) as cm: descriptor_store.add(aasd3) - self.assertEqual("'Descriptor object with same id https://example.org/AASDescriptor/1 is already " - "stored in this store'", str(cm.exception)) + self.assertEqual( + "'Descriptor object with same id https://example.org/AASDescriptor/1 is already " "stored in this store'", + str(cm.exception), + ) self.assertEqual(2, len(descriptor_store)) self.assertIs(self.aasd1, descriptor_store.get("https://example.org/AASDescriptor/1")) From 3970724875d17e84ef6950d626ae74b111c74efa Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Wed, 1 Apr 2026 15:59:05 +0200 Subject: [PATCH 75/76] Fix copyright error --- server/app/util/converters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app/util/converters.py b/server/app/util/converters.py index 370049d22..3b98cd5d4 100644 --- a/server/app/util/converters.py +++ b/server/app/util/converters.py @@ -1,4 +1,4 @@ -# Copyright (c) 2025 the Eclipse BaSyx Authors +# Copyright (c) 2026 the Eclipse BaSyx Authors # # This program and the accompanying materials are made available under the terms of the MIT License, available in # the LICENSE file of this project. From d1e3996f7027b65d10b7e92e2a86d12b4b212cd0 Mon Sep 17 00:00:00 2001 From: Ornella33 Date: Thu, 2 Apr 2026 10:25:50 +0200 Subject: [PATCH 76/76] Fix MyPy error --- server/app/interfaces/repository.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/app/interfaces/repository.py b/server/app/interfaces/repository.py index 0547b0645..51d7b15e7 100644 --- a/server/app/interfaces/repository.py +++ b/server/app/interfaces/repository.py @@ -478,8 +478,8 @@ def _get_submodels(self, request: Request) -> Tuple[Iterator[model.Submodel], in semantic_id = request.args.get("semanticId") if semantic_id is not None: spec_semantic_id = HTTPApiDecoder.base64url_json( - semantic_id, model.Reference, False - ) # type: ignore[type-abstract] + semantic_id, model.Reference, False # type: ignore[type-abstract] + ) submodels = filter(lambda sm: sm.semantic_id == spec_semantic_id, submodels) paginated_submodels, end_index = self._get_slice(request, submodels) return paginated_submodels, end_index